From 87bd771d1c3713d28463302d0fe4f8c8ee4fcc5f Mon Sep 17 00:00:00 2001 From: Keran Yang Date: Fri, 24 Mar 2023 16:24:19 -0400 Subject: [PATCH 1/6] feat: add edge level onFull write actions Signed-off-by: Keran Yang --- .github/workflows/ci.yaml | 4 +- Makefile | 5 +- api/json-schema/schema.json | 6 +- api/openapi-spec/swagger.json | 6 +- .../full/numaflow.numaproj.io_pipelines.yaml | 6 + .../full/numaflow.numaproj.io_vertices.yaml | 12 + config/install.yaml | 18 + config/namespace-install.yaml | 18 + docs/APIs.md | 15 +- pkg/apis/numaflow/v1alpha1/const.go | 4 + pkg/apis/numaflow/v1alpha1/edge_types.go | 7 +- pkg/apis/numaflow/v1alpha1/generated.pb.go | 593 ++++++++++-------- pkg/apis/numaflow/v1alpha1/generated.proto | 8 +- .../numaflow/v1alpha1/openapi_generated.go | 10 +- pkg/forward/forward.go | 92 +-- pkg/forward/forward_test.go | 108 +++- pkg/forward/metrics.go | 20 +- pkg/forward/options.go | 10 + pkg/forward/shutdown_test.go | 12 +- pkg/isb/interfaces.go | 1 + pkg/isb/stores/jetstream/writer.go | 7 +- pkg/isb/stores/jetstream/writer_test.go | 2 +- pkg/isb/stores/redis/read_test.go | 15 +- pkg/isb/stores/redis/write_test.go | 11 +- pkg/sinks/blackhole/blackhole.go | 2 +- pkg/sinks/blackhole/blackhole_test.go | 6 +- pkg/sinks/kafka/kafka.go | 6 +- pkg/sinks/kafka/kafka_test.go | 4 +- pkg/sinks/logger/log.go | 2 +- pkg/sinks/logger/log_test.go | 6 +- pkg/sinks/udsink/sink.go | 2 +- pkg/sources/generator/tickgen.go | 3 +- pkg/sources/generator/tickgen_test.go | 6 +- pkg/sources/http/http.go | 3 +- pkg/sources/http/http_test.go | 2 +- pkg/sources/kafka/handler_test.go | 2 +- pkg/sources/kafka/reader.go | 3 +- pkg/sources/kafka/reader_test.go | 8 +- pkg/sources/nats/nats.go | 3 +- pkg/sources/nats/nats_test.go | 2 +- pkg/sources/source.go | 28 +- pkg/udf/map_udf.go | 11 +- test/{e2e => e2e-suite-1}/functional_test.go | 0 .../testdata/even-odd.yaml | 0 .../extract-event-time-from-payload.yaml | 0 .../testdata/simple-pipeline.yaml | 0 .../testdata/source-filtering.yaml | 0 .../testdata/udf-filtering.yaml | 0 .../testdata/watermark.yaml | 0 test/e2e-suite-2/functional_test.go | 75 +++ test/e2e-suite-2/testdata/drop-on-full.yaml | 34 + test/fixtures/expect.go | 20 +- test/fixtures/util.go | 37 +- 53 files changed, 871 insertions(+), 384 deletions(-) rename test/{e2e => e2e-suite-1}/functional_test.go (100%) rename test/{e2e => e2e-suite-1}/testdata/even-odd.yaml (100%) rename test/{e2e => e2e-suite-1}/testdata/extract-event-time-from-payload.yaml (100%) rename test/{e2e => e2e-suite-1}/testdata/simple-pipeline.yaml (100%) rename test/{e2e => e2e-suite-1}/testdata/source-filtering.yaml (100%) rename test/{e2e => e2e-suite-1}/testdata/udf-filtering.yaml (100%) rename test/{e2e => e2e-suite-1}/testdata/watermark.yaml (100%) create mode 100644 test/e2e-suite-2/functional_test.go create mode 100644 test/e2e-suite-2/testdata/drop-on-full.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d08a7fff6..f1882f6471 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -136,10 +136,10 @@ jobs: timeout-minutes: 20 strategy: fail-fast: false - max-parallel: 6 + max-parallel: 7 matrix: driver: [jetstream] - case: [e2e, kafka-e2e, http-e2e, nats-e2e, sdks-e2e, reduce-e2e] + case: [e2e-suite-1, e2e-suite-2, kafka-e2e, http-e2e, nats-e2e, sdks-e2e, reduce-e2e] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/Makefile b/Makefile index 81ba344e10..7bbddc326b 100644 --- a/Makefile +++ b/Makefile @@ -102,7 +102,8 @@ test-coverage-with-isb: test-code: go test -tags=isb_redis -race -v $(shell go list ./... | grep -v /vendor/ | grep -v /numaflow/test/) -test-e2e: +test-e2e-suite-1: +test-e2e-suite-2: test-kafka-e2e: test-http-e2e: test-nats-e2e: @@ -135,7 +136,7 @@ Test%: kubectl -n numaflow-system delete po -lapp.kubernetes.io/component=controller-manager,app.kubernetes.io/part-of=numaflow kubectl -n numaflow-system delete po e2e-api-pod --ignore-not-found=true cat test/manifests/e2e-api-pod.yaml | sed 's@quay.io/numaproj/@$(IMAGE_NAMESPACE)/@' | sed 's/:$(BASE_VERSION)/:$(VERSION)/' | kubectl -n numaflow-system apply -f - - -go test -v -timeout 10m -count 1 --tags test -p 1 ./test/e2e -run='.*/$*' + -go test -v -timeout 10m -count 1 --tags test -p 1 ./test/e2e-suite-1 -run='.*/$*' $(MAKE) cleanup-e2e .PHONY: ui-build diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json index aabb69bd36..6eb9fdfa36 100644 --- a/api/json-schema/schema.json +++ b/api/json-schema/schema.json @@ -17658,8 +17658,12 @@ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.EdgeLimits", "description": "Limits define the limitations such as buffer read batch size for the edge, will override pipeline level settings." }, + "onFull": { + "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".", + "type": "string" + }, "parallelism": { - "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.", + "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's not provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.", "format": "int32", "type": "integer" }, diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index b2ad170834..08c77f1a77 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -17667,8 +17667,12 @@ "description": "Limits define the limitations such as buffer read batch size for the edge, will override pipeline level settings.", "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.EdgeLimits" }, + "onFull": { + "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".", + "type": "string" + }, "parallelism": { - "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.", + "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's not provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.", "type": "integer", "format": "int32" }, diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml index 5f3a05c067..8a71d09bf9 100644 --- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml @@ -77,6 +77,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer diff --git a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml index 78c44d81bf..1d4022dfeb 100644 --- a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml @@ -591,6 +591,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer @@ -2760,6 +2766,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer diff --git a/config/install.yaml b/config/install.yaml index ffd85c131b..ec7b1bac7d 100644 --- a/config/install.yaml +++ b/config/install.yaml @@ -2375,6 +2375,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer @@ -8165,6 +8171,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer @@ -10334,6 +10346,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml index c0b2f27bae..8780e2db19 100644 --- a/config/namespace-install.yaml +++ b/config/namespace-install.yaml @@ -2375,6 +2375,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer @@ -8165,6 +8171,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer @@ -10334,6 +10346,12 @@ spec: format: int32 type: integer type: object + onFull: + enum: + - "" + - retryUntilSuccess + - dropAndAckLatest + type: string parallelism: format: int32 type: integer diff --git a/docs/APIs.md b/docs/APIs.md index b6fc29c403..6b2b7a57f5 100644 --- a/docs/APIs.md +++ b/docs/APIs.md @@ -911,11 +911,24 @@ edge, will override pipeline level settings. (Optional)

Parallelism is only effective when the “to” vertex is a reduce vertex, -if it’s provided, the default value is set to “1”. Parallelism is +if it’s not provided, the default value is set to “1”. Parallelism is ignored when the “to” vertex is not a reduce vertex.

+ + +onFull
string + + +(Optional) +

+OnFull specifies the behaviour for the write actions when the inter step +buffer is full. if not provided, the default value is set to “”, which +currently has the same effect as “retryUntilSuccess”. +

+ +

diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go index dcfcb76fd0..971e89e528 100644 --- a/pkg/apis/numaflow/v1alpha1/const.go +++ b/pkg/apis/numaflow/v1alpha1/const.go @@ -122,6 +122,10 @@ const ( DefaultBufferUsageLimit = 0.8 DefaultReadBatchSize = 500 + // Edge-level specification to define the writing behaviour when the ToBuffer is full + RetryUntilSuccess = "retryUntilSuccess" + DropAndAckLatest = "dropAndAckLatest" + // Auto scaling DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending DefaultCooldownSeconds = 90 // Default cooldown seconds after a scaling operation diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go index b2bcdd3340..09aa3f0d00 100644 --- a/pkg/apis/numaflow/v1alpha1/edge_types.go +++ b/pkg/apis/numaflow/v1alpha1/edge_types.go @@ -26,10 +26,15 @@ type Edge struct { // +optional Limits *EdgeLimits `json:"limits,omitempty" protobuf:"bytes,4,opt,name=limits"` // Parallelism is only effective when the "to" vertex is a reduce vertex, - // if it's provided, the default value is set to "1". + // if it's not provided, the default value is set to "1". // Parallelism is ignored when the "to" vertex is not a reduce vertex. // +optional Parallelism *int32 `json:"parallelism" protobuf:"bytes,5,opt,name=parallelism"` + // OnFull specifies the behaviour for the write actions when the inter step buffer is full. + // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess". + // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest + // +optional + OnFull string `json:"onFull" protobuf:"bytes,6,opt,name=onFull"` } type ForwardConditions struct { diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go index dcf8823de8..7d9cb87e39 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.pb.go +++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go @@ -2037,16 +2037,16 @@ func init() { } var fileDescriptor_9d0d1b17d3865563 = []byte{ - // 5683 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x1c, 0xd7, - 0x75, 0xbf, 0xf7, 0x93, 0xbb, 0x67, 0x49, 0x7d, 0x5c, 0x59, 0xf2, 0x8a, 0x91, 0xb9, 0xca, 0x04, - 0x36, 0x94, 0xff, 0x3f, 0x21, 0x2b, 0xd6, 0x69, 0x94, 0xb6, 0x89, 0xcd, 0x25, 0x45, 0x59, 0x12, - 0x29, 0xd1, 0x67, 0x49, 0xc9, 0xb1, 0x5b, 0xbb, 0xc3, 0xd9, 0xbb, 0xcb, 0xf1, 0xce, 0xce, 0xac, - 0x67, 0xee, 0x52, 0xa2, 0xdb, 0xa0, 0x41, 0xfc, 0x60, 0x17, 0x4d, 0x91, 0x02, 0x45, 0x81, 0xa0, - 0x41, 0x0a, 0x14, 0x28, 0x50, 0xb4, 0x40, 0x80, 0x3e, 0x34, 0x2f, 0xed, 0x4b, 0x9f, 0x0a, 0xb7, - 0x0f, 0xad, 0x1f, 0x0a, 0xd4, 0x45, 0x83, 0x45, 0xcd, 0x3e, 0xf5, 0xa1, 0x45, 0x8a, 0xbc, 0x04, - 0x42, 0x81, 0x16, 0xf7, 0x63, 0x3e, 0x77, 0x96, 0x22, 0x77, 0x49, 0x47, 0x46, 0xdf, 0x66, 0xee, - 0x39, 0xe7, 0x77, 0xee, 0xdc, 0x8f, 0x73, 0xcf, 0x3d, 0xe7, 0xde, 0x81, 0x1b, 0x6d, 0x93, 0xed, + // 5699 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57, + 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9, + 0x5a, 0x25, 0x9a, 0xfd, 0xff, 0x77, 0x6d, 0xc6, 0x64, 0xd9, 0x59, 0x60, 0x37, 0x71, 0xdb, 0xe3, + 0xc9, 0xcc, 0xd8, 0x33, 0xce, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2, + 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0x83, 0x94, 0x20, 0x16, 0x2d, 0x12, + 0x42, 0x5a, 0xb1, 0x5a, 0x24, 0x24, 0x24, 0x04, 0xd2, 0x4a, 0x3c, 0xb0, 0x2f, 0xf0, 0xc2, 0x13, + 0x0a, 0x3c, 0x40, 0x1e, 0x90, 0x08, 0x02, 0xb5, 0x88, 0x79, 0xe2, 0x01, 0xb4, 0x68, 0x5f, 0x56, + 0x23, 0x24, 0xd0, 0xfd, 0xa8, 0xcf, 0xae, 0xf6, 0xd8, 0xdd, 0x76, 0x76, 0x22, 0xde, 0xaa, 0xee, + 0x39, 0xe7, 0x77, 0x6e, 0xdd, 0x8f, 0x73, 0xcf, 0x3d, 0xe7, 0xde, 0x82, 0x1b, 0x6d, 0x93, 0xed, 0xf4, 0xb7, 0xe7, 0x0d, 0xa7, 0xbb, 0x60, 0xf7, 0xbb, 0x7a, 0xcf, 0x75, 0xde, 0x12, 0x0f, 0x2d, 0xcb, 0x79, 0xb0, 0xd0, 0xeb, 0xb4, 0x17, 0xf4, 0x9e, 0xe9, 0x85, 0x25, 0xbb, 0x57, 0x75, 0xab, 0xb7, 0xa3, 0x5f, 0x5d, 0x68, 0x53, 0x9b, 0xba, 0x3a, 0xa3, 0xcd, 0xf9, 0x9e, 0xeb, 0x30, 0x87, @@ -2056,7 +2056,7 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{ 0x60, 0x38, 0x2e, 0x5d, 0xd8, 0x1d, 0xaa, 0xcb, 0xec, 0x0b, 0x21, 0x4f, 0x57, 0x37, 0x76, 0x4c, 0x9b, 0xba, 0x7b, 0xfe, 0xb7, 0x2c, 0xb8, 0xd4, 0x73, 0xfa, 0xae, 0x41, 0x8f, 0x24, 0xe5, 0x2d, 0x74, 0x29, 0xd3, 0xd3, 0x74, 0x2d, 0x8c, 0x92, 0x72, 0xfb, 0x36, 0x33, 0xbb, 0xc3, 0x6a, 0x7e, - 0xe1, 0x71, 0x02, 0x9e, 0xb1, 0x43, 0xbb, 0x7a, 0x52, 0x4e, 0xfb, 0x97, 0x32, 0x9c, 0x5b, 0xda, + 0xee, 0x71, 0x02, 0x9e, 0xb1, 0x43, 0xbb, 0x7a, 0x52, 0x4e, 0xfb, 0xe7, 0x32, 0x9c, 0x5b, 0xda, 0xf6, 0x98, 0xab, 0x1b, 0x6c, 0xc3, 0x69, 0x6e, 0xd2, 0x6e, 0xcf, 0xd2, 0x19, 0x25, 0x1d, 0x28, 0xf1, 0xba, 0x35, 0x75, 0xa6, 0x57, 0x33, 0x97, 0x33, 0x57, 0x2a, 0x8b, 0x4b, 0xf3, 0x63, 0xf6, 0xc5, 0xfc, 0xba, 0x02, 0xaa, 0x4f, 0xef, 0x0f, 0x6a, 0x25, 0xff, 0x0d, 0x03, 0x05, 0xe4, 0xbb, @@ -2085,13 +2085,13 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{ 0xa0, 0x63, 0x88, 0x41, 0xd6, 0x05, 0xe0, 0xb2, 0x63, 0xb7, 0xcc, 0x76, 0x75, 0x46, 0xf4, 0xc6, 0xe5, 0x11, 0x03, 0x7a, 0xe5, 0x4e, 0x43, 0xf2, 0xd5, 0x67, 0x94, 0x3a, 0xf9, 0x8a, 0x21, 0xc2, 0xec, 0x8b, 0x70, 0x76, 0x68, 0xd6, 0x92, 0x33, 0x90, 0xeb, 0xd0, 0x3d, 0x61, 0x94, 0xca, 0xc8, - 0x1f, 0xc9, 0xd3, 0x50, 0xd8, 0xd5, 0xad, 0x3e, 0xad, 0x66, 0x45, 0x99, 0x7c, 0xf9, 0xc5, 0xec, + 0x1f, 0xc9, 0xd3, 0x50, 0xd8, 0xd5, 0xad, 0x3e, 0xad, 0x66, 0x45, 0x99, 0x7c, 0xf9, 0xf9, 0xec, 0xb5, 0x8c, 0x36, 0x28, 0xc3, 0x29, 0xdf, 0x16, 0xdc, 0xa3, 0x2e, 0xa3, 0x0f, 0xc9, 0x65, 0xc8, 0xdb, 0xbc, 0x3f, 0x84, 0x7c, 0x7d, 0x5a, 0x7d, 0x6e, 0x5e, 0xf4, 0x83, 0xa0, 0x10, 0x03, 0x8a, 0xd2, 0x96, 0x0b, 0xbc, 0xca, 0xe2, 0x8b, 0x63, 0x9b, 0xa1, 0x86, 0x80, 0xa9, 0xc3, 0xfe, 0xa0, 0x56, 0x94, 0xcf, 0xa8, 0xa0, 0xc9, 0xeb, 0x90, 0xf7, 0x4c, 0xbb, 0x53, 0xcd, 0x09, 0x15, 0x5f, 0x1d, 0x5f, 0x85, 0x69, 0x77, 0xea, 0x25, 0xfe, 0x05, 0xfc, 0x09, 0x05, 0x28, 0xb9, 0x0f, 0xb9, - 0x7e, 0xb3, 0xa5, 0x2c, 0xca, 0x2f, 0x8f, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4, + 0x7e, 0xb3, 0xa5, 0x2c, 0xca, 0x2f, 0x8e, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4, 0x72, 0x5b, 0x2b, 0xab, 0xc8, 0x11, 0xc9, 0x77, 0x32, 0x70, 0xd6, 0x70, 0x6c, 0xa6, 0xf3, 0xf5, 0xc5, 0xb7, 0xac, 0xd5, 0x82, 0xd0, 0x73, 0x6b, 0x6c, 0x3d, 0xcb, 0x49, 0xc4, 0xfa, 0x79, 0x6e, 0x28, 0x86, 0x8a, 0x71, 0x58, 0x37, 0xf9, 0x5e, 0x06, 0xce, 0xf3, 0x09, 0x3c, 0xc4, 0x2c, 0xcc, @@ -2102,22 +2102,22 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{ 0xf9, 0xee, 0xa1, 0x2f, 0x4b, 0x4c, 0x28, 0x5a, 0x66, 0xd7, 0x64, 0x9e, 0xb0, 0x96, 0x95, 0xc5, 0xeb, 0x63, 0x7f, 0x96, 0x9c, 0xa2, 0x6b, 0x02, 0x4c, 0xce, 0x1a, 0xf9, 0x8c, 0x4a, 0x01, 0x31, 0xa0, 0xe0, 0x19, 0xba, 0x25, 0xad, 0x69, 0x65, 0xf1, 0x6b, 0xe3, 0x4f, 0x1b, 0x8e, 0x52, 0x9f, - 0x51, 0xdf, 0x54, 0x10, 0xaf, 0x28, 0xb1, 0xc9, 0xaf, 0xc2, 0xa9, 0x58, 0x6f, 0x7a, 0xd5, 0x8a, + 0x51, 0xdf, 0x54, 0x10, 0xaf, 0x28, 0xb1, 0xc9, 0x2f, 0xc3, 0xa9, 0x58, 0x6f, 0x7a, 0xd5, 0x8a, 0x68, 0x9d, 0x67, 0xd3, 0x5a, 0x27, 0xe0, 0xaa, 0x5f, 0x50, 0x60, 0xa7, 0x62, 0x23, 0xc4, 0xc3, 0x04, 0x18, 0xb9, 0x0d, 0x25, 0xcf, 0x6c, 0x52, 0x43, 0x77, 0xbd, 0xea, 0xf4, 0x61, 0x80, 0xcf, 0x28, 0xe0, 0x52, 0x43, 0x89, 0x61, 0x00, 0xa0, 0xdd, 0x87, 0x99, 0xa5, 0x3e, 0xdb, 0x71, 0x5c, 0xf3, 0x1d, 0xe1, 0x59, 0x90, 0x55, 0x28, 0x30, 0xb1, 0x42, 0x48, 0xa7, 0xed, 0xb9, 0x34, 0x68, 0xb9, 0x5a, 0xdf, 0xa6, 0x7b, 0xbe, 0x61, 0xad, 0x97, 0x79, 0x23, 0xc8, 0x15, 0x43, 0x8a, 0x6b, - 0x7f, 0x94, 0x81, 0x72, 0x5d, 0xf7, 0x4c, 0x83, 0xc3, 0x93, 0x65, 0xc8, 0xf7, 0x3d, 0xea, 0x1e, + 0x7f, 0x98, 0x81, 0x72, 0x5d, 0xf7, 0x4c, 0x83, 0xc3, 0x93, 0x65, 0xc8, 0xf7, 0x3d, 0xea, 0x1e, 0x0d, 0x54, 0x58, 0xa5, 0x2d, 0x8f, 0xba, 0x28, 0x84, 0xc9, 0x5d, 0x28, 0xf5, 0x74, 0xcf, 0x7b, 0xe0, 0xb8, 0x4d, 0x65, 0x59, 0x0f, 0x09, 0x24, 0x97, 0x7e, 0x25, 0x8a, 0x01, 0x88, 0x56, 0x81, 0x72, 0xdd, 0xd2, 0x8d, 0xce, 0x8e, 0x63, 0x51, 0xed, 0x35, 0x28, 0xd6, 0xfb, 0xad, 0x16, 0x75, 0x0f, 0x61, 0xe1, 0xe7, 0x21, 0xcf, 0xf6, 0x7a, 0x6a, 0xbd, 0x08, 0x56, 0xf7, 0xfc, 0xe6, 0x5e, - 0x8f, 0x3e, 0x1a, 0xd4, 0x40, 0xe2, 0xf0, 0x37, 0x14, 0x7c, 0xda, 0x4f, 0x32, 0x70, 0x4e, 0x16, + 0x8f, 0x3e, 0x1a, 0xd4, 0x40, 0xe2, 0xf0, 0x37, 0x14, 0x7c, 0xda, 0x8f, 0x33, 0x70, 0x4e, 0x16, 0xaa, 0x55, 0x54, 0xae, 0x4f, 0x84, 0x42, 0xc1, 0xa5, 0x4d, 0xd3, 0x53, 0xed, 0xb2, 0x32, 0xf6, 0x70, 0x44, 0x8e, 0xa2, 0x96, 0x43, 0xd1, 0x17, 0xa2, 0x00, 0x25, 0x3a, 0xe9, 0x43, 0xf9, 0x2d, 0xca, 0x3c, 0xe6, 0x52, 0xbd, 0xab, 0x5a, 0xee, 0xe5, 0xb1, 0x55, 0xdd, 0xa2, 0xac, 0x21, 0x90, - 0xa2, 0xab, 0x6f, 0x50, 0x88, 0xa1, 0x26, 0xed, 0xa7, 0x79, 0x28, 0x07, 0xa3, 0x90, 0x7c, 0x0e, + 0xa2, 0xab, 0x6f, 0x50, 0x88, 0xa1, 0x26, 0xed, 0x27, 0x79, 0x28, 0x07, 0xa3, 0x90, 0x7c, 0x0e, 0x0a, 0xc2, 0xdd, 0x53, 0xcd, 0x1a, 0x4c, 0x1d, 0xe1, 0x15, 0xa2, 0xa4, 0x91, 0xe7, 0x60, 0xca, 0x70, 0xba, 0x5d, 0xdd, 0x6e, 0x0a, 0x17, 0xbe, 0x5c, 0xaf, 0x70, 0x8b, 0xb1, 0x2c, 0x8b, 0xd0, 0xa7, 0x91, 0x4b, 0x90, 0xd7, 0xdd, 0xb6, 0xf4, 0xa6, 0xcb, 0x72, 0x9c, 0x2c, 0xb9, 0x6d, 0x0f, @@ -2135,265 +2135,266 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{ 0x26, 0x77, 0xdc, 0x1d, 0x33, 0xfe, 0xdc, 0xd1, 0xde, 0xcf, 0xc3, 0xa9, 0x15, 0x9d, 0x76, 0x1d, 0xfb, 0xb1, 0xee, 0x4b, 0xe6, 0x89, 0x70, 0x5f, 0xae, 0x40, 0xc9, 0xa5, 0x3d, 0xcb, 0x34, 0x74, 0x4f, 0x74, 0x96, 0xda, 0x23, 0xa2, 0x2a, 0xc3, 0x80, 0x3a, 0xc2, 0x6d, 0xcd, 0x3d, 0x91, 0x6e, - 0x6b, 0xfe, 0x67, 0xef, 0xb6, 0x6a, 0x3f, 0xca, 0x42, 0xfe, 0x7a, 0xb3, 0x4d, 0xf9, 0x52, 0xda, - 0xe2, 0xc6, 0x34, 0xb1, 0x94, 0x0a, 0x33, 0x29, 0x28, 0x64, 0x16, 0xb2, 0xcc, 0x51, 0x73, 0x05, - 0x14, 0x3d, 0xbb, 0xe9, 0x60, 0x96, 0x39, 0xe4, 0x1d, 0x00, 0xc3, 0xb1, 0x9b, 0xa6, 0x1f, 0x3a, - 0x99, 0xec, 0xc3, 0x56, 0x1d, 0xf7, 0x81, 0xee, 0x36, 0x97, 0x03, 0xc4, 0xfa, 0xa9, 0xfd, 0x41, - 0x0d, 0xc2, 0x77, 0x8c, 0x68, 0x23, 0xed, 0xc0, 0x29, 0x95, 0x0d, 0xba, 0x3c, 0xb6, 0x5e, 0xde, - 0x10, 0x07, 0xb8, 0xa4, 0x57, 0xa1, 0xd2, 0xd3, 0x5d, 0xdd, 0xb2, 0xa8, 0x65, 0x7a, 0x5d, 0xb1, - 0x17, 0x2a, 0xd4, 0x4f, 0xef, 0x0f, 0x6a, 0x95, 0x8d, 0xb0, 0x18, 0xa3, 0x3c, 0xda, 0xef, 0x64, - 0x00, 0x42, 0x54, 0xf2, 0x55, 0x38, 0xbd, 0x2d, 0x9c, 0x8b, 0x75, 0xfd, 0xe1, 0x1a, 0xb5, 0xdb, - 0x6c, 0x47, 0xb4, 0x77, 0x5e, 0x4e, 0xf9, 0x7a, 0x9c, 0x84, 0x49, 0x5e, 0xf2, 0x12, 0x9c, 0x91, - 0x45, 0x5b, 0x9e, 0xae, 0x30, 0x45, 0x7f, 0xcc, 0xc8, 0x60, 0x43, 0x3d, 0x41, 0xc3, 0x21, 0x6e, - 0x4d, 0x87, 0xca, 0xaa, 0xf9, 0x90, 0x36, 0xef, 0x9b, 0x76, 0xd3, 0x79, 0x40, 0x10, 0x8a, 0x56, - 0x58, 0x8d, 0xca, 0xe2, 0x7c, 0xc4, 0x8c, 0x04, 0xb1, 0xc5, 0xb0, 0xc5, 0xba, 0x94, 0xe9, 0xdc, - 0xb0, 0xac, 0xf4, 0x55, 0xf4, 0x4b, 0xb6, 0x92, 0xac, 0xad, 0x42, 0xd2, 0x5e, 0x80, 0xb3, 0x43, - 0xfd, 0x47, 0x6a, 0x50, 0xe8, 0xd0, 0xbd, 0x9b, 0xdc, 0x57, 0xe5, 0x7e, 0x80, 0x70, 0x7c, 0x6e, - 0xf3, 0x02, 0x94, 0xe5, 0xda, 0x7f, 0x67, 0xa0, 0xb4, 0xda, 0xb7, 0x0d, 0xe1, 0xd9, 0x3e, 0xde, - 0xad, 0xf3, 0xdd, 0x8a, 0x6c, 0xaa, 0x5b, 0xd1, 0x87, 0x62, 0xe7, 0x41, 0xe0, 0x76, 0x54, 0x16, - 0xd7, 0xc7, 0x1f, 0x89, 0xaa, 0x4a, 0xf3, 0xb7, 0x05, 0x9e, 0x0c, 0x26, 0x9e, 0x52, 0x15, 0x2a, - 0xde, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, 0x84, 0xed, 0x48, 0xd1, 0x8b, 0x9f, - 0x66, 0xe0, 0xf4, 0x0d, 0x19, 0xaf, 0x75, 0x5c, 0xe9, 0xad, 0x90, 0x8b, 0x90, 0x73, 0x7b, 0x7d, - 0x21, 0x9f, 0x93, 0x9b, 0x73, 0xdc, 0xd8, 0x42, 0x5e, 0x46, 0x5e, 0x85, 0x52, 0x53, 0xf5, 0x81, - 0xf2, 0x12, 0x8f, 0xda, 0x73, 0xc2, 0x7e, 0xfa, 0x6f, 0x18, 0xa0, 0x71, 0xb7, 0xae, 0xeb, 0xb5, - 0x1b, 0xe6, 0x3b, 0xd2, 0x68, 0x16, 0xa4, 0x5b, 0xb7, 0x2e, 0x8b, 0xd0, 0xa7, 0x71, 0x83, 0xdc, - 0xa1, 0x7b, 0xcb, 0xdc, 0xc3, 0x11, 0xb3, 0x4e, 0x19, 0xe4, 0xdb, 0xaa, 0x0c, 0x03, 0x2a, 0xef, - 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, 0x05, 0xea, 0xf3, 0xb5, 0xef, 0x64, - 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0x7a, 0xb4, 0x42, 0x7b, 0x96, 0xb3, 0xc7, 0x97, 0x71, 0xa4, 0x6f, - 0x93, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x07, 0x5d, 0x8d, 0x86, 0xcb, 0xaa, 0xf1, - 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, 0x09, 0x5d, 0xd9, 0xec, 0x01, 0xae, - 0x6c, 0x03, 0xa0, 0x17, 0x3a, 0x03, 0x39, 0xc1, 0xf9, 0xf3, 0xbe, 0x9a, 0xa3, 0xf8, 0x01, 0x11, - 0x98, 0x49, 0x96, 0xe7, 0xbf, 0xcc, 0xc1, 0xec, 0x0d, 0xca, 0x02, 0x4f, 0x5d, 0xed, 0x44, 0x1a, - 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x2f, 0x03, 0x45, 0x4b, 0xdf, 0xa6, 0x96, 0x27, 0x66, 0x53, 0x65, - 0xf1, 0xcd, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, 0x43, 0x62, 0xc0, 0xcb, 0x42, 0x54, - 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, 0xc3, 0x71, 0x99, 0x5a, 0x99, 0x83, - 0x88, 0xf8, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, 0x2c, 0x93, 0xda, 0x4c, 0x48, 0xc9, - 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, 0xaa, 0xba, 0x8e, 0x6d, 0x32, 0x47, - 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, 0x31, 0xca, 0x5c, 0xd3, 0xf0, 0x84, - 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, 0xe4, 0xfb, 0x8f, 0x34, 0x93, 0xff, - 0xaa, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, 0xd5, 0xa0, 0xcc, 0xef, 0xc0, 0x2f, - 0x41, 0x45, 0x45, 0x92, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, 0x23, 0x24, 0x61, 0x94, 0x8f, 0xfc, - 0x76, 0xd8, 0xef, 0x32, 0x69, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, 0x55, 0xf0, 0x50, 0x7d, 0xbf, 0x00, - 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0x7e, 0xf7, 0x1d, 0x9f, 0x80, 0x21, 0x0f, - 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, 0x46, 0x5d, 0x29, 0x9b, 0x17, 0xb2, - 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xd6, 0xe1, 0x9c, 0x21, 0x03, 0xc9, - 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x93, 0xb9, 0x3c, 0xcc, 0x82, 0x69, 0x72, - 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, - 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, 0x3b, 0x32, 0xe6, 0x12, 0xc9, 0x53, - 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xb3, 0xb2, 0xfc, 0xba, 0x6d, 0xb8, - 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91, 0x9c, 0x78, - 0x00, 0x0a, 0xf9, 0x25, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, 0x04, 0xac, 0xcc, 0x5a, 0x9c, 0x57, - 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, 0xee, 0xed, 0x1a, 0xfc, 0xf1, 0x66, - 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0x39, 0x8a, 0x72, 0xfd, 0x19, 0x7f, 0x93, 0xb7, 0x11, 0x27, - 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0x21, 0x8d, 0xea, 0x29, 0x99, 0xd5, - 0xf1, 0x77, 0xfc, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, 0x8f, 0x47, 0x72, 0x31, 0x14, 0x31, - 0xa1, 0x84, 0xd9, 0x7f, 0x37, 0x69, 0xf6, 0x5f, 0x9f, 0x64, 0xfa, 0xa7, 0x68, 0x38, 0xd4, 0xb4, - 0xbf, 0x05, 0xc4, 0x55, 0x11, 0x2c, 0xb9, 0x93, 0x88, 0x58, 0xfe, 0x20, 0x77, 0x86, 0x43, 0x1c, - 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, 0x6a, 0xc5, 0xe1, 0xe4, 0x92, 0xf0, - 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, 0x1a, 0xff, 0x47, 0x65, 0xb1, 0xee, - 0xca, 0xa6, 0x39, 0x36, 0xb3, 0xfd, 0x5e, 0xd2, 0x6c, 0xbf, 0x39, 0x79, 0xbf, 0x8d, 0x67, 0xb2, - 0x17, 0x01, 0x44, 0x2f, 0x44, 0x6d, 0x76, 0x60, 0xa9, 0x30, 0xa0, 0x60, 0x84, 0x8b, 0xcf, 0x42, - 0xbf, 0x9d, 0xa3, 0xe6, 0x3a, 0x98, 0x85, 0x8d, 0x28, 0x11, 0xe3, 0xbc, 0x23, 0x4d, 0x7e, 0x61, - 0x6c, 0x93, 0x7f, 0x0b, 0x48, 0x6c, 0x1f, 0x2b, 0xf1, 0x8a, 0xf1, 0xd4, 0xed, 0xcd, 0x21, 0x0e, - 0x4c, 0x91, 0x1a, 0x31, 0x94, 0xa7, 0x8e, 0x77, 0x28, 0x97, 0xc6, 0x1f, 0xca, 0xe4, 0x4d, 0xb8, - 0x28, 0x54, 0xa9, 0xf6, 0x89, 0x03, 0x4b, 0xe3, 0xff, 0x59, 0x05, 0x7c, 0x11, 0x47, 0x31, 0xe2, - 0x68, 0x0c, 0xde, 0x3f, 0x86, 0x4b, 0x9b, 0x5c, 0xb9, 0x6e, 0x8d, 0x5e, 0x18, 0x96, 0x53, 0x78, - 0x30, 0x55, 0x92, 0x0f, 0x31, 0xc6, 0x87, 0xa1, 0xbe, 0x6d, 0xd1, 0xa6, 0x4a, 0x5d, 0x07, 0x43, - 0x6c, 0x73, 0xad, 0xa1, 0x28, 0x18, 0xe1, 0x4a, 0xb3, 0xd5, 0xd3, 0x47, 0xb4, 0xd5, 0x37, 0x44, - 0xd0, 0xa7, 0x15, 0x5b, 0x12, 0x94, 0xc1, 0x0f, 0x0e, 0x23, 0x2c, 0x27, 0x19, 0x70, 0x58, 0x46, - 0x2c, 0x95, 0x86, 0x6b, 0xf6, 0x98, 0x17, 0xc7, 0x3a, 0x95, 0x58, 0x2a, 0x53, 0x78, 0x30, 0x55, - 0x92, 0x3b, 0x29, 0x3b, 0x54, 0xb7, 0xd8, 0x4e, 0x1c, 0xf0, 0x74, 0xdc, 0x49, 0x79, 0x79, 0x98, - 0x05, 0xd3, 0xe4, 0x26, 0x31, 0x6f, 0xdf, 0xce, 0xc2, 0xb9, 0x1b, 0x54, 0x25, 0xc7, 0x37, 0x9c, - 0xa6, 0x6f, 0xd7, 0xfe, 0x8f, 0xee, 0xb2, 0xde, 0xcd, 0xc2, 0xd4, 0x0d, 0xd7, 0xe9, 0xf7, 0xea, - 0x7b, 0xa4, 0x0d, 0xc5, 0x07, 0x22, 0x22, 0xa2, 0xe2, 0x20, 0xe3, 0x9f, 0x03, 0x90, 0x81, 0x95, - 0xd0, 0x04, 0xcb, 0x77, 0x54, 0xf0, 0xbc, 0xa5, 0x3a, 0x74, 0x8f, 0xca, 0xac, 0x58, 0x29, 0x6c, - 0xa9, 0xdb, 0xbc, 0x10, 0x25, 0x8d, 0xbc, 0x05, 0x53, 0x1e, 0x73, 0x5c, 0xdf, 0x48, 0x4f, 0x12, - 0xd1, 0xda, 0xa8, 0xbf, 0xd2, 0x90, 0x50, 0x72, 0x23, 0xaf, 0x5e, 0xd0, 0x57, 0xa0, 0x7d, 0x3f, - 0x03, 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0x8a, 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x83, 0x70, 0xd0, 0xea, - 0xf8, 0x61, 0xdf, 0x68, 0xa6, 0x52, 0xc5, 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, - 0xa9, 0x15, 0x52, 0xb5, 0x43, 0x90, 0x98, 0x51, 0xab, 0x28, 0xfa, 0x74, 0xed, 0xc7, 0x59, 0xb8, - 0x70, 0xd3, 0x66, 0xd4, 0x6d, 0x30, 0xda, 0x8b, 0x25, 0xe6, 0xc8, 0xaf, 0x0d, 0x9d, 0x5b, 0xfb, - 0xb9, 0xc3, 0x05, 0x41, 0xe4, 0xb1, 0xa7, 0x75, 0xca, 0xf4, 0xd0, 0x36, 0x85, 0x65, 0x91, 0xc3, - 0x6a, 0x7d, 0xc8, 0x7b, 0x3d, 0x6a, 0xa8, 0x10, 0x4b, 0x63, 0xec, 0xd6, 0x48, 0xff, 0x00, 0x3e, - 0xff, 0xc2, 0xe0, 0x96, 0x98, 0x8d, 0x42, 0x1d, 0xf9, 0x06, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0x1f, - 0x48, 0xdd, 0x3a, 0x6e, 0xc5, 0x02, 0x3c, 0x1c, 0xa3, 0xf2, 0x1d, 0x95, 0x52, 0xed, 0xc7, 0x19, - 0x98, 0x4d, 0x17, 0x5c, 0x33, 0x3d, 0x46, 0x7e, 0x65, 0xa8, 0xd9, 0x0f, 0x19, 0x7b, 0xe2, 0xd2, - 0xa2, 0xd1, 0x83, 0x2c, 0xb7, 0x5f, 0x12, 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0xef, 0x2b, - 0xdd, 0x3d, 0xe6, 0x4f, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xa8, 0x4f, - 0xe6, 0xdd, 0x42, 0xac, 0x78, 0xf2, 0xf7, 0xf6, 0x64, 0xc9, 0xdf, 0x78, 0x85, 0x86, 0x73, 0xc0, - 0xbf, 0x31, 0x9c, 0x03, 0xbe, 0x3b, 0x79, 0x0e, 0x38, 0xd1, 0x0c, 0x23, 0x53, 0xc1, 0xdf, 0xce, - 0xc1, 0xa5, 0x83, 0x86, 0x0d, 0xb7, 0x95, 0x6a, 0x74, 0x4e, 0x6a, 0x2b, 0x0f, 0x1e, 0x87, 0x64, - 0x11, 0x0a, 0xbd, 0x1d, 0xdd, 0xf3, 0x57, 0x15, 0x7f, 0xf1, 0x2d, 0x6c, 0xf0, 0xc2, 0x47, 0x83, - 0x5a, 0x45, 0xae, 0x46, 0xe2, 0x15, 0x25, 0x2b, 0xb7, 0x2c, 0x5d, 0xea, 0x79, 0xa1, 0x7f, 0x1b, - 0x58, 0x96, 0x75, 0x59, 0x8c, 0x3e, 0x9d, 0x30, 0x28, 0xca, 0x3d, 0xa3, 0x4a, 0x1b, 0x8c, 0x9f, - 0xe3, 0x4a, 0x39, 0x2f, 0x10, 0x7e, 0x94, 0x0a, 0x3f, 0x28, 0x5d, 0xc1, 0x79, 0x84, 0x42, 0xfa, - 0x79, 0x84, 0xc8, 0x02, 0x2b, 0xcf, 0x23, 0xfc, 0x43, 0x09, 0x2e, 0xa4, 0xf7, 0x21, 0xff, 0xd6, - 0x5d, 0xea, 0x7a, 0xa6, 0x63, 0xab, 0x45, 0x3b, 0x3c, 0xb7, 0x23, 0x8b, 0xd1, 0xa7, 0x7f, 0xaa, - 0xf3, 0x67, 0x7f, 0x92, 0xe1, 0x6e, 0xb0, 0x0c, 0xd4, 0x7c, 0x12, 0x39, 0xb4, 0x67, 0xa5, 0x3b, - 0x3d, 0x42, 0x21, 0x8e, 0xae, 0x0b, 0xf9, 0xe3, 0x0c, 0x54, 0xbb, 0x09, 0x3f, 0xfb, 0x04, 0x4f, - 0xce, 0x5d, 0xda, 0x1f, 0xd4, 0xaa, 0xeb, 0x23, 0xf4, 0xe1, 0xc8, 0x9a, 0x90, 0xdf, 0x84, 0x4a, - 0x8f, 0x8f, 0x0b, 0x8f, 0x51, 0xdb, 0xf0, 0x0f, 0xcf, 0x8d, 0x3f, 0xfa, 0x37, 0x42, 0xac, 0x06, - 0x73, 0x75, 0x46, 0xdb, 0x7b, 0x2a, 0x29, 0x16, 0x12, 0x30, 0xaa, 0xf1, 0x09, 0x3f, 0x2a, 0x77, - 0x05, 0x4a, 0x1e, 0x65, 0xcc, 0xb4, 0xdb, 0x9e, 0xd8, 0xbd, 0x95, 0xe5, 0x5c, 0x69, 0xa8, 0x32, - 0x0c, 0xa8, 0xe4, 0xff, 0x43, 0x59, 0xc4, 0x7d, 0x96, 0xdc, 0xb6, 0x57, 0x2d, 0x8b, 0x4c, 0x94, - 0xb0, 0xab, 0x0d, 0xbf, 0x10, 0x43, 0x3a, 0x79, 0x01, 0xa6, 0x65, 0x36, 0x4e, 0x1d, 0x99, 0x95, - 0x7b, 0xac, 0x33, 0xfb, 0x83, 0xda, 0x74, 0x3d, 0x52, 0x8e, 0x31, 0x2e, 0xbe, 0x9f, 0xa2, 0x41, - 0x70, 0x2c, 0xb9, 0x9f, 0x0a, 0xc3, 0x66, 0x18, 0xe1, 0x22, 0xcf, 0x42, 0x8e, 0x59, 0x9e, 0xd8, - 0x43, 0x95, 0x42, 0xbf, 0x77, 0x73, 0xad, 0x81, 0xbc, 0x5c, 0xfb, 0x9f, 0x0c, 0x9c, 0x4e, 0x9c, - 0x0c, 0xe2, 0x22, 0x7d, 0xd7, 0x52, 0x66, 0x24, 0x10, 0xd9, 0xc2, 0x35, 0xe4, 0xe5, 0xe4, 0x4d, - 0xe5, 0x15, 0x66, 0x27, 0xbc, 0x1d, 0x70, 0x47, 0x67, 0x1e, 0x77, 0x03, 0x87, 0x1c, 0xc2, 0x6b, - 0x89, 0xc6, 0xc9, 0xc5, 0x63, 0x6d, 0x07, 0x37, 0x50, 0x64, 0xc3, 0x99, 0x3f, 0xcc, 0x86, 0x53, - 0xfb, 0xbb, 0x1c, 0x54, 0x6e, 0x39, 0xdb, 0x9f, 0x92, 0xb3, 0x0f, 0xe9, 0x16, 0x39, 0xfb, 0x33, - 0xb4, 0xc8, 0x5b, 0xf0, 0x0c, 0x63, 0x7c, 0xd7, 0xef, 0xd8, 0x4d, 0x6f, 0xa9, 0xc5, 0xa8, 0xbb, - 0x6a, 0xda, 0xa6, 0xb7, 0x43, 0x9b, 0x2a, 0x72, 0xf7, 0x99, 0xfd, 0x41, 0xed, 0x99, 0xcd, 0xcd, - 0xb5, 0x34, 0x16, 0x1c, 0x25, 0x2b, 0x66, 0x88, 0x6e, 0x74, 0x9c, 0x56, 0x4b, 0x66, 0xb6, 0x65, - 0x8e, 0x47, 0xce, 0x90, 0x48, 0x39, 0xc6, 0xb8, 0xb4, 0x8f, 0x32, 0x50, 0xbe, 0xad, 0xb7, 0x3a, - 0x7a, 0xc3, 0xb4, 0x3b, 0xe4, 0x39, 0x98, 0xda, 0x76, 0x9d, 0x0e, 0x75, 0x3d, 0x95, 0x69, 0x16, - 0xbb, 0x9e, 0xba, 0x2c, 0x42, 0x9f, 0xc6, 0xb7, 0x61, 0xcc, 0xe9, 0x99, 0x46, 0x72, 0xc3, 0xba, - 0xc9, 0x0b, 0x51, 0xd2, 0xc8, 0x7d, 0x39, 0x8f, 0x72, 0x13, 0x1e, 0xad, 0xde, 0x5c, 0x6b, 0xc8, - 0xec, 0xad, 0x3f, 0x03, 0xc9, 0xf3, 0x31, 0xcf, 0xa3, 0x3c, 0xca, 0x57, 0xd0, 0xbe, 0x97, 0x85, - 0x8a, 0xfc, 0x34, 0xb9, 0x39, 0x3b, 0xce, 0x8f, 0x7b, 0x51, 0x44, 0xd7, 0xbd, 0x7e, 0x97, 0xba, - 0x62, 0x13, 0xac, 0xa6, 0x5c, 0x34, 0x5a, 0x12, 0x12, 0x83, 0x08, 0x7b, 0x58, 0xe4, 0xb7, 0x4e, - 0xfe, 0x04, 0x5b, 0xa7, 0x70, 0x60, 0xeb, 0xfc, 0x79, 0x06, 0xca, 0x6b, 0x66, 0x8b, 0x1a, 0x7b, - 0x86, 0x45, 0xc9, 0xab, 0x50, 0x6d, 0x52, 0x8b, 0x32, 0x7a, 0xc3, 0xd5, 0x0d, 0xba, 0x41, 0x5d, - 0x53, 0x5c, 0xa4, 0xe1, 0xa3, 0x4c, 0xcc, 0xe3, 0x82, 0x5c, 0x2e, 0x57, 0x46, 0xf0, 0xe0, 0x48, - 0x69, 0x72, 0x13, 0xa6, 0x9b, 0xd4, 0x33, 0x5d, 0xda, 0xdc, 0x88, 0x78, 0xa3, 0xcf, 0xf9, 0xb6, - 0x69, 0x25, 0x42, 0x7b, 0x34, 0xa8, 0xcd, 0x6c, 0x98, 0x3d, 0x6a, 0x99, 0x36, 0x95, 0x6e, 0x69, - 0x4c, 0x54, 0x2b, 0x40, 0x6e, 0xcd, 0x69, 0x6b, 0xef, 0xe7, 0x20, 0xb8, 0x1a, 0x45, 0x7e, 0x2b, - 0x03, 0x15, 0xdd, 0xb6, 0x1d, 0xa6, 0xae, 0x1d, 0xc9, 0xd8, 0x3e, 0x4e, 0x7c, 0x03, 0x6b, 0x7e, - 0x29, 0x04, 0x95, 0x61, 0xe1, 0x20, 0x54, 0x1d, 0xa1, 0x60, 0x54, 0x37, 0xe9, 0x27, 0x22, 0xd5, - 0xeb, 0x93, 0xd7, 0xe2, 0x10, 0x71, 0xe9, 0xd9, 0xaf, 0xc1, 0x99, 0x64, 0x65, 0x8f, 0x12, 0xd8, - 0x9a, 0x24, 0x26, 0xf6, 0x6e, 0x19, 0x2a, 0x77, 0x74, 0x66, 0xee, 0x52, 0xb1, 0x05, 0x3b, 0x19, - 0x9f, 0xfa, 0x0f, 0x33, 0x70, 0x21, 0x1e, 0x33, 0x3e, 0x41, 0xc7, 0x7a, 0x76, 0x7f, 0x50, 0xbb, - 0x80, 0xa9, 0xda, 0x70, 0x44, 0x2d, 0x84, 0x8b, 0x3d, 0x14, 0x82, 0x3e, 0x69, 0x17, 0xbb, 0x31, - 0x4a, 0x21, 0x8e, 0xae, 0xcb, 0xa7, 0xc5, 0xc5, 0x7e, 0xb2, 0xaf, 0xaa, 0x24, 0x36, 0x00, 0x53, - 0x4f, 0xcc, 0x06, 0xa0, 0xf4, 0x44, 0x38, 0x5c, 0xbd, 0xc8, 0x06, 0xa0, 0x3c, 0x61, 0x1c, 0x54, - 0xa5, 0x59, 0x25, 0xda, 0xa8, 0x8d, 0x84, 0x38, 0xfc, 0xe6, 0xfb, 0xc6, 0xc4, 0x80, 0xc2, 0xb6, - 0xee, 0x99, 0x86, 0x72, 0x3f, 0xeb, 0xe3, 0x87, 0x25, 0xfc, 0x3b, 0x1d, 0x32, 0xc6, 0x24, 0x5e, - 0x51, 0x62, 0x87, 0x77, 0x47, 0xb2, 0x13, 0xdd, 0x1d, 0x21, 0xcb, 0x90, 0xb7, 0xb9, 0xb1, 0xcd, - 0x1d, 0xf9, 0xb6, 0xc8, 0x9d, 0xdb, 0x74, 0x0f, 0x85, 0xb0, 0xf6, 0xc3, 0x2c, 0x00, 0xff, 0x7c, - 0xe5, 0xe6, 0x3c, 0x66, 0x33, 0xf2, 0x79, 0x98, 0xf2, 0xfa, 0x22, 0x5a, 0xab, 0x96, 0xe2, 0x30, - 0x78, 0x2c, 0x8b, 0xd1, 0xa7, 0x73, 0x4f, 0xe8, 0xed, 0x3e, 0xed, 0xfb, 0xb1, 0xa0, 0xc0, 0x13, - 0x7a, 0x85, 0x17, 0xa2, 0xa4, 0x9d, 0x9c, 0x23, 0xe3, 0xef, 0x9a, 0x0a, 0x27, 0xb4, 0x6b, 0xd2, - 0xbe, 0x99, 0x05, 0x08, 0x03, 0xfc, 0xe4, 0xfb, 0x19, 0x38, 0x1f, 0xcc, 0x32, 0x26, 0x6f, 0x24, - 0x2c, 0x5b, 0xba, 0xd9, 0x9d, 0x78, 0x23, 0x93, 0x36, 0xc3, 0x85, 0xd9, 0xd9, 0x48, 0x53, 0x87, - 0xe9, 0xb5, 0x20, 0x08, 0x25, 0xda, 0xed, 0xb1, 0xbd, 0x15, 0xd3, 0x55, 0xc3, 0x2e, 0xf5, 0x48, - 0xff, 0x75, 0xc5, 0x23, 0x45, 0xd5, 0xcd, 0x0d, 0x31, 0x73, 0x7c, 0x0a, 0x06, 0x38, 0xda, 0x77, - 0xb3, 0x70, 0x2e, 0xa5, 0x76, 0xe4, 0x25, 0x38, 0xa3, 0x32, 0x1c, 0xe1, 0xb5, 0xdc, 0x4c, 0x78, - 0x2d, 0xb7, 0x91, 0xa0, 0xe1, 0x10, 0x37, 0x79, 0x13, 0x40, 0x37, 0x0c, 0xea, 0x79, 0xeb, 0x4e, - 0xd3, 0x77, 0xfa, 0x5e, 0xe4, 0x9b, 0xca, 0xa5, 0xa0, 0xf4, 0xd1, 0xa0, 0xf6, 0xc5, 0xb4, 0x54, - 0x55, 0xe2, 0xeb, 0x43, 0x01, 0x8c, 0x40, 0x92, 0x37, 0x00, 0xe4, 0x3d, 0x91, 0xe0, 0xb0, 0xe5, - 0x63, 0x22, 0xe9, 0xf3, 0xfe, 0x1d, 0x86, 0xf9, 0x57, 0xfa, 0xba, 0xcd, 0x4c, 0xb6, 0x27, 0x8f, - 0x45, 0xdf, 0x0b, 0x50, 0x30, 0x82, 0xa8, 0xfd, 0x4d, 0x16, 0x4a, 0xbe, 0x33, 0xfa, 0x09, 0xe4, - 0x4a, 0xda, 0xb1, 0x5c, 0xc9, 0xf8, 0x17, 0x03, 0xfd, 0x2a, 0x8f, 0xcc, 0x8e, 0x38, 0x89, 0xec, - 0xc8, 0x8d, 0xc9, 0x55, 0x1d, 0x9c, 0x0f, 0xf9, 0x41, 0x16, 0x4e, 0xf9, 0xac, 0xea, 0x1c, 0xf7, - 0x97, 0x61, 0xc6, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0x63, 0x47, 0x74, 0x9f, 0x3c, 0xc5, 0x7d, 0x76, - 0x7f, 0x50, 0x9b, 0xc1, 0x28, 0x01, 0xe3, 0x7c, 0x69, 0x07, 0xc0, 0xb3, 0x13, 0x1e, 0x00, 0xcf, - 0x1d, 0xe5, 0x00, 0x38, 0xd1, 0xa1, 0xc2, 0x6b, 0xb4, 0x69, 0x76, 0xa9, 0xd3, 0xf7, 0xff, 0x44, - 0x70, 0xd4, 0xc3, 0xc3, 0x62, 0x75, 0xc7, 0x10, 0x06, 0xa3, 0x98, 0xda, 0x3f, 0x66, 0x60, 0x3a, - 0x6c, 0xaf, 0x13, 0xcf, 0x18, 0xb5, 0xe2, 0x19, 0xa3, 0xa5, 0x89, 0x87, 0xc3, 0x88, 0x1c, 0xd1, - 0xef, 0x17, 0xc3, 0xcf, 0x12, 0x59, 0xa1, 0x6d, 0x98, 0x35, 0x53, 0x13, 0x25, 0x11, 0x6b, 0x13, - 0x1c, 0x82, 0xbb, 0x39, 0x92, 0x13, 0x0f, 0x40, 0x21, 0x7d, 0x28, 0xed, 0x52, 0x97, 0x99, 0x06, - 0xf5, 0xbf, 0xef, 0xc6, 0xc4, 0xde, 0x91, 0x3c, 0x00, 0x10, 0xb6, 0xe9, 0x3d, 0xa5, 0x00, 0x03, - 0x55, 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, 0xaf, 0x4e, 0x74, 0xa3, 0x22, 0x6c, - 0x4f, 0xfe, 0xe6, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xbe, - 0x4e, 0x10, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x45, 0x18, 0xea, 0x21, 0x9d, 0xe0, 0xae, 0x48, 0xe1, - 0x98, 0x8c, 0xc7, 0x01, 0xf7, 0x45, 0x3c, 0x28, 0x3f, 0xd0, 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, - 0x8e, 0xff, 0xf8, 0x5f, 0x78, 0xdf, 0x47, 0x0a, 0xbf, 0x30, 0x28, 0xc2, 0x50, 0x0f, 0x71, 0xa0, - 0xcc, 0x94, 0x27, 0xeb, 0x5f, 0x37, 0x1c, 0x5f, 0xa9, 0xef, 0x13, 0x7b, 0x32, 0xb0, 0x1d, 0xbc, - 0x62, 0xa8, 0x43, 0x7b, 0x94, 0x0b, 0xcd, 0xe3, 0x27, 0x9d, 0x22, 0x7c, 0x21, 0x9e, 0x22, 0x9c, - 0x4b, 0xa6, 0x08, 0x13, 0xd1, 0x98, 0xa3, 0x27, 0x09, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xb6, 0x7a, - 0x4d, 0x9d, 0xa9, 0xf8, 0x72, 0x65, 0xf1, 0xff, 0x1d, 0xce, 0x7a, 0x71, 0x7b, 0x18, 0x06, 0x5d, - 0xd6, 0x42, 0x18, 0x8c, 0x62, 0x92, 0xab, 0x50, 0xd9, 0x15, 0x33, 0x52, 0xde, 0xa6, 0x28, 0x08, - 0x73, 0x2e, 0x2c, 0xec, 0xbd, 0xb0, 0x18, 0xa3, 0x3c, 0x5c, 0x44, 0x7a, 0x02, 0x52, 0xa4, 0x18, - 0x8a, 0x34, 0xc2, 0x62, 0x8c, 0xf2, 0x88, 0x5c, 0x85, 0x69, 0x77, 0xa4, 0xc0, 0x94, 0x10, 0x90, - 0xb9, 0x0a, 0xbf, 0x10, 0x43, 0x3a, 0xb9, 0x02, 0xa5, 0x7e, 0xb3, 0x25, 0x79, 0x4b, 0x82, 0x57, - 0xf8, 0x5f, 0x5b, 0x2b, 0xab, 0xea, 0x76, 0x87, 0x4f, 0xd5, 0xfe, 0x33, 0x03, 0x64, 0x38, 0xa9, - 0x4d, 0x76, 0xa0, 0x68, 0x8b, 0xa8, 0xca, 0xc4, 0xd7, 0xa5, 0x23, 0xc1, 0x19, 0x39, 0xc7, 0x54, - 0x81, 0xc2, 0x27, 0x36, 0x94, 0xe8, 0x43, 0x46, 0x5d, 0x5b, 0xb7, 0x94, 0xeb, 0x71, 0x3c, 0x57, - 0xb3, 0xa5, 0xc3, 0xa9, 0x90, 0x31, 0xd0, 0xa1, 0xfd, 0x24, 0x0b, 0x95, 0x08, 0xdf, 0xe3, 0x36, - 0x2b, 0xe2, 0xcc, 0xa8, 0x0c, 0x66, 0x6c, 0xb9, 0x96, 0x1a, 0xa6, 0x91, 0x33, 0xa3, 0x8a, 0x84, - 0x6b, 0x18, 0xe5, 0x23, 0x8b, 0x00, 0x5d, 0xdd, 0x63, 0xd4, 0x15, 0x4b, 0x49, 0xe2, 0xa4, 0xe6, - 0x7a, 0x40, 0xc1, 0x08, 0x17, 0xb9, 0xac, 0x2e, 0xee, 0xe7, 0xe3, 0x97, 0xa6, 0x46, 0xdc, 0xca, - 0x2f, 0x1c, 0xc3, 0xad, 0x7c, 0xd2, 0x86, 0x33, 0x7e, 0xad, 0x7d, 0xaa, 0xb2, 0x73, 0x87, 0x04, - 0x96, 0xce, 0x78, 0x02, 0x02, 0x87, 0x40, 0xb5, 0x1f, 0x66, 0x60, 0x26, 0xb6, 0x95, 0xe6, 0x5b, - 0xbb, 0xf0, 0x48, 0x46, 0x64, 0x6b, 0x17, 0x3b, 0x49, 0xf1, 0x3c, 0x14, 0x65, 0x03, 0xa9, 0x86, - 0x0f, 0xcc, 0x88, 0x6c, 0x42, 0x54, 0x54, 0x6e, 0x10, 0x54, 0xb0, 0x2e, 0x69, 0x10, 0x54, 0x34, - 0x0f, 0x7d, 0x3a, 0xf9, 0x02, 0x94, 0xfc, 0xda, 0xa9, 0x96, 0x0e, 0xff, 0xd9, 0xa0, 0xca, 0x31, - 0xe0, 0xd0, 0xbe, 0x55, 0x00, 0xf9, 0xc3, 0x09, 0x2e, 0xd7, 0x34, 0x3d, 0x99, 0xa5, 0xca, 0x88, - 0x2c, 0x55, 0x20, 0xb7, 0xa2, 0xca, 0x31, 0xe0, 0x20, 0x17, 0x21, 0xd7, 0x35, 0x6d, 0x15, 0x56, - 0x14, 0xbb, 0xca, 0x75, 0xd3, 0x46, 0x5e, 0x26, 0x48, 0xfa, 0x43, 0x95, 0x68, 0x91, 0x24, 0xfd, - 0x21, 0xf2, 0x32, 0xee, 0x5c, 0x5a, 0x8e, 0xd3, 0xd9, 0xd6, 0x8d, 0x8e, 0x1f, 0xfa, 0xce, 0x8b, - 0xd9, 0x2b, 0x9c, 0xcb, 0xb5, 0x38, 0x09, 0x93, 0xbc, 0x5c, 0xdc, 0x70, 0x1c, 0xab, 0xe9, 0x3c, - 0xb0, 0x7d, 0xf1, 0x42, 0x28, 0xbe, 0x1c, 0x27, 0x61, 0x92, 0x97, 0x6c, 0xc1, 0x33, 0xef, 0x50, - 0xd7, 0x51, 0x2d, 0xd6, 0xb0, 0x28, 0xed, 0xf9, 0x30, 0xd2, 0x40, 0x89, 0xac, 0xd0, 0x6b, 0xe9, - 0x2c, 0x38, 0x4a, 0x56, 0x24, 0x9b, 0x74, 0xb7, 0x4d, 0xd9, 0x86, 0xeb, 0xf0, 0xbd, 0x93, 0x69, - 0xb7, 0x7d, 0xd8, 0xa9, 0x10, 0x76, 0x33, 0x9d, 0x05, 0x47, 0xc9, 0x92, 0x75, 0x38, 0x2b, 0x49, - 0x11, 0x9f, 0x59, 0xd9, 0xba, 0xda, 0xfe, 0xa0, 0xf6, 0x99, 0x15, 0xda, 0x73, 0xa9, 0xc1, 0x0d, - 0xf4, 0x66, 0x92, 0x0d, 0x87, 0x25, 0xc5, 0x6f, 0xa0, 0x54, 0xb8, 0x77, 0x83, 0xba, 0xa2, 0xcb, - 0x45, 0xec, 0x48, 0x39, 0xe6, 0x98, 0xa0, 0xe1, 0x10, 0x37, 0x79, 0x15, 0xaa, 0x51, 0xd8, 0xa5, - 0x5d, 0xdd, 0xb4, 0xf4, 0x6d, 0xd3, 0x32, 0xd9, 0x9e, 0xc8, 0x15, 0xcf, 0xc8, 0x60, 0xe4, 0xe6, - 0x08, 0x1e, 0x1c, 0x29, 0xad, 0xfd, 0x41, 0x0e, 0xc4, 0x1f, 0x83, 0xc8, 0x7d, 0xc8, 0x59, 0x4e, - 0x5b, 0x99, 0xe4, 0xf1, 0x23, 0x1d, 0x6b, 0x4e, 0x5b, 0x0e, 0xbc, 0x35, 0xa7, 0x8d, 0x1c, 0x91, - 0x18, 0x50, 0xe8, 0xe8, 0xad, 0x8e, 0xae, 0x2c, 0xf0, 0xf8, 0xfe, 0x46, 0x90, 0xc8, 0x53, 0x37, - 0x44, 0xf9, 0x2b, 0x4a, 0x6c, 0xee, 0xd8, 0x6c, 0xfb, 0xbf, 0x00, 0x51, 0x5b, 0xbf, 0x09, 0x62, - 0x63, 0x3e, 0x92, 0x5c, 0x05, 0x83, 0x57, 0x0c, 0x75, 0x10, 0x03, 0x8a, 0xfd, 0xa6, 0xf8, 0x73, - 0x53, 0x7e, 0x42, 0x2f, 0x66, 0x6b, 0x45, 0x7c, 0x93, 0x58, 0xbf, 0xe4, 0x33, 0x2a, 0x68, 0xed, - 0x2f, 0x32, 0x30, 0xd3, 0xb0, 0xcc, 0xa6, 0x69, 0xb7, 0x4f, 0xee, 0x4e, 0x2e, 0xb9, 0x0b, 0x05, - 0xcf, 0x32, 0x9b, 0x74, 0xcc, 0xcb, 0xa2, 0xa2, 0x33, 0x78, 0x2d, 0x29, 0x4a, 0x1c, 0xed, 0x4f, - 0xf3, 0xa0, 0x7e, 0x73, 0x45, 0xfa, 0x50, 0x6e, 0xfb, 0x37, 0x57, 0x55, 0x95, 0x5f, 0x9e, 0xe0, - 0x86, 0x43, 0xec, 0x0e, 0xac, 0xec, 0x9d, 0xa0, 0x10, 0x43, 0x4d, 0x84, 0xc6, 0xc7, 0xdc, 0xca, - 0x84, 0x63, 0x4e, 0xaa, 0x1b, 0x1e, 0x75, 0x3a, 0xe4, 0x77, 0x18, 0xeb, 0x4d, 0x7c, 0x10, 0x37, - 0x3c, 0x63, 0x2b, 0xc3, 0x78, 0xfc, 0x1d, 0x05, 0x34, 0x57, 0x61, 0xeb, 0xc7, 0x70, 0x7b, 0x3d, - 0x0c, 0xa1, 0xaa, 0x08, 0xab, 0xce, 0x3c, 0x14, 0xd0, 0xe4, 0xd7, 0xa1, 0xc2, 0x5c, 0xdd, 0xf6, - 0x5a, 0x8e, 0xdb, 0xa5, 0xae, 0x5a, 0xfc, 0x57, 0x27, 0x18, 0xcf, 0x9b, 0x21, 0x9a, 0x8c, 0x7a, - 0xc4, 0x8a, 0x30, 0xaa, 0x4d, 0xeb, 0x82, 0x72, 0xdb, 0x89, 0x11, 0xfb, 0x4b, 0x80, 0xcc, 0x74, - 0x2e, 0x1c, 0x6e, 0x2c, 0x06, 0x77, 0xc9, 0x23, 0x77, 0xeb, 0x52, 0x7f, 0x07, 0xa0, 0xfd, 0x73, - 0x16, 0x72, 0x9b, 0x6b, 0x0d, 0x79, 0x55, 0x44, 0xfc, 0x34, 0x83, 0x36, 0x3a, 0x66, 0xef, 0x1e, - 0x75, 0xcd, 0xd6, 0x9e, 0x5a, 0x7b, 0x23, 0x57, 0x45, 0x92, 0x1c, 0x98, 0x22, 0x45, 0x5e, 0x87, - 0x69, 0x43, 0x5f, 0xa6, 0x2e, 0x93, 0x2e, 0xcc, 0xd1, 0xa2, 0xe6, 0xe2, 0x04, 0xc3, 0xf2, 0x52, - 0x28, 0x8e, 0x31, 0x30, 0xb2, 0x05, 0x60, 0x84, 0xd0, 0x47, 0x8a, 0xa4, 0xcb, 0xdf, 0x22, 0x84, - 0xc0, 0x11, 0x20, 0x82, 0x50, 0xee, 0x70, 0x56, 0x81, 0x9a, 0x3f, 0x0a, 0xaa, 0x98, 0x74, 0xb7, - 0x7d, 0x59, 0x0c, 0x61, 0xb4, 0x7f, 0xcf, 0x40, 0xb8, 0x09, 0x24, 0x1e, 0x14, 0x9b, 0xe2, 0xd6, - 0xb6, 0x9a, 0xf6, 0xe3, 0x6f, 0xa6, 0xe3, 0x3f, 0x23, 0xa9, 0x93, 0xfd, 0x41, 0x2d, 0xf1, 0x83, - 0x12, 0x54, 0xaa, 0x48, 0x1b, 0x72, 0x6f, 0x39, 0xdb, 0x13, 0xcf, 0xfa, 0xc8, 0xf9, 0x1f, 0xb9, - 0x73, 0x8a, 0x14, 0x20, 0xd7, 0xa0, 0x7d, 0x2b, 0x0b, 0x95, 0xc8, 0x98, 0x9e, 0xf8, 0xa7, 0x04, - 0x0f, 0x13, 0x3f, 0x25, 0xd8, 0x18, 0x7f, 0x57, 0x1e, 0xd6, 0xea, 0xa4, 0xff, 0x4b, 0xf0, 0xb7, - 0x59, 0xc8, 0x6d, 0xad, 0xac, 0xf2, 0xc5, 0x37, 0x38, 0x07, 0x34, 0x71, 0x62, 0x2a, 0xfc, 0xdf, - 0x99, 0x18, 0x69, 0xc1, 0x2b, 0x86, 0x3a, 0xc8, 0x0e, 0x4c, 0x6d, 0xf7, 0x4d, 0x8b, 0x99, 0xf6, - 0xc4, 0xa7, 0xce, 0xfc, 0x7f, 0x38, 0xa8, 0xe3, 0x32, 0x12, 0x15, 0x7d, 0x78, 0xd2, 0x86, 0xa9, - 0xb6, 0xbc, 0x06, 0xa2, 0xe6, 0xde, 0x4b, 0xe3, 0xaf, 0x5e, 0x12, 0x47, 0x2a, 0x52, 0x2f, 0xe8, - 0xa3, 0x6b, 0xdf, 0x00, 0xb5, 0xf8, 0x13, 0xef, 0x64, 0x5a, 0x33, 0x08, 0x0c, 0xa5, 0xb5, 0xa8, - 0xf6, 0x1f, 0x19, 0x88, 0x5b, 0xe9, 0x4f, 0xbe, 0x53, 0x3b, 0xc9, 0x4e, 0x5d, 0x39, 0x8e, 0x39, - 0x90, 0xde, 0xaf, 0xda, 0x5f, 0x67, 0xa1, 0xa8, 0x7e, 0x04, 0x7a, 0xf2, 0xd9, 0x0f, 0x1a, 0xcb, - 0x7e, 0x2c, 0x4f, 0xf8, 0x5b, 0xc4, 0x91, 0xb9, 0x8f, 0x6e, 0x22, 0xf7, 0x31, 0xe9, 0xff, 0x17, - 0x1f, 0x93, 0xf9, 0xf8, 0xfb, 0x0c, 0x9c, 0x92, 0x8c, 0x37, 0x6d, 0x8f, 0xe9, 0xb6, 0x21, 0x9c, - 0x62, 0x19, 0x89, 0x9a, 0x38, 0xb4, 0xa7, 0xc2, 0xd0, 0xc2, 0x5d, 0x95, 0xcf, 0xa8, 0xa0, 0xf9, - 0x66, 0x79, 0xc7, 0xf1, 0x98, 0x30, 0xb7, 0xd9, 0xf8, 0x26, 0xfb, 0x65, 0x55, 0x8e, 0x01, 0x47, - 0x72, 0xf7, 0x5e, 0x18, 0xbd, 0x7b, 0xd7, 0xfe, 0x2c, 0x03, 0xd3, 0xd1, 0x3f, 0x4f, 0x8e, 0x9f, - 0xc8, 0x49, 0xe4, 0x51, 0xb2, 0x27, 0x90, 0x47, 0xf9, 0x30, 0x03, 0xe0, 0x57, 0xf6, 0xc4, 0xb3, - 0x28, 0xcd, 0x78, 0x16, 0x65, 0xe2, 0x6e, 0x4d, 0xcf, 0xa1, 0xfc, 0xa0, 0xe0, 0x7f, 0x92, 0xc8, - 0xa0, 0xbc, 0x97, 0x81, 0x53, 0x7a, 0x2c, 0x2b, 0x31, 0xb1, 0x27, 0x91, 0x48, 0x72, 0x04, 0x7f, - 0xea, 0x8c, 0x97, 0x63, 0x42, 0x2d, 0xb9, 0x06, 0xd3, 0x3d, 0x15, 0x2a, 0xbe, 0x13, 0x8e, 0xba, - 0xe0, 0x00, 0xf2, 0x46, 0x84, 0x86, 0x31, 0xce, 0xc7, 0x64, 0x81, 0x72, 0xc7, 0x92, 0x05, 0x8a, - 0x1e, 0x35, 0xcb, 0x1f, 0x78, 0xd4, 0xcc, 0x86, 0x72, 0xcb, 0x75, 0xba, 0x22, 0xd1, 0xa2, 0xfe, - 0x8b, 0x38, 0x61, 0xf2, 0x26, 0x58, 0x54, 0x56, 0x7d, 0x5c, 0x0c, 0x55, 0xf0, 0x65, 0x9a, 0x39, - 0x52, 0x5b, 0xf1, 0x38, 0xb4, 0x05, 0x53, 0x77, 0x53, 0xa2, 0xa2, 0x0f, 0x1f, 0x4f, 0xa6, 0x4c, - 0x7d, 0x32, 0xc9, 0x14, 0xed, 0x9f, 0xb2, 0xbe, 0xbd, 0x68, 0x24, 0xee, 0x24, 0x65, 0x46, 0xdc, - 0x49, 0x52, 0xb7, 0x6b, 0xa3, 0xe9, 0x86, 0xe7, 0xa1, 0xe8, 0x52, 0xdd, 0x73, 0x6c, 0x75, 0x4f, - 0x3d, 0xb0, 0xb6, 0x28, 0x4a, 0x51, 0x51, 0xa3, 0x69, 0x89, 0xec, 0x63, 0xd2, 0x12, 0x5f, 0x88, - 0x0c, 0x08, 0x99, 0xff, 0x0d, 0xe6, 0x76, 0xca, 0xa0, 0x10, 0x31, 0x4b, 0xf5, 0xbb, 0xfd, 0x42, - 0x32, 0x66, 0xa9, 0x7e, 0x85, 0x1f, 0x70, 0x90, 0x26, 0x4c, 0x5b, 0xba, 0xc7, 0x44, 0x54, 0xaa, - 0xb9, 0xc4, 0xc6, 0xc8, 0x79, 0x04, 0xd3, 0x66, 0x2d, 0x82, 0x83, 0x31, 0x54, 0xed, 0xf7, 0x32, - 0x10, 0x36, 0xf9, 0x11, 0xa3, 0xa3, 0xaf, 0x42, 0xa9, 0xab, 0x3f, 0x5c, 0xa1, 0x96, 0xbe, 0x37, - 0xc9, 0xdf, 0xaf, 0xd6, 0x15, 0x06, 0x06, 0x68, 0xda, 0x20, 0x03, 0xea, 0xc6, 0x2e, 0xa1, 0x50, - 0x68, 0x99, 0x0f, 0x55, 0x7d, 0x26, 0xf1, 0x54, 0x22, 0xff, 0x5b, 0x93, 0xf1, 0x05, 0x51, 0x80, - 0x12, 0x9d, 0x74, 0x61, 0xca, 0x93, 0xe1, 0x1f, 0xf5, 0x29, 0xe3, 0xef, 0xca, 0x63, 0x61, 0x24, - 0x75, 0xdd, 0x57, 0x16, 0xa1, 0xaf, 0xa3, 0x3e, 0xff, 0xc1, 0xc7, 0x73, 0x4f, 0x7d, 0xf8, 0xf1, - 0xdc, 0x53, 0x1f, 0x7d, 0x3c, 0xf7, 0xd4, 0x37, 0xf7, 0xe7, 0x32, 0x1f, 0xec, 0xcf, 0x65, 0x3e, - 0xdc, 0x9f, 0xcb, 0x7c, 0xb4, 0x3f, 0x97, 0xf9, 0xd7, 0xfd, 0xb9, 0xcc, 0xef, 0xfe, 0xdb, 0xdc, - 0x53, 0xaf, 0x95, 0x7c, 0xcc, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x5b, 0xd2, 0x27, 0xde, - 0x63, 0x00, 0x00, + 0x6b, 0xfe, 0xa7, 0xef, 0xb6, 0x6a, 0xbf, 0x91, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4, + 0xc5, 0x8d, 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a, + 0x28, 0x7a, 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0x3b, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74, + 0x32, 0xd9, 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83, + 0x1a, 0x84, 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc, + 0x21, 0x0e, 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62, + 0x2f, 0x54, 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0xc8, 0xf3, 0x50, + 0x74, 0xec, 0xd5, 0xbe, 0x65, 0xa9, 0xd0, 0xc8, 0x29, 0xd5, 0x6e, 0xc5, 0xbb, 0xa2, 0x14, 0x15, + 0x55, 0xfb, 0xed, 0x0c, 0x40, 0xa8, 0x9d, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x27, 0x64, 0x5d, 0x7f, + 0xb8, 0x46, 0xed, 0x36, 0xdb, 0x11, 0xfd, 0x92, 0x97, 0xa6, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97, + 0xbc, 0x04, 0x67, 0x64, 0xd1, 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x6f, 0x33, 0x32, 0x28, 0x51, 0x4f, + 0xd0, 0x70, 0x88, 0x5b, 0xd3, 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e, + 0x10, 0x84, 0xa2, 0x15, 0x56, 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x37, 0x41, 0x0c, 0x32, 0x6c, 0xd9, + 0x2e, 0x65, 0x3a, 0x37, 0x40, 0x2b, 0x7d, 0x15, 0x25, 0x93, 0xad, 0x29, 0x6b, 0xab, 0x90, 0xb4, + 0x17, 0xe0, 0xec, 0x50, 0x3f, 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x69, 0xb9, 0xbf, + 0x20, 0x1c, 0xa4, 0xdb, 0xbc, 0x00, 0x65, 0xb9, 0xf6, 0xdf, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43, + 0x78, 0xc0, 0x8f, 0x77, 0xff, 0x7c, 0xf7, 0x23, 0x9b, 0xea, 0x7e, 0xf4, 0xa1, 0xd8, 0x79, 0x10, + 0xb8, 0x27, 0x95, 0xc5, 0xf5, 0xf1, 0x47, 0xac, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x83, 0x8e, + 0x41, 0x67, 0xdf, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, 0x84, 0xed, 0x48, 0x51, + 0x8e, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xd7, 0x75, 0x5c, 0xe9, 0xd5, 0x90, 0x8b, 0x90, 0x73, + 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0x9b, 0x78, 0xdc, 0xd8, 0x42, 0x5e, 0x46, 0x5e, 0x85, 0x52, 0x53, + 0xf5, 0x81, 0xf2, 0x26, 0x8f, 0xda, 0x73, 0xc2, 0xce, 0xfa, 0x6f, 0x18, 0xa0, 0x71, 0xf7, 0xaf, + 0xeb, 0xb5, 0x1b, 0xe6, 0x3b, 0xd2, 0xb8, 0x16, 0xa4, 0xfb, 0xb7, 0x2e, 0x8b, 0xd0, 0xa7, 0x71, + 0xc3, 0xdd, 0xa1, 0x7b, 0xcb, 0xdc, 0x13, 0x12, 0xb3, 0x53, 0x19, 0xee, 0xdb, 0xaa, 0x0c, 0x03, + 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, 0x05, 0xea, 0xf3, 0xb5, + 0xef, 0x64, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0xba, 0xb5, 0x42, 0x7b, 0x96, 0xb3, 0xc7, 0x97, 0x7b, + 0xa4, 0x6f, 0x93, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x47, 0x5e, 0x8d, 0x86, 0xcb, + 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, 0x09, 0x5d, 0xde, 0xec, + 0x01, 0x2e, 0x6f, 0x03, 0xa0, 0x17, 0x3a, 0x0d, 0x39, 0xc1, 0xf9, 0xb3, 0xbe, 0x9a, 0xa3, 0xf8, + 0x0b, 0x11, 0x98, 0x49, 0x96, 0xf1, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca, 0x02, 0x8f, 0x5e, 0xed, + 0x58, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x2f, 0x03, 0x45, 0x4b, 0xdf, 0xa6, 0x96, 0x27, 0x66, + 0x53, 0x65, 0xf1, 0xcd, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, 0x43, 0x62, 0xc0, 0xcb, + 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, 0xc3, 0x71, 0x99, 0x5a, + 0xc1, 0x83, 0xc8, 0xf9, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, 0x2c, 0x93, 0xda, 0x4c, + 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, 0xaa, 0xba, 0x8e, 0x6d, + 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, 0x31, 0xca, 0x5c, 0xd3, + 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, 0xe4, 0xfb, 0x8f, 0x34, + 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, 0xd5, 0xa0, 0xcc, 0xef, + 0xc0, 0x2f, 0x41, 0x45, 0x45, 0x9c, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, 0x23, 0x24, 0x61, 0x94, + 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xb9, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, 0x55, 0xf0, 0x50, 0x7d, + 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0xfe, 0xf9, 0x1d, 0x9f, 0x80, + 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, 0x46, 0x5d, 0x29, 0x9b, + 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xd6, 0xe1, 0x9c, 0x21, + 0x03, 0xce, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x33, 0xba, 0x3c, 0xcc, 0x82, + 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6, + 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, 0x3b, 0x32, 0x36, 0x13, + 0xc9, 0x67, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xb3, 0xb2, 0xfc, 0xba, + 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91, + 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x05, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, 0x04, 0xac, 0xcc, 0x6e, + 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, 0xee, 0xed, 0x1a, 0xfc, + 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0xb9, 0x8c, 0x72, 0xfd, 0x19, 0x7f, 0x33, 0xb8, + 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0xa1, 0x8f, 0xea, 0x29, + 0x99, 0xfd, 0xf1, 0x23, 0x03, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, 0x8f, 0x47, 0x72, 0x31, + 0x14, 0xb1, 0xa3, 0x84, 0xd9, 0x7f, 0x37, 0x69, 0xf6, 0x5f, 0x9f, 0x64, 0xfa, 0xa7, 0x68, 0x38, + 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x91, 0x2e, 0xb9, 0xe3, 0x88, 0x58, 0xfe, 0x20, 0xc7, 0x86, + 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, 0x6a, 0xc5, 0xe1, 0xe4, + 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, 0x1a, 0xff, 0x5f, 0xca, + 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xbd, 0xa4, 0xd9, 0x7e, 0x73, 0xf2, 0x7e, 0x1b, + 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61, 0x40, 0xc1, 0x08, 0x17, + 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22, 0xc6, 0x79, 0x47, 0x9a, + 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x7e, 0x57, 0xe2, 0x15, 0xe3, 0x29, 0xde, 0x9b, + 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e, 0x8d, 0x3f, 0x94, 0xc9, + 0x9b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3, 0x0a, 0xf8, 0x22, 0x8e, + 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd, 0x1a, 0xbd, 0x30, 0x2c, + 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb, 0xa2, 0x4d, 0x95, 0xe2, + 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab, 0xa7, 0x8f, 0x68, 0xab, + 0x6f, 0x88, 0xe0, 0x50, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x1c, 0x5a, 0x58, 0x4e, 0x32, 0xe0, + 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a, 0xb1, 0x54, 0xa6, 0xf0, + 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0, 0xe9, 0xb8, 0x93, 0xf2, + 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x9d, 0x85, 0x73, 0x37, 0xa8, 0x4a, 0xa2, + 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x9b, 0x85, 0xa9, 0x1b, 0xae, 0xd3, + 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41, 0xc6, 0x3f, 0x2f, 0x20, + 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8, 0x1e, 0x95, 0xd9, 0xb3, + 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x0b, 0xa6, 0x3c, 0xe6, 0xb8, 0xbe, 0x91, + 0x9e, 0x24, 0xf2, 0xb5, 0x51, 0x7f, 0xa5, 0x21, 0xa1, 0xe4, 0x46, 0x5e, 0xbd, 0xa0, 0xaf, 0x40, + 0xfb, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42, 0x5e, 0xef, 0x07, 0xe1, + 0xa0, 0xd5, 0xf1, 0xc3, 0xc3, 0xd1, 0x8c, 0xa6, 0x8a, 0xcf, 0xf4, 0xd9, 0x0e, 0x0a, 0x74, 0xf2, + 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0x81, 0xa3, 0x56, 0x51, 0xf4, 0xe9, 0xda, 0x8f, + 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0x4b, 0xe0, 0x91, 0x5f, 0x19, 0x3a, + 0xdf, 0xf6, 0x33, 0x87, 0x0b, 0x82, 0xc8, 0xe3, 0x51, 0xeb, 0x94, 0xe9, 0xa1, 0x6d, 0x0a, 0xcb, + 0x22, 0x87, 0xda, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6, 0xd8, 0xad, 0x91, 0xfe, + 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x0d, 0x28, 0x7a, 0x4c, 0x67, + 0x7d, 0x3f, 0xe0, 0xba, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5, 0x3b, 0x2a, 0xa5, 0xda, + 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xd2, 0x50, 0xb3, 0x1f, 0x32, 0xf6, + 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0xd9, 0x70, 0xbf, 0x24, 0xd2, 0xe4, 0x0c, 0x0a, 0x26, 0xa3, 0x5d, + 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a, 0x65, 0xda, 0xfb, 0xd9, + 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0x24, 0xf1, 0xed, 0xc9, 0x92, 0xc4, 0xf1, 0x0a, 0x0d, + 0xe7, 0x8a, 0x7f, 0x6d, 0x38, 0x57, 0x7c, 0x77, 0xf2, 0x5c, 0x71, 0xa2, 0x19, 0x46, 0xa6, 0x8c, + 0xbf, 0x9d, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c, 0xd4, 0x56, 0x1e, 0x3c, + 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2, 0x5b, 0xd8, 0xe0, 0x85, + 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59, 0xba, 0xd4, 0xf3, 0x42, + 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94, 0x7b, 0x46, 0x95, 0x5e, + 0x18, 0x3f, 0x17, 0x96, 0x72, 0xae, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50, 0xba, 0x82, 0x73, 0x0b, + 0x85, 0xf4, 0x73, 0x0b, 0x91, 0x05, 0x56, 0x9e, 0x5b, 0xf8, 0xfb, 0x12, 0x5c, 0x48, 0xef, 0x43, + 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xbe, 0x47, 0x16, 0xa3, 0x4f, + 0xff, 0x54, 0xe7, 0xd9, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9, 0x24, 0x72, 0x6d, 0xcf, + 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8, 0x76, 0x13, 0x7e, 0xf6, + 0x09, 0x9e, 0xb0, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3, 0x91, 0x35, 0x21, 0xbf, + 0x0e, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x1f, 0xb2, 0x1b, 0x7f, 0xf4, 0x6f, 0x84, + 0x58, 0x0d, 0xe6, 0xea, 0x8c, 0xb6, 0xf7, 0x54, 0xf2, 0x2c, 0x24, 0x60, 0x54, 0xe3, 0x13, 0x7e, + 0xa4, 0xee, 0x0a, 0x94, 0x3c, 0xca, 0x98, 0x69, 0xb7, 0x3d, 0xb1, 0x7b, 0x2b, 0xcb, 0xb9, 0xd2, + 0x50, 0x65, 0x18, 0x50, 0xc9, 0xff, 0x87, 0xb2, 0x88, 0xfb, 0x2c, 0xb9, 0x6d, 0xaf, 0x5a, 0x16, + 0x99, 0x28, 0x61, 0x57, 0x1b, 0x7e, 0x21, 0x86, 0x74, 0xf2, 0x02, 0x4c, 0xcb, 0x6c, 0x9c, 0x3a, + 0x5a, 0x2b, 0xf7, 0x58, 0x67, 0xf6, 0x07, 0xb5, 0xe9, 0x7a, 0xa4, 0x1c, 0x63, 0x5c, 0x7c, 0x3f, + 0x45, 0x83, 0xe0, 0x58, 0x72, 0x3f, 0x15, 0x86, 0xcd, 0x30, 0xc2, 0x45, 0x9e, 0x85, 0x1c, 0xb3, + 0x3c, 0xb1, 0x87, 0x2a, 0x85, 0x7e, 0xef, 0xe6, 0x5a, 0x03, 0x79, 0xb9, 0xf6, 0x3f, 0x19, 0x38, + 0x9d, 0x38, 0x41, 0xc4, 0x45, 0xfa, 0xae, 0xa5, 0xcc, 0x48, 0x20, 0xb2, 0x85, 0x6b, 0xc8, 0xcb, + 0xc9, 0x9b, 0xca, 0x2b, 0xcc, 0x4e, 0x78, 0x8b, 0xe0, 0x8e, 0xce, 0x3c, 0xee, 0x06, 0x0e, 0x39, + 0x84, 0xd7, 0x12, 0x8d, 0x93, 0x8b, 0xc7, 0xda, 0x0e, 0x6e, 0xa0, 0xc8, 0x86, 0x33, 0x7f, 0x98, + 0x0d, 0xa7, 0xf6, 0xb7, 0x39, 0xa8, 0xdc, 0x72, 0xb6, 0x3f, 0x25, 0x67, 0x24, 0xd2, 0x2d, 0x72, + 0xf6, 0xa7, 0x68, 0x91, 0xb7, 0xe0, 0x19, 0xc6, 0xf8, 0xae, 0xdf, 0xb1, 0x9b, 0xde, 0x52, 0x8b, + 0x51, 0x77, 0xd5, 0xb4, 0x4d, 0x6f, 0x87, 0x36, 0x55, 0xe4, 0xee, 0x33, 0xfb, 0x83, 0xda, 0x33, + 0x9b, 0x9b, 0x6b, 0x69, 0x2c, 0x38, 0x4a, 0x56, 0xcc, 0x10, 0xdd, 0xe8, 0x38, 0xad, 0x96, 0xcc, + 0x6c, 0xcb, 0x1c, 0x8f, 0x9c, 0x21, 0x91, 0x72, 0x8c, 0x71, 0x69, 0x1f, 0x65, 0xa0, 0x7c, 0x5b, + 0x6f, 0x75, 0xf4, 0x86, 0x69, 0x77, 0xc8, 0x73, 0x30, 0xb5, 0xed, 0x3a, 0x1d, 0xea, 0x7a, 0x2a, + 0xd3, 0x2c, 0x76, 0x3d, 0x75, 0x59, 0x84, 0x3e, 0x8d, 0x6f, 0xc3, 0x98, 0xd3, 0x33, 0x8d, 0xe4, + 0x86, 0x75, 0x93, 0x17, 0xa2, 0xa4, 0x91, 0xfb, 0x72, 0x1e, 0xe5, 0x26, 0x3c, 0x82, 0xbd, 0xb9, + 0xd6, 0x90, 0xd9, 0x5b, 0x7f, 0x06, 0x92, 0xe7, 0x63, 0x9e, 0x47, 0x79, 0x94, 0xaf, 0xa0, 0x7d, + 0x2f, 0x0b, 0x15, 0xf9, 0x69, 0x72, 0x73, 0x76, 0x9c, 0x1f, 0xf7, 0xa2, 0x88, 0xae, 0x7b, 0xfd, + 0x2e, 0x75, 0xc5, 0x26, 0x58, 0x4d, 0xb9, 0x68, 0xb4, 0x24, 0x24, 0x06, 0x11, 0xf6, 0xb0, 0xc8, + 0x6f, 0x9d, 0xfc, 0x09, 0xb6, 0x4e, 0xe1, 0xc0, 0xd6, 0xf9, 0xb3, 0x0c, 0x94, 0xd7, 0xcc, 0x16, + 0x35, 0xf6, 0x0c, 0x8b, 0x92, 0x57, 0xa1, 0xda, 0xa4, 0x16, 0x65, 0xf4, 0x86, 0xab, 0x1b, 0x74, + 0x83, 0xba, 0xa6, 0xb8, 0x70, 0xc3, 0x47, 0x99, 0x98, 0xc7, 0x05, 0xb9, 0x5c, 0xae, 0x8c, 0xe0, + 0xc1, 0x91, 0xd2, 0xe4, 0x26, 0x4c, 0x37, 0xa9, 0x67, 0xba, 0xb4, 0xb9, 0x11, 0xf1, 0x46, 0x9f, + 0xf3, 0x6d, 0xd3, 0x4a, 0x84, 0xf6, 0x68, 0x50, 0x9b, 0xd9, 0x30, 0x7b, 0xd4, 0x32, 0x6d, 0x2a, + 0xdd, 0xd2, 0x98, 0xa8, 0x56, 0x80, 0xdc, 0x9a, 0xd3, 0xd6, 0xde, 0xcf, 0x41, 0x70, 0x85, 0x8a, + 0xfc, 0x66, 0x06, 0x2a, 0xba, 0x6d, 0x3b, 0x4c, 0x5d, 0x4f, 0x92, 0xb1, 0x7d, 0x9c, 0xf8, 0xa6, + 0xd6, 0xfc, 0x52, 0x08, 0x2a, 0xc3, 0xc2, 0x41, 0xa8, 0x3a, 0x42, 0xc1, 0xa8, 0x6e, 0xd2, 0x4f, + 0x44, 0xaa, 0xd7, 0x27, 0xaf, 0xc5, 0x21, 0xe2, 0xd2, 0xb3, 0x5f, 0x83, 0x33, 0xc9, 0xca, 0x1e, + 0x25, 0xb0, 0x35, 0x49, 0x4c, 0xec, 0xdd, 0x32, 0x54, 0xee, 0xe8, 0xcc, 0xdc, 0xa5, 0x62, 0x0b, + 0x76, 0x32, 0x3e, 0xf5, 0x1f, 0x64, 0xe0, 0x42, 0x3c, 0x66, 0x7c, 0x82, 0x8e, 0xf5, 0xec, 0xfe, + 0xa0, 0x76, 0x01, 0x53, 0xb5, 0xe1, 0x88, 0x5a, 0x08, 0x17, 0x7b, 0x28, 0x04, 0x7d, 0xd2, 0x2e, + 0x76, 0x63, 0x94, 0x42, 0x1c, 0x5d, 0x97, 0x4f, 0x8b, 0x8b, 0xfd, 0x64, 0x5f, 0x69, 0x49, 0x6c, + 0x00, 0xa6, 0x9e, 0x98, 0x0d, 0x40, 0xe9, 0x89, 0x70, 0xb8, 0x7a, 0x91, 0x0d, 0x40, 0x79, 0xc2, + 0x38, 0xa8, 0x4a, 0xb3, 0x4a, 0xb4, 0x51, 0x1b, 0x09, 0x71, 0xf8, 0xcd, 0xf7, 0x8d, 0x89, 0x01, + 0x85, 0x6d, 0xdd, 0x33, 0x0d, 0xe5, 0x7e, 0xd6, 0xc7, 0x0f, 0x4b, 0xf8, 0x77, 0x3f, 0x64, 0x8c, + 0x49, 0xbc, 0xa2, 0xc4, 0x0e, 0xef, 0x98, 0x64, 0x27, 0xba, 0x63, 0x42, 0x96, 0x21, 0x6f, 0x73, + 0x63, 0x9b, 0x3b, 0xf2, 0xad, 0x92, 0x3b, 0xb7, 0xe9, 0x1e, 0x0a, 0x61, 0xed, 0x87, 0x59, 0x00, + 0xfe, 0xf9, 0xca, 0xcd, 0x79, 0xcc, 0x66, 0xe4, 0xf3, 0x30, 0xe5, 0xf5, 0x45, 0xb4, 0x56, 0x2d, + 0xc5, 0x61, 0xf0, 0x58, 0x16, 0xa3, 0x4f, 0xe7, 0x9e, 0xd0, 0xdb, 0x7d, 0xda, 0xf7, 0x63, 0x41, + 0x81, 0x27, 0xf4, 0x0a, 0x2f, 0x44, 0x49, 0x3b, 0x39, 0x47, 0xc6, 0xdf, 0x35, 0x15, 0x4e, 0x68, + 0xd7, 0xa4, 0x7d, 0x33, 0x0b, 0x10, 0x06, 0xf8, 0xc9, 0xf7, 0x33, 0x70, 0x3e, 0x98, 0x65, 0x4c, + 0xde, 0x5c, 0x58, 0xb6, 0x74, 0xb3, 0x3b, 0xf1, 0x46, 0x26, 0x6d, 0x86, 0x0b, 0xb3, 0xb3, 0x91, + 0xa6, 0x0e, 0xd3, 0x6b, 0x41, 0x10, 0x4a, 0xb4, 0xdb, 0x63, 0x7b, 0x2b, 0xa6, 0xab, 0x86, 0x5d, + 0xea, 0xd1, 0xff, 0xeb, 0x8a, 0x47, 0x8a, 0xaa, 0x1b, 0x1e, 0x62, 0xe6, 0xf8, 0x14, 0x0c, 0x70, + 0xb4, 0xef, 0x66, 0xe1, 0x5c, 0x4a, 0xed, 0xc8, 0x4b, 0x70, 0x46, 0x65, 0x38, 0xc2, 0xeb, 0xbb, + 0x99, 0xf0, 0xfa, 0x6e, 0x23, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x26, 0x80, 0x6e, 0x18, 0xd4, 0xf3, + 0xd6, 0x9d, 0xa6, 0xef, 0xf4, 0xbd, 0xc8, 0x37, 0x95, 0x4b, 0x41, 0xe9, 0xa3, 0x41, 0xed, 0x8b, + 0x69, 0xa9, 0xaa, 0xc4, 0xd7, 0x87, 0x02, 0x18, 0x81, 0x24, 0x6f, 0x00, 0xc8, 0xfb, 0x24, 0xc1, + 0x61, 0xcb, 0xc7, 0x44, 0xd2, 0xe7, 0xfd, 0xbb, 0x0e, 0xf3, 0xaf, 0xf4, 0x75, 0x9b, 0x99, 0x6c, + 0x4f, 0x1e, 0x9f, 0xbe, 0x17, 0xa0, 0x60, 0x04, 0x51, 0xfb, 0xeb, 0x2c, 0x94, 0x7c, 0x67, 0xf4, + 0x13, 0xc8, 0x95, 0xb4, 0x63, 0xb9, 0x92, 0xf1, 0x2f, 0x10, 0xfa, 0x55, 0x1e, 0x99, 0x1d, 0x71, + 0x12, 0xd9, 0x91, 0x1b, 0x93, 0xab, 0x3a, 0x38, 0x1f, 0xf2, 0x83, 0x2c, 0x9c, 0xf2, 0x59, 0xd5, + 0x39, 0xee, 0x2f, 0xc3, 0x8c, 0x4b, 0xf5, 0x66, 0x5d, 0x67, 0xc6, 0x8e, 0xe8, 0x3e, 0x79, 0x8a, + 0xfb, 0xec, 0xfe, 0xa0, 0x36, 0x83, 0x51, 0x02, 0xc6, 0xf9, 0xd2, 0x0e, 0x80, 0x67, 0x27, 0x3c, + 0x00, 0x9e, 0x3b, 0xca, 0x01, 0x70, 0xa2, 0x43, 0x85, 0xd7, 0x68, 0xd3, 0xec, 0x52, 0xa7, 0xef, + 0xff, 0xb1, 0xe0, 0xa8, 0x87, 0x87, 0xc5, 0xea, 0x8e, 0x21, 0x0c, 0x46, 0x31, 0xb5, 0x7f, 0xc8, + 0xc0, 0x74, 0xd8, 0x5e, 0x27, 0x9e, 0x31, 0x6a, 0xc5, 0x33, 0x46, 0x4b, 0x13, 0x0f, 0x87, 0x11, + 0x39, 0xa2, 0xdf, 0x2b, 0x86, 0x9f, 0x25, 0xb2, 0x42, 0xdb, 0x30, 0x6b, 0xa6, 0x26, 0x4a, 0x22, + 0xd6, 0x26, 0x38, 0x04, 0x77, 0x73, 0x24, 0x27, 0x1e, 0x80, 0x42, 0xfa, 0x50, 0xda, 0xa5, 0x2e, + 0x33, 0x0d, 0xea, 0x7f, 0xdf, 0x8d, 0x89, 0xbd, 0x23, 0x79, 0x00, 0x20, 0x6c, 0xd3, 0x7b, 0x4a, + 0x01, 0x06, 0xaa, 0xc8, 0x36, 0x14, 0x68, 0xb3, 0x4d, 0xfd, 0xf3, 0xf3, 0x5f, 0x9d, 0xe8, 0xe6, + 0x45, 0xd8, 0x9e, 0xfc, 0xcd, 0x43, 0x09, 0x4d, 0x3c, 0x28, 0x5b, 0xfe, 0xf6, 0x5d, 0x8d, 0xc3, + 0xf1, 0x7d, 0x9d, 0x20, 0x10, 0x10, 0x1e, 0x42, 0x0d, 0x8a, 0x30, 0xd4, 0x43, 0x3a, 0xc1, 0x9d, + 0x92, 0xc2, 0x31, 0x19, 0x8f, 0x03, 0xee, 0x95, 0x78, 0x50, 0x7e, 0xa0, 0x33, 0xea, 0x76, 0x75, + 0xb7, 0xa3, 0x1c, 0xff, 0xf1, 0xbf, 0xf0, 0xbe, 0x8f, 0x14, 0x7e, 0x61, 0x50, 0x84, 0xa1, 0x1e, + 0xe2, 0x40, 0x99, 0x29, 0x4f, 0xd6, 0xbf, 0x96, 0x38, 0xbe, 0x52, 0xdf, 0x27, 0xf6, 0x64, 0x60, + 0x3b, 0x78, 0xc5, 0x50, 0x87, 0xf6, 0x28, 0x17, 0x9a, 0xc7, 0x4f, 0x3a, 0x45, 0xf8, 0x42, 0x3c, + 0x45, 0x38, 0x97, 0x4c, 0x11, 0x26, 0xa2, 0x31, 0x47, 0x4f, 0x12, 0xea, 0x50, 0xb1, 0x74, 0x8f, + 0x6d, 0xf5, 0x9a, 0x3a, 0x53, 0xf1, 0xe5, 0xca, 0xe2, 0xff, 0x3b, 0x9c, 0xf5, 0xe2, 0xf6, 0x30, + 0x0c, 0xba, 0xac, 0x85, 0x30, 0x18, 0xc5, 0x24, 0x57, 0xa1, 0xb2, 0x2b, 0x66, 0xa4, 0xbc, 0x4d, + 0x51, 0x10, 0xe6, 0x5c, 0x58, 0xd8, 0x7b, 0x61, 0x31, 0x46, 0x79, 0xb8, 0x88, 0xf4, 0x04, 0xa4, + 0x48, 0x31, 0x14, 0x69, 0x84, 0xc5, 0x18, 0xe5, 0x11, 0xb9, 0x0a, 0xd3, 0xee, 0x48, 0x81, 0x29, + 0x21, 0x20, 0x73, 0x15, 0x7e, 0x21, 0x86, 0x74, 0x72, 0x05, 0x4a, 0xfd, 0x66, 0x4b, 0xf2, 0x96, + 0x04, 0xaf, 0xf0, 0xbf, 0xb6, 0x56, 0x56, 0xd5, 0xed, 0x0e, 0x9f, 0xaa, 0xfd, 0x67, 0x06, 0xc8, + 0x70, 0x52, 0x9b, 0xec, 0x40, 0xd1, 0x16, 0x51, 0x95, 0x89, 0xaf, 0x55, 0x47, 0x82, 0x33, 0x72, + 0x8e, 0xa9, 0x02, 0x85, 0x4f, 0x6c, 0x28, 0xd1, 0x87, 0x8c, 0xba, 0xb6, 0x6e, 0x29, 0xd7, 0xe3, + 0x78, 0xae, 0x70, 0x4b, 0x87, 0x53, 0x21, 0x63, 0xa0, 0x43, 0xfb, 0x71, 0x16, 0x2a, 0x11, 0xbe, + 0xc7, 0x6d, 0x56, 0xc4, 0x99, 0x51, 0x19, 0xcc, 0xd8, 0x72, 0x2d, 0x35, 0x4c, 0x23, 0x67, 0x46, + 0x15, 0x09, 0xd7, 0x30, 0xca, 0x47, 0x16, 0x01, 0xba, 0xba, 0xc7, 0xa8, 0x2b, 0x96, 0x92, 0xc4, + 0x49, 0xcd, 0xf5, 0x80, 0x82, 0x11, 0x2e, 0x72, 0x59, 0x5d, 0xf0, 0xcf, 0xc7, 0x2f, 0x4d, 0x8d, + 0xb8, 0xbd, 0x5f, 0x38, 0x86, 0xdb, 0xfb, 0xa4, 0x0d, 0x67, 0xfc, 0x5a, 0xfb, 0x54, 0x65, 0xe7, + 0x0e, 0x09, 0x2c, 0x9d, 0xf1, 0x04, 0x04, 0x0e, 0x81, 0x6a, 0x3f, 0xcc, 0xc0, 0x4c, 0x6c, 0x2b, + 0xcd, 0xb7, 0x76, 0xe1, 0x91, 0x8c, 0xc8, 0xd6, 0x2e, 0x76, 0x92, 0xe2, 0x79, 0x28, 0xca, 0x06, + 0x52, 0x0d, 0x1f, 0x98, 0x11, 0xd9, 0x84, 0xa8, 0xa8, 0xdc, 0x20, 0xa8, 0x60, 0x5d, 0xd2, 0x20, + 0xa8, 0x68, 0x1e, 0xfa, 0x74, 0xf2, 0x05, 0x28, 0xf9, 0xb5, 0x53, 0x2d, 0x1d, 0xfe, 0xdb, 0x41, + 0x95, 0x63, 0xc0, 0xa1, 0x7d, 0xab, 0x00, 0xf2, 0xc7, 0x14, 0x5c, 0xae, 0x69, 0x7a, 0x32, 0x4b, + 0x95, 0x11, 0x59, 0xaa, 0x40, 0x6e, 0x45, 0x95, 0x63, 0xc0, 0x41, 0x2e, 0x42, 0xae, 0x6b, 0xda, + 0x2a, 0xac, 0x28, 0x76, 0x95, 0xeb, 0xa6, 0x8d, 0xbc, 0x4c, 0x90, 0xf4, 0x87, 0x2a, 0xd1, 0x22, + 0x49, 0xfa, 0x43, 0xe4, 0x65, 0xdc, 0xb9, 0xb4, 0x1c, 0xa7, 0xb3, 0xad, 0x1b, 0x1d, 0x3f, 0xf4, + 0x9d, 0x17, 0xb3, 0x57, 0x38, 0x97, 0x6b, 0x71, 0x12, 0x26, 0x79, 0xb9, 0xb8, 0xe1, 0x38, 0x56, + 0xd3, 0x79, 0x60, 0xfb, 0xe2, 0x85, 0x50, 0x7c, 0x39, 0x4e, 0xc2, 0x24, 0x2f, 0xd9, 0x82, 0x67, + 0xde, 0xa1, 0xae, 0xa3, 0x5a, 0xac, 0x61, 0x51, 0xda, 0xf3, 0x61, 0xa4, 0x81, 0x12, 0x59, 0xa1, + 0xd7, 0xd2, 0x59, 0x70, 0x94, 0xac, 0x48, 0x36, 0xe9, 0x6e, 0x9b, 0xb2, 0x0d, 0xd7, 0xe1, 0x7b, + 0x27, 0xd3, 0x6e, 0xfb, 0xb0, 0x53, 0x21, 0xec, 0x66, 0x3a, 0x0b, 0x8e, 0x92, 0x25, 0xeb, 0x70, + 0x56, 0x92, 0x22, 0x3e, 0xb3, 0xb2, 0x75, 0xb5, 0xfd, 0x41, 0xed, 0x33, 0x2b, 0xb4, 0xe7, 0x52, + 0x83, 0x1b, 0xe8, 0xcd, 0x24, 0x1b, 0x0e, 0x4b, 0x8a, 0xdf, 0x45, 0xa9, 0x70, 0xef, 0x06, 0x75, + 0x45, 0x97, 0x8b, 0xd8, 0x91, 0x72, 0xcc, 0x31, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x2a, 0x54, 0xa3, + 0xb0, 0x4b, 0xbb, 0xba, 0x69, 0xe9, 0xdb, 0xa6, 0x65, 0xb2, 0x3d, 0x91, 0x2b, 0x9e, 0x91, 0xc1, + 0xc8, 0xcd, 0x11, 0x3c, 0x38, 0x52, 0x5a, 0xfb, 0xfd, 0x1c, 0x88, 0x3f, 0x0b, 0x91, 0xfb, 0x90, + 0xb3, 0x9c, 0xb6, 0x32, 0xc9, 0xe3, 0x47, 0x3a, 0xd6, 0x9c, 0xb6, 0x1c, 0x78, 0x6b, 0x4e, 0x1b, + 0x39, 0x22, 0x31, 0xa0, 0xd0, 0xd1, 0x5b, 0x1d, 0x5d, 0x59, 0xe0, 0xf1, 0xfd, 0x8d, 0x20, 0x91, + 0xa7, 0x6e, 0x88, 0xf2, 0x57, 0x94, 0xd8, 0xdc, 0xb1, 0xd9, 0xf6, 0x7f, 0x15, 0xa2, 0xb6, 0x7e, + 0x13, 0xc4, 0xc6, 0x7c, 0x24, 0xb9, 0x0a, 0x06, 0xaf, 0x18, 0xea, 0x20, 0x06, 0x14, 0xfb, 0x4d, + 0xf1, 0x87, 0xa7, 0xfc, 0x84, 0x5e, 0xcc, 0xd6, 0x8a, 0xf8, 0x26, 0xb1, 0x7e, 0xc9, 0x67, 0x54, + 0xd0, 0xda, 0x9f, 0x67, 0x60, 0xa6, 0x61, 0x99, 0x4d, 0xd3, 0x6e, 0x9f, 0xdc, 0x9d, 0x5c, 0x72, + 0x17, 0x0a, 0x9e, 0x65, 0x36, 0xe9, 0x98, 0x97, 0x45, 0x45, 0x67, 0xf0, 0x5a, 0x52, 0x94, 0x38, + 0xda, 0x9f, 0xe4, 0x41, 0xfd, 0x0e, 0x8b, 0xf4, 0xa1, 0xdc, 0xf6, 0x6f, 0xae, 0xaa, 0x2a, 0xbf, + 0x3c, 0xc1, 0x0d, 0x87, 0xd8, 0x1d, 0x58, 0xd9, 0x3b, 0x41, 0x21, 0x86, 0x9a, 0x08, 0x8d, 0x8f, + 0xb9, 0x95, 0x09, 0xc7, 0x9c, 0x54, 0x37, 0x3c, 0xea, 0x74, 0xc8, 0xef, 0x30, 0xd6, 0x9b, 0xf8, + 0x20, 0x6e, 0x78, 0xc6, 0x56, 0x86, 0xf1, 0xf8, 0x3b, 0x0a, 0x68, 0xae, 0xc2, 0xd6, 0x8f, 0xe1, + 0x96, 0x7b, 0x18, 0x42, 0x55, 0x11, 0x56, 0x9d, 0x79, 0x28, 0xa0, 0xc9, 0xaf, 0x42, 0x85, 0xb9, + 0xba, 0xed, 0xb5, 0x1c, 0xb7, 0x4b, 0x5d, 0xb5, 0xf8, 0xaf, 0x4e, 0x30, 0x9e, 0x37, 0x43, 0x34, + 0x19, 0xf5, 0x88, 0x15, 0x61, 0x54, 0x9b, 0xd6, 0x05, 0xe5, 0xb6, 0x13, 0x23, 0xf6, 0x37, 0x01, + 0x99, 0xe9, 0x5c, 0x38, 0xdc, 0x58, 0x0c, 0xee, 0x92, 0x47, 0xee, 0xd6, 0xa5, 0xfe, 0x36, 0x40, + 0xfb, 0xa7, 0x2c, 0xe4, 0x36, 0xd7, 0x1a, 0xf2, 0xaa, 0x88, 0xf8, 0xb9, 0x06, 0x6d, 0x74, 0xcc, + 0xde, 0x3d, 0xea, 0x9a, 0xad, 0x3d, 0xb5, 0xf6, 0x46, 0xae, 0x8a, 0x24, 0x39, 0x30, 0x45, 0x8a, + 0xbc, 0x0e, 0xd3, 0x86, 0xbe, 0x4c, 0x5d, 0x26, 0x5d, 0x98, 0xa3, 0x45, 0xcd, 0xc5, 0x09, 0x86, + 0xe5, 0xa5, 0x50, 0x1c, 0x63, 0x60, 0x64, 0x0b, 0xc0, 0x08, 0xa1, 0x8f, 0x14, 0x49, 0x97, 0xbf, + 0x4f, 0x08, 0x81, 0x23, 0x40, 0x04, 0xa1, 0xdc, 0xe1, 0xac, 0x02, 0x35, 0x7f, 0x14, 0x54, 0x31, + 0xe9, 0x6e, 0xfb, 0xb2, 0x18, 0xc2, 0x68, 0xff, 0x9e, 0x81, 0x70, 0x13, 0x48, 0x3c, 0x28, 0x36, + 0xc5, 0xad, 0x6d, 0x35, 0xed, 0xc7, 0xdf, 0x4c, 0xc7, 0x7f, 0x5a, 0x52, 0x27, 0xfb, 0x83, 0x5a, + 0xe2, 0x47, 0x26, 0xa8, 0x54, 0x91, 0x36, 0xe4, 0xde, 0x72, 0xb6, 0x27, 0x9e, 0xf5, 0x91, 0xf3, + 0x3f, 0x72, 0xe7, 0x14, 0x29, 0x40, 0xae, 0x41, 0xfb, 0x56, 0x16, 0x2a, 0x91, 0x31, 0x3d, 0xf1, + 0x4f, 0x09, 0x1e, 0x26, 0x7e, 0x4a, 0xb0, 0x31, 0xfe, 0xae, 0x3c, 0xac, 0xd5, 0x49, 0xff, 0x97, + 0xe0, 0x6f, 0xb2, 0x90, 0xdb, 0x5a, 0x59, 0xe5, 0x8b, 0x6f, 0x70, 0x0e, 0x68, 0xe2, 0xc4, 0x54, + 0xf8, 0x5f, 0x34, 0x31, 0xd2, 0x82, 0x57, 0x0c, 0x75, 0x90, 0x1d, 0x98, 0xda, 0xee, 0x9b, 0x16, + 0x33, 0xed, 0x89, 0x4f, 0x9d, 0xf9, 0xff, 0x70, 0x50, 0xc7, 0x65, 0x24, 0x2a, 0xfa, 0xf0, 0xa4, + 0x0d, 0x53, 0x6d, 0x79, 0x0d, 0x44, 0xcd, 0xbd, 0x97, 0xc6, 0x5f, 0xbd, 0x24, 0x8e, 0x54, 0xa4, + 0x5e, 0xd0, 0x47, 0xd7, 0xbe, 0x01, 0x6a, 0xf1, 0x27, 0xde, 0xc9, 0xb4, 0x66, 0x10, 0x18, 0x4a, + 0x6b, 0x51, 0xed, 0x3f, 0x32, 0x10, 0xb7, 0xd2, 0x9f, 0x7c, 0xa7, 0x76, 0x92, 0x9d, 0xba, 0x72, + 0x1c, 0x73, 0x20, 0xbd, 0x5f, 0xb5, 0xbf, 0xca, 0x42, 0x51, 0xfd, 0x30, 0xf4, 0xe4, 0xb3, 0x1f, + 0x34, 0x96, 0xfd, 0x58, 0x9e, 0xf0, 0xf7, 0x89, 0x23, 0x73, 0x1f, 0xdd, 0x44, 0xee, 0x63, 0xd2, + 0xff, 0x34, 0x3e, 0x26, 0xf3, 0xf1, 0x77, 0x19, 0x38, 0x25, 0x19, 0x6f, 0xda, 0x1e, 0xd3, 0x6d, + 0x43, 0x38, 0xc5, 0x32, 0x12, 0x35, 0x71, 0x68, 0x4f, 0x85, 0xa1, 0x85, 0xbb, 0x2a, 0x9f, 0x51, + 0x41, 0xf3, 0xcd, 0xf2, 0x8e, 0xe3, 0x31, 0x61, 0x6e, 0xb3, 0xf1, 0x4d, 0xf6, 0xcb, 0xaa, 0x1c, + 0x03, 0x8e, 0xe4, 0xee, 0xbd, 0x30, 0x7a, 0xf7, 0xae, 0xfd, 0x69, 0x06, 0xa6, 0xa3, 0x7f, 0xa8, + 0x1c, 0x3f, 0x91, 0x93, 0xc8, 0xa3, 0x64, 0x4f, 0x20, 0x8f, 0xf2, 0x61, 0x06, 0xc0, 0xaf, 0xec, + 0x89, 0x67, 0x51, 0x9a, 0xf1, 0x2c, 0xca, 0xc4, 0xdd, 0x9a, 0x9e, 0x43, 0xf9, 0x41, 0xc1, 0xff, + 0x24, 0x91, 0x41, 0x79, 0x2f, 0x03, 0xa7, 0xf4, 0x58, 0x56, 0x62, 0x62, 0x4f, 0x22, 0x91, 0xe4, + 0x08, 0xfe, 0xe8, 0x19, 0x2f, 0xc7, 0x84, 0x5a, 0x72, 0x0d, 0xa6, 0x7b, 0x2a, 0x54, 0x7c, 0x27, + 0x1c, 0x75, 0xc1, 0x01, 0xe4, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x8f, 0xc9, 0x02, 0xe5, 0x8e, 0x25, + 0x0b, 0x14, 0x3d, 0x6a, 0x96, 0x3f, 0xf0, 0xa8, 0x99, 0x0d, 0xe5, 0x96, 0xeb, 0x74, 0x45, 0xa2, + 0x45, 0xfd, 0x3f, 0x71, 0xc2, 0xe4, 0x4d, 0xb0, 0xa8, 0xac, 0xfa, 0xb8, 0x18, 0xaa, 0xe0, 0xcb, + 0x34, 0x73, 0xa4, 0xb6, 0xe2, 0x71, 0x68, 0x0b, 0xa6, 0xee, 0xa6, 0x44, 0x45, 0x1f, 0x3e, 0x9e, + 0x4c, 0x99, 0xfa, 0x64, 0x92, 0x29, 0xda, 0x3f, 0x66, 0x7d, 0x7b, 0xd1, 0x48, 0xdc, 0x49, 0xca, + 0x8c, 0xb8, 0x93, 0xa4, 0x6e, 0xd7, 0x46, 0xd3, 0x0d, 0xcf, 0x43, 0xd1, 0xa5, 0xba, 0xe7, 0xd8, + 0xc9, 0x7f, 0x85, 0xa1, 0x28, 0x45, 0x45, 0x8d, 0xa6, 0x25, 0xb2, 0x8f, 0x49, 0x4b, 0x7c, 0x21, + 0x32, 0x20, 0x64, 0xfe, 0x37, 0x98, 0xdb, 0x29, 0x83, 0x42, 0xc4, 0x2c, 0xd5, 0x6f, 0xf9, 0x0b, + 0xc9, 0x98, 0xa5, 0xfa, 0x65, 0x7e, 0xc0, 0x41, 0x9a, 0x30, 0x6d, 0xe9, 0x1e, 0x13, 0x51, 0xa9, + 0xe6, 0x12, 0x1b, 0x23, 0xe7, 0x11, 0x4c, 0x9b, 0xb5, 0x08, 0x0e, 0xc6, 0x50, 0xb5, 0xdf, 0xcd, + 0x40, 0xd8, 0xe4, 0x47, 0x8c, 0x8e, 0xbe, 0x0a, 0xa5, 0xae, 0xfe, 0x70, 0x85, 0x5a, 0xfa, 0xde, + 0x24, 0x7f, 0xbf, 0x5a, 0x57, 0x18, 0x18, 0xa0, 0x69, 0x83, 0x0c, 0xa8, 0x1b, 0xbb, 0x84, 0x42, + 0xa1, 0x65, 0x3e, 0x54, 0xf5, 0x99, 0xc4, 0x53, 0x89, 0xfc, 0x6f, 0x4d, 0xc6, 0x17, 0x44, 0x01, + 0x4a, 0x74, 0xd2, 0x85, 0x29, 0x4f, 0x86, 0x7f, 0xd4, 0xa7, 0x8c, 0xbf, 0x2b, 0x8f, 0x85, 0x91, + 0xd4, 0x75, 0x5f, 0x59, 0x84, 0xbe, 0x8e, 0xfa, 0xfc, 0x07, 0x1f, 0xcf, 0x3d, 0xf5, 0xe1, 0xc7, + 0x73, 0x4f, 0x7d, 0xf4, 0xf1, 0xdc, 0x53, 0xdf, 0xdc, 0x9f, 0xcb, 0x7c, 0xb0, 0x3f, 0x97, 0xf9, + 0x70, 0x7f, 0x2e, 0xf3, 0xd1, 0xfe, 0x5c, 0xe6, 0x5f, 0xf7, 0xe7, 0x32, 0xbf, 0xf3, 0x6f, 0x73, + 0x4f, 0xbd, 0x56, 0xf2, 0x31, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x46, 0x67, 0x87, 0xd1, 0x06, + 0x64, 0x00, 0x00, } func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) { @@ -3166,6 +3167,11 @@ func (m *Edge) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.OnFull) + copy(dAtA[i:], m.OnFull) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.OnFull))) + i-- + dAtA[i] = 0x32 if m.Parallelism != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.Parallelism)) i-- @@ -6807,6 +6813,8 @@ func (m *Edge) Size() (n int) { if m.Parallelism != nil { n += 1 + sovGenerated(uint64(*m.Parallelism)) } + l = len(m.OnFull) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -8238,6 +8246,7 @@ func (this *Edge) String() string { `Conditions:` + strings.Replace(this.Conditions.String(), "ForwardConditions", "ForwardConditions", 1) + `,`, `Limits:` + strings.Replace(this.Limits.String(), "EdgeLimits", "EdgeLimits", 1) + `,`, `Parallelism:` + valueToStringGenerated(this.Parallelism) + `,`, + `OnFull:` + fmt.Sprintf("%v", this.OnFull) + `,`, `}`, }, "") return s @@ -11536,6 +11545,38 @@ func (m *Edge) Unmarshal(dAtA []byte) error { } } m.Parallelism = &v + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OnFull", 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.OnFull = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto index 9ac2592fbc..e6abdd67d3 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.proto +++ b/pkg/apis/numaflow/v1alpha1/generated.proto @@ -271,10 +271,16 @@ message Edge { optional EdgeLimits limits = 4; // Parallelism is only effective when the "to" vertex is a reduce vertex, - // if it's provided, the default value is set to "1". + // if it's not provided, the default value is set to "1". // Parallelism is ignored when the "to" vertex is not a reduce vertex. // +optional optional int32 parallelism = 5; + + // OnFull specifies the behaviour for the write actions when the inter step buffer is full. + // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess". + // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest + // +optional + optional string onFull = 6; } message EdgeLimits { diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go index d1044d4670..1fc84b3f42 100644 --- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go @@ -898,11 +898,19 @@ func schema_pkg_apis_numaflow_v1alpha1_Edge(ref common.ReferenceCallback) common }, "parallelism": { SchemaProps: spec.SchemaProps{ - Description: "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.", + Description: "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's not provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.", Type: []string{"integer"}, Format: "int32", }, }, + "onFull": { + SchemaProps: spec.SchemaProps{ + Description: "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"from", "to"}, }, diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go index cad0614b4b..3ee53256be 100644 --- a/pkg/forward/forward.go +++ b/pkg/forward/forward.go @@ -23,6 +23,7 @@ import ( "context" "fmt" "math" + "strings" "sync" "time" @@ -46,9 +47,11 @@ type InterStepDataForward struct { ctx context.Context // cancelFn cancels our new context, our cancellation is little more complex and needs to be well orchestrated, hence // we need something more than a cancel(). - cancelFn context.CancelFunc - fromBuffer isb.BufferReader - toBuffers map[string]isb.BufferWriter + cancelFn context.CancelFunc + fromBuffer isb.BufferReader + toBuffers map[string]isb.BufferWriter + // key is the toBuffer name, value is the corresponding onFull action. + onFullActions map[string]string FSD ToWhichStepDecider UDF applier.MapApplier fetchWatermark fetch.Fetcher @@ -68,17 +71,13 @@ func NewInterStepDataForward(vertex *dfv1.Vertex, fromStep isb.BufferReader, toSteps map[string]isb.BufferWriter, fsd ToWhichStepDecider, + onFullActions map[string]string, applyUDF applier.MapApplier, fetchWatermark fetch.Fetcher, publishWatermark map[string]publish.Publisher, opts ...Option) (*InterStepDataForward, error) { - options := &options{ - retryInterval: time.Millisecond, - readBatchSize: dfv1.DefaultReadBatchSize, - udfConcurrency: dfv1.DefaultReadBatchSize, - logger: logging.NewLogger(), - } + options := DefaultOptions() for _, o := range opts { if err := o(options); err != nil { return nil, err @@ -92,6 +91,7 @@ func NewInterStepDataForward(vertex *dfv1.Vertex, cancelFn: cancel, fromBuffer: fromStep, toBuffers: toSteps, + onFullActions: onFullActions, FSD: fsd, UDF: applyUDF, fetchWatermark: fetchWatermark, @@ -478,53 +478,73 @@ func (isdf *InterStepDataForward) writeToBuffers(ctx context.Context, messageToS // writeToBuffer forwards an array of messages to a single buffer and is a blocking call or until shutdown has been initiated. func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer isb.BufferWriter, messages []isb.Message) (writeOffsets []isb.Offset, err error) { - var totalBytes float64 - for _, m := range messages { - totalBytes += float64(len(m.Payload)) - } - writeOffsets = make([]isb.Offset, 0, len(messages)) -retry: - needRetry := false + var ( + totalCount int + writeCount int + writeBytes float64 + dropBytes float64 + ) + totalCount = len(messages) + writeOffsets = make([]isb.Offset, 0, totalCount) + for { _writeOffsets, errs := toBuffer.Write(ctx, messages) // Note: this is an unwanted memory allocation during a happy path. We want only minimal allocation since using failedMessages is an unlikely path. - var failedMessages []isb.Message - for idx := range messages { - // use the messages index to index error, there is a 1:1 mapping - err := errs[idx] - // ATM there are no user defined errors during write, all are InternalErrors, and they require retry. - if err != nil { - needRetry = true - // we retry only failed messages - failedMessages = append(failedMessages, messages[idx]) - writeMessagesError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Inc() - // a shutdown can break the blocking loop caused due to InternalErr - if ok, _ := isdf.IsShuttingDown(); ok { - err := fmt.Errorf("writeToBuffer failed, Stop called while stuck on an internal error with failed messages:%d, %v", len(failedMessages), errs) - platformError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName}).Inc() - return writeOffsets, err + failedMessages := make([]isb.Message, 0, len(messages)) + needRetry := false + + for idx, msg := range messages { + if err := errs[idx]; err != nil { + // ATM there are no user defined errors during write, all are InternalErrors. + + // using `strings.Contains` to check BufferFull error type is not a good practice for two reasons: + // 1. it's an O(n) operation which, if being called frequently, can introduce performance issue. + // 2. it assumes that all the buffer implementations implement err.Error() to use "Buffer full" as error message content. + // TODO - a better way could be to declare a BufferFullError type and use type check instead of checking error message. + needRetry = !(isdf.onFullActions[toBuffer.GetName()] == dfv1.DropAndAckLatest && strings.Contains(err.Error(), "Buffer full")) + if needRetry { + // we retry only failed messages + failedMessages = append(failedMessages, msg) + writeMessagesError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Inc() + // a shutdown can break the blocking loop caused due to InternalErr + if ok, _ := isdf.IsShuttingDown(); ok { + platformError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName}).Inc() + return writeOffsets, fmt.Errorf("writeToBuffer failed, Stop called while stuck on an internal error with failed messages:%d, %v", len(failedMessages), errs) + } + } else { + // drop the message + dropBytes += float64(len(msg.Payload)) } } else { + writeCount++ + writeBytes += float64(len(msg.Payload)) // we support write offsets only for jetstream if _writeOffsets != nil { writeOffsets = append(writeOffsets, _writeOffsets[idx]) } } } - // set messages to failed for the retry + if needRetry { - isdf.opts.logger.Errorw("Retrying failed msgs", zap.Any("errors", errorArrayToMap(errs))) + isdf.opts.logger.Errorw("Retrying failed messages", + zap.Any("errors", errorArrayToMap(errs)), + zap.String("pipeline", isdf.pipelineName), + zap.String("vertex", isdf.vertexName), + zap.String("buffer", toBuffer.GetName()), + ) + // set messages to failed for the retry messages = failedMessages // TODO: implement retry with backoff etc. time.Sleep(isdf.opts.retryInterval) - goto retry } else { break } } - writeMessagesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(float64(len(messages))) - writeBytesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(totalBytes) + dropMessagesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(float64(totalCount - writeCount)) + dropBytesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(dropBytes) + writeMessagesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(float64(writeCount)) + writeBytesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(writeBytes) return writeOffsets, nil } diff --git a/pkg/forward/forward_test.go b/pkg/forward/forward_test.go index bad829c86f..cb5bfb5632 100644 --- a/pkg/forward/forward_test.go +++ b/pkg/forward/forward_test.go @@ -96,6 +96,9 @@ func TestNewInterStepDataForward(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", @@ -110,7 +113,7 @@ func TestNewInterStepDataForward(t *testing.T) { writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -226,6 +229,9 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -241,7 +247,7 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) { fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -391,6 +397,9 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -405,7 +414,7 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) { fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -572,6 +581,9 @@ func TestSourceInterStepDataForward(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", AbstractVertex: dfv1.AbstractVertex{ @@ -586,13 +598,13 @@ func TestSourceInterStepDataForward(t *testing.T) { _, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) // verify if source watermark publisher is not set, NewInterStepDataForward throws. - failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource)) + failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource)) assert.True(t, failedForwarder == nil) assert.Error(t, err) assert.Equal(t, fmt.Errorf("failed to assign a non-nil source watermark publisher for source vertex data forwarder"), err) // create a valid source forwarder - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{})) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{})) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -622,13 +634,17 @@ func TestSourceInterStepDataForward(t *testing.T) { <-stopped } -// TestWriteToBufferError explicitly tests the case of retrying failed messages -func TestWriteToBufferError(t *testing.T) { +// TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess explicitly tests the case of retrying failed messages +func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) { fromStep := simplebuffer.NewInMemoryBuffer("from", 25) to1 := simplebuffer.NewInMemoryBuffer("to1", 10) toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -641,7 +657,7 @@ func TestWriteToBufferError(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -671,7 +687,46 @@ func TestWriteToBufferError(t *testing.T) { assert.True(t, strings.Contains(err.Error(), "with failed messages:1")) <-stopped +} + +// TestWriteToBufferError_ActionOnFullIsDropAndAckLatest explicitly tests the case of dropping messages when buffer is full +func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) { + fromStep := simplebuffer.NewInMemoryBuffer("from", 25) + to1 := simplebuffer.NewInMemoryBuffer("to1", 10) + toSteps := map[string]isb.BufferWriter{ + "to1": to1, + } + actionsOnFull := map[string]string{ + "to1": dfv1.DropAndAckLatest, + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ + PipelineName: "testPipeline", + AbstractVertex: dfv1.AbstractVertex{ + Name: "testVertex", + }, + }} + fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) + assert.NoError(t, err) + assert.False(t, to1.IsFull()) + assert.True(t, to1.IsEmpty()) + + stopped := f.Start() + writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime) + var messageToStep = make(map[string][]isb.Message) + messageToStep["to1"] = make([]isb.Message, 0) + messageToStep["to1"] = append(messageToStep["to1"], writeMessages[0:11]...) + _, err = f.writeToBuffers(ctx, messageToStep) + // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DropAndAckLatest, + // the writeToBuffers() call should return no error. + assert.Nil(t, err) + // stop will cancel the contexts and therefore the forwarder stops without waiting + f.Stop() + <-stopped } // TestNewInterStepDataForwardToOneStep explicitly tests the case where we forward to only one buffer @@ -683,6 +738,11 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) { "to1": to1, "to2": to2, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + "to2": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -697,7 +757,7 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) { fetchWatermark := &testForwardFetcher{} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -779,6 +839,11 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) { "to1": to1, "to2": to2, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + "to2": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -793,7 +858,7 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) { fetchWatermark := &testForwardFetcher{} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, actionsOnFull, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -872,6 +937,10 @@ func TestNewInterStepData_forwardToAll(t *testing.T) { "to1": to1, "to2": to2, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + "to2": dfv1.RetryUntilSuccess, + } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -885,7 +954,7 @@ func TestNewInterStepData_forwardToAll(t *testing.T) { }} fetchWatermark := &testForwardFetcher{} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, actionsOnFull, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -970,6 +1039,10 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -983,7 +1056,7 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, actionsOnFull, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -1016,6 +1089,9 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -1029,7 +1105,7 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, actionsOnFull, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) assert.True(t, to1.IsEmpty()) @@ -1063,6 +1139,10 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -1076,7 +1156,7 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, actionsOnFull, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) assert.True(t, to1.IsEmpty()) diff --git a/pkg/forward/metrics.go b/pkg/forward/metrics.go index 47cc6259a2..cc61a4b417 100644 --- a/pkg/forward/metrics.go +++ b/pkg/forward/metrics.go @@ -65,6 +65,20 @@ var writeMessagesError = promauto.NewCounterVec(prometheus.CounterOpts{ Help: "Total number of Write Errors", }, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"}) +// dropMessagesCount is used to indicate the number of messages dropped +var dropMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Subsystem: "forwarder", + Name: "drop_total", + Help: "Total number of Messages Dropped", +}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"}) + +// dropBytesCount is to indicate the number of bytes dropped +var dropBytesCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Subsystem: "forwarder", + Name: "drop_bytes_total", + Help: "Total number of Bytes Dropped", +}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"}) + // ackMessagesCount is used to indicate the number of messages acknowledged var ackMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{ Subsystem: "forwarder", @@ -121,12 +135,12 @@ var concurrentUDFProcessingTime = promauto.NewHistogramVec(prometheus.HistogramO var udfReadMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{ Subsystem: "forwarder", Name: "udf_read_total", - Help: "Total number of Messages Read at UDF", + Help: "Total number of Messages Read by UDF", }, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"}) -// udfWriteMessagesCount is used to indicate the number of messages read by UDF +// udfWriteMessagesCount is used to indicate the number of messages written by UDF var udfWriteMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{ Subsystem: "forwarder", Name: "udf_write_total", - Help: "Total number of Messages Written at UDF", + Help: "Total number of Messages Written by UDF", }, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"}) diff --git a/pkg/forward/options.go b/pkg/forward/options.go index 001b3c91c3..d3aa448d19 100644 --- a/pkg/forward/options.go +++ b/pkg/forward/options.go @@ -23,6 +23,7 @@ import ( dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" "github.com/numaproj/numaflow/pkg/isb" + "github.com/numaproj/numaflow/pkg/shared/logging" ) // options for forwarding the message @@ -43,6 +44,15 @@ type options struct { type Option func(*options) error +func DefaultOptions() *options { + return &options{ + readBatchSize: dfv1.DefaultReadBatchSize, + udfConcurrency: dfv1.DefaultReadBatchSize, + retryInterval: time.Millisecond, + logger: logging.NewLogger(), + } +} + // WithRetryInterval sets the retry interval func WithRetryInterval(f time.Duration) Option { return func(o *options) error { diff --git a/pkg/forward/shutdown_test.go b/pkg/forward/shutdown_test.go index 5b2f9231d0..b7f851ed07 100644 --- a/pkg/forward/shutdown_test.go +++ b/pkg/forward/shutdown_test.go @@ -47,6 +47,10 @@ func TestInterStepDataForward_Stop(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -61,7 +65,7 @@ func TestInterStepDataForward_Stop(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) stopped := f.Start() // write some data but buffer is not full even though we are not reading @@ -80,6 +84,10 @@ func TestInterStepDataForward_ForceStop(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } + ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -94,7 +102,7 @@ func TestInterStepDataForward_ForceStop(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) stopped := f.Start() // write some data such that the fromBuffer can be empty, that is toBuffer gets full diff --git a/pkg/isb/interfaces.go b/pkg/isb/interfaces.go index 20a680f173..de18a3f7c1 100644 --- a/pkg/isb/interfaces.go +++ b/pkg/isb/interfaces.go @@ -51,6 +51,7 @@ type BufferWriter interface { BufferWriterInformation io.Closer Write(context.Context, []Message) ([]Offset, []error) + IsFull() bool } // BufferReader is the buffer from which we are reading. diff --git a/pkg/isb/stores/jetstream/writer.go b/pkg/isb/stores/jetstream/writer.go index b3bc025530..def0aeaed4 100644 --- a/pkg/isb/stores/jetstream/writer.go +++ b/pkg/isb/stores/jetstream/writer.go @@ -194,7 +194,7 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([ for i := 0; i < len(errs); i++ { errs[i] = fmt.Errorf("unknown error") } - if jw.isFull.Load() { + if jw.IsFull() { jw.log.Debugw("Is full") isbFull.With(map[string]string{"buffer": jw.GetName()}).Inc() for i := 0; i < len(errs); i++ { @@ -210,6 +210,11 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([ return jw.syncWrite(ctx, messages, errs, labels) } +// IsFull returns whether the buffer is full. It could be approximate. +func (jw *jetStreamWriter) IsFull() bool { + return jw.isFull.Load() +} + func (jw *jetStreamWriter) asyncWrite(_ context.Context, messages []isb.Message, errs []error, metricsLabels map[string]string) ([]isb.Offset, []error) { var writeOffsets = make([]isb.Offset, len(messages)) var futures = make([]nats.PubAckFuture, len(messages)) diff --git a/pkg/isb/stores/jetstream/writer_test.go b/pkg/isb/stores/jetstream/writer_test.go index 942744295b..179f8d6b66 100644 --- a/pkg/isb/stores/jetstream/writer_test.go +++ b/pkg/isb/stores/jetstream/writer_test.go @@ -114,7 +114,7 @@ func TestForwarderJetStreamBuffer(t *testing.T) { "to1": to1, } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, map[string]string{"toStreamName": dfv1.RetryUntilSuccess}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() diff --git a/pkg/isb/stores/redis/read_test.go b/pkg/isb/stores/redis/read_test.go index 3c0c98ee33..6bbe65e8c0 100644 --- a/pkg/isb/stores/redis/read_test.go +++ b/pkg/isb/stores/redis/read_test.go @@ -130,8 +130,11 @@ func TestRedisCheckBacklog(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": rqw, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10)) + f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10)) stopped := f.Start() // validate the length of the toStep stream. @@ -314,6 +317,9 @@ func (suite *ReadWritePerformance) SetupSuite() { toSteps := map[string]isb.BufferWriter{ "to1": rqw, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", @@ -323,7 +329,7 @@ func (suite *ReadWritePerformance) SetupSuite() { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) + isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) suite.ctx = ctx suite.rclient = client @@ -410,8 +416,11 @@ func (suite *ReadWritePerformance) TestReadWriteLatencyPipelining() { toSteps := map[string]isb.BufferWriter{ "to1": suite.rqw, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) + suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) suite.False(suite.rqw.IsFull()) var writeMessages = make([]isb.Message, 0, suite.count) diff --git a/pkg/isb/stores/redis/write_test.go b/pkg/isb/stores/redis/write_test.go index 6b1bcbfc84..1bc8b4e2e6 100644 --- a/pkg/isb/stores/redis/write_test.go +++ b/pkg/isb/stores/redis/write_test.go @@ -343,6 +343,9 @@ func TestNewInterStepDataForwardRedis(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } writeMessages, internalKeys := buildTestWriteMessages(fromStepWrite, int64(20), testStartTime) @@ -356,7 +359,7 @@ func TestNewInterStepDataForwardRedis(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark) assert.NoError(t, err) assert.False(t, to1.IsFull()) @@ -392,6 +395,10 @@ func TestReadTimeout(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + } + vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", AbstractVertex: dfv1.AbstractVertex{ @@ -400,7 +407,7 @@ func TestReadTimeout(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() // Call stop to end the test as we have a blocking read. The forwarder is up and running with no messages written diff --git a/pkg/sinks/blackhole/blackhole.go b/pkg/sinks/blackhole/blackhole.go index 259c767434..72877ccde8 100644 --- a/pkg/sinks/blackhole/blackhole.go +++ b/pkg/sinks/blackhole/blackhole.go @@ -71,7 +71,7 @@ func NewBlackhole(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWaterma } } - isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sinks/blackhole/blackhole_test.go b/pkg/sinks/blackhole/blackhole_test.go index 7c47e391ab..710efc72a0 100644 --- a/pkg/sinks/blackhole/blackhole_test.go +++ b/pkg/sinks/blackhole/blackhole_test.go @@ -118,7 +118,11 @@ func TestBlackhole_ForwardToTwoVertex(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark) + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + "to2": dfv1.RetryUntilSuccess, + } + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() diff --git a/pkg/sinks/kafka/kafka.go b/pkg/sinks/kafka/kafka.go index 2d0920bd6f..deb86d1e80 100644 --- a/pkg/sinks/kafka/kafka.go +++ b/pkg/sinks/kafka/kafka.go @@ -84,7 +84,7 @@ func NewToKafka(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark } } - f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } @@ -190,6 +190,10 @@ func (tk *ToKafka) Write(_ context.Context, messages []isb.Message) ([]isb.Offse return nil, errs } +func (tk *ToKafka) IsFull() bool { + return false +} + func (tk *ToKafka) Close() error { tk.log.Info("Closing kafka producer...") return tk.producer.Close() diff --git a/pkg/sinks/kafka/kafka_test.go b/pkg/sinks/kafka/kafka_test.go index c92890bf62..ff7a04eb72 100644 --- a/pkg/sinks/kafka/kafka_test.go +++ b/pkg/sinks/kafka/kafka_test.go @@ -47,7 +47,7 @@ func TestWriteSuccessToKafka(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromEdgeList(generic.GetBufferNameList(vertex.GetToBuffers())) - toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark) + toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) toKafka.kafkaSink = vertex.Spec.Sink.Kafka toKafka.name = "Test" @@ -100,7 +100,7 @@ func TestWriteFailureToKafka(t *testing.T) { }} toSteps := map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark) + toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) toKafka.name = "Test" toKafka.topic = "topic-1" diff --git a/pkg/sinks/logger/log.go b/pkg/sinks/logger/log.go index 4fdfb27bd7..5aba5a3c5e 100644 --- a/pkg/sinks/logger/log.go +++ b/pkg/sinks/logger/log.go @@ -72,7 +72,7 @@ func NewToLog(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark f } } - isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sinks/logger/log_test.go b/pkg/sinks/logger/log_test.go index 80f5f1d5e8..257ca15744 100644 --- a/pkg/sinks/logger/log_test.go +++ b/pkg/sinks/logger/log_test.go @@ -116,6 +116,10 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) { "to1": to1, "to2": to2, } + actionsOnFull := map[string]string{ + "to1": dfv1.RetryUntilSuccess, + "to2": dfv1.RetryUntilSuccess, + } writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime) vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ @@ -125,7 +129,7 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() diff --git a/pkg/sinks/udsink/sink.go b/pkg/sinks/udsink/sink.go index f0713c9bc5..1ca382b333 100644 --- a/pkg/sinks/udsink/sink.go +++ b/pkg/sinks/udsink/sink.go @@ -78,7 +78,7 @@ func NewUserDefinedSink(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchW return nil, fmt.Errorf("failed to create gRPC client, %w", err) } s.udsink = udsink - isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sources/generator/tickgen.go b/pkg/sources/generator/tickgen.go index 6a8fcd9b33..4e0349cf76 100644 --- a/pkg/sources/generator/tickgen.go +++ b/pkg/sources/generator/tickgen.go @@ -154,6 +154,7 @@ func NewMemGen( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, + onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -227,7 +228,7 @@ func NewMemGen( gensrc.sourcePublishWM = gensrc.buildSourceWatermarkPublisher(publishWMStores) // we pass in the context to forwarder as well so that it can shut down when we cancel the context - forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) + forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sources/generator/tickgen_test.go b/pkg/sources/generator/tickgen_test.go index 3465a5a8e7..8ab4c0f141 100644 --- a/pkg/sources/generator/tickgen_test.go +++ b/pkg/sources/generator/tickgen_test.go @@ -62,7 +62,7 @@ func TestRead(t *testing.T) { "writer": dest, } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) + mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) assert.NoError(t, err) _ = mgen.Start() @@ -106,7 +106,7 @@ func TestStop(t *testing.T) { "writer": dest, } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) + mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) assert.NoError(t, err) stop := mgen.Start() @@ -201,7 +201,7 @@ func TestWatermark(t *testing.T) { Replica: 0, } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) - mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, nil, nil, publishWMStore) + mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, nil, nil, publishWMStore) assert.NoError(t, err) stop := mgen.Start() diff --git a/pkg/sources/http/http.go b/pkg/sources/http/http.go index 729c575dcd..dcc3b9ef99 100644 --- a/pkg/sources/http/http.go +++ b/pkg/sources/http/http.go @@ -88,6 +88,7 @@ func New( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, + onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -202,7 +203,7 @@ func New( } } - h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) + h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { h.logger.Errorw("Error instantiating the forwarder", zap.Error(err)) return nil, err diff --git a/pkg/sources/http/http_test.go b/pkg/sources/http/http_test.go index 9d959a84ca..88a333ed8f 100644 --- a/pkg/sources/http/http_test.go +++ b/pkg/sources/http/http_test.go @@ -69,7 +69,7 @@ func Test_NewHTTP(t *testing.T) { dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)} publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - h, err := New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores) + h, err := New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores) assert.NoError(t, err) assert.False(t, h.ready) assert.Equal(t, v.Spec.Name, h.GetName()) diff --git a/pkg/sources/kafka/handler_test.go b/pkg/sources/kafka/handler_test.go index 3b9f000a9b..79a2a5b0b1 100644 --- a/pkg/sources/kafka/handler_test.go +++ b/pkg/sources/kafka/handler_test.go @@ -66,7 +66,7 @@ func TestMessageHandling(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), + ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond)) msg := &sarama.ConsumerMessage{ diff --git a/pkg/sources/kafka/reader.go b/pkg/sources/kafka/reader.go index 61142b17d5..4f641f4e1c 100644 --- a/pkg/sources/kafka/reader.go +++ b/pkg/sources/kafka/reader.go @@ -267,6 +267,7 @@ func NewKafkaSource( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, + onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -343,7 +344,7 @@ func NewKafkaSource( forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize))) } } - forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) + forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { kafkasource.logger.Errorw("Error instantiating the forwarder", zap.Error(err)) return nil, err diff --git a/pkg/sources/kafka/reader_test.go b/pkg/sources/kafka/reader_test.go index 020b552cdf..508467487c 100644 --- a/pkg/sources/kafka/reader_test.go +++ b/pkg/sources/kafka/reader_test.go @@ -54,7 +54,7 @@ func TestNewKafkasource(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, err := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, err := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) // no errors if everything is good. assert.Nil(t, err) @@ -90,7 +90,7 @@ func TestGroupNameOverride(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) assert.Equal(t, "default", ks.groupName) @@ -116,7 +116,7 @@ func TestDefaultBufferSize(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) assert.Equal(t, 100, ks.handlerbuffer) @@ -142,7 +142,7 @@ func TestBufferSizeOverrides(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) assert.Equal(t, 110, ks.handlerbuffer) diff --git a/pkg/sources/nats/nats.go b/pkg/sources/nats/nats.go index a18d92f7bc..9c07f4ee8f 100644 --- a/pkg/sources/nats/nats.go +++ b/pkg/sources/nats/nats.go @@ -61,6 +61,7 @@ func New( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, + onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -94,7 +95,7 @@ func New( forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize))) } } - forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) + forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { n.logger.Errorw("Error instantiating the forwarder", zap.Error(err)) return nil, err diff --git a/pkg/sources/nats/nats_test.go b/pkg/sources/nats/nats_test.go index 51ea552ffa..615503fc3b 100644 --- a/pkg/sources/nats/nats_test.go +++ b/pkg/sources/nats/nats_test.go @@ -65,7 +65,7 @@ func newInstance(t *testing.T, vi *dfv1.VertexInstance) (*natsSource, error) { dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)} publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - return New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second)) + return New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second)) } func Test_Single(t *testing.T) { diff --git a/pkg/sources/source.go b/pkg/sources/source.go index bbed686966..dfd23034fb 100644 --- a/pkg/sources/source.go +++ b/pkg/sources/source.go @@ -139,9 +139,9 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { } }() readyChecker = t - sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log) + sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), sp.getOnFullActions(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log) } else { - sourcer, err = sp.getSourcer(writers, forward.All, applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log) + sourcer, err = sp.getSourcer(writers, forward.All, sp.getOnFullActions(), applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log) } if err != nil { return fmt.Errorf("failed to find a sourcer, error: %w", err) @@ -179,6 +179,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { func (sp *SourceProcessor) getSourcer( writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, + onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -193,7 +194,7 @@ func (sp *SourceProcessor) getSourcer( if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil { readOptions = append(readOptions, generator.WithReadTimeout(l.ReadTimeout.Duration)) } - return generator.NewMemGen(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) + return generator.NewMemGen(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) } else if x := src.Kafka; x != nil { readOptions := []kafka.Option{ kafka.WithGroupName(x.ConsumerGroupName), @@ -202,9 +203,9 @@ func (sp *SourceProcessor) getSourcer( if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil { readOptions = append(readOptions, kafka.WithReadTimeOut(l.ReadTimeout.Duration)) } - return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) + return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) } else if x := src.HTTP; x != nil { - return http.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger)) + return http.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger)) } else if x := src.Nats; x != nil { readOptions := []nats.Option{ nats.WithLogger(logger), @@ -212,7 +213,7 @@ func (sp *SourceProcessor) getSourcer( if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil { readOptions = append(readOptions, nats.WithReadTimeout(l.ReadTimeout.Duration)) } - return nats.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) + return nats.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) } return nil, fmt.Errorf("invalid source spec") } @@ -220,8 +221,9 @@ func (sp *SourceProcessor) getSourcer( func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere { shuffleFuncMap := make(map[string]*shuffle.Shuffle) for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges { + bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge) if edge.Parallelism != nil && *edge.Parallelism > 1 { - s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge)) + s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), bufferNames) shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s } } @@ -244,3 +246,15 @@ func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere { }) return fsd } + +// getOnFullActions builds a mapping between the out-going buffers and their respective onFull action. +func (sp *SourceProcessor) getOnFullActions() map[string]string { + onFullActions := make(map[string]string) + for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges { + bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge) + for _, bn := range bufferNames { + onFullActions[bn] = edge.OnFull + } + } + return onFullActions +} diff --git a/pkg/udf/map_udf.go b/pkg/udf/map_udf.go index d9d4506294..65c80646c8 100644 --- a/pkg/udf/map_udf.go +++ b/pkg/udf/map_udf.go @@ -73,13 +73,18 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error { return fmt.Errorf("unrecognized isbsvc type %q", u.ISBSvcType) } - // Populate shuffle function map + // Populate shuffle function map and onFull actions map shuffleFuncMap := make(map[string]*shuffle.Shuffle) + onFullActions := make(map[string]string) for _, edge := range u.VertexInstance.Vertex.Spec.ToEdges { + bufferNames := dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge) if edge.Parallelism != nil && *edge.Parallelism > 1 { - s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge)) + s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), bufferNames) shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s } + for _, bn := range bufferNames { + onFullActions[bn] = edge.OnFull + } } conditionalForwarder := forward.GoWhere(func(key string) ([]string, error) { @@ -131,7 +136,7 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error { } } - forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, udfHandler, fetchWatermark, publishWatermark, opts...) + forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, onFullActions, udfHandler, fetchWatermark, publishWatermark, opts...) if err != nil { return err } diff --git a/test/e2e/functional_test.go b/test/e2e-suite-1/functional_test.go similarity index 100% rename from test/e2e/functional_test.go rename to test/e2e-suite-1/functional_test.go diff --git a/test/e2e/testdata/even-odd.yaml b/test/e2e-suite-1/testdata/even-odd.yaml similarity index 100% rename from test/e2e/testdata/even-odd.yaml rename to test/e2e-suite-1/testdata/even-odd.yaml diff --git a/test/e2e/testdata/extract-event-time-from-payload.yaml b/test/e2e-suite-1/testdata/extract-event-time-from-payload.yaml similarity index 100% rename from test/e2e/testdata/extract-event-time-from-payload.yaml rename to test/e2e-suite-1/testdata/extract-event-time-from-payload.yaml diff --git a/test/e2e/testdata/simple-pipeline.yaml b/test/e2e-suite-1/testdata/simple-pipeline.yaml similarity index 100% rename from test/e2e/testdata/simple-pipeline.yaml rename to test/e2e-suite-1/testdata/simple-pipeline.yaml diff --git a/test/e2e/testdata/source-filtering.yaml b/test/e2e-suite-1/testdata/source-filtering.yaml similarity index 100% rename from test/e2e/testdata/source-filtering.yaml rename to test/e2e-suite-1/testdata/source-filtering.yaml diff --git a/test/e2e/testdata/udf-filtering.yaml b/test/e2e-suite-1/testdata/udf-filtering.yaml similarity index 100% rename from test/e2e/testdata/udf-filtering.yaml rename to test/e2e-suite-1/testdata/udf-filtering.yaml diff --git a/test/e2e/testdata/watermark.yaml b/test/e2e-suite-1/testdata/watermark.yaml similarity index 100% rename from test/e2e/testdata/watermark.yaml rename to test/e2e-suite-1/testdata/watermark.yaml diff --git a/test/e2e-suite-2/functional_test.go b/test/e2e-suite-2/functional_test.go new file mode 100644 index 0000000000..2552452cb6 --- /dev/null +++ b/test/e2e-suite-2/functional_test.go @@ -0,0 +1,75 @@ +//go:build test + +/* +Copyright 2022 The Numaproj Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package e2e + +import ( + "testing" + "time" + + "github.com/stretchr/testify/suite" + + . "github.com/numaproj/numaflow/test/fixtures" +) + +type FunctionalSuite struct { + E2ESuite +} + +func (s *FunctionalSuite) TestDropOnFull() { + w := s.Given().Pipeline("@testdata/drop-on-full.yaml"). + When(). + CreatePipelineAndWait() + defer w.DeletePipelineAndWait() + pipelineName := "drop-on-full" + + // wait for all the pods to come up + w.Expect().VertexPodsRunning() + + // scale the sinks down to 0 pod to create a buffer full scenario. + scaleDownArgs := "kubectl scale vtx drop-on-full-drop-sink --replicas=0 -n numaflow-system" + w.Exec("/bin/sh", []string{"-c", scaleDownArgs}, CheckVertexScaled) + scaleDownArgs = "kubectl scale vtx drop-on-full-retry-sink --replicas=0 -n numaflow-system" + w.Exec("/bin/sh", []string{"-c", scaleDownArgs}, CheckVertexScaled) + w.Expect(). + VertexSizeScaledTo("retry-sink", 0). + VertexSizeScaledTo("drop-sink", 0) + + w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("1"))) + // give buffer writer 2 seconds to update it's isFull attribute. + time.Sleep(time.Second * 2) + w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("2"))) + + // scale the sinks up to 1 pod to process the message from the buffer. + scaleUpArgs := "kubectl scale vtx drop-on-full-drop-sink --replicas=1 -n numaflow-system" + w.Exec("/bin/sh", []string{"-c", scaleUpArgs}, CheckVertexScaled) + scaleUpArgs = "kubectl scale vtx drop-on-full-retry-sink --replicas=1 -n numaflow-system" + w.Exec("/bin/sh", []string{"-c", scaleUpArgs}, CheckVertexScaled) + w.Expect(). + VertexSizeScaledTo("retry-sink", 1). + VertexSizeScaledTo("drop-sink", 1) + + w.Expect().SinkContains("retry-sink", "1") + w.Expect().SinkContains("retry-sink", "2") + w.Expect().SinkContains("drop-sink", "1") + w.Expect().SinkNotContains("drop-sink", "2") +} + +func TestFunctionalSuite(t *testing.T) { + suite.Run(t, new(FunctionalSuite)) +} diff --git a/test/e2e-suite-2/testdata/drop-on-full.yaml b/test/e2e-suite-2/testdata/drop-on-full.yaml new file mode 100644 index 0000000000..964da5829f --- /dev/null +++ b/test/e2e-suite-2/testdata/drop-on-full.yaml @@ -0,0 +1,34 @@ +apiVersion: numaflow.numaproj.io/v1alpha1 +kind: Pipeline +metadata: + name: drop-on-full +spec: + limits: + # Using the following limits for generating a buffer full scenario. + bufferMaxLength: 1 + bufferUsageLimit: 100 + vertices: + - name: in + source: + http: {} + - name: drop-sink + scale: + disabled: true + sink: + udsink: + container: + image: quay.io/numaio/numaflow-sink/redis-e2e-test-sink:latest + - name: retry-sink + scale: + disabled: true + sink: + udsink: + container: + image: quay.io/numaio/numaflow-sink/redis-e2e-test-sink:latest + edges: + - from: in + to: drop-sink + onFull: dropAndAckLatest + - from: in + to: retry-sink + onFull: retryUntilSuccess \ No newline at end of file diff --git a/test/fixtures/expect.go b/test/fixtures/expect.go index 27a43915dc..4d433d7d5a 100644 --- a/test/fixtures/expect.go +++ b/test/fixtures/expect.go @@ -22,12 +22,13 @@ import ( "testing" "time" - dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" - flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1" apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + + dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1" ) type Expect struct { @@ -111,6 +112,21 @@ func (t *Expect) VertexPodsRunning() *Expect { return t } +func (t *Expect) VertexSizeScaledTo(v string, size int) *Expect { + t.t.Helper() + ctx := context.Background() + if _, err := t.vertexClient.Get(ctx, t.pipeline.Name+"-"+v, metav1.GetOptions{}); err != nil { + t.t.Fatalf("Expected vertex %s existing: %v", v, err) + } + + // check expected number of pods running + timeout := 2 * time.Minute + if err := WaitForVertexPodScalingTo(t.kubeClient, t.vertexClient, Namespace, t.pipeline.Name, v, timeout, size); err != nil { + t.t.Fatalf("Expected %d pods running on vertex %s : %v", size, v, err) + } + return t +} + func (t *Expect) VertexPodLogContains(vertexName, regex string, opts ...PodLogCheckOption) *Expect { t.t.Helper() ctx := context.Background() diff --git a/test/fixtures/util.go b/test/fixtures/util.go index 51100e3800..5aab3c298e 100644 --- a/test/fixtures/util.go +++ b/test/fixtures/util.go @@ -29,14 +29,15 @@ import ( "testing" "time" - dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" - flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1" "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" + + dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1" ) var OutputRegexp = func(rx string) func(t *testing.T, output string, err error) { @@ -53,6 +54,11 @@ var CheckPodKillSucceeded = func(t *testing.T, output string, err error) { assert.NoError(t, err) } +var CheckVertexScaled = func(t *testing.T, output string, err error) { + assert.Contains(t, output, "scaled") + assert.NoError(t, err) +} + func Exec(name string, args ...string) (string, error) { cmd := exec.Command(name, args...) cmd.Env = os.Environ() @@ -253,6 +259,33 @@ func WaitForVertexPodRunning(kubeClient kubernetes.Interface, vertexClient flowp } } +func WaitForVertexPodScalingTo(kubeClient kubernetes.Interface, vertexClient flowpkg.VertexInterface, namespace, pipelineName, vertexName string, timeout time.Duration, size int) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + labelSelector := fmt.Sprintf("%s=%s,%s=%s", dfv1.KeyPipelineName, pipelineName, dfv1.KeyVertexName, vertexName) + for { + select { + case <-ctx.Done(): + return fmt.Errorf("timeout after %v waiting for vertex pod scaling", timeout) + default: + } + vertexList, err := vertexClient.List(ctx, metav1.ListOptions{LabelSelector: labelSelector}) + if err != nil { + return fmt.Errorf("error getting vertex list: %w", err) + } + ok := len(vertexList.Items) == 1 + podList, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{LabelSelector: labelSelector, FieldSelector: "status.phase=Running"}) + if err != nil { + return fmt.Errorf("error getting vertex pod list: %w", err) + } + ok = ok && len(podList.Items) == size + if ok { + return nil + } + time.Sleep(2 * time.Second) + } +} + func WaitForDaemonPodsRunning(kubeClient kubernetes.Interface, namespace, pipelineName string, timeout time.Duration) error { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() From dcea97f5f9c9cf0f6eb7f113ef864402747ebd1c Mon Sep 17 00:00:00 2001 From: Keran Yang Date: Mon, 27 Mar 2023 17:58:33 -0400 Subject: [PATCH 2/6] Address comments Signed-off-by: Keran Yang --- api/json-schema/schema.json | 2 +- api/openapi-spec/swagger.json | 2 +- .../full/numaflow.numaproj.io_pipelines.yaml | 3 +- .../full/numaflow.numaproj.io_vertices.yaml | 6 +- config/install.yaml | 9 +- config/namespace-install.yaml | 9 +- docs/APIs.md | 15 +- pkg/apis/numaflow/v1alpha1/const.go | 7 +- pkg/apis/numaflow/v1alpha1/edge_types.go | 21 +- pkg/apis/numaflow/v1alpha1/generated.pb.go | 739 +++++++++--------- pkg/apis/numaflow/v1alpha1/generated.proto | 5 +- .../numaflow/v1alpha1/openapi_generated.go | 3 +- .../v1alpha1/zz_generated.deepcopy.go | 5 + pkg/forward/forward.go | 29 +- pkg/forward/forward_test.go | 82 +- pkg/forward/shutdown_test.go | 12 +- pkg/isb/errors.go | 10 + pkg/isb/interfaces.go | 1 - pkg/isb/stores/jetstream/options.go | 19 +- pkg/isb/stores/jetstream/writer.go | 23 +- pkg/isb/stores/jetstream/writer_test.go | 58 +- pkg/isb/stores/redis/options.go | 20 +- pkg/isb/stores/redis/read_test.go | 15 +- pkg/isb/stores/redis/write.go | 13 +- pkg/isb/stores/redis/write_test.go | 51 +- pkg/isb/stores/simplebuffer/buffer.go | 11 +- pkg/isb/stores/simplebuffer/buffer_test.go | 25 +- pkg/isb/stores/simplebuffer/options.go | 16 +- pkg/sinks/blackhole/blackhole.go | 2 +- pkg/sinks/blackhole/blackhole_test.go | 6 +- pkg/sinks/kafka/kafka.go | 6 +- pkg/sinks/kafka/kafka_test.go | 4 +- pkg/sinks/logger/log.go | 2 +- pkg/sinks/logger/log_test.go | 6 +- pkg/sinks/udsink/sink.go | 2 +- pkg/sources/generator/tickgen.go | 3 +- pkg/sources/generator/tickgen_test.go | 6 +- pkg/sources/http/http.go | 3 +- pkg/sources/http/http_test.go | 2 +- pkg/sources/kafka/handler_test.go | 2 +- pkg/sources/kafka/reader.go | 3 +- pkg/sources/kafka/reader_test.go | 8 +- pkg/sources/nats/nats.go | 3 +- pkg/sources/nats/nats_test.go | 2 +- pkg/sources/source.go | 33 +- pkg/udf/common.go | 8 +- pkg/udf/map_udf.go | 11 +- test/e2e-suite-2/testdata/drop-on-full.yaml | 2 +- 48 files changed, 721 insertions(+), 604 deletions(-) diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json index 6eb9fdfa36..028f638354 100644 --- a/api/json-schema/schema.json +++ b/api/json-schema/schema.json @@ -17659,7 +17659,7 @@ "description": "Limits define the limitations such as buffer read batch size for the edge, will override pipeline level settings." }, "onFull": { - "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".", + "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. There are currently two options, retryUntilSuccess and discardLatest. if not provided, the default value is set to \"retryUntilSuccess\"", "type": "string" }, "parallelism": { diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 08c77f1a77..7acc7cc5fb 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -17668,7 +17668,7 @@ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.EdgeLimits" }, "onFull": { - "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".", + "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. There are currently two options, retryUntilSuccess and discardLatest. if not provided, the default value is set to \"retryUntilSuccess\"", "type": "string" }, "parallelism": { diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml index 8a71d09bf9..f09d67180c 100644 --- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml @@ -79,9 +79,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 diff --git a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml index 1d4022dfeb..d3bcf54915 100644 --- a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml +++ b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml @@ -593,9 +593,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 @@ -2768,9 +2767,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 diff --git a/config/install.yaml b/config/install.yaml index ec7b1bac7d..64617d87a1 100644 --- a/config/install.yaml +++ b/config/install.yaml @@ -2377,9 +2377,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 @@ -8173,9 +8172,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 @@ -10348,9 +10346,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml index 8780e2db19..70f25fed69 100644 --- a/config/namespace-install.yaml +++ b/config/namespace-install.yaml @@ -2377,9 +2377,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 @@ -8173,9 +8172,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 @@ -10348,9 +10346,8 @@ spec: type: object onFull: enum: - - "" - retryUntilSuccess - - dropAndAckLatest + - discardLatest type: string parallelism: format: int32 diff --git a/docs/APIs.md b/docs/APIs.md index 6b2b7a57f5..660951bc92 100644 --- a/docs/APIs.md +++ b/docs/APIs.md @@ -924,8 +924,9 @@ ignored when the “to” vertex is not a reduce vertex. (Optional)

OnFull specifies the behaviour for the write actions when the inter step -buffer is full. if not provided, the default value is set to “”, which -currently has the same effect as “retryUntilSuccess”. +buffer is full. There are currently two options, retryUntilSuccess and +discardLatest. if not provided, the default value is set to +“retryUntilSuccess”

@@ -2718,6 +2719,16 @@ Auth information +

+OnFullWritingStrategy (string alias) +

+

+

+

+OnFullWritingStrategy is an edge-level specification to define the +writing behaviour when the ToBuffer is full +

+

PBQStorage

diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go index 971e89e528..d4399afdae 100644 --- a/pkg/apis/numaflow/v1alpha1/const.go +++ b/pkg/apis/numaflow/v1alpha1/const.go @@ -24,6 +24,9 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) +// OnFullWritingStrategy is an edge-level specification to define the writing behaviour when the ToBuffer is full +type OnFullWritingStrategy string + const ( Project = "numaflow" @@ -123,8 +126,8 @@ const ( DefaultReadBatchSize = 500 // Edge-level specification to define the writing behaviour when the ToBuffer is full - RetryUntilSuccess = "retryUntilSuccess" - DropAndAckLatest = "dropAndAckLatest" + RetryUntilSuccess OnFullWritingStrategy = "retryUntilSuccess" + DiscardLatest OnFullWritingStrategy = "discardLatest" // Auto scaling DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go index 09aa3f0d00..a574bdd9d1 100644 --- a/pkg/apis/numaflow/v1alpha1/edge_types.go +++ b/pkg/apis/numaflow/v1alpha1/edge_types.go @@ -31,10 +31,11 @@ type Edge struct { // +optional Parallelism *int32 `json:"parallelism" protobuf:"bytes,5,opt,name=parallelism"` // OnFull specifies the behaviour for the write actions when the inter step buffer is full. - // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess". - // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest + // There are currently two options, retryUntilSuccess and discardLatest. + // if not provided, the default value is set to "retryUntilSuccess" + // +kubebuilder:validation:Enum=retryUntilSuccess;discardLatest // +optional - OnFull string `json:"onFull" protobuf:"bytes,6,opt,name=onFull"` + OnFull *string `json:"onFull,omitempty" protobuf:"bytes,6,opt,name=onFull"` } type ForwardConditions struct { @@ -51,3 +52,17 @@ type EdgeLimits struct { // +optional BufferUsageLimit *uint32 `json:"bufferUsageLimit,omitempty" protobuf:"varint,2,opt,name=bufferUsageLimit"` } + +func (e Edge) OnFullWritingStrategy() OnFullWritingStrategy { + if e.OnFull == nil { + return RetryUntilSuccess + } + switch *e.OnFull { + case "retryUntilSuccess": + return RetryUntilSuccess + case "discardLatest": + return DiscardLatest + default: + return RetryUntilSuccess + } +} diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go index 7d9cb87e39..496370c87f 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.pb.go +++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go @@ -2037,364 +2037,364 @@ func init() { } var fileDescriptor_9d0d1b17d3865563 = []byte{ - // 5699 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57, - 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9, - 0x5a, 0x25, 0x9a, 0xfd, 0xff, 0x77, 0x6d, 0xc6, 0x64, 0xd9, 0x59, 0x60, 0x37, 0x71, 0xdb, 0xe3, - 0xc9, 0xcc, 0xd8, 0x33, 0xce, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2, - 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0x83, 0x94, 0x20, 0x16, 0x2d, 0x12, - 0x42, 0x5a, 0xb1, 0x5a, 0x24, 0x24, 0x24, 0x04, 0xd2, 0x4a, 0x3c, 0xb0, 0x2f, 0xf0, 0xc2, 0x13, - 0x0a, 0x3c, 0x40, 0x1e, 0x90, 0x08, 0x02, 0xb5, 0x88, 0x79, 0xe2, 0x01, 0xb4, 0x68, 0x5f, 0x56, - 0x23, 0x24, 0xd0, 0xfd, 0xa8, 0xcf, 0xae, 0xf6, 0xd8, 0xdd, 0x76, 0x76, 0x22, 0xde, 0xaa, 0xee, - 0x39, 0xe7, 0x77, 0x6e, 0xdd, 0x8f, 0x73, 0xcf, 0x3d, 0xe7, 0xde, 0x82, 0x1b, 0x6d, 0x93, 0xed, - 0xf4, 0xb7, 0xe7, 0x0d, 0xa7, 0xbb, 0x60, 0xf7, 0xbb, 0x7a, 0xcf, 0x75, 0xde, 0x12, 0x0f, 0x2d, - 0xcb, 0x79, 0xb0, 0xd0, 0xeb, 0xb4, 0x17, 0xf4, 0x9e, 0xe9, 0x85, 0x25, 0xbb, 0x57, 0x75, 0xab, - 0xb7, 0xa3, 0x5f, 0x5d, 0x68, 0x53, 0x9b, 0xba, 0x3a, 0xa3, 0xcd, 0xf9, 0x9e, 0xeb, 0x30, 0x87, - 0x7c, 0x39, 0x04, 0x9a, 0xf7, 0x81, 0xe6, 0x7d, 0xb1, 0xf9, 0x5e, 0xa7, 0x3d, 0xcf, 0x81, 0xc2, - 0x12, 0x1f, 0x68, 0xf6, 0x8b, 0x91, 0x1a, 0xb4, 0x9d, 0xb6, 0xb3, 0x20, 0xf0, 0xb6, 0xfb, 0x2d, - 0xf1, 0x26, 0x5e, 0xc4, 0x93, 0xd4, 0x33, 0xab, 0x75, 0xae, 0x79, 0xf3, 0xa6, 0xc3, 0xab, 0xb5, - 0x60, 0x38, 0x2e, 0x5d, 0xd8, 0x1d, 0xaa, 0xcb, 0xec, 0x0b, 0x21, 0x4f, 0x57, 0x37, 0x76, 0x4c, - 0x9b, 0xba, 0x7b, 0xfe, 0xb7, 0x2c, 0xb8, 0xd4, 0x73, 0xfa, 0xae, 0x41, 0x8f, 0x24, 0xe5, 0x2d, - 0x74, 0x29, 0xd3, 0xd3, 0x74, 0x2d, 0x8c, 0x92, 0x72, 0xfb, 0x36, 0x33, 0xbb, 0xc3, 0x6a, 0x7e, - 0xee, 0x71, 0x02, 0x9e, 0xb1, 0x43, 0xbb, 0x7a, 0x52, 0x4e, 0xfb, 0xe7, 0x32, 0x9c, 0x5b, 0xda, - 0xf6, 0x98, 0xab, 0x1b, 0x6c, 0xc3, 0x69, 0x6e, 0xd2, 0x6e, 0xcf, 0xd2, 0x19, 0x25, 0x1d, 0x28, - 0xf1, 0xba, 0x35, 0x75, 0xa6, 0x57, 0x33, 0x97, 0x33, 0x57, 0x2a, 0x8b, 0x4b, 0xf3, 0x63, 0xf6, - 0xc5, 0xfc, 0xba, 0x02, 0xaa, 0x4f, 0xef, 0x0f, 0x6a, 0x25, 0xff, 0x0d, 0x03, 0x05, 0xe4, 0xbb, - 0x19, 0x98, 0xb6, 0x9d, 0x26, 0x6d, 0x50, 0x8b, 0x1a, 0xcc, 0x71, 0xab, 0xd9, 0xcb, 0xb9, 0x2b, - 0x95, 0xc5, 0x37, 0xc6, 0xd6, 0x98, 0xf2, 0x45, 0xf3, 0x77, 0x22, 0x0a, 0xae, 0xdb, 0xcc, 0xdd, - 0xab, 0x3f, 0xfd, 0xc1, 0xa0, 0xf6, 0xd4, 0xfe, 0xa0, 0x36, 0x1d, 0x25, 0x61, 0xac, 0x26, 0x64, - 0x0b, 0x2a, 0xcc, 0xb1, 0x78, 0x93, 0x99, 0x8e, 0xed, 0x55, 0x73, 0xa2, 0x62, 0x73, 0xf3, 0xb2, - 0xb5, 0xb9, 0xfa, 0x79, 0x3e, 0x5c, 0xe6, 0x77, 0xaf, 0xce, 0x6f, 0x06, 0x6c, 0xf5, 0x73, 0x0a, - 0xb8, 0x12, 0x96, 0x79, 0x18, 0xc5, 0x21, 0x14, 0x4e, 0x7b, 0xd4, 0xe8, 0xbb, 0x26, 0xdb, 0x5b, - 0x76, 0x6c, 0x46, 0x1f, 0xb2, 0x6a, 0x5e, 0xb4, 0xf2, 0xf3, 0x69, 0xd0, 0x1b, 0x4e, 0xb3, 0x11, - 0xe7, 0xae, 0x9f, 0xdb, 0x1f, 0xd4, 0x4e, 0x27, 0x0a, 0x31, 0x89, 0x49, 0x6c, 0x38, 0x63, 0x76, - 0xf5, 0x36, 0xdd, 0xe8, 0x5b, 0x56, 0x83, 0x1a, 0x2e, 0x65, 0x5e, 0xb5, 0x20, 0x3e, 0xe1, 0x4a, - 0x9a, 0x9e, 0x35, 0xc7, 0xd0, 0xad, 0xbb, 0xdb, 0x6f, 0x51, 0x83, 0x21, 0x6d, 0x51, 0x97, 0xda, - 0x06, 0xad, 0x57, 0xd5, 0xc7, 0x9c, 0xb9, 0x99, 0x40, 0xc2, 0x21, 0x6c, 0x72, 0x03, 0xce, 0xf6, - 0x5c, 0xd3, 0x11, 0x55, 0xb0, 0x74, 0xcf, 0xbb, 0xa3, 0x77, 0x69, 0xb5, 0x78, 0x39, 0x73, 0xa5, - 0x5c, 0xbf, 0xa8, 0x60, 0xce, 0x6e, 0x24, 0x19, 0x70, 0x58, 0x86, 0x5c, 0x81, 0x92, 0x5f, 0x58, - 0x9d, 0xba, 0x9c, 0xb9, 0x52, 0x90, 0x63, 0xc7, 0x97, 0xc5, 0x80, 0x4a, 0x56, 0xa1, 0xa4, 0xb7, - 0x5a, 0xa6, 0xcd, 0x39, 0x4b, 0xa2, 0x09, 0x2f, 0xa5, 0x7d, 0xda, 0x92, 0xe2, 0x91, 0x38, 0xfe, - 0x1b, 0x06, 0xb2, 0xe4, 0x16, 0x10, 0x8f, 0xba, 0xbb, 0xa6, 0x41, 0x97, 0x0c, 0xc3, 0xe9, 0xdb, - 0x4c, 0xd4, 0xbd, 0x2c, 0xea, 0x3e, 0xab, 0xea, 0x4e, 0x1a, 0x43, 0x1c, 0x98, 0x22, 0x45, 0x5e, - 0x82, 0x33, 0x6a, 0xda, 0x85, 0xad, 0x00, 0x02, 0xe9, 0x69, 0xde, 0x90, 0x98, 0xa0, 0xe1, 0x10, - 0x37, 0x69, 0xc2, 0x25, 0xbd, 0xcf, 0x9c, 0x2e, 0x87, 0x8c, 0x2b, 0xdd, 0x74, 0x3a, 0xd4, 0xae, - 0x56, 0x2e, 0x67, 0xae, 0x94, 0xea, 0x97, 0xf7, 0x07, 0xb5, 0x4b, 0x4b, 0x07, 0xf0, 0xe1, 0x81, - 0x28, 0xe4, 0x2e, 0x94, 0x9b, 0xb6, 0xb7, 0xe1, 0x58, 0xa6, 0xb1, 0x57, 0x9d, 0x16, 0x15, 0xbc, - 0xaa, 0x3e, 0xb5, 0xbc, 0x72, 0xa7, 0x21, 0x09, 0x8f, 0x06, 0xb5, 0x4b, 0xc3, 0xd6, 0x71, 0x3e, - 0xa0, 0x63, 0x88, 0x41, 0xd6, 0x05, 0xe0, 0xb2, 0x63, 0xb7, 0xcc, 0x76, 0x75, 0x46, 0xf4, 0xc6, - 0xe5, 0x11, 0x03, 0x7a, 0xe5, 0x4e, 0x43, 0xf2, 0xd5, 0x67, 0x94, 0x3a, 0xf9, 0x8a, 0x21, 0xc2, - 0xec, 0x8b, 0x70, 0x76, 0x68, 0xd6, 0x92, 0x33, 0x90, 0xeb, 0xd0, 0x3d, 0x61, 0x94, 0xca, 0xc8, - 0x1f, 0xc9, 0xd3, 0x50, 0xd8, 0xd5, 0xad, 0x3e, 0xad, 0x66, 0x45, 0x99, 0x7c, 0xf9, 0xf9, 0xec, - 0xb5, 0x8c, 0x36, 0x28, 0xc3, 0x29, 0xdf, 0x16, 0xdc, 0xa3, 0x2e, 0xa3, 0x0f, 0xc9, 0x65, 0xc8, - 0xdb, 0xbc, 0x3f, 0x84, 0x7c, 0x7d, 0x5a, 0x7d, 0x6e, 0x5e, 0xf4, 0x83, 0xa0, 0x10, 0x03, 0x8a, - 0xd2, 0x96, 0x0b, 0xbc, 0xca, 0xe2, 0x8b, 0x63, 0x9b, 0xa1, 0x86, 0x80, 0xa9, 0xc3, 0xfe, 0xa0, - 0x56, 0x94, 0xcf, 0xa8, 0xa0, 0xc9, 0xeb, 0x90, 0xf7, 0x4c, 0xbb, 0x53, 0xcd, 0x09, 0x15, 0x5f, - 0x1d, 0x5f, 0x85, 0x69, 0x77, 0xea, 0x25, 0xfe, 0x05, 0xfc, 0x09, 0x05, 0x28, 0xb9, 0x0f, 0xb9, - 0x7e, 0xb3, 0xa5, 0x2c, 0xca, 0x2f, 0x8e, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4, - 0x72, 0x5b, 0x2b, 0xab, 0xc8, 0x11, 0xc9, 0x77, 0x32, 0x70, 0xd6, 0x70, 0x6c, 0xa6, 0xf3, 0xf5, - 0xc5, 0xb7, 0xac, 0xd5, 0x82, 0xd0, 0x73, 0x6b, 0x6c, 0x3d, 0xcb, 0x49, 0xc4, 0xfa, 0x79, 0x6e, - 0x28, 0x86, 0x8a, 0x71, 0x58, 0x37, 0xf9, 0x5e, 0x06, 0xce, 0xf3, 0x09, 0x3c, 0xc4, 0x2c, 0xcc, - 0xce, 0xf1, 0xd6, 0xea, 0xe2, 0xfe, 0xa0, 0x76, 0xfe, 0x66, 0x9a, 0x32, 0x4c, 0xaf, 0x03, 0xaf, - 0xdd, 0x39, 0x7d, 0x78, 0x2d, 0x12, 0x26, 0xad, 0xb2, 0xb8, 0x76, 0x9c, 0xeb, 0x5b, 0xfd, 0x33, - 0x6a, 0x28, 0xa7, 0x2d, 0xe7, 0x98, 0x56, 0x0b, 0x72, 0x1d, 0xa6, 0x76, 0x1d, 0xab, 0xdf, 0xa5, - 0x5e, 0xb5, 0x24, 0x16, 0x85, 0xd9, 0xb4, 0xb9, 0x7a, 0x4f, 0xb0, 0xd4, 0x4f, 0x2b, 0xf8, 0x29, - 0xf9, 0xee, 0xa1, 0x2f, 0x4b, 0x4c, 0x28, 0x5a, 0x66, 0xd7, 0x64, 0x9e, 0xb0, 0x96, 0x95, 0xc5, - 0xeb, 0x63, 0x7f, 0x96, 0x9c, 0xa2, 0x6b, 0x02, 0x4c, 0xce, 0x1a, 0xf9, 0x8c, 0x4a, 0x01, 0x31, - 0xa0, 0xe0, 0x19, 0xba, 0x25, 0xad, 0x69, 0x65, 0xf1, 0x6b, 0xe3, 0x4f, 0x1b, 0x8e, 0x52, 0x9f, - 0x51, 0xdf, 0x54, 0x10, 0xaf, 0x28, 0xb1, 0xc9, 0x2f, 0xc3, 0xa9, 0x58, 0x6f, 0x7a, 0xd5, 0x8a, - 0x68, 0x9d, 0x67, 0xd3, 0x5a, 0x27, 0xe0, 0xaa, 0x5f, 0x50, 0x60, 0xa7, 0x62, 0x23, 0xc4, 0xc3, - 0x04, 0x18, 0xb9, 0x0d, 0x25, 0xcf, 0x6c, 0x52, 0x43, 0x77, 0xbd, 0xea, 0xf4, 0x61, 0x80, 0xcf, - 0x28, 0xe0, 0x52, 0x43, 0x89, 0x61, 0x00, 0xa0, 0xdd, 0x87, 0x99, 0xa5, 0x3e, 0xdb, 0x71, 0x5c, - 0xf3, 0x1d, 0xe1, 0x59, 0x90, 0x55, 0x28, 0x30, 0xb1, 0x42, 0x48, 0xa7, 0xed, 0xb9, 0x34, 0x68, - 0xb9, 0x5a, 0xdf, 0xa6, 0x7b, 0xbe, 0x61, 0xad, 0x97, 0x79, 0x23, 0xc8, 0x15, 0x43, 0x8a, 0x6b, - 0x7f, 0x98, 0x81, 0x72, 0x5d, 0xf7, 0x4c, 0x83, 0xc3, 0x93, 0x65, 0xc8, 0xf7, 0x3d, 0xea, 0x1e, - 0x0d, 0x54, 0x58, 0xa5, 0x2d, 0x8f, 0xba, 0x28, 0x84, 0xc9, 0x5d, 0x28, 0xf5, 0x74, 0xcf, 0x7b, - 0xe0, 0xb8, 0x4d, 0x65, 0x59, 0x0f, 0x09, 0x24, 0x97, 0x7e, 0x25, 0x8a, 0x01, 0x88, 0x56, 0x81, - 0x72, 0xdd, 0xd2, 0x8d, 0xce, 0x8e, 0x63, 0x51, 0xed, 0x35, 0x28, 0xd6, 0xfb, 0xad, 0x16, 0x75, - 0x0f, 0x61, 0xe1, 0xe7, 0x21, 0xcf, 0xf6, 0x7a, 0x6a, 0xbd, 0x08, 0x56, 0xf7, 0xfc, 0xe6, 0x5e, - 0x8f, 0x3e, 0x1a, 0xd4, 0x40, 0xe2, 0xf0, 0x37, 0x14, 0x7c, 0xda, 0x8f, 0x33, 0x70, 0x4e, 0x16, - 0xaa, 0x55, 0x54, 0xae, 0x4f, 0x84, 0x42, 0xc1, 0xa5, 0x4d, 0xd3, 0x53, 0xed, 0xb2, 0x32, 0xf6, - 0x70, 0x44, 0x8e, 0xa2, 0x96, 0x43, 0xd1, 0x17, 0xa2, 0x00, 0x25, 0x3a, 0xe9, 0x43, 0xf9, 0x2d, - 0xca, 0x3c, 0xe6, 0x52, 0xbd, 0xab, 0x5a, 0xee, 0xe5, 0xb1, 0x55, 0xdd, 0xa2, 0xac, 0x21, 0x90, - 0xa2, 0xab, 0x6f, 0x50, 0x88, 0xa1, 0x26, 0xed, 0x27, 0x79, 0x28, 0x07, 0xa3, 0x90, 0x7c, 0x0e, - 0x0a, 0xc2, 0xdd, 0x53, 0xcd, 0x1a, 0x4c, 0x1d, 0xe1, 0x15, 0xa2, 0xa4, 0x91, 0xe7, 0x60, 0xca, - 0x70, 0xba, 0x5d, 0xdd, 0x6e, 0x0a, 0x17, 0xbe, 0x5c, 0xaf, 0x70, 0x8b, 0xb1, 0x2c, 0x8b, 0xd0, - 0xa7, 0x91, 0x4b, 0x90, 0xd7, 0xdd, 0xb6, 0xf4, 0xa6, 0xcb, 0x72, 0x9c, 0x2c, 0xb9, 0x6d, 0x0f, - 0x45, 0x29, 0xf9, 0x0a, 0xe4, 0xa8, 0xbd, 0x5b, 0xcd, 0x8f, 0x36, 0x49, 0xd7, 0xed, 0xdd, 0x7b, - 0xba, 0x5b, 0xaf, 0xa8, 0x3a, 0xe4, 0xae, 0xdb, 0xbb, 0xc8, 0x65, 0xc8, 0x1a, 0x4c, 0x51, 0x7b, - 0x77, 0xd5, 0x75, 0xba, 0xca, 0xcd, 0xfd, 0xec, 0x08, 0x71, 0xce, 0xa2, 0x56, 0xe7, 0xc0, 0xb0, - 0xa9, 0x62, 0xf4, 0x21, 0xc8, 0xd7, 0x61, 0x5a, 0xda, 0xb8, 0x75, 0xee, 0x32, 0x79, 0xd5, 0xa2, - 0x80, 0xac, 0x8d, 0x36, 0x92, 0x82, 0x2f, 0xdc, 0x56, 0x44, 0x0a, 0x3d, 0x8c, 0x41, 0x91, 0xaf, - 0x43, 0xd9, 0xdf, 0x31, 0x7a, 0x6a, 0x35, 0x48, 0xf5, 0xc8, 0x51, 0x31, 0x21, 0x7d, 0xbb, 0x6f, - 0xba, 0xb4, 0x4b, 0x6d, 0xe6, 0xd5, 0xcf, 0xfa, 0x3e, 0x9a, 0x4f, 0xf5, 0x30, 0x44, 0x23, 0xdb, - 0xc3, 0x5b, 0x0b, 0xe9, 0x17, 0x7f, 0x6e, 0xc4, 0x6c, 0x1b, 0x63, 0x5f, 0xf1, 0x06, 0x9c, 0x0e, - 0x7c, 0x7f, 0xe5, 0x3e, 0x4a, 0x4f, 0xf9, 0x05, 0x2e, 0x7e, 0x33, 0x4e, 0x7a, 0x34, 0xa8, 0x3d, - 0x9b, 0xe2, 0x40, 0x86, 0x0c, 0x98, 0x04, 0xd3, 0xfe, 0x2b, 0x0b, 0xc3, 0xcb, 0x7f, 0xbc, 0xd1, - 0x32, 0xc7, 0xdd, 0x68, 0xc9, 0x0f, 0x92, 0xc6, 0xe1, 0x9a, 0x12, 0x9b, 0xfc, 0xa3, 0xd2, 0x3a, - 0x26, 0x77, 0xdc, 0x1d, 0x33, 0xfe, 0xdc, 0xd1, 0xde, 0xcf, 0xc3, 0xa9, 0x15, 0x9d, 0x76, 0x1d, - 0xfb, 0xb1, 0xee, 0x4b, 0xe6, 0x89, 0x70, 0x5f, 0xae, 0x40, 0xc9, 0xa5, 0x3d, 0xcb, 0x34, 0x74, - 0x4f, 0x74, 0x96, 0xda, 0x23, 0xa2, 0x2a, 0xc3, 0x80, 0x3a, 0xc2, 0x6d, 0xcd, 0x3d, 0x91, 0x6e, - 0x6b, 0xfe, 0xa7, 0xef, 0xb6, 0x6a, 0xbf, 0x91, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4, - 0xc5, 0x8d, 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a, - 0x28, 0x7a, 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0x3b, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74, - 0x32, 0xd9, 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83, - 0x1a, 0x84, 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc, - 0x21, 0x0e, 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62, - 0x2f, 0x54, 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0xc8, 0xf3, 0x50, - 0x74, 0xec, 0xd5, 0xbe, 0x65, 0xa9, 0xd0, 0xc8, 0x29, 0xd5, 0x6e, 0xc5, 0xbb, 0xa2, 0x14, 0x15, - 0x55, 0xfb, 0xed, 0x0c, 0x40, 0xa8, 0x9d, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x27, 0x64, 0x5d, 0x7f, - 0xb8, 0x46, 0xed, 0x36, 0xdb, 0x11, 0xfd, 0x92, 0x97, 0xa6, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97, - 0xbc, 0x04, 0x67, 0x64, 0xd1, 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x6f, 0x33, 0x32, 0x28, 0x51, 0x4f, - 0xd0, 0x70, 0x88, 0x5b, 0xd3, 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e, - 0x10, 0x84, 0xa2, 0x15, 0x56, 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x37, 0x41, 0x0c, 0x32, 0x6c, 0xd9, - 0x2e, 0x65, 0x3a, 0x37, 0x40, 0x2b, 0x7d, 0x15, 0x25, 0x93, 0xad, 0x29, 0x6b, 0xab, 0x90, 0xb4, - 0x17, 0xe0, 0xec, 0x50, 0x3f, 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x69, 0xb9, 0xbf, - 0x20, 0x1c, 0xa4, 0xdb, 0xbc, 0x00, 0x65, 0xb9, 0xf6, 0xdf, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43, - 0x78, 0xc0, 0x8f, 0x77, 0xff, 0x7c, 0xf7, 0x23, 0x9b, 0xea, 0x7e, 0xf4, 0xa1, 0xd8, 0x79, 0x10, - 0xb8, 0x27, 0x95, 0xc5, 0xf5, 0xf1, 0x47, 0xac, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x83, 0x8e, - 0x41, 0x67, 0xdf, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, 0x84, 0xed, 0x48, 0x51, - 0x8e, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xd7, 0x75, 0x5c, 0xe9, 0xd5, 0x90, 0x8b, 0x90, 0x73, - 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0x9b, 0x78, 0xdc, 0xd8, 0x42, 0x5e, 0x46, 0x5e, 0x85, 0x52, 0x53, - 0xf5, 0x81, 0xf2, 0x26, 0x8f, 0xda, 0x73, 0xc2, 0xce, 0xfa, 0x6f, 0x18, 0xa0, 0x71, 0xf7, 0xaf, - 0xeb, 0xb5, 0x1b, 0xe6, 0x3b, 0xd2, 0xb8, 0x16, 0xa4, 0xfb, 0xb7, 0x2e, 0x8b, 0xd0, 0xa7, 0x71, - 0xc3, 0xdd, 0xa1, 0x7b, 0xcb, 0xdc, 0x13, 0x12, 0xb3, 0x53, 0x19, 0xee, 0xdb, 0xaa, 0x0c, 0x03, - 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, 0x05, 0xea, 0xf3, 0xb5, - 0xef, 0x64, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0xba, 0xb5, 0x42, 0x7b, 0x96, 0xb3, 0xc7, 0x97, 0x7b, - 0xa4, 0x6f, 0x93, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x47, 0x5e, 0x8d, 0x86, 0xcb, - 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, 0x09, 0x5d, 0xde, 0xec, - 0x01, 0x2e, 0x6f, 0x03, 0xa0, 0x17, 0x3a, 0x0d, 0x39, 0xc1, 0xf9, 0xb3, 0xbe, 0x9a, 0xa3, 0xf8, - 0x0b, 0x11, 0x98, 0x49, 0x96, 0xf1, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca, 0x02, 0x8f, 0x5e, 0xed, - 0x58, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x2f, 0x03, 0x45, 0x4b, 0xdf, 0xa6, 0x96, 0x27, 0x66, - 0x53, 0x65, 0xf1, 0xcd, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, 0x43, 0x62, 0xc0, 0xcb, - 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, 0xc3, 0x71, 0x99, 0x5a, - 0xc1, 0x83, 0xc8, 0xf9, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, 0x2c, 0x93, 0xda, 0x4c, - 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, 0xaa, 0xba, 0x8e, 0x6d, - 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, 0x31, 0xca, 0x5c, 0xd3, - 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, 0xe4, 0xfb, 0x8f, 0x34, - 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, 0xd5, 0xa0, 0xcc, 0xef, - 0xc0, 0x2f, 0x41, 0x45, 0x45, 0x9c, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, 0x23, 0x24, 0x61, 0x94, - 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xb9, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, 0x55, 0xf0, 0x50, 0x7d, - 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0xfe, 0xf9, 0x1d, 0x9f, 0x80, - 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, 0x46, 0x5d, 0x29, 0x9b, - 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xd6, 0xe1, 0x9c, 0x21, - 0x03, 0xce, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x33, 0xba, 0x3c, 0xcc, 0x82, - 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6, - 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, 0x3b, 0x32, 0x36, 0x13, - 0xc9, 0x67, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xb3, 0xb2, 0xfc, 0xba, - 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91, - 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x05, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, 0x04, 0xac, 0xcc, 0x6e, - 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, 0xee, 0xed, 0x1a, 0xfc, - 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0xb9, 0x8c, 0x72, 0xfd, 0x19, 0x7f, 0x33, 0xb8, - 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0xa1, 0x8f, 0xea, 0x29, - 0x99, 0xfd, 0xf1, 0x23, 0x03, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, 0x8f, 0x47, 0x72, 0x31, - 0x14, 0xb1, 0xa3, 0x84, 0xd9, 0x7f, 0x37, 0x69, 0xf6, 0x5f, 0x9f, 0x64, 0xfa, 0xa7, 0x68, 0x38, - 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x91, 0x2e, 0xb9, 0xe3, 0x88, 0x58, 0xfe, 0x20, 0xc7, 0x86, - 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, 0x6a, 0xc5, 0xe1, 0xe4, - 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, 0x1a, 0xff, 0x5f, 0xca, - 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xbd, 0xa4, 0xd9, 0x7e, 0x73, 0xf2, 0x7e, 0x1b, - 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61, 0x40, 0xc1, 0x08, 0x17, - 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22, 0xc6, 0x79, 0x47, 0x9a, - 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x7e, 0x57, 0xe2, 0x15, 0xe3, 0x29, 0xde, 0x9b, - 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e, 0x8d, 0x3f, 0x94, 0xc9, - 0x9b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3, 0x0a, 0xf8, 0x22, 0x8e, - 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd, 0x1a, 0xbd, 0x30, 0x2c, - 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb, 0xa2, 0x4d, 0x95, 0xe2, - 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab, 0xa7, 0x8f, 0x68, 0xab, - 0x6f, 0x88, 0xe0, 0x50, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x1c, 0x5a, 0x58, 0x4e, 0x32, 0xe0, - 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a, 0xb1, 0x54, 0xa6, 0xf0, - 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0, 0xe9, 0xb8, 0x93, 0xf2, - 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x9d, 0x85, 0x73, 0x37, 0xa8, 0x4a, 0xa2, - 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x9b, 0x85, 0xa9, 0x1b, 0xae, 0xd3, - 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41, 0xc6, 0x3f, 0x2f, 0x20, - 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8, 0x1e, 0x95, 0xd9, 0xb3, - 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x0b, 0xa6, 0x3c, 0xe6, 0xb8, 0xbe, 0x91, - 0x9e, 0x24, 0xf2, 0xb5, 0x51, 0x7f, 0xa5, 0x21, 0xa1, 0xe4, 0x46, 0x5e, 0xbd, 0xa0, 0xaf, 0x40, - 0xfb, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42, 0x5e, 0xef, 0x07, 0xe1, - 0xa0, 0xd5, 0xf1, 0xc3, 0xc3, 0xd1, 0x8c, 0xa6, 0x8a, 0xcf, 0xf4, 0xd9, 0x0e, 0x0a, 0x74, 0xf2, - 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0x81, 0xa3, 0x56, 0x51, 0xf4, 0xe9, 0xda, 0x8f, - 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0x4b, 0xe0, 0x91, 0x5f, 0x19, 0x3a, - 0xdf, 0xf6, 0x33, 0x87, 0x0b, 0x82, 0xc8, 0xe3, 0x51, 0xeb, 0x94, 0xe9, 0xa1, 0x6d, 0x0a, 0xcb, - 0x22, 0x87, 0xda, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6, 0xd8, 0xad, 0x91, 0xfe, - 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x0d, 0x28, 0x7a, 0x4c, 0x67, - 0x7d, 0x3f, 0xe0, 0xba, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5, 0x3b, 0x2a, 0xa5, 0xda, - 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xd2, 0x50, 0xb3, 0x1f, 0x32, 0xf6, - 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0xd9, 0x70, 0xbf, 0x24, 0xd2, 0xe4, 0x0c, 0x0a, 0x26, 0xa3, 0x5d, - 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a, 0x65, 0xda, 0xfb, 0xd9, - 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0x24, 0xf1, 0xed, 0xc9, 0x92, 0xc4, 0xf1, 0x0a, 0x0d, - 0xe7, 0x8a, 0x7f, 0x6d, 0x38, 0x57, 0x7c, 0x77, 0xf2, 0x5c, 0x71, 0xa2, 0x19, 0x46, 0xa6, 0x8c, - 0xbf, 0x9d, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c, 0xd4, 0x56, 0x1e, 0x3c, - 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2, 0x5b, 0xd8, 0xe0, 0x85, - 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59, 0xba, 0xd4, 0xf3, 0x42, - 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94, 0x7b, 0x46, 0x95, 0x5e, - 0x18, 0x3f, 0x17, 0x96, 0x72, 0xae, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50, 0xba, 0x82, 0x73, 0x0b, - 0x85, 0xf4, 0x73, 0x0b, 0x91, 0x05, 0x56, 0x9e, 0x5b, 0xf8, 0xfb, 0x12, 0x5c, 0x48, 0xef, 0x43, - 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xbe, 0x47, 0x16, 0xa3, 0x4f, - 0xff, 0x54, 0xe7, 0xd9, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9, 0x24, 0x72, 0x6d, 0xcf, - 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8, 0x76, 0x13, 0x7e, 0xf6, - 0x09, 0x9e, 0xb0, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3, 0x91, 0x35, 0x21, 0xbf, - 0x0e, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x1f, 0xb2, 0x1b, 0x7f, 0xf4, 0x6f, 0x84, - 0x58, 0x0d, 0xe6, 0xea, 0x8c, 0xb6, 0xf7, 0x54, 0xf2, 0x2c, 0x24, 0x60, 0x54, 0xe3, 0x13, 0x7e, - 0xa4, 0xee, 0x0a, 0x94, 0x3c, 0xca, 0x98, 0x69, 0xb7, 0x3d, 0xb1, 0x7b, 0x2b, 0xcb, 0xb9, 0xd2, - 0x50, 0x65, 0x18, 0x50, 0xc9, 0xff, 0x87, 0xb2, 0x88, 0xfb, 0x2c, 0xb9, 0x6d, 0xaf, 0x5a, 0x16, - 0x99, 0x28, 0x61, 0x57, 0x1b, 0x7e, 0x21, 0x86, 0x74, 0xf2, 0x02, 0x4c, 0xcb, 0x6c, 0x9c, 0x3a, - 0x5a, 0x2b, 0xf7, 0x58, 0x67, 0xf6, 0x07, 0xb5, 0xe9, 0x7a, 0xa4, 0x1c, 0x63, 0x5c, 0x7c, 0x3f, - 0x45, 0x83, 0xe0, 0x58, 0x72, 0x3f, 0x15, 0x86, 0xcd, 0x30, 0xc2, 0x45, 0x9e, 0x85, 0x1c, 0xb3, - 0x3c, 0xb1, 0x87, 0x2a, 0x85, 0x7e, 0xef, 0xe6, 0x5a, 0x03, 0x79, 0xb9, 0xf6, 0x3f, 0x19, 0x38, - 0x9d, 0x38, 0x41, 0xc4, 0x45, 0xfa, 0xae, 0xa5, 0xcc, 0x48, 0x20, 0xb2, 0x85, 0x6b, 0xc8, 0xcb, - 0xc9, 0x9b, 0xca, 0x2b, 0xcc, 0x4e, 0x78, 0x8b, 0xe0, 0x8e, 0xce, 0x3c, 0xee, 0x06, 0x0e, 0x39, - 0x84, 0xd7, 0x12, 0x8d, 0x93, 0x8b, 0xc7, 0xda, 0x0e, 0x6e, 0xa0, 0xc8, 0x86, 0x33, 0x7f, 0x98, - 0x0d, 0xa7, 0xf6, 0xb7, 0x39, 0xa8, 0xdc, 0x72, 0xb6, 0x3f, 0x25, 0x67, 0x24, 0xd2, 0x2d, 0x72, - 0xf6, 0xa7, 0x68, 0x91, 0xb7, 0xe0, 0x19, 0xc6, 0xf8, 0xae, 0xdf, 0xb1, 0x9b, 0xde, 0x52, 0x8b, - 0x51, 0x77, 0xd5, 0xb4, 0x4d, 0x6f, 0x87, 0x36, 0x55, 0xe4, 0xee, 0x33, 0xfb, 0x83, 0xda, 0x33, - 0x9b, 0x9b, 0x6b, 0x69, 0x2c, 0x38, 0x4a, 0x56, 0xcc, 0x10, 0xdd, 0xe8, 0x38, 0xad, 0x96, 0xcc, - 0x6c, 0xcb, 0x1c, 0x8f, 0x9c, 0x21, 0x91, 0x72, 0x8c, 0x71, 0x69, 0x1f, 0x65, 0xa0, 0x7c, 0x5b, - 0x6f, 0x75, 0xf4, 0x86, 0x69, 0x77, 0xc8, 0x73, 0x30, 0xb5, 0xed, 0x3a, 0x1d, 0xea, 0x7a, 0x2a, - 0xd3, 0x2c, 0x76, 0x3d, 0x75, 0x59, 0x84, 0x3e, 0x8d, 0x6f, 0xc3, 0x98, 0xd3, 0x33, 0x8d, 0xe4, - 0x86, 0x75, 0x93, 0x17, 0xa2, 0xa4, 0x91, 0xfb, 0x72, 0x1e, 0xe5, 0x26, 0x3c, 0x82, 0xbd, 0xb9, - 0xd6, 0x90, 0xd9, 0x5b, 0x7f, 0x06, 0x92, 0xe7, 0x63, 0x9e, 0x47, 0x79, 0x94, 0xaf, 0xa0, 0x7d, - 0x2f, 0x0b, 0x15, 0xf9, 0x69, 0x72, 0x73, 0x76, 0x9c, 0x1f, 0xf7, 0xa2, 0x88, 0xae, 0x7b, 0xfd, - 0x2e, 0x75, 0xc5, 0x26, 0x58, 0x4d, 0xb9, 0x68, 0xb4, 0x24, 0x24, 0x06, 0x11, 0xf6, 0xb0, 0xc8, - 0x6f, 0x9d, 0xfc, 0x09, 0xb6, 0x4e, 0xe1, 0xc0, 0xd6, 0xf9, 0xb3, 0x0c, 0x94, 0xd7, 0xcc, 0x16, - 0x35, 0xf6, 0x0c, 0x8b, 0x92, 0x57, 0xa1, 0xda, 0xa4, 0x16, 0x65, 0xf4, 0x86, 0xab, 0x1b, 0x74, - 0x83, 0xba, 0xa6, 0xb8, 0x70, 0xc3, 0x47, 0x99, 0x98, 0xc7, 0x05, 0xb9, 0x5c, 0xae, 0x8c, 0xe0, - 0xc1, 0x91, 0xd2, 0xe4, 0x26, 0x4c, 0x37, 0xa9, 0x67, 0xba, 0xb4, 0xb9, 0x11, 0xf1, 0x46, 0x9f, - 0xf3, 0x6d, 0xd3, 0x4a, 0x84, 0xf6, 0x68, 0x50, 0x9b, 0xd9, 0x30, 0x7b, 0xd4, 0x32, 0x6d, 0x2a, - 0xdd, 0xd2, 0x98, 0xa8, 0x56, 0x80, 0xdc, 0x9a, 0xd3, 0xd6, 0xde, 0xcf, 0x41, 0x70, 0x85, 0x8a, - 0xfc, 0x66, 0x06, 0x2a, 0xba, 0x6d, 0x3b, 0x4c, 0x5d, 0x4f, 0x92, 0xb1, 0x7d, 0x9c, 0xf8, 0xa6, - 0xd6, 0xfc, 0x52, 0x08, 0x2a, 0xc3, 0xc2, 0x41, 0xa8, 0x3a, 0x42, 0xc1, 0xa8, 0x6e, 0xd2, 0x4f, - 0x44, 0xaa, 0xd7, 0x27, 0xaf, 0xc5, 0x21, 0xe2, 0xd2, 0xb3, 0x5f, 0x83, 0x33, 0xc9, 0xca, 0x1e, - 0x25, 0xb0, 0x35, 0x49, 0x4c, 0xec, 0xdd, 0x32, 0x54, 0xee, 0xe8, 0xcc, 0xdc, 0xa5, 0x62, 0x0b, - 0x76, 0x32, 0x3e, 0xf5, 0x1f, 0x64, 0xe0, 0x42, 0x3c, 0x66, 0x7c, 0x82, 0x8e, 0xf5, 0xec, 0xfe, - 0xa0, 0x76, 0x01, 0x53, 0xb5, 0xe1, 0x88, 0x5a, 0x08, 0x17, 0x7b, 0x28, 0x04, 0x7d, 0xd2, 0x2e, - 0x76, 0x63, 0x94, 0x42, 0x1c, 0x5d, 0x97, 0x4f, 0x8b, 0x8b, 0xfd, 0x64, 0x5f, 0x69, 0x49, 0x6c, - 0x00, 0xa6, 0x9e, 0x98, 0x0d, 0x40, 0xe9, 0x89, 0x70, 0xb8, 0x7a, 0x91, 0x0d, 0x40, 0x79, 0xc2, - 0x38, 0xa8, 0x4a, 0xb3, 0x4a, 0xb4, 0x51, 0x1b, 0x09, 0x71, 0xf8, 0xcd, 0xf7, 0x8d, 0x89, 0x01, - 0x85, 0x6d, 0xdd, 0x33, 0x0d, 0xe5, 0x7e, 0xd6, 0xc7, 0x0f, 0x4b, 0xf8, 0x77, 0x3f, 0x64, 0x8c, - 0x49, 0xbc, 0xa2, 0xc4, 0x0e, 0xef, 0x98, 0x64, 0x27, 0xba, 0x63, 0x42, 0x96, 0x21, 0x6f, 0x73, - 0x63, 0x9b, 0x3b, 0xf2, 0xad, 0x92, 0x3b, 0xb7, 0xe9, 0x1e, 0x0a, 0x61, 0xed, 0x87, 0x59, 0x00, - 0xfe, 0xf9, 0xca, 0xcd, 0x79, 0xcc, 0x66, 0xe4, 0xf3, 0x30, 0xe5, 0xf5, 0x45, 0xb4, 0x56, 0x2d, - 0xc5, 0x61, 0xf0, 0x58, 0x16, 0xa3, 0x4f, 0xe7, 0x9e, 0xd0, 0xdb, 0x7d, 0xda, 0xf7, 0x63, 0x41, - 0x81, 0x27, 0xf4, 0x0a, 0x2f, 0x44, 0x49, 0x3b, 0x39, 0x47, 0xc6, 0xdf, 0x35, 0x15, 0x4e, 0x68, - 0xd7, 0xa4, 0x7d, 0x33, 0x0b, 0x10, 0x06, 0xf8, 0xc9, 0xf7, 0x33, 0x70, 0x3e, 0x98, 0x65, 0x4c, - 0xde, 0x5c, 0x58, 0xb6, 0x74, 0xb3, 0x3b, 0xf1, 0x46, 0x26, 0x6d, 0x86, 0x0b, 0xb3, 0xb3, 0x91, - 0xa6, 0x0e, 0xd3, 0x6b, 0x41, 0x10, 0x4a, 0xb4, 0xdb, 0x63, 0x7b, 0x2b, 0xa6, 0xab, 0x86, 0x5d, - 0xea, 0xd1, 0xff, 0xeb, 0x8a, 0x47, 0x8a, 0xaa, 0x1b, 0x1e, 0x62, 0xe6, 0xf8, 0x14, 0x0c, 0x70, - 0xb4, 0xef, 0x66, 0xe1, 0x5c, 0x4a, 0xed, 0xc8, 0x4b, 0x70, 0x46, 0x65, 0x38, 0xc2, 0xeb, 0xbb, - 0x99, 0xf0, 0xfa, 0x6e, 0x23, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x26, 0x80, 0x6e, 0x18, 0xd4, 0xf3, - 0xd6, 0x9d, 0xa6, 0xef, 0xf4, 0xbd, 0xc8, 0x37, 0x95, 0x4b, 0x41, 0xe9, 0xa3, 0x41, 0xed, 0x8b, - 0x69, 0xa9, 0xaa, 0xc4, 0xd7, 0x87, 0x02, 0x18, 0x81, 0x24, 0x6f, 0x00, 0xc8, 0xfb, 0x24, 0xc1, - 0x61, 0xcb, 0xc7, 0x44, 0xd2, 0xe7, 0xfd, 0xbb, 0x0e, 0xf3, 0xaf, 0xf4, 0x75, 0x9b, 0x99, 0x6c, - 0x4f, 0x1e, 0x9f, 0xbe, 0x17, 0xa0, 0x60, 0x04, 0x51, 0xfb, 0xeb, 0x2c, 0x94, 0x7c, 0x67, 0xf4, - 0x13, 0xc8, 0x95, 0xb4, 0x63, 0xb9, 0x92, 0xf1, 0x2f, 0x10, 0xfa, 0x55, 0x1e, 0x99, 0x1d, 0x71, - 0x12, 0xd9, 0x91, 0x1b, 0x93, 0xab, 0x3a, 0x38, 0x1f, 0xf2, 0x83, 0x2c, 0x9c, 0xf2, 0x59, 0xd5, - 0x39, 0xee, 0x2f, 0xc3, 0x8c, 0x4b, 0xf5, 0x66, 0x5d, 0x67, 0xc6, 0x8e, 0xe8, 0x3e, 0x79, 0x8a, - 0xfb, 0xec, 0xfe, 0xa0, 0x36, 0x83, 0x51, 0x02, 0xc6, 0xf9, 0xd2, 0x0e, 0x80, 0x67, 0x27, 0x3c, - 0x00, 0x9e, 0x3b, 0xca, 0x01, 0x70, 0xa2, 0x43, 0x85, 0xd7, 0x68, 0xd3, 0xec, 0x52, 0xa7, 0xef, - 0xff, 0xb1, 0xe0, 0xa8, 0x87, 0x87, 0xc5, 0xea, 0x8e, 0x21, 0x0c, 0x46, 0x31, 0xb5, 0x7f, 0xc8, - 0xc0, 0x74, 0xd8, 0x5e, 0x27, 0x9e, 0x31, 0x6a, 0xc5, 0x33, 0x46, 0x4b, 0x13, 0x0f, 0x87, 0x11, - 0x39, 0xa2, 0xdf, 0x2b, 0x86, 0x9f, 0x25, 0xb2, 0x42, 0xdb, 0x30, 0x6b, 0xa6, 0x26, 0x4a, 0x22, - 0xd6, 0x26, 0x38, 0x04, 0x77, 0x73, 0x24, 0x27, 0x1e, 0x80, 0x42, 0xfa, 0x50, 0xda, 0xa5, 0x2e, - 0x33, 0x0d, 0xea, 0x7f, 0xdf, 0x8d, 0x89, 0xbd, 0x23, 0x79, 0x00, 0x20, 0x6c, 0xd3, 0x7b, 0x4a, - 0x01, 0x06, 0xaa, 0xc8, 0x36, 0x14, 0x68, 0xb3, 0x4d, 0xfd, 0xf3, 0xf3, 0x5f, 0x9d, 0xe8, 0xe6, - 0x45, 0xd8, 0x9e, 0xfc, 0xcd, 0x43, 0x09, 0x4d, 0x3c, 0x28, 0x5b, 0xfe, 0xf6, 0x5d, 0x8d, 0xc3, - 0xf1, 0x7d, 0x9d, 0x20, 0x10, 0x10, 0x1e, 0x42, 0x0d, 0x8a, 0x30, 0xd4, 0x43, 0x3a, 0xc1, 0x9d, - 0x92, 0xc2, 0x31, 0x19, 0x8f, 0x03, 0xee, 0x95, 0x78, 0x50, 0x7e, 0xa0, 0x33, 0xea, 0x76, 0x75, - 0xb7, 0xa3, 0x1c, 0xff, 0xf1, 0xbf, 0xf0, 0xbe, 0x8f, 0x14, 0x7e, 0x61, 0x50, 0x84, 0xa1, 0x1e, - 0xe2, 0x40, 0x99, 0x29, 0x4f, 0xd6, 0xbf, 0x96, 0x38, 0xbe, 0x52, 0xdf, 0x27, 0xf6, 0x64, 0x60, - 0x3b, 0x78, 0xc5, 0x50, 0x87, 0xf6, 0x28, 0x17, 0x9a, 0xc7, 0x4f, 0x3a, 0x45, 0xf8, 0x42, 0x3c, - 0x45, 0x38, 0x97, 0x4c, 0x11, 0x26, 0xa2, 0x31, 0x47, 0x4f, 0x12, 0xea, 0x50, 0xb1, 0x74, 0x8f, - 0x6d, 0xf5, 0x9a, 0x3a, 0x53, 0xf1, 0xe5, 0xca, 0xe2, 0xff, 0x3b, 0x9c, 0xf5, 0xe2, 0xf6, 0x30, - 0x0c, 0xba, 0xac, 0x85, 0x30, 0x18, 0xc5, 0x24, 0x57, 0xa1, 0xb2, 0x2b, 0x66, 0xa4, 0xbc, 0x4d, - 0x51, 0x10, 0xe6, 0x5c, 0x58, 0xd8, 0x7b, 0x61, 0x31, 0x46, 0x79, 0xb8, 0x88, 0xf4, 0x04, 0xa4, - 0x48, 0x31, 0x14, 0x69, 0x84, 0xc5, 0x18, 0xe5, 0x11, 0xb9, 0x0a, 0xd3, 0xee, 0x48, 0x81, 0x29, - 0x21, 0x20, 0x73, 0x15, 0x7e, 0x21, 0x86, 0x74, 0x72, 0x05, 0x4a, 0xfd, 0x66, 0x4b, 0xf2, 0x96, - 0x04, 0xaf, 0xf0, 0xbf, 0xb6, 0x56, 0x56, 0xd5, 0xed, 0x0e, 0x9f, 0xaa, 0xfd, 0x67, 0x06, 0xc8, - 0x70, 0x52, 0x9b, 0xec, 0x40, 0xd1, 0x16, 0x51, 0x95, 0x89, 0xaf, 0x55, 0x47, 0x82, 0x33, 0x72, - 0x8e, 0xa9, 0x02, 0x85, 0x4f, 0x6c, 0x28, 0xd1, 0x87, 0x8c, 0xba, 0xb6, 0x6e, 0x29, 0xd7, 0xe3, - 0x78, 0xae, 0x70, 0x4b, 0x87, 0x53, 0x21, 0x63, 0xa0, 0x43, 0xfb, 0x71, 0x16, 0x2a, 0x11, 0xbe, - 0xc7, 0x6d, 0x56, 0xc4, 0x99, 0x51, 0x19, 0xcc, 0xd8, 0x72, 0x2d, 0x35, 0x4c, 0x23, 0x67, 0x46, - 0x15, 0x09, 0xd7, 0x30, 0xca, 0x47, 0x16, 0x01, 0xba, 0xba, 0xc7, 0xa8, 0x2b, 0x96, 0x92, 0xc4, - 0x49, 0xcd, 0xf5, 0x80, 0x82, 0x11, 0x2e, 0x72, 0x59, 0x5d, 0xf0, 0xcf, 0xc7, 0x2f, 0x4d, 0x8d, - 0xb8, 0xbd, 0x5f, 0x38, 0x86, 0xdb, 0xfb, 0xa4, 0x0d, 0x67, 0xfc, 0x5a, 0xfb, 0x54, 0x65, 0xe7, - 0x0e, 0x09, 0x2c, 0x9d, 0xf1, 0x04, 0x04, 0x0e, 0x81, 0x6a, 0x3f, 0xcc, 0xc0, 0x4c, 0x6c, 0x2b, - 0xcd, 0xb7, 0x76, 0xe1, 0x91, 0x8c, 0xc8, 0xd6, 0x2e, 0x76, 0x92, 0xe2, 0x79, 0x28, 0xca, 0x06, - 0x52, 0x0d, 0x1f, 0x98, 0x11, 0xd9, 0x84, 0xa8, 0xa8, 0xdc, 0x20, 0xa8, 0x60, 0x5d, 0xd2, 0x20, - 0xa8, 0x68, 0x1e, 0xfa, 0x74, 0xf2, 0x05, 0x28, 0xf9, 0xb5, 0x53, 0x2d, 0x1d, 0xfe, 0xdb, 0x41, - 0x95, 0x63, 0xc0, 0xa1, 0x7d, 0xab, 0x00, 0xf2, 0xc7, 0x14, 0x5c, 0xae, 0x69, 0x7a, 0x32, 0x4b, - 0x95, 0x11, 0x59, 0xaa, 0x40, 0x6e, 0x45, 0x95, 0x63, 0xc0, 0x41, 0x2e, 0x42, 0xae, 0x6b, 0xda, - 0x2a, 0xac, 0x28, 0x76, 0x95, 0xeb, 0xa6, 0x8d, 0xbc, 0x4c, 0x90, 0xf4, 0x87, 0x2a, 0xd1, 0x22, - 0x49, 0xfa, 0x43, 0xe4, 0x65, 0xdc, 0xb9, 0xb4, 0x1c, 0xa7, 0xb3, 0xad, 0x1b, 0x1d, 0x3f, 0xf4, - 0x9d, 0x17, 0xb3, 0x57, 0x38, 0x97, 0x6b, 0x71, 0x12, 0x26, 0x79, 0xb9, 0xb8, 0xe1, 0x38, 0x56, - 0xd3, 0x79, 0x60, 0xfb, 0xe2, 0x85, 0x50, 0x7c, 0x39, 0x4e, 0xc2, 0x24, 0x2f, 0xd9, 0x82, 0x67, - 0xde, 0xa1, 0xae, 0xa3, 0x5a, 0xac, 0x61, 0x51, 0xda, 0xf3, 0x61, 0xa4, 0x81, 0x12, 0x59, 0xa1, - 0xd7, 0xd2, 0x59, 0x70, 0x94, 0xac, 0x48, 0x36, 0xe9, 0x6e, 0x9b, 0xb2, 0x0d, 0xd7, 0xe1, 0x7b, - 0x27, 0xd3, 0x6e, 0xfb, 0xb0, 0x53, 0x21, 0xec, 0x66, 0x3a, 0x0b, 0x8e, 0x92, 0x25, 0xeb, 0x70, - 0x56, 0x92, 0x22, 0x3e, 0xb3, 0xb2, 0x75, 0xb5, 0xfd, 0x41, 0xed, 0x33, 0x2b, 0xb4, 0xe7, 0x52, - 0x83, 0x1b, 0xe8, 0xcd, 0x24, 0x1b, 0x0e, 0x4b, 0x8a, 0xdf, 0x45, 0xa9, 0x70, 0xef, 0x06, 0x75, - 0x45, 0x97, 0x8b, 0xd8, 0x91, 0x72, 0xcc, 0x31, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x2a, 0x54, 0xa3, - 0xb0, 0x4b, 0xbb, 0xba, 0x69, 0xe9, 0xdb, 0xa6, 0x65, 0xb2, 0x3d, 0x91, 0x2b, 0x9e, 0x91, 0xc1, - 0xc8, 0xcd, 0x11, 0x3c, 0x38, 0x52, 0x5a, 0xfb, 0xfd, 0x1c, 0x88, 0x3f, 0x0b, 0x91, 0xfb, 0x90, - 0xb3, 0x9c, 0xb6, 0x32, 0xc9, 0xe3, 0x47, 0x3a, 0xd6, 0x9c, 0xb6, 0x1c, 0x78, 0x6b, 0x4e, 0x1b, - 0x39, 0x22, 0x31, 0xa0, 0xd0, 0xd1, 0x5b, 0x1d, 0x5d, 0x59, 0xe0, 0xf1, 0xfd, 0x8d, 0x20, 0x91, - 0xa7, 0x6e, 0x88, 0xf2, 0x57, 0x94, 0xd8, 0xdc, 0xb1, 0xd9, 0xf6, 0x7f, 0x15, 0xa2, 0xb6, 0x7e, - 0x13, 0xc4, 0xc6, 0x7c, 0x24, 0xb9, 0x0a, 0x06, 0xaf, 0x18, 0xea, 0x20, 0x06, 0x14, 0xfb, 0x4d, - 0xf1, 0x87, 0xa7, 0xfc, 0x84, 0x5e, 0xcc, 0xd6, 0x8a, 0xf8, 0x26, 0xb1, 0x7e, 0xc9, 0x67, 0x54, - 0xd0, 0xda, 0x9f, 0x67, 0x60, 0xa6, 0x61, 0x99, 0x4d, 0xd3, 0x6e, 0x9f, 0xdc, 0x9d, 0x5c, 0x72, - 0x17, 0x0a, 0x9e, 0x65, 0x36, 0xe9, 0x98, 0x97, 0x45, 0x45, 0x67, 0xf0, 0x5a, 0x52, 0x94, 0x38, - 0xda, 0x9f, 0xe4, 0x41, 0xfd, 0x0e, 0x8b, 0xf4, 0xa1, 0xdc, 0xf6, 0x6f, 0xae, 0xaa, 0x2a, 0xbf, - 0x3c, 0xc1, 0x0d, 0x87, 0xd8, 0x1d, 0x58, 0xd9, 0x3b, 0x41, 0x21, 0x86, 0x9a, 0x08, 0x8d, 0x8f, - 0xb9, 0x95, 0x09, 0xc7, 0x9c, 0x54, 0x37, 0x3c, 0xea, 0x74, 0xc8, 0xef, 0x30, 0xd6, 0x9b, 0xf8, - 0x20, 0x6e, 0x78, 0xc6, 0x56, 0x86, 0xf1, 0xf8, 0x3b, 0x0a, 0x68, 0xae, 0xc2, 0xd6, 0x8f, 0xe1, - 0x96, 0x7b, 0x18, 0x42, 0x55, 0x11, 0x56, 0x9d, 0x79, 0x28, 0xa0, 0xc9, 0xaf, 0x42, 0x85, 0xb9, - 0xba, 0xed, 0xb5, 0x1c, 0xb7, 0x4b, 0x5d, 0xb5, 0xf8, 0xaf, 0x4e, 0x30, 0x9e, 0x37, 0x43, 0x34, - 0x19, 0xf5, 0x88, 0x15, 0x61, 0x54, 0x9b, 0xd6, 0x05, 0xe5, 0xb6, 0x13, 0x23, 0xf6, 0x37, 0x01, - 0x99, 0xe9, 0x5c, 0x38, 0xdc, 0x58, 0x0c, 0xee, 0x92, 0x47, 0xee, 0xd6, 0xa5, 0xfe, 0x36, 0x40, - 0xfb, 0xa7, 0x2c, 0xe4, 0x36, 0xd7, 0x1a, 0xf2, 0xaa, 0x88, 0xf8, 0xb9, 0x06, 0x6d, 0x74, 0xcc, - 0xde, 0x3d, 0xea, 0x9a, 0xad, 0x3d, 0xb5, 0xf6, 0x46, 0xae, 0x8a, 0x24, 0x39, 0x30, 0x45, 0x8a, - 0xbc, 0x0e, 0xd3, 0x86, 0xbe, 0x4c, 0x5d, 0x26, 0x5d, 0x98, 0xa3, 0x45, 0xcd, 0xc5, 0x09, 0x86, - 0xe5, 0xa5, 0x50, 0x1c, 0x63, 0x60, 0x64, 0x0b, 0xc0, 0x08, 0xa1, 0x8f, 0x14, 0x49, 0x97, 0xbf, - 0x4f, 0x08, 0x81, 0x23, 0x40, 0x04, 0xa1, 0xdc, 0xe1, 0xac, 0x02, 0x35, 0x7f, 0x14, 0x54, 0x31, - 0xe9, 0x6e, 0xfb, 0xb2, 0x18, 0xc2, 0x68, 0xff, 0x9e, 0x81, 0x70, 0x13, 0x48, 0x3c, 0x28, 0x36, - 0xc5, 0xad, 0x6d, 0x35, 0xed, 0xc7, 0xdf, 0x4c, 0xc7, 0x7f, 0x5a, 0x52, 0x27, 0xfb, 0x83, 0x5a, - 0xe2, 0x47, 0x26, 0xa8, 0x54, 0x91, 0x36, 0xe4, 0xde, 0x72, 0xb6, 0x27, 0x9e, 0xf5, 0x91, 0xf3, - 0x3f, 0x72, 0xe7, 0x14, 0x29, 0x40, 0xae, 0x41, 0xfb, 0x56, 0x16, 0x2a, 0x91, 0x31, 0x3d, 0xf1, - 0x4f, 0x09, 0x1e, 0x26, 0x7e, 0x4a, 0xb0, 0x31, 0xfe, 0xae, 0x3c, 0xac, 0xd5, 0x49, 0xff, 0x97, - 0xe0, 0x6f, 0xb2, 0x90, 0xdb, 0x5a, 0x59, 0xe5, 0x8b, 0x6f, 0x70, 0x0e, 0x68, 0xe2, 0xc4, 0x54, - 0xf8, 0x5f, 0x34, 0x31, 0xd2, 0x82, 0x57, 0x0c, 0x75, 0x90, 0x1d, 0x98, 0xda, 0xee, 0x9b, 0x16, - 0x33, 0xed, 0x89, 0x4f, 0x9d, 0xf9, 0xff, 0x70, 0x50, 0xc7, 0x65, 0x24, 0x2a, 0xfa, 0xf0, 0xa4, - 0x0d, 0x53, 0x6d, 0x79, 0x0d, 0x44, 0xcd, 0xbd, 0x97, 0xc6, 0x5f, 0xbd, 0x24, 0x8e, 0x54, 0xa4, - 0x5e, 0xd0, 0x47, 0xd7, 0xbe, 0x01, 0x6a, 0xf1, 0x27, 0xde, 0xc9, 0xb4, 0x66, 0x10, 0x18, 0x4a, - 0x6b, 0x51, 0xed, 0x3f, 0x32, 0x10, 0xb7, 0xd2, 0x9f, 0x7c, 0xa7, 0x76, 0x92, 0x9d, 0xba, 0x72, - 0x1c, 0x73, 0x20, 0xbd, 0x5f, 0xb5, 0xbf, 0xca, 0x42, 0x51, 0xfd, 0x30, 0xf4, 0xe4, 0xb3, 0x1f, - 0x34, 0x96, 0xfd, 0x58, 0x9e, 0xf0, 0xf7, 0x89, 0x23, 0x73, 0x1f, 0xdd, 0x44, 0xee, 0x63, 0xd2, - 0xff, 0x34, 0x3e, 0x26, 0xf3, 0xf1, 0x77, 0x19, 0x38, 0x25, 0x19, 0x6f, 0xda, 0x1e, 0xd3, 0x6d, - 0x43, 0x38, 0xc5, 0x32, 0x12, 0x35, 0x71, 0x68, 0x4f, 0x85, 0xa1, 0x85, 0xbb, 0x2a, 0x9f, 0x51, - 0x41, 0xf3, 0xcd, 0xf2, 0x8e, 0xe3, 0x31, 0x61, 0x6e, 0xb3, 0xf1, 0x4d, 0xf6, 0xcb, 0xaa, 0x1c, - 0x03, 0x8e, 0xe4, 0xee, 0xbd, 0x30, 0x7a, 0xf7, 0xae, 0xfd, 0x69, 0x06, 0xa6, 0xa3, 0x7f, 0xa8, - 0x1c, 0x3f, 0x91, 0x93, 0xc8, 0xa3, 0x64, 0x4f, 0x20, 0x8f, 0xf2, 0x61, 0x06, 0xc0, 0xaf, 0xec, - 0x89, 0x67, 0x51, 0x9a, 0xf1, 0x2c, 0xca, 0xc4, 0xdd, 0x9a, 0x9e, 0x43, 0xf9, 0x41, 0xc1, 0xff, - 0x24, 0x91, 0x41, 0x79, 0x2f, 0x03, 0xa7, 0xf4, 0x58, 0x56, 0x62, 0x62, 0x4f, 0x22, 0x91, 0xe4, - 0x08, 0xfe, 0xe8, 0x19, 0x2f, 0xc7, 0x84, 0x5a, 0x72, 0x0d, 0xa6, 0x7b, 0x2a, 0x54, 0x7c, 0x27, - 0x1c, 0x75, 0xc1, 0x01, 0xe4, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x8f, 0xc9, 0x02, 0xe5, 0x8e, 0x25, - 0x0b, 0x14, 0x3d, 0x6a, 0x96, 0x3f, 0xf0, 0xa8, 0x99, 0x0d, 0xe5, 0x96, 0xeb, 0x74, 0x45, 0xa2, - 0x45, 0xfd, 0x3f, 0x71, 0xc2, 0xe4, 0x4d, 0xb0, 0xa8, 0xac, 0xfa, 0xb8, 0x18, 0xaa, 0xe0, 0xcb, - 0x34, 0x73, 0xa4, 0xb6, 0xe2, 0x71, 0x68, 0x0b, 0xa6, 0xee, 0xa6, 0x44, 0x45, 0x1f, 0x3e, 0x9e, - 0x4c, 0x99, 0xfa, 0x64, 0x92, 0x29, 0xda, 0x3f, 0x66, 0x7d, 0x7b, 0xd1, 0x48, 0xdc, 0x49, 0xca, - 0x8c, 0xb8, 0x93, 0xa4, 0x6e, 0xd7, 0x46, 0xd3, 0x0d, 0xcf, 0x43, 0xd1, 0xa5, 0xba, 0xe7, 0xd8, - 0xc9, 0x7f, 0x85, 0xa1, 0x28, 0x45, 0x45, 0x8d, 0xa6, 0x25, 0xb2, 0x8f, 0x49, 0x4b, 0x7c, 0x21, - 0x32, 0x20, 0x64, 0xfe, 0x37, 0x98, 0xdb, 0x29, 0x83, 0x42, 0xc4, 0x2c, 0xd5, 0x6f, 0xf9, 0x0b, - 0xc9, 0x98, 0xa5, 0xfa, 0x65, 0x7e, 0xc0, 0x41, 0x9a, 0x30, 0x6d, 0xe9, 0x1e, 0x13, 0x51, 0xa9, - 0xe6, 0x12, 0x1b, 0x23, 0xe7, 0x11, 0x4c, 0x9b, 0xb5, 0x08, 0x0e, 0xc6, 0x50, 0xb5, 0xdf, 0xcd, - 0x40, 0xd8, 0xe4, 0x47, 0x8c, 0x8e, 0xbe, 0x0a, 0xa5, 0xae, 0xfe, 0x70, 0x85, 0x5a, 0xfa, 0xde, - 0x24, 0x7f, 0xbf, 0x5a, 0x57, 0x18, 0x18, 0xa0, 0x69, 0x83, 0x0c, 0xa8, 0x1b, 0xbb, 0x84, 0x42, - 0xa1, 0x65, 0x3e, 0x54, 0xf5, 0x99, 0xc4, 0x53, 0x89, 0xfc, 0x6f, 0x4d, 0xc6, 0x17, 0x44, 0x01, - 0x4a, 0x74, 0xd2, 0x85, 0x29, 0x4f, 0x86, 0x7f, 0xd4, 0xa7, 0x8c, 0xbf, 0x2b, 0x8f, 0x85, 0x91, - 0xd4, 0x75, 0x5f, 0x59, 0x84, 0xbe, 0x8e, 0xfa, 0xfc, 0x07, 0x1f, 0xcf, 0x3d, 0xf5, 0xe1, 0xc7, - 0x73, 0x4f, 0x7d, 0xf4, 0xf1, 0xdc, 0x53, 0xdf, 0xdc, 0x9f, 0xcb, 0x7c, 0xb0, 0x3f, 0x97, 0xf9, - 0x70, 0x7f, 0x2e, 0xf3, 0xd1, 0xfe, 0x5c, 0xe6, 0x5f, 0xf7, 0xe7, 0x32, 0xbf, 0xf3, 0x6f, 0x73, - 0x4f, 0xbd, 0x56, 0xf2, 0x31, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x46, 0x67, 0x87, 0xd1, 0x06, - 0x64, 0x00, 0x00, + // 5698 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x5d, 0x6c, 0x24, 0x57, + 0x56, 0x4e, 0xff, 0xba, 0xfb, 0xb4, 0x3d, 0x3f, 0x77, 0x32, 0x93, 0x1e, 0xef, 0xc4, 0x3d, 0x5b, + 0xab, 0x44, 0xb3, 0xb0, 0x6b, 0x33, 0x26, 0xcb, 0xce, 0x02, 0xbb, 0x89, 0xdb, 0x1e, 0x4f, 0x66, + 0xc6, 0x9e, 0xf1, 0x9e, 0xb6, 0x67, 0xb2, 0x09, 0x24, 0x94, 0xab, 0x6f, 0xb7, 0x2b, 0x5d, 0x5d, + 0xd5, 0xa9, 0xba, 0xed, 0x19, 0x07, 0x56, 0x44, 0x9b, 0x87, 0x04, 0xb1, 0x68, 0x91, 0x10, 0xd2, + 0x8a, 0xd5, 0x22, 0x21, 0x21, 0x21, 0x90, 0x56, 0xe2, 0x81, 0x7d, 0x81, 0x17, 0x9e, 0x50, 0xe0, + 0x01, 0xf2, 0x80, 0x44, 0x10, 0xa8, 0x45, 0xcc, 0x13, 0x0f, 0xa0, 0x45, 0xfb, 0xb2, 0x1a, 0x21, + 0x81, 0xee, 0x4f, 0xfd, 0x76, 0xb5, 0xc7, 0xee, 0xb6, 0xb3, 0x13, 0xf1, 0x56, 0x75, 0xcf, 0x39, + 0xdf, 0xb9, 0x75, 0x7f, 0xce, 0x3d, 0xf7, 0x9c, 0x7b, 0x0b, 0x6e, 0xb4, 0x4d, 0xb6, 0xd3, 0xdf, + 0x9e, 0x37, 0x9c, 0xee, 0x82, 0xdd, 0xef, 0xea, 0x3d, 0xd7, 0x79, 0x53, 0x3c, 0xb4, 0x2c, 0xe7, + 0xc1, 0x42, 0xaf, 0xd3, 0x5e, 0xd0, 0x7b, 0xa6, 0x17, 0x96, 0xec, 0x5e, 0xd5, 0xad, 0xde, 0x8e, + 0x7e, 0x75, 0xa1, 0x4d, 0x6d, 0xea, 0xea, 0x8c, 0x36, 0xe7, 0x7b, 0xae, 0xc3, 0x1c, 0xf2, 0xe5, + 0x10, 0x68, 0xde, 0x07, 0x9a, 0xf7, 0xc5, 0xe6, 0x7b, 0x9d, 0xf6, 0x3c, 0x07, 0x0a, 0x4b, 0x7c, + 0xa0, 0xd9, 0x2f, 0x46, 0x6a, 0xd0, 0x76, 0xda, 0xce, 0x82, 0xc0, 0xdb, 0xee, 0xb7, 0xc4, 0x9b, + 0x78, 0x11, 0x4f, 0x52, 0xcf, 0xac, 0xd6, 0xb9, 0xe6, 0xcd, 0x9b, 0x0e, 0xaf, 0xd6, 0x82, 0xe1, + 0xb8, 0x74, 0x61, 0x77, 0xa8, 0x2e, 0xb3, 0x2f, 0x84, 0x3c, 0x5d, 0xdd, 0xd8, 0x31, 0x6d, 0xea, + 0xee, 0xf9, 0xdf, 0xb2, 0xe0, 0x52, 0xcf, 0xe9, 0xbb, 0x06, 0x3d, 0x92, 0x94, 0xb7, 0xd0, 0xa5, + 0x4c, 0x4f, 0xd3, 0xb5, 0x30, 0x4a, 0xca, 0xed, 0xdb, 0xcc, 0xec, 0x0e, 0xab, 0xf9, 0x85, 0xc7, + 0x09, 0x78, 0xc6, 0x0e, 0xed, 0xea, 0x49, 0x39, 0xed, 0x5f, 0xca, 0x70, 0x6e, 0x69, 0xdb, 0x63, + 0xae, 0x6e, 0xb0, 0x0d, 0xa7, 0xb9, 0x49, 0xbb, 0x3d, 0x4b, 0x67, 0x94, 0x74, 0xa0, 0xc4, 0xeb, + 0xd6, 0xd4, 0x99, 0x5e, 0xcd, 0x5c, 0xce, 0x5c, 0xa9, 0x2c, 0x2e, 0xcd, 0x8f, 0xd9, 0x17, 0xf3, + 0xeb, 0x0a, 0xa8, 0x3e, 0xbd, 0x3f, 0xa8, 0x95, 0xfc, 0x37, 0x0c, 0x14, 0x90, 0xef, 0x66, 0x60, + 0xda, 0x76, 0x9a, 0xb4, 0x41, 0x2d, 0x6a, 0x30, 0xc7, 0xad, 0x66, 0x2f, 0xe7, 0xae, 0x54, 0x16, + 0x5f, 0x1f, 0x5b, 0x63, 0xca, 0x17, 0xcd, 0xdf, 0x89, 0x28, 0xb8, 0x6e, 0x33, 0x77, 0xaf, 0xfe, + 0xf4, 0x07, 0x83, 0xda, 0x53, 0xfb, 0x83, 0xda, 0x74, 0x94, 0x84, 0xb1, 0x9a, 0x90, 0x2d, 0xa8, + 0x30, 0xc7, 0xe2, 0x4d, 0x66, 0x3a, 0xb6, 0x57, 0xcd, 0x89, 0x8a, 0xcd, 0xcd, 0xcb, 0xd6, 0xe6, + 0xea, 0xe7, 0xf9, 0x70, 0x99, 0xdf, 0xbd, 0x3a, 0xbf, 0x19, 0xb0, 0xd5, 0xcf, 0x29, 0xe0, 0x4a, + 0x58, 0xe6, 0x61, 0x14, 0x87, 0x50, 0x38, 0xed, 0x51, 0xa3, 0xef, 0x9a, 0x6c, 0x6f, 0xd9, 0xb1, + 0x19, 0x7d, 0xc8, 0xaa, 0x79, 0xd1, 0xca, 0xcf, 0xa7, 0x41, 0x6f, 0x38, 0xcd, 0x46, 0x9c, 0xbb, + 0x7e, 0x6e, 0x7f, 0x50, 0x3b, 0x9d, 0x28, 0xc4, 0x24, 0x26, 0xb1, 0xe1, 0x8c, 0xd9, 0xd5, 0xdb, + 0x74, 0xa3, 0x6f, 0x59, 0x0d, 0x6a, 0xb8, 0x94, 0x79, 0xd5, 0x82, 0xf8, 0x84, 0x2b, 0x69, 0x7a, + 0xd6, 0x1c, 0x43, 0xb7, 0xee, 0x6e, 0xbf, 0x49, 0x0d, 0x86, 0xb4, 0x45, 0x5d, 0x6a, 0x1b, 0xb4, + 0x5e, 0x55, 0x1f, 0x73, 0xe6, 0x66, 0x02, 0x09, 0x87, 0xb0, 0xc9, 0x0d, 0x38, 0xdb, 0x73, 0x4d, + 0x47, 0x54, 0xc1, 0xd2, 0x3d, 0xef, 0x8e, 0xde, 0xa5, 0xd5, 0xe2, 0xe5, 0xcc, 0x95, 0x72, 0xfd, + 0xa2, 0x82, 0x39, 0xbb, 0x91, 0x64, 0xc0, 0x61, 0x19, 0x72, 0x05, 0x4a, 0x7e, 0x61, 0x75, 0xea, + 0x72, 0xe6, 0x4a, 0x41, 0x8e, 0x1d, 0x5f, 0x16, 0x03, 0x2a, 0x59, 0x85, 0x92, 0xde, 0x6a, 0x99, + 0x36, 0xe7, 0x2c, 0x89, 0x26, 0xbc, 0x94, 0xf6, 0x69, 0x4b, 0x8a, 0x47, 0xe2, 0xf8, 0x6f, 0x18, + 0xc8, 0x92, 0x5b, 0x40, 0x3c, 0xea, 0xee, 0x9a, 0x06, 0x5d, 0x32, 0x0c, 0xa7, 0x6f, 0x33, 0x51, + 0xf7, 0xb2, 0xa8, 0xfb, 0xac, 0xaa, 0x3b, 0x69, 0x0c, 0x71, 0x60, 0x8a, 0x14, 0x79, 0x09, 0xce, + 0xa8, 0x69, 0x17, 0xb6, 0x02, 0x08, 0xa4, 0xa7, 0x79, 0x43, 0x62, 0x82, 0x86, 0x43, 0xdc, 0xa4, + 0x09, 0x97, 0xf4, 0x3e, 0x73, 0xba, 0x1c, 0x32, 0xae, 0x74, 0xd3, 0xe9, 0x50, 0xbb, 0x5a, 0xb9, + 0x9c, 0xb9, 0x52, 0xaa, 0x5f, 0xde, 0x1f, 0xd4, 0x2e, 0x2d, 0x1d, 0xc0, 0x87, 0x07, 0xa2, 0x90, + 0xbb, 0x50, 0x6e, 0xda, 0xde, 0x86, 0x63, 0x99, 0xc6, 0x5e, 0x75, 0x5a, 0x54, 0xf0, 0xaa, 0xfa, + 0xd4, 0xf2, 0xca, 0x9d, 0x86, 0x24, 0x3c, 0x1a, 0xd4, 0x2e, 0x0d, 0x5b, 0xc7, 0xf9, 0x80, 0x8e, + 0x21, 0x06, 0x59, 0x17, 0x80, 0xcb, 0x8e, 0xdd, 0x32, 0xdb, 0xd5, 0x19, 0xd1, 0x1b, 0x97, 0x47, + 0x0c, 0xe8, 0x95, 0x3b, 0x0d, 0xc9, 0x57, 0x9f, 0x51, 0xea, 0xe4, 0x2b, 0x86, 0x08, 0xb3, 0x2f, + 0xc2, 0xd9, 0xa1, 0x59, 0x4b, 0xce, 0x40, 0xae, 0x43, 0xf7, 0x84, 0x51, 0x2a, 0x23, 0x7f, 0x24, + 0x4f, 0x43, 0x61, 0x57, 0xb7, 0xfa, 0xb4, 0x9a, 0x15, 0x65, 0xf2, 0xe5, 0x17, 0xb3, 0xd7, 0x32, + 0xda, 0xa0, 0x0c, 0xa7, 0x7c, 0x5b, 0x70, 0x8f, 0xba, 0x8c, 0x3e, 0x24, 0x97, 0x21, 0x6f, 0xf3, + 0xfe, 0x10, 0xf2, 0xf5, 0x69, 0xf5, 0xb9, 0x79, 0xd1, 0x0f, 0x82, 0x42, 0x0c, 0x28, 0x4a, 0x5b, + 0x2e, 0xf0, 0x2a, 0x8b, 0x2f, 0x8e, 0x6d, 0x86, 0x1a, 0x02, 0xa6, 0x0e, 0xfb, 0x83, 0x5a, 0x51, + 0x3e, 0xa3, 0x82, 0x26, 0xaf, 0x41, 0xde, 0x33, 0xed, 0x4e, 0x35, 0x27, 0x54, 0x7c, 0x75, 0x7c, + 0x15, 0xa6, 0xdd, 0xa9, 0x97, 0xf8, 0x17, 0xf0, 0x27, 0x14, 0xa0, 0xe4, 0x3e, 0xe4, 0xfa, 0xcd, + 0x96, 0xb2, 0x28, 0xbf, 0x3c, 0x36, 0xf6, 0xd6, 0xca, 0x6a, 0x7d, 0x6a, 0x7f, 0x50, 0xcb, 0x6d, + 0xad, 0xac, 0x22, 0x47, 0x24, 0xdf, 0xc9, 0xc0, 0x59, 0xc3, 0xb1, 0x99, 0xce, 0xd7, 0x17, 0xdf, + 0xb2, 0x56, 0x0b, 0x42, 0xcf, 0xad, 0xb1, 0xf5, 0x2c, 0x27, 0x11, 0xeb, 0xe7, 0xb9, 0xa1, 0x18, + 0x2a, 0xc6, 0x61, 0xdd, 0xe4, 0x7b, 0x19, 0x38, 0xcf, 0x27, 0xf0, 0x10, 0xb3, 0x30, 0x3b, 0xc7, + 0x5b, 0xab, 0x8b, 0xfb, 0x83, 0xda, 0xf9, 0x9b, 0x69, 0xca, 0x30, 0xbd, 0x0e, 0xbc, 0x76, 0xe7, + 0xf4, 0xe1, 0xb5, 0x48, 0x98, 0xb4, 0xca, 0xe2, 0xda, 0x71, 0xae, 0x6f, 0xf5, 0xcf, 0xa8, 0xa1, + 0x9c, 0xb6, 0x9c, 0x63, 0x5a, 0x2d, 0xc8, 0x75, 0x98, 0xda, 0x75, 0xac, 0x7e, 0x97, 0x7a, 0xd5, + 0x92, 0x58, 0x14, 0x66, 0xd3, 0xe6, 0xea, 0x3d, 0xc1, 0x52, 0x3f, 0xad, 0xe0, 0xa7, 0xe4, 0xbb, + 0x87, 0xbe, 0x2c, 0x31, 0xa1, 0x68, 0x99, 0x5d, 0x93, 0x79, 0xc2, 0x5a, 0x56, 0x16, 0xaf, 0x8f, + 0xfd, 0x59, 0x72, 0x8a, 0xae, 0x09, 0x30, 0x39, 0x6b, 0xe4, 0x33, 0x2a, 0x05, 0xc4, 0x80, 0x82, + 0x67, 0xe8, 0x96, 0xb4, 0xa6, 0x95, 0xc5, 0xaf, 0x8d, 0x3f, 0x6d, 0x38, 0x4a, 0x7d, 0x46, 0x7d, + 0x53, 0x41, 0xbc, 0xa2, 0xc4, 0x26, 0xbf, 0x0a, 0xa7, 0x62, 0xbd, 0xe9, 0x55, 0x2b, 0xa2, 0x75, + 0x9e, 0x4d, 0x6b, 0x9d, 0x80, 0xab, 0x7e, 0x41, 0x81, 0x9d, 0x8a, 0x8d, 0x10, 0x0f, 0x13, 0x60, + 0xe4, 0x36, 0x94, 0x3c, 0xb3, 0x49, 0x0d, 0xdd, 0xf5, 0xaa, 0xd3, 0x87, 0x01, 0x3e, 0xa3, 0x80, + 0x4b, 0x0d, 0x25, 0x86, 0x01, 0x80, 0x76, 0x1f, 0x66, 0x96, 0xfa, 0x6c, 0xc7, 0x71, 0xcd, 0xb7, + 0x85, 0x67, 0x41, 0x56, 0xa1, 0xc0, 0xc4, 0x0a, 0x21, 0x9d, 0xb6, 0xe7, 0xd2, 0xa0, 0xe5, 0x6a, + 0x7d, 0x9b, 0xee, 0xf9, 0x86, 0xb5, 0x5e, 0xe6, 0x8d, 0x20, 0x57, 0x0c, 0x29, 0xae, 0xfd, 0x51, + 0x06, 0xca, 0x75, 0xdd, 0x33, 0x0d, 0x0e, 0x4f, 0x96, 0x21, 0xdf, 0xf7, 0xa8, 0x7b, 0x34, 0x50, + 0x61, 0x95, 0xb6, 0x3c, 0xea, 0xa2, 0x10, 0x26, 0x77, 0xa1, 0xd4, 0xd3, 0x3d, 0xef, 0x81, 0xe3, + 0x36, 0x95, 0x65, 0x3d, 0x24, 0x90, 0x5c, 0xfa, 0x95, 0x28, 0x06, 0x20, 0x5a, 0x05, 0xca, 0x75, + 0x4b, 0x37, 0x3a, 0x3b, 0x8e, 0x45, 0xb5, 0x57, 0xa1, 0x58, 0xef, 0xb7, 0x5a, 0xd4, 0x3d, 0x84, + 0x85, 0x9f, 0x87, 0x3c, 0xdb, 0xeb, 0xa9, 0xf5, 0x22, 0x58, 0xdd, 0xf3, 0x9b, 0x7b, 0x3d, 0xfa, + 0x68, 0x50, 0x03, 0x89, 0xc3, 0xdf, 0x50, 0xf0, 0x69, 0x3f, 0xce, 0xc0, 0x39, 0x59, 0xa8, 0x56, + 0x51, 0xb9, 0x3e, 0x11, 0x0a, 0x05, 0x97, 0x36, 0x4d, 0x4f, 0xb5, 0xcb, 0xca, 0xd8, 0xc3, 0x11, + 0x39, 0x8a, 0x5a, 0x0e, 0x45, 0x5f, 0x88, 0x02, 0x94, 0xe8, 0xa4, 0x0f, 0xe5, 0x37, 0x29, 0xf3, + 0x98, 0x4b, 0xf5, 0xae, 0x6a, 0xb9, 0x97, 0xc7, 0x56, 0x75, 0x8b, 0xb2, 0x86, 0x40, 0x8a, 0xae, + 0xbe, 0x41, 0x21, 0x86, 0x9a, 0xb4, 0x9f, 0xe4, 0xa1, 0x1c, 0x8c, 0x42, 0xf2, 0x39, 0x28, 0x08, + 0x77, 0x4f, 0x35, 0x6b, 0x30, 0x75, 0x84, 0x57, 0x88, 0x92, 0x46, 0x9e, 0x83, 0x29, 0xc3, 0xe9, + 0x76, 0x75, 0xbb, 0x29, 0x5c, 0xf8, 0x72, 0xbd, 0xc2, 0x2d, 0xc6, 0xb2, 0x2c, 0x42, 0x9f, 0x46, + 0x2e, 0x41, 0x5e, 0x77, 0xdb, 0xd2, 0x9b, 0x2e, 0xcb, 0x71, 0xb2, 0xe4, 0xb6, 0x3d, 0x14, 0xa5, + 0xe4, 0x2b, 0x90, 0xa3, 0xf6, 0x6e, 0x35, 0x3f, 0xda, 0x24, 0x5d, 0xb7, 0x77, 0xef, 0xe9, 0x6e, + 0xbd, 0xa2, 0xea, 0x90, 0xbb, 0x6e, 0xef, 0x22, 0x97, 0x21, 0x6b, 0x30, 0x45, 0xed, 0xdd, 0x55, + 0xd7, 0xe9, 0x2a, 0x37, 0xf7, 0xb3, 0x23, 0xc4, 0x39, 0x8b, 0x5a, 0x9d, 0x03, 0xc3, 0xa6, 0x8a, + 0xd1, 0x87, 0x20, 0xdf, 0x80, 0x69, 0x69, 0xe3, 0xd6, 0xb9, 0xcb, 0xe4, 0x55, 0x8b, 0x02, 0xb2, + 0x36, 0xda, 0x48, 0x0a, 0xbe, 0x70, 0x5b, 0x11, 0x29, 0xf4, 0x30, 0x06, 0x45, 0xbe, 0x01, 0x65, + 0x7f, 0xc7, 0xe8, 0xa9, 0xd5, 0x20, 0xd5, 0x23, 0x47, 0xc5, 0x84, 0xf4, 0xad, 0xbe, 0xe9, 0xd2, + 0x2e, 0xb5, 0x99, 0x57, 0x3f, 0xeb, 0xfb, 0x68, 0x3e, 0xd5, 0xc3, 0x10, 0x8d, 0x6c, 0x0f, 0x6f, + 0x2d, 0xa4, 0x5f, 0xfc, 0xb9, 0x11, 0xb3, 0x6d, 0x8c, 0x7d, 0xc5, 0xeb, 0x70, 0x3a, 0xf0, 0xfd, + 0x95, 0xfb, 0x28, 0x3d, 0xe5, 0x17, 0xb8, 0xf8, 0xcd, 0x38, 0xe9, 0xd1, 0xa0, 0xf6, 0x6c, 0x8a, + 0x03, 0x19, 0x32, 0x60, 0x12, 0x4c, 0xfb, 0xef, 0x2c, 0x0c, 0x2f, 0xff, 0xf1, 0x46, 0xcb, 0x1c, + 0x77, 0xa3, 0x25, 0x3f, 0x48, 0x1a, 0x87, 0x6b, 0x4a, 0x6c, 0xf2, 0x8f, 0x4a, 0xeb, 0x98, 0xdc, + 0x71, 0x77, 0xcc, 0xf8, 0x73, 0x47, 0x7b, 0x3f, 0x0f, 0xa7, 0x56, 0x74, 0xda, 0x75, 0xec, 0xc7, + 0xba, 0x2f, 0x99, 0x27, 0xc2, 0x7d, 0xb9, 0x02, 0x25, 0x97, 0xf6, 0x2c, 0xd3, 0xd0, 0x3d, 0xd1, + 0x59, 0x6a, 0x8f, 0x88, 0xaa, 0x0c, 0x03, 0xea, 0x08, 0xb7, 0x35, 0xf7, 0x44, 0xba, 0xad, 0xf9, + 0x9f, 0xbe, 0xdb, 0xaa, 0xbd, 0x93, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4, 0xc5, 0x8d, + 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a, 0x28, 0x7a, + 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0xdb, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74, 0x32, 0xd9, + 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83, 0x1a, 0x84, + 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc, 0x21, 0x0e, + 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62, 0x2f, 0x54, + 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0x88, 0x06, 0x45, 0xc7, 0x5e, + 0xed, 0x5b, 0x96, 0x0a, 0x8d, 0x08, 0xd8, 0xbb, 0xa2, 0x04, 0x15, 0x45, 0xfb, 0x9d, 0x0c, 0x40, + 0xa8, 0x99, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x07, 0x64, 0x5d, 0x7f, 0xb8, 0x46, 0xed, 0x36, 0xdb, + 0x11, 0x7d, 0x92, 0x97, 0x66, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97, 0xbc, 0x04, 0x67, 0x64, 0xd1, + 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x67, 0x33, 0x32, 0x20, 0x51, 0x4f, 0xd0, 0x70, 0x88, 0x5b, 0xd3, + 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e, 0x10, 0x84, 0xa2, 0x15, 0x56, + 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x35, 0x41, 0xfc, 0x31, 0x6c, 0xd5, 0x2e, 0x65, 0x3a, 0x37, 0x3e, + 0x2b, 0x7d, 0x15, 0x21, 0x93, 0x2d, 0x29, 0x6b, 0xab, 0x90, 0xb4, 0x17, 0xe0, 0xec, 0x50, 0x1f, + 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x67, 0xb9, 0xaf, 0x20, 0x9c, 0xa3, 0xdb, 0xbc, + 0x00, 0x65, 0xb9, 0xf6, 0x3f, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43, 0x78, 0xbf, 0x8f, 0x77, 0xfd, + 0x7c, 0xd7, 0x23, 0x9b, 0xea, 0x7a, 0xf4, 0xa1, 0xd8, 0x79, 0x10, 0xb8, 0x26, 0x95, 0xc5, 0xf5, + 0xf1, 0x47, 0xab, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x03, 0x8e, 0xa7, 0x54, 0x85, 0x8a, 0xb7, + 0xef, 0x0b, 0xa5, 0x4a, 0xd9, 0xec, 0x57, 0xa0, 0x12, 0x61, 0x3b, 0x52, 0x84, 0xe3, 0x27, 0x19, + 0x38, 0x7d, 0x43, 0xc6, 0x74, 0x1d, 0x57, 0x7a, 0x34, 0xe4, 0x22, 0xe4, 0xdc, 0x5e, 0x5f, 0xc8, + 0xe7, 0xe4, 0x06, 0x1e, 0x37, 0xb6, 0x90, 0x97, 0x91, 0x57, 0xa0, 0xd4, 0x54, 0x7d, 0xa0, 0x3c, + 0xc9, 0xa3, 0xf6, 0x9c, 0xb0, 0xb1, 0xfe, 0x1b, 0x06, 0x68, 0xdc, 0xf5, 0xeb, 0x7a, 0xed, 0x86, + 0xf9, 0xb6, 0x34, 0xac, 0x05, 0xe9, 0xfa, 0xad, 0xcb, 0x22, 0xf4, 0x69, 0xdc, 0x68, 0x77, 0xe8, + 0xde, 0x32, 0xf7, 0x82, 0xc4, 0xcc, 0x54, 0x46, 0xfb, 0xb6, 0x2a, 0xc3, 0x80, 0xca, 0x7b, 0x5e, + 0x7e, 0x73, 0x41, 0x0c, 0x74, 0xd1, 0xf3, 0xf7, 0x78, 0x81, 0xfa, 0x7c, 0xed, 0x3b, 0x59, 0xb8, + 0x70, 0x83, 0x32, 0xb9, 0x66, 0xad, 0xd0, 0x9e, 0xe5, 0xec, 0xf1, 0xa5, 0x1e, 0xe9, 0x5b, 0xe4, + 0x25, 0x00, 0xd3, 0xdb, 0x6e, 0xec, 0x1a, 0xdc, 0x89, 0x57, 0xa3, 0xe1, 0xb2, 0x6a, 0x7c, 0xb8, + 0xd9, 0xa8, 0x2b, 0xca, 0xa3, 0xd8, 0x1b, 0x46, 0x64, 0x42, 0x77, 0x37, 0x7b, 0x80, 0xbb, 0xdb, + 0x00, 0xe8, 0x85, 0x0e, 0x43, 0x4e, 0x70, 0xfe, 0xbc, 0xaf, 0xe6, 0x28, 0xbe, 0x42, 0x04, 0x66, + 0x92, 0x25, 0xfc, 0x2f, 0x73, 0x30, 0x7b, 0x83, 0xb2, 0xc0, 0x9b, 0x57, 0xbb, 0x95, 0x46, 0x8f, + 0x1a, 0xbc, 0x55, 0xde, 0xcb, 0x40, 0xd1, 0xd2, 0xb7, 0xa9, 0xe5, 0x89, 0xd9, 0x54, 0x59, 0x7c, + 0x63, 0xec, 0xe1, 0x3d, 0x5a, 0xcb, 0xfc, 0x9a, 0xd0, 0x90, 0x18, 0xf0, 0xb2, 0x10, 0x95, 0x7a, + 0xf2, 0x25, 0xa8, 0x18, 0x56, 0xdf, 0x63, 0xd4, 0xdd, 0x70, 0x5c, 0xa6, 0x56, 0xef, 0x20, 0x6a, + 0xbe, 0x1c, 0x92, 0x30, 0xca, 0x47, 0x16, 0x01, 0x0c, 0xcb, 0xa4, 0x36, 0x13, 0x52, 0x72, 0x98, + 0x11, 0xbf, 0xbd, 0x97, 0x03, 0x0a, 0x46, 0xb8, 0xb8, 0xaa, 0xae, 0x63, 0x9b, 0xcc, 0x91, 0xaa, + 0xf2, 0x71, 0x55, 0xeb, 0x21, 0x09, 0xa3, 0x7c, 0x42, 0x8c, 0x32, 0xd7, 0x34, 0x3c, 0x21, 0x56, + 0x48, 0x88, 0x85, 0x24, 0x8c, 0xf2, 0xf1, 0x99, 0x1c, 0xf9, 0xfe, 0x23, 0xcd, 0xe4, 0xbf, 0x2a, + 0xc1, 0x5c, 0xac, 0x59, 0x99, 0xce, 0x68, 0xab, 0x6f, 0x35, 0x28, 0xf3, 0x3b, 0xf0, 0x4b, 0x50, + 0x51, 0xd1, 0xe6, 0x3b, 0xa1, 0x95, 0x0b, 0x2a, 0xd5, 0x08, 0x49, 0x18, 0xe5, 0x23, 0xbf, 0x1d, + 0xf6, 0xbb, 0x4c, 0xac, 0x18, 0xc7, 0xd3, 0xef, 0x43, 0x15, 0x3c, 0x54, 0xdf, 0x2f, 0x40, 0xd9, + 0xd6, 0x99, 0x27, 0x26, 0x92, 0x9a, 0x33, 0x81, 0x6f, 0x7e, 0xc7, 0x27, 0x60, 0xc8, 0x43, 0x36, + 0xe0, 0x69, 0xd5, 0xc4, 0xd7, 0x1f, 0xf6, 0x1c, 0x97, 0x51, 0x57, 0xca, 0xe6, 0x85, 0xec, 0x25, + 0x25, 0xfb, 0xf4, 0x7a, 0x0a, 0x0f, 0xa6, 0x4a, 0x92, 0x75, 0x38, 0x67, 0xc8, 0x60, 0x33, 0xb5, + 0x1c, 0xbd, 0xe9, 0x03, 0x16, 0x04, 0x60, 0xe0, 0x88, 0x2e, 0x0f, 0xb3, 0x60, 0x9a, 0x5c, 0x72, + 0x34, 0x17, 0xc7, 0x1a, 0xcd, 0x53, 0xe3, 0x8c, 0xe6, 0xd2, 0x78, 0xa3, 0xb9, 0x7c, 0xb8, 0xd1, + 0xcc, 0x5b, 0x9e, 0x8f, 0x23, 0xea, 0x2e, 0xf5, 0xd9, 0x8e, 0x8c, 0xcb, 0x44, 0x72, 0x19, 0x41, + 0xcb, 0x37, 0x52, 0x78, 0x30, 0x55, 0x92, 0x6c, 0xc3, 0xac, 0x2c, 0xbf, 0x6e, 0x1b, 0xee, 0x5e, + 0x8f, 0xaf, 0x1c, 0x11, 0xdc, 0x8a, 0xc0, 0xd5, 0x14, 0xee, 0x6c, 0x63, 0x24, 0x27, 0x1e, 0x80, + 0x42, 0x7e, 0x09, 0x66, 0x64, 0x2f, 0xad, 0xeb, 0x3d, 0x01, 0x2b, 0x33, 0x1b, 0xe7, 0x15, 0xec, + 0xcc, 0x72, 0x94, 0x88, 0x71, 0x5e, 0xb2, 0x04, 0xa7, 0x7b, 0xbb, 0x06, 0x7f, 0xbc, 0xd9, 0xba, + 0x43, 0x69, 0x93, 0x36, 0x45, 0x1e, 0xa3, 0x5c, 0x7f, 0xc6, 0xdf, 0x08, 0x6e, 0xc4, 0xc9, 0x98, + 0xe4, 0x27, 0xd7, 0x60, 0xda, 0x63, 0xba, 0xcb, 0x54, 0xd8, 0xa3, 0x7a, 0x4a, 0x66, 0x7e, 0xfc, + 0xa8, 0x40, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x24, 0xd6, 0xe3, 0x91, 0x5c, 0x0c, 0x45, 0xdc, 0x28, + 0x61, 0xf6, 0xdf, 0x4d, 0x9a, 0xfd, 0xd7, 0x26, 0x99, 0xfe, 0x29, 0x1a, 0x0e, 0x35, 0xed, 0x6f, + 0x01, 0x71, 0x55, 0x94, 0x4b, 0xee, 0x36, 0x22, 0x96, 0x3f, 0xc8, 0xaf, 0xe1, 0x10, 0x07, 0xa6, + 0x48, 0x91, 0x06, 0x9c, 0xf7, 0xa8, 0xcd, 0x4c, 0x9b, 0x5a, 0x71, 0x38, 0xb9, 0x24, 0x3c, 0xab, + 0xe0, 0xce, 0x37, 0xd2, 0x98, 0x30, 0x5d, 0x76, 0x92, 0xc6, 0xff, 0xd7, 0xb2, 0x58, 0x77, 0x65, + 0xd3, 0x1c, 0x9b, 0xd9, 0x7e, 0x2f, 0x69, 0xb6, 0xdf, 0x98, 0xbc, 0xdf, 0xc6, 0x33, 0xd9, 0x8b, + 0x00, 0xa2, 0x17, 0xa2, 0x36, 0x3b, 0xb0, 0x54, 0x18, 0x50, 0x30, 0xc2, 0xc5, 0x67, 0xa1, 0xdf, + 0xce, 0x51, 0x73, 0x1d, 0xcc, 0xc2, 0x46, 0x94, 0x88, 0x71, 0xde, 0x91, 0x26, 0xbf, 0x30, 0xb6, + 0xc9, 0xbf, 0x05, 0x24, 0xb6, 0xd7, 0x95, 0x78, 0xc5, 0x78, 0x7a, 0xf7, 0xe6, 0x10, 0x07, 0xa6, + 0x48, 0x8d, 0x18, 0xca, 0x53, 0xc7, 0x3b, 0x94, 0x4b, 0xe3, 0x0f, 0x65, 0xf2, 0x06, 0x5c, 0x14, + 0xaa, 0x54, 0xfb, 0xc4, 0x81, 0xa5, 0xf1, 0xff, 0xac, 0x02, 0xbe, 0x88, 0xa3, 0x18, 0x71, 0x34, + 0x06, 0xef, 0x1f, 0xc3, 0xa5, 0x4d, 0xae, 0x5c, 0xb7, 0x46, 0x2f, 0x0c, 0xcb, 0x29, 0x3c, 0x98, + 0x2a, 0xc9, 0x87, 0x18, 0xe3, 0xc3, 0x50, 0xdf, 0xb6, 0x68, 0x53, 0xa5, 0xb7, 0x83, 0x21, 0xb6, + 0xb9, 0xd6, 0x50, 0x14, 0x8c, 0x70, 0xa5, 0xd9, 0xea, 0xe9, 0x23, 0xda, 0xea, 0x1b, 0x22, 0x30, + 0xd4, 0x8a, 0x2d, 0x09, 0xca, 0xe0, 0x07, 0x07, 0x16, 0x96, 0x93, 0x0c, 0x38, 0x2c, 0x23, 0x96, + 0x4a, 0xc3, 0x35, 0x7b, 0xcc, 0x8b, 0x63, 0x9d, 0x4a, 0x2c, 0x95, 0x29, 0x3c, 0x98, 0x2a, 0xc9, + 0x9d, 0x94, 0x1d, 0xaa, 0x5b, 0x6c, 0x27, 0x0e, 0x78, 0x3a, 0xee, 0xa4, 0xbc, 0x3c, 0xcc, 0x82, + 0x69, 0x72, 0x93, 0x98, 0xb7, 0x6f, 0x67, 0xe1, 0xdc, 0x0d, 0xaa, 0x12, 0xe8, 0x1b, 0x4e, 0xd3, + 0xb7, 0x6b, 0xff, 0x4f, 0x77, 0x59, 0xef, 0x66, 0x61, 0xea, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x3d, + 0xd2, 0x86, 0xe2, 0x03, 0x11, 0x11, 0x51, 0x71, 0x90, 0xf1, 0xcf, 0x0a, 0xc8, 0xc0, 0x4a, 0x68, + 0x82, 0xe5, 0x3b, 0x2a, 0x78, 0xde, 0x52, 0x1d, 0xba, 0x47, 0x65, 0xe6, 0xac, 0x14, 0xb6, 0xd4, + 0x6d, 0x5e, 0x88, 0x92, 0x46, 0xde, 0x84, 0x29, 0x8f, 0x39, 0xae, 0x6f, 0xa4, 0x27, 0x89, 0x7a, + 0x6d, 0xd4, 0xbf, 0xde, 0x90, 0x50, 0x72, 0x23, 0xaf, 0x5e, 0xd0, 0x57, 0xa0, 0x7d, 0x3f, 0x03, + 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0x8a, 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x83, 0x70, 0xd0, 0xea, 0xf8, + 0xa1, 0xe1, 0x68, 0x36, 0x53, 0xc5, 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, 0xa9, + 0x15, 0x52, 0xb5, 0x43, 0x90, 0xbc, 0x51, 0xab, 0x28, 0xfa, 0x74, 0xed, 0x47, 0x59, 0xb8, 0x70, + 0xd3, 0x66, 0xd4, 0x6d, 0x30, 0xda, 0x8b, 0x25, 0xef, 0xc8, 0xaf, 0x0d, 0x9d, 0x6d, 0xfb, 0xb9, + 0xc3, 0x05, 0x41, 0xe4, 0xd1, 0xa8, 0x75, 0xca, 0xf4, 0xd0, 0x36, 0x85, 0x65, 0x91, 0x03, 0x6d, + 0x7d, 0xc8, 0x7b, 0x3d, 0x6a, 0xa8, 0x10, 0x4b, 0x63, 0xec, 0xd6, 0x48, 0xff, 0x00, 0x3e, 0xff, + 0xc2, 0xe0, 0x96, 0x98, 0x8d, 0x42, 0x1d, 0xf9, 0x26, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0x1f, 0x6c, + 0xdd, 0x3a, 0x6e, 0xc5, 0x02, 0x3c, 0x1c, 0xa3, 0xf2, 0x1d, 0x95, 0x52, 0xed, 0x47, 0x19, 0x98, + 0x4d, 0x17, 0x5c, 0x33, 0x3d, 0x46, 0x7e, 0x65, 0xa8, 0xd9, 0x0f, 0x19, 0x7b, 0xe2, 0xd2, 0xa2, + 0xd1, 0x83, 0x4c, 0xb8, 0x5f, 0x12, 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0xef, 0x2b, 0xdd, + 0x3d, 0xe6, 0x4f, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xa8, 0x4f, 0xe6, + 0xdd, 0x42, 0xac, 0x78, 0x82, 0xf8, 0xf6, 0x64, 0x09, 0xe2, 0x78, 0x85, 0x86, 0xf3, 0xc4, 0xbf, + 0x31, 0x9c, 0x27, 0xbe, 0x3b, 0x79, 0x9e, 0x38, 0xd1, 0x0c, 0x23, 0xd3, 0xc5, 0xdf, 0xce, 0xc1, + 0xa5, 0x83, 0x86, 0x0d, 0xb7, 0x95, 0x6a, 0x74, 0x4e, 0x6a, 0x2b, 0x0f, 0x1e, 0x87, 0x64, 0x11, + 0x0a, 0xbd, 0x1d, 0xdd, 0xf3, 0x57, 0x15, 0x7f, 0xf1, 0x2d, 0x6c, 0xf0, 0xc2, 0x47, 0x83, 0x5a, + 0x45, 0xae, 0x46, 0xe2, 0x15, 0x25, 0x2b, 0xb7, 0x2c, 0x5d, 0xea, 0x79, 0xa1, 0x7f, 0x1b, 0x58, + 0x96, 0x75, 0x59, 0x8c, 0x3e, 0x9d, 0x30, 0x28, 0xca, 0x3d, 0xa3, 0x4a, 0x2d, 0x8c, 0x9f, 0x07, + 0x4b, 0x39, 0x53, 0x10, 0x7e, 0x94, 0x0a, 0x3f, 0x28, 0x5d, 0xc1, 0x99, 0x85, 0x42, 0xfa, 0x99, + 0x85, 0xc8, 0x02, 0x2b, 0xcf, 0x2c, 0xfc, 0x43, 0x09, 0x2e, 0xa4, 0xf7, 0x21, 0xff, 0xd6, 0x5d, + 0xea, 0x7a, 0xa6, 0x63, 0xab, 0x45, 0x3b, 0x3c, 0xdb, 0x23, 0x8b, 0xd1, 0xa7, 0x7f, 0xaa, 0x73, + 0x6c, 0x7f, 0x92, 0xe1, 0x6e, 0xb0, 0x0c, 0xd4, 0x7c, 0x12, 0x79, 0xb6, 0x67, 0xa5, 0x3b, 0x3d, + 0x42, 0x21, 0x8e, 0xae, 0x0b, 0xf9, 0xe3, 0x0c, 0x54, 0xbb, 0x09, 0x3f, 0xfb, 0x04, 0x4f, 0xd7, + 0x5d, 0xda, 0x1f, 0xd4, 0xaa, 0xeb, 0x23, 0xf4, 0xe1, 0xc8, 0x9a, 0x90, 0xdf, 0x84, 0x4a, 0x8f, + 0x8f, 0x0b, 0x8f, 0x51, 0xdb, 0xf0, 0x0f, 0xd8, 0x8d, 0x3f, 0xfa, 0x37, 0x42, 0xac, 0x06, 0x73, + 0x75, 0x46, 0xdb, 0x7b, 0x2a, 0x71, 0x16, 0x12, 0x30, 0xaa, 0xf1, 0x09, 0x3f, 0x4e, 0x77, 0x05, + 0x4a, 0x1e, 0x65, 0xcc, 0xb4, 0xdb, 0x9e, 0xd8, 0xbd, 0x95, 0xe5, 0x5c, 0x69, 0xa8, 0x32, 0x0c, + 0xa8, 0xe4, 0x67, 0xa1, 0x2c, 0xe2, 0x3e, 0x4b, 0x6e, 0xdb, 0xab, 0x96, 0x45, 0x26, 0x4a, 0xd8, + 0xd5, 0x86, 0x5f, 0x88, 0x21, 0x9d, 0xbc, 0x00, 0xd3, 0x32, 0x1b, 0xa7, 0x8e, 0xd5, 0xca, 0x3d, + 0xd6, 0x99, 0xfd, 0x41, 0x6d, 0xba, 0x1e, 0x29, 0xc7, 0x18, 0x17, 0xdf, 0x4f, 0xd1, 0x20, 0x38, + 0x96, 0xdc, 0x4f, 0x85, 0x61, 0x33, 0x8c, 0x70, 0x91, 0x67, 0x21, 0xc7, 0x2c, 0x4f, 0xec, 0xa1, + 0x4a, 0xa1, 0xdf, 0xbb, 0xb9, 0xd6, 0x40, 0x5e, 0xae, 0xfd, 0x6f, 0x06, 0x4e, 0x27, 0x4e, 0x0f, + 0x71, 0x91, 0xbe, 0x6b, 0x29, 0x33, 0x12, 0x88, 0x6c, 0xe1, 0x1a, 0xf2, 0x72, 0xf2, 0x86, 0xf2, + 0x0a, 0xb3, 0x13, 0xde, 0x20, 0xb8, 0xa3, 0x33, 0x8f, 0xbb, 0x81, 0x43, 0x0e, 0xe1, 0xb5, 0x44, + 0xe3, 0xe4, 0xe2, 0xb1, 0xb6, 0x83, 0x1b, 0x28, 0xb2, 0xe1, 0xcc, 0x1f, 0x66, 0xc3, 0xa9, 0xfd, + 0x5d, 0x0e, 0x2a, 0xb7, 0x9c, 0xed, 0x4f, 0xc9, 0xf9, 0x88, 0x74, 0x8b, 0x9c, 0xfd, 0x29, 0x5a, + 0xe4, 0x2d, 0x78, 0x86, 0x31, 0xbe, 0xeb, 0x77, 0xec, 0xa6, 0xb7, 0xd4, 0x62, 0xd4, 0x5d, 0x35, + 0x6d, 0xd3, 0xdb, 0xa1, 0x4d, 0x15, 0xb9, 0xfb, 0xcc, 0xfe, 0xa0, 0xf6, 0xcc, 0xe6, 0xe6, 0x5a, + 0x1a, 0x0b, 0x8e, 0x92, 0x15, 0x33, 0x44, 0x37, 0x3a, 0x4e, 0xab, 0x25, 0x33, 0xdb, 0x32, 0xc7, + 0x23, 0x67, 0x48, 0xa4, 0x1c, 0x63, 0x5c, 0xda, 0x47, 0x19, 0x28, 0xdf, 0xd6, 0x5b, 0x1d, 0xbd, + 0x61, 0xda, 0x1d, 0xf2, 0x1c, 0x4c, 0x6d, 0xbb, 0x4e, 0x87, 0xba, 0x9e, 0xca, 0x34, 0x8b, 0x5d, + 0x4f, 0x5d, 0x16, 0xa1, 0x4f, 0xe3, 0xdb, 0x30, 0xe6, 0xf4, 0x4c, 0x23, 0xb9, 0x61, 0xdd, 0xe4, + 0x85, 0x28, 0x69, 0xe4, 0xbe, 0x9c, 0x47, 0xb9, 0x09, 0x8f, 0x5f, 0x6f, 0xae, 0x35, 0x64, 0xf6, + 0xd6, 0x9f, 0x81, 0xe4, 0xf9, 0x98, 0xe7, 0x51, 0x1e, 0xe5, 0x2b, 0x68, 0xdf, 0xcb, 0x42, 0x45, + 0x7e, 0x9a, 0xdc, 0x9c, 0x1d, 0xe7, 0xc7, 0xbd, 0x28, 0xa2, 0xeb, 0x5e, 0xbf, 0x4b, 0x5d, 0xb1, + 0x09, 0x56, 0x53, 0x2e, 0x1a, 0x2d, 0x09, 0x89, 0x41, 0x84, 0x3d, 0x2c, 0xf2, 0x5b, 0x27, 0x7f, + 0x82, 0xad, 0x53, 0x38, 0xb0, 0x75, 0xfe, 0x3c, 0x03, 0xe5, 0x35, 0xb3, 0x45, 0x8d, 0x3d, 0xc3, + 0xa2, 0xe4, 0x15, 0xa8, 0x36, 0xa9, 0x45, 0x19, 0xbd, 0xe1, 0xea, 0x06, 0xdd, 0xa0, 0xae, 0x29, + 0x2e, 0xdb, 0xf0, 0x51, 0x26, 0xe6, 0x71, 0x41, 0x2e, 0x97, 0x2b, 0x23, 0x78, 0x70, 0xa4, 0x34, + 0xb9, 0x09, 0xd3, 0x4d, 0xea, 0x99, 0x2e, 0x6d, 0x6e, 0x44, 0xbc, 0xd1, 0xe7, 0x7c, 0xdb, 0xb4, + 0x12, 0xa1, 0x3d, 0x1a, 0xd4, 0x66, 0x36, 0xcc, 0x1e, 0xb5, 0x4c, 0x9b, 0x4a, 0xb7, 0x34, 0x26, + 0xaa, 0x15, 0x20, 0xb7, 0xe6, 0xb4, 0xb5, 0xf7, 0x73, 0x10, 0x5c, 0x9f, 0x22, 0xbf, 0x95, 0x81, + 0x8a, 0x6e, 0xdb, 0x0e, 0x53, 0x57, 0x93, 0x64, 0x6c, 0x1f, 0x27, 0xbe, 0xa5, 0x35, 0xbf, 0x14, + 0x82, 0xca, 0xb0, 0x70, 0x10, 0xaa, 0x8e, 0x50, 0x30, 0xaa, 0x9b, 0xf4, 0x13, 0x91, 0xea, 0xf5, + 0xc9, 0x6b, 0x71, 0x88, 0xb8, 0xf4, 0xec, 0xd7, 0xe0, 0x4c, 0xb2, 0xb2, 0x47, 0x09, 0x6c, 0x4d, + 0x12, 0x13, 0x7b, 0xb7, 0x0c, 0x95, 0x3b, 0x3a, 0x33, 0x77, 0xa9, 0xd8, 0x82, 0x9d, 0x8c, 0x4f, + 0xfd, 0x87, 0x19, 0xb8, 0x10, 0x8f, 0x19, 0x9f, 0xa0, 0x63, 0x3d, 0xbb, 0x3f, 0xa8, 0x5d, 0xc0, + 0x54, 0x6d, 0x38, 0xa2, 0x16, 0xc2, 0xc5, 0x1e, 0x0a, 0x41, 0x9f, 0xb4, 0x8b, 0xdd, 0x18, 0xa5, + 0x10, 0x47, 0xd7, 0xe5, 0xd3, 0xe2, 0x62, 0x3f, 0xd9, 0xd7, 0x59, 0x12, 0x1b, 0x80, 0xa9, 0x27, + 0x66, 0x03, 0x50, 0x7a, 0x22, 0x1c, 0xae, 0x5e, 0x64, 0x03, 0x50, 0x9e, 0x30, 0x0e, 0xaa, 0xd2, + 0xac, 0x12, 0x6d, 0xd4, 0x46, 0x42, 0x1c, 0x7e, 0xf3, 0x7d, 0x63, 0x62, 0x40, 0x61, 0x5b, 0xf7, + 0x4c, 0x43, 0xb9, 0x9f, 0xf5, 0xf1, 0xc3, 0x12, 0xfe, 0xbd, 0x0f, 0x19, 0x63, 0x12, 0xaf, 0x28, + 0xb1, 0xc3, 0xfb, 0x25, 0xd9, 0x89, 0xee, 0x97, 0x90, 0x65, 0xc8, 0xdb, 0xdc, 0xd8, 0xe6, 0x8e, + 0x7c, 0xa3, 0xe4, 0xce, 0x6d, 0xba, 0x87, 0x42, 0x58, 0xfb, 0x61, 0x16, 0x80, 0x7f, 0xbe, 0x72, + 0x73, 0x1e, 0xb3, 0x19, 0xf9, 0x3c, 0x4c, 0x79, 0x7d, 0x11, 0xad, 0x55, 0x4b, 0x71, 0x18, 0x3c, + 0x96, 0xc5, 0xe8, 0xd3, 0xb9, 0x27, 0xf4, 0x56, 0x9f, 0xf6, 0xfd, 0x58, 0x50, 0xe0, 0x09, 0x7d, + 0x9d, 0x17, 0xa2, 0xa4, 0x9d, 0x9c, 0x23, 0xe3, 0xef, 0x9a, 0x0a, 0x27, 0xb4, 0x6b, 0xd2, 0xde, + 0xc9, 0x02, 0x84, 0x01, 0x7e, 0xf2, 0xfd, 0x0c, 0x9c, 0x0f, 0x66, 0x19, 0x93, 0xb7, 0x16, 0x96, + 0x2d, 0xdd, 0xec, 0x4e, 0xbc, 0x91, 0x49, 0x9b, 0xe1, 0xc2, 0xec, 0x6c, 0xa4, 0xa9, 0xc3, 0xf4, + 0x5a, 0x10, 0x84, 0x12, 0xed, 0xf6, 0xd8, 0xde, 0x8a, 0xe9, 0xaa, 0x61, 0x97, 0x7a, 0xec, 0xff, + 0xba, 0xe2, 0x91, 0xa2, 0xea, 0x76, 0x87, 0x98, 0x39, 0x3e, 0x05, 0x03, 0x1c, 0xed, 0xbb, 0x59, + 0x38, 0x97, 0x52, 0x3b, 0xf2, 0x12, 0x9c, 0x51, 0x19, 0x8e, 0xf0, 0xea, 0x6e, 0x26, 0xbc, 0xba, + 0xdb, 0x48, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x01, 0xa0, 0x1b, 0x06, 0xf5, 0xbc, 0x75, 0xa7, 0xe9, + 0x3b, 0x7d, 0x2f, 0xf2, 0x4d, 0xe5, 0x52, 0x50, 0xfa, 0x68, 0x50, 0xfb, 0x62, 0x5a, 0xaa, 0x2a, + 0xf1, 0xf5, 0xa1, 0x00, 0x46, 0x20, 0xc9, 0xeb, 0x00, 0xf2, 0x2e, 0x49, 0x70, 0xd8, 0xf2, 0x31, + 0x91, 0xf4, 0x79, 0xff, 0x9e, 0xc3, 0xfc, 0xd7, 0xfb, 0xba, 0xcd, 0x4c, 0xb6, 0x27, 0x8f, 0x4e, + 0xdf, 0x0b, 0x50, 0x30, 0x82, 0xa8, 0xfd, 0x4d, 0x16, 0x4a, 0xbe, 0x33, 0xfa, 0x09, 0xe4, 0x4a, + 0xda, 0xb1, 0x5c, 0xc9, 0xf8, 0x97, 0x07, 0xfd, 0x2a, 0x8f, 0xcc, 0x8e, 0x38, 0x89, 0xec, 0xc8, + 0x8d, 0xc9, 0x55, 0x1d, 0x9c, 0x0f, 0xf9, 0x41, 0x16, 0x4e, 0xf9, 0xac, 0xea, 0x1c, 0xf7, 0x97, + 0x61, 0xc6, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0x63, 0x47, 0x74, 0x9f, 0x3c, 0xc5, 0x7d, 0x76, 0x7f, + 0x50, 0x9b, 0xc1, 0x28, 0x01, 0xe3, 0x7c, 0x69, 0x07, 0xc0, 0xb3, 0x13, 0x1e, 0x00, 0xcf, 0x1d, + 0xe5, 0x00, 0x38, 0xd1, 0xa1, 0xc2, 0x6b, 0xb4, 0x69, 0x76, 0xa9, 0xd3, 0xf7, 0xff, 0x56, 0x70, + 0xd4, 0xc3, 0xc3, 0x62, 0x75, 0xc7, 0x10, 0x06, 0xa3, 0x98, 0xda, 0x3f, 0x66, 0x60, 0x3a, 0x6c, + 0xaf, 0x13, 0xcf, 0x18, 0xb5, 0xe2, 0x19, 0xa3, 0xa5, 0x89, 0x87, 0xc3, 0x88, 0x1c, 0xd1, 0xef, + 0x17, 0xc3, 0xcf, 0x12, 0x59, 0xa1, 0x6d, 0x98, 0x35, 0x53, 0x13, 0x25, 0x11, 0x6b, 0x13, 0x1c, + 0x82, 0xbb, 0x39, 0x92, 0x13, 0x0f, 0x40, 0x21, 0x7d, 0x28, 0xed, 0x52, 0x97, 0x99, 0x06, 0xf5, + 0xbf, 0xef, 0xc6, 0xc4, 0xde, 0x91, 0x3c, 0x00, 0x10, 0xb6, 0xe9, 0x3d, 0xa5, 0x00, 0x03, 0x55, + 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, 0xaf, 0x4e, 0x74, 0xeb, 0x22, 0x6c, 0x4f, + 0xfe, 0xe6, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xbe, 0x4e, + 0x10, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x45, 0x18, 0xea, 0x21, 0x9d, 0xe0, 0x3e, 0x49, 0xe1, 0x98, + 0x8c, 0xc7, 0x01, 0x77, 0x4a, 0x3c, 0x28, 0x3f, 0xd0, 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, 0x8e, + 0xff, 0xf8, 0x5f, 0x78, 0xdf, 0x47, 0x0a, 0xbf, 0x30, 0x28, 0xc2, 0x50, 0x0f, 0x71, 0xa0, 0xcc, + 0x94, 0x27, 0xeb, 0x5f, 0x49, 0x1c, 0x5f, 0xa9, 0xef, 0x13, 0x7b, 0x32, 0xb0, 0x1d, 0xbc, 0x62, + 0xa8, 0x43, 0x7b, 0x94, 0x0b, 0xcd, 0xe3, 0x27, 0x9d, 0x22, 0x7c, 0x21, 0x9e, 0x22, 0x9c, 0x4b, + 0xa6, 0x08, 0x13, 0xd1, 0x98, 0xa3, 0x27, 0x09, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xb6, 0x7a, 0x4d, + 0x9d, 0xa9, 0xf8, 0x72, 0x65, 0xf1, 0x67, 0x0e, 0x67, 0xbd, 0xb8, 0x3d, 0x0c, 0x83, 0x2e, 0x6b, + 0x21, 0x0c, 0x46, 0x31, 0xc9, 0x55, 0xa8, 0xec, 0x8a, 0x19, 0x29, 0x6f, 0x53, 0x14, 0x84, 0x39, + 0x17, 0x16, 0xf6, 0x5e, 0x58, 0x8c, 0x51, 0x1e, 0x2e, 0x22, 0x3d, 0x01, 0x29, 0x52, 0x0c, 0x45, + 0x1a, 0x61, 0x31, 0x46, 0x79, 0x44, 0xae, 0xc2, 0xb4, 0x3b, 0x52, 0x60, 0x4a, 0x08, 0xc8, 0x5c, + 0x85, 0x5f, 0x88, 0x21, 0x9d, 0x5c, 0x81, 0x52, 0xbf, 0xd9, 0x92, 0xbc, 0x25, 0xc1, 0x2b, 0xfc, + 0xaf, 0xad, 0x95, 0x55, 0x75, 0xbb, 0xc3, 0xa7, 0x6a, 0xff, 0x95, 0x01, 0x32, 0x9c, 0xd4, 0x26, + 0x3b, 0x50, 0xb4, 0x45, 0x54, 0x65, 0xe2, 0x2b, 0xd5, 0x91, 0xe0, 0x8c, 0x9c, 0x63, 0xaa, 0x40, + 0xe1, 0x13, 0x1b, 0x4a, 0xf4, 0x21, 0xa3, 0xae, 0xad, 0x5b, 0xca, 0xf5, 0x38, 0x9e, 0xeb, 0xdb, + 0xd2, 0xe1, 0x54, 0xc8, 0x18, 0xe8, 0xd0, 0x7e, 0x9c, 0x85, 0x4a, 0x84, 0xef, 0x71, 0x9b, 0x15, + 0x71, 0x66, 0x54, 0x06, 0x33, 0xb6, 0x5c, 0x4b, 0x0d, 0xd3, 0xc8, 0x99, 0x51, 0x45, 0xc2, 0x35, + 0x8c, 0xf2, 0x91, 0x45, 0x80, 0xae, 0xee, 0x31, 0xea, 0x8a, 0xa5, 0x24, 0x71, 0x52, 0x73, 0x3d, + 0xa0, 0x60, 0x84, 0x8b, 0x5c, 0x56, 0x97, 0xfb, 0xf3, 0xf1, 0x4b, 0x53, 0x23, 0x6e, 0xee, 0x17, + 0x8e, 0xe1, 0xe6, 0x3e, 0x69, 0xc3, 0x19, 0xbf, 0xd6, 0x3e, 0x55, 0xd9, 0xb9, 0x43, 0x02, 0x4b, + 0x67, 0x3c, 0x01, 0x81, 0x43, 0xa0, 0xda, 0x0f, 0x33, 0x30, 0x13, 0xdb, 0x4a, 0xf3, 0xad, 0x5d, + 0x78, 0x24, 0x23, 0xb2, 0xb5, 0x8b, 0x9d, 0xa4, 0x78, 0x1e, 0x8a, 0xb2, 0x81, 0x54, 0xc3, 0x07, + 0x66, 0x44, 0x36, 0x21, 0x2a, 0x2a, 0x37, 0x08, 0x2a, 0x58, 0x97, 0x34, 0x08, 0x2a, 0x9a, 0x87, + 0x3e, 0x9d, 0x7c, 0x01, 0x4a, 0x7e, 0xed, 0x54, 0x4b, 0x87, 0xff, 0x75, 0x50, 0xe5, 0x18, 0x70, + 0x68, 0xdf, 0x2a, 0x80, 0xfc, 0x29, 0x05, 0x97, 0x6b, 0x9a, 0x9e, 0xcc, 0x52, 0x65, 0x44, 0x96, + 0x2a, 0x90, 0x5b, 0x51, 0xe5, 0x18, 0x70, 0x90, 0x8b, 0x90, 0xeb, 0x9a, 0xb6, 0x0a, 0x2b, 0x8a, + 0x5d, 0xe5, 0xba, 0x69, 0x23, 0x2f, 0x13, 0x24, 0xfd, 0xa1, 0x4a, 0xb4, 0x48, 0x92, 0xfe, 0x10, + 0x79, 0x19, 0x77, 0x2e, 0x2d, 0xc7, 0xe9, 0x6c, 0xeb, 0x46, 0xc7, 0x0f, 0x7d, 0xe7, 0xc5, 0xec, + 0x15, 0xce, 0xe5, 0x5a, 0x9c, 0x84, 0x49, 0x5e, 0x2e, 0x6e, 0x38, 0x8e, 0xd5, 0x74, 0x1e, 0xd8, + 0xbe, 0x78, 0x21, 0x14, 0x5f, 0x8e, 0x93, 0x30, 0xc9, 0x4b, 0xb6, 0xe0, 0x99, 0xb7, 0xa9, 0xeb, + 0xa8, 0x16, 0x6b, 0x58, 0x94, 0xf6, 0x7c, 0x18, 0x69, 0xa0, 0x44, 0x56, 0xe8, 0xd5, 0x74, 0x16, + 0x1c, 0x25, 0x2b, 0x92, 0x4d, 0xba, 0xdb, 0xa6, 0x6c, 0xc3, 0x75, 0xf8, 0xde, 0xc9, 0xb4, 0xdb, + 0x3e, 0xec, 0x54, 0x08, 0xbb, 0x99, 0xce, 0x82, 0xa3, 0x64, 0xc9, 0x3a, 0x9c, 0x95, 0xa4, 0x88, + 0xcf, 0xac, 0x6c, 0x5d, 0x6d, 0x7f, 0x50, 0xfb, 0xcc, 0x0a, 0xed, 0xb9, 0xd4, 0xe0, 0x06, 0x7a, + 0x33, 0xc9, 0x86, 0xc3, 0x92, 0xe2, 0x57, 0x51, 0x2a, 0xdc, 0xbb, 0x41, 0x5d, 0xd1, 0xe5, 0x22, + 0x76, 0xa4, 0x1c, 0x73, 0x4c, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x02, 0xd5, 0x28, 0xec, 0xd2, 0xae, + 0x6e, 0x5a, 0xfa, 0xb6, 0x69, 0x99, 0x6c, 0x4f, 0xe4, 0x8a, 0x67, 0x64, 0x30, 0x72, 0x73, 0x04, + 0x0f, 0x8e, 0x94, 0xd6, 0xfe, 0x20, 0x07, 0xe2, 0xaf, 0x42, 0xe4, 0x3e, 0xe4, 0x2c, 0xa7, 0xad, + 0x4c, 0xf2, 0xf8, 0x91, 0x8e, 0x35, 0xa7, 0x2d, 0x07, 0xde, 0x9a, 0xd3, 0x46, 0x8e, 0x48, 0x0c, + 0x28, 0x74, 0xf4, 0x56, 0x47, 0x57, 0x16, 0x78, 0x7c, 0x7f, 0x23, 0x48, 0xe4, 0xa9, 0x1b, 0xa2, + 0xfc, 0x15, 0x25, 0x36, 0x77, 0x6c, 0xb6, 0xfd, 0xdf, 0x84, 0xa8, 0xad, 0xdf, 0x04, 0xb1, 0x31, + 0x1f, 0x49, 0xae, 0x82, 0xc1, 0x2b, 0x86, 0x3a, 0x88, 0x01, 0xc5, 0x7e, 0x53, 0xfc, 0xdd, 0x29, + 0x3f, 0xa1, 0x17, 0xb3, 0xb5, 0x22, 0xbe, 0x49, 0xac, 0x5f, 0xf2, 0x19, 0x15, 0xb4, 0xf6, 0x17, + 0x19, 0x98, 0x69, 0x58, 0x66, 0xd3, 0xb4, 0xdb, 0x27, 0x77, 0x27, 0x97, 0xdc, 0x85, 0x82, 0x67, + 0x99, 0x4d, 0x3a, 0xe6, 0x65, 0x51, 0xd1, 0x19, 0xbc, 0x96, 0x14, 0x25, 0x8e, 0xf6, 0xa7, 0x79, + 0x50, 0xbf, 0xc2, 0x22, 0x7d, 0x28, 0xb7, 0xfd, 0x9b, 0xab, 0xaa, 0xca, 0x2f, 0x4f, 0x70, 0xc3, + 0x21, 0x76, 0x07, 0x56, 0xf6, 0x4e, 0x50, 0x88, 0xa1, 0x26, 0x42, 0xe3, 0x63, 0x6e, 0x65, 0xc2, + 0x31, 0x27, 0xd5, 0x0d, 0x8f, 0x3a, 0x1d, 0xf2, 0x3b, 0x8c, 0xf5, 0x26, 0x3e, 0x88, 0x1b, 0x9e, + 0xb1, 0x95, 0x61, 0x3c, 0xfe, 0x8e, 0x02, 0x9a, 0xab, 0xb0, 0xf5, 0x63, 0xb8, 0xe1, 0x1e, 0x86, + 0x50, 0x55, 0x84, 0x55, 0x67, 0x1e, 0x0a, 0x68, 0xf2, 0xeb, 0x50, 0x61, 0xae, 0x6e, 0x7b, 0x2d, + 0xc7, 0xed, 0x52, 0x57, 0x2d, 0xfe, 0xab, 0x13, 0x8c, 0xe7, 0xcd, 0x10, 0x4d, 0x46, 0x3d, 0x62, + 0x45, 0x18, 0xd5, 0xa6, 0x75, 0x41, 0xb9, 0xed, 0xc4, 0x88, 0xfd, 0x49, 0x40, 0x66, 0x3a, 0x17, + 0x0e, 0x37, 0x16, 0x83, 0xbb, 0xe4, 0x91, 0xbb, 0x75, 0xa9, 0xbf, 0x0c, 0xd0, 0xfe, 0x39, 0x0b, + 0xb9, 0xcd, 0xb5, 0x86, 0xbc, 0x2a, 0x22, 0x7e, 0xac, 0x41, 0x1b, 0x1d, 0xb3, 0x77, 0x8f, 0xba, + 0x66, 0x6b, 0x4f, 0xad, 0xbd, 0x91, 0xab, 0x22, 0x49, 0x0e, 0x4c, 0x91, 0x22, 0xaf, 0xc1, 0xb4, + 0xa1, 0x2f, 0x53, 0x97, 0x49, 0x17, 0xe6, 0x68, 0x51, 0x73, 0x71, 0x82, 0x61, 0x79, 0x29, 0x14, + 0xc7, 0x18, 0x18, 0xd9, 0x02, 0x30, 0x42, 0xe8, 0x23, 0x45, 0xd2, 0xe5, 0xaf, 0x13, 0x42, 0xe0, + 0x08, 0x10, 0x41, 0x28, 0x77, 0x38, 0xab, 0x40, 0xcd, 0x1f, 0x05, 0x55, 0x4c, 0xba, 0xdb, 0xbe, + 0x2c, 0x86, 0x30, 0xda, 0x7f, 0x64, 0x20, 0xdc, 0x04, 0x12, 0x0f, 0x8a, 0x4d, 0x71, 0x6b, 0x5b, + 0x4d, 0xfb, 0xf1, 0x37, 0xd3, 0xf1, 0x1f, 0x96, 0xd4, 0xc9, 0xfe, 0xa0, 0x96, 0xf8, 0x89, 0x09, + 0x2a, 0x55, 0xa4, 0x0d, 0xb9, 0x37, 0x9d, 0xed, 0x89, 0x67, 0x7d, 0xe4, 0xfc, 0x8f, 0xdc, 0x39, + 0x45, 0x0a, 0x90, 0x6b, 0xd0, 0xbe, 0x95, 0x85, 0x4a, 0x64, 0x4c, 0x4f, 0xfc, 0x53, 0x82, 0x87, + 0x89, 0x9f, 0x12, 0x6c, 0x8c, 0xbf, 0x2b, 0x0f, 0x6b, 0x75, 0xd2, 0xff, 0x25, 0xf8, 0xdb, 0x2c, + 0xe4, 0xb6, 0x56, 0x56, 0xf9, 0xe2, 0x1b, 0x9c, 0x03, 0x9a, 0x38, 0x31, 0x15, 0xfe, 0x13, 0x4d, + 0x8c, 0xb4, 0xe0, 0x15, 0x43, 0x1d, 0x64, 0x07, 0xa6, 0xb6, 0xfb, 0xa6, 0xc5, 0x4c, 0x7b, 0xe2, + 0x53, 0x67, 0xfe, 0x3f, 0x1c, 0xd4, 0x71, 0x19, 0x89, 0x8a, 0x3e, 0x3c, 0x69, 0xc3, 0x54, 0x5b, + 0x5e, 0x03, 0x51, 0x73, 0xef, 0xa5, 0xf1, 0x57, 0x2f, 0x89, 0x23, 0x15, 0xa9, 0x17, 0xf4, 0xd1, + 0xb5, 0x6f, 0x82, 0x5a, 0xfc, 0x89, 0x77, 0x32, 0xad, 0x19, 0x04, 0x86, 0xd2, 0x5a, 0x54, 0xfb, + 0xcf, 0x0c, 0xc4, 0xad, 0xf4, 0x27, 0xdf, 0xa9, 0x9d, 0x64, 0xa7, 0xae, 0x1c, 0xc7, 0x1c, 0x48, + 0xef, 0x57, 0xed, 0xaf, 0xb3, 0x50, 0x54, 0x3f, 0x0b, 0x3d, 0xf9, 0xec, 0x07, 0x8d, 0x65, 0x3f, + 0x96, 0x27, 0xfc, 0x75, 0xe2, 0xc8, 0xdc, 0x47, 0x37, 0x91, 0xfb, 0x98, 0xf4, 0x1f, 0x8d, 0x8f, + 0xc9, 0x7c, 0xfc, 0x7d, 0x06, 0x4e, 0x49, 0xc6, 0x9b, 0xb6, 0xc7, 0x74, 0xdb, 0x10, 0x4e, 0xb1, + 0x8c, 0x44, 0x4d, 0x1c, 0xda, 0x53, 0x61, 0x68, 0xe1, 0xae, 0xca, 0x67, 0x54, 0xd0, 0x7c, 0xb3, + 0xbc, 0xe3, 0x78, 0x4c, 0x98, 0xdb, 0x6c, 0x7c, 0x93, 0xfd, 0xb2, 0x2a, 0xc7, 0x80, 0x23, 0xb9, + 0x7b, 0x2f, 0x8c, 0xde, 0xbd, 0x6b, 0x7f, 0x96, 0x81, 0xe9, 0xe8, 0xdf, 0x29, 0xc7, 0x4f, 0xe4, + 0x24, 0xf2, 0x28, 0xd9, 0x13, 0xc8, 0xa3, 0x7c, 0x98, 0x01, 0xf0, 0x2b, 0x7b, 0xe2, 0x59, 0x94, + 0x66, 0x3c, 0x8b, 0x32, 0x71, 0xb7, 0xa6, 0xe7, 0x50, 0x7e, 0x50, 0xf0, 0x3f, 0x49, 0x64, 0x50, + 0xde, 0xcb, 0xc0, 0x29, 0x3d, 0x96, 0x95, 0x98, 0xd8, 0x93, 0x48, 0x24, 0x39, 0x82, 0xbf, 0x79, + 0xc6, 0xcb, 0x31, 0xa1, 0x96, 0x5c, 0x83, 0xe9, 0x9e, 0x0a, 0x15, 0xdf, 0x09, 0x47, 0x5d, 0x70, + 0x00, 0x79, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x63, 0xb2, 0x40, 0xb9, 0x63, 0xc9, 0x02, 0x45, 0x8f, + 0x9a, 0xe5, 0x0f, 0x3c, 0x6a, 0x66, 0x43, 0xb9, 0xe5, 0x3a, 0x5d, 0x91, 0x68, 0x51, 0xff, 0x4e, + 0x9c, 0x30, 0x79, 0x13, 0x2c, 0x2a, 0xab, 0x3e, 0x2e, 0x86, 0x2a, 0xf8, 0x32, 0xcd, 0x1c, 0xa9, + 0xad, 0x78, 0x1c, 0xda, 0x82, 0xa9, 0xbb, 0x29, 0x51, 0xd1, 0x87, 0x8f, 0x27, 0x53, 0xa6, 0x3e, + 0x99, 0x64, 0x8a, 0xf6, 0x4f, 0x59, 0xdf, 0x5e, 0x34, 0x12, 0x77, 0x92, 0x32, 0x23, 0xee, 0x24, + 0xa9, 0xdb, 0xb5, 0xd1, 0x74, 0xc3, 0xf3, 0x50, 0x74, 0xa9, 0xee, 0x39, 0xb6, 0xba, 0xa7, 0x1e, + 0x58, 0x5b, 0x14, 0xa5, 0xa8, 0xa8, 0xd1, 0xb4, 0x44, 0xf6, 0x31, 0x69, 0x89, 0x2f, 0x44, 0x06, + 0x84, 0xcc, 0xff, 0x06, 0x73, 0x3b, 0x65, 0x50, 0x88, 0x98, 0xa5, 0xfa, 0x25, 0x7f, 0x21, 0x19, + 0xb3, 0x54, 0xbf, 0xcb, 0x0f, 0x38, 0x48, 0x13, 0xa6, 0x2d, 0xdd, 0x63, 0x22, 0x2a, 0xd5, 0x5c, + 0x62, 0x63, 0xe4, 0x3c, 0x82, 0x69, 0xb3, 0x16, 0xc1, 0xc1, 0x18, 0xaa, 0xf6, 0x7b, 0x19, 0x08, + 0x9b, 0xfc, 0x88, 0xd1, 0xd1, 0x57, 0xa0, 0xd4, 0xd5, 0x1f, 0xae, 0x50, 0x4b, 0xdf, 0x9b, 0xe4, + 0xef, 0x57, 0xeb, 0x0a, 0x03, 0x03, 0x34, 0x6d, 0x90, 0x01, 0x75, 0x63, 0x97, 0x50, 0x28, 0xb4, + 0xcc, 0x87, 0xaa, 0x3e, 0x93, 0x78, 0x2a, 0x91, 0xff, 0xad, 0xc9, 0xf8, 0x82, 0x28, 0x40, 0x89, + 0x4e, 0xba, 0x30, 0xe5, 0xc9, 0xf0, 0x8f, 0xfa, 0x94, 0xf1, 0x77, 0xe5, 0xb1, 0x30, 0x92, 0xba, + 0xee, 0x2b, 0x8b, 0xd0, 0xd7, 0x51, 0x9f, 0xff, 0xe0, 0xe3, 0xb9, 0xa7, 0x3e, 0xfc, 0x78, 0xee, + 0xa9, 0x8f, 0x3e, 0x9e, 0x7b, 0xea, 0x9d, 0xfd, 0xb9, 0xcc, 0x07, 0xfb, 0x73, 0x99, 0x0f, 0xf7, + 0xe7, 0x32, 0x1f, 0xed, 0xcf, 0x65, 0xfe, 0x6d, 0x7f, 0x2e, 0xf3, 0xbb, 0xff, 0x3e, 0xf7, 0xd4, + 0xab, 0x25, 0x1f, 0xf3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0c, 0xe6, 0xa8, 0xb2, 0x02, 0x64, + 0x00, 0x00, } func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) { @@ -3167,11 +3167,13 @@ func (m *Edge) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i -= len(m.OnFull) - copy(dAtA[i:], m.OnFull) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.OnFull))) - i-- - dAtA[i] = 0x32 + if m.OnFull != nil { + i -= len(*m.OnFull) + copy(dAtA[i:], *m.OnFull) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.OnFull))) + i-- + dAtA[i] = 0x32 + } if m.Parallelism != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.Parallelism)) i-- @@ -6813,8 +6815,10 @@ func (m *Edge) Size() (n int) { if m.Parallelism != nil { n += 1 + sovGenerated(uint64(*m.Parallelism)) } - l = len(m.OnFull) - n += 1 + l + sovGenerated(uint64(l)) + if m.OnFull != nil { + l = len(*m.OnFull) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -8246,7 +8250,7 @@ func (this *Edge) String() string { `Conditions:` + strings.Replace(this.Conditions.String(), "ForwardConditions", "ForwardConditions", 1) + `,`, `Limits:` + strings.Replace(this.Limits.String(), "EdgeLimits", "EdgeLimits", 1) + `,`, `Parallelism:` + valueToStringGenerated(this.Parallelism) + `,`, - `OnFull:` + fmt.Sprintf("%v", this.OnFull) + `,`, + `OnFull:` + valueToStringGenerated(this.OnFull) + `,`, `}`, }, "") return s @@ -11575,7 +11579,8 @@ func (m *Edge) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.OnFull = string(dAtA[iNdEx:postIndex]) + s := string(dAtA[iNdEx:postIndex]) + m.OnFull = &s iNdEx = postIndex default: iNdEx = preIndex diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto index e6abdd67d3..cf0718357b 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.proto +++ b/pkg/apis/numaflow/v1alpha1/generated.proto @@ -277,8 +277,9 @@ message Edge { optional int32 parallelism = 5; // OnFull specifies the behaviour for the write actions when the inter step buffer is full. - // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess". - // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest + // There are currently two options, retryUntilSuccess and discardLatest. + // if not provided, the default value is set to "retryUntilSuccess" + // +kubebuilder:validation:Enum=retryUntilSuccess;discardLatest // +optional optional string onFull = 6; } diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go index 1fc84b3f42..aed25bc0c4 100644 --- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go @@ -905,8 +905,7 @@ func schema_pkg_apis_numaflow_v1alpha1_Edge(ref common.ReferenceCallback) common }, "onFull": { SchemaProps: spec.SchemaProps{ - Description: "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".", - Default: "", + Description: "OnFull specifies the behaviour for the write actions when the inter step buffer is full. There are currently two options, retryUntilSuccess and discardLatest. if not provided, the default value is set to \"retryUntilSuccess\"", Type: []string{"string"}, Format: "", }, diff --git a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go index 1e09b34b9d..002170ce97 100644 --- a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go @@ -408,6 +408,11 @@ func (in *Edge) DeepCopyInto(out *Edge) { *out = new(int32) **out = **in } + if in.OnFull != nil { + in, out := &in.OnFull, &out.OnFull + *out = new(string) + **out = **in + } return } diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go index 3ee53256be..8cf629445d 100644 --- a/pkg/forward/forward.go +++ b/pkg/forward/forward.go @@ -23,7 +23,6 @@ import ( "context" "fmt" "math" - "strings" "sync" "time" @@ -47,11 +46,9 @@ type InterStepDataForward struct { ctx context.Context // cancelFn cancels our new context, our cancellation is little more complex and needs to be well orchestrated, hence // we need something more than a cancel(). - cancelFn context.CancelFunc - fromBuffer isb.BufferReader - toBuffers map[string]isb.BufferWriter - // key is the toBuffer name, value is the corresponding onFull action. - onFullActions map[string]string + cancelFn context.CancelFunc + fromBuffer isb.BufferReader + toBuffers map[string]isb.BufferWriter FSD ToWhichStepDecider UDF applier.MapApplier fetchWatermark fetch.Fetcher @@ -71,7 +68,6 @@ func NewInterStepDataForward(vertex *dfv1.Vertex, fromStep isb.BufferReader, toSteps map[string]isb.BufferWriter, fsd ToWhichStepDecider, - onFullActions map[string]string, applyUDF applier.MapApplier, fetchWatermark fetch.Fetcher, publishWatermark map[string]publish.Publisher, @@ -91,7 +87,6 @@ func NewInterStepDataForward(vertex *dfv1.Vertex, cancelFn: cancel, fromBuffer: fromStep, toBuffers: toSteps, - onFullActions: onFullActions, FSD: fsd, UDF: applyUDF, fetchWatermark: fetchWatermark, @@ -490,19 +485,16 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is for { _writeOffsets, errs := toBuffer.Write(ctx, messages) // Note: this is an unwanted memory allocation during a happy path. We want only minimal allocation since using failedMessages is an unlikely path. - failedMessages := make([]isb.Message, 0, len(messages)) + var failedMessages []isb.Message needRetry := false - for idx, msg := range messages { if err := errs[idx]; err != nil { // ATM there are no user defined errors during write, all are InternalErrors. - - // using `strings.Contains` to check BufferFull error type is not a good practice for two reasons: - // 1. it's an O(n) operation which, if being called frequently, can introduce performance issue. - // 2. it assumes that all the buffer implementations implement err.Error() to use "Buffer full" as error message content. - // TODO - a better way could be to declare a BufferFullError type and use type check instead of checking error message. - needRetry = !(isdf.onFullActions[toBuffer.GetName()] == dfv1.DropAndAckLatest && strings.Contains(err.Error(), "Buffer full")) - if needRetry { + if _, ok := err.(isb.NoRetryableBufferWriteErr); ok { + // If toBuffer returns us a NoRetryableBufferWriteErr, we drop the message. + dropBytes += float64(len(msg.Payload)) + } else { + needRetry = true // we retry only failed messages failedMessages = append(failedMessages, msg) writeMessagesError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Inc() @@ -511,9 +503,6 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is platformError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName}).Inc() return writeOffsets, fmt.Errorf("writeToBuffer failed, Stop called while stuck on an internal error with failed messages:%d, %v", len(failedMessages), errs) } - } else { - // drop the message - dropBytes += float64(len(msg.Payload)) } } else { writeCount++ diff --git a/pkg/forward/forward_test.go b/pkg/forward/forward_test.go index cb5bfb5632..2d980332ce 100644 --- a/pkg/forward/forward_test.go +++ b/pkg/forward/forward_test.go @@ -96,9 +96,6 @@ func TestNewInterStepDataForward(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", @@ -113,7 +110,7 @@ func TestNewInterStepDataForward(t *testing.T) { writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -229,9 +226,6 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -247,7 +241,7 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) { fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -397,9 +391,6 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -414,7 +405,7 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) { fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -581,9 +572,6 @@ func TestSourceInterStepDataForward(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", AbstractVertex: dfv1.AbstractVertex{ @@ -598,13 +586,13 @@ func TestSourceInterStepDataForward(t *testing.T) { _, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) // verify if source watermark publisher is not set, NewInterStepDataForward throws. - failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource)) + failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource)) assert.True(t, failedForwarder == nil) assert.Error(t, err) assert.Equal(t, fmt.Errorf("failed to assign a non-nil source watermark publisher for source vertex data forwarder"), err) // create a valid source forwarder - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{})) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{})) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -634,17 +622,13 @@ func TestSourceInterStepDataForward(t *testing.T) { <-stopped } -// TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess explicitly tests the case of retrying failed messages -func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) { +// TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess explicitly tests the case of retrying failed messages +func TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess(t *testing.T) { fromStep := simplebuffer.NewInMemoryBuffer("from", 25) to1 := simplebuffer.NewInMemoryBuffer("to1", 10) toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -657,7 +641,7 @@ func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -689,16 +673,13 @@ func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) { <-stopped } -// TestWriteToBufferError_ActionOnFullIsDropAndAckLatest explicitly tests the case of dropping messages when buffer is full -func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) { +// TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest explicitly tests the case of dropping messages when buffer is full +func TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest(t *testing.T) { fromStep := simplebuffer.NewInMemoryBuffer("from", 25) - to1 := simplebuffer.NewInMemoryBuffer("to1", 10) + to1 := simplebuffer.NewInMemoryBuffer("to1", 10, simplebuffer.WithOnFullWritingStrategy(dfv1.DiscardLatest)) toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.DropAndAckLatest, - } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -710,7 +691,7 @@ func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -721,7 +702,7 @@ func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) { messageToStep["to1"] = make([]isb.Message, 0) messageToStep["to1"] = append(messageToStep["to1"], writeMessages[0:11]...) _, err = f.writeToBuffers(ctx, messageToStep) - // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DropAndAckLatest, + // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DiscardLatest, // the writeToBuffers() call should return no error. assert.Nil(t, err) // stop will cancel the contexts and therefore the forwarder stops without waiting @@ -738,11 +719,6 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) { "to1": to1, "to2": to2, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - "to2": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -757,7 +733,7 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) { fetchWatermark := &testForwardFetcher{} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -839,11 +815,6 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) { "to1": to1, "to2": to2, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - "to2": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -858,7 +829,7 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) { fetchWatermark := &testForwardFetcher{} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, actionsOnFull, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -937,10 +908,6 @@ func TestNewInterStepData_forwardToAll(t *testing.T) { "to1": to1, "to2": to2, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - "to2": dfv1.RetryUntilSuccess, - } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -954,7 +921,7 @@ func TestNewInterStepData_forwardToAll(t *testing.T) { }} fetchWatermark := &testForwardFetcher{} publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, actionsOnFull, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -1039,10 +1006,6 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -1056,7 +1019,7 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, actionsOnFull, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) assert.False(t, to1.IsFull()) assert.True(t, to1.IsEmpty()) @@ -1089,9 +1052,6 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -1105,7 +1065,7 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, actionsOnFull, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) assert.True(t, to1.IsEmpty()) @@ -1139,10 +1099,6 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() @@ -1156,7 +1112,7 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, actionsOnFull, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) assert.True(t, to1.IsEmpty()) diff --git a/pkg/forward/shutdown_test.go b/pkg/forward/shutdown_test.go index b7f851ed07..5b2f9231d0 100644 --- a/pkg/forward/shutdown_test.go +++ b/pkg/forward/shutdown_test.go @@ -47,10 +47,6 @@ func TestInterStepDataForward_Stop(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -65,7 +61,7 @@ func TestInterStepDataForward_Stop(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) stopped := f.Start() // write some data but buffer is not full even though we are not reading @@ -84,10 +80,6 @@ func TestInterStepDataForward_ForceStop(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } - ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -102,7 +94,7 @@ func TestInterStepDataForward_ForceStop(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) + f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2)) assert.NoError(t, err) stopped := f.Start() // write some data such that the fromBuffer can be empty, that is toBuffer gets full diff --git a/pkg/isb/errors.go b/pkg/isb/errors.go index 2ecd890f1e..c30cbd39f6 100644 --- a/pkg/isb/errors.go +++ b/pkg/isb/errors.go @@ -96,3 +96,13 @@ type MessageReadErr struct { func (e MessageReadErr) Error() string { return fmt.Sprintf("(%s) %s Header: %s Body:%s", e.Name, e.Message, string(e.Header), string(e.Body)) } + +// NoRetryableBufferWriteErr indicates that the buffer is full and the writer, based on user specification, decides to not retry. +type NoRetryableBufferWriteErr struct { + Name string + Message string +} + +func (e NoRetryableBufferWriteErr) Error() string { + return fmt.Sprintf("(%s) %s %#v", e.Name, e.Message, e) +} diff --git a/pkg/isb/interfaces.go b/pkg/isb/interfaces.go index de18a3f7c1..20a680f173 100644 --- a/pkg/isb/interfaces.go +++ b/pkg/isb/interfaces.go @@ -51,7 +51,6 @@ type BufferWriter interface { BufferWriterInformation io.Closer Write(context.Context, []Message) ([]Offset, []error) - IsFull() bool } // BufferReader is the buffer from which we are reading. diff --git a/pkg/isb/stores/jetstream/options.go b/pkg/isb/stores/jetstream/options.go index 6af8ba6284..49ec9da565 100644 --- a/pkg/isb/stores/jetstream/options.go +++ b/pkg/isb/stores/jetstream/options.go @@ -32,14 +32,17 @@ type writeOptions struct { refreshInterval time.Duration // useWriteInfoAsRate indicates whether to check the write sequence for rate calculation useWriteInfoAsRate bool + // onFullWritingStrategy is the writing strategy when buffer is full + onFullWritingStrategy dfv1.OnFullWritingStrategy } func defaultWriteOptions() *writeOptions { return &writeOptions{ - maxLength: dfv1.DefaultBufferLength, - bufferUsageLimit: dfv1.DefaultBufferUsageLimit, - refreshInterval: 1 * time.Second, - useWriteInfoAsRate: false, + maxLength: dfv1.DefaultBufferLength, + bufferUsageLimit: dfv1.DefaultBufferUsageLimit, + refreshInterval: 1 * time.Second, + useWriteInfoAsRate: false, + onFullWritingStrategy: dfv1.RetryUntilSuccess, } } @@ -77,6 +80,14 @@ func WithUsingWriteInfoAsRate(yes bool) WriteOption { } } +// WithOnFullWritingStrategy sets the writing strategy when buffer is full +func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) WriteOption { + return func(o *writeOptions) error { + o.onFullWritingStrategy = s + return nil + } +} + // options for reading from JetStream type readOptions struct { // readTimeOut is the timeout needed for read timeout diff --git a/pkg/isb/stores/jetstream/writer.go b/pkg/isb/stores/jetstream/writer.go index def0aeaed4..d6565fce43 100644 --- a/pkg/isb/stores/jetstream/writer.go +++ b/pkg/isb/stores/jetstream/writer.go @@ -26,6 +26,7 @@ import ( "go.uber.org/atomic" "go.uber.org/zap" + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" "github.com/numaproj/numaflow/pkg/isb" jsclient "github.com/numaproj/numaflow/pkg/shared/clients/nats" "github.com/numaproj/numaflow/pkg/shared/logging" @@ -194,11 +195,22 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([ for i := 0; i < len(errs); i++ { errs[i] = fmt.Errorf("unknown error") } - if jw.IsFull() { + if jw.isFull.Load() { jw.log.Debugw("Is full") isbFull.With(map[string]string{"buffer": jw.GetName()}).Inc() - for i := 0; i < len(errs); i++ { - errs[i] = isb.BufferWriteErr{Name: jw.name, Full: true, Message: "Buffer full!"} + // when buffer is full, we need to decide whether to discard the message or not. + switch jw.opts.onFullWritingStrategy { + case v1alpha1.DiscardLatest: + // user explicitly wants to discard the message when buffer if full. + // return no retryable error as a callback to let caller know that the message is discarded. + for i := 0; i < len(errs); i++ { + errs[i] = isb.NoRetryableBufferWriteErr{Name: jw.name, Message: "Buffer full!"} + } + default: + // Default behavior is to return a BufferWriteErr. + for i := 0; i < len(errs); i++ { + errs[i] = isb.BufferWriteErr{Name: jw.name, Full: true, Message: "Buffer full!"} + } } isbWriteErrors.With(labels).Inc() return nil, errs @@ -210,11 +222,6 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([ return jw.syncWrite(ctx, messages, errs, labels) } -// IsFull returns whether the buffer is full. It could be approximate. -func (jw *jetStreamWriter) IsFull() bool { - return jw.isFull.Load() -} - func (jw *jetStreamWriter) asyncWrite(_ context.Context, messages []isb.Message, errs []error, metricsLabels map[string]string) ([]isb.Offset, []error) { var writeOffsets = make([]isb.Offset, len(messages)) var futures = make([]nats.PubAckFuture, len(messages)) diff --git a/pkg/isb/stores/jetstream/writer_test.go b/pkg/isb/stores/jetstream/writer_test.go index 179f8d6b66..607103928d 100644 --- a/pkg/isb/stores/jetstream/writer_test.go +++ b/pkg/isb/stores/jetstream/writer_test.go @@ -114,7 +114,7 @@ func TestForwarderJetStreamBuffer(t *testing.T) { "to1": to1, } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, map[string]string{"toStreamName": dfv1.RetryUntilSuccess}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() @@ -212,6 +212,62 @@ func TestJetStreamBufferWriterBufferFull(t *testing.T) { } } +// TestJetStreamBufferWrite on buffer full, with writing strategy being DiscardLatest +func TestJetStreamBufferWriterBufferFull_DiscardLatest(t *testing.T) { + s := natstest.RunJetStreamServer(t) + defer natstest.ShutdownJetStreamServer(t, s) + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel() + + defaultJetStreamClient := natstest.JetStreamClient(t, s) + conn, err := defaultJetStreamClient.Connect(ctx) + assert.NoError(t, err) + js, err := conn.JetStream() + assert.NoError(t, err) + + streamName := "TestJetStreamBufferWriterBufferFull" + addStream(t, js, streamName) + defer deleteStream(js, streamName) + + bw, err := NewJetStreamBufferWriter(ctx, defaultJetStreamClient, streamName, streamName, streamName, WithMaxLength(10), WithBufferUsageLimit(0.2), WithOnFullWritingStrategy(dfv1.DiscardLatest)) + assert.NoError(t, err) + jw, _ := bw.(*jetStreamWriter) + timeout := time.After(10 * time.Second) + for jw.isFull.Load() { + select { + case <-timeout: + t.Fatalf("expected not to be full") + default: + time.Sleep(500 * time.Millisecond) + } + } + // Add some data + startTime := time.Unix(1636470000, 0) + messages := testutils.BuildTestWriteMessages(int64(2), startTime) + // Add some data to buffer using write and verify no writes are performed when buffer is full + _, errs := jw.Write(ctx, messages) + assert.Equal(t, len(errs), 2) + for _, errMsg := range errs { + assert.Nil(t, errMsg) // Buffer not full, expect no error + } + timeout = time.After(10 * time.Second) + for !jw.isFull.Load() { + select { + case <-timeout: + t.Fatalf("expected to be full") + default: + time.Sleep(500 * time.Millisecond) + } + } + messages = testutils.BuildTestWriteMessages(int64(2), time.Unix(1636470001, 0)) + _, errs = jw.Write(ctx, messages) + assert.Equal(t, len(errs), 2) + for _, errMsg := range errs { + assert.Equal(t, errMsg, isb.NoRetryableBufferWriteErr{Name: streamName, Message: "Buffer full!"}) + } +} + // TestGetName is used to test the GetName function func TestWriteGetName(t *testing.T) { s := natstest.RunJetStreamServer(t) diff --git a/pkg/isb/stores/redis/options.go b/pkg/isb/stores/redis/options.go index ba5a1cace3..37fc071931 100644 --- a/pkg/isb/stores/redis/options.go +++ b/pkg/isb/stores/redis/options.go @@ -18,6 +18,8 @@ package redis import ( "time" + + dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" ) // options for writing to redis @@ -38,6 +40,8 @@ type options struct { bufferUsageLimit float64 // refreshBufferWriteInfo is used to determine if we refresh buffer write info refreshBufferWriteInfo bool + // onFullWritingStrategy is the writing strategy when buffer is full + onFullWritingStrategy dfv1.OnFullWritingStrategy } // Option to apply different options @@ -49,7 +53,7 @@ type Option interface { type pipelining bool func (p pipelining) apply(opts *options) { - opts.pipelining = true + opts.pipelining = bool(p) } // WithoutPipelining turns on redis pipelining @@ -97,7 +101,7 @@ func WithReadTimeOut(t time.Duration) Option { type checkBackLog bool func (b checkBackLog) apply(o *options) { - o.checkBackLog = true + o.checkBackLog = bool(b) } // WithCheckBacklog sets the checkBackLog option @@ -140,3 +144,15 @@ func (r refreshBufferWriteInfo) apply(o *options) { func WithRefreshBufferWriteInfo(r bool) Option { return refreshBufferWriteInfo(r) } + +// WithOnFullWritingStrategy option +type onFullWritingStrategy dfv1.OnFullWritingStrategy + +func (s onFullWritingStrategy) apply(o *options) { + o.onFullWritingStrategy = dfv1.OnFullWritingStrategy(s) +} + +// WithOnFullWritingStrategy sets the OnFullWritingStrategy +func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option { + return onFullWritingStrategy(s) +} diff --git a/pkg/isb/stores/redis/read_test.go b/pkg/isb/stores/redis/read_test.go index 6bbe65e8c0..3c0c98ee33 100644 --- a/pkg/isb/stores/redis/read_test.go +++ b/pkg/isb/stores/redis/read_test.go @@ -130,11 +130,8 @@ func TestRedisCheckBacklog(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": rqw, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10)) + f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10)) stopped := f.Start() // validate the length of the toStep stream. @@ -317,9 +314,6 @@ func (suite *ReadWritePerformance) SetupSuite() { toSteps := map[string]isb.BufferWriter{ "to1": rqw, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", @@ -329,7 +323,7 @@ func (suite *ReadWritePerformance) SetupSuite() { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) + isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) suite.ctx = ctx suite.rclient = client @@ -416,11 +410,8 @@ func (suite *ReadWritePerformance) TestReadWriteLatencyPipelining() { toSteps := map[string]isb.BufferWriter{ "to1": suite.rqw, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) + suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark) suite.False(suite.rqw.IsFull()) var writeMessages = make([]isb.Message, 0, suite.count) diff --git a/pkg/isb/stores/redis/write.go b/pkg/isb/stores/redis/write.go index dbe78a4817..a8708ce703 100644 --- a/pkg/isb/stores/redis/write.go +++ b/pkg/isb/stores/redis/write.go @@ -73,6 +73,7 @@ func NewBufferWrite(ctx context.Context, client *redisclient.RedisClient, name s maxLength: dfv1.DefaultBufferLength, bufferUsageLimit: dfv1.DefaultBufferUsageLimit, refreshBufferWriteInfo: true, + onFullWritingStrategy: dfv1.RetryUntilSuccess, } for _, o := range opts { @@ -158,7 +159,17 @@ func (bw *BufferWrite) Write(_ context.Context, messages []isb.Message) ([]isb.O if bw.IsFull() { bw.log.Debugw("Is full") isbIsFull.With(labels).Inc() - initializeErrorArray(errs, isb.BufferWriteErr{Name: bw.Name, Full: true, Message: "Buffer full!"}) + + // when buffer is full, we need to decide whether to discard the message or not. + switch bw.onFullWritingStrategy { + case dfv1.DiscardLatest: + // user explicitly wants to discard the message when buffer if full. + // return no retryable error as a callback to let caller know that the message is discarded. + initializeErrorArray(errs, isb.NoRetryableBufferWriteErr{Name: bw.Name, Message: "Buffer full!"}) + default: + // Default behavior is to return a BufferWriteErr. + initializeErrorArray(errs, isb.BufferWriteErr{Name: bw.Name, Full: true, Message: "Buffer full!"}) + } isbWriteErrors.With(labels).Inc() return nil, errs } diff --git a/pkg/isb/stores/redis/write_test.go b/pkg/isb/stores/redis/write_test.go index 1bc8b4e2e6..2b071c4623 100644 --- a/pkg/isb/stores/redis/write_test.go +++ b/pkg/isb/stores/redis/write_test.go @@ -177,6 +177,46 @@ func TestRedisQWrite_WithInfoRefreshInterval(t *testing.T) { } } +func TestRedisQWrite_WithInfoRefreshInterval_DiscardMessageOnFull(t *testing.T) { + client := redisclient.NewRedisClient(redisOptions) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + stream := "withInfoRefreshInterval" + count := int64(10) + group := "withInfoRefreshInterval-group" + rqw, _ := NewBufferWrite(ctx, client, stream, group, WithInfoRefreshInterval(2*time.Millisecond), WithLagDuration(2*time.Millisecond), WithMaxLength(10), WithOnFullWritingStrategy(dfv1.DiscardLatest)).(*BufferWrite) + err := client.CreateStreamGroup(ctx, rqw.GetStreamName(), group, redisclient.ReadFromEarliest) + if err != nil { + t.Fatalf("error creating consumer group: %s", err) + } + defer func() { _ = client.DeleteStreamGroup(ctx, rqw.GetStreamName(), group) }() + defer func() { _ = client.DeleteKeys(ctx, rqw.GetStreamName()) }() + + writeMessages, internalKeys := buildTestWriteMessages(rqw, count, testStartTime) + defer func() { _ = client.DeleteKeys(ctx, internalKeys...) }() + _, errs := rqw.Write(ctx, writeMessages) + assert.Equal(t, make([]error, len(writeMessages)), errs, "Write failed") + + for !rqw.IsFull() { + select { + case <-ctx.Done(): + t.Fatalf("full, %s", ctx.Err()) + default: + time.Sleep(1 * time.Millisecond) + } + } + + // Once full try to write messages and expect NoRetryableError + writeMessages, internalKeys = buildTestWriteMessages(rqw, count, testStartTime) + defer func() { _ = client.DeleteKeys(ctx, internalKeys...) }() + _, errs = rqw.Write(ctx, writeMessages) + + // assert the NoRetryableBufferWriteErr + for _, err := range errs { + assert.Equal(t, err, isb.NoRetryableBufferWriteErr{Name: stream, Message: "Buffer full!"}) + } +} + // buildTestWriteMessages a list test messages and the internal hashKeys it created func buildTestWriteMessages(rqw *BufferWrite, count int64, startTime time.Time) ([]isb.Message, []string) { var messages = make([]isb.Message, 0, count) @@ -343,9 +383,6 @@ func TestNewInterStepDataForwardRedis(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } writeMessages, internalKeys := buildTestWriteMessages(fromStepWrite, int64(20), testStartTime) @@ -359,7 +396,7 @@ func TestNewInterStepDataForwardRedis(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark) assert.NoError(t, err) assert.False(t, to1.IsFull()) @@ -395,10 +432,6 @@ func TestReadTimeout(t *testing.T) { toSteps := map[string]isb.BufferWriter{ "to1": to1, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - } - vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ PipelineName: "testPipeline", AbstractVertex: dfv1.AbstractVertex{ @@ -407,7 +440,7 @@ func TestReadTimeout(t *testing.T) { }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() // Call stop to end the test as we have a blocking read. The forwarder is up and running with no messages written diff --git a/pkg/isb/stores/simplebuffer/buffer.go b/pkg/isb/stores/simplebuffer/buffer.go index 9a202f4f66..66acf4226d 100644 --- a/pkg/isb/stores/simplebuffer/buffer.go +++ b/pkg/isb/stores/simplebuffer/buffer.go @@ -28,6 +28,7 @@ import ( "sync" "time" + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" "github.com/numaproj/numaflow/pkg/isb" ) @@ -58,7 +59,8 @@ type elem struct { func NewInMemoryBuffer(name string, size int64, opts ...Option) *InMemoryBuffer { bufferOptions := &options{ - readTimeOut: time.Second, // default read time out + readTimeOut: time.Second, // default read time out + onFullWritingStrategy: v1alpha1.RetryUntilSuccess, // default on full writing strategy } for _, o := range opts { @@ -145,7 +147,12 @@ func (b *InMemoryBuffer) Write(_ context.Context, messages []isb.Message) ([]isb // access buffer via lock b.rwlock.Unlock() } else { - errs[idx] = isb.BufferWriteErr{Name: b.name, Full: true, Message: "Buffer full!"} + switch b.options.onFullWritingStrategy { + case v1alpha1.DiscardLatest: + errs[idx] = isb.NoRetryableBufferWriteErr{Name: b.name, Message: "Buffer full!"} + default: + errs[idx] = isb.BufferWriteErr{Name: b.name, Full: true, Message: "Buffer full!"} + } } } return writeOffsets, errs diff --git a/pkg/isb/stores/simplebuffer/buffer_test.go b/pkg/isb/stores/simplebuffer/buffer_test.go index cf4baed69b..be851dad55 100644 --- a/pkg/isb/stores/simplebuffer/buffer_test.go +++ b/pkg/isb/stores/simplebuffer/buffer_test.go @@ -21,9 +21,11 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" "github.com/numaproj/numaflow/pkg/isb" "github.com/numaproj/numaflow/pkg/isb/testutils" - "github.com/stretchr/testify/assert" ) func TestNewSimpleBuffer(t *testing.T) { @@ -77,3 +79,24 @@ func TestNewSimpleBuffer(t *testing.T) { // still full as we did not ack assert.Equal(t, true, sb.IsFull()) } + +func TestNewSimpleBuffer_DiscardOnFull(t *testing.T) { + count := int64(3) + sb := NewInMemoryBuffer("test", 2, WithOnFullWritingStrategy(v1alpha1.DiscardLatest)) + ctx := context.Background() + assert.NotEmpty(t, sb.String()) + assert.Equal(t, sb.IsEmpty(), true) + + startTime := time.Unix(1636470000, 0) + writeMessages := testutils.BuildTestWriteMessages(count, startTime) + + // try to write 3 messages, it should fail (we have only space for 2) + // the first 2 messages should be written, the last one should be discarded and returns us a NoRetryableError. + _, errors := sb.Write(ctx, writeMessages[0:3]) + assert.NoError(t, errors[0]) + assert.NoError(t, errors[1]) + assert.EqualValues(t, []error{nil, nil, isb.NoRetryableBufferWriteErr{Name: "test", Message: "Buffer full!"}}, errors) + + // still full as we did not ack + assert.Equal(t, true, sb.IsFull()) +} diff --git a/pkg/isb/stores/simplebuffer/options.go b/pkg/isb/stores/simplebuffer/options.go index df9ea98d16..3df5cea89f 100644 --- a/pkg/isb/stores/simplebuffer/options.go +++ b/pkg/isb/stores/simplebuffer/options.go @@ -16,12 +16,18 @@ limitations under the License. package simplebuffer -import "time" +import ( + "time" + + dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" +) // Options for simple buffer type options struct { // readTimeOut is the timeout needed for read timeout readTimeOut time.Duration + // onFullWritingStrategy is the writing strategy when buffer is full + onFullWritingStrategy dfv1.OnFullWritingStrategy } type Option func(options *options) error @@ -33,3 +39,11 @@ func WithReadTimeOut(timeout time.Duration) Option { return nil } } + +// WithOnFullWritingStrategy sets the writing strategy when buffer is full +func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option { + return func(o *options) error { + o.onFullWritingStrategy = s + return nil + } +} diff --git a/pkg/sinks/blackhole/blackhole.go b/pkg/sinks/blackhole/blackhole.go index 72877ccde8..259c767434 100644 --- a/pkg/sinks/blackhole/blackhole.go +++ b/pkg/sinks/blackhole/blackhole.go @@ -71,7 +71,7 @@ func NewBlackhole(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWaterma } } - isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sinks/blackhole/blackhole_test.go b/pkg/sinks/blackhole/blackhole_test.go index 710efc72a0..7c47e391ab 100644 --- a/pkg/sinks/blackhole/blackhole_test.go +++ b/pkg/sinks/blackhole/blackhole_test.go @@ -118,11 +118,7 @@ func TestBlackhole_ForwardToTwoVertex(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - "to2": dfv1.RetryUntilSuccess, - } - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() diff --git a/pkg/sinks/kafka/kafka.go b/pkg/sinks/kafka/kafka.go index deb86d1e80..2d0920bd6f 100644 --- a/pkg/sinks/kafka/kafka.go +++ b/pkg/sinks/kafka/kafka.go @@ -84,7 +84,7 @@ func NewToKafka(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark } } - f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } @@ -190,10 +190,6 @@ func (tk *ToKafka) Write(_ context.Context, messages []isb.Message) ([]isb.Offse return nil, errs } -func (tk *ToKafka) IsFull() bool { - return false -} - func (tk *ToKafka) Close() error { tk.log.Info("Closing kafka producer...") return tk.producer.Close() diff --git a/pkg/sinks/kafka/kafka_test.go b/pkg/sinks/kafka/kafka_test.go index ff7a04eb72..c92890bf62 100644 --- a/pkg/sinks/kafka/kafka_test.go +++ b/pkg/sinks/kafka/kafka_test.go @@ -47,7 +47,7 @@ func TestWriteSuccessToKafka(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromEdgeList(generic.GetBufferNameList(vertex.GetToBuffers())) - toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark) + toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) toKafka.kafkaSink = vertex.Spec.Sink.Kafka toKafka.name = "Test" @@ -100,7 +100,7 @@ func TestWriteFailureToKafka(t *testing.T) { }} toSteps := map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark) + toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) toKafka.name = "Test" toKafka.topic = "topic-1" diff --git a/pkg/sinks/logger/log.go b/pkg/sinks/logger/log.go index 5aba5a3c5e..4fdfb27bd7 100644 --- a/pkg/sinks/logger/log.go +++ b/pkg/sinks/logger/log.go @@ -72,7 +72,7 @@ func NewToLog(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark f } } - isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sinks/logger/log_test.go b/pkg/sinks/logger/log_test.go index 257ca15744..80f5f1d5e8 100644 --- a/pkg/sinks/logger/log_test.go +++ b/pkg/sinks/logger/log_test.go @@ -116,10 +116,6 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) { "to1": to1, "to2": to2, } - actionsOnFull := map[string]string{ - "to1": dfv1.RetryUntilSuccess, - "to2": dfv1.RetryUntilSuccess, - } writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime) vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{ @@ -129,7 +125,7 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) { }, }} fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark) + f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark) assert.NoError(t, err) stopped := f.Start() diff --git a/pkg/sinks/udsink/sink.go b/pkg/sinks/udsink/sink.go index 1ca382b333..f0713c9bc5 100644 --- a/pkg/sinks/udsink/sink.go +++ b/pkg/sinks/udsink/sink.go @@ -78,7 +78,7 @@ func NewUserDefinedSink(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchW return nil, fmt.Errorf("failed to create gRPC client, %w", err) } s.udsink = udsink - isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) + isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sources/generator/tickgen.go b/pkg/sources/generator/tickgen.go index 4e0349cf76..6a8fcd9b33 100644 --- a/pkg/sources/generator/tickgen.go +++ b/pkg/sources/generator/tickgen.go @@ -154,7 +154,6 @@ func NewMemGen( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, - onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -228,7 +227,7 @@ func NewMemGen( gensrc.sourcePublishWM = gensrc.buildSourceWatermarkPublisher(publishWMStores) // we pass in the context to forwarder as well so that it can shut down when we cancel the context - forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) + forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { return nil, err } diff --git a/pkg/sources/generator/tickgen_test.go b/pkg/sources/generator/tickgen_test.go index 8ab4c0f141..3465a5a8e7 100644 --- a/pkg/sources/generator/tickgen_test.go +++ b/pkg/sources/generator/tickgen_test.go @@ -62,7 +62,7 @@ func TestRead(t *testing.T) { "writer": dest, } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) + mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) assert.NoError(t, err) _ = mgen.Start() @@ -106,7 +106,7 @@ func TestStop(t *testing.T) { "writer": dest, } fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps) - mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) + mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore) assert.NoError(t, err) stop := mgen.Start() @@ -201,7 +201,7 @@ func TestWatermark(t *testing.T) { Replica: 0, } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) - mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, nil, nil, publishWMStore) + mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, nil, nil, publishWMStore) assert.NoError(t, err) stop := mgen.Start() diff --git a/pkg/sources/http/http.go b/pkg/sources/http/http.go index dcc3b9ef99..729c575dcd 100644 --- a/pkg/sources/http/http.go +++ b/pkg/sources/http/http.go @@ -88,7 +88,6 @@ func New( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, - onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -203,7 +202,7 @@ func New( } } - h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) + h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { h.logger.Errorw("Error instantiating the forwarder", zap.Error(err)) return nil, err diff --git a/pkg/sources/http/http_test.go b/pkg/sources/http/http_test.go index 88a333ed8f..9d959a84ca 100644 --- a/pkg/sources/http/http_test.go +++ b/pkg/sources/http/http_test.go @@ -69,7 +69,7 @@ func Test_NewHTTP(t *testing.T) { dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)} publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - h, err := New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores) + h, err := New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores) assert.NoError(t, err) assert.False(t, h.ready) assert.Equal(t, v.Spec.Name, h.GetName()) diff --git a/pkg/sources/kafka/handler_test.go b/pkg/sources/kafka/handler_test.go index 79a2a5b0b1..3b9f000a9b 100644 --- a/pkg/sources/kafka/handler_test.go +++ b/pkg/sources/kafka/handler_test.go @@ -66,7 +66,7 @@ func TestMessageHandling(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), + ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond)) msg := &sarama.ConsumerMessage{ diff --git a/pkg/sources/kafka/reader.go b/pkg/sources/kafka/reader.go index 4f641f4e1c..61142b17d5 100644 --- a/pkg/sources/kafka/reader.go +++ b/pkg/sources/kafka/reader.go @@ -267,7 +267,6 @@ func NewKafkaSource( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, - onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -344,7 +343,7 @@ func NewKafkaSource( forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize))) } } - forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) + forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { kafkasource.logger.Errorw("Error instantiating the forwarder", zap.Error(err)) return nil, err diff --git a/pkg/sources/kafka/reader_test.go b/pkg/sources/kafka/reader_test.go index 508467487c..020b552cdf 100644 --- a/pkg/sources/kafka/reader_test.go +++ b/pkg/sources/kafka/reader_test.go @@ -54,7 +54,7 @@ func TestNewKafkasource(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, err := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, err := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) // no errors if everything is good. assert.Nil(t, err) @@ -90,7 +90,7 @@ func TestGroupNameOverride(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) assert.Equal(t, "default", ks.groupName) @@ -116,7 +116,7 @@ func TestDefaultBufferSize(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) assert.Equal(t, 100, ks.handlerbuffer) @@ -142,7 +142,7 @@ func TestBufferSizeOverrides(t *testing.T) { } publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) + ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default")) assert.Equal(t, 110, ks.handlerbuffer) diff --git a/pkg/sources/nats/nats.go b/pkg/sources/nats/nats.go index 9c07f4ee8f..a18d92f7bc 100644 --- a/pkg/sources/nats/nats.go +++ b/pkg/sources/nats/nats.go @@ -61,7 +61,6 @@ func New( vertexInstance *dfv1.VertexInstance, writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, - onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -95,7 +94,7 @@ func New( forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize))) } } - forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...) + forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...) if err != nil { n.logger.Errorw("Error instantiating the forwarder", zap.Error(err)) return nil, err diff --git a/pkg/sources/nats/nats_test.go b/pkg/sources/nats/nats_test.go index 615503fc3b..51ea552ffa 100644 --- a/pkg/sources/nats/nats_test.go +++ b/pkg/sources/nats/nats_test.go @@ -65,7 +65,7 @@ func newInstance(t *testing.T, vi *dfv1.VertexInstance) (*natsSource, error) { dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)} publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore()) fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{}) - return New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second)) + return New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second)) } func Test_Single(t *testing.T) { diff --git a/pkg/sources/source.go b/pkg/sources/source.go index dfd23034fb..f8d5e6bd94 100644 --- a/pkg/sources/source.go +++ b/pkg/sources/source.go @@ -69,7 +69,9 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { switch sp.ISBSvcType { case dfv1.ISBSvcTypeRedis: for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges { - writeOpts := []redisisb.Option{} + writeOpts := []redisisb.Option{ + redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength))) } @@ -100,6 +102,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges { writeOpts := []jetstreamisb.WriteOption{ jetstreamisb.WithUsingWriteInfoAsRate(true), + jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength))) @@ -139,9 +142,9 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { } }() readyChecker = t - sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), sp.getOnFullActions(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log) + sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log) } else { - sourcer, err = sp.getSourcer(writers, forward.All, sp.getOnFullActions(), applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log) + sourcer, err = sp.getSourcer(writers, forward.All, applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log) } if err != nil { return fmt.Errorf("failed to find a sourcer, error: %w", err) @@ -179,7 +182,6 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { func (sp *SourceProcessor) getSourcer( writers []isb.BufferWriter, fsd forward.ToWhichStepDecider, - onFullActions map[string]string, mapApplier applier.MapApplier, fetchWM fetch.Fetcher, publishWM map[string]publish.Publisher, @@ -194,7 +196,7 @@ func (sp *SourceProcessor) getSourcer( if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil { readOptions = append(readOptions, generator.WithReadTimeout(l.ReadTimeout.Duration)) } - return generator.NewMemGen(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) + return generator.NewMemGen(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) } else if x := src.Kafka; x != nil { readOptions := []kafka.Option{ kafka.WithGroupName(x.ConsumerGroupName), @@ -203,9 +205,9 @@ func (sp *SourceProcessor) getSourcer( if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil { readOptions = append(readOptions, kafka.WithReadTimeOut(l.ReadTimeout.Duration)) } - return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) + return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) } else if x := src.HTTP; x != nil { - return http.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger)) + return http.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger)) } else if x := src.Nats; x != nil { readOptions := []nats.Option{ nats.WithLogger(logger), @@ -213,7 +215,7 @@ func (sp *SourceProcessor) getSourcer( if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil { readOptions = append(readOptions, nats.WithReadTimeout(l.ReadTimeout.Duration)) } - return nats.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) + return nats.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...) } return nil, fmt.Errorf("invalid source spec") } @@ -221,9 +223,8 @@ func (sp *SourceProcessor) getSourcer( func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere { shuffleFuncMap := make(map[string]*shuffle.Shuffle) for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges { - bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge) if edge.Parallelism != nil && *edge.Parallelism > 1 { - s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), bufferNames) + s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge)) shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s } } @@ -246,15 +247,3 @@ func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere { }) return fsd } - -// getOnFullActions builds a mapping between the out-going buffers and their respective onFull action. -func (sp *SourceProcessor) getOnFullActions() map[string]string { - onFullActions := make(map[string]string) - for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges { - bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge) - for _, bn := range bufferNames { - onFullActions[bn] = edge.OnFull - } - } - return onFullActions -} diff --git a/pkg/udf/common.go b/pkg/udf/common.go index 65e2613a52..1fe89dc8c8 100644 --- a/pkg/udf/common.go +++ b/pkg/udf/common.go @@ -41,7 +41,9 @@ func buildRedisBufferIO(ctx context.Context, fromBufferName string, vertexInstan reader := redisisb.NewBufferRead(ctx, redisClient, fromBufferName, fromGroup, consumer, readerOpts...) for _, e := range vertexInstance.Vertex.Spec.ToEdges { - writeOpts := []redisisb.Option{} + writeOpts := []redisisb.Option{ + redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength))) } @@ -73,7 +75,9 @@ func buildJetStreamBufferIO(ctx context.Context, fromBufferName string, vertexIn } for _, e := range vertexInstance.Vertex.Spec.ToEdges { - writeOpts := []jetstreamisb.WriteOption{} + writeOpts := []jetstreamisb.WriteOption{ + jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength))) } diff --git a/pkg/udf/map_udf.go b/pkg/udf/map_udf.go index 65c80646c8..d9d4506294 100644 --- a/pkg/udf/map_udf.go +++ b/pkg/udf/map_udf.go @@ -73,18 +73,13 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error { return fmt.Errorf("unrecognized isbsvc type %q", u.ISBSvcType) } - // Populate shuffle function map and onFull actions map + // Populate shuffle function map shuffleFuncMap := make(map[string]*shuffle.Shuffle) - onFullActions := make(map[string]string) for _, edge := range u.VertexInstance.Vertex.Spec.ToEdges { - bufferNames := dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge) if edge.Parallelism != nil && *edge.Parallelism > 1 { - s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), bufferNames) + s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge)) shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s } - for _, bn := range bufferNames { - onFullActions[bn] = edge.OnFull - } } conditionalForwarder := forward.GoWhere(func(key string) ([]string, error) { @@ -136,7 +131,7 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error { } } - forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, onFullActions, udfHandler, fetchWatermark, publishWatermark, opts...) + forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, udfHandler, fetchWatermark, publishWatermark, opts...) if err != nil { return err } diff --git a/test/e2e-suite-2/testdata/drop-on-full.yaml b/test/e2e-suite-2/testdata/drop-on-full.yaml index 964da5829f..8c4853420f 100644 --- a/test/e2e-suite-2/testdata/drop-on-full.yaml +++ b/test/e2e-suite-2/testdata/drop-on-full.yaml @@ -28,7 +28,7 @@ spec: edges: - from: in to: drop-sink - onFull: dropAndAckLatest + onFull: discardLatest - from: in to: retry-sink onFull: retryUntilSuccess \ No newline at end of file From 37abe9b75ebc4b2d76dd89b7c7dd9d8988a59975 Mon Sep 17 00:00:00 2001 From: Keran Yang Date: Tue, 28 Mar 2023 09:45:16 -0400 Subject: [PATCH 3/6] Address comments Signed-off-by: Keran Yang --- docs/APIs.md | 24 +- pkg/apis/numaflow/v1alpha1/const.go | 8 +- pkg/apis/numaflow/v1alpha1/edge_types.go | 10 +- pkg/apis/numaflow/v1alpha1/generated.pb.go | 719 +++++++++--------- .../v1alpha1/zz_generated.deepcopy.go | 2 +- pkg/forward/forward.go | 3 +- pkg/forward/forward_test.go | 12 +- pkg/isb/stores/jetstream/options.go | 20 +- pkg/isb/stores/jetstream/writer.go | 2 +- pkg/isb/stores/jetstream/writer_test.go | 2 +- pkg/isb/stores/redis/options.go | 18 +- pkg/isb/stores/redis/write.go | 16 +- pkg/isb/stores/redis/write_test.go | 4 +- pkg/isb/stores/simplebuffer/buffer.go | 6 +- pkg/isb/stores/simplebuffer/buffer_test.go | 4 +- pkg/isb/stores/simplebuffer/options.go | 10 +- pkg/sources/source.go | 4 +- pkg/udf/common.go | 4 +- 18 files changed, 434 insertions(+), 434 deletions(-) diff --git a/docs/APIs.md b/docs/APIs.md index 660951bc92..c64c0571bf 100644 --- a/docs/APIs.md +++ b/docs/APIs.md @@ -526,6 +526,16 @@ Description +

+BufferFullWritingStrategy (string alias) +

+

+

+(Appears on: +Edge) +

+

+

BufferServiceConfig

@@ -918,7 +928,9 @@ ignored when the “to” vertex is not a reduce vertex. -onFull
string +onFull
+ +BufferFullWritingStrategy (Optional) @@ -2719,16 +2731,6 @@ Auth information -

-OnFullWritingStrategy (string alias) -

-

-

-

-OnFullWritingStrategy is an edge-level specification to define the -writing behaviour when the ToBuffer is full -

-

PBQStorage

diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go index d4399afdae..d8694de32e 100644 --- a/pkg/apis/numaflow/v1alpha1/const.go +++ b/pkg/apis/numaflow/v1alpha1/const.go @@ -24,8 +24,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) -// OnFullWritingStrategy is an edge-level specification to define the writing behaviour when the ToBuffer is full -type OnFullWritingStrategy string +type BufferFullWritingStrategy string const ( Project = "numaflow" @@ -125,9 +124,8 @@ const ( DefaultBufferUsageLimit = 0.8 DefaultReadBatchSize = 500 - // Edge-level specification to define the writing behaviour when the ToBuffer is full - RetryUntilSuccess OnFullWritingStrategy = "retryUntilSuccess" - DiscardLatest OnFullWritingStrategy = "discardLatest" + RetryUntilSuccess BufferFullWritingStrategy = "retryUntilSuccess" + DiscardLatest BufferFullWritingStrategy = "discardLatest" // Auto scaling DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go index a574bdd9d1..8bcb61a4b7 100644 --- a/pkg/apis/numaflow/v1alpha1/edge_types.go +++ b/pkg/apis/numaflow/v1alpha1/edge_types.go @@ -35,7 +35,7 @@ type Edge struct { // if not provided, the default value is set to "retryUntilSuccess" // +kubebuilder:validation:Enum=retryUntilSuccess;discardLatest // +optional - OnFull *string `json:"onFull,omitempty" protobuf:"bytes,6,opt,name=onFull"` + OnFull *BufferFullWritingStrategy `json:"onFull,omitempty" protobuf:"bytes,6,opt,name=onFull"` } type ForwardConditions struct { @@ -53,15 +53,13 @@ type EdgeLimits struct { BufferUsageLimit *uint32 `json:"bufferUsageLimit,omitempty" protobuf:"varint,2,opt,name=bufferUsageLimit"` } -func (e Edge) OnFullWritingStrategy() OnFullWritingStrategy { +func (e Edge) BufferFullWritingStrategy() BufferFullWritingStrategy { if e.OnFull == nil { return RetryUntilSuccess } switch *e.OnFull { - case "retryUntilSuccess": - return RetryUntilSuccess - case "discardLatest": - return DiscardLatest + case RetryUntilSuccess, DiscardLatest: + return *e.OnFull default: return RetryUntilSuccess } diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go index 496370c87f..1bc14e7d33 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.pb.go +++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go @@ -2037,364 +2037,365 @@ func init() { } var fileDescriptor_9d0d1b17d3865563 = []byte{ - // 5698 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x5d, 0x6c, 0x24, 0x57, - 0x56, 0x4e, 0xff, 0xba, 0xfb, 0xb4, 0x3d, 0x3f, 0x77, 0x32, 0x93, 0x1e, 0xef, 0xc4, 0x3d, 0x5b, - 0xab, 0x44, 0xb3, 0xb0, 0x6b, 0x33, 0x26, 0xcb, 0xce, 0x02, 0xbb, 0x89, 0xdb, 0x1e, 0x4f, 0x66, - 0xc6, 0x9e, 0xf1, 0x9e, 0xb6, 0x67, 0xb2, 0x09, 0x24, 0x94, 0xab, 0x6f, 0xb7, 0x2b, 0x5d, 0x5d, - 0xd5, 0xa9, 0xba, 0xed, 0x19, 0x07, 0x56, 0x44, 0x9b, 0x87, 0x04, 0xb1, 0x68, 0x91, 0x10, 0xd2, - 0x8a, 0xd5, 0x22, 0x21, 0x21, 0x21, 0x90, 0x56, 0xe2, 0x81, 0x7d, 0x81, 0x17, 0x9e, 0x50, 0xe0, - 0x01, 0xf2, 0x80, 0x44, 0x10, 0xa8, 0x45, 0xcc, 0x13, 0x0f, 0xa0, 0x45, 0xfb, 0xb2, 0x1a, 0x21, - 0x81, 0xee, 0x4f, 0xfd, 0x76, 0xb5, 0xc7, 0xee, 0xb6, 0xb3, 0x13, 0xf1, 0x56, 0x75, 0xcf, 0x39, - 0xdf, 0xb9, 0x75, 0x7f, 0xce, 0x3d, 0xf7, 0x9c, 0x7b, 0x0b, 0x6e, 0xb4, 0x4d, 0xb6, 0xd3, 0xdf, - 0x9e, 0x37, 0x9c, 0xee, 0x82, 0xdd, 0xef, 0xea, 0x3d, 0xd7, 0x79, 0x53, 0x3c, 0xb4, 0x2c, 0xe7, - 0xc1, 0x42, 0xaf, 0xd3, 0x5e, 0xd0, 0x7b, 0xa6, 0x17, 0x96, 0xec, 0x5e, 0xd5, 0xad, 0xde, 0x8e, - 0x7e, 0x75, 0xa1, 0x4d, 0x6d, 0xea, 0xea, 0x8c, 0x36, 0xe7, 0x7b, 0xae, 0xc3, 0x1c, 0xf2, 0xe5, - 0x10, 0x68, 0xde, 0x07, 0x9a, 0xf7, 0xc5, 0xe6, 0x7b, 0x9d, 0xf6, 0x3c, 0x07, 0x0a, 0x4b, 0x7c, - 0xa0, 0xd9, 0x2f, 0x46, 0x6a, 0xd0, 0x76, 0xda, 0xce, 0x82, 0xc0, 0xdb, 0xee, 0xb7, 0xc4, 0x9b, - 0x78, 0x11, 0x4f, 0x52, 0xcf, 0xac, 0xd6, 0xb9, 0xe6, 0xcd, 0x9b, 0x0e, 0xaf, 0xd6, 0x82, 0xe1, - 0xb8, 0x74, 0x61, 0x77, 0xa8, 0x2e, 0xb3, 0x2f, 0x84, 0x3c, 0x5d, 0xdd, 0xd8, 0x31, 0x6d, 0xea, - 0xee, 0xf9, 0xdf, 0xb2, 0xe0, 0x52, 0xcf, 0xe9, 0xbb, 0x06, 0x3d, 0x92, 0x94, 0xb7, 0xd0, 0xa5, - 0x4c, 0x4f, 0xd3, 0xb5, 0x30, 0x4a, 0xca, 0xed, 0xdb, 0xcc, 0xec, 0x0e, 0xab, 0xf9, 0x85, 0xc7, - 0x09, 0x78, 0xc6, 0x0e, 0xed, 0xea, 0x49, 0x39, 0xed, 0x5f, 0xca, 0x70, 0x6e, 0x69, 0xdb, 0x63, - 0xae, 0x6e, 0xb0, 0x0d, 0xa7, 0xb9, 0x49, 0xbb, 0x3d, 0x4b, 0x67, 0x94, 0x74, 0xa0, 0xc4, 0xeb, - 0xd6, 0xd4, 0x99, 0x5e, 0xcd, 0x5c, 0xce, 0x5c, 0xa9, 0x2c, 0x2e, 0xcd, 0x8f, 0xd9, 0x17, 0xf3, - 0xeb, 0x0a, 0xa8, 0x3e, 0xbd, 0x3f, 0xa8, 0x95, 0xfc, 0x37, 0x0c, 0x14, 0x90, 0xef, 0x66, 0x60, - 0xda, 0x76, 0x9a, 0xb4, 0x41, 0x2d, 0x6a, 0x30, 0xc7, 0xad, 0x66, 0x2f, 0xe7, 0xae, 0x54, 0x16, - 0x5f, 0x1f, 0x5b, 0x63, 0xca, 0x17, 0xcd, 0xdf, 0x89, 0x28, 0xb8, 0x6e, 0x33, 0x77, 0xaf, 0xfe, - 0xf4, 0x07, 0x83, 0xda, 0x53, 0xfb, 0x83, 0xda, 0x74, 0x94, 0x84, 0xb1, 0x9a, 0x90, 0x2d, 0xa8, - 0x30, 0xc7, 0xe2, 0x4d, 0x66, 0x3a, 0xb6, 0x57, 0xcd, 0x89, 0x8a, 0xcd, 0xcd, 0xcb, 0xd6, 0xe6, - 0xea, 0xe7, 0xf9, 0x70, 0x99, 0xdf, 0xbd, 0x3a, 0xbf, 0x19, 0xb0, 0xd5, 0xcf, 0x29, 0xe0, 0x4a, - 0x58, 0xe6, 0x61, 0x14, 0x87, 0x50, 0x38, 0xed, 0x51, 0xa3, 0xef, 0x9a, 0x6c, 0x6f, 0xd9, 0xb1, - 0x19, 0x7d, 0xc8, 0xaa, 0x79, 0xd1, 0xca, 0xcf, 0xa7, 0x41, 0x6f, 0x38, 0xcd, 0x46, 0x9c, 0xbb, - 0x7e, 0x6e, 0x7f, 0x50, 0x3b, 0x9d, 0x28, 0xc4, 0x24, 0x26, 0xb1, 0xe1, 0x8c, 0xd9, 0xd5, 0xdb, - 0x74, 0xa3, 0x6f, 0x59, 0x0d, 0x6a, 0xb8, 0x94, 0x79, 0xd5, 0x82, 0xf8, 0x84, 0x2b, 0x69, 0x7a, - 0xd6, 0x1c, 0x43, 0xb7, 0xee, 0x6e, 0xbf, 0x49, 0x0d, 0x86, 0xb4, 0x45, 0x5d, 0x6a, 0x1b, 0xb4, - 0x5e, 0x55, 0x1f, 0x73, 0xe6, 0x66, 0x02, 0x09, 0x87, 0xb0, 0xc9, 0x0d, 0x38, 0xdb, 0x73, 0x4d, - 0x47, 0x54, 0xc1, 0xd2, 0x3d, 0xef, 0x8e, 0xde, 0xa5, 0xd5, 0xe2, 0xe5, 0xcc, 0x95, 0x72, 0xfd, - 0xa2, 0x82, 0x39, 0xbb, 0x91, 0x64, 0xc0, 0x61, 0x19, 0x72, 0x05, 0x4a, 0x7e, 0x61, 0x75, 0xea, - 0x72, 0xe6, 0x4a, 0x41, 0x8e, 0x1d, 0x5f, 0x16, 0x03, 0x2a, 0x59, 0x85, 0x92, 0xde, 0x6a, 0x99, - 0x36, 0xe7, 0x2c, 0x89, 0x26, 0xbc, 0x94, 0xf6, 0x69, 0x4b, 0x8a, 0x47, 0xe2, 0xf8, 0x6f, 0x18, - 0xc8, 0x92, 0x5b, 0x40, 0x3c, 0xea, 0xee, 0x9a, 0x06, 0x5d, 0x32, 0x0c, 0xa7, 0x6f, 0x33, 0x51, - 0xf7, 0xb2, 0xa8, 0xfb, 0xac, 0xaa, 0x3b, 0x69, 0x0c, 0x71, 0x60, 0x8a, 0x14, 0x79, 0x09, 0xce, - 0xa8, 0x69, 0x17, 0xb6, 0x02, 0x08, 0xa4, 0xa7, 0x79, 0x43, 0x62, 0x82, 0x86, 0x43, 0xdc, 0xa4, - 0x09, 0x97, 0xf4, 0x3e, 0x73, 0xba, 0x1c, 0x32, 0xae, 0x74, 0xd3, 0xe9, 0x50, 0xbb, 0x5a, 0xb9, - 0x9c, 0xb9, 0x52, 0xaa, 0x5f, 0xde, 0x1f, 0xd4, 0x2e, 0x2d, 0x1d, 0xc0, 0x87, 0x07, 0xa2, 0x90, - 0xbb, 0x50, 0x6e, 0xda, 0xde, 0x86, 0x63, 0x99, 0xc6, 0x5e, 0x75, 0x5a, 0x54, 0xf0, 0xaa, 0xfa, - 0xd4, 0xf2, 0xca, 0x9d, 0x86, 0x24, 0x3c, 0x1a, 0xd4, 0x2e, 0x0d, 0x5b, 0xc7, 0xf9, 0x80, 0x8e, - 0x21, 0x06, 0x59, 0x17, 0x80, 0xcb, 0x8e, 0xdd, 0x32, 0xdb, 0xd5, 0x19, 0xd1, 0x1b, 0x97, 0x47, - 0x0c, 0xe8, 0x95, 0x3b, 0x0d, 0xc9, 0x57, 0x9f, 0x51, 0xea, 0xe4, 0x2b, 0x86, 0x08, 0xb3, 0x2f, - 0xc2, 0xd9, 0xa1, 0x59, 0x4b, 0xce, 0x40, 0xae, 0x43, 0xf7, 0x84, 0x51, 0x2a, 0x23, 0x7f, 0x24, - 0x4f, 0x43, 0x61, 0x57, 0xb7, 0xfa, 0xb4, 0x9a, 0x15, 0x65, 0xf2, 0xe5, 0x17, 0xb3, 0xd7, 0x32, - 0xda, 0xa0, 0x0c, 0xa7, 0x7c, 0x5b, 0x70, 0x8f, 0xba, 0x8c, 0x3e, 0x24, 0x97, 0x21, 0x6f, 0xf3, - 0xfe, 0x10, 0xf2, 0xf5, 0x69, 0xf5, 0xb9, 0x79, 0xd1, 0x0f, 0x82, 0x42, 0x0c, 0x28, 0x4a, 0x5b, - 0x2e, 0xf0, 0x2a, 0x8b, 0x2f, 0x8e, 0x6d, 0x86, 0x1a, 0x02, 0xa6, 0x0e, 0xfb, 0x83, 0x5a, 0x51, - 0x3e, 0xa3, 0x82, 0x26, 0xaf, 0x41, 0xde, 0x33, 0xed, 0x4e, 0x35, 0x27, 0x54, 0x7c, 0x75, 0x7c, - 0x15, 0xa6, 0xdd, 0xa9, 0x97, 0xf8, 0x17, 0xf0, 0x27, 0x14, 0xa0, 0xe4, 0x3e, 0xe4, 0xfa, 0xcd, - 0x96, 0xb2, 0x28, 0xbf, 0x3c, 0x36, 0xf6, 0xd6, 0xca, 0x6a, 0x7d, 0x6a, 0x7f, 0x50, 0xcb, 0x6d, - 0xad, 0xac, 0x22, 0x47, 0x24, 0xdf, 0xc9, 0xc0, 0x59, 0xc3, 0xb1, 0x99, 0xce, 0xd7, 0x17, 0xdf, - 0xb2, 0x56, 0x0b, 0x42, 0xcf, 0xad, 0xb1, 0xf5, 0x2c, 0x27, 0x11, 0xeb, 0xe7, 0xb9, 0xa1, 0x18, - 0x2a, 0xc6, 0x61, 0xdd, 0xe4, 0x7b, 0x19, 0x38, 0xcf, 0x27, 0xf0, 0x10, 0xb3, 0x30, 0x3b, 0xc7, - 0x5b, 0xab, 0x8b, 0xfb, 0x83, 0xda, 0xf9, 0x9b, 0x69, 0xca, 0x30, 0xbd, 0x0e, 0xbc, 0x76, 0xe7, - 0xf4, 0xe1, 0xb5, 0x48, 0x98, 0xb4, 0xca, 0xe2, 0xda, 0x71, 0xae, 0x6f, 0xf5, 0xcf, 0xa8, 0xa1, - 0x9c, 0xb6, 0x9c, 0x63, 0x5a, 0x2d, 0xc8, 0x75, 0x98, 0xda, 0x75, 0xac, 0x7e, 0x97, 0x7a, 0xd5, - 0x92, 0x58, 0x14, 0x66, 0xd3, 0xe6, 0xea, 0x3d, 0xc1, 0x52, 0x3f, 0xad, 0xe0, 0xa7, 0xe4, 0xbb, - 0x87, 0xbe, 0x2c, 0x31, 0xa1, 0x68, 0x99, 0x5d, 0x93, 0x79, 0xc2, 0x5a, 0x56, 0x16, 0xaf, 0x8f, - 0xfd, 0x59, 0x72, 0x8a, 0xae, 0x09, 0x30, 0x39, 0x6b, 0xe4, 0x33, 0x2a, 0x05, 0xc4, 0x80, 0x82, - 0x67, 0xe8, 0x96, 0xb4, 0xa6, 0x95, 0xc5, 0xaf, 0x8d, 0x3f, 0x6d, 0x38, 0x4a, 0x7d, 0x46, 0x7d, - 0x53, 0x41, 0xbc, 0xa2, 0xc4, 0x26, 0xbf, 0x0a, 0xa7, 0x62, 0xbd, 0xe9, 0x55, 0x2b, 0xa2, 0x75, - 0x9e, 0x4d, 0x6b, 0x9d, 0x80, 0xab, 0x7e, 0x41, 0x81, 0x9d, 0x8a, 0x8d, 0x10, 0x0f, 0x13, 0x60, - 0xe4, 0x36, 0x94, 0x3c, 0xb3, 0x49, 0x0d, 0xdd, 0xf5, 0xaa, 0xd3, 0x87, 0x01, 0x3e, 0xa3, 0x80, - 0x4b, 0x0d, 0x25, 0x86, 0x01, 0x80, 0x76, 0x1f, 0x66, 0x96, 0xfa, 0x6c, 0xc7, 0x71, 0xcd, 0xb7, - 0x85, 0x67, 0x41, 0x56, 0xa1, 0xc0, 0xc4, 0x0a, 0x21, 0x9d, 0xb6, 0xe7, 0xd2, 0xa0, 0xe5, 0x6a, - 0x7d, 0x9b, 0xee, 0xf9, 0x86, 0xb5, 0x5e, 0xe6, 0x8d, 0x20, 0x57, 0x0c, 0x29, 0xae, 0xfd, 0x51, - 0x06, 0xca, 0x75, 0xdd, 0x33, 0x0d, 0x0e, 0x4f, 0x96, 0x21, 0xdf, 0xf7, 0xa8, 0x7b, 0x34, 0x50, - 0x61, 0x95, 0xb6, 0x3c, 0xea, 0xa2, 0x10, 0x26, 0x77, 0xa1, 0xd4, 0xd3, 0x3d, 0xef, 0x81, 0xe3, - 0x36, 0x95, 0x65, 0x3d, 0x24, 0x90, 0x5c, 0xfa, 0x95, 0x28, 0x06, 0x20, 0x5a, 0x05, 0xca, 0x75, - 0x4b, 0x37, 0x3a, 0x3b, 0x8e, 0x45, 0xb5, 0x57, 0xa1, 0x58, 0xef, 0xb7, 0x5a, 0xd4, 0x3d, 0x84, - 0x85, 0x9f, 0x87, 0x3c, 0xdb, 0xeb, 0xa9, 0xf5, 0x22, 0x58, 0xdd, 0xf3, 0x9b, 0x7b, 0x3d, 0xfa, - 0x68, 0x50, 0x03, 0x89, 0xc3, 0xdf, 0x50, 0xf0, 0x69, 0x3f, 0xce, 0xc0, 0x39, 0x59, 0xa8, 0x56, - 0x51, 0xb9, 0x3e, 0x11, 0x0a, 0x05, 0x97, 0x36, 0x4d, 0x4f, 0xb5, 0xcb, 0xca, 0xd8, 0xc3, 0x11, - 0x39, 0x8a, 0x5a, 0x0e, 0x45, 0x5f, 0x88, 0x02, 0x94, 0xe8, 0xa4, 0x0f, 0xe5, 0x37, 0x29, 0xf3, - 0x98, 0x4b, 0xf5, 0xae, 0x6a, 0xb9, 0x97, 0xc7, 0x56, 0x75, 0x8b, 0xb2, 0x86, 0x40, 0x8a, 0xae, - 0xbe, 0x41, 0x21, 0x86, 0x9a, 0xb4, 0x9f, 0xe4, 0xa1, 0x1c, 0x8c, 0x42, 0xf2, 0x39, 0x28, 0x08, - 0x77, 0x4f, 0x35, 0x6b, 0x30, 0x75, 0x84, 0x57, 0x88, 0x92, 0x46, 0x9e, 0x83, 0x29, 0xc3, 0xe9, - 0x76, 0x75, 0xbb, 0x29, 0x5c, 0xf8, 0x72, 0xbd, 0xc2, 0x2d, 0xc6, 0xb2, 0x2c, 0x42, 0x9f, 0x46, - 0x2e, 0x41, 0x5e, 0x77, 0xdb, 0xd2, 0x9b, 0x2e, 0xcb, 0x71, 0xb2, 0xe4, 0xb6, 0x3d, 0x14, 0xa5, - 0xe4, 0x2b, 0x90, 0xa3, 0xf6, 0x6e, 0x35, 0x3f, 0xda, 0x24, 0x5d, 0xb7, 0x77, 0xef, 0xe9, 0x6e, - 0xbd, 0xa2, 0xea, 0x90, 0xbb, 0x6e, 0xef, 0x22, 0x97, 0x21, 0x6b, 0x30, 0x45, 0xed, 0xdd, 0x55, - 0xd7, 0xe9, 0x2a, 0x37, 0xf7, 0xb3, 0x23, 0xc4, 0x39, 0x8b, 0x5a, 0x9d, 0x03, 0xc3, 0xa6, 0x8a, - 0xd1, 0x87, 0x20, 0xdf, 0x80, 0x69, 0x69, 0xe3, 0xd6, 0xb9, 0xcb, 0xe4, 0x55, 0x8b, 0x02, 0xb2, - 0x36, 0xda, 0x48, 0x0a, 0xbe, 0x70, 0x5b, 0x11, 0x29, 0xf4, 0x30, 0x06, 0x45, 0xbe, 0x01, 0x65, - 0x7f, 0xc7, 0xe8, 0xa9, 0xd5, 0x20, 0xd5, 0x23, 0x47, 0xc5, 0x84, 0xf4, 0xad, 0xbe, 0xe9, 0xd2, - 0x2e, 0xb5, 0x99, 0x57, 0x3f, 0xeb, 0xfb, 0x68, 0x3e, 0xd5, 0xc3, 0x10, 0x8d, 0x6c, 0x0f, 0x6f, - 0x2d, 0xa4, 0x5f, 0xfc, 0xb9, 0x11, 0xb3, 0x6d, 0x8c, 0x7d, 0xc5, 0xeb, 0x70, 0x3a, 0xf0, 0xfd, - 0x95, 0xfb, 0x28, 0x3d, 0xe5, 0x17, 0xb8, 0xf8, 0xcd, 0x38, 0xe9, 0xd1, 0xa0, 0xf6, 0x6c, 0x8a, - 0x03, 0x19, 0x32, 0x60, 0x12, 0x4c, 0xfb, 0xef, 0x2c, 0x0c, 0x2f, 0xff, 0xf1, 0x46, 0xcb, 0x1c, - 0x77, 0xa3, 0x25, 0x3f, 0x48, 0x1a, 0x87, 0x6b, 0x4a, 0x6c, 0xf2, 0x8f, 0x4a, 0xeb, 0x98, 0xdc, - 0x71, 0x77, 0xcc, 0xf8, 0x73, 0x47, 0x7b, 0x3f, 0x0f, 0xa7, 0x56, 0x74, 0xda, 0x75, 0xec, 0xc7, - 0xba, 0x2f, 0x99, 0x27, 0xc2, 0x7d, 0xb9, 0x02, 0x25, 0x97, 0xf6, 0x2c, 0xd3, 0xd0, 0x3d, 0xd1, - 0x59, 0x6a, 0x8f, 0x88, 0xaa, 0x0c, 0x03, 0xea, 0x08, 0xb7, 0x35, 0xf7, 0x44, 0xba, 0xad, 0xf9, - 0x9f, 0xbe, 0xdb, 0xaa, 0xbd, 0x93, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4, 0xc5, 0x8d, - 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a, 0x28, 0x7a, - 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0xdb, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74, 0x32, 0xd9, - 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83, 0x1a, 0x84, - 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc, 0x21, 0x0e, - 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62, 0x2f, 0x54, - 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0x88, 0x06, 0x45, 0xc7, 0x5e, - 0xed, 0x5b, 0x96, 0x0a, 0x8d, 0x08, 0xd8, 0xbb, 0xa2, 0x04, 0x15, 0x45, 0xfb, 0x9d, 0x0c, 0x40, - 0xa8, 0x99, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x07, 0x64, 0x5d, 0x7f, 0xb8, 0x46, 0xed, 0x36, 0xdb, - 0x11, 0x7d, 0x92, 0x97, 0x66, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97, 0xbc, 0x04, 0x67, 0x64, 0xd1, - 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x67, 0x33, 0x32, 0x20, 0x51, 0x4f, 0xd0, 0x70, 0x88, 0x5b, 0xd3, - 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e, 0x10, 0x84, 0xa2, 0x15, 0x56, - 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x35, 0x41, 0xfc, 0x31, 0x6c, 0xd5, 0x2e, 0x65, 0x3a, 0x37, 0x3e, - 0x2b, 0x7d, 0x15, 0x21, 0x93, 0x2d, 0x29, 0x6b, 0xab, 0x90, 0xb4, 0x17, 0xe0, 0xec, 0x50, 0x1f, - 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x67, 0xb9, 0xaf, 0x20, 0x9c, 0xa3, 0xdb, 0xbc, - 0x00, 0x65, 0xb9, 0xf6, 0x3f, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43, 0x78, 0xbf, 0x8f, 0x77, 0xfd, - 0x7c, 0xd7, 0x23, 0x9b, 0xea, 0x7a, 0xf4, 0xa1, 0xd8, 0x79, 0x10, 0xb8, 0x26, 0x95, 0xc5, 0xf5, - 0xf1, 0x47, 0xab, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x03, 0x8e, 0xa7, 0x54, 0x85, 0x8a, 0xb7, - 0xef, 0x0b, 0xa5, 0x4a, 0xd9, 0xec, 0x57, 0xa0, 0x12, 0x61, 0x3b, 0x52, 0x84, 0xe3, 0x27, 0x19, - 0x38, 0x7d, 0x43, 0xc6, 0x74, 0x1d, 0x57, 0x7a, 0x34, 0xe4, 0x22, 0xe4, 0xdc, 0x5e, 0x5f, 0xc8, - 0xe7, 0xe4, 0x06, 0x1e, 0x37, 0xb6, 0x90, 0x97, 0x91, 0x57, 0xa0, 0xd4, 0x54, 0x7d, 0xa0, 0x3c, - 0xc9, 0xa3, 0xf6, 0x9c, 0xb0, 0xb1, 0xfe, 0x1b, 0x06, 0x68, 0xdc, 0xf5, 0xeb, 0x7a, 0xed, 0x86, - 0xf9, 0xb6, 0x34, 0xac, 0x05, 0xe9, 0xfa, 0xad, 0xcb, 0x22, 0xf4, 0x69, 0xdc, 0x68, 0x77, 0xe8, - 0xde, 0x32, 0xf7, 0x82, 0xc4, 0xcc, 0x54, 0x46, 0xfb, 0xb6, 0x2a, 0xc3, 0x80, 0xca, 0x7b, 0x5e, - 0x7e, 0x73, 0x41, 0x0c, 0x74, 0xd1, 0xf3, 0xf7, 0x78, 0x81, 0xfa, 0x7c, 0xed, 0x3b, 0x59, 0xb8, - 0x70, 0x83, 0x32, 0xb9, 0x66, 0xad, 0xd0, 0x9e, 0xe5, 0xec, 0xf1, 0xa5, 0x1e, 0xe9, 0x5b, 0xe4, - 0x25, 0x00, 0xd3, 0xdb, 0x6e, 0xec, 0x1a, 0xdc, 0x89, 0x57, 0xa3, 0xe1, 0xb2, 0x6a, 0x7c, 0xb8, - 0xd9, 0xa8, 0x2b, 0xca, 0xa3, 0xd8, 0x1b, 0x46, 0x64, 0x42, 0x77, 0x37, 0x7b, 0x80, 0xbb, 0xdb, - 0x00, 0xe8, 0x85, 0x0e, 0x43, 0x4e, 0x70, 0xfe, 0xbc, 0xaf, 0xe6, 0x28, 0xbe, 0x42, 0x04, 0x66, - 0x92, 0x25, 0xfc, 0x2f, 0x73, 0x30, 0x7b, 0x83, 0xb2, 0xc0, 0x9b, 0x57, 0xbb, 0x95, 0x46, 0x8f, - 0x1a, 0xbc, 0x55, 0xde, 0xcb, 0x40, 0xd1, 0xd2, 0xb7, 0xa9, 0xe5, 0x89, 0xd9, 0x54, 0x59, 0x7c, - 0x63, 0xec, 0xe1, 0x3d, 0x5a, 0xcb, 0xfc, 0x9a, 0xd0, 0x90, 0x18, 0xf0, 0xb2, 0x10, 0x95, 0x7a, - 0xf2, 0x25, 0xa8, 0x18, 0x56, 0xdf, 0x63, 0xd4, 0xdd, 0x70, 0x5c, 0xa6, 0x56, 0xef, 0x20, 0x6a, - 0xbe, 0x1c, 0x92, 0x30, 0xca, 0x47, 0x16, 0x01, 0x0c, 0xcb, 0xa4, 0x36, 0x13, 0x52, 0x72, 0x98, - 0x11, 0xbf, 0xbd, 0x97, 0x03, 0x0a, 0x46, 0xb8, 0xb8, 0xaa, 0xae, 0x63, 0x9b, 0xcc, 0x91, 0xaa, - 0xf2, 0x71, 0x55, 0xeb, 0x21, 0x09, 0xa3, 0x7c, 0x42, 0x8c, 0x32, 0xd7, 0x34, 0x3c, 0x21, 0x56, - 0x48, 0x88, 0x85, 0x24, 0x8c, 0xf2, 0xf1, 0x99, 0x1c, 0xf9, 0xfe, 0x23, 0xcd, 0xe4, 0xbf, 0x2a, - 0xc1, 0x5c, 0xac, 0x59, 0x99, 0xce, 0x68, 0xab, 0x6f, 0x35, 0x28, 0xf3, 0x3b, 0xf0, 0x4b, 0x50, - 0x51, 0xd1, 0xe6, 0x3b, 0xa1, 0x95, 0x0b, 0x2a, 0xd5, 0x08, 0x49, 0x18, 0xe5, 0x23, 0xbf, 0x1d, - 0xf6, 0xbb, 0x4c, 0xac, 0x18, 0xc7, 0xd3, 0xef, 0x43, 0x15, 0x3c, 0x54, 0xdf, 0x2f, 0x40, 0xd9, - 0xd6, 0x99, 0x27, 0x26, 0x92, 0x9a, 0x33, 0x81, 0x6f, 0x7e, 0xc7, 0x27, 0x60, 0xc8, 0x43, 0x36, - 0xe0, 0x69, 0xd5, 0xc4, 0xd7, 0x1f, 0xf6, 0x1c, 0x97, 0x51, 0x57, 0xca, 0xe6, 0x85, 0xec, 0x25, - 0x25, 0xfb, 0xf4, 0x7a, 0x0a, 0x0f, 0xa6, 0x4a, 0x92, 0x75, 0x38, 0x67, 0xc8, 0x60, 0x33, 0xb5, - 0x1c, 0xbd, 0xe9, 0x03, 0x16, 0x04, 0x60, 0xe0, 0x88, 0x2e, 0x0f, 0xb3, 0x60, 0x9a, 0x5c, 0x72, - 0x34, 0x17, 0xc7, 0x1a, 0xcd, 0x53, 0xe3, 0x8c, 0xe6, 0xd2, 0x78, 0xa3, 0xb9, 0x7c, 0xb8, 0xd1, - 0xcc, 0x5b, 0x9e, 0x8f, 0x23, 0xea, 0x2e, 0xf5, 0xd9, 0x8e, 0x8c, 0xcb, 0x44, 0x72, 0x19, 0x41, - 0xcb, 0x37, 0x52, 0x78, 0x30, 0x55, 0x92, 0x6c, 0xc3, 0xac, 0x2c, 0xbf, 0x6e, 0x1b, 0xee, 0x5e, - 0x8f, 0xaf, 0x1c, 0x11, 0xdc, 0x8a, 0xc0, 0xd5, 0x14, 0xee, 0x6c, 0x63, 0x24, 0x27, 0x1e, 0x80, - 0x42, 0x7e, 0x09, 0x66, 0x64, 0x2f, 0xad, 0xeb, 0x3d, 0x01, 0x2b, 0x33, 0x1b, 0xe7, 0x15, 0xec, - 0xcc, 0x72, 0x94, 0x88, 0x71, 0x5e, 0xb2, 0x04, 0xa7, 0x7b, 0xbb, 0x06, 0x7f, 0xbc, 0xd9, 0xba, - 0x43, 0x69, 0x93, 0x36, 0x45, 0x1e, 0xa3, 0x5c, 0x7f, 0xc6, 0xdf, 0x08, 0x6e, 0xc4, 0xc9, 0x98, - 0xe4, 0x27, 0xd7, 0x60, 0xda, 0x63, 0xba, 0xcb, 0x54, 0xd8, 0xa3, 0x7a, 0x4a, 0x66, 0x7e, 0xfc, - 0xa8, 0x40, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x24, 0xd6, 0xe3, 0x91, 0x5c, 0x0c, 0x45, 0xdc, 0x28, - 0x61, 0xf6, 0xdf, 0x4d, 0x9a, 0xfd, 0xd7, 0x26, 0x99, 0xfe, 0x29, 0x1a, 0x0e, 0x35, 0xed, 0x6f, - 0x01, 0x71, 0x55, 0x94, 0x4b, 0xee, 0x36, 0x22, 0x96, 0x3f, 0xc8, 0xaf, 0xe1, 0x10, 0x07, 0xa6, - 0x48, 0x91, 0x06, 0x9c, 0xf7, 0xa8, 0xcd, 0x4c, 0x9b, 0x5a, 0x71, 0x38, 0xb9, 0x24, 0x3c, 0xab, - 0xe0, 0xce, 0x37, 0xd2, 0x98, 0x30, 0x5d, 0x76, 0x92, 0xc6, 0xff, 0xd7, 0xb2, 0x58, 0x77, 0x65, - 0xd3, 0x1c, 0x9b, 0xd9, 0x7e, 0x2f, 0x69, 0xb6, 0xdf, 0x98, 0xbc, 0xdf, 0xc6, 0x33, 0xd9, 0x8b, - 0x00, 0xa2, 0x17, 0xa2, 0x36, 0x3b, 0xb0, 0x54, 0x18, 0x50, 0x30, 0xc2, 0xc5, 0x67, 0xa1, 0xdf, - 0xce, 0x51, 0x73, 0x1d, 0xcc, 0xc2, 0x46, 0x94, 0x88, 0x71, 0xde, 0x91, 0x26, 0xbf, 0x30, 0xb6, - 0xc9, 0xbf, 0x05, 0x24, 0xb6, 0xd7, 0x95, 0x78, 0xc5, 0x78, 0x7a, 0xf7, 0xe6, 0x10, 0x07, 0xa6, - 0x48, 0x8d, 0x18, 0xca, 0x53, 0xc7, 0x3b, 0x94, 0x4b, 0xe3, 0x0f, 0x65, 0xf2, 0x06, 0x5c, 0x14, - 0xaa, 0x54, 0xfb, 0xc4, 0x81, 0xa5, 0xf1, 0xff, 0xac, 0x02, 0xbe, 0x88, 0xa3, 0x18, 0x71, 0x34, - 0x06, 0xef, 0x1f, 0xc3, 0xa5, 0x4d, 0xae, 0x5c, 0xb7, 0x46, 0x2f, 0x0c, 0xcb, 0x29, 0x3c, 0x98, - 0x2a, 0xc9, 0x87, 0x18, 0xe3, 0xc3, 0x50, 0xdf, 0xb6, 0x68, 0x53, 0xa5, 0xb7, 0x83, 0x21, 0xb6, - 0xb9, 0xd6, 0x50, 0x14, 0x8c, 0x70, 0xa5, 0xd9, 0xea, 0xe9, 0x23, 0xda, 0xea, 0x1b, 0x22, 0x30, - 0xd4, 0x8a, 0x2d, 0x09, 0xca, 0xe0, 0x07, 0x07, 0x16, 0x96, 0x93, 0x0c, 0x38, 0x2c, 0x23, 0x96, - 0x4a, 0xc3, 0x35, 0x7b, 0xcc, 0x8b, 0x63, 0x9d, 0x4a, 0x2c, 0x95, 0x29, 0x3c, 0x98, 0x2a, 0xc9, - 0x9d, 0x94, 0x1d, 0xaa, 0x5b, 0x6c, 0x27, 0x0e, 0x78, 0x3a, 0xee, 0xa4, 0xbc, 0x3c, 0xcc, 0x82, - 0x69, 0x72, 0x93, 0x98, 0xb7, 0x6f, 0x67, 0xe1, 0xdc, 0x0d, 0xaa, 0x12, 0xe8, 0x1b, 0x4e, 0xd3, - 0xb7, 0x6b, 0xff, 0x4f, 0x77, 0x59, 0xef, 0x66, 0x61, 0xea, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x3d, - 0xd2, 0x86, 0xe2, 0x03, 0x11, 0x11, 0x51, 0x71, 0x90, 0xf1, 0xcf, 0x0a, 0xc8, 0xc0, 0x4a, 0x68, - 0x82, 0xe5, 0x3b, 0x2a, 0x78, 0xde, 0x52, 0x1d, 0xba, 0x47, 0x65, 0xe6, 0xac, 0x14, 0xb6, 0xd4, - 0x6d, 0x5e, 0x88, 0x92, 0x46, 0xde, 0x84, 0x29, 0x8f, 0x39, 0xae, 0x6f, 0xa4, 0x27, 0x89, 0x7a, - 0x6d, 0xd4, 0xbf, 0xde, 0x90, 0x50, 0x72, 0x23, 0xaf, 0x5e, 0xd0, 0x57, 0xa0, 0x7d, 0x3f, 0x03, - 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0x8a, 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x83, 0x70, 0xd0, 0xea, 0xf8, - 0xa1, 0xe1, 0x68, 0x36, 0x53, 0xc5, 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, 0xa9, - 0x15, 0x52, 0xb5, 0x43, 0x90, 0xbc, 0x51, 0xab, 0x28, 0xfa, 0x74, 0xed, 0x47, 0x59, 0xb8, 0x70, - 0xd3, 0x66, 0xd4, 0x6d, 0x30, 0xda, 0x8b, 0x25, 0xef, 0xc8, 0xaf, 0x0d, 0x9d, 0x6d, 0xfb, 0xb9, - 0xc3, 0x05, 0x41, 0xe4, 0xd1, 0xa8, 0x75, 0xca, 0xf4, 0xd0, 0x36, 0x85, 0x65, 0x91, 0x03, 0x6d, - 0x7d, 0xc8, 0x7b, 0x3d, 0x6a, 0xa8, 0x10, 0x4b, 0x63, 0xec, 0xd6, 0x48, 0xff, 0x00, 0x3e, 0xff, - 0xc2, 0xe0, 0x96, 0x98, 0x8d, 0x42, 0x1d, 0xf9, 0x26, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0x1f, 0x6c, - 0xdd, 0x3a, 0x6e, 0xc5, 0x02, 0x3c, 0x1c, 0xa3, 0xf2, 0x1d, 0x95, 0x52, 0xed, 0x47, 0x19, 0x98, - 0x4d, 0x17, 0x5c, 0x33, 0x3d, 0x46, 0x7e, 0x65, 0xa8, 0xd9, 0x0f, 0x19, 0x7b, 0xe2, 0xd2, 0xa2, - 0xd1, 0x83, 0x4c, 0xb8, 0x5f, 0x12, 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0xef, 0x2b, 0xdd, - 0x3d, 0xe6, 0x4f, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xa8, 0x4f, 0xe6, - 0xdd, 0x42, 0xac, 0x78, 0x82, 0xf8, 0xf6, 0x64, 0x09, 0xe2, 0x78, 0x85, 0x86, 0xf3, 0xc4, 0xbf, - 0x31, 0x9c, 0x27, 0xbe, 0x3b, 0x79, 0x9e, 0x38, 0xd1, 0x0c, 0x23, 0xd3, 0xc5, 0xdf, 0xce, 0xc1, - 0xa5, 0x83, 0x86, 0x0d, 0xb7, 0x95, 0x6a, 0x74, 0x4e, 0x6a, 0x2b, 0x0f, 0x1e, 0x87, 0x64, 0x11, - 0x0a, 0xbd, 0x1d, 0xdd, 0xf3, 0x57, 0x15, 0x7f, 0xf1, 0x2d, 0x6c, 0xf0, 0xc2, 0x47, 0x83, 0x5a, - 0x45, 0xae, 0x46, 0xe2, 0x15, 0x25, 0x2b, 0xb7, 0x2c, 0x5d, 0xea, 0x79, 0xa1, 0x7f, 0x1b, 0x58, - 0x96, 0x75, 0x59, 0x8c, 0x3e, 0x9d, 0x30, 0x28, 0xca, 0x3d, 0xa3, 0x4a, 0x2d, 0x8c, 0x9f, 0x07, - 0x4b, 0x39, 0x53, 0x10, 0x7e, 0x94, 0x0a, 0x3f, 0x28, 0x5d, 0xc1, 0x99, 0x85, 0x42, 0xfa, 0x99, - 0x85, 0xc8, 0x02, 0x2b, 0xcf, 0x2c, 0xfc, 0x43, 0x09, 0x2e, 0xa4, 0xf7, 0x21, 0xff, 0xd6, 0x5d, - 0xea, 0x7a, 0xa6, 0x63, 0xab, 0x45, 0x3b, 0x3c, 0xdb, 0x23, 0x8b, 0xd1, 0xa7, 0x7f, 0xaa, 0x73, - 0x6c, 0x7f, 0x92, 0xe1, 0x6e, 0xb0, 0x0c, 0xd4, 0x7c, 0x12, 0x79, 0xb6, 0x67, 0xa5, 0x3b, 0x3d, - 0x42, 0x21, 0x8e, 0xae, 0x0b, 0xf9, 0xe3, 0x0c, 0x54, 0xbb, 0x09, 0x3f, 0xfb, 0x04, 0x4f, 0xd7, - 0x5d, 0xda, 0x1f, 0xd4, 0xaa, 0xeb, 0x23, 0xf4, 0xe1, 0xc8, 0x9a, 0x90, 0xdf, 0x84, 0x4a, 0x8f, - 0x8f, 0x0b, 0x8f, 0x51, 0xdb, 0xf0, 0x0f, 0xd8, 0x8d, 0x3f, 0xfa, 0x37, 0x42, 0xac, 0x06, 0x73, - 0x75, 0x46, 0xdb, 0x7b, 0x2a, 0x71, 0x16, 0x12, 0x30, 0xaa, 0xf1, 0x09, 0x3f, 0x4e, 0x77, 0x05, - 0x4a, 0x1e, 0x65, 0xcc, 0xb4, 0xdb, 0x9e, 0xd8, 0xbd, 0x95, 0xe5, 0x5c, 0x69, 0xa8, 0x32, 0x0c, - 0xa8, 0xe4, 0x67, 0xa1, 0x2c, 0xe2, 0x3e, 0x4b, 0x6e, 0xdb, 0xab, 0x96, 0x45, 0x26, 0x4a, 0xd8, - 0xd5, 0x86, 0x5f, 0x88, 0x21, 0x9d, 0xbc, 0x00, 0xd3, 0x32, 0x1b, 0xa7, 0x8e, 0xd5, 0xca, 0x3d, - 0xd6, 0x99, 0xfd, 0x41, 0x6d, 0xba, 0x1e, 0x29, 0xc7, 0x18, 0x17, 0xdf, 0x4f, 0xd1, 0x20, 0x38, - 0x96, 0xdc, 0x4f, 0x85, 0x61, 0x33, 0x8c, 0x70, 0x91, 0x67, 0x21, 0xc7, 0x2c, 0x4f, 0xec, 0xa1, - 0x4a, 0xa1, 0xdf, 0xbb, 0xb9, 0xd6, 0x40, 0x5e, 0xae, 0xfd, 0x6f, 0x06, 0x4e, 0x27, 0x4e, 0x0f, - 0x71, 0x91, 0xbe, 0x6b, 0x29, 0x33, 0x12, 0x88, 0x6c, 0xe1, 0x1a, 0xf2, 0x72, 0xf2, 0x86, 0xf2, - 0x0a, 0xb3, 0x13, 0xde, 0x20, 0xb8, 0xa3, 0x33, 0x8f, 0xbb, 0x81, 0x43, 0x0e, 0xe1, 0xb5, 0x44, - 0xe3, 0xe4, 0xe2, 0xb1, 0xb6, 0x83, 0x1b, 0x28, 0xb2, 0xe1, 0xcc, 0x1f, 0x66, 0xc3, 0xa9, 0xfd, - 0x5d, 0x0e, 0x2a, 0xb7, 0x9c, 0xed, 0x4f, 0xc9, 0xf9, 0x88, 0x74, 0x8b, 0x9c, 0xfd, 0x29, 0x5a, - 0xe4, 0x2d, 0x78, 0x86, 0x31, 0xbe, 0xeb, 0x77, 0xec, 0xa6, 0xb7, 0xd4, 0x62, 0xd4, 0x5d, 0x35, - 0x6d, 0xd3, 0xdb, 0xa1, 0x4d, 0x15, 0xb9, 0xfb, 0xcc, 0xfe, 0xa0, 0xf6, 0xcc, 0xe6, 0xe6, 0x5a, - 0x1a, 0x0b, 0x8e, 0x92, 0x15, 0x33, 0x44, 0x37, 0x3a, 0x4e, 0xab, 0x25, 0x33, 0xdb, 0x32, 0xc7, - 0x23, 0x67, 0x48, 0xa4, 0x1c, 0x63, 0x5c, 0xda, 0x47, 0x19, 0x28, 0xdf, 0xd6, 0x5b, 0x1d, 0xbd, - 0x61, 0xda, 0x1d, 0xf2, 0x1c, 0x4c, 0x6d, 0xbb, 0x4e, 0x87, 0xba, 0x9e, 0xca, 0x34, 0x8b, 0x5d, - 0x4f, 0x5d, 0x16, 0xa1, 0x4f, 0xe3, 0xdb, 0x30, 0xe6, 0xf4, 0x4c, 0x23, 0xb9, 0x61, 0xdd, 0xe4, - 0x85, 0x28, 0x69, 0xe4, 0xbe, 0x9c, 0x47, 0xb9, 0x09, 0x8f, 0x5f, 0x6f, 0xae, 0x35, 0x64, 0xf6, - 0xd6, 0x9f, 0x81, 0xe4, 0xf9, 0x98, 0xe7, 0x51, 0x1e, 0xe5, 0x2b, 0x68, 0xdf, 0xcb, 0x42, 0x45, - 0x7e, 0x9a, 0xdc, 0x9c, 0x1d, 0xe7, 0xc7, 0xbd, 0x28, 0xa2, 0xeb, 0x5e, 0xbf, 0x4b, 0x5d, 0xb1, - 0x09, 0x56, 0x53, 0x2e, 0x1a, 0x2d, 0x09, 0x89, 0x41, 0x84, 0x3d, 0x2c, 0xf2, 0x5b, 0x27, 0x7f, - 0x82, 0xad, 0x53, 0x38, 0xb0, 0x75, 0xfe, 0x3c, 0x03, 0xe5, 0x35, 0xb3, 0x45, 0x8d, 0x3d, 0xc3, - 0xa2, 0xe4, 0x15, 0xa8, 0x36, 0xa9, 0x45, 0x19, 0xbd, 0xe1, 0xea, 0x06, 0xdd, 0xa0, 0xae, 0x29, - 0x2e, 0xdb, 0xf0, 0x51, 0x26, 0xe6, 0x71, 0x41, 0x2e, 0x97, 0x2b, 0x23, 0x78, 0x70, 0xa4, 0x34, - 0xb9, 0x09, 0xd3, 0x4d, 0xea, 0x99, 0x2e, 0x6d, 0x6e, 0x44, 0xbc, 0xd1, 0xe7, 0x7c, 0xdb, 0xb4, - 0x12, 0xa1, 0x3d, 0x1a, 0xd4, 0x66, 0x36, 0xcc, 0x1e, 0xb5, 0x4c, 0x9b, 0x4a, 0xb7, 0x34, 0x26, - 0xaa, 0x15, 0x20, 0xb7, 0xe6, 0xb4, 0xb5, 0xf7, 0x73, 0x10, 0x5c, 0x9f, 0x22, 0xbf, 0x95, 0x81, - 0x8a, 0x6e, 0xdb, 0x0e, 0x53, 0x57, 0x93, 0x64, 0x6c, 0x1f, 0x27, 0xbe, 0xa5, 0x35, 0xbf, 0x14, - 0x82, 0xca, 0xb0, 0x70, 0x10, 0xaa, 0x8e, 0x50, 0x30, 0xaa, 0x9b, 0xf4, 0x13, 0x91, 0xea, 0xf5, - 0xc9, 0x6b, 0x71, 0x88, 0xb8, 0xf4, 0xec, 0xd7, 0xe0, 0x4c, 0xb2, 0xb2, 0x47, 0x09, 0x6c, 0x4d, - 0x12, 0x13, 0x7b, 0xb7, 0x0c, 0x95, 0x3b, 0x3a, 0x33, 0x77, 0xa9, 0xd8, 0x82, 0x9d, 0x8c, 0x4f, - 0xfd, 0x87, 0x19, 0xb8, 0x10, 0x8f, 0x19, 0x9f, 0xa0, 0x63, 0x3d, 0xbb, 0x3f, 0xa8, 0x5d, 0xc0, - 0x54, 0x6d, 0x38, 0xa2, 0x16, 0xc2, 0xc5, 0x1e, 0x0a, 0x41, 0x9f, 0xb4, 0x8b, 0xdd, 0x18, 0xa5, - 0x10, 0x47, 0xd7, 0xe5, 0xd3, 0xe2, 0x62, 0x3f, 0xd9, 0xd7, 0x59, 0x12, 0x1b, 0x80, 0xa9, 0x27, - 0x66, 0x03, 0x50, 0x7a, 0x22, 0x1c, 0xae, 0x5e, 0x64, 0x03, 0x50, 0x9e, 0x30, 0x0e, 0xaa, 0xd2, - 0xac, 0x12, 0x6d, 0xd4, 0x46, 0x42, 0x1c, 0x7e, 0xf3, 0x7d, 0x63, 0x62, 0x40, 0x61, 0x5b, 0xf7, - 0x4c, 0x43, 0xb9, 0x9f, 0xf5, 0xf1, 0xc3, 0x12, 0xfe, 0xbd, 0x0f, 0x19, 0x63, 0x12, 0xaf, 0x28, - 0xb1, 0xc3, 0xfb, 0x25, 0xd9, 0x89, 0xee, 0x97, 0x90, 0x65, 0xc8, 0xdb, 0xdc, 0xd8, 0xe6, 0x8e, - 0x7c, 0xa3, 0xe4, 0xce, 0x6d, 0xba, 0x87, 0x42, 0x58, 0xfb, 0x61, 0x16, 0x80, 0x7f, 0xbe, 0x72, - 0x73, 0x1e, 0xb3, 0x19, 0xf9, 0x3c, 0x4c, 0x79, 0x7d, 0x11, 0xad, 0x55, 0x4b, 0x71, 0x18, 0x3c, - 0x96, 0xc5, 0xe8, 0xd3, 0xb9, 0x27, 0xf4, 0x56, 0x9f, 0xf6, 0xfd, 0x58, 0x50, 0xe0, 0x09, 0x7d, - 0x9d, 0x17, 0xa2, 0xa4, 0x9d, 0x9c, 0x23, 0xe3, 0xef, 0x9a, 0x0a, 0x27, 0xb4, 0x6b, 0xd2, 0xde, - 0xc9, 0x02, 0x84, 0x01, 0x7e, 0xf2, 0xfd, 0x0c, 0x9c, 0x0f, 0x66, 0x19, 0x93, 0xb7, 0x16, 0x96, - 0x2d, 0xdd, 0xec, 0x4e, 0xbc, 0x91, 0x49, 0x9b, 0xe1, 0xc2, 0xec, 0x6c, 0xa4, 0xa9, 0xc3, 0xf4, - 0x5a, 0x10, 0x84, 0x12, 0xed, 0xf6, 0xd8, 0xde, 0x8a, 0xe9, 0xaa, 0x61, 0x97, 0x7a, 0xec, 0xff, - 0xba, 0xe2, 0x91, 0xa2, 0xea, 0x76, 0x87, 0x98, 0x39, 0x3e, 0x05, 0x03, 0x1c, 0xed, 0xbb, 0x59, - 0x38, 0x97, 0x52, 0x3b, 0xf2, 0x12, 0x9c, 0x51, 0x19, 0x8e, 0xf0, 0xea, 0x6e, 0x26, 0xbc, 0xba, - 0xdb, 0x48, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x01, 0xa0, 0x1b, 0x06, 0xf5, 0xbc, 0x75, 0xa7, 0xe9, - 0x3b, 0x7d, 0x2f, 0xf2, 0x4d, 0xe5, 0x52, 0x50, 0xfa, 0x68, 0x50, 0xfb, 0x62, 0x5a, 0xaa, 0x2a, - 0xf1, 0xf5, 0xa1, 0x00, 0x46, 0x20, 0xc9, 0xeb, 0x00, 0xf2, 0x2e, 0x49, 0x70, 0xd8, 0xf2, 0x31, - 0x91, 0xf4, 0x79, 0xff, 0x9e, 0xc3, 0xfc, 0xd7, 0xfb, 0xba, 0xcd, 0x4c, 0xb6, 0x27, 0x8f, 0x4e, - 0xdf, 0x0b, 0x50, 0x30, 0x82, 0xa8, 0xfd, 0x4d, 0x16, 0x4a, 0xbe, 0x33, 0xfa, 0x09, 0xe4, 0x4a, - 0xda, 0xb1, 0x5c, 0xc9, 0xf8, 0x97, 0x07, 0xfd, 0x2a, 0x8f, 0xcc, 0x8e, 0x38, 0x89, 0xec, 0xc8, - 0x8d, 0xc9, 0x55, 0x1d, 0x9c, 0x0f, 0xf9, 0x41, 0x16, 0x4e, 0xf9, 0xac, 0xea, 0x1c, 0xf7, 0x97, - 0x61, 0xc6, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0x63, 0x47, 0x74, 0x9f, 0x3c, 0xc5, 0x7d, 0x76, 0x7f, - 0x50, 0x9b, 0xc1, 0x28, 0x01, 0xe3, 0x7c, 0x69, 0x07, 0xc0, 0xb3, 0x13, 0x1e, 0x00, 0xcf, 0x1d, - 0xe5, 0x00, 0x38, 0xd1, 0xa1, 0xc2, 0x6b, 0xb4, 0x69, 0x76, 0xa9, 0xd3, 0xf7, 0xff, 0x56, 0x70, - 0xd4, 0xc3, 0xc3, 0x62, 0x75, 0xc7, 0x10, 0x06, 0xa3, 0x98, 0xda, 0x3f, 0x66, 0x60, 0x3a, 0x6c, - 0xaf, 0x13, 0xcf, 0x18, 0xb5, 0xe2, 0x19, 0xa3, 0xa5, 0x89, 0x87, 0xc3, 0x88, 0x1c, 0xd1, 0xef, - 0x17, 0xc3, 0xcf, 0x12, 0x59, 0xa1, 0x6d, 0x98, 0x35, 0x53, 0x13, 0x25, 0x11, 0x6b, 0x13, 0x1c, - 0x82, 0xbb, 0x39, 0x92, 0x13, 0x0f, 0x40, 0x21, 0x7d, 0x28, 0xed, 0x52, 0x97, 0x99, 0x06, 0xf5, - 0xbf, 0xef, 0xc6, 0xc4, 0xde, 0x91, 0x3c, 0x00, 0x10, 0xb6, 0xe9, 0x3d, 0xa5, 0x00, 0x03, 0x55, - 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, 0xaf, 0x4e, 0x74, 0xeb, 0x22, 0x6c, 0x4f, - 0xfe, 0xe6, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xbe, 0x4e, - 0x10, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x45, 0x18, 0xea, 0x21, 0x9d, 0xe0, 0x3e, 0x49, 0xe1, 0x98, - 0x8c, 0xc7, 0x01, 0x77, 0x4a, 0x3c, 0x28, 0x3f, 0xd0, 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, 0x8e, - 0xff, 0xf8, 0x5f, 0x78, 0xdf, 0x47, 0x0a, 0xbf, 0x30, 0x28, 0xc2, 0x50, 0x0f, 0x71, 0xa0, 0xcc, - 0x94, 0x27, 0xeb, 0x5f, 0x49, 0x1c, 0x5f, 0xa9, 0xef, 0x13, 0x7b, 0x32, 0xb0, 0x1d, 0xbc, 0x62, - 0xa8, 0x43, 0x7b, 0x94, 0x0b, 0xcd, 0xe3, 0x27, 0x9d, 0x22, 0x7c, 0x21, 0x9e, 0x22, 0x9c, 0x4b, - 0xa6, 0x08, 0x13, 0xd1, 0x98, 0xa3, 0x27, 0x09, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xb6, 0x7a, 0x4d, - 0x9d, 0xa9, 0xf8, 0x72, 0x65, 0xf1, 0x67, 0x0e, 0x67, 0xbd, 0xb8, 0x3d, 0x0c, 0x83, 0x2e, 0x6b, - 0x21, 0x0c, 0x46, 0x31, 0xc9, 0x55, 0xa8, 0xec, 0x8a, 0x19, 0x29, 0x6f, 0x53, 0x14, 0x84, 0x39, - 0x17, 0x16, 0xf6, 0x5e, 0x58, 0x8c, 0x51, 0x1e, 0x2e, 0x22, 0x3d, 0x01, 0x29, 0x52, 0x0c, 0x45, - 0x1a, 0x61, 0x31, 0x46, 0x79, 0x44, 0xae, 0xc2, 0xb4, 0x3b, 0x52, 0x60, 0x4a, 0x08, 0xc8, 0x5c, - 0x85, 0x5f, 0x88, 0x21, 0x9d, 0x5c, 0x81, 0x52, 0xbf, 0xd9, 0x92, 0xbc, 0x25, 0xc1, 0x2b, 0xfc, - 0xaf, 0xad, 0x95, 0x55, 0x75, 0xbb, 0xc3, 0xa7, 0x6a, 0xff, 0x95, 0x01, 0x32, 0x9c, 0xd4, 0x26, - 0x3b, 0x50, 0xb4, 0x45, 0x54, 0x65, 0xe2, 0x2b, 0xd5, 0x91, 0xe0, 0x8c, 0x9c, 0x63, 0xaa, 0x40, - 0xe1, 0x13, 0x1b, 0x4a, 0xf4, 0x21, 0xa3, 0xae, 0xad, 0x5b, 0xca, 0xf5, 0x38, 0x9e, 0xeb, 0xdb, - 0xd2, 0xe1, 0x54, 0xc8, 0x18, 0xe8, 0xd0, 0x7e, 0x9c, 0x85, 0x4a, 0x84, 0xef, 0x71, 0x9b, 0x15, - 0x71, 0x66, 0x54, 0x06, 0x33, 0xb6, 0x5c, 0x4b, 0x0d, 0xd3, 0xc8, 0x99, 0x51, 0x45, 0xc2, 0x35, - 0x8c, 0xf2, 0x91, 0x45, 0x80, 0xae, 0xee, 0x31, 0xea, 0x8a, 0xa5, 0x24, 0x71, 0x52, 0x73, 0x3d, - 0xa0, 0x60, 0x84, 0x8b, 0x5c, 0x56, 0x97, 0xfb, 0xf3, 0xf1, 0x4b, 0x53, 0x23, 0x6e, 0xee, 0x17, - 0x8e, 0xe1, 0xe6, 0x3e, 0x69, 0xc3, 0x19, 0xbf, 0xd6, 0x3e, 0x55, 0xd9, 0xb9, 0x43, 0x02, 0x4b, - 0x67, 0x3c, 0x01, 0x81, 0x43, 0xa0, 0xda, 0x0f, 0x33, 0x30, 0x13, 0xdb, 0x4a, 0xf3, 0xad, 0x5d, - 0x78, 0x24, 0x23, 0xb2, 0xb5, 0x8b, 0x9d, 0xa4, 0x78, 0x1e, 0x8a, 0xb2, 0x81, 0x54, 0xc3, 0x07, - 0x66, 0x44, 0x36, 0x21, 0x2a, 0x2a, 0x37, 0x08, 0x2a, 0x58, 0x97, 0x34, 0x08, 0x2a, 0x9a, 0x87, - 0x3e, 0x9d, 0x7c, 0x01, 0x4a, 0x7e, 0xed, 0x54, 0x4b, 0x87, 0xff, 0x75, 0x50, 0xe5, 0x18, 0x70, - 0x68, 0xdf, 0x2a, 0x80, 0xfc, 0x29, 0x05, 0x97, 0x6b, 0x9a, 0x9e, 0xcc, 0x52, 0x65, 0x44, 0x96, - 0x2a, 0x90, 0x5b, 0x51, 0xe5, 0x18, 0x70, 0x90, 0x8b, 0x90, 0xeb, 0x9a, 0xb6, 0x0a, 0x2b, 0x8a, - 0x5d, 0xe5, 0xba, 0x69, 0x23, 0x2f, 0x13, 0x24, 0xfd, 0xa1, 0x4a, 0xb4, 0x48, 0x92, 0xfe, 0x10, - 0x79, 0x19, 0x77, 0x2e, 0x2d, 0xc7, 0xe9, 0x6c, 0xeb, 0x46, 0xc7, 0x0f, 0x7d, 0xe7, 0xc5, 0xec, - 0x15, 0xce, 0xe5, 0x5a, 0x9c, 0x84, 0x49, 0x5e, 0x2e, 0x6e, 0x38, 0x8e, 0xd5, 0x74, 0x1e, 0xd8, - 0xbe, 0x78, 0x21, 0x14, 0x5f, 0x8e, 0x93, 0x30, 0xc9, 0x4b, 0xb6, 0xe0, 0x99, 0xb7, 0xa9, 0xeb, - 0xa8, 0x16, 0x6b, 0x58, 0x94, 0xf6, 0x7c, 0x18, 0x69, 0xa0, 0x44, 0x56, 0xe8, 0xd5, 0x74, 0x16, - 0x1c, 0x25, 0x2b, 0x92, 0x4d, 0xba, 0xdb, 0xa6, 0x6c, 0xc3, 0x75, 0xf8, 0xde, 0xc9, 0xb4, 0xdb, - 0x3e, 0xec, 0x54, 0x08, 0xbb, 0x99, 0xce, 0x82, 0xa3, 0x64, 0xc9, 0x3a, 0x9c, 0x95, 0xa4, 0x88, - 0xcf, 0xac, 0x6c, 0x5d, 0x6d, 0x7f, 0x50, 0xfb, 0xcc, 0x0a, 0xed, 0xb9, 0xd4, 0xe0, 0x06, 0x7a, - 0x33, 0xc9, 0x86, 0xc3, 0x92, 0xe2, 0x57, 0x51, 0x2a, 0xdc, 0xbb, 0x41, 0x5d, 0xd1, 0xe5, 0x22, - 0x76, 0xa4, 0x1c, 0x73, 0x4c, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x02, 0xd5, 0x28, 0xec, 0xd2, 0xae, - 0x6e, 0x5a, 0xfa, 0xb6, 0x69, 0x99, 0x6c, 0x4f, 0xe4, 0x8a, 0x67, 0x64, 0x30, 0x72, 0x73, 0x04, - 0x0f, 0x8e, 0x94, 0xd6, 0xfe, 0x20, 0x07, 0xe2, 0xaf, 0x42, 0xe4, 0x3e, 0xe4, 0x2c, 0xa7, 0xad, - 0x4c, 0xf2, 0xf8, 0x91, 0x8e, 0x35, 0xa7, 0x2d, 0x07, 0xde, 0x9a, 0xd3, 0x46, 0x8e, 0x48, 0x0c, - 0x28, 0x74, 0xf4, 0x56, 0x47, 0x57, 0x16, 0x78, 0x7c, 0x7f, 0x23, 0x48, 0xe4, 0xa9, 0x1b, 0xa2, - 0xfc, 0x15, 0x25, 0x36, 0x77, 0x6c, 0xb6, 0xfd, 0xdf, 0x84, 0xa8, 0xad, 0xdf, 0x04, 0xb1, 0x31, - 0x1f, 0x49, 0xae, 0x82, 0xc1, 0x2b, 0x86, 0x3a, 0x88, 0x01, 0xc5, 0x7e, 0x53, 0xfc, 0xdd, 0x29, - 0x3f, 0xa1, 0x17, 0xb3, 0xb5, 0x22, 0xbe, 0x49, 0xac, 0x5f, 0xf2, 0x19, 0x15, 0xb4, 0xf6, 0x17, - 0x19, 0x98, 0x69, 0x58, 0x66, 0xd3, 0xb4, 0xdb, 0x27, 0x77, 0x27, 0x97, 0xdc, 0x85, 0x82, 0x67, - 0x99, 0x4d, 0x3a, 0xe6, 0x65, 0x51, 0xd1, 0x19, 0xbc, 0x96, 0x14, 0x25, 0x8e, 0xf6, 0xa7, 0x79, - 0x50, 0xbf, 0xc2, 0x22, 0x7d, 0x28, 0xb7, 0xfd, 0x9b, 0xab, 0xaa, 0xca, 0x2f, 0x4f, 0x70, 0xc3, - 0x21, 0x76, 0x07, 0x56, 0xf6, 0x4e, 0x50, 0x88, 0xa1, 0x26, 0x42, 0xe3, 0x63, 0x6e, 0x65, 0xc2, - 0x31, 0x27, 0xd5, 0x0d, 0x8f, 0x3a, 0x1d, 0xf2, 0x3b, 0x8c, 0xf5, 0x26, 0x3e, 0x88, 0x1b, 0x9e, - 0xb1, 0x95, 0x61, 0x3c, 0xfe, 0x8e, 0x02, 0x9a, 0xab, 0xb0, 0xf5, 0x63, 0xb8, 0xe1, 0x1e, 0x86, - 0x50, 0x55, 0x84, 0x55, 0x67, 0x1e, 0x0a, 0x68, 0xf2, 0xeb, 0x50, 0x61, 0xae, 0x6e, 0x7b, 0x2d, - 0xc7, 0xed, 0x52, 0x57, 0x2d, 0xfe, 0xab, 0x13, 0x8c, 0xe7, 0xcd, 0x10, 0x4d, 0x46, 0x3d, 0x62, - 0x45, 0x18, 0xd5, 0xa6, 0x75, 0x41, 0xb9, 0xed, 0xc4, 0x88, 0xfd, 0x49, 0x40, 0x66, 0x3a, 0x17, - 0x0e, 0x37, 0x16, 0x83, 0xbb, 0xe4, 0x91, 0xbb, 0x75, 0xa9, 0xbf, 0x0c, 0xd0, 0xfe, 0x39, 0x0b, - 0xb9, 0xcd, 0xb5, 0x86, 0xbc, 0x2a, 0x22, 0x7e, 0xac, 0x41, 0x1b, 0x1d, 0xb3, 0x77, 0x8f, 0xba, - 0x66, 0x6b, 0x4f, 0xad, 0xbd, 0x91, 0xab, 0x22, 0x49, 0x0e, 0x4c, 0x91, 0x22, 0xaf, 0xc1, 0xb4, - 0xa1, 0x2f, 0x53, 0x97, 0x49, 0x17, 0xe6, 0x68, 0x51, 0x73, 0x71, 0x82, 0x61, 0x79, 0x29, 0x14, - 0xc7, 0x18, 0x18, 0xd9, 0x02, 0x30, 0x42, 0xe8, 0x23, 0x45, 0xd2, 0xe5, 0xaf, 0x13, 0x42, 0xe0, - 0x08, 0x10, 0x41, 0x28, 0x77, 0x38, 0xab, 0x40, 0xcd, 0x1f, 0x05, 0x55, 0x4c, 0xba, 0xdb, 0xbe, - 0x2c, 0x86, 0x30, 0xda, 0x7f, 0x64, 0x20, 0xdc, 0x04, 0x12, 0x0f, 0x8a, 0x4d, 0x71, 0x6b, 0x5b, - 0x4d, 0xfb, 0xf1, 0x37, 0xd3, 0xf1, 0x1f, 0x96, 0xd4, 0xc9, 0xfe, 0xa0, 0x96, 0xf8, 0x89, 0x09, - 0x2a, 0x55, 0xa4, 0x0d, 0xb9, 0x37, 0x9d, 0xed, 0x89, 0x67, 0x7d, 0xe4, 0xfc, 0x8f, 0xdc, 0x39, - 0x45, 0x0a, 0x90, 0x6b, 0xd0, 0xbe, 0x95, 0x85, 0x4a, 0x64, 0x4c, 0x4f, 0xfc, 0x53, 0x82, 0x87, - 0x89, 0x9f, 0x12, 0x6c, 0x8c, 0xbf, 0x2b, 0x0f, 0x6b, 0x75, 0xd2, 0xff, 0x25, 0xf8, 0xdb, 0x2c, - 0xe4, 0xb6, 0x56, 0x56, 0xf9, 0xe2, 0x1b, 0x9c, 0x03, 0x9a, 0x38, 0x31, 0x15, 0xfe, 0x13, 0x4d, - 0x8c, 0xb4, 0xe0, 0x15, 0x43, 0x1d, 0x64, 0x07, 0xa6, 0xb6, 0xfb, 0xa6, 0xc5, 0x4c, 0x7b, 0xe2, - 0x53, 0x67, 0xfe, 0x3f, 0x1c, 0xd4, 0x71, 0x19, 0x89, 0x8a, 0x3e, 0x3c, 0x69, 0xc3, 0x54, 0x5b, - 0x5e, 0x03, 0x51, 0x73, 0xef, 0xa5, 0xf1, 0x57, 0x2f, 0x89, 0x23, 0x15, 0xa9, 0x17, 0xf4, 0xd1, - 0xb5, 0x6f, 0x82, 0x5a, 0xfc, 0x89, 0x77, 0x32, 0xad, 0x19, 0x04, 0x86, 0xd2, 0x5a, 0x54, 0xfb, - 0xcf, 0x0c, 0xc4, 0xad, 0xf4, 0x27, 0xdf, 0xa9, 0x9d, 0x64, 0xa7, 0xae, 0x1c, 0xc7, 0x1c, 0x48, - 0xef, 0x57, 0xed, 0xaf, 0xb3, 0x50, 0x54, 0x3f, 0x0b, 0x3d, 0xf9, 0xec, 0x07, 0x8d, 0x65, 0x3f, - 0x96, 0x27, 0xfc, 0x75, 0xe2, 0xc8, 0xdc, 0x47, 0x37, 0x91, 0xfb, 0x98, 0xf4, 0x1f, 0x8d, 0x8f, - 0xc9, 0x7c, 0xfc, 0x7d, 0x06, 0x4e, 0x49, 0xc6, 0x9b, 0xb6, 0xc7, 0x74, 0xdb, 0x10, 0x4e, 0xb1, - 0x8c, 0x44, 0x4d, 0x1c, 0xda, 0x53, 0x61, 0x68, 0xe1, 0xae, 0xca, 0x67, 0x54, 0xd0, 0x7c, 0xb3, - 0xbc, 0xe3, 0x78, 0x4c, 0x98, 0xdb, 0x6c, 0x7c, 0x93, 0xfd, 0xb2, 0x2a, 0xc7, 0x80, 0x23, 0xb9, - 0x7b, 0x2f, 0x8c, 0xde, 0xbd, 0x6b, 0x7f, 0x96, 0x81, 0xe9, 0xe8, 0xdf, 0x29, 0xc7, 0x4f, 0xe4, - 0x24, 0xf2, 0x28, 0xd9, 0x13, 0xc8, 0xa3, 0x7c, 0x98, 0x01, 0xf0, 0x2b, 0x7b, 0xe2, 0x59, 0x94, - 0x66, 0x3c, 0x8b, 0x32, 0x71, 0xb7, 0xa6, 0xe7, 0x50, 0x7e, 0x50, 0xf0, 0x3f, 0x49, 0x64, 0x50, - 0xde, 0xcb, 0xc0, 0x29, 0x3d, 0x96, 0x95, 0x98, 0xd8, 0x93, 0x48, 0x24, 0x39, 0x82, 0xbf, 0x79, - 0xc6, 0xcb, 0x31, 0xa1, 0x96, 0x5c, 0x83, 0xe9, 0x9e, 0x0a, 0x15, 0xdf, 0x09, 0x47, 0x5d, 0x70, - 0x00, 0x79, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x63, 0xb2, 0x40, 0xb9, 0x63, 0xc9, 0x02, 0x45, 0x8f, - 0x9a, 0xe5, 0x0f, 0x3c, 0x6a, 0x66, 0x43, 0xb9, 0xe5, 0x3a, 0x5d, 0x91, 0x68, 0x51, 0xff, 0x4e, - 0x9c, 0x30, 0x79, 0x13, 0x2c, 0x2a, 0xab, 0x3e, 0x2e, 0x86, 0x2a, 0xf8, 0x32, 0xcd, 0x1c, 0xa9, - 0xad, 0x78, 0x1c, 0xda, 0x82, 0xa9, 0xbb, 0x29, 0x51, 0xd1, 0x87, 0x8f, 0x27, 0x53, 0xa6, 0x3e, - 0x99, 0x64, 0x8a, 0xf6, 0x4f, 0x59, 0xdf, 0x5e, 0x34, 0x12, 0x77, 0x92, 0x32, 0x23, 0xee, 0x24, - 0xa9, 0xdb, 0xb5, 0xd1, 0x74, 0xc3, 0xf3, 0x50, 0x74, 0xa9, 0xee, 0x39, 0xb6, 0xba, 0xa7, 0x1e, - 0x58, 0x5b, 0x14, 0xa5, 0xa8, 0xa8, 0xd1, 0xb4, 0x44, 0xf6, 0x31, 0x69, 0x89, 0x2f, 0x44, 0x06, - 0x84, 0xcc, 0xff, 0x06, 0x73, 0x3b, 0x65, 0x50, 0x88, 0x98, 0xa5, 0xfa, 0x25, 0x7f, 0x21, 0x19, - 0xb3, 0x54, 0xbf, 0xcb, 0x0f, 0x38, 0x48, 0x13, 0xa6, 0x2d, 0xdd, 0x63, 0x22, 0x2a, 0xd5, 0x5c, - 0x62, 0x63, 0xe4, 0x3c, 0x82, 0x69, 0xb3, 0x16, 0xc1, 0xc1, 0x18, 0xaa, 0xf6, 0x7b, 0x19, 0x08, - 0x9b, 0xfc, 0x88, 0xd1, 0xd1, 0x57, 0xa0, 0xd4, 0xd5, 0x1f, 0xae, 0x50, 0x4b, 0xdf, 0x9b, 0xe4, - 0xef, 0x57, 0xeb, 0x0a, 0x03, 0x03, 0x34, 0x6d, 0x90, 0x01, 0x75, 0x63, 0x97, 0x50, 0x28, 0xb4, - 0xcc, 0x87, 0xaa, 0x3e, 0x93, 0x78, 0x2a, 0x91, 0xff, 0xad, 0xc9, 0xf8, 0x82, 0x28, 0x40, 0x89, - 0x4e, 0xba, 0x30, 0xe5, 0xc9, 0xf0, 0x8f, 0xfa, 0x94, 0xf1, 0x77, 0xe5, 0xb1, 0x30, 0x92, 0xba, - 0xee, 0x2b, 0x8b, 0xd0, 0xd7, 0x51, 0x9f, 0xff, 0xe0, 0xe3, 0xb9, 0xa7, 0x3e, 0xfc, 0x78, 0xee, - 0xa9, 0x8f, 0x3e, 0x9e, 0x7b, 0xea, 0x9d, 0xfd, 0xb9, 0xcc, 0x07, 0xfb, 0x73, 0x99, 0x0f, 0xf7, - 0xe7, 0x32, 0x1f, 0xed, 0xcf, 0x65, 0xfe, 0x6d, 0x7f, 0x2e, 0xf3, 0xbb, 0xff, 0x3e, 0xf7, 0xd4, - 0xab, 0x25, 0x1f, 0xf3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0c, 0xe6, 0xa8, 0xb2, 0x02, 0x64, - 0x00, 0x00, + // 5718 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57, + 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9, + 0x5a, 0x25, 0xff, 0xd9, 0x3f, 0xbb, 0x36, 0x63, 0xb2, 0xec, 0x2c, 0xb0, 0x9b, 0xb8, 0xed, 0xf1, + 0x64, 0x66, 0xec, 0x19, 0xef, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2, + 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0xf3, 0x90, 0x20, 0x16, 0x2d, 0x12, + 0x42, 0x5a, 0xb1, 0x0a, 0x12, 0x12, 0x12, 0x02, 0x69, 0x25, 0x1e, 0xd8, 0x17, 0x78, 0xe1, 0x09, + 0x05, 0x1e, 0x20, 0x0f, 0x48, 0x04, 0x81, 0x5a, 0xc4, 0x3c, 0xf1, 0x00, 0x5a, 0xb4, 0x2f, 0xab, + 0x11, 0x12, 0xe8, 0x7e, 0xd4, 0x67, 0x57, 0x7b, 0xec, 0x6e, 0x3b, 0x3b, 0x11, 0x6f, 0x55, 0xf7, + 0x9c, 0xf3, 0x3b, 0xb7, 0xee, 0xc7, 0xb9, 0xe7, 0x9e, 0x73, 0x6f, 0xc1, 0x8d, 0xb6, 0xc9, 0x76, + 0xfa, 0xdb, 0xf3, 0x86, 0xd3, 0x5d, 0xb0, 0xfb, 0x5d, 0xbd, 0xe7, 0x3a, 0x6f, 0x8a, 0x87, 0x96, + 0xe5, 0x3c, 0x58, 0xe8, 0x75, 0xda, 0x0b, 0x7a, 0xcf, 0xf4, 0xc2, 0x92, 0xdd, 0xab, 0xba, 0xd5, + 0xdb, 0xd1, 0xaf, 0x2e, 0xb4, 0xa9, 0x4d, 0x5d, 0x9d, 0xd1, 0xe6, 0x7c, 0xcf, 0x75, 0x98, 0x43, + 0xbe, 0x1c, 0x02, 0xcd, 0xfb, 0x40, 0xf3, 0xbe, 0xd8, 0x7c, 0xaf, 0xd3, 0x9e, 0xe7, 0x40, 0x61, + 0x89, 0x0f, 0x34, 0xfb, 0xc5, 0x48, 0x0d, 0xda, 0x4e, 0xdb, 0x59, 0x10, 0x78, 0xdb, 0xfd, 0x96, + 0x78, 0x13, 0x2f, 0xe2, 0x49, 0xea, 0x99, 0xd5, 0x3a, 0xd7, 0xbc, 0x79, 0xd3, 0xe1, 0xd5, 0x5a, + 0x30, 0x1c, 0x97, 0x2e, 0xec, 0x0e, 0xd5, 0x65, 0xf6, 0x85, 0x90, 0xa7, 0xab, 0x1b, 0x3b, 0xa6, + 0x4d, 0xdd, 0x3d, 0xff, 0x5b, 0x16, 0x5c, 0xea, 0x39, 0x7d, 0xd7, 0xa0, 0x47, 0x92, 0xf2, 0x16, + 0xba, 0x94, 0xe9, 0x69, 0xba, 0x16, 0x46, 0x49, 0xb9, 0x7d, 0x9b, 0x99, 0xdd, 0x61, 0x35, 0x3f, + 0xff, 0x38, 0x01, 0xcf, 0xd8, 0xa1, 0x5d, 0x3d, 0x29, 0xa7, 0xfd, 0x73, 0x19, 0xce, 0x2d, 0x6d, + 0x7b, 0xcc, 0xd5, 0x0d, 0xb6, 0xe1, 0x34, 0x37, 0x69, 0xb7, 0x67, 0xe9, 0x8c, 0x92, 0x0e, 0x94, + 0x78, 0xdd, 0x9a, 0x3a, 0xd3, 0xab, 0x99, 0xcb, 0x99, 0x2b, 0x95, 0xc5, 0xa5, 0xf9, 0x31, 0xfb, + 0x62, 0x7e, 0x5d, 0x01, 0xd5, 0xa7, 0xf7, 0x07, 0xb5, 0x92, 0xff, 0x86, 0x81, 0x02, 0xf2, 0xbd, + 0x0c, 0x4c, 0xdb, 0x4e, 0x93, 0x36, 0xa8, 0x45, 0x0d, 0xe6, 0xb8, 0xd5, 0xec, 0xe5, 0xdc, 0x95, + 0xca, 0xe2, 0xeb, 0x63, 0x6b, 0x4c, 0xf9, 0xa2, 0xf9, 0x3b, 0x11, 0x05, 0xd7, 0x6d, 0xe6, 0xee, + 0xd5, 0x9f, 0xfe, 0x60, 0x50, 0x7b, 0x6a, 0x7f, 0x50, 0x9b, 0x8e, 0x92, 0x30, 0x56, 0x13, 0xb2, + 0x05, 0x15, 0xe6, 0x58, 0xbc, 0xc9, 0x4c, 0xc7, 0xf6, 0xaa, 0x39, 0x51, 0xb1, 0xb9, 0x79, 0xd9, + 0xda, 0x5c, 0xfd, 0x3c, 0x1f, 0x2e, 0xf3, 0xbb, 0x57, 0xe7, 0x37, 0x03, 0xb6, 0xfa, 0x39, 0x05, + 0x5c, 0x09, 0xcb, 0x3c, 0x8c, 0xe2, 0x10, 0x0a, 0xa7, 0x3d, 0x6a, 0xf4, 0x5d, 0x93, 0xed, 0x2d, + 0x3b, 0x36, 0xa3, 0x0f, 0x59, 0x35, 0x2f, 0x5a, 0xf9, 0xf9, 0x34, 0xe8, 0x0d, 0xa7, 0xd9, 0x88, + 0x73, 0xd7, 0xcf, 0xed, 0x0f, 0x6a, 0xa7, 0x13, 0x85, 0x98, 0xc4, 0x24, 0x36, 0x9c, 0x31, 0xbb, + 0x7a, 0x9b, 0x6e, 0xf4, 0x2d, 0xab, 0x41, 0x0d, 0x97, 0x32, 0xaf, 0x5a, 0x10, 0x9f, 0x70, 0x25, + 0x4d, 0xcf, 0x9a, 0x63, 0xe8, 0xd6, 0xdd, 0xed, 0x37, 0xa9, 0xc1, 0x90, 0xb6, 0xa8, 0x4b, 0x6d, + 0x83, 0xd6, 0xab, 0xea, 0x63, 0xce, 0xdc, 0x4c, 0x20, 0xe1, 0x10, 0x36, 0xb9, 0x01, 0x67, 0x7b, + 0xae, 0xe9, 0x88, 0x2a, 0x58, 0xba, 0xe7, 0xdd, 0xd1, 0xbb, 0xb4, 0x5a, 0xbc, 0x9c, 0xb9, 0x52, + 0xae, 0x5f, 0x54, 0x30, 0x67, 0x37, 0x92, 0x0c, 0x38, 0x2c, 0x43, 0xae, 0x40, 0xc9, 0x2f, 0xac, + 0x4e, 0x5d, 0xce, 0x5c, 0x29, 0xc8, 0xb1, 0xe3, 0xcb, 0x62, 0x40, 0x25, 0xab, 0x50, 0xd2, 0x5b, + 0x2d, 0xd3, 0xe6, 0x9c, 0x25, 0xd1, 0x84, 0x97, 0xd2, 0x3e, 0x6d, 0x49, 0xf1, 0x48, 0x1c, 0xff, + 0x0d, 0x03, 0x59, 0x72, 0x0b, 0x88, 0x47, 0xdd, 0x5d, 0xd3, 0xa0, 0x4b, 0x86, 0xe1, 0xf4, 0x6d, + 0x26, 0xea, 0x5e, 0x16, 0x75, 0x9f, 0x55, 0x75, 0x27, 0x8d, 0x21, 0x0e, 0x4c, 0x91, 0x22, 0x2f, + 0xc1, 0x19, 0x35, 0xed, 0xc2, 0x56, 0x00, 0x81, 0xf4, 0x34, 0x6f, 0x48, 0x4c, 0xd0, 0x70, 0x88, + 0x9b, 0x34, 0xe1, 0x92, 0xde, 0x67, 0x4e, 0x97, 0x43, 0xc6, 0x95, 0x6e, 0x3a, 0x1d, 0x6a, 0x57, + 0x2b, 0x97, 0x33, 0x57, 0x4a, 0xf5, 0xcb, 0xfb, 0x83, 0xda, 0xa5, 0xa5, 0x03, 0xf8, 0xf0, 0x40, + 0x14, 0x72, 0x17, 0xca, 0x4d, 0xdb, 0xdb, 0x70, 0x2c, 0xd3, 0xd8, 0xab, 0x4e, 0x8b, 0x0a, 0x5e, + 0x55, 0x9f, 0x5a, 0x5e, 0xb9, 0xd3, 0x90, 0x84, 0x47, 0x83, 0xda, 0xa5, 0x61, 0xeb, 0x38, 0x1f, + 0xd0, 0x31, 0xc4, 0x20, 0xeb, 0x02, 0x70, 0xd9, 0xb1, 0x5b, 0x66, 0xbb, 0x3a, 0x23, 0x7a, 0xe3, + 0xf2, 0x88, 0x01, 0xbd, 0x72, 0xa7, 0x21, 0xf9, 0xea, 0x33, 0x4a, 0x9d, 0x7c, 0xc5, 0x10, 0x61, + 0xf6, 0x45, 0x38, 0x3b, 0x34, 0x6b, 0xc9, 0x19, 0xc8, 0x75, 0xe8, 0x9e, 0x30, 0x4a, 0x65, 0xe4, + 0x8f, 0xe4, 0x69, 0x28, 0xec, 0xea, 0x56, 0x9f, 0x56, 0xb3, 0xa2, 0x4c, 0xbe, 0xfc, 0x42, 0xf6, + 0x5a, 0x46, 0x1b, 0x94, 0xe1, 0x94, 0x6f, 0x0b, 0xee, 0x51, 0x97, 0xd1, 0x87, 0xe4, 0x32, 0xe4, + 0x6d, 0xde, 0x1f, 0x42, 0xbe, 0x3e, 0xad, 0x3e, 0x37, 0x2f, 0xfa, 0x41, 0x50, 0x88, 0x01, 0x45, + 0x69, 0xcb, 0x05, 0x5e, 0x65, 0xf1, 0xc5, 0xb1, 0xcd, 0x50, 0x43, 0xc0, 0xd4, 0x61, 0x7f, 0x50, + 0x2b, 0xca, 0x67, 0x54, 0xd0, 0xe4, 0x35, 0xc8, 0x7b, 0xa6, 0xdd, 0xa9, 0xe6, 0x84, 0x8a, 0xaf, + 0x8e, 0xaf, 0xc2, 0xb4, 0x3b, 0xf5, 0x12, 0xff, 0x02, 0xfe, 0x84, 0x02, 0x94, 0xdc, 0x87, 0x5c, + 0xbf, 0xd9, 0x52, 0x16, 0xe5, 0x97, 0xc6, 0xc6, 0xde, 0x5a, 0x59, 0xad, 0x4f, 0xed, 0x0f, 0x6a, + 0xb9, 0xad, 0x95, 0x55, 0xe4, 0x88, 0xe4, 0xbb, 0x19, 0x38, 0x6b, 0x38, 0x36, 0xd3, 0xf9, 0xfa, + 0xe2, 0x5b, 0xd6, 0x6a, 0x41, 0xe8, 0xb9, 0x35, 0xb6, 0x9e, 0xe5, 0x24, 0x62, 0xfd, 0x3c, 0x37, + 0x14, 0x43, 0xc5, 0x38, 0xac, 0x9b, 0x7c, 0x3f, 0x03, 0xe7, 0xf9, 0x04, 0x1e, 0x62, 0x16, 0x66, + 0xe7, 0x78, 0x6b, 0x75, 0x71, 0x7f, 0x50, 0x3b, 0x7f, 0x33, 0x4d, 0x19, 0xa6, 0xd7, 0x81, 0xd7, + 0xee, 0x9c, 0x3e, 0xbc, 0x16, 0x09, 0x93, 0x56, 0x59, 0x5c, 0x3b, 0xce, 0xf5, 0xad, 0xfe, 0x19, + 0x35, 0x94, 0xd3, 0x96, 0x73, 0x4c, 0xab, 0x05, 0xb9, 0x0e, 0x53, 0xbb, 0x8e, 0xd5, 0xef, 0x52, + 0xaf, 0x5a, 0x12, 0x8b, 0xc2, 0x6c, 0xda, 0x5c, 0xbd, 0x27, 0x58, 0xea, 0xa7, 0x15, 0xfc, 0x94, + 0x7c, 0xf7, 0xd0, 0x97, 0x25, 0x26, 0x14, 0x2d, 0xb3, 0x6b, 0x32, 0x4f, 0x58, 0xcb, 0xca, 0xe2, + 0xf5, 0xb1, 0x3f, 0x4b, 0x4e, 0xd1, 0x35, 0x01, 0x26, 0x67, 0x8d, 0x7c, 0x46, 0xa5, 0x80, 0x18, + 0x50, 0xf0, 0x0c, 0xdd, 0x92, 0xd6, 0xb4, 0xb2, 0xf8, 0xb5, 0xf1, 0xa7, 0x0d, 0x47, 0xa9, 0xcf, + 0xa8, 0x6f, 0x2a, 0x88, 0x57, 0x94, 0xd8, 0xe4, 0x57, 0xe0, 0x54, 0xac, 0x37, 0xbd, 0x6a, 0x45, + 0xb4, 0xce, 0xb3, 0x69, 0xad, 0x13, 0x70, 0xd5, 0x2f, 0x28, 0xb0, 0x53, 0xb1, 0x11, 0xe2, 0x61, + 0x02, 0x8c, 0xdc, 0x86, 0x92, 0x67, 0x36, 0xa9, 0xa1, 0xbb, 0x5e, 0x75, 0xfa, 0x30, 0xc0, 0x67, + 0x14, 0x70, 0xa9, 0xa1, 0xc4, 0x30, 0x00, 0xd0, 0xee, 0xc3, 0xcc, 0x52, 0x9f, 0xed, 0x38, 0xae, + 0xf9, 0xb6, 0xf0, 0x2c, 0xc8, 0x2a, 0x14, 0x98, 0x58, 0x21, 0xa4, 0xd3, 0xf6, 0x5c, 0x1a, 0xb4, + 0x5c, 0xad, 0x6f, 0xd3, 0x3d, 0xdf, 0xb0, 0xd6, 0xcb, 0xbc, 0x11, 0xe4, 0x8a, 0x21, 0xc5, 0xb5, + 0x3f, 0xcc, 0x40, 0xb9, 0xae, 0x7b, 0xa6, 0xc1, 0xe1, 0xc9, 0x32, 0xe4, 0xfb, 0x1e, 0x75, 0x8f, + 0x06, 0x2a, 0xac, 0xd2, 0x96, 0x47, 0x5d, 0x14, 0xc2, 0xe4, 0x2e, 0x94, 0x7a, 0xba, 0xe7, 0x3d, + 0x70, 0xdc, 0xa6, 0xb2, 0xac, 0x87, 0x04, 0x92, 0x4b, 0xbf, 0x12, 0xc5, 0x00, 0x44, 0xab, 0x40, + 0xb9, 0x6e, 0xe9, 0x46, 0x67, 0xc7, 0xb1, 0xa8, 0xf6, 0x2a, 0x14, 0xeb, 0xfd, 0x56, 0x8b, 0xba, + 0x87, 0xb0, 0xf0, 0xf3, 0x90, 0x67, 0x7b, 0x3d, 0xb5, 0x5e, 0x04, 0xab, 0x7b, 0x7e, 0x73, 0xaf, + 0x47, 0x1f, 0x0d, 0x6a, 0x20, 0x71, 0xf8, 0x1b, 0x0a, 0x3e, 0xed, 0xc7, 0x19, 0x38, 0x27, 0x0b, + 0xd5, 0x2a, 0x2a, 0xd7, 0x27, 0x42, 0xa1, 0xe0, 0xd2, 0xa6, 0xe9, 0xa9, 0x76, 0x59, 0x19, 0x7b, + 0x38, 0x22, 0x47, 0x51, 0xcb, 0xa1, 0xe8, 0x0b, 0x51, 0x80, 0x12, 0x9d, 0xf4, 0xa1, 0xfc, 0x26, + 0x65, 0x1e, 0x73, 0xa9, 0xde, 0x55, 0x2d, 0xf7, 0xf2, 0xd8, 0xaa, 0x6e, 0x51, 0xd6, 0x10, 0x48, + 0xd1, 0xd5, 0x37, 0x28, 0xc4, 0x50, 0x93, 0xf6, 0x93, 0x3c, 0x94, 0x83, 0x51, 0x48, 0x3e, 0x07, + 0x05, 0xe1, 0xee, 0xa9, 0x66, 0x0d, 0xa6, 0x8e, 0xf0, 0x0a, 0x51, 0xd2, 0xc8, 0x73, 0x30, 0x65, + 0x38, 0xdd, 0xae, 0x6e, 0x37, 0x85, 0x0b, 0x5f, 0xae, 0x57, 0xb8, 0xc5, 0x58, 0x96, 0x45, 0xe8, + 0xd3, 0xc8, 0x25, 0xc8, 0xeb, 0x6e, 0x5b, 0x7a, 0xd3, 0x65, 0x39, 0x4e, 0x96, 0xdc, 0xb6, 0x87, + 0xa2, 0x94, 0x7c, 0x05, 0x72, 0xd4, 0xde, 0xad, 0xe6, 0x47, 0x9b, 0xa4, 0xeb, 0xf6, 0xee, 0x3d, + 0xdd, 0xad, 0x57, 0x54, 0x1d, 0x72, 0xd7, 0xed, 0x5d, 0xe4, 0x32, 0x64, 0x0d, 0xa6, 0xa8, 0xbd, + 0xbb, 0xea, 0x3a, 0x5d, 0xe5, 0xe6, 0x7e, 0x76, 0x84, 0x38, 0x67, 0x51, 0xab, 0x73, 0x60, 0xd8, + 0x54, 0x31, 0xfa, 0x10, 0xe4, 0x1b, 0x30, 0x2d, 0x6d, 0xdc, 0x3a, 0x77, 0x99, 0xbc, 0x6a, 0x51, + 0x40, 0xd6, 0x46, 0x1b, 0x49, 0xc1, 0x17, 0x6e, 0x2b, 0x22, 0x85, 0x1e, 0xc6, 0xa0, 0xc8, 0x37, + 0xa0, 0xec, 0xef, 0x18, 0x3d, 0xb5, 0x1a, 0xa4, 0x7a, 0xe4, 0xa8, 0x98, 0x90, 0xbe, 0xd5, 0x37, + 0x5d, 0xda, 0xa5, 0x36, 0xf3, 0xea, 0x67, 0x7d, 0x1f, 0xcd, 0xa7, 0x7a, 0x18, 0xa2, 0x91, 0xed, + 0xe1, 0xad, 0x85, 0xf4, 0x8b, 0x3f, 0x37, 0x62, 0xb6, 0x8d, 0xb1, 0xaf, 0x78, 0x1d, 0x4e, 0x07, + 0xbe, 0xbf, 0x72, 0x1f, 0xa5, 0xa7, 0xfc, 0x02, 0x17, 0xbf, 0x19, 0x27, 0x3d, 0x1a, 0xd4, 0x9e, + 0x4d, 0x71, 0x20, 0x43, 0x06, 0x4c, 0x82, 0x69, 0xff, 0x95, 0x85, 0xe1, 0xe5, 0x3f, 0xde, 0x68, + 0x99, 0xe3, 0x6e, 0xb4, 0xe4, 0x07, 0x49, 0xe3, 0x70, 0x4d, 0x89, 0x4d, 0xfe, 0x51, 0x69, 0x1d, + 0x93, 0x3b, 0xee, 0x8e, 0x19, 0x7f, 0xee, 0x68, 0xef, 0xe5, 0xe1, 0xd4, 0x8a, 0x4e, 0xbb, 0x8e, + 0xfd, 0x58, 0xf7, 0x25, 0xf3, 0x44, 0xb8, 0x2f, 0x57, 0xa0, 0xe4, 0xd2, 0x9e, 0x65, 0x1a, 0xba, + 0x27, 0x3a, 0x4b, 0xed, 0x11, 0x51, 0x95, 0x61, 0x40, 0x1d, 0xe1, 0xb6, 0xe6, 0x9e, 0x48, 0xb7, + 0x35, 0xff, 0xd3, 0x77, 0x5b, 0xb5, 0xf7, 0x73, 0x90, 0xbf, 0xde, 0x6c, 0x53, 0xbe, 0x94, 0xb6, + 0xb8, 0x31, 0x4d, 0x2c, 0xa5, 0xc2, 0x4c, 0x0a, 0x0a, 0x99, 0x85, 0x2c, 0x73, 0xd4, 0x5c, 0x01, + 0x45, 0xcf, 0x6e, 0x3a, 0x98, 0x65, 0x0e, 0x79, 0x1b, 0xc0, 0x70, 0xec, 0xa6, 0xe9, 0x87, 0x4e, + 0x26, 0xfb, 0xb0, 0x55, 0xc7, 0x7d, 0xa0, 0xbb, 0xcd, 0xe5, 0x00, 0xb1, 0x7e, 0x6a, 0x7f, 0x50, + 0x83, 0xf0, 0x1d, 0x23, 0xda, 0x48, 0x3b, 0x70, 0x4a, 0x65, 0x83, 0x2e, 0x8f, 0xad, 0x97, 0x37, + 0xc4, 0x01, 0x2e, 0xe9, 0x55, 0xa8, 0xf4, 0x74, 0x57, 0xb7, 0x2c, 0x6a, 0x99, 0x5e, 0x57, 0xec, + 0x85, 0x0a, 0xf5, 0xd3, 0xfb, 0x83, 0x5a, 0x65, 0x23, 0x2c, 0xc6, 0x28, 0x0f, 0x79, 0x11, 0x8a, + 0x8e, 0xbd, 0xda, 0xb7, 0x2c, 0x15, 0x1a, 0xf9, 0x7f, 0x1c, 0xf6, 0xae, 0x28, 0x79, 0x34, 0xa8, + 0x5d, 0x94, 0x9e, 0x06, 0x7f, 0xbb, 0xef, 0x9a, 0xcc, 0xb4, 0xdb, 0x0d, 0xe6, 0xea, 0x8c, 0xb6, + 0xf7, 0x50, 0x89, 0x69, 0xbf, 0x9d, 0x01, 0x08, 0xab, 0x45, 0xbe, 0x0a, 0xa7, 0xb7, 0x85, 0xcc, + 0xba, 0xfe, 0x70, 0x8d, 0xda, 0x6d, 0xb6, 0x23, 0x3a, 0x2c, 0x2f, 0x6d, 0x46, 0x3d, 0x4e, 0xc2, + 0x24, 0x2f, 0x79, 0x09, 0xce, 0xc8, 0xa2, 0x2d, 0x4f, 0x57, 0x98, 0xa2, 0x43, 0x67, 0x64, 0xb4, + 0xa2, 0x9e, 0xa0, 0xe1, 0x10, 0xb7, 0xa6, 0x43, 0x65, 0xd5, 0x7c, 0x48, 0x9b, 0xf7, 0x4d, 0xbb, + 0xe9, 0x3c, 0x20, 0x08, 0x45, 0x2b, 0xac, 0x46, 0x65, 0x71, 0x3e, 0x62, 0x87, 0x82, 0xe0, 0x64, + 0xd8, 0xe4, 0x5d, 0xca, 0x74, 0x6e, 0x99, 0x56, 0xfa, 0x2a, 0x7c, 0x26, 0x9b, 0x59, 0xd6, 0x56, + 0x21, 0x69, 0x2f, 0xc0, 0xd9, 0xa1, 0x01, 0x40, 0x6a, 0x50, 0xe8, 0xd0, 0xbd, 0x9b, 0xdc, 0xd9, + 0xe5, 0x8e, 0x84, 0xf0, 0x9c, 0x6e, 0xf3, 0x02, 0x94, 0xe5, 0xda, 0x7f, 0x67, 0xa0, 0xb4, 0xda, + 0xb7, 0x0d, 0xe1, 0x1a, 0x3f, 0xde, 0x2f, 0xf4, 0xfd, 0x92, 0x6c, 0xaa, 0x5f, 0xd2, 0x87, 0x62, + 0xe7, 0x41, 0xe0, 0xb7, 0x54, 0x16, 0xd7, 0xc7, 0x1f, 0xca, 0xaa, 0x4a, 0xf3, 0xb7, 0x05, 0x9e, + 0x8c, 0x46, 0x9e, 0x52, 0x15, 0x2a, 0xde, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, + 0x84, 0xed, 0x48, 0xe1, 0x8f, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xf0, 0x75, 0x5c, 0xe9, 0xee, + 0x90, 0x8b, 0x90, 0x73, 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0xbb, 0x7b, 0xdc, 0xd8, 0x42, 0x5e, 0x46, + 0x5e, 0x81, 0x52, 0x53, 0xf5, 0x81, 0x72, 0x33, 0x8f, 0xda, 0x73, 0xc2, 0x00, 0xfb, 0x6f, 0x18, + 0xa0, 0x71, 0xbf, 0xb0, 0xeb, 0xb5, 0x1b, 0xe6, 0xdb, 0xd2, 0xea, 0x16, 0xa4, 0x5f, 0xb8, 0x2e, + 0x8b, 0xd0, 0xa7, 0x71, 0x8b, 0xde, 0xa1, 0x7b, 0xcb, 0xdc, 0x45, 0x12, 0xd3, 0x56, 0x59, 0xf4, + 0xdb, 0xaa, 0x0c, 0x03, 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, + 0x05, 0xea, 0xf3, 0xb5, 0xef, 0x66, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0x82, 0xb6, 0x42, 0x7b, 0x96, + 0xb3, 0xc7, 0xfd, 0x00, 0xa4, 0x6f, 0x91, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x0f, + 0x5f, 0x8d, 0x86, 0xcb, 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, + 0x09, 0x7d, 0xe1, 0xec, 0x01, 0xbe, 0x70, 0x03, 0xa0, 0x17, 0x7a, 0x13, 0x39, 0xc1, 0xf9, 0x73, + 0xbe, 0x9a, 0xa3, 0x38, 0x12, 0x11, 0x98, 0x49, 0xd6, 0xf7, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca, + 0x02, 0x57, 0x5f, 0x6d, 0x65, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x37, 0x03, 0x45, 0x4b, 0xdf, + 0xa6, 0x96, 0x27, 0x66, 0x53, 0x65, 0xf1, 0x8d, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, + 0x43, 0x62, 0xc0, 0xcb, 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, + 0xc3, 0x71, 0x99, 0x5a, 0xda, 0x83, 0x90, 0xfa, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, + 0x2c, 0x93, 0xda, 0x4c, 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, + 0xaa, 0xba, 0x8e, 0x6d, 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, + 0x31, 0xca, 0x5c, 0xd3, 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, + 0xe4, 0xfb, 0x8f, 0x34, 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, + 0xd5, 0xa0, 0xcc, 0xef, 0xc0, 0x2f, 0x41, 0x45, 0x85, 0xa2, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, + 0x23, 0x24, 0x61, 0x94, 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xeb, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, + 0x55, 0xf0, 0x50, 0x7d, 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0x8e, + 0xfb, 0x1d, 0x9f, 0x80, 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, + 0x46, 0x5d, 0x29, 0x9b, 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, + 0xd6, 0xe1, 0x9c, 0x21, 0x23, 0xd1, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x97, + 0xba, 0x3c, 0xcc, 0x82, 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, + 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, + 0x3b, 0x32, 0x68, 0x13, 0x49, 0x74, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, + 0xb3, 0xb2, 0xfc, 0xba, 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, + 0xb8, 0xb3, 0x8d, 0x91, 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x45, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, + 0x04, 0xac, 0x4c, 0x7b, 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, + 0xee, 0xed, 0x1a, 0xfc, 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0x49, 0x8e, 0x72, 0xfd, + 0x19, 0x7f, 0x97, 0xb8, 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, + 0x31, 0x91, 0xea, 0x29, 0x99, 0x16, 0xf2, 0x43, 0x06, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, + 0x8f, 0x47, 0x72, 0x31, 0x14, 0x41, 0xa5, 0x84, 0xd9, 0x7f, 0x27, 0x69, 0xf6, 0x5f, 0x9b, 0x64, + 0xfa, 0xa7, 0x68, 0x38, 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x21, 0x30, 0xb9, 0x15, 0x89, 0x58, + 0xfe, 0x20, 0xf9, 0x86, 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, + 0x6a, 0xc5, 0xe1, 0xe4, 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, + 0x1a, 0xff, 0x5f, 0xca, 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xdd, 0xa4, 0xd9, 0x7e, + 0x63, 0xf2, 0x7e, 0x1b, 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61, + 0x40, 0xc1, 0x08, 0x17, 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22, + 0xc6, 0x79, 0x47, 0x9a, 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x46, 0x58, 0xe2, 0x15, + 0xe3, 0xb9, 0xdf, 0x9b, 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e, + 0x8d, 0x3f, 0x94, 0xc9, 0x1b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3, + 0x0a, 0xf8, 0x22, 0x8e, 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd, + 0x1a, 0xbd, 0x30, 0x2c, 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb, + 0xa2, 0x4d, 0x95, 0xfb, 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab, + 0xa7, 0x8f, 0x68, 0xab, 0x6f, 0x88, 0xa8, 0x51, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x9c, 0x66, + 0x58, 0x4e, 0x32, 0xe0, 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a, + 0xb1, 0x54, 0xa6, 0xf0, 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0, + 0xe9, 0xb8, 0x93, 0xf2, 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x93, 0x85, 0x73, + 0x37, 0xa8, 0xca, 0xae, 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x93, 0x85, + 0xa9, 0x1b, 0xae, 0xd3, 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41, + 0xc6, 0x3f, 0x48, 0x20, 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8, + 0x1e, 0x95, 0x69, 0xb5, 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x13, 0xa6, 0x3c, + 0xe6, 0xb8, 0xbe, 0x91, 0x9e, 0x24, 0x24, 0xb6, 0x51, 0xff, 0x7a, 0x43, 0x42, 0xc9, 0x8d, 0xbc, + 0x7a, 0x41, 0x5f, 0x81, 0xf6, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42, + 0x5e, 0xef, 0x07, 0xe1, 0xa0, 0xd5, 0xf1, 0xe3, 0xc6, 0xd1, 0x54, 0xa7, 0x8a, 0xcf, 0xf4, 0xd9, + 0x0e, 0x0a, 0x74, 0xf2, 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0xb3, 0xa3, 0x56, 0x51, + 0xf4, 0xe9, 0xda, 0x8f, 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0xcb, 0xec, + 0x91, 0x5f, 0x1d, 0x3a, 0xf8, 0xf6, 0xb3, 0x87, 0x0b, 0x82, 0xc8, 0x73, 0x53, 0xeb, 0x94, 0xe9, + 0xa1, 0x6d, 0x0a, 0xcb, 0x22, 0xa7, 0xdd, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6, + 0xd8, 0xad, 0x91, 0xfe, 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x4d, + 0x28, 0x7a, 0x4c, 0x67, 0x7d, 0x3f, 0x12, 0xbb, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5, + 0x3b, 0x2a, 0xa5, 0xda, 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xf2, 0x50, + 0xb3, 0x1f, 0x32, 0xf6, 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0x69, 0x72, 0xbf, 0x24, 0xd2, 0xe4, 0x0c, + 0x0a, 0x26, 0xa3, 0x5d, 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a, + 0x65, 0xda, 0x7b, 0xd9, 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0xec, 0xf1, 0xed, 0xc9, 0xb2, + 0xc7, 0xf1, 0x0a, 0x0d, 0x27, 0x91, 0x7f, 0x7d, 0x38, 0x89, 0x7c, 0x77, 0xf2, 0x24, 0x72, 0xa2, + 0x19, 0x46, 0xe6, 0x92, 0xbf, 0x93, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c, + 0xd4, 0x56, 0x1e, 0x3c, 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2, + 0x5b, 0xd8, 0xe0, 0x85, 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59, + 0xba, 0xd4, 0xf3, 0x42, 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94, + 0x7b, 0x46, 0x95, 0x77, 0x18, 0x3f, 0x49, 0x96, 0x72, 0xe0, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50, + 0xba, 0x82, 0x03, 0x0d, 0x85, 0xf4, 0x03, 0x0d, 0x91, 0x05, 0x56, 0x1e, 0x68, 0xf8, 0xfb, 0x12, + 0x5c, 0x48, 0xef, 0x43, 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xf0, + 0x47, 0x16, 0xa3, 0x4f, 0xff, 0x54, 0x27, 0xe0, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9, + 0x24, 0x92, 0x70, 0xcf, 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8, + 0x76, 0x13, 0x7e, 0xf6, 0x09, 0x1e, 0xbd, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3, + 0x91, 0x35, 0x21, 0xbf, 0x01, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x9f, 0xbe, 0x1b, + 0x7f, 0xf4, 0x6f, 0x84, 0x58, 0x7e, 0xfa, 0x4b, 0x65, 0xd5, 0x42, 0x02, 0x46, 0x35, 0x3e, 0xe1, + 0x67, 0xed, 0xae, 0x40, 0xc9, 0xa3, 0x8c, 0x99, 0x76, 0xdb, 0x13, 0xbb, 0xb7, 0xb2, 0x9c, 0x2b, + 0x0d, 0x55, 0x86, 0x01, 0x95, 0xfc, 0x0c, 0x94, 0x45, 0xdc, 0x67, 0xc9, 0x6d, 0x7b, 0xd5, 0xb2, + 0xc8, 0x44, 0x09, 0xbb, 0xda, 0xf0, 0x0b, 0x31, 0xa4, 0x93, 0x17, 0x60, 0x5a, 0x66, 0xe3, 0xd4, + 0x99, 0x5b, 0xb9, 0xc7, 0x3a, 0xb3, 0x3f, 0xa8, 0x4d, 0xd7, 0x23, 0xe5, 0x18, 0xe3, 0xe2, 0xfb, + 0x29, 0x1a, 0x04, 0xc7, 0x92, 0xfb, 0xa9, 0x30, 0x6c, 0x86, 0x11, 0x2e, 0xf2, 0x2c, 0xe4, 0x98, + 0xe5, 0x89, 0x3d, 0x54, 0x29, 0xf4, 0x7b, 0x37, 0xd7, 0x1a, 0xc8, 0xcb, 0xb5, 0xff, 0xc9, 0xc0, + 0xe9, 0xc4, 0xd1, 0x22, 0x2e, 0xd2, 0x77, 0x2d, 0x65, 0x46, 0x02, 0x91, 0x2d, 0x5c, 0x43, 0x5e, + 0x4e, 0xde, 0x50, 0x5e, 0x61, 0x76, 0xc2, 0xeb, 0x05, 0x77, 0x74, 0xe6, 0x71, 0x37, 0x70, 0xc8, + 0x21, 0xbc, 0x96, 0x68, 0x9c, 0x5c, 0x3c, 0xd6, 0x76, 0x70, 0x03, 0x45, 0x36, 0x9c, 0xf9, 0xc3, + 0x6c, 0x38, 0xb5, 0xbf, 0xcd, 0x41, 0xe5, 0x96, 0xb3, 0xfd, 0x29, 0x39, 0x3c, 0x91, 0x6e, 0x91, + 0xb3, 0x3f, 0x45, 0x8b, 0xbc, 0x05, 0xcf, 0x30, 0xc6, 0x77, 0xfd, 0x8e, 0xdd, 0xf4, 0x96, 0x5a, + 0x8c, 0xba, 0xab, 0xa6, 0x6d, 0x7a, 0x3b, 0xb4, 0xa9, 0x22, 0x77, 0x9f, 0xd9, 0x1f, 0xd4, 0x9e, + 0xd9, 0xdc, 0x5c, 0x4b, 0x63, 0xc1, 0x51, 0xb2, 0x62, 0x86, 0xe8, 0x46, 0xc7, 0x69, 0xb5, 0x64, + 0x66, 0x5b, 0xe6, 0x78, 0xe4, 0x0c, 0x89, 0x94, 0x63, 0x8c, 0x4b, 0xfb, 0x28, 0x03, 0xe5, 0xdb, + 0x7a, 0xab, 0xa3, 0x37, 0x4c, 0xbb, 0x43, 0x9e, 0x83, 0xa9, 0x6d, 0xd7, 0xe9, 0x50, 0xd7, 0x53, + 0x99, 0x66, 0xb1, 0xeb, 0xa9, 0xcb, 0x22, 0xf4, 0x69, 0x7c, 0x1b, 0xc6, 0x9c, 0x9e, 0x69, 0x24, + 0x37, 0xac, 0x9b, 0xbc, 0x10, 0x25, 0x8d, 0xdc, 0x97, 0xf3, 0x28, 0x37, 0xe1, 0xd9, 0xec, 0xcd, + 0xb5, 0x86, 0xcc, 0xde, 0xfa, 0x33, 0x90, 0x3c, 0x1f, 0xf3, 0x3c, 0xca, 0xa3, 0x7c, 0x05, 0xed, + 0xfb, 0x59, 0xa8, 0xc8, 0x4f, 0x93, 0x9b, 0xb3, 0xe3, 0xfc, 0xb8, 0x17, 0x45, 0x74, 0xdd, 0xeb, + 0x77, 0xa9, 0x2b, 0x36, 0xc1, 0x6a, 0xca, 0x45, 0xa3, 0x25, 0x21, 0x31, 0x88, 0xb0, 0x87, 0x45, + 0x7e, 0xeb, 0xe4, 0x4f, 0xb0, 0x75, 0x0a, 0x07, 0xb6, 0xce, 0x9f, 0x65, 0xa0, 0xbc, 0x66, 0xb6, + 0xa8, 0xb1, 0x67, 0x58, 0x94, 0xbc, 0x02, 0xd5, 0x26, 0xb5, 0x28, 0xa3, 0x37, 0x5c, 0xdd, 0xa0, + 0x1b, 0xd4, 0x35, 0xc5, 0x4d, 0x1c, 0x3e, 0xca, 0xc4, 0x3c, 0x2e, 0xc8, 0xe5, 0x72, 0x65, 0x04, + 0x0f, 0x8e, 0x94, 0x26, 0x37, 0x61, 0xba, 0x49, 0x3d, 0xd3, 0xa5, 0xcd, 0x8d, 0x88, 0x37, 0xfa, + 0x9c, 0x6f, 0x9b, 0x56, 0x22, 0xb4, 0x47, 0x83, 0xda, 0xcc, 0x86, 0xd9, 0xa3, 0x96, 0x69, 0x53, + 0xe9, 0x96, 0xc6, 0x44, 0xb5, 0x02, 0xe4, 0xd6, 0x9c, 0xb6, 0xf6, 0x5e, 0x0e, 0x82, 0xbb, 0x55, + 0xe4, 0x37, 0x33, 0x50, 0xd1, 0x6d, 0xdb, 0x61, 0xea, 0xde, 0x92, 0x8c, 0xed, 0xe3, 0xc4, 0x57, + 0xb8, 0xe6, 0x97, 0x42, 0x50, 0x19, 0x16, 0x0e, 0x42, 0xd5, 0x11, 0x0a, 0x46, 0x75, 0x93, 0x7e, + 0x22, 0x52, 0xbd, 0x3e, 0x79, 0x2d, 0x0e, 0x11, 0x97, 0x9e, 0xfd, 0x1a, 0x9c, 0x49, 0x56, 0xf6, + 0x28, 0x81, 0xad, 0x49, 0x62, 0x62, 0xef, 0x94, 0xa1, 0x72, 0x47, 0x67, 0xe6, 0x2e, 0x15, 0x5b, + 0xb0, 0x93, 0xf1, 0xa9, 0xff, 0x20, 0x03, 0x17, 0xe2, 0x31, 0xe3, 0x13, 0x74, 0xac, 0x67, 0xf7, + 0x07, 0xb5, 0x0b, 0x98, 0xaa, 0x0d, 0x47, 0xd4, 0x42, 0xb8, 0xd8, 0x43, 0x21, 0xe8, 0x93, 0x76, + 0xb1, 0x1b, 0xa3, 0x14, 0xe2, 0xe8, 0xba, 0x7c, 0x5a, 0x5c, 0xec, 0x27, 0xfb, 0xae, 0x4b, 0x62, + 0x03, 0x30, 0xf5, 0xc4, 0x6c, 0x00, 0x4a, 0x4f, 0x84, 0xc3, 0xd5, 0x8b, 0x6c, 0x00, 0xca, 0x13, + 0xc6, 0x41, 0x55, 0x9a, 0x55, 0xa2, 0x8d, 0xda, 0x48, 0x88, 0xc3, 0x6f, 0xbe, 0x6f, 0x4c, 0x0c, + 0x28, 0x6c, 0xeb, 0x9e, 0x69, 0x28, 0xf7, 0xb3, 0x3e, 0x7e, 0x58, 0xc2, 0xbf, 0x14, 0x22, 0x63, + 0x4c, 0xe2, 0x15, 0x25, 0x76, 0x78, 0xf9, 0x24, 0x3b, 0xd1, 0xe5, 0x13, 0xb2, 0x0c, 0x79, 0x9b, + 0x1b, 0xdb, 0xdc, 0x91, 0xaf, 0x9b, 0xdc, 0xb9, 0x4d, 0xf7, 0x50, 0x08, 0x6b, 0x3f, 0xcc, 0x02, + 0xf0, 0xcf, 0x57, 0x6e, 0xce, 0x63, 0x36, 0x23, 0x9f, 0x87, 0x29, 0xaf, 0x2f, 0xa2, 0xb5, 0x6a, + 0x29, 0x0e, 0x83, 0xc7, 0xb2, 0x18, 0x7d, 0x3a, 0xf7, 0x84, 0xde, 0xea, 0xd3, 0xbe, 0x1f, 0x0b, + 0x0a, 0x3c, 0xa1, 0xaf, 0xf3, 0x42, 0x94, 0xb4, 0x93, 0x73, 0x64, 0xfc, 0x5d, 0x53, 0xe1, 0x84, + 0x76, 0x4d, 0xda, 0xb7, 0xb2, 0x00, 0x61, 0x80, 0x9f, 0xbc, 0x9f, 0x81, 0xf3, 0xc1, 0x2c, 0x63, + 0xf2, 0x4a, 0xc3, 0xb2, 0xa5, 0x9b, 0xdd, 0x89, 0x37, 0x32, 0x69, 0x33, 0x5c, 0x98, 0x9d, 0x8d, + 0x34, 0x75, 0x98, 0x5e, 0x0b, 0x82, 0x50, 0xa2, 0xdd, 0x1e, 0xdb, 0x5b, 0x31, 0x5d, 0x35, 0xec, + 0x52, 0xef, 0x04, 0x5c, 0x57, 0x3c, 0x52, 0x54, 0x5d, 0xfd, 0x10, 0x33, 0xc7, 0xa7, 0x60, 0x80, + 0xa3, 0x7d, 0x2f, 0x0b, 0xe7, 0x52, 0x6a, 0x47, 0x5e, 0x82, 0x33, 0x2a, 0xc3, 0x11, 0xde, 0xeb, + 0xcd, 0x84, 0xf7, 0x7a, 0x1b, 0x09, 0x1a, 0x0e, 0x71, 0x93, 0x37, 0x00, 0x74, 0xc3, 0xa0, 0x9e, + 0xb7, 0xee, 0x34, 0x7d, 0xa7, 0xef, 0x45, 0xbe, 0xa9, 0x5c, 0x0a, 0x4a, 0x1f, 0x0d, 0x6a, 0x5f, + 0x4c, 0x4b, 0x55, 0x25, 0xbe, 0x3e, 0x14, 0xc0, 0x08, 0x24, 0x79, 0x1d, 0x40, 0x5e, 0x34, 0x09, + 0x0e, 0x5b, 0x3e, 0x26, 0x92, 0x3e, 0xef, 0x5f, 0x82, 0x98, 0xff, 0x7a, 0x5f, 0xb7, 0x99, 0xc9, + 0xf6, 0xe4, 0xb9, 0xea, 0x7b, 0x01, 0x0a, 0x46, 0x10, 0xb5, 0xbf, 0xce, 0x42, 0xc9, 0x77, 0x46, + 0x3f, 0x81, 0x5c, 0x49, 0x3b, 0x96, 0x2b, 0x19, 0xff, 0x66, 0xa1, 0x5f, 0xe5, 0x91, 0xd9, 0x11, + 0x27, 0x91, 0x1d, 0xb9, 0x31, 0xb9, 0xaa, 0x83, 0xf3, 0x21, 0x3f, 0xc8, 0xc2, 0x29, 0x9f, 0x55, + 0x9d, 0xe3, 0xfe, 0x32, 0xcc, 0xb8, 0x54, 0x6f, 0xd6, 0x75, 0x66, 0xec, 0x88, 0xee, 0x93, 0xa7, + 0xb8, 0xcf, 0xee, 0x0f, 0x6a, 0x33, 0x18, 0x25, 0x60, 0x9c, 0x2f, 0xed, 0x00, 0x78, 0x76, 0xc2, + 0x03, 0xe0, 0xb9, 0xa3, 0x1c, 0x00, 0x27, 0x3a, 0x54, 0x78, 0x8d, 0x36, 0xcd, 0x2e, 0x75, 0xfa, + 0xfe, 0xaf, 0x0c, 0x8e, 0x7a, 0x78, 0x58, 0xac, 0xee, 0x18, 0xc2, 0x60, 0x14, 0x53, 0xfb, 0x87, + 0x0c, 0x4c, 0x87, 0xed, 0x75, 0xe2, 0x19, 0xa3, 0x56, 0x3c, 0x63, 0xb4, 0x34, 0xf1, 0x70, 0x18, + 0x91, 0x23, 0xfa, 0xbd, 0x62, 0xf8, 0x59, 0x22, 0x2b, 0xb4, 0x0d, 0xb3, 0x66, 0x6a, 0xa2, 0x24, + 0x62, 0x6d, 0x82, 0x43, 0x70, 0x37, 0x47, 0x72, 0xe2, 0x01, 0x28, 0xa4, 0x0f, 0xa5, 0x5d, 0xea, + 0x32, 0xd3, 0xa0, 0xfe, 0xf7, 0xdd, 0x98, 0xd8, 0x3b, 0x92, 0x07, 0x00, 0xc2, 0x36, 0xbd, 0xa7, + 0x14, 0x60, 0xa0, 0x8a, 0x6c, 0x43, 0x81, 0x36, 0xdb, 0xd4, 0x3f, 0x3f, 0xff, 0xd5, 0x89, 0xae, + 0x64, 0x84, 0xed, 0xc9, 0xdf, 0x3c, 0x94, 0xd0, 0xc4, 0x83, 0xb2, 0xe5, 0x6f, 0xdf, 0xd5, 0x38, + 0x1c, 0xdf, 0xd7, 0x09, 0x02, 0x01, 0xe1, 0x21, 0xd4, 0xa0, 0x08, 0x43, 0x3d, 0xa4, 0x13, 0x5c, + 0x36, 0x29, 0x1c, 0x93, 0xf1, 0x38, 0xe0, 0xc2, 0x89, 0x07, 0xe5, 0x07, 0x3a, 0xa3, 0x6e, 0x57, + 0x77, 0x3b, 0xca, 0xf1, 0x1f, 0xff, 0x0b, 0xef, 0xfb, 0x48, 0xe1, 0x17, 0x06, 0x45, 0x18, 0xea, + 0x21, 0x0e, 0x94, 0x99, 0xf2, 0x64, 0xfd, 0xfb, 0x8a, 0xe3, 0x2b, 0xf5, 0x7d, 0x62, 0x4f, 0x06, + 0xb6, 0x83, 0x57, 0x0c, 0x75, 0x68, 0x8f, 0x72, 0xa1, 0x79, 0xfc, 0xa4, 0x53, 0x84, 0x2f, 0xc4, + 0x53, 0x84, 0x73, 0xc9, 0x14, 0x61, 0x22, 0x1a, 0x73, 0xf4, 0x24, 0xa1, 0x0e, 0x15, 0x4b, 0xf7, + 0xd8, 0x56, 0xaf, 0xa9, 0x33, 0x15, 0x5f, 0xae, 0x2c, 0xfe, 0xff, 0xc3, 0x59, 0x2f, 0x6e, 0x0f, + 0xc3, 0xa0, 0xcb, 0x5a, 0x08, 0x83, 0x51, 0x4c, 0x72, 0x15, 0x2a, 0xbb, 0x62, 0x46, 0xca, 0xdb, + 0x14, 0x05, 0x61, 0xce, 0x85, 0x85, 0xbd, 0x17, 0x16, 0x63, 0x94, 0x87, 0x8b, 0x48, 0x4f, 0x40, + 0x8a, 0x14, 0x43, 0x91, 0x46, 0x58, 0x8c, 0x51, 0x1e, 0x91, 0xab, 0x30, 0xed, 0x8e, 0x14, 0x98, + 0x12, 0x02, 0x32, 0x57, 0xe1, 0x17, 0x62, 0x48, 0x27, 0x57, 0xa0, 0xd4, 0x6f, 0xb6, 0x24, 0x6f, + 0x49, 0xf0, 0x0a, 0xff, 0x6b, 0x6b, 0x65, 0x55, 0xdd, 0xee, 0xf0, 0xa9, 0xda, 0x7f, 0x66, 0x80, + 0x0c, 0x27, 0xb5, 0xc9, 0x0e, 0x14, 0x6d, 0x11, 0x55, 0x99, 0xf8, 0xbe, 0x75, 0x24, 0x38, 0x23, + 0xe7, 0x98, 0x2a, 0x50, 0xf8, 0xc4, 0x86, 0x12, 0x7d, 0xc8, 0xa8, 0x6b, 0xeb, 0x96, 0x72, 0x3d, + 0x8e, 0xe7, 0x6e, 0xb7, 0x74, 0x38, 0x15, 0x32, 0x06, 0x3a, 0xb4, 0x1f, 0x67, 0xa1, 0x12, 0xe1, + 0x7b, 0xdc, 0x66, 0x45, 0x9c, 0x19, 0x95, 0xc1, 0x8c, 0x2d, 0xd7, 0x52, 0xc3, 0x34, 0x72, 0x66, + 0x54, 0x91, 0x70, 0x0d, 0xa3, 0x7c, 0x64, 0x11, 0xa0, 0xab, 0x7b, 0x8c, 0xba, 0x62, 0x29, 0x49, + 0x9c, 0xd4, 0x5c, 0x0f, 0x28, 0x18, 0xe1, 0x22, 0x97, 0xd5, 0xcd, 0xff, 0x7c, 0xfc, 0xd2, 0xd4, + 0x88, 0x6b, 0xfd, 0x85, 0x63, 0xb8, 0xd6, 0x4f, 0xda, 0x70, 0xc6, 0xaf, 0xb5, 0x4f, 0x55, 0x76, + 0xee, 0x90, 0xc0, 0xd2, 0x19, 0x4f, 0x40, 0xe0, 0x10, 0xa8, 0xf6, 0xc3, 0x0c, 0xcc, 0xc4, 0xb6, + 0xd2, 0x7c, 0x6b, 0x17, 0x1e, 0xc9, 0x88, 0x6c, 0xed, 0x62, 0x27, 0x29, 0x9e, 0x87, 0xa2, 0x6c, + 0x20, 0xd5, 0xf0, 0x81, 0x19, 0x91, 0x4d, 0x88, 0x8a, 0xca, 0x0d, 0x82, 0x0a, 0xd6, 0x25, 0x0d, + 0x82, 0x8a, 0xe6, 0xa1, 0x4f, 0x27, 0x5f, 0x80, 0x92, 0x5f, 0x3b, 0xd5, 0xd2, 0xe1, 0x4f, 0x1f, + 0x54, 0x39, 0x06, 0x1c, 0xda, 0xb7, 0x0b, 0x20, 0xff, 0x58, 0xc1, 0xe5, 0x9a, 0xa6, 0x27, 0xb3, + 0x54, 0x19, 0x91, 0xa5, 0x0a, 0xe4, 0x56, 0x54, 0x39, 0x06, 0x1c, 0xe4, 0x22, 0xe4, 0xba, 0xa6, + 0xad, 0xc2, 0x8a, 0x62, 0x57, 0xb9, 0x6e, 0xda, 0xc8, 0xcb, 0x04, 0x49, 0x7f, 0xa8, 0x12, 0x2d, + 0x92, 0xa4, 0x3f, 0x44, 0x5e, 0xc6, 0x9d, 0x4b, 0xcb, 0x71, 0x3a, 0xdb, 0xba, 0xd1, 0xf1, 0x43, + 0xdf, 0x79, 0x31, 0x7b, 0x85, 0x73, 0xb9, 0x16, 0x27, 0x61, 0x92, 0x97, 0x8b, 0x1b, 0x8e, 0x63, + 0x35, 0x9d, 0x07, 0xb6, 0x2f, 0x5e, 0x08, 0xc5, 0x97, 0xe3, 0x24, 0x4c, 0xf2, 0x92, 0x2d, 0x78, + 0xe6, 0x6d, 0xea, 0x3a, 0xaa, 0xc5, 0x1a, 0x16, 0xa5, 0x3d, 0x1f, 0x46, 0x1a, 0x28, 0x91, 0x15, + 0x7a, 0x35, 0x9d, 0x05, 0x47, 0xc9, 0x8a, 0x64, 0x93, 0xee, 0xb6, 0x29, 0xdb, 0x70, 0x1d, 0xbe, + 0x77, 0x32, 0xed, 0xb6, 0x0f, 0x3b, 0x15, 0xc2, 0x6e, 0xa6, 0xb3, 0xe0, 0x28, 0x59, 0xb2, 0x0e, + 0x67, 0x25, 0x29, 0xe2, 0x33, 0x2b, 0x5b, 0x57, 0xdb, 0x1f, 0xd4, 0x3e, 0xb3, 0x42, 0x7b, 0x2e, + 0x35, 0xb8, 0x81, 0xde, 0x4c, 0xb2, 0xe1, 0xb0, 0xa4, 0xf8, 0x8f, 0x94, 0x0a, 0xf7, 0x6e, 0x50, + 0x57, 0x74, 0xb9, 0x88, 0x1d, 0x29, 0xc7, 0x1c, 0x13, 0x34, 0x1c, 0xe2, 0x26, 0xaf, 0x40, 0x35, + 0x0a, 0xbb, 0xb4, 0xab, 0x9b, 0x96, 0xbe, 0x6d, 0x5a, 0x26, 0xdb, 0x13, 0xb9, 0xe2, 0x19, 0x19, + 0x8c, 0xdc, 0x1c, 0xc1, 0x83, 0x23, 0xa5, 0xb5, 0xdf, 0xcf, 0x81, 0xf8, 0xe5, 0x10, 0xb9, 0x0f, + 0x39, 0xcb, 0x69, 0x2b, 0x93, 0x3c, 0x7e, 0xa4, 0x63, 0xcd, 0x69, 0xcb, 0x81, 0xb7, 0xe6, 0xb4, + 0x91, 0x23, 0x12, 0x03, 0x0a, 0x1d, 0xbd, 0xd5, 0xd1, 0x95, 0x05, 0x1e, 0xdf, 0xdf, 0x08, 0x12, + 0x79, 0xea, 0x86, 0x28, 0x7f, 0x45, 0x89, 0xcd, 0x1d, 0x9b, 0x6d, 0xff, 0x1f, 0x22, 0x6a, 0xeb, + 0x37, 0x41, 0x6c, 0xcc, 0x47, 0x92, 0xab, 0x60, 0xf0, 0x8a, 0xa1, 0x0e, 0x62, 0x40, 0xb1, 0xdf, + 0x14, 0xbf, 0x7e, 0xca, 0x4f, 0xe8, 0xc5, 0x6c, 0xad, 0x88, 0x6f, 0x12, 0xeb, 0x97, 0x7c, 0x46, + 0x05, 0xad, 0xfd, 0x79, 0x06, 0x66, 0x1a, 0x96, 0xd9, 0x34, 0xed, 0xf6, 0xc9, 0xdd, 0xc9, 0x25, + 0x77, 0xa1, 0xe0, 0x59, 0x66, 0x93, 0x8e, 0x79, 0x59, 0x54, 0x74, 0x06, 0xaf, 0x25, 0x45, 0x89, + 0xa3, 0xfd, 0x49, 0x1e, 0xd4, 0x7f, 0xb2, 0x48, 0x1f, 0xca, 0x6d, 0xff, 0xe6, 0xaa, 0xaa, 0xf2, + 0xcb, 0x13, 0xdc, 0x70, 0x88, 0xdd, 0x81, 0x95, 0xbd, 0x13, 0x14, 0x62, 0xa8, 0x89, 0xd0, 0xf8, + 0x98, 0x5b, 0x99, 0x70, 0xcc, 0x49, 0x75, 0xc3, 0xa3, 0x4e, 0x87, 0xfc, 0x0e, 0x63, 0xbd, 0x89, + 0x0f, 0xe2, 0x86, 0x67, 0x6c, 0x65, 0x18, 0x8f, 0xbf, 0xa3, 0x80, 0xe6, 0x2a, 0x6c, 0xfd, 0x18, + 0xae, 0xbf, 0x87, 0x21, 0x54, 0x15, 0x61, 0xd5, 0x99, 0x87, 0x02, 0x9a, 0xfc, 0x1a, 0x54, 0x98, + 0xab, 0xdb, 0x5e, 0xcb, 0x71, 0xbb, 0xd4, 0x55, 0x8b, 0xff, 0xea, 0x04, 0xe3, 0x79, 0x33, 0x44, + 0x93, 0x51, 0x8f, 0x58, 0x11, 0x46, 0xb5, 0x69, 0x5d, 0x50, 0x6e, 0x3b, 0x31, 0x62, 0xbf, 0x19, + 0x90, 0x99, 0xce, 0x85, 0xc3, 0x8d, 0xc5, 0xe0, 0x2e, 0x79, 0xe4, 0x6e, 0x5d, 0xea, 0xff, 0x04, + 0xb4, 0x7f, 0xca, 0x42, 0x6e, 0x73, 0xad, 0x21, 0xaf, 0x8a, 0x88, 0xbf, 0x6e, 0xd0, 0x46, 0xc7, + 0xec, 0xdd, 0xa3, 0xae, 0xd9, 0xda, 0x53, 0x6b, 0x6f, 0xe4, 0xaa, 0x48, 0x92, 0x03, 0x53, 0xa4, + 0xc8, 0x6b, 0x30, 0x6d, 0xe8, 0xcb, 0xd4, 0x65, 0xd2, 0x85, 0x39, 0x5a, 0xd4, 0x5c, 0x9c, 0x60, + 0x58, 0x5e, 0x0a, 0xc5, 0x31, 0x06, 0x46, 0xb6, 0x00, 0x8c, 0x10, 0xfa, 0x48, 0x91, 0x74, 0xf9, + 0x5f, 0x85, 0x10, 0x38, 0x02, 0x44, 0x10, 0xca, 0x1d, 0xce, 0x2a, 0x50, 0xf3, 0x47, 0x41, 0x15, + 0x93, 0xee, 0xb6, 0x2f, 0x8b, 0x21, 0x8c, 0xf6, 0xef, 0x19, 0x08, 0x37, 0x81, 0xc4, 0x83, 0x62, + 0x53, 0xdc, 0xda, 0x56, 0xd3, 0x7e, 0xfc, 0xcd, 0x74, 0xfc, 0x6f, 0x26, 0x75, 0xb2, 0x3f, 0xa8, + 0x25, 0xfe, 0x70, 0x82, 0x4a, 0x15, 0x69, 0x43, 0xee, 0x4d, 0x67, 0x7b, 0xe2, 0x59, 0x1f, 0x39, + 0xff, 0x23, 0x77, 0x4e, 0x91, 0x02, 0xe4, 0x1a, 0xb4, 0x6f, 0x67, 0xa1, 0x12, 0x19, 0xd3, 0x13, + 0xff, 0x94, 0xe0, 0x61, 0xe2, 0xa7, 0x04, 0x1b, 0xe3, 0xef, 0xca, 0xc3, 0x5a, 0x9d, 0xf4, 0x7f, + 0x09, 0xfe, 0x26, 0x0b, 0xb9, 0xad, 0x95, 0x55, 0xbe, 0xf8, 0x06, 0xe7, 0x80, 0x26, 0x4e, 0x4c, + 0x85, 0x3f, 0x4c, 0x13, 0x23, 0x2d, 0x78, 0xc5, 0x50, 0x07, 0xd9, 0x81, 0xa9, 0xed, 0xbe, 0x69, + 0x31, 0xd3, 0x9e, 0xf8, 0xd4, 0x99, 0xff, 0x0f, 0x07, 0x75, 0x5c, 0x46, 0xa2, 0xa2, 0x0f, 0x4f, + 0xda, 0x30, 0xd5, 0x96, 0xd7, 0x40, 0xd4, 0xdc, 0x7b, 0x69, 0xfc, 0xd5, 0x4b, 0xe2, 0x48, 0x45, + 0xea, 0x05, 0x7d, 0x74, 0xed, 0x9b, 0xa0, 0x16, 0x7f, 0xe2, 0x9d, 0x4c, 0x6b, 0x06, 0x81, 0xa1, + 0xb4, 0x16, 0xd5, 0xfe, 0x23, 0x03, 0x71, 0x2b, 0xfd, 0xc9, 0x77, 0x6a, 0x27, 0xd9, 0xa9, 0x2b, + 0xc7, 0x31, 0x07, 0xd2, 0xfb, 0x55, 0xfb, 0xab, 0x2c, 0x14, 0xd5, 0x9f, 0x44, 0x4f, 0x3e, 0xfb, + 0x41, 0x63, 0xd9, 0x8f, 0xe5, 0x09, 0xff, 0xab, 0x38, 0x32, 0xf7, 0xd1, 0x4d, 0xe4, 0x3e, 0x26, + 0xfd, 0x81, 0xe3, 0x63, 0x32, 0x1f, 0x7f, 0x97, 0x81, 0x53, 0x92, 0xf1, 0xa6, 0xed, 0x31, 0xdd, + 0x36, 0x84, 0x53, 0x2c, 0x23, 0x51, 0x13, 0x87, 0xf6, 0x54, 0x18, 0x5a, 0xb8, 0xab, 0xf2, 0x19, + 0x15, 0x34, 0xdf, 0x2c, 0xef, 0x38, 0x1e, 0x13, 0xe6, 0x36, 0x1b, 0xdf, 0x64, 0xbf, 0xac, 0xca, + 0x31, 0xe0, 0x48, 0xee, 0xde, 0x0b, 0xa3, 0x77, 0xef, 0xda, 0x9f, 0x66, 0x60, 0x3a, 0xfa, 0xeb, + 0xca, 0xf1, 0x13, 0x39, 0x89, 0x3c, 0x4a, 0xf6, 0x04, 0xf2, 0x28, 0x1f, 0x66, 0x00, 0xfc, 0xca, + 0x9e, 0x78, 0x16, 0xa5, 0x19, 0xcf, 0xa2, 0x4c, 0xdc, 0xad, 0xe9, 0x39, 0x94, 0x1f, 0x14, 0xfc, + 0x4f, 0x12, 0x19, 0x94, 0x77, 0x33, 0x70, 0x4a, 0x8f, 0x65, 0x25, 0x26, 0xf6, 0x24, 0x12, 0x49, + 0x8e, 0xe0, 0x57, 0x9f, 0xf1, 0x72, 0x4c, 0xa8, 0x25, 0xd7, 0x60, 0xba, 0xa7, 0x42, 0xc5, 0x77, + 0xc2, 0x51, 0x17, 0x1c, 0x40, 0xde, 0x88, 0xd0, 0x30, 0xc6, 0xf9, 0x98, 0x2c, 0x50, 0xee, 0x58, + 0xb2, 0x40, 0xd1, 0xa3, 0x66, 0xf9, 0x03, 0x8f, 0x9a, 0xd9, 0x50, 0x6e, 0xb9, 0x4e, 0x57, 0x24, + 0x5a, 0xd4, 0x8f, 0x15, 0x27, 0x4c, 0xde, 0x04, 0x8b, 0xca, 0xaa, 0x8f, 0x8b, 0xa1, 0x0a, 0xbe, + 0x4c, 0x33, 0x47, 0x6a, 0x2b, 0x1e, 0x87, 0xb6, 0x60, 0xea, 0x6e, 0x4a, 0x54, 0xf4, 0xe1, 0xe3, + 0xc9, 0x94, 0xa9, 0x4f, 0x26, 0x99, 0xa2, 0xfd, 0x63, 0xd6, 0xb7, 0x17, 0x8d, 0xc4, 0x9d, 0xa4, + 0xcc, 0x88, 0x3b, 0x49, 0xea, 0x76, 0x6d, 0x34, 0xdd, 0xf0, 0x3c, 0x14, 0x5d, 0xaa, 0x7b, 0x8e, + 0xad, 0xee, 0xa9, 0x07, 0xd6, 0x16, 0x45, 0x29, 0x2a, 0x6a, 0x34, 0x2d, 0x91, 0x7d, 0x4c, 0x5a, + 0xe2, 0x0b, 0x91, 0x01, 0x21, 0xf3, 0xbf, 0xc1, 0xdc, 0x4e, 0x19, 0x14, 0x22, 0x66, 0xa9, 0xfe, + 0xd7, 0x5f, 0x48, 0xc6, 0x2c, 0xd5, 0xbf, 0xf4, 0x03, 0x0e, 0xd2, 0x84, 0x69, 0x4b, 0xf7, 0x98, + 0x88, 0x4a, 0x35, 0x97, 0xd8, 0x18, 0x39, 0x8f, 0x60, 0xda, 0xac, 0x45, 0x70, 0x30, 0x86, 0xaa, + 0xfd, 0x6e, 0x06, 0xc2, 0x26, 0x3f, 0x62, 0x74, 0xf4, 0x15, 0x28, 0x75, 0xf5, 0x87, 0x2b, 0xd4, + 0xd2, 0xf7, 0x26, 0xf9, 0xfb, 0xd5, 0xba, 0xc2, 0xc0, 0x00, 0x4d, 0x1b, 0x64, 0x40, 0xdd, 0xd8, + 0x25, 0x14, 0x0a, 0x2d, 0xf3, 0xa1, 0xaa, 0xcf, 0x24, 0x9e, 0x4a, 0xe4, 0x7f, 0x6b, 0x32, 0xbe, + 0x20, 0x0a, 0x50, 0xa2, 0x93, 0x2e, 0x4c, 0x79, 0x32, 0xfc, 0xa3, 0x3e, 0x65, 0xfc, 0x5d, 0x79, + 0x2c, 0x8c, 0xa4, 0xae, 0xfb, 0xca, 0x22, 0xf4, 0x75, 0xd4, 0xe7, 0x3f, 0xf8, 0x78, 0xee, 0xa9, + 0x0f, 0x3f, 0x9e, 0x7b, 0xea, 0xa3, 0x8f, 0xe7, 0x9e, 0xfa, 0xd6, 0xfe, 0x5c, 0xe6, 0x83, 0xfd, + 0xb9, 0xcc, 0x87, 0xfb, 0x73, 0x99, 0x8f, 0xf6, 0xe7, 0x32, 0xff, 0xba, 0x3f, 0x97, 0xf9, 0x9d, + 0x7f, 0x9b, 0x7b, 0xea, 0xd5, 0x92, 0x8f, 0xf9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x1a, + 0xd1, 0x0d, 0x1f, 0x64, 0x00, 0x00, } func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) { @@ -11579,7 +11580,7 @@ func (m *Edge) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) + s := BufferFullWritingStrategy(dAtA[iNdEx:postIndex]) m.OnFull = &s iNdEx = postIndex default: diff --git a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go index 002170ce97..6616007872 100644 --- a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go @@ -410,7 +410,7 @@ func (in *Edge) DeepCopyInto(out *Edge) { } if in.OnFull != nil { in, out := &in.OnFull, &out.OnFull - *out = new(string) + *out = new(BufferFullWritingStrategy) **out = **in } return diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go index 8cf629445d..582574a0a5 100644 --- a/pkg/forward/forward.go +++ b/pkg/forward/forward.go @@ -21,6 +21,7 @@ package forward import ( "context" + "errors" "fmt" "math" "sync" @@ -490,7 +491,7 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is for idx, msg := range messages { if err := errs[idx]; err != nil { // ATM there are no user defined errors during write, all are InternalErrors. - if _, ok := err.(isb.NoRetryableBufferWriteErr); ok { + if ok := errors.As(err, &isb.NoRetryableBufferWriteErr{}); ok { // If toBuffer returns us a NoRetryableBufferWriteErr, we drop the message. dropBytes += float64(len(msg.Payload)) } else { diff --git a/pkg/forward/forward_test.go b/pkg/forward/forward_test.go index 2d980332ce..bc06e3b54b 100644 --- a/pkg/forward/forward_test.go +++ b/pkg/forward/forward_test.go @@ -622,8 +622,8 @@ func TestSourceInterStepDataForward(t *testing.T) { <-stopped } -// TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess explicitly tests the case of retrying failed messages -func TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess(t *testing.T) { +// TestWriteToBufferError_BufferFullWritingStrategyIsRetryUntilSuccess explicitly tests the case of retrying failed messages +func TestWriteToBufferError_BufferFullWritingStrategyIsRetryUntilSuccess(t *testing.T) { fromStep := simplebuffer.NewInMemoryBuffer("from", 25) to1 := simplebuffer.NewInMemoryBuffer("to1", 10) toSteps := map[string]isb.BufferWriter{ @@ -673,10 +673,10 @@ func TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess(t *testing. <-stopped } -// TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest explicitly tests the case of dropping messages when buffer is full -func TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest(t *testing.T) { +// TestWriteToBufferError_BufferFullWritingStrategyIsDiscardLatest explicitly tests the case of dropping messages when buffer is full +func TestWriteToBufferError_BufferFullWritingStrategyIsDiscardLatest(t *testing.T) { fromStep := simplebuffer.NewInMemoryBuffer("from", 25) - to1 := simplebuffer.NewInMemoryBuffer("to1", 10, simplebuffer.WithOnFullWritingStrategy(dfv1.DiscardLatest)) + to1 := simplebuffer.NewInMemoryBuffer("to1", 10, simplebuffer.WithBufferFullWritingStrategy(dfv1.DiscardLatest)) toSteps := map[string]isb.BufferWriter{ "to1": to1, } @@ -702,7 +702,7 @@ func TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest(t *testing.T) { messageToStep["to1"] = make([]isb.Message, 0) messageToStep["to1"] = append(messageToStep["to1"], writeMessages[0:11]...) _, err = f.writeToBuffers(ctx, messageToStep) - // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DiscardLatest, + // although we are writing 11 messages to a buffer of size 10, since we specify BufferFullWritingStrategy as DiscardLatest, // the writeToBuffers() call should return no error. assert.Nil(t, err) // stop will cancel the contexts and therefore the forwarder stops without waiting diff --git a/pkg/isb/stores/jetstream/options.go b/pkg/isb/stores/jetstream/options.go index 49ec9da565..a0c5f84447 100644 --- a/pkg/isb/stores/jetstream/options.go +++ b/pkg/isb/stores/jetstream/options.go @@ -32,17 +32,17 @@ type writeOptions struct { refreshInterval time.Duration // useWriteInfoAsRate indicates whether to check the write sequence for rate calculation useWriteInfoAsRate bool - // onFullWritingStrategy is the writing strategy when buffer is full - onFullWritingStrategy dfv1.OnFullWritingStrategy + // bufferFullWritingStrategy is the writing strategy when buffer is full + bufferFullWritingStrategy dfv1.BufferFullWritingStrategy } func defaultWriteOptions() *writeOptions { return &writeOptions{ - maxLength: dfv1.DefaultBufferLength, - bufferUsageLimit: dfv1.DefaultBufferUsageLimit, - refreshInterval: 1 * time.Second, - useWriteInfoAsRate: false, - onFullWritingStrategy: dfv1.RetryUntilSuccess, + maxLength: dfv1.DefaultBufferLength, + bufferUsageLimit: dfv1.DefaultBufferUsageLimit, + refreshInterval: 1 * time.Second, + useWriteInfoAsRate: false, + bufferFullWritingStrategy: dfv1.RetryUntilSuccess, } } @@ -80,10 +80,10 @@ func WithUsingWriteInfoAsRate(yes bool) WriteOption { } } -// WithOnFullWritingStrategy sets the writing strategy when buffer is full -func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) WriteOption { +// WithBufferFullWritingStrategy sets the writing strategy when buffer is full +func WithBufferFullWritingStrategy(s dfv1.BufferFullWritingStrategy) WriteOption { return func(o *writeOptions) error { - o.onFullWritingStrategy = s + o.bufferFullWritingStrategy = s return nil } } diff --git a/pkg/isb/stores/jetstream/writer.go b/pkg/isb/stores/jetstream/writer.go index d6565fce43..4406b60da2 100644 --- a/pkg/isb/stores/jetstream/writer.go +++ b/pkg/isb/stores/jetstream/writer.go @@ -199,7 +199,7 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([ jw.log.Debugw("Is full") isbFull.With(map[string]string{"buffer": jw.GetName()}).Inc() // when buffer is full, we need to decide whether to discard the message or not. - switch jw.opts.onFullWritingStrategy { + switch jw.opts.bufferFullWritingStrategy { case v1alpha1.DiscardLatest: // user explicitly wants to discard the message when buffer if full. // return no retryable error as a callback to let caller know that the message is discarded. diff --git a/pkg/isb/stores/jetstream/writer_test.go b/pkg/isb/stores/jetstream/writer_test.go index 607103928d..04c3a47708 100644 --- a/pkg/isb/stores/jetstream/writer_test.go +++ b/pkg/isb/stores/jetstream/writer_test.go @@ -230,7 +230,7 @@ func TestJetStreamBufferWriterBufferFull_DiscardLatest(t *testing.T) { addStream(t, js, streamName) defer deleteStream(js, streamName) - bw, err := NewJetStreamBufferWriter(ctx, defaultJetStreamClient, streamName, streamName, streamName, WithMaxLength(10), WithBufferUsageLimit(0.2), WithOnFullWritingStrategy(dfv1.DiscardLatest)) + bw, err := NewJetStreamBufferWriter(ctx, defaultJetStreamClient, streamName, streamName, streamName, WithMaxLength(10), WithBufferUsageLimit(0.2), WithBufferFullWritingStrategy(dfv1.DiscardLatest)) assert.NoError(t, err) jw, _ := bw.(*jetStreamWriter) timeout := time.After(10 * time.Second) diff --git a/pkg/isb/stores/redis/options.go b/pkg/isb/stores/redis/options.go index 37fc071931..ecc988eb2b 100644 --- a/pkg/isb/stores/redis/options.go +++ b/pkg/isb/stores/redis/options.go @@ -40,8 +40,8 @@ type options struct { bufferUsageLimit float64 // refreshBufferWriteInfo is used to determine if we refresh buffer write info refreshBufferWriteInfo bool - // onFullWritingStrategy is the writing strategy when buffer is full - onFullWritingStrategy dfv1.OnFullWritingStrategy + // bufferFullWritingStrategy is the writing strategy when buffer is full + bufferFullWritingStrategy dfv1.BufferFullWritingStrategy } // Option to apply different options @@ -145,14 +145,14 @@ func WithRefreshBufferWriteInfo(r bool) Option { return refreshBufferWriteInfo(r) } -// WithOnFullWritingStrategy option -type onFullWritingStrategy dfv1.OnFullWritingStrategy +// WithBufferFullWritingStrategy option +type bufferFullWritingStrategy dfv1.BufferFullWritingStrategy -func (s onFullWritingStrategy) apply(o *options) { - o.onFullWritingStrategy = dfv1.OnFullWritingStrategy(s) +func (s bufferFullWritingStrategy) apply(o *options) { + o.bufferFullWritingStrategy = dfv1.BufferFullWritingStrategy(s) } -// WithOnFullWritingStrategy sets the OnFullWritingStrategy -func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option { - return onFullWritingStrategy(s) +// WithBufferFullWritingStrategy sets the BufferFullWritingStrategy +func WithBufferFullWritingStrategy(s dfv1.BufferFullWritingStrategy) Option { + return bufferFullWritingStrategy(s) } diff --git a/pkg/isb/stores/redis/write.go b/pkg/isb/stores/redis/write.go index a8708ce703..297bd76aa5 100644 --- a/pkg/isb/stores/redis/write.go +++ b/pkg/isb/stores/redis/write.go @@ -67,13 +67,13 @@ var _ isb.BufferWriter = (*BufferWrite)(nil) // NewBufferWrite returns a new redis queue writer. func NewBufferWrite(ctx context.Context, client *redisclient.RedisClient, name string, group string, opts ...Option) isb.BufferWriter { options := &options{ - pipelining: true, - infoRefreshInterval: time.Second, - lagDuration: time.Duration(0), - maxLength: dfv1.DefaultBufferLength, - bufferUsageLimit: dfv1.DefaultBufferUsageLimit, - refreshBufferWriteInfo: true, - onFullWritingStrategy: dfv1.RetryUntilSuccess, + pipelining: true, + infoRefreshInterval: time.Second, + lagDuration: time.Duration(0), + maxLength: dfv1.DefaultBufferLength, + bufferUsageLimit: dfv1.DefaultBufferUsageLimit, + refreshBufferWriteInfo: true, + bufferFullWritingStrategy: dfv1.RetryUntilSuccess, } for _, o := range opts { @@ -161,7 +161,7 @@ func (bw *BufferWrite) Write(_ context.Context, messages []isb.Message) ([]isb.O isbIsFull.With(labels).Inc() // when buffer is full, we need to decide whether to discard the message or not. - switch bw.onFullWritingStrategy { + switch bw.bufferFullWritingStrategy { case dfv1.DiscardLatest: // user explicitly wants to discard the message when buffer if full. // return no retryable error as a callback to let caller know that the message is discarded. diff --git a/pkg/isb/stores/redis/write_test.go b/pkg/isb/stores/redis/write_test.go index 2b071c4623..9935dffabb 100644 --- a/pkg/isb/stores/redis/write_test.go +++ b/pkg/isb/stores/redis/write_test.go @@ -177,14 +177,14 @@ func TestRedisQWrite_WithInfoRefreshInterval(t *testing.T) { } } -func TestRedisQWrite_WithInfoRefreshInterval_DiscardMessageOnFull(t *testing.T) { +func TestRedisQWrite_WithInfoRefreshInterval_WithBufferFullWritingStrategyIsDiscardLatest(t *testing.T) { client := redisclient.NewRedisClient(redisOptions) ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() stream := "withInfoRefreshInterval" count := int64(10) group := "withInfoRefreshInterval-group" - rqw, _ := NewBufferWrite(ctx, client, stream, group, WithInfoRefreshInterval(2*time.Millisecond), WithLagDuration(2*time.Millisecond), WithMaxLength(10), WithOnFullWritingStrategy(dfv1.DiscardLatest)).(*BufferWrite) + rqw, _ := NewBufferWrite(ctx, client, stream, group, WithInfoRefreshInterval(2*time.Millisecond), WithLagDuration(2*time.Millisecond), WithMaxLength(10), WithBufferFullWritingStrategy(dfv1.DiscardLatest)).(*BufferWrite) err := client.CreateStreamGroup(ctx, rqw.GetStreamName(), group, redisclient.ReadFromEarliest) if err != nil { t.Fatalf("error creating consumer group: %s", err) diff --git a/pkg/isb/stores/simplebuffer/buffer.go b/pkg/isb/stores/simplebuffer/buffer.go index 66acf4226d..48913e88a8 100644 --- a/pkg/isb/stores/simplebuffer/buffer.go +++ b/pkg/isb/stores/simplebuffer/buffer.go @@ -59,8 +59,8 @@ type elem struct { func NewInMemoryBuffer(name string, size int64, opts ...Option) *InMemoryBuffer { bufferOptions := &options{ - readTimeOut: time.Second, // default read time out - onFullWritingStrategy: v1alpha1.RetryUntilSuccess, // default on full writing strategy + readTimeOut: time.Second, // default read time out + bufferFullWritingStrategy: v1alpha1.RetryUntilSuccess, // default buffer full writing strategy } for _, o := range opts { @@ -147,7 +147,7 @@ func (b *InMemoryBuffer) Write(_ context.Context, messages []isb.Message) ([]isb // access buffer via lock b.rwlock.Unlock() } else { - switch b.options.onFullWritingStrategy { + switch b.options.bufferFullWritingStrategy { case v1alpha1.DiscardLatest: errs[idx] = isb.NoRetryableBufferWriteErr{Name: b.name, Message: "Buffer full!"} default: diff --git a/pkg/isb/stores/simplebuffer/buffer_test.go b/pkg/isb/stores/simplebuffer/buffer_test.go index be851dad55..4b59126453 100644 --- a/pkg/isb/stores/simplebuffer/buffer_test.go +++ b/pkg/isb/stores/simplebuffer/buffer_test.go @@ -80,9 +80,9 @@ func TestNewSimpleBuffer(t *testing.T) { assert.Equal(t, true, sb.IsFull()) } -func TestNewSimpleBuffer_DiscardOnFull(t *testing.T) { +func TestNewSimpleBuffer_BufferFullWritingStrategyIsDiscard(t *testing.T) { count := int64(3) - sb := NewInMemoryBuffer("test", 2, WithOnFullWritingStrategy(v1alpha1.DiscardLatest)) + sb := NewInMemoryBuffer("test", 2, WithBufferFullWritingStrategy(v1alpha1.DiscardLatest)) ctx := context.Background() assert.NotEmpty(t, sb.String()) assert.Equal(t, sb.IsEmpty(), true) diff --git a/pkg/isb/stores/simplebuffer/options.go b/pkg/isb/stores/simplebuffer/options.go index 3df5cea89f..d88db5f397 100644 --- a/pkg/isb/stores/simplebuffer/options.go +++ b/pkg/isb/stores/simplebuffer/options.go @@ -26,8 +26,8 @@ import ( type options struct { // readTimeOut is the timeout needed for read timeout readTimeOut time.Duration - // onFullWritingStrategy is the writing strategy when buffer is full - onFullWritingStrategy dfv1.OnFullWritingStrategy + // bufferFullWritingStrategy is the writing strategy when buffer is full + bufferFullWritingStrategy dfv1.BufferFullWritingStrategy } type Option func(options *options) error @@ -40,10 +40,10 @@ func WithReadTimeOut(timeout time.Duration) Option { } } -// WithOnFullWritingStrategy sets the writing strategy when buffer is full -func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option { +// WithBufferFullWritingStrategy sets the writing strategy when buffer is full +func WithBufferFullWritingStrategy(s dfv1.BufferFullWritingStrategy) Option { return func(o *options) error { - o.onFullWritingStrategy = s + o.bufferFullWritingStrategy = s return nil } } diff --git a/pkg/sources/source.go b/pkg/sources/source.go index f8d5e6bd94..2df0ea3fe2 100644 --- a/pkg/sources/source.go +++ b/pkg/sources/source.go @@ -70,7 +70,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { case dfv1.ISBSvcTypeRedis: for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges { writeOpts := []redisisb.Option{ - redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + redisisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()), } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength))) @@ -102,7 +102,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error { for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges { writeOpts := []jetstreamisb.WriteOption{ jetstreamisb.WithUsingWriteInfoAsRate(true), - jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + jetstreamisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()), } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength))) diff --git a/pkg/udf/common.go b/pkg/udf/common.go index 1fe89dc8c8..aa7dd89121 100644 --- a/pkg/udf/common.go +++ b/pkg/udf/common.go @@ -42,7 +42,7 @@ func buildRedisBufferIO(ctx context.Context, fromBufferName string, vertexInstan for _, e := range vertexInstance.Vertex.Spec.ToEdges { writeOpts := []redisisb.Option{ - redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + redisisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()), } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength))) @@ -76,7 +76,7 @@ func buildJetStreamBufferIO(ctx context.Context, fromBufferName string, vertexIn for _, e := range vertexInstance.Vertex.Spec.ToEdges { writeOpts := []jetstreamisb.WriteOption{ - jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()), + jetstreamisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()), } if x := e.Limits; x != nil && x.BufferMaxLength != nil { writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength))) From d576b490e7f9965e6ba933e198aad811a21d47f0 Mon Sep 17 00:00:00 2001 From: Keran Yang Date: Tue, 28 Mar 2023 11:39:37 -0400 Subject: [PATCH 4/6] fix codegen Signed-off-by: Keran Yang --- pkg/apis/numaflow/v1alpha1/generated.pb.go | 708 ++++++++++----------- 1 file changed, 354 insertions(+), 354 deletions(-) diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go index 213910beeb..e2aeb19d8a 100644 --- a/pkg/apis/numaflow/v1alpha1/generated.pb.go +++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go @@ -2037,365 +2037,365 @@ func init() { } var fileDescriptor_9d0d1b17d3865563 = []byte{ - // 5718 bytes of a gzipped FileDescriptorProto + // 5719 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57, 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9, 0x5a, 0x25, 0xff, 0xd9, 0x3f, 0xbb, 0x36, 0x63, 0xb2, 0xec, 0x2c, 0xb0, 0x9b, 0xb8, 0xed, 0xf1, 0x64, 0x66, 0xec, 0x19, 0xef, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2, 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0xf3, 0x90, 0x20, 0x16, 0x2d, 0x12, - 0x42, 0x5a, 0xb1, 0x0a, 0x12, 0x12, 0x12, 0x02, 0x69, 0x25, 0x1e, 0xd8, 0x17, 0x78, 0xe1, 0x09, - 0x05, 0x1e, 0x20, 0x0f, 0x48, 0x04, 0x81, 0x5a, 0xc4, 0x3c, 0xf1, 0x00, 0x5a, 0xb4, 0x2f, 0xab, - 0x11, 0x12, 0xe8, 0x7e, 0xd4, 0x67, 0x57, 0x7b, 0xec, 0x6e, 0x3b, 0x3b, 0x11, 0x6f, 0x55, 0xf7, - 0x9c, 0xf3, 0x3b, 0xb7, 0xee, 0xc7, 0xb9, 0xe7, 0x9e, 0x73, 0x6f, 0xc1, 0x8d, 0xb6, 0xc9, 0x76, - 0xfa, 0xdb, 0xf3, 0x86, 0xd3, 0x5d, 0xb0, 0xfb, 0x5d, 0xbd, 0xe7, 0x3a, 0x6f, 0x8a, 0x87, 0x96, - 0xe5, 0x3c, 0x58, 0xe8, 0x75, 0xda, 0x0b, 0x7a, 0xcf, 0xf4, 0xc2, 0x92, 0xdd, 0xab, 0xba, 0xd5, - 0xdb, 0xd1, 0xaf, 0x2e, 0xb4, 0xa9, 0x4d, 0x5d, 0x9d, 0xd1, 0xe6, 0x7c, 0xcf, 0x75, 0x98, 0x43, - 0xbe, 0x1c, 0x02, 0xcd, 0xfb, 0x40, 0xf3, 0xbe, 0xd8, 0x7c, 0xaf, 0xd3, 0x9e, 0xe7, 0x40, 0x61, - 0x89, 0x0f, 0x34, 0xfb, 0xc5, 0x48, 0x0d, 0xda, 0x4e, 0xdb, 0x59, 0x10, 0x78, 0xdb, 0xfd, 0x96, - 0x78, 0x13, 0x2f, 0xe2, 0x49, 0xea, 0x99, 0xd5, 0x3a, 0xd7, 0xbc, 0x79, 0xd3, 0xe1, 0xd5, 0x5a, - 0x30, 0x1c, 0x97, 0x2e, 0xec, 0x0e, 0xd5, 0x65, 0xf6, 0x85, 0x90, 0xa7, 0xab, 0x1b, 0x3b, 0xa6, - 0x4d, 0xdd, 0x3d, 0xff, 0x5b, 0x16, 0x5c, 0xea, 0x39, 0x7d, 0xd7, 0xa0, 0x47, 0x92, 0xf2, 0x16, - 0xba, 0x94, 0xe9, 0x69, 0xba, 0x16, 0x46, 0x49, 0xb9, 0x7d, 0x9b, 0x99, 0xdd, 0x61, 0x35, 0x3f, - 0xff, 0x38, 0x01, 0xcf, 0xd8, 0xa1, 0x5d, 0x3d, 0x29, 0xa7, 0xfd, 0x73, 0x19, 0xce, 0x2d, 0x6d, - 0x7b, 0xcc, 0xd5, 0x0d, 0xb6, 0xe1, 0x34, 0x37, 0x69, 0xb7, 0x67, 0xe9, 0x8c, 0x92, 0x0e, 0x94, - 0x78, 0xdd, 0x9a, 0x3a, 0xd3, 0xab, 0x99, 0xcb, 0x99, 0x2b, 0x95, 0xc5, 0xa5, 0xf9, 0x31, 0xfb, - 0x62, 0x7e, 0x5d, 0x01, 0xd5, 0xa7, 0xf7, 0x07, 0xb5, 0x92, 0xff, 0x86, 0x81, 0x02, 0xf2, 0xbd, - 0x0c, 0x4c, 0xdb, 0x4e, 0x93, 0x36, 0xa8, 0x45, 0x0d, 0xe6, 0xb8, 0xd5, 0xec, 0xe5, 0xdc, 0x95, - 0xca, 0xe2, 0xeb, 0x63, 0x6b, 0x4c, 0xf9, 0xa2, 0xf9, 0x3b, 0x11, 0x05, 0xd7, 0x6d, 0xe6, 0xee, - 0xd5, 0x9f, 0xfe, 0x60, 0x50, 0x7b, 0x6a, 0x7f, 0x50, 0x9b, 0x8e, 0x92, 0x30, 0x56, 0x13, 0xb2, - 0x05, 0x15, 0xe6, 0x58, 0xbc, 0xc9, 0x4c, 0xc7, 0xf6, 0xaa, 0x39, 0x51, 0xb1, 0xb9, 0x79, 0xd9, - 0xda, 0x5c, 0xfd, 0x3c, 0x1f, 0x2e, 0xf3, 0xbb, 0x57, 0xe7, 0x37, 0x03, 0xb6, 0xfa, 0x39, 0x05, - 0x5c, 0x09, 0xcb, 0x3c, 0x8c, 0xe2, 0x10, 0x0a, 0xa7, 0x3d, 0x6a, 0xf4, 0x5d, 0x93, 0xed, 0x2d, - 0x3b, 0x36, 0xa3, 0x0f, 0x59, 0x35, 0x2f, 0x5a, 0xf9, 0xf9, 0x34, 0xe8, 0x0d, 0xa7, 0xd9, 0x88, - 0x73, 0xd7, 0xcf, 0xed, 0x0f, 0x6a, 0xa7, 0x13, 0x85, 0x98, 0xc4, 0x24, 0x36, 0x9c, 0x31, 0xbb, - 0x7a, 0x9b, 0x6e, 0xf4, 0x2d, 0xab, 0x41, 0x0d, 0x97, 0x32, 0xaf, 0x5a, 0x10, 0x9f, 0x70, 0x25, - 0x4d, 0xcf, 0x9a, 0x63, 0xe8, 0xd6, 0xdd, 0xed, 0x37, 0xa9, 0xc1, 0x90, 0xb6, 0xa8, 0x4b, 0x6d, - 0x83, 0xd6, 0xab, 0xea, 0x63, 0xce, 0xdc, 0x4c, 0x20, 0xe1, 0x10, 0x36, 0xb9, 0x01, 0x67, 0x7b, - 0xae, 0xe9, 0x88, 0x2a, 0x58, 0xba, 0xe7, 0xdd, 0xd1, 0xbb, 0xb4, 0x5a, 0xbc, 0x9c, 0xb9, 0x52, - 0xae, 0x5f, 0x54, 0x30, 0x67, 0x37, 0x92, 0x0c, 0x38, 0x2c, 0x43, 0xae, 0x40, 0xc9, 0x2f, 0xac, - 0x4e, 0x5d, 0xce, 0x5c, 0x29, 0xc8, 0xb1, 0xe3, 0xcb, 0x62, 0x40, 0x25, 0xab, 0x50, 0xd2, 0x5b, - 0x2d, 0xd3, 0xe6, 0x9c, 0x25, 0xd1, 0x84, 0x97, 0xd2, 0x3e, 0x6d, 0x49, 0xf1, 0x48, 0x1c, 0xff, - 0x0d, 0x03, 0x59, 0x72, 0x0b, 0x88, 0x47, 0xdd, 0x5d, 0xd3, 0xa0, 0x4b, 0x86, 0xe1, 0xf4, 0x6d, - 0x26, 0xea, 0x5e, 0x16, 0x75, 0x9f, 0x55, 0x75, 0x27, 0x8d, 0x21, 0x0e, 0x4c, 0x91, 0x22, 0x2f, - 0xc1, 0x19, 0x35, 0xed, 0xc2, 0x56, 0x00, 0x81, 0xf4, 0x34, 0x6f, 0x48, 0x4c, 0xd0, 0x70, 0x88, - 0x9b, 0x34, 0xe1, 0x92, 0xde, 0x67, 0x4e, 0x97, 0x43, 0xc6, 0x95, 0x6e, 0x3a, 0x1d, 0x6a, 0x57, - 0x2b, 0x97, 0x33, 0x57, 0x4a, 0xf5, 0xcb, 0xfb, 0x83, 0xda, 0xa5, 0xa5, 0x03, 0xf8, 0xf0, 0x40, - 0x14, 0x72, 0x17, 0xca, 0x4d, 0xdb, 0xdb, 0x70, 0x2c, 0xd3, 0xd8, 0xab, 0x4e, 0x8b, 0x0a, 0x5e, - 0x55, 0x9f, 0x5a, 0x5e, 0xb9, 0xd3, 0x90, 0x84, 0x47, 0x83, 0xda, 0xa5, 0x61, 0xeb, 0x38, 0x1f, - 0xd0, 0x31, 0xc4, 0x20, 0xeb, 0x02, 0x70, 0xd9, 0xb1, 0x5b, 0x66, 0xbb, 0x3a, 0x23, 0x7a, 0xe3, - 0xf2, 0x88, 0x01, 0xbd, 0x72, 0xa7, 0x21, 0xf9, 0xea, 0x33, 0x4a, 0x9d, 0x7c, 0xc5, 0x10, 0x61, - 0xf6, 0x45, 0x38, 0x3b, 0x34, 0x6b, 0xc9, 0x19, 0xc8, 0x75, 0xe8, 0x9e, 0x30, 0x4a, 0x65, 0xe4, - 0x8f, 0xe4, 0x69, 0x28, 0xec, 0xea, 0x56, 0x9f, 0x56, 0xb3, 0xa2, 0x4c, 0xbe, 0xfc, 0x42, 0xf6, - 0x5a, 0x46, 0x1b, 0x94, 0xe1, 0x94, 0x6f, 0x0b, 0xee, 0x51, 0x97, 0xd1, 0x87, 0xe4, 0x32, 0xe4, - 0x6d, 0xde, 0x1f, 0x42, 0xbe, 0x3e, 0xad, 0x3e, 0x37, 0x2f, 0xfa, 0x41, 0x50, 0x88, 0x01, 0x45, - 0x69, 0xcb, 0x05, 0x5e, 0x65, 0xf1, 0xc5, 0xb1, 0xcd, 0x50, 0x43, 0xc0, 0xd4, 0x61, 0x7f, 0x50, - 0x2b, 0xca, 0x67, 0x54, 0xd0, 0xe4, 0x35, 0xc8, 0x7b, 0xa6, 0xdd, 0xa9, 0xe6, 0x84, 0x8a, 0xaf, - 0x8e, 0xaf, 0xc2, 0xb4, 0x3b, 0xf5, 0x12, 0xff, 0x02, 0xfe, 0x84, 0x02, 0x94, 0xdc, 0x87, 0x5c, - 0xbf, 0xd9, 0x52, 0x16, 0xe5, 0x97, 0xc6, 0xc6, 0xde, 0x5a, 0x59, 0xad, 0x4f, 0xed, 0x0f, 0x6a, - 0xb9, 0xad, 0x95, 0x55, 0xe4, 0x88, 0xe4, 0xbb, 0x19, 0x38, 0x6b, 0x38, 0x36, 0xd3, 0xf9, 0xfa, - 0xe2, 0x5b, 0xd6, 0x6a, 0x41, 0xe8, 0xb9, 0x35, 0xb6, 0x9e, 0xe5, 0x24, 0x62, 0xfd, 0x3c, 0x37, - 0x14, 0x43, 0xc5, 0x38, 0xac, 0x9b, 0x7c, 0x3f, 0x03, 0xe7, 0xf9, 0x04, 0x1e, 0x62, 0x16, 0x66, - 0xe7, 0x78, 0x6b, 0x75, 0x71, 0x7f, 0x50, 0x3b, 0x7f, 0x33, 0x4d, 0x19, 0xa6, 0xd7, 0x81, 0xd7, - 0xee, 0x9c, 0x3e, 0xbc, 0x16, 0x09, 0x93, 0x56, 0x59, 0x5c, 0x3b, 0xce, 0xf5, 0xad, 0xfe, 0x19, - 0x35, 0x94, 0xd3, 0x96, 0x73, 0x4c, 0xab, 0x05, 0xb9, 0x0e, 0x53, 0xbb, 0x8e, 0xd5, 0xef, 0x52, - 0xaf, 0x5a, 0x12, 0x8b, 0xc2, 0x6c, 0xda, 0x5c, 0xbd, 0x27, 0x58, 0xea, 0xa7, 0x15, 0xfc, 0x94, - 0x7c, 0xf7, 0xd0, 0x97, 0x25, 0x26, 0x14, 0x2d, 0xb3, 0x6b, 0x32, 0x4f, 0x58, 0xcb, 0xca, 0xe2, - 0xf5, 0xb1, 0x3f, 0x4b, 0x4e, 0xd1, 0x35, 0x01, 0x26, 0x67, 0x8d, 0x7c, 0x46, 0xa5, 0x80, 0x18, - 0x50, 0xf0, 0x0c, 0xdd, 0x92, 0xd6, 0xb4, 0xb2, 0xf8, 0xb5, 0xf1, 0xa7, 0x0d, 0x47, 0xa9, 0xcf, - 0xa8, 0x6f, 0x2a, 0x88, 0x57, 0x94, 0xd8, 0xe4, 0x57, 0xe0, 0x54, 0xac, 0x37, 0xbd, 0x6a, 0x45, - 0xb4, 0xce, 0xb3, 0x69, 0xad, 0x13, 0x70, 0xd5, 0x2f, 0x28, 0xb0, 0x53, 0xb1, 0x11, 0xe2, 0x61, - 0x02, 0x8c, 0xdc, 0x86, 0x92, 0x67, 0x36, 0xa9, 0xa1, 0xbb, 0x5e, 0x75, 0xfa, 0x30, 0xc0, 0x67, - 0x14, 0x70, 0xa9, 0xa1, 0xc4, 0x30, 0x00, 0xd0, 0xee, 0xc3, 0xcc, 0x52, 0x9f, 0xed, 0x38, 0xae, - 0xf9, 0xb6, 0xf0, 0x2c, 0xc8, 0x2a, 0x14, 0x98, 0x58, 0x21, 0xa4, 0xd3, 0xf6, 0x5c, 0x1a, 0xb4, - 0x5c, 0xad, 0x6f, 0xd3, 0x3d, 0xdf, 0xb0, 0xd6, 0xcb, 0xbc, 0x11, 0xe4, 0x8a, 0x21, 0xc5, 0xb5, - 0x3f, 0xcc, 0x40, 0xb9, 0xae, 0x7b, 0xa6, 0xc1, 0xe1, 0xc9, 0x32, 0xe4, 0xfb, 0x1e, 0x75, 0x8f, - 0x06, 0x2a, 0xac, 0xd2, 0x96, 0x47, 0x5d, 0x14, 0xc2, 0xe4, 0x2e, 0x94, 0x7a, 0xba, 0xe7, 0x3d, - 0x70, 0xdc, 0xa6, 0xb2, 0xac, 0x87, 0x04, 0x92, 0x4b, 0xbf, 0x12, 0xc5, 0x00, 0x44, 0xab, 0x40, - 0xb9, 0x6e, 0xe9, 0x46, 0x67, 0xc7, 0xb1, 0xa8, 0xf6, 0x2a, 0x14, 0xeb, 0xfd, 0x56, 0x8b, 0xba, - 0x87, 0xb0, 0xf0, 0xf3, 0x90, 0x67, 0x7b, 0x3d, 0xb5, 0x5e, 0x04, 0xab, 0x7b, 0x7e, 0x73, 0xaf, - 0x47, 0x1f, 0x0d, 0x6a, 0x20, 0x71, 0xf8, 0x1b, 0x0a, 0x3e, 0xed, 0xc7, 0x19, 0x38, 0x27, 0x0b, - 0xd5, 0x2a, 0x2a, 0xd7, 0x27, 0x42, 0xa1, 0xe0, 0xd2, 0xa6, 0xe9, 0xa9, 0x76, 0x59, 0x19, 0x7b, - 0x38, 0x22, 0x47, 0x51, 0xcb, 0xa1, 0xe8, 0x0b, 0x51, 0x80, 0x12, 0x9d, 0xf4, 0xa1, 0xfc, 0x26, - 0x65, 0x1e, 0x73, 0xa9, 0xde, 0x55, 0x2d, 0xf7, 0xf2, 0xd8, 0xaa, 0x6e, 0x51, 0xd6, 0x10, 0x48, - 0xd1, 0xd5, 0x37, 0x28, 0xc4, 0x50, 0x93, 0xf6, 0x93, 0x3c, 0x94, 0x83, 0x51, 0x48, 0x3e, 0x07, - 0x05, 0xe1, 0xee, 0xa9, 0x66, 0x0d, 0xa6, 0x8e, 0xf0, 0x0a, 0x51, 0xd2, 0xc8, 0x73, 0x30, 0x65, - 0x38, 0xdd, 0xae, 0x6e, 0x37, 0x85, 0x0b, 0x5f, 0xae, 0x57, 0xb8, 0xc5, 0x58, 0x96, 0x45, 0xe8, - 0xd3, 0xc8, 0x25, 0xc8, 0xeb, 0x6e, 0x5b, 0x7a, 0xd3, 0x65, 0x39, 0x4e, 0x96, 0xdc, 0xb6, 0x87, - 0xa2, 0x94, 0x7c, 0x05, 0x72, 0xd4, 0xde, 0xad, 0xe6, 0x47, 0x9b, 0xa4, 0xeb, 0xf6, 0xee, 0x3d, - 0xdd, 0xad, 0x57, 0x54, 0x1d, 0x72, 0xd7, 0xed, 0x5d, 0xe4, 0x32, 0x64, 0x0d, 0xa6, 0xa8, 0xbd, - 0xbb, 0xea, 0x3a, 0x5d, 0xe5, 0xe6, 0x7e, 0x76, 0x84, 0x38, 0x67, 0x51, 0xab, 0x73, 0x60, 0xd8, - 0x54, 0x31, 0xfa, 0x10, 0xe4, 0x1b, 0x30, 0x2d, 0x6d, 0xdc, 0x3a, 0x77, 0x99, 0xbc, 0x6a, 0x51, - 0x40, 0xd6, 0x46, 0x1b, 0x49, 0xc1, 0x17, 0x6e, 0x2b, 0x22, 0x85, 0x1e, 0xc6, 0xa0, 0xc8, 0x37, - 0xa0, 0xec, 0xef, 0x18, 0x3d, 0xb5, 0x1a, 0xa4, 0x7a, 0xe4, 0xa8, 0x98, 0x90, 0xbe, 0xd5, 0x37, - 0x5d, 0xda, 0xa5, 0x36, 0xf3, 0xea, 0x67, 0x7d, 0x1f, 0xcd, 0xa7, 0x7a, 0x18, 0xa2, 0x91, 0xed, - 0xe1, 0xad, 0x85, 0xf4, 0x8b, 0x3f, 0x37, 0x62, 0xb6, 0x8d, 0xb1, 0xaf, 0x78, 0x1d, 0x4e, 0x07, - 0xbe, 0xbf, 0x72, 0x1f, 0xa5, 0xa7, 0xfc, 0x02, 0x17, 0xbf, 0x19, 0x27, 0x3d, 0x1a, 0xd4, 0x9e, - 0x4d, 0x71, 0x20, 0x43, 0x06, 0x4c, 0x82, 0x69, 0xff, 0x95, 0x85, 0xe1, 0xe5, 0x3f, 0xde, 0x68, - 0x99, 0xe3, 0x6e, 0xb4, 0xe4, 0x07, 0x49, 0xe3, 0x70, 0x4d, 0x89, 0x4d, 0xfe, 0x51, 0x69, 0x1d, - 0x93, 0x3b, 0xee, 0x8e, 0x19, 0x7f, 0xee, 0x68, 0xef, 0xe5, 0xe1, 0xd4, 0x8a, 0x4e, 0xbb, 0x8e, - 0xfd, 0x58, 0xf7, 0x25, 0xf3, 0x44, 0xb8, 0x2f, 0x57, 0xa0, 0xe4, 0xd2, 0x9e, 0x65, 0x1a, 0xba, - 0x27, 0x3a, 0x4b, 0xed, 0x11, 0x51, 0x95, 0x61, 0x40, 0x1d, 0xe1, 0xb6, 0xe6, 0x9e, 0x48, 0xb7, - 0x35, 0xff, 0xd3, 0x77, 0x5b, 0xb5, 0xf7, 0x73, 0x90, 0xbf, 0xde, 0x6c, 0x53, 0xbe, 0x94, 0xb6, - 0xb8, 0x31, 0x4d, 0x2c, 0xa5, 0xc2, 0x4c, 0x0a, 0x0a, 0x99, 0x85, 0x2c, 0x73, 0xd4, 0x5c, 0x01, - 0x45, 0xcf, 0x6e, 0x3a, 0x98, 0x65, 0x0e, 0x79, 0x1b, 0xc0, 0x70, 0xec, 0xa6, 0xe9, 0x87, 0x4e, - 0x26, 0xfb, 0xb0, 0x55, 0xc7, 0x7d, 0xa0, 0xbb, 0xcd, 0xe5, 0x00, 0xb1, 0x7e, 0x6a, 0x7f, 0x50, - 0x83, 0xf0, 0x1d, 0x23, 0xda, 0x48, 0x3b, 0x70, 0x4a, 0x65, 0x83, 0x2e, 0x8f, 0xad, 0x97, 0x37, - 0xc4, 0x01, 0x2e, 0xe9, 0x55, 0xa8, 0xf4, 0x74, 0x57, 0xb7, 0x2c, 0x6a, 0x99, 0x5e, 0x57, 0xec, - 0x85, 0x0a, 0xf5, 0xd3, 0xfb, 0x83, 0x5a, 0x65, 0x23, 0x2c, 0xc6, 0x28, 0x0f, 0x79, 0x11, 0x8a, - 0x8e, 0xbd, 0xda, 0xb7, 0x2c, 0x15, 0x1a, 0xf9, 0x7f, 0x1c, 0xf6, 0xae, 0x28, 0x79, 0x34, 0xa8, - 0x5d, 0x94, 0x9e, 0x06, 0x7f, 0xbb, 0xef, 0x9a, 0xcc, 0xb4, 0xdb, 0x0d, 0xe6, 0xea, 0x8c, 0xb6, - 0xf7, 0x50, 0x89, 0x69, 0xbf, 0x9d, 0x01, 0x08, 0xab, 0x45, 0xbe, 0x0a, 0xa7, 0xb7, 0x85, 0xcc, - 0xba, 0xfe, 0x70, 0x8d, 0xda, 0x6d, 0xb6, 0x23, 0x3a, 0x2c, 0x2f, 0x6d, 0x46, 0x3d, 0x4e, 0xc2, - 0x24, 0x2f, 0x79, 0x09, 0xce, 0xc8, 0xa2, 0x2d, 0x4f, 0x57, 0x98, 0xa2, 0x43, 0x67, 0x64, 0xb4, - 0xa2, 0x9e, 0xa0, 0xe1, 0x10, 0xb7, 0xa6, 0x43, 0x65, 0xd5, 0x7c, 0x48, 0x9b, 0xf7, 0x4d, 0xbb, - 0xe9, 0x3c, 0x20, 0x08, 0x45, 0x2b, 0xac, 0x46, 0x65, 0x71, 0x3e, 0x62, 0x87, 0x82, 0xe0, 0x64, - 0xd8, 0xe4, 0x5d, 0xca, 0x74, 0x6e, 0x99, 0x56, 0xfa, 0x2a, 0x7c, 0x26, 0x9b, 0x59, 0xd6, 0x56, - 0x21, 0x69, 0x2f, 0xc0, 0xd9, 0xa1, 0x01, 0x40, 0x6a, 0x50, 0xe8, 0xd0, 0xbd, 0x9b, 0xdc, 0xd9, - 0xe5, 0x8e, 0x84, 0xf0, 0x9c, 0x6e, 0xf3, 0x02, 0x94, 0xe5, 0xda, 0x7f, 0x67, 0xa0, 0xb4, 0xda, - 0xb7, 0x0d, 0xe1, 0x1a, 0x3f, 0xde, 0x2f, 0xf4, 0xfd, 0x92, 0x6c, 0xaa, 0x5f, 0xd2, 0x87, 0x62, - 0xe7, 0x41, 0xe0, 0xb7, 0x54, 0x16, 0xd7, 0xc7, 0x1f, 0xca, 0xaa, 0x4a, 0xf3, 0xb7, 0x05, 0x9e, - 0x8c, 0x46, 0x9e, 0x52, 0x15, 0x2a, 0xde, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, - 0x84, 0xed, 0x48, 0xe1, 0x8f, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xf0, 0x75, 0x5c, 0xe9, 0xee, - 0x90, 0x8b, 0x90, 0x73, 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0xbb, 0x7b, 0xdc, 0xd8, 0x42, 0x5e, 0x46, - 0x5e, 0x81, 0x52, 0x53, 0xf5, 0x81, 0x72, 0x33, 0x8f, 0xda, 0x73, 0xc2, 0x00, 0xfb, 0x6f, 0x18, - 0xa0, 0x71, 0xbf, 0xb0, 0xeb, 0xb5, 0x1b, 0xe6, 0xdb, 0xd2, 0xea, 0x16, 0xa4, 0x5f, 0xb8, 0x2e, - 0x8b, 0xd0, 0xa7, 0x71, 0x8b, 0xde, 0xa1, 0x7b, 0xcb, 0xdc, 0x45, 0x12, 0xd3, 0x56, 0x59, 0xf4, - 0xdb, 0xaa, 0x0c, 0x03, 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, - 0x05, 0xea, 0xf3, 0xb5, 0xef, 0x66, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0x82, 0xb6, 0x42, 0x7b, 0x96, - 0xb3, 0xc7, 0xfd, 0x00, 0xa4, 0x6f, 0x91, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x0f, - 0x5f, 0x8d, 0x86, 0xcb, 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, - 0x09, 0x7d, 0xe1, 0xec, 0x01, 0xbe, 0x70, 0x03, 0xa0, 0x17, 0x7a, 0x13, 0x39, 0xc1, 0xf9, 0x73, - 0xbe, 0x9a, 0xa3, 0x38, 0x12, 0x11, 0x98, 0x49, 0xd6, 0xf7, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca, - 0x02, 0x57, 0x5f, 0x6d, 0x65, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x37, 0x03, 0x45, 0x4b, 0xdf, - 0xa6, 0x96, 0x27, 0x66, 0x53, 0x65, 0xf1, 0x8d, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, - 0x43, 0x62, 0xc0, 0xcb, 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, - 0xc3, 0x71, 0x99, 0x5a, 0xda, 0x83, 0x90, 0xfa, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, - 0x2c, 0x93, 0xda, 0x4c, 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, - 0xaa, 0xba, 0x8e, 0x6d, 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, - 0x31, 0xca, 0x5c, 0xd3, 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, - 0xe4, 0xfb, 0x8f, 0x34, 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, - 0xd5, 0xa0, 0xcc, 0xef, 0xc0, 0x2f, 0x41, 0x45, 0x85, 0xa2, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, - 0x23, 0x24, 0x61, 0x94, 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xeb, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, - 0x55, 0xf0, 0x50, 0x7d, 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0x8e, - 0xfb, 0x1d, 0x9f, 0x80, 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, - 0x46, 0x5d, 0x29, 0x9b, 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, - 0xd6, 0xe1, 0x9c, 0x21, 0x23, 0xd1, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x97, - 0xba, 0x3c, 0xcc, 0x82, 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, - 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, - 0x3b, 0x32, 0x68, 0x13, 0x49, 0x74, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, - 0xb3, 0xb2, 0xfc, 0xba, 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, - 0xb8, 0xb3, 0x8d, 0x91, 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x45, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, - 0x04, 0xac, 0x4c, 0x7b, 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, - 0xee, 0xed, 0x1a, 0xfc, 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0x49, 0x8e, 0x72, 0xfd, - 0x19, 0x7f, 0x97, 0xb8, 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, - 0x31, 0x91, 0xea, 0x29, 0x99, 0x16, 0xf2, 0x43, 0x06, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, - 0x8f, 0x47, 0x72, 0x31, 0x14, 0x41, 0xa5, 0x84, 0xd9, 0x7f, 0x27, 0x69, 0xf6, 0x5f, 0x9b, 0x64, - 0xfa, 0xa7, 0x68, 0x38, 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x21, 0x30, 0xb9, 0x15, 0x89, 0x58, - 0xfe, 0x20, 0xf9, 0x86, 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, - 0x6a, 0xc5, 0xe1, 0xe4, 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, - 0x1a, 0xff, 0x5f, 0xca, 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xdd, 0xa4, 0xd9, 0x7e, - 0x63, 0xf2, 0x7e, 0x1b, 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61, - 0x40, 0xc1, 0x08, 0x17, 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22, - 0xc6, 0x79, 0x47, 0x9a, 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x46, 0x58, 0xe2, 0x15, - 0xe3, 0xb9, 0xdf, 0x9b, 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e, - 0x8d, 0x3f, 0x94, 0xc9, 0x1b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3, - 0x0a, 0xf8, 0x22, 0x8e, 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd, - 0x1a, 0xbd, 0x30, 0x2c, 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb, - 0xa2, 0x4d, 0x95, 0xfb, 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab, - 0xa7, 0x8f, 0x68, 0xab, 0x6f, 0x88, 0xa8, 0x51, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x9c, 0x66, - 0x58, 0x4e, 0x32, 0xe0, 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a, - 0xb1, 0x54, 0xa6, 0xf0, 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0, - 0xe9, 0xb8, 0x93, 0xf2, 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x93, 0x85, 0x73, - 0x37, 0xa8, 0xca, 0xae, 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x93, 0x85, - 0xa9, 0x1b, 0xae, 0xd3, 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41, - 0xc6, 0x3f, 0x48, 0x20, 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8, - 0x1e, 0x95, 0x69, 0xb5, 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x13, 0xa6, 0x3c, - 0xe6, 0xb8, 0xbe, 0x91, 0x9e, 0x24, 0x24, 0xb6, 0x51, 0xff, 0x7a, 0x43, 0x42, 0xc9, 0x8d, 0xbc, - 0x7a, 0x41, 0x5f, 0x81, 0xf6, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42, - 0x5e, 0xef, 0x07, 0xe1, 0xa0, 0xd5, 0xf1, 0xe3, 0xc6, 0xd1, 0x54, 0xa7, 0x8a, 0xcf, 0xf4, 0xd9, - 0x0e, 0x0a, 0x74, 0xf2, 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0xb3, 0xa3, 0x56, 0x51, - 0xf4, 0xe9, 0xda, 0x8f, 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0xcb, 0xec, - 0x91, 0x5f, 0x1d, 0x3a, 0xf8, 0xf6, 0xb3, 0x87, 0x0b, 0x82, 0xc8, 0x73, 0x53, 0xeb, 0x94, 0xe9, - 0xa1, 0x6d, 0x0a, 0xcb, 0x22, 0xa7, 0xdd, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6, - 0xd8, 0xad, 0x91, 0xfe, 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x4d, - 0x28, 0x7a, 0x4c, 0x67, 0x7d, 0x3f, 0x12, 0xbb, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5, - 0x3b, 0x2a, 0xa5, 0xda, 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xf2, 0x50, - 0xb3, 0x1f, 0x32, 0xf6, 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0x69, 0x72, 0xbf, 0x24, 0xd2, 0xe4, 0x0c, - 0x0a, 0x26, 0xa3, 0x5d, 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a, - 0x65, 0xda, 0x7b, 0xd9, 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0xec, 0xf1, 0xed, 0xc9, 0xb2, - 0xc7, 0xf1, 0x0a, 0x0d, 0x27, 0x91, 0x7f, 0x7d, 0x38, 0x89, 0x7c, 0x77, 0xf2, 0x24, 0x72, 0xa2, - 0x19, 0x46, 0xe6, 0x92, 0xbf, 0x93, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c, - 0xd4, 0x56, 0x1e, 0x3c, 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2, - 0x5b, 0xd8, 0xe0, 0x85, 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59, - 0xba, 0xd4, 0xf3, 0x42, 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94, - 0x7b, 0x46, 0x95, 0x77, 0x18, 0x3f, 0x49, 0x96, 0x72, 0xe0, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50, - 0xba, 0x82, 0x03, 0x0d, 0x85, 0xf4, 0x03, 0x0d, 0x91, 0x05, 0x56, 0x1e, 0x68, 0xf8, 0xfb, 0x12, - 0x5c, 0x48, 0xef, 0x43, 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xf0, - 0x47, 0x16, 0xa3, 0x4f, 0xff, 0x54, 0x27, 0xe0, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9, - 0x24, 0x92, 0x70, 0xcf, 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8, - 0x76, 0x13, 0x7e, 0xf6, 0x09, 0x1e, 0xbd, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3, - 0x91, 0x35, 0x21, 0xbf, 0x01, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x9f, 0xbe, 0x1b, - 0x7f, 0xf4, 0x6f, 0x84, 0x58, 0x7e, 0xfa, 0x4b, 0x65, 0xd5, 0x42, 0x02, 0x46, 0x35, 0x3e, 0xe1, - 0x67, 0xed, 0xae, 0x40, 0xc9, 0xa3, 0x8c, 0x99, 0x76, 0xdb, 0x13, 0xbb, 0xb7, 0xb2, 0x9c, 0x2b, - 0x0d, 0x55, 0x86, 0x01, 0x95, 0xfc, 0x0c, 0x94, 0x45, 0xdc, 0x67, 0xc9, 0x6d, 0x7b, 0xd5, 0xb2, - 0xc8, 0x44, 0x09, 0xbb, 0xda, 0xf0, 0x0b, 0x31, 0xa4, 0x93, 0x17, 0x60, 0x5a, 0x66, 0xe3, 0xd4, - 0x99, 0x5b, 0xb9, 0xc7, 0x3a, 0xb3, 0x3f, 0xa8, 0x4d, 0xd7, 0x23, 0xe5, 0x18, 0xe3, 0xe2, 0xfb, - 0x29, 0x1a, 0x04, 0xc7, 0x92, 0xfb, 0xa9, 0x30, 0x6c, 0x86, 0x11, 0x2e, 0xf2, 0x2c, 0xe4, 0x98, - 0xe5, 0x89, 0x3d, 0x54, 0x29, 0xf4, 0x7b, 0x37, 0xd7, 0x1a, 0xc8, 0xcb, 0xb5, 0xff, 0xc9, 0xc0, - 0xe9, 0xc4, 0xd1, 0x22, 0x2e, 0xd2, 0x77, 0x2d, 0x65, 0x46, 0x02, 0x91, 0x2d, 0x5c, 0x43, 0x5e, - 0x4e, 0xde, 0x50, 0x5e, 0x61, 0x76, 0xc2, 0xeb, 0x05, 0x77, 0x74, 0xe6, 0x71, 0x37, 0x70, 0xc8, - 0x21, 0xbc, 0x96, 0x68, 0x9c, 0x5c, 0x3c, 0xd6, 0x76, 0x70, 0x03, 0x45, 0x36, 0x9c, 0xf9, 0xc3, - 0x6c, 0x38, 0xb5, 0xbf, 0xcd, 0x41, 0xe5, 0x96, 0xb3, 0xfd, 0x29, 0x39, 0x3c, 0x91, 0x6e, 0x91, - 0xb3, 0x3f, 0x45, 0x8b, 0xbc, 0x05, 0xcf, 0x30, 0xc6, 0x77, 0xfd, 0x8e, 0xdd, 0xf4, 0x96, 0x5a, - 0x8c, 0xba, 0xab, 0xa6, 0x6d, 0x7a, 0x3b, 0xb4, 0xa9, 0x22, 0x77, 0x9f, 0xd9, 0x1f, 0xd4, 0x9e, - 0xd9, 0xdc, 0x5c, 0x4b, 0x63, 0xc1, 0x51, 0xb2, 0x62, 0x86, 0xe8, 0x46, 0xc7, 0x69, 0xb5, 0x64, - 0x66, 0x5b, 0xe6, 0x78, 0xe4, 0x0c, 0x89, 0x94, 0x63, 0x8c, 0x4b, 0xfb, 0x28, 0x03, 0xe5, 0xdb, - 0x7a, 0xab, 0xa3, 0x37, 0x4c, 0xbb, 0x43, 0x9e, 0x83, 0xa9, 0x6d, 0xd7, 0xe9, 0x50, 0xd7, 0x53, - 0x99, 0x66, 0xb1, 0xeb, 0xa9, 0xcb, 0x22, 0xf4, 0x69, 0x7c, 0x1b, 0xc6, 0x9c, 0x9e, 0x69, 0x24, - 0x37, 0xac, 0x9b, 0xbc, 0x10, 0x25, 0x8d, 0xdc, 0x97, 0xf3, 0x28, 0x37, 0xe1, 0xd9, 0xec, 0xcd, - 0xb5, 0x86, 0xcc, 0xde, 0xfa, 0x33, 0x90, 0x3c, 0x1f, 0xf3, 0x3c, 0xca, 0xa3, 0x7c, 0x05, 0xed, - 0xfb, 0x59, 0xa8, 0xc8, 0x4f, 0x93, 0x9b, 0xb3, 0xe3, 0xfc, 0xb8, 0x17, 0x45, 0x74, 0xdd, 0xeb, - 0x77, 0xa9, 0x2b, 0x36, 0xc1, 0x6a, 0xca, 0x45, 0xa3, 0x25, 0x21, 0x31, 0x88, 0xb0, 0x87, 0x45, - 0x7e, 0xeb, 0xe4, 0x4f, 0xb0, 0x75, 0x0a, 0x07, 0xb6, 0xce, 0x9f, 0x65, 0xa0, 0xbc, 0x66, 0xb6, - 0xa8, 0xb1, 0x67, 0x58, 0x94, 0xbc, 0x02, 0xd5, 0x26, 0xb5, 0x28, 0xa3, 0x37, 0x5c, 0xdd, 0xa0, - 0x1b, 0xd4, 0x35, 0xc5, 0x4d, 0x1c, 0x3e, 0xca, 0xc4, 0x3c, 0x2e, 0xc8, 0xe5, 0x72, 0x65, 0x04, - 0x0f, 0x8e, 0x94, 0x26, 0x37, 0x61, 0xba, 0x49, 0x3d, 0xd3, 0xa5, 0xcd, 0x8d, 0x88, 0x37, 0xfa, - 0x9c, 0x6f, 0x9b, 0x56, 0x22, 0xb4, 0x47, 0x83, 0xda, 0xcc, 0x86, 0xd9, 0xa3, 0x96, 0x69, 0x53, - 0xe9, 0x96, 0xc6, 0x44, 0xb5, 0x02, 0xe4, 0xd6, 0x9c, 0xb6, 0xf6, 0x5e, 0x0e, 0x82, 0xbb, 0x55, - 0xe4, 0x37, 0x33, 0x50, 0xd1, 0x6d, 0xdb, 0x61, 0xea, 0xde, 0x92, 0x8c, 0xed, 0xe3, 0xc4, 0x57, - 0xb8, 0xe6, 0x97, 0x42, 0x50, 0x19, 0x16, 0x0e, 0x42, 0xd5, 0x11, 0x0a, 0x46, 0x75, 0x93, 0x7e, - 0x22, 0x52, 0xbd, 0x3e, 0x79, 0x2d, 0x0e, 0x11, 0x97, 0x9e, 0xfd, 0x1a, 0x9c, 0x49, 0x56, 0xf6, - 0x28, 0x81, 0xad, 0x49, 0x62, 0x62, 0xef, 0x94, 0xa1, 0x72, 0x47, 0x67, 0xe6, 0x2e, 0x15, 0x5b, - 0xb0, 0x93, 0xf1, 0xa9, 0xff, 0x20, 0x03, 0x17, 0xe2, 0x31, 0xe3, 0x13, 0x74, 0xac, 0x67, 0xf7, - 0x07, 0xb5, 0x0b, 0x98, 0xaa, 0x0d, 0x47, 0xd4, 0x42, 0xb8, 0xd8, 0x43, 0x21, 0xe8, 0x93, 0x76, - 0xb1, 0x1b, 0xa3, 0x14, 0xe2, 0xe8, 0xba, 0x7c, 0x5a, 0x5c, 0xec, 0x27, 0xfb, 0xae, 0x4b, 0x62, - 0x03, 0x30, 0xf5, 0xc4, 0x6c, 0x00, 0x4a, 0x4f, 0x84, 0xc3, 0xd5, 0x8b, 0x6c, 0x00, 0xca, 0x13, - 0xc6, 0x41, 0x55, 0x9a, 0x55, 0xa2, 0x8d, 0xda, 0x48, 0x88, 0xc3, 0x6f, 0xbe, 0x6f, 0x4c, 0x0c, - 0x28, 0x6c, 0xeb, 0x9e, 0x69, 0x28, 0xf7, 0xb3, 0x3e, 0x7e, 0x58, 0xc2, 0xbf, 0x14, 0x22, 0x63, - 0x4c, 0xe2, 0x15, 0x25, 0x76, 0x78, 0xf9, 0x24, 0x3b, 0xd1, 0xe5, 0x13, 0xb2, 0x0c, 0x79, 0x9b, - 0x1b, 0xdb, 0xdc, 0x91, 0xaf, 0x9b, 0xdc, 0xb9, 0x4d, 0xf7, 0x50, 0x08, 0x6b, 0x3f, 0xcc, 0x02, - 0xf0, 0xcf, 0x57, 0x6e, 0xce, 0x63, 0x36, 0x23, 0x9f, 0x87, 0x29, 0xaf, 0x2f, 0xa2, 0xb5, 0x6a, - 0x29, 0x0e, 0x83, 0xc7, 0xb2, 0x18, 0x7d, 0x3a, 0xf7, 0x84, 0xde, 0xea, 0xd3, 0xbe, 0x1f, 0x0b, - 0x0a, 0x3c, 0xa1, 0xaf, 0xf3, 0x42, 0x94, 0xb4, 0x93, 0x73, 0x64, 0xfc, 0x5d, 0x53, 0xe1, 0x84, - 0x76, 0x4d, 0xda, 0xb7, 0xb2, 0x00, 0x61, 0x80, 0x9f, 0xbc, 0x9f, 0x81, 0xf3, 0xc1, 0x2c, 0x63, - 0xf2, 0x4a, 0xc3, 0xb2, 0xa5, 0x9b, 0xdd, 0x89, 0x37, 0x32, 0x69, 0x33, 0x5c, 0x98, 0x9d, 0x8d, - 0x34, 0x75, 0x98, 0x5e, 0x0b, 0x82, 0x50, 0xa2, 0xdd, 0x1e, 0xdb, 0x5b, 0x31, 0x5d, 0x35, 0xec, - 0x52, 0xef, 0x04, 0x5c, 0x57, 0x3c, 0x52, 0x54, 0x5d, 0xfd, 0x10, 0x33, 0xc7, 0xa7, 0x60, 0x80, - 0xa3, 0x7d, 0x2f, 0x0b, 0xe7, 0x52, 0x6a, 0x47, 0x5e, 0x82, 0x33, 0x2a, 0xc3, 0x11, 0xde, 0xeb, - 0xcd, 0x84, 0xf7, 0x7a, 0x1b, 0x09, 0x1a, 0x0e, 0x71, 0x93, 0x37, 0x00, 0x74, 0xc3, 0xa0, 0x9e, - 0xb7, 0xee, 0x34, 0x7d, 0xa7, 0xef, 0x45, 0xbe, 0xa9, 0x5c, 0x0a, 0x4a, 0x1f, 0x0d, 0x6a, 0x5f, - 0x4c, 0x4b, 0x55, 0x25, 0xbe, 0x3e, 0x14, 0xc0, 0x08, 0x24, 0x79, 0x1d, 0x40, 0x5e, 0x34, 0x09, - 0x0e, 0x5b, 0x3e, 0x26, 0x92, 0x3e, 0xef, 0x5f, 0x82, 0x98, 0xff, 0x7a, 0x5f, 0xb7, 0x99, 0xc9, - 0xf6, 0xe4, 0xb9, 0xea, 0x7b, 0x01, 0x0a, 0x46, 0x10, 0xb5, 0xbf, 0xce, 0x42, 0xc9, 0x77, 0x46, - 0x3f, 0x81, 0x5c, 0x49, 0x3b, 0x96, 0x2b, 0x19, 0xff, 0x66, 0xa1, 0x5f, 0xe5, 0x91, 0xd9, 0x11, - 0x27, 0x91, 0x1d, 0xb9, 0x31, 0xb9, 0xaa, 0x83, 0xf3, 0x21, 0x3f, 0xc8, 0xc2, 0x29, 0x9f, 0x55, - 0x9d, 0xe3, 0xfe, 0x32, 0xcc, 0xb8, 0x54, 0x6f, 0xd6, 0x75, 0x66, 0xec, 0x88, 0xee, 0x93, 0xa7, - 0xb8, 0xcf, 0xee, 0x0f, 0x6a, 0x33, 0x18, 0x25, 0x60, 0x9c, 0x2f, 0xed, 0x00, 0x78, 0x76, 0xc2, - 0x03, 0xe0, 0xb9, 0xa3, 0x1c, 0x00, 0x27, 0x3a, 0x54, 0x78, 0x8d, 0x36, 0xcd, 0x2e, 0x75, 0xfa, - 0xfe, 0xaf, 0x0c, 0x8e, 0x7a, 0x78, 0x58, 0xac, 0xee, 0x18, 0xc2, 0x60, 0x14, 0x53, 0xfb, 0x87, - 0x0c, 0x4c, 0x87, 0xed, 0x75, 0xe2, 0x19, 0xa3, 0x56, 0x3c, 0x63, 0xb4, 0x34, 0xf1, 0x70, 0x18, - 0x91, 0x23, 0xfa, 0xbd, 0x62, 0xf8, 0x59, 0x22, 0x2b, 0xb4, 0x0d, 0xb3, 0x66, 0x6a, 0xa2, 0x24, - 0x62, 0x6d, 0x82, 0x43, 0x70, 0x37, 0x47, 0x72, 0xe2, 0x01, 0x28, 0xa4, 0x0f, 0xa5, 0x5d, 0xea, - 0x32, 0xd3, 0xa0, 0xfe, 0xf7, 0xdd, 0x98, 0xd8, 0x3b, 0x92, 0x07, 0x00, 0xc2, 0x36, 0xbd, 0xa7, - 0x14, 0x60, 0xa0, 0x8a, 0x6c, 0x43, 0x81, 0x36, 0xdb, 0xd4, 0x3f, 0x3f, 0xff, 0xd5, 0x89, 0xae, - 0x64, 0x84, 0xed, 0xc9, 0xdf, 0x3c, 0x94, 0xd0, 0xc4, 0x83, 0xb2, 0xe5, 0x6f, 0xdf, 0xd5, 0x38, - 0x1c, 0xdf, 0xd7, 0x09, 0x02, 0x01, 0xe1, 0x21, 0xd4, 0xa0, 0x08, 0x43, 0x3d, 0xa4, 0x13, 0x5c, - 0x36, 0x29, 0x1c, 0x93, 0xf1, 0x38, 0xe0, 0xc2, 0x89, 0x07, 0xe5, 0x07, 0x3a, 0xa3, 0x6e, 0x57, - 0x77, 0x3b, 0xca, 0xf1, 0x1f, 0xff, 0x0b, 0xef, 0xfb, 0x48, 0xe1, 0x17, 0x06, 0x45, 0x18, 0xea, - 0x21, 0x0e, 0x94, 0x99, 0xf2, 0x64, 0xfd, 0xfb, 0x8a, 0xe3, 0x2b, 0xf5, 0x7d, 0x62, 0x4f, 0x06, - 0xb6, 0x83, 0x57, 0x0c, 0x75, 0x68, 0x8f, 0x72, 0xa1, 0x79, 0xfc, 0xa4, 0x53, 0x84, 0x2f, 0xc4, - 0x53, 0x84, 0x73, 0xc9, 0x14, 0x61, 0x22, 0x1a, 0x73, 0xf4, 0x24, 0xa1, 0x0e, 0x15, 0x4b, 0xf7, - 0xd8, 0x56, 0xaf, 0xa9, 0x33, 0x15, 0x5f, 0xae, 0x2c, 0xfe, 0xff, 0xc3, 0x59, 0x2f, 0x6e, 0x0f, - 0xc3, 0xa0, 0xcb, 0x5a, 0x08, 0x83, 0x51, 0x4c, 0x72, 0x15, 0x2a, 0xbb, 0x62, 0x46, 0xca, 0xdb, - 0x14, 0x05, 0x61, 0xce, 0x85, 0x85, 0xbd, 0x17, 0x16, 0x63, 0x94, 0x87, 0x8b, 0x48, 0x4f, 0x40, - 0x8a, 0x14, 0x43, 0x91, 0x46, 0x58, 0x8c, 0x51, 0x1e, 0x91, 0xab, 0x30, 0xed, 0x8e, 0x14, 0x98, - 0x12, 0x02, 0x32, 0x57, 0xe1, 0x17, 0x62, 0x48, 0x27, 0x57, 0xa0, 0xd4, 0x6f, 0xb6, 0x24, 0x6f, - 0x49, 0xf0, 0x0a, 0xff, 0x6b, 0x6b, 0x65, 0x55, 0xdd, 0xee, 0xf0, 0xa9, 0xda, 0x7f, 0x66, 0x80, - 0x0c, 0x27, 0xb5, 0xc9, 0x0e, 0x14, 0x6d, 0x11, 0x55, 0x99, 0xf8, 0xbe, 0x75, 0x24, 0x38, 0x23, - 0xe7, 0x98, 0x2a, 0x50, 0xf8, 0xc4, 0x86, 0x12, 0x7d, 0xc8, 0xa8, 0x6b, 0xeb, 0x96, 0x72, 0x3d, - 0x8e, 0xe7, 0x6e, 0xb7, 0x74, 0x38, 0x15, 0x32, 0x06, 0x3a, 0xb4, 0x1f, 0x67, 0xa1, 0x12, 0xe1, - 0x7b, 0xdc, 0x66, 0x45, 0x9c, 0x19, 0x95, 0xc1, 0x8c, 0x2d, 0xd7, 0x52, 0xc3, 0x34, 0x72, 0x66, - 0x54, 0x91, 0x70, 0x0d, 0xa3, 0x7c, 0x64, 0x11, 0xa0, 0xab, 0x7b, 0x8c, 0xba, 0x62, 0x29, 0x49, - 0x9c, 0xd4, 0x5c, 0x0f, 0x28, 0x18, 0xe1, 0x22, 0x97, 0xd5, 0xcd, 0xff, 0x7c, 0xfc, 0xd2, 0xd4, - 0x88, 0x6b, 0xfd, 0x85, 0x63, 0xb8, 0xd6, 0x4f, 0xda, 0x70, 0xc6, 0xaf, 0xb5, 0x4f, 0x55, 0x76, - 0xee, 0x90, 0xc0, 0xd2, 0x19, 0x4f, 0x40, 0xe0, 0x10, 0xa8, 0xf6, 0xc3, 0x0c, 0xcc, 0xc4, 0xb6, - 0xd2, 0x7c, 0x6b, 0x17, 0x1e, 0xc9, 0x88, 0x6c, 0xed, 0x62, 0x27, 0x29, 0x9e, 0x87, 0xa2, 0x6c, - 0x20, 0xd5, 0xf0, 0x81, 0x19, 0x91, 0x4d, 0x88, 0x8a, 0xca, 0x0d, 0x82, 0x0a, 0xd6, 0x25, 0x0d, - 0x82, 0x8a, 0xe6, 0xa1, 0x4f, 0x27, 0x5f, 0x80, 0x92, 0x5f, 0x3b, 0xd5, 0xd2, 0xe1, 0x4f, 0x1f, - 0x54, 0x39, 0x06, 0x1c, 0xda, 0xb7, 0x0b, 0x20, 0xff, 0x58, 0xc1, 0xe5, 0x9a, 0xa6, 0x27, 0xb3, - 0x54, 0x19, 0x91, 0xa5, 0x0a, 0xe4, 0x56, 0x54, 0x39, 0x06, 0x1c, 0xe4, 0x22, 0xe4, 0xba, 0xa6, - 0xad, 0xc2, 0x8a, 0x62, 0x57, 0xb9, 0x6e, 0xda, 0xc8, 0xcb, 0x04, 0x49, 0x7f, 0xa8, 0x12, 0x2d, - 0x92, 0xa4, 0x3f, 0x44, 0x5e, 0xc6, 0x9d, 0x4b, 0xcb, 0x71, 0x3a, 0xdb, 0xba, 0xd1, 0xf1, 0x43, - 0xdf, 0x79, 0x31, 0x7b, 0x85, 0x73, 0xb9, 0x16, 0x27, 0x61, 0x92, 0x97, 0x8b, 0x1b, 0x8e, 0x63, - 0x35, 0x9d, 0x07, 0xb6, 0x2f, 0x5e, 0x08, 0xc5, 0x97, 0xe3, 0x24, 0x4c, 0xf2, 0x92, 0x2d, 0x78, - 0xe6, 0x6d, 0xea, 0x3a, 0xaa, 0xc5, 0x1a, 0x16, 0xa5, 0x3d, 0x1f, 0x46, 0x1a, 0x28, 0x91, 0x15, - 0x7a, 0x35, 0x9d, 0x05, 0x47, 0xc9, 0x8a, 0x64, 0x93, 0xee, 0xb6, 0x29, 0xdb, 0x70, 0x1d, 0xbe, - 0x77, 0x32, 0xed, 0xb6, 0x0f, 0x3b, 0x15, 0xc2, 0x6e, 0xa6, 0xb3, 0xe0, 0x28, 0x59, 0xb2, 0x0e, - 0x67, 0x25, 0x29, 0xe2, 0x33, 0x2b, 0x5b, 0x57, 0xdb, 0x1f, 0xd4, 0x3e, 0xb3, 0x42, 0x7b, 0x2e, - 0x35, 0xb8, 0x81, 0xde, 0x4c, 0xb2, 0xe1, 0xb0, 0xa4, 0xf8, 0x8f, 0x94, 0x0a, 0xf7, 0x6e, 0x50, - 0x57, 0x74, 0xb9, 0x88, 0x1d, 0x29, 0xc7, 0x1c, 0x13, 0x34, 0x1c, 0xe2, 0x26, 0xaf, 0x40, 0x35, - 0x0a, 0xbb, 0xb4, 0xab, 0x9b, 0x96, 0xbe, 0x6d, 0x5a, 0x26, 0xdb, 0x13, 0xb9, 0xe2, 0x19, 0x19, - 0x8c, 0xdc, 0x1c, 0xc1, 0x83, 0x23, 0xa5, 0xb5, 0xdf, 0xcf, 0x81, 0xf8, 0xe5, 0x10, 0xb9, 0x0f, - 0x39, 0xcb, 0x69, 0x2b, 0x93, 0x3c, 0x7e, 0xa4, 0x63, 0xcd, 0x69, 0xcb, 0x81, 0xb7, 0xe6, 0xb4, - 0x91, 0x23, 0x12, 0x03, 0x0a, 0x1d, 0xbd, 0xd5, 0xd1, 0x95, 0x05, 0x1e, 0xdf, 0xdf, 0x08, 0x12, - 0x79, 0xea, 0x86, 0x28, 0x7f, 0x45, 0x89, 0xcd, 0x1d, 0x9b, 0x6d, 0xff, 0x1f, 0x22, 0x6a, 0xeb, - 0x37, 0x41, 0x6c, 0xcc, 0x47, 0x92, 0xab, 0x60, 0xf0, 0x8a, 0xa1, 0x0e, 0x62, 0x40, 0xb1, 0xdf, - 0x14, 0xbf, 0x7e, 0xca, 0x4f, 0xe8, 0xc5, 0x6c, 0xad, 0x88, 0x6f, 0x12, 0xeb, 0x97, 0x7c, 0x46, - 0x05, 0xad, 0xfd, 0x79, 0x06, 0x66, 0x1a, 0x96, 0xd9, 0x34, 0xed, 0xf6, 0xc9, 0xdd, 0xc9, 0x25, - 0x77, 0xa1, 0xe0, 0x59, 0x66, 0x93, 0x8e, 0x79, 0x59, 0x54, 0x74, 0x06, 0xaf, 0x25, 0x45, 0x89, - 0xa3, 0xfd, 0x49, 0x1e, 0xd4, 0x7f, 0xb2, 0x48, 0x1f, 0xca, 0x6d, 0xff, 0xe6, 0xaa, 0xaa, 0xf2, - 0xcb, 0x13, 0xdc, 0x70, 0x88, 0xdd, 0x81, 0x95, 0xbd, 0x13, 0x14, 0x62, 0xa8, 0x89, 0xd0, 0xf8, - 0x98, 0x5b, 0x99, 0x70, 0xcc, 0x49, 0x75, 0xc3, 0xa3, 0x4e, 0x87, 0xfc, 0x0e, 0x63, 0xbd, 0x89, - 0x0f, 0xe2, 0x86, 0x67, 0x6c, 0x65, 0x18, 0x8f, 0xbf, 0xa3, 0x80, 0xe6, 0x2a, 0x6c, 0xfd, 0x18, - 0xae, 0xbf, 0x87, 0x21, 0x54, 0x15, 0x61, 0xd5, 0x99, 0x87, 0x02, 0x9a, 0xfc, 0x1a, 0x54, 0x98, - 0xab, 0xdb, 0x5e, 0xcb, 0x71, 0xbb, 0xd4, 0x55, 0x8b, 0xff, 0xea, 0x04, 0xe3, 0x79, 0x33, 0x44, - 0x93, 0x51, 0x8f, 0x58, 0x11, 0x46, 0xb5, 0x69, 0x5d, 0x50, 0x6e, 0x3b, 0x31, 0x62, 0xbf, 0x19, - 0x90, 0x99, 0xce, 0x85, 0xc3, 0x8d, 0xc5, 0xe0, 0x2e, 0x79, 0xe4, 0x6e, 0x5d, 0xea, 0xff, 0x04, - 0xb4, 0x7f, 0xca, 0x42, 0x6e, 0x73, 0xad, 0x21, 0xaf, 0x8a, 0x88, 0xbf, 0x6e, 0xd0, 0x46, 0xc7, - 0xec, 0xdd, 0xa3, 0xae, 0xd9, 0xda, 0x53, 0x6b, 0x6f, 0xe4, 0xaa, 0x48, 0x92, 0x03, 0x53, 0xa4, - 0xc8, 0x6b, 0x30, 0x6d, 0xe8, 0xcb, 0xd4, 0x65, 0xd2, 0x85, 0x39, 0x5a, 0xd4, 0x5c, 0x9c, 0x60, - 0x58, 0x5e, 0x0a, 0xc5, 0x31, 0x06, 0x46, 0xb6, 0x00, 0x8c, 0x10, 0xfa, 0x48, 0x91, 0x74, 0xf9, - 0x5f, 0x85, 0x10, 0x38, 0x02, 0x44, 0x10, 0xca, 0x1d, 0xce, 0x2a, 0x50, 0xf3, 0x47, 0x41, 0x15, - 0x93, 0xee, 0xb6, 0x2f, 0x8b, 0x21, 0x8c, 0xf6, 0xef, 0x19, 0x08, 0x37, 0x81, 0xc4, 0x83, 0x62, - 0x53, 0xdc, 0xda, 0x56, 0xd3, 0x7e, 0xfc, 0xcd, 0x74, 0xfc, 0x6f, 0x26, 0x75, 0xb2, 0x3f, 0xa8, - 0x25, 0xfe, 0x70, 0x82, 0x4a, 0x15, 0x69, 0x43, 0xee, 0x4d, 0x67, 0x7b, 0xe2, 0x59, 0x1f, 0x39, - 0xff, 0x23, 0x77, 0x4e, 0x91, 0x02, 0xe4, 0x1a, 0xb4, 0x6f, 0x67, 0xa1, 0x12, 0x19, 0xd3, 0x13, - 0xff, 0x94, 0xe0, 0x61, 0xe2, 0xa7, 0x04, 0x1b, 0xe3, 0xef, 0xca, 0xc3, 0x5a, 0x9d, 0xf4, 0x7f, - 0x09, 0xfe, 0x26, 0x0b, 0xb9, 0xad, 0x95, 0x55, 0xbe, 0xf8, 0x06, 0xe7, 0x80, 0x26, 0x4e, 0x4c, - 0x85, 0x3f, 0x4c, 0x13, 0x23, 0x2d, 0x78, 0xc5, 0x50, 0x07, 0xd9, 0x81, 0xa9, 0xed, 0xbe, 0x69, - 0x31, 0xd3, 0x9e, 0xf8, 0xd4, 0x99, 0xff, 0x0f, 0x07, 0x75, 0x5c, 0x46, 0xa2, 0xa2, 0x0f, 0x4f, - 0xda, 0x30, 0xd5, 0x96, 0xd7, 0x40, 0xd4, 0xdc, 0x7b, 0x69, 0xfc, 0xd5, 0x4b, 0xe2, 0x48, 0x45, - 0xea, 0x05, 0x7d, 0x74, 0xed, 0x9b, 0xa0, 0x16, 0x7f, 0xe2, 0x9d, 0x4c, 0x6b, 0x06, 0x81, 0xa1, - 0xb4, 0x16, 0xd5, 0xfe, 0x23, 0x03, 0x71, 0x2b, 0xfd, 0xc9, 0x77, 0x6a, 0x27, 0xd9, 0xa9, 0x2b, - 0xc7, 0x31, 0x07, 0xd2, 0xfb, 0x55, 0xfb, 0xab, 0x2c, 0x14, 0xd5, 0x9f, 0x44, 0x4f, 0x3e, 0xfb, - 0x41, 0x63, 0xd9, 0x8f, 0xe5, 0x09, 0xff, 0xab, 0x38, 0x32, 0xf7, 0xd1, 0x4d, 0xe4, 0x3e, 0x26, - 0xfd, 0x81, 0xe3, 0x63, 0x32, 0x1f, 0x7f, 0x97, 0x81, 0x53, 0x92, 0xf1, 0xa6, 0xed, 0x31, 0xdd, - 0x36, 0x84, 0x53, 0x2c, 0x23, 0x51, 0x13, 0x87, 0xf6, 0x54, 0x18, 0x5a, 0xb8, 0xab, 0xf2, 0x19, - 0x15, 0x34, 0xdf, 0x2c, 0xef, 0x38, 0x1e, 0x13, 0xe6, 0x36, 0x1b, 0xdf, 0x64, 0xbf, 0xac, 0xca, - 0x31, 0xe0, 0x48, 0xee, 0xde, 0x0b, 0xa3, 0x77, 0xef, 0xda, 0x9f, 0x66, 0x60, 0x3a, 0xfa, 0xeb, - 0xca, 0xf1, 0x13, 0x39, 0x89, 0x3c, 0x4a, 0xf6, 0x04, 0xf2, 0x28, 0x1f, 0x66, 0x00, 0xfc, 0xca, - 0x9e, 0x78, 0x16, 0xa5, 0x19, 0xcf, 0xa2, 0x4c, 0xdc, 0xad, 0xe9, 0x39, 0x94, 0x1f, 0x14, 0xfc, - 0x4f, 0x12, 0x19, 0x94, 0x77, 0x33, 0x70, 0x4a, 0x8f, 0x65, 0x25, 0x26, 0xf6, 0x24, 0x12, 0x49, - 0x8e, 0xe0, 0x57, 0x9f, 0xf1, 0x72, 0x4c, 0xa8, 0x25, 0xd7, 0x60, 0xba, 0xa7, 0x42, 0xc5, 0x77, - 0xc2, 0x51, 0x17, 0x1c, 0x40, 0xde, 0x88, 0xd0, 0x30, 0xc6, 0xf9, 0x98, 0x2c, 0x50, 0xee, 0x58, - 0xb2, 0x40, 0xd1, 0xa3, 0x66, 0xf9, 0x03, 0x8f, 0x9a, 0xd9, 0x50, 0x6e, 0xb9, 0x4e, 0x57, 0x24, - 0x5a, 0xd4, 0x8f, 0x15, 0x27, 0x4c, 0xde, 0x04, 0x8b, 0xca, 0xaa, 0x8f, 0x8b, 0xa1, 0x0a, 0xbe, - 0x4c, 0x33, 0x47, 0x6a, 0x2b, 0x1e, 0x87, 0xb6, 0x60, 0xea, 0x6e, 0x4a, 0x54, 0xf4, 0xe1, 0xe3, - 0xc9, 0x94, 0xa9, 0x4f, 0x26, 0x99, 0xa2, 0xfd, 0x63, 0xd6, 0xb7, 0x17, 0x8d, 0xc4, 0x9d, 0xa4, - 0xcc, 0x88, 0x3b, 0x49, 0xea, 0x76, 0x6d, 0x34, 0xdd, 0xf0, 0x3c, 0x14, 0x5d, 0xaa, 0x7b, 0x8e, - 0xad, 0xee, 0xa9, 0x07, 0xd6, 0x16, 0x45, 0x29, 0x2a, 0x6a, 0x34, 0x2d, 0x91, 0x7d, 0x4c, 0x5a, - 0xe2, 0x0b, 0x91, 0x01, 0x21, 0xf3, 0xbf, 0xc1, 0xdc, 0x4e, 0x19, 0x14, 0x22, 0x66, 0xa9, 0xfe, - 0xd7, 0x5f, 0x48, 0xc6, 0x2c, 0xd5, 0xbf, 0xf4, 0x03, 0x0e, 0xd2, 0x84, 0x69, 0x4b, 0xf7, 0x98, - 0x88, 0x4a, 0x35, 0x97, 0xd8, 0x18, 0x39, 0x8f, 0x60, 0xda, 0xac, 0x45, 0x70, 0x30, 0x86, 0xaa, - 0xfd, 0x6e, 0x06, 0xc2, 0x26, 0x3f, 0x62, 0x74, 0xf4, 0x15, 0x28, 0x75, 0xf5, 0x87, 0x2b, 0xd4, - 0xd2, 0xf7, 0x26, 0xf9, 0xfb, 0xd5, 0xba, 0xc2, 0xc0, 0x00, 0x4d, 0x1b, 0x64, 0x40, 0xdd, 0xd8, - 0x25, 0x14, 0x0a, 0x2d, 0xf3, 0xa1, 0xaa, 0xcf, 0x24, 0x9e, 0x4a, 0xe4, 0x7f, 0x6b, 0x32, 0xbe, - 0x20, 0x0a, 0x50, 0xa2, 0x93, 0x2e, 0x4c, 0x79, 0x32, 0xfc, 0xa3, 0x3e, 0x65, 0xfc, 0x5d, 0x79, - 0x2c, 0x8c, 0xa4, 0xae, 0xfb, 0xca, 0x22, 0xf4, 0x75, 0xd4, 0xe7, 0x3f, 0xf8, 0x78, 0xee, 0xa9, - 0x0f, 0x3f, 0x9e, 0x7b, 0xea, 0xa3, 0x8f, 0xe7, 0x9e, 0xfa, 0xd6, 0xfe, 0x5c, 0xe6, 0x83, 0xfd, - 0xb9, 0xcc, 0x87, 0xfb, 0x73, 0x99, 0x8f, 0xf6, 0xe7, 0x32, 0xff, 0xba, 0x3f, 0x97, 0xf9, 0x9d, - 0x7f, 0x9b, 0x7b, 0xea, 0xd5, 0x92, 0x8f, 0xf9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x1a, - 0xd1, 0x0d, 0x1f, 0x64, 0x00, 0x00, + 0x42, 0x5a, 0xb1, 0x0a, 0x12, 0x12, 0x12, 0x02, 0x69, 0x25, 0x1e, 0xd8, 0x17, 0x78, 0x80, 0x27, + 0x14, 0x78, 0x80, 0x3c, 0x20, 0x11, 0x04, 0x6a, 0x11, 0xf3, 0xc4, 0x03, 0x68, 0xa5, 0x7d, 0x59, + 0x8d, 0x90, 0x40, 0xf7, 0xa3, 0x3e, 0xbb, 0xda, 0x63, 0x77, 0xdb, 0xd9, 0x89, 0x78, 0xab, 0xba, + 0xf7, 0x9c, 0xdf, 0xb9, 0x9f, 0xe7, 0x9e, 0x7b, 0xce, 0xbd, 0x17, 0x6e, 0xb4, 0x4d, 0xb6, 0xd3, + 0xdf, 0x9e, 0x37, 0x9c, 0xee, 0x82, 0xdd, 0xef, 0xea, 0x3d, 0xd7, 0x79, 0x53, 0x7c, 0xb4, 0x2c, + 0xe7, 0xc1, 0x42, 0xaf, 0xd3, 0x5e, 0xd0, 0x7b, 0xa6, 0x17, 0xa6, 0xec, 0x5e, 0xd5, 0xad, 0xde, + 0x8e, 0x7e, 0x75, 0xa1, 0x4d, 0x6d, 0xea, 0xea, 0x8c, 0x36, 0xe7, 0x7b, 0xae, 0xc3, 0x1c, 0xf2, + 0xe5, 0x10, 0x68, 0xde, 0x07, 0x9a, 0xf7, 0xd9, 0xe6, 0x7b, 0x9d, 0xf6, 0x3c, 0x07, 0x0a, 0x53, + 0x7c, 0xa0, 0xd9, 0x2f, 0x46, 0x4a, 0xd0, 0x76, 0xda, 0xce, 0x82, 0xc0, 0xdb, 0xee, 0xb7, 0xc4, + 0x9f, 0xf8, 0x11, 0x5f, 0x52, 0xce, 0xac, 0xd6, 0xb9, 0xe6, 0xcd, 0x9b, 0x0e, 0x2f, 0xd6, 0x82, + 0xe1, 0xb8, 0x74, 0x61, 0x77, 0xa8, 0x2c, 0xb3, 0x2f, 0x84, 0x34, 0x5d, 0xdd, 0xd8, 0x31, 0x6d, + 0xea, 0xee, 0xf9, 0x75, 0x59, 0x70, 0xa9, 0xe7, 0xf4, 0x5d, 0x83, 0x1e, 0x89, 0xcb, 0x5b, 0xe8, + 0x52, 0xa6, 0xa7, 0xc9, 0x5a, 0x18, 0xc5, 0xe5, 0xf6, 0x6d, 0x66, 0x76, 0x87, 0xc5, 0xfc, 0xfc, + 0xe3, 0x18, 0x3c, 0x63, 0x87, 0x76, 0xf5, 0x24, 0x9f, 0xf6, 0x2f, 0x65, 0x38, 0xb7, 0xb4, 0xed, + 0x31, 0x57, 0x37, 0xd8, 0x86, 0xd3, 0xdc, 0xa4, 0xdd, 0x9e, 0xa5, 0x33, 0x4a, 0x3a, 0x50, 0xe2, + 0x65, 0x6b, 0xea, 0x4c, 0xaf, 0x66, 0x2e, 0x67, 0xae, 0x54, 0x16, 0x97, 0xe6, 0xc7, 0xec, 0x8b, + 0xf9, 0x75, 0x05, 0x54, 0x9f, 0xde, 0x1f, 0xd4, 0x4a, 0xfe, 0x1f, 0x06, 0x02, 0xc8, 0xf7, 0x32, + 0x30, 0x6d, 0x3b, 0x4d, 0xda, 0xa0, 0x16, 0x35, 0x98, 0xe3, 0x56, 0xb3, 0x97, 0x73, 0x57, 0x2a, + 0x8b, 0xaf, 0x8f, 0x2d, 0x31, 0xa5, 0x46, 0xf3, 0x77, 0x22, 0x02, 0xae, 0xdb, 0xcc, 0xdd, 0xab, + 0x3f, 0xfd, 0xc1, 0xa0, 0xf6, 0xd4, 0xfe, 0xa0, 0x36, 0x1d, 0xcd, 0xc2, 0x58, 0x49, 0xc8, 0x16, + 0x54, 0x98, 0x63, 0xf1, 0x26, 0x33, 0x1d, 0xdb, 0xab, 0xe6, 0x44, 0xc1, 0xe6, 0xe6, 0x65, 0x6b, + 0x73, 0xf1, 0xf3, 0x7c, 0xb8, 0xcc, 0xef, 0x5e, 0x9d, 0xdf, 0x0c, 0xc8, 0xea, 0xe7, 0x14, 0x70, + 0x25, 0x4c, 0xf3, 0x30, 0x8a, 0x43, 0x28, 0x9c, 0xf6, 0xa8, 0xd1, 0x77, 0x4d, 0xb6, 0xb7, 0xec, + 0xd8, 0x8c, 0x3e, 0x64, 0xd5, 0xbc, 0x68, 0xe5, 0xe7, 0xd3, 0xa0, 0x37, 0x9c, 0x66, 0x23, 0x4e, + 0x5d, 0x3f, 0xb7, 0x3f, 0xa8, 0x9d, 0x4e, 0x24, 0x62, 0x12, 0x93, 0xd8, 0x70, 0xc6, 0xec, 0xea, + 0x6d, 0xba, 0xd1, 0xb7, 0xac, 0x06, 0x35, 0x5c, 0xca, 0xbc, 0x6a, 0x41, 0x54, 0xe1, 0x4a, 0x9a, + 0x9c, 0x35, 0xc7, 0xd0, 0xad, 0xbb, 0xdb, 0x6f, 0x52, 0x83, 0x21, 0x6d, 0x51, 0x97, 0xda, 0x06, + 0xad, 0x57, 0x55, 0x65, 0xce, 0xdc, 0x4c, 0x20, 0xe1, 0x10, 0x36, 0xb9, 0x01, 0x67, 0x7b, 0xae, + 0xe9, 0x88, 0x22, 0x58, 0xba, 0xe7, 0xdd, 0xd1, 0xbb, 0xb4, 0x5a, 0xbc, 0x9c, 0xb9, 0x52, 0xae, + 0x5f, 0x54, 0x30, 0x67, 0x37, 0x92, 0x04, 0x38, 0xcc, 0x43, 0xae, 0x40, 0xc9, 0x4f, 0xac, 0x4e, + 0x5d, 0xce, 0x5c, 0x29, 0xc8, 0xb1, 0xe3, 0xf3, 0x62, 0x90, 0x4b, 0x56, 0xa1, 0xa4, 0xb7, 0x5a, + 0xa6, 0xcd, 0x29, 0x4b, 0xa2, 0x09, 0x2f, 0xa5, 0x55, 0x6d, 0x49, 0xd1, 0x48, 0x1c, 0xff, 0x0f, + 0x03, 0x5e, 0x72, 0x0b, 0x88, 0x47, 0xdd, 0x5d, 0xd3, 0xa0, 0x4b, 0x86, 0xe1, 0xf4, 0x6d, 0x26, + 0xca, 0x5e, 0x16, 0x65, 0x9f, 0x55, 0x65, 0x27, 0x8d, 0x21, 0x0a, 0x4c, 0xe1, 0x22, 0x2f, 0xc1, + 0x19, 0x35, 0xed, 0xc2, 0x56, 0x00, 0x81, 0xf4, 0x34, 0x6f, 0x48, 0x4c, 0xe4, 0xe1, 0x10, 0x35, + 0x69, 0xc2, 0x25, 0xbd, 0xcf, 0x9c, 0x2e, 0x87, 0x8c, 0x0b, 0xdd, 0x74, 0x3a, 0xd4, 0xae, 0x56, + 0x2e, 0x67, 0xae, 0x94, 0xea, 0x97, 0xf7, 0x07, 0xb5, 0x4b, 0x4b, 0x07, 0xd0, 0xe1, 0x81, 0x28, + 0xe4, 0x2e, 0x94, 0x9b, 0xb6, 0xb7, 0xe1, 0x58, 0xa6, 0xb1, 0x57, 0x9d, 0x16, 0x05, 0xbc, 0xaa, + 0xaa, 0x5a, 0x5e, 0xb9, 0xd3, 0x90, 0x19, 0x8f, 0x06, 0xb5, 0x4b, 0xc3, 0xda, 0x71, 0x3e, 0xc8, + 0xc7, 0x10, 0x83, 0xac, 0x0b, 0xc0, 0x65, 0xc7, 0x6e, 0x99, 0xed, 0xea, 0x8c, 0xe8, 0x8d, 0xcb, + 0x23, 0x06, 0xf4, 0xca, 0x9d, 0x86, 0xa4, 0xab, 0xcf, 0x28, 0x71, 0xf2, 0x17, 0x43, 0x84, 0xd9, + 0x17, 0xe1, 0xec, 0xd0, 0xac, 0x25, 0x67, 0x20, 0xd7, 0xa1, 0x7b, 0x42, 0x29, 0x95, 0x91, 0x7f, + 0x92, 0xa7, 0xa1, 0xb0, 0xab, 0x5b, 0x7d, 0x5a, 0xcd, 0x8a, 0x34, 0xf9, 0xf3, 0x0b, 0xd9, 0x6b, + 0x19, 0x6d, 0x50, 0x86, 0x53, 0xbe, 0x2e, 0xb8, 0x47, 0x5d, 0x46, 0x1f, 0x92, 0xcb, 0x90, 0xb7, + 0x79, 0x7f, 0x08, 0xfe, 0xfa, 0xb4, 0xaa, 0x6e, 0x5e, 0xf4, 0x83, 0xc8, 0x21, 0x06, 0x14, 0xa5, + 0x2e, 0x17, 0x78, 0x95, 0xc5, 0x17, 0xc7, 0x56, 0x43, 0x0d, 0x01, 0x53, 0x87, 0xfd, 0x41, 0xad, + 0x28, 0xbf, 0x51, 0x41, 0x93, 0xd7, 0x20, 0xef, 0x99, 0x76, 0xa7, 0x9a, 0x13, 0x22, 0xbe, 0x3a, + 0xbe, 0x08, 0xd3, 0xee, 0xd4, 0x4b, 0xbc, 0x06, 0xfc, 0x0b, 0x05, 0x28, 0xb9, 0x0f, 0xb9, 0x7e, + 0xb3, 0xa5, 0x34, 0xca, 0x2f, 0x8d, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4, 0x72, + 0x5b, 0x2b, 0xab, 0xc8, 0x11, 0xc9, 0x77, 0x33, 0x70, 0xd6, 0x70, 0x6c, 0xa6, 0xf3, 0xf5, 0xc5, + 0xd7, 0xac, 0xd5, 0x82, 0x90, 0x73, 0x6b, 0x6c, 0x39, 0xcb, 0x49, 0xc4, 0xfa, 0x79, 0xae, 0x28, + 0x86, 0x92, 0x71, 0x58, 0x36, 0xf9, 0x7e, 0x06, 0xce, 0xf3, 0x09, 0x3c, 0x44, 0x2c, 0xd4, 0xce, + 0xf1, 0x96, 0xea, 0xe2, 0xfe, 0xa0, 0x76, 0xfe, 0x66, 0x9a, 0x30, 0x4c, 0x2f, 0x03, 0x2f, 0xdd, + 0x39, 0x7d, 0x78, 0x2d, 0x12, 0x2a, 0xad, 0xb2, 0xb8, 0x76, 0x9c, 0xeb, 0x5b, 0xfd, 0x33, 0x6a, + 0x28, 0xa7, 0x2d, 0xe7, 0x98, 0x56, 0x0a, 0x72, 0x1d, 0xa6, 0x76, 0x1d, 0xab, 0xdf, 0xa5, 0x5e, + 0xb5, 0x24, 0x16, 0x85, 0xd9, 0xb4, 0xb9, 0x7a, 0x4f, 0x90, 0xd4, 0x4f, 0x2b, 0xf8, 0x29, 0xf9, + 0xef, 0xa1, 0xcf, 0x4b, 0x4c, 0x28, 0x5a, 0x66, 0xd7, 0x64, 0x9e, 0xd0, 0x96, 0x95, 0xc5, 0xeb, + 0x63, 0x57, 0x4b, 0x4e, 0xd1, 0x35, 0x01, 0x26, 0x67, 0x8d, 0xfc, 0x46, 0x25, 0x80, 0x18, 0x50, + 0xf0, 0x0c, 0xdd, 0x92, 0xda, 0xb4, 0xb2, 0xf8, 0xb5, 0xf1, 0xa7, 0x0d, 0x47, 0xa9, 0xcf, 0xa8, + 0x3a, 0x15, 0xc4, 0x2f, 0x4a, 0x6c, 0xf2, 0x2b, 0x70, 0x2a, 0xd6, 0x9b, 0x5e, 0xb5, 0x22, 0x5a, + 0xe7, 0xd9, 0xb4, 0xd6, 0x09, 0xa8, 0xea, 0x17, 0x14, 0xd8, 0xa9, 0xd8, 0x08, 0xf1, 0x30, 0x01, + 0x46, 0x6e, 0x43, 0xc9, 0x33, 0x9b, 0xd4, 0xd0, 0x5d, 0xaf, 0x3a, 0x7d, 0x18, 0xe0, 0x33, 0x0a, + 0xb8, 0xd4, 0x50, 0x6c, 0x18, 0x00, 0x68, 0xf7, 0x61, 0x66, 0xa9, 0xcf, 0x76, 0x1c, 0xd7, 0x7c, + 0x5b, 0x58, 0x16, 0x64, 0x15, 0x0a, 0x4c, 0xac, 0x10, 0xd2, 0x68, 0x7b, 0x2e, 0x0d, 0x5a, 0xae, + 0xd6, 0xb7, 0xe9, 0x9e, 0xaf, 0x58, 0xeb, 0x65, 0xde, 0x08, 0x72, 0xc5, 0x90, 0xec, 0xda, 0x1f, + 0x66, 0xa0, 0x5c, 0xd7, 0x3d, 0xd3, 0xe0, 0xf0, 0x64, 0x19, 0xf2, 0x7d, 0x8f, 0xba, 0x47, 0x03, + 0x15, 0x5a, 0x69, 0xcb, 0xa3, 0x2e, 0x0a, 0x66, 0x72, 0x17, 0x4a, 0x3d, 0xdd, 0xf3, 0x1e, 0x38, + 0x6e, 0x53, 0x69, 0xd6, 0x43, 0x02, 0xc9, 0xa5, 0x5f, 0xb1, 0x62, 0x00, 0xa2, 0x55, 0xa0, 0x5c, + 0xb7, 0x74, 0xa3, 0xb3, 0xe3, 0x58, 0x54, 0x7b, 0x15, 0x8a, 0xf5, 0x7e, 0xab, 0x45, 0xdd, 0x43, + 0x68, 0xf8, 0x79, 0xc8, 0xb3, 0xbd, 0x9e, 0x5a, 0x2f, 0x82, 0xd5, 0x3d, 0xbf, 0xb9, 0xd7, 0xa3, + 0x8f, 0x06, 0x35, 0x90, 0x38, 0xfc, 0x0f, 0x05, 0x9d, 0xf6, 0xe3, 0x0c, 0x9c, 0x93, 0x89, 0x6a, + 0x15, 0x95, 0xeb, 0x13, 0xa1, 0x50, 0x70, 0x69, 0xd3, 0xf4, 0x54, 0xbb, 0xac, 0x8c, 0x3d, 0x1c, + 0x91, 0xa3, 0xa8, 0xe5, 0x50, 0xf4, 0x85, 0x48, 0x40, 0x89, 0x4e, 0xfa, 0x50, 0x7e, 0x93, 0x32, + 0x8f, 0xb9, 0x54, 0xef, 0xaa, 0x96, 0x7b, 0x79, 0x6c, 0x51, 0xb7, 0x28, 0x6b, 0x08, 0xa4, 0xe8, + 0xea, 0x1b, 0x24, 0x62, 0x28, 0x49, 0xfb, 0x49, 0x1e, 0xca, 0xc1, 0x28, 0x24, 0x9f, 0x83, 0x82, + 0x30, 0xf7, 0x54, 0xb3, 0x06, 0x53, 0x47, 0x58, 0x85, 0x28, 0xf3, 0xc8, 0x73, 0x30, 0x65, 0x38, + 0xdd, 0xae, 0x6e, 0x37, 0x85, 0x09, 0x5f, 0xae, 0x57, 0xb8, 0xc6, 0x58, 0x96, 0x49, 0xe8, 0xe7, + 0x91, 0x4b, 0x90, 0xd7, 0xdd, 0xb6, 0xb4, 0xa6, 0xcb, 0x72, 0x9c, 0x2c, 0xb9, 0x6d, 0x0f, 0x45, + 0x2a, 0xf9, 0x0a, 0xe4, 0xa8, 0xbd, 0x5b, 0xcd, 0x8f, 0x56, 0x49, 0xd7, 0xed, 0xdd, 0x7b, 0xba, + 0x5b, 0xaf, 0xa8, 0x32, 0xe4, 0xae, 0xdb, 0xbb, 0xc8, 0x79, 0xc8, 0x1a, 0x4c, 0x51, 0x7b, 0x77, + 0xd5, 0x75, 0xba, 0xca, 0xcc, 0xfd, 0xec, 0x08, 0x76, 0x4e, 0xa2, 0x56, 0xe7, 0x40, 0xb1, 0xa9, + 0x64, 0xf4, 0x21, 0xc8, 0x37, 0x60, 0x5a, 0xea, 0xb8, 0x75, 0x6e, 0x32, 0x79, 0xd5, 0xa2, 0x80, + 0xac, 0x8d, 0x56, 0x92, 0x82, 0x2e, 0xdc, 0x56, 0x44, 0x12, 0x3d, 0x8c, 0x41, 0x91, 0x6f, 0x40, + 0xd9, 0xdf, 0x31, 0x7a, 0x6a, 0x35, 0x48, 0xb5, 0xc8, 0x51, 0x11, 0x21, 0x7d, 0xab, 0x6f, 0xba, + 0xb4, 0x4b, 0x6d, 0xe6, 0xd5, 0xcf, 0xfa, 0x36, 0x9a, 0x9f, 0xeb, 0x61, 0x88, 0x46, 0xb6, 0x87, + 0xb7, 0x16, 0xd2, 0x2e, 0xfe, 0xdc, 0x88, 0xd9, 0x36, 0xc6, 0xbe, 0xe2, 0x75, 0x38, 0x1d, 0xd8, + 0xfe, 0xca, 0x7c, 0x94, 0x96, 0xf2, 0x0b, 0x9c, 0xfd, 0x66, 0x3c, 0xeb, 0xd1, 0xa0, 0xf6, 0x6c, + 0x8a, 0x01, 0x19, 0x12, 0x60, 0x12, 0x4c, 0xfb, 0xab, 0x1c, 0x0c, 0x2f, 0xff, 0xf1, 0x46, 0xcb, + 0x1c, 0x77, 0xa3, 0x25, 0x2b, 0x24, 0x95, 0xc3, 0x35, 0xc5, 0x36, 0x79, 0xa5, 0xd2, 0x3a, 0x26, + 0x77, 0xdc, 0x1d, 0xf3, 0xa4, 0xcc, 0x1d, 0xed, 0xbd, 0x3c, 0x9c, 0x5a, 0xd1, 0x69, 0xd7, 0xb1, + 0x1f, 0x6b, 0x0c, 0x65, 0x9e, 0x08, 0x63, 0xe8, 0x0a, 0x94, 0x5c, 0xda, 0xb3, 0x4c, 0x43, 0xf7, + 0x44, 0xd7, 0xab, 0x1d, 0x27, 0xaa, 0x34, 0x0c, 0x72, 0x47, 0x18, 0xc1, 0xb9, 0x27, 0xd2, 0x08, + 0xce, 0xff, 0xf4, 0x8d, 0x60, 0xed, 0xfd, 0x1c, 0xe4, 0xaf, 0x37, 0xdb, 0x94, 0x2f, 0xcc, 0x2d, + 0x3e, 0xbc, 0x12, 0x0b, 0xb3, 0x18, 0x38, 0x22, 0x87, 0xcc, 0x42, 0x96, 0x39, 0x6a, 0xe6, 0x81, + 0xca, 0xcf, 0x6e, 0x3a, 0x98, 0x65, 0x0e, 0x79, 0x1b, 0xc0, 0x70, 0xec, 0xa6, 0xe9, 0x3b, 0x62, + 0x26, 0xab, 0xd8, 0xaa, 0xe3, 0x3e, 0xd0, 0xdd, 0xe6, 0x72, 0x80, 0x58, 0x3f, 0xb5, 0x3f, 0xa8, + 0x41, 0xf8, 0x8f, 0x11, 0x69, 0xa4, 0x1d, 0x98, 0xb8, 0xb2, 0x41, 0x97, 0xc7, 0x96, 0xcb, 0x1b, + 0xe2, 0x00, 0x03, 0xf7, 0x2a, 0x54, 0x7a, 0xba, 0xab, 0x5b, 0x16, 0xb5, 0x4c, 0xaf, 0x2b, 0x76, + 0x56, 0x85, 0xfa, 0xe9, 0xfd, 0x41, 0xad, 0xb2, 0x11, 0x26, 0x63, 0x94, 0x86, 0xbc, 0x08, 0x45, + 0xc7, 0x5e, 0xed, 0x5b, 0x96, 0x72, 0xb4, 0xfc, 0x3f, 0x0e, 0x7b, 0x57, 0xa4, 0x3c, 0x1a, 0xd4, + 0x2e, 0x4a, 0xbb, 0x85, 0xff, 0xdd, 0x77, 0x4d, 0x66, 0xda, 0xed, 0x06, 0x73, 0x75, 0x46, 0xdb, + 0x7b, 0xa8, 0xd8, 0xb4, 0xdf, 0xce, 0x00, 0x84, 0xc5, 0x22, 0x5f, 0x85, 0xd3, 0xdb, 0x82, 0x67, + 0x5d, 0x7f, 0xb8, 0x46, 0xed, 0x36, 0xdb, 0x11, 0x1d, 0x96, 0x97, 0x1a, 0xa8, 0x1e, 0xcf, 0xc2, + 0x24, 0x2d, 0x79, 0x09, 0xce, 0xc8, 0xa4, 0x2d, 0x4f, 0x57, 0x98, 0xa2, 0x43, 0x67, 0xa4, 0xef, + 0xa3, 0x9e, 0xc8, 0xc3, 0x21, 0x6a, 0x4d, 0x87, 0xca, 0xaa, 0xf9, 0x90, 0x36, 0xef, 0x9b, 0x76, + 0xd3, 0x79, 0x40, 0x10, 0x8a, 0x56, 0x58, 0x8c, 0xca, 0xe2, 0x7c, 0x44, 0x2d, 0x05, 0xae, 0xce, + 0xb0, 0xc9, 0xbb, 0x94, 0xe9, 0x5c, 0x51, 0xad, 0xf4, 0x95, 0x33, 0x4e, 0x36, 0xb3, 0x2c, 0xad, + 0x42, 0xd2, 0x5e, 0x80, 0xb3, 0x43, 0x03, 0x80, 0xd4, 0xa0, 0xd0, 0xa1, 0x7b, 0x37, 0xb9, 0xe9, + 0xcc, 0xcd, 0x12, 0x61, 0x87, 0xdd, 0xe6, 0x09, 0x28, 0xd3, 0xb5, 0xff, 0xce, 0x40, 0x69, 0xb5, + 0x6f, 0x1b, 0xc2, 0xd0, 0x7e, 0xbc, 0x95, 0xe9, 0x5b, 0x39, 0xd9, 0x54, 0x2b, 0xa7, 0x0f, 0xc5, + 0xce, 0x83, 0xc0, 0x0a, 0xaa, 0x2c, 0xae, 0x8f, 0x3f, 0x94, 0x55, 0x91, 0xe6, 0x6f, 0x0b, 0x3c, + 0xe9, 0xdb, 0x3c, 0xa5, 0x0a, 0x54, 0xbc, 0x7d, 0x5f, 0x08, 0x55, 0xc2, 0x66, 0xbf, 0x02, 0x95, + 0x08, 0xd9, 0x91, 0x9c, 0x29, 0x3f, 0xc9, 0xc0, 0xe9, 0x1b, 0xd2, 0x7d, 0xec, 0xb8, 0x72, 0x01, + 0x20, 0x17, 0x21, 0xe7, 0xf6, 0xfa, 0x82, 0x3f, 0x27, 0x7d, 0x05, 0xb8, 0xb1, 0x85, 0x3c, 0x8d, + 0xbc, 0x02, 0xa5, 0xa6, 0xea, 0x03, 0x65, 0xb4, 0x1e, 0xb5, 0xe7, 0x84, 0x02, 0xf6, 0xff, 0x30, + 0x40, 0xe3, 0x56, 0x66, 0xd7, 0x6b, 0x37, 0xcc, 0xb7, 0xa5, 0xd6, 0x2d, 0x48, 0x2b, 0x73, 0x5d, + 0x26, 0xa1, 0x9f, 0xc7, 0x35, 0x7a, 0x87, 0xee, 0x2d, 0x73, 0x83, 0x4b, 0x4c, 0x5b, 0xa5, 0xd1, + 0x6f, 0xab, 0x34, 0x0c, 0x72, 0x79, 0xcf, 0xcb, 0x3a, 0x17, 0xc4, 0x40, 0x17, 0x3d, 0x7f, 0x8f, + 0x27, 0xa8, 0xea, 0x6b, 0xdf, 0xcd, 0xc2, 0x85, 0x1b, 0x94, 0xc9, 0x05, 0x6d, 0x85, 0xf6, 0x2c, + 0x67, 0x8f, 0x5b, 0x15, 0x48, 0xdf, 0x22, 0x2f, 0x01, 0x98, 0xde, 0x76, 0x63, 0xd7, 0xe0, 0xfb, + 0x05, 0x35, 0x1a, 0x2e, 0xab, 0xc6, 0x87, 0x9b, 0x8d, 0xba, 0xca, 0x79, 0x14, 0xfb, 0xc3, 0x08, + 0x4f, 0x68, 0x59, 0x67, 0x0f, 0xb0, 0xac, 0x1b, 0x00, 0xbd, 0xd0, 0x36, 0xc9, 0x09, 0xca, 0x9f, + 0xf3, 0xc5, 0x1c, 0xc5, 0x2c, 0x89, 0xc0, 0x4c, 0x60, 0x2d, 0x68, 0x7f, 0x91, 0x83, 0xd9, 0x1b, + 0x94, 0x05, 0x1b, 0x07, 0xb5, 0x31, 0x6a, 0xf4, 0xa8, 0xc1, 0x5b, 0xe5, 0xdd, 0x0c, 0x14, 0x2d, + 0x7d, 0x9b, 0x5a, 0x9e, 0x98, 0x4d, 0x95, 0xc5, 0x37, 0xc6, 0x1e, 0xde, 0xa3, 0xa5, 0xcc, 0xaf, + 0x09, 0x09, 0x89, 0x01, 0x2f, 0x13, 0x51, 0x89, 0x27, 0x5f, 0x82, 0x8a, 0x61, 0xf5, 0x3d, 0x46, + 0xdd, 0x0d, 0xc7, 0x65, 0x6a, 0x69, 0x0f, 0x1c, 0xf4, 0xcb, 0x61, 0x16, 0x46, 0xe9, 0xc8, 0x22, + 0x80, 0x61, 0x99, 0xd4, 0x66, 0x82, 0x4b, 0x0e, 0x33, 0xe2, 0xb7, 0xf7, 0x72, 0x90, 0x83, 0x11, + 0x2a, 0x2e, 0xaa, 0xeb, 0xd8, 0x26, 0x73, 0xa4, 0xa8, 0x7c, 0x5c, 0xd4, 0x7a, 0x98, 0x85, 0x51, + 0x3a, 0xc1, 0x46, 0x99, 0x6b, 0x1a, 0x9e, 0x60, 0x2b, 0x24, 0xd8, 0xc2, 0x2c, 0x8c, 0xd2, 0xf1, + 0x99, 0x1c, 0xa9, 0xff, 0x91, 0x66, 0xf2, 0x5f, 0x96, 0x60, 0x2e, 0xd6, 0xac, 0x4c, 0x67, 0xb4, + 0xd5, 0xb7, 0x1a, 0x94, 0xf9, 0x1d, 0xf8, 0x25, 0xa8, 0x28, 0xc7, 0xf6, 0x9d, 0x50, 0xcb, 0x05, + 0x85, 0x6a, 0x84, 0x59, 0x18, 0xa5, 0x23, 0xbf, 0x15, 0xf6, 0xbb, 0x8c, 0xe1, 0x18, 0xc7, 0xd3, + 0xef, 0x43, 0x05, 0x3c, 0x54, 0xdf, 0x2f, 0x40, 0xd9, 0xd6, 0x99, 0x27, 0x26, 0x92, 0x9a, 0x33, + 0xc1, 0x36, 0xe0, 0x8e, 0x9f, 0x81, 0x21, 0x0d, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, + 0x73, 0x5c, 0x46, 0x5d, 0xc9, 0x9b, 0x17, 0xbc, 0x97, 0x14, 0xef, 0xd3, 0xeb, 0x29, 0x34, 0x98, + 0xca, 0x49, 0xd6, 0xe1, 0x9c, 0x21, 0xfd, 0xda, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, + 0x81, 0x95, 0xba, 0x3c, 0x4c, 0x82, 0x69, 0x7c, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, + 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, + 0xd4, 0x67, 0x3b, 0xd2, 0x05, 0x14, 0x09, 0x9b, 0x04, 0x2d, 0xdf, 0x48, 0xa1, 0xc1, 0x54, 0x4e, + 0xb2, 0x0d, 0xb3, 0x32, 0xfd, 0xba, 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, + 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91, 0x94, 0x78, 0x00, 0x0a, 0xf9, 0x45, 0x98, 0x91, 0xbd, 0xb4, + 0xae, 0xf7, 0x04, 0xac, 0x0c, 0xa2, 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0xd1, 0x4c, 0x8c, 0xd3, 0x92, + 0x25, 0x38, 0xdd, 0xdb, 0x35, 0xf8, 0xe7, 0xcd, 0xd6, 0x1d, 0x4a, 0x9b, 0xb4, 0x29, 0x42, 0x26, + 0xe5, 0xfa, 0x33, 0xfe, 0x9e, 0x73, 0x23, 0x9e, 0x8d, 0x49, 0x7a, 0x72, 0x0d, 0xa6, 0x3d, 0xa6, + 0xbb, 0x4c, 0x79, 0x58, 0xaa, 0xa7, 0x64, 0x90, 0xc9, 0x77, 0x40, 0x34, 0x22, 0x79, 0x18, 0xa3, + 0x9c, 0x44, 0x7b, 0x3c, 0x92, 0x8b, 0xa1, 0x70, 0x51, 0x25, 0xd4, 0xfe, 0x3b, 0x49, 0xb5, 0xff, + 0xda, 0x24, 0xd3, 0x3f, 0x45, 0xc2, 0xa1, 0xa6, 0xfd, 0x2d, 0x20, 0xae, 0x72, 0xa8, 0xc9, 0xad, + 0x48, 0x44, 0xf3, 0x07, 0xa1, 0x3c, 0x1c, 0xa2, 0xc0, 0x14, 0x2e, 0xd2, 0x80, 0xf3, 0x1e, 0xb5, + 0x99, 0x69, 0x53, 0x2b, 0x0e, 0x27, 0x97, 0x84, 0x67, 0x15, 0xdc, 0xf9, 0x46, 0x1a, 0x11, 0xa6, + 0xf3, 0x4e, 0xd2, 0xf8, 0xff, 0x5a, 0x16, 0xeb, 0xae, 0x6c, 0x9a, 0x63, 0x53, 0xdb, 0xef, 0x26, + 0xd5, 0xf6, 0x1b, 0x93, 0xf7, 0xdb, 0x78, 0x2a, 0x7b, 0x11, 0x40, 0xf4, 0x42, 0x54, 0x67, 0x07, + 0x9a, 0x0a, 0x83, 0x1c, 0x8c, 0x50, 0xf1, 0x59, 0xe8, 0xb7, 0x73, 0x54, 0x5d, 0x07, 0xb3, 0xb0, + 0x11, 0xcd, 0xc4, 0x38, 0xed, 0x48, 0x95, 0x5f, 0x18, 0x5b, 0xe5, 0xdf, 0x02, 0x12, 0xdb, 0x08, + 0x4b, 0xbc, 0x62, 0x3c, 0x92, 0x7c, 0x73, 0x88, 0x02, 0x53, 0xb8, 0x46, 0x0c, 0xe5, 0xa9, 0xe3, + 0x1d, 0xca, 0xa5, 0xf1, 0x87, 0x32, 0x79, 0x03, 0x2e, 0x0a, 0x51, 0xaa, 0x7d, 0xe2, 0xc0, 0x52, + 0xf9, 0x7f, 0x56, 0x01, 0x5f, 0xc4, 0x51, 0x84, 0x38, 0x1a, 0x83, 0xf7, 0x8f, 0xe1, 0xd2, 0x26, + 0x17, 0xae, 0x5b, 0xa3, 0x17, 0x86, 0xe5, 0x14, 0x1a, 0x4c, 0xe5, 0xe4, 0x43, 0x8c, 0xf1, 0x61, + 0xa8, 0x6f, 0x5b, 0xb4, 0xa9, 0x22, 0xe9, 0xc1, 0x10, 0xdb, 0x5c, 0x6b, 0xa8, 0x1c, 0x8c, 0x50, + 0xa5, 0xe9, 0xea, 0xe9, 0x23, 0xea, 0xea, 0x1b, 0xc2, 0x6b, 0xd4, 0x8a, 0x2d, 0x09, 0x4a, 0xe1, + 0x07, 0x67, 0x23, 0x96, 0x93, 0x04, 0x38, 0xcc, 0x23, 0x96, 0x4a, 0xc3, 0x35, 0x7b, 0xcc, 0x8b, + 0x63, 0x9d, 0x4a, 0x2c, 0x95, 0x29, 0x34, 0x98, 0xca, 0xc9, 0x8d, 0x94, 0x1d, 0xaa, 0x5b, 0x6c, + 0x27, 0x0e, 0x78, 0x3a, 0x6e, 0xa4, 0xbc, 0x3c, 0x4c, 0x82, 0x69, 0x7c, 0x93, 0xa8, 0xb7, 0xef, + 0x64, 0xe1, 0xdc, 0x0d, 0xaa, 0x62, 0xf5, 0x1b, 0x4e, 0xd3, 0xd7, 0x6b, 0xff, 0x47, 0x77, 0x59, + 0xef, 0x64, 0x61, 0xea, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x3d, 0xd2, 0x86, 0xe2, 0x03, 0xe1, 0x11, + 0x51, 0x7e, 0x90, 0xf1, 0x8f, 0x25, 0x48, 0xc7, 0x4a, 0xa8, 0x82, 0xe5, 0x3f, 0x2a, 0x78, 0xde, + 0x52, 0x1d, 0xba, 0x47, 0x65, 0x90, 0xae, 0x14, 0xb6, 0xd4, 0x6d, 0x9e, 0x88, 0x32, 0x8f, 0xbc, + 0x09, 0x53, 0x1e, 0x73, 0x5c, 0x5f, 0x49, 0x4f, 0xe2, 0x12, 0xdb, 0xa8, 0x7f, 0xbd, 0x21, 0xa1, + 0xe4, 0x46, 0x5e, 0xfd, 0xa0, 0x2f, 0x40, 0x7b, 0x3f, 0x03, 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0xf2, + 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x03, 0x77, 0xd0, 0xea, 0xf8, 0x7e, 0xe3, 0x68, 0xe0, 0x54, 0xf9, + 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, 0xa9, 0x15, 0x52, 0xb5, 0x43, 0xe0, 0xeb, + 0x56, 0xab, 0x28, 0xfa, 0xf9, 0xda, 0x8f, 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, + 0x17, 0x8b, 0x13, 0x92, 0x5f, 0x1d, 0x3a, 0x46, 0xf7, 0xb3, 0x87, 0x73, 0x82, 0xc8, 0x53, 0x58, + 0xeb, 0x94, 0xe9, 0xa1, 0x6e, 0x0a, 0xd3, 0x22, 0x67, 0xe7, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, + 0x2e, 0x96, 0xc6, 0xd8, 0xad, 0x91, 0x5e, 0x01, 0x3e, 0xff, 0x42, 0xe7, 0x96, 0x98, 0x8d, 0x42, + 0x1c, 0xf9, 0x26, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0xef, 0x89, 0xdd, 0x3a, 0x6e, 0xc1, 0x02, 0x3c, + 0x1c, 0xa3, 0xf2, 0x1f, 0x95, 0x50, 0xed, 0x47, 0x19, 0x98, 0x4d, 0x67, 0x5c, 0x33, 0x3d, 0x46, + 0x7e, 0x79, 0xa8, 0xd9, 0x0f, 0xe9, 0x7b, 0xe2, 0xdc, 0xa2, 0xd1, 0x83, 0xa0, 0xbb, 0x9f, 0x12, + 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0x6f, 0x2b, 0xdd, 0x3d, 0xe6, 0xaa, 0x47, 0x74, 0x13, + 0x97, 0x82, 0x52, 0x98, 0xf6, 0x5e, 0x76, 0x54, 0x95, 0x79, 0xb7, 0x10, 0x2b, 0x1e, 0x8b, 0xbe, + 0x3d, 0x59, 0x2c, 0x3a, 0x5e, 0xa0, 0xe1, 0x90, 0xf4, 0xaf, 0x0f, 0x87, 0xa4, 0xef, 0x4e, 0x1e, + 0x92, 0x4e, 0x34, 0xc3, 0xc8, 0xc8, 0xf4, 0x77, 0x72, 0x70, 0xe9, 0xa0, 0x61, 0xc3, 0x75, 0xa5, + 0x1a, 0x9d, 0x93, 0xea, 0xca, 0x83, 0xc7, 0x21, 0x59, 0x84, 0x42, 0x6f, 0x47, 0xf7, 0xfc, 0x55, + 0xc5, 0x5f, 0x7c, 0x0b, 0x1b, 0x3c, 0xf1, 0xd1, 0xa0, 0x56, 0x91, 0xab, 0x91, 0xf8, 0x45, 0x49, + 0xca, 0x35, 0x4b, 0x97, 0x7a, 0x5e, 0x68, 0xdf, 0x06, 0x9a, 0x65, 0x5d, 0x26, 0xa3, 0x9f, 0x4f, + 0x18, 0x14, 0xe5, 0x9e, 0x51, 0xc5, 0x1d, 0xc6, 0x0f, 0x92, 0xa5, 0x1c, 0x5f, 0x08, 0x2b, 0xa5, + 0xdc, 0x0f, 0x4a, 0x56, 0x70, 0x3c, 0xa2, 0x90, 0x7e, 0x3c, 0x22, 0xb2, 0xc0, 0xca, 0xe3, 0x11, + 0xff, 0x50, 0x82, 0x0b, 0xe9, 0x7d, 0xc8, 0xeb, 0xba, 0x4b, 0x5d, 0xcf, 0x74, 0x6c, 0xb5, 0x68, + 0x87, 0xc7, 0x88, 0x64, 0x32, 0xfa, 0xf9, 0x9f, 0xea, 0x00, 0xdc, 0x1f, 0x67, 0xb8, 0x19, 0x2c, + 0x1d, 0x35, 0x9f, 0x44, 0x10, 0xee, 0x59, 0x69, 0x4e, 0x8f, 0x10, 0x88, 0xa3, 0xcb, 0x42, 0xfe, + 0x28, 0x03, 0xd5, 0x6e, 0xc2, 0xce, 0x3e, 0xc1, 0x83, 0x7c, 0x97, 0xf6, 0x07, 0xb5, 0xea, 0xfa, + 0x08, 0x79, 0x38, 0xb2, 0x24, 0xe4, 0x37, 0xa0, 0xd2, 0xe3, 0xe3, 0xc2, 0x63, 0xd4, 0x36, 0xfc, + 0xb3, 0x7c, 0xe3, 0x8f, 0xfe, 0x8d, 0x10, 0xcb, 0x0f, 0x7f, 0xa9, 0xa8, 0x5a, 0x98, 0x81, 0x51, + 0x89, 0x4f, 0xf8, 0xc9, 0xbd, 0x2b, 0x50, 0xf2, 0x28, 0x63, 0xa6, 0xdd, 0xf6, 0xc4, 0xee, 0xad, + 0x2c, 0xe7, 0x4a, 0x43, 0xa5, 0x61, 0x90, 0x4b, 0x7e, 0x06, 0xca, 0xc2, 0xef, 0xb3, 0xe4, 0xb6, + 0xbd, 0x6a, 0x59, 0x44, 0xa2, 0x84, 0x5e, 0x6d, 0xf8, 0x89, 0x18, 0xe6, 0x93, 0x17, 0x60, 0x5a, + 0x46, 0xe3, 0xd4, 0x09, 0x5e, 0xb9, 0xc7, 0x3a, 0xb3, 0x3f, 0xa8, 0x4d, 0xd7, 0x23, 0xe9, 0x18, + 0xa3, 0xe2, 0xfb, 0x29, 0x1a, 0x38, 0xc7, 0x92, 0xfb, 0xa9, 0xd0, 0x6d, 0x86, 0x11, 0x2a, 0xf2, + 0x2c, 0xe4, 0x98, 0xe5, 0x89, 0x3d, 0x54, 0x29, 0xb4, 0x7b, 0x37, 0xd7, 0x1a, 0xc8, 0xd3, 0xb5, + 0xff, 0xc9, 0xc0, 0xe9, 0xc4, 0x41, 0x25, 0xce, 0xd2, 0x77, 0x2d, 0xa5, 0x46, 0x02, 0x96, 0x2d, + 0x5c, 0x43, 0x9e, 0x4e, 0xde, 0x50, 0x56, 0x61, 0x76, 0xc2, 0xcb, 0x0a, 0x77, 0x74, 0xe6, 0x71, + 0x33, 0x70, 0xc8, 0x20, 0xbc, 0x96, 0x68, 0x9c, 0x5c, 0xdc, 0xd7, 0x76, 0x70, 0x03, 0x45, 0x36, + 0x9c, 0xf9, 0xc3, 0x6c, 0x38, 0xb5, 0xbf, 0xcb, 0x41, 0xe5, 0x96, 0xb3, 0xfd, 0x29, 0x39, 0x3c, + 0x91, 0xae, 0x91, 0xb3, 0x3f, 0x45, 0x8d, 0xbc, 0x05, 0xcf, 0x30, 0xc6, 0x77, 0xfd, 0x8e, 0xdd, + 0xf4, 0x96, 0x5a, 0x8c, 0xba, 0xab, 0xa6, 0x6d, 0x7a, 0x3b, 0xb4, 0xa9, 0x3c, 0x77, 0x9f, 0xd9, + 0x1f, 0xd4, 0x9e, 0xd9, 0xdc, 0x5c, 0x4b, 0x23, 0xc1, 0x51, 0xbc, 0x62, 0x86, 0xe8, 0x46, 0xc7, + 0x69, 0xb5, 0x64, 0x64, 0x5b, 0xc6, 0x78, 0xe4, 0x0c, 0x89, 0xa4, 0x63, 0x8c, 0x4a, 0xfb, 0x28, + 0x03, 0xe5, 0xdb, 0x7a, 0xab, 0xa3, 0x37, 0x4c, 0xbb, 0x43, 0x9e, 0x83, 0xa9, 0x6d, 0xd7, 0xe9, + 0x50, 0xd7, 0x53, 0x91, 0x66, 0xb1, 0xeb, 0xa9, 0xcb, 0x24, 0xf4, 0xf3, 0xf8, 0x36, 0x8c, 0x39, + 0x3d, 0xd3, 0x48, 0x6e, 0x58, 0x37, 0x79, 0x22, 0xca, 0x3c, 0x72, 0x5f, 0xce, 0xa3, 0xdc, 0x84, + 0x27, 0xbd, 0x37, 0xd7, 0x1a, 0x32, 0x7a, 0xeb, 0xcf, 0x40, 0xf2, 0x7c, 0xcc, 0xf2, 0x28, 0x8f, + 0xb2, 0x15, 0xb4, 0xef, 0x67, 0xa1, 0x22, 0xab, 0x26, 0x37, 0x67, 0xc7, 0x59, 0xb9, 0x17, 0x85, + 0x77, 0xdd, 0xeb, 0x77, 0xa9, 0x2b, 0x36, 0xc1, 0x6a, 0xca, 0x45, 0xbd, 0x25, 0x61, 0x66, 0xe0, + 0x61, 0x0f, 0x93, 0xfc, 0xd6, 0xc9, 0x9f, 0x60, 0xeb, 0x14, 0x0e, 0x6c, 0x9d, 0x3f, 0xcb, 0x40, + 0x79, 0xcd, 0x6c, 0x51, 0x63, 0xcf, 0xb0, 0x28, 0x79, 0x05, 0xaa, 0x4d, 0x6a, 0x51, 0x46, 0x6f, + 0xb8, 0xba, 0x41, 0x37, 0xa8, 0x6b, 0x8a, 0x7b, 0x3d, 0x7c, 0x94, 0x89, 0x79, 0x5c, 0x90, 0xcb, + 0xe5, 0xca, 0x08, 0x1a, 0x1c, 0xc9, 0x4d, 0x6e, 0xc2, 0x74, 0x93, 0x7a, 0xa6, 0x4b, 0x9b, 0x1b, + 0x11, 0x6b, 0xf4, 0x39, 0x5f, 0x37, 0xad, 0x44, 0xf2, 0x1e, 0x0d, 0x6a, 0x33, 0x1b, 0x66, 0x8f, + 0x5a, 0xa6, 0x4d, 0xa5, 0x59, 0x1a, 0x63, 0xd5, 0x0a, 0x90, 0x5b, 0x73, 0xda, 0xda, 0x7b, 0x39, + 0x08, 0x6e, 0x6a, 0x91, 0xdf, 0xcc, 0x40, 0x45, 0xb7, 0x6d, 0x87, 0xa9, 0x5b, 0x50, 0xd2, 0xb7, + 0x8f, 0x13, 0x5f, 0x08, 0x9b, 0x5f, 0x0a, 0x41, 0xa5, 0x5b, 0x38, 0x70, 0x55, 0x47, 0x72, 0x30, + 0x2a, 0x9b, 0xf4, 0x13, 0x9e, 0xea, 0xf5, 0xc9, 0x4b, 0x71, 0x08, 0xbf, 0xf4, 0xec, 0xd7, 0xe0, + 0x4c, 0xb2, 0xb0, 0x47, 0x71, 0x6c, 0x4d, 0xe2, 0x13, 0x7b, 0xa7, 0x0c, 0x95, 0x3b, 0x3a, 0x33, + 0x77, 0xa9, 0xd8, 0x82, 0x9d, 0x8c, 0x4d, 0xfd, 0x07, 0x19, 0xb8, 0x10, 0xf7, 0x19, 0x9f, 0xa0, + 0x61, 0x3d, 0xbb, 0x3f, 0xa8, 0x5d, 0xc0, 0x54, 0x69, 0x38, 0xa2, 0x14, 0xc2, 0xc4, 0x1e, 0x72, + 0x41, 0x9f, 0xb4, 0x89, 0xdd, 0x18, 0x25, 0x10, 0x47, 0x97, 0xe5, 0xd3, 0x62, 0x62, 0x3f, 0xd9, + 0x37, 0x67, 0x12, 0x1b, 0x80, 0xa9, 0x27, 0x66, 0x03, 0x50, 0x7a, 0x22, 0x0c, 0xae, 0x5e, 0x64, + 0x03, 0x50, 0x9e, 0xd0, 0x0f, 0xaa, 0xc2, 0xac, 0x12, 0x6d, 0xd4, 0x46, 0x42, 0x1c, 0x7e, 0xf3, + 0x6d, 0x63, 0x62, 0x40, 0x61, 0x5b, 0xf7, 0x4c, 0x43, 0x99, 0x9f, 0xf5, 0xf1, 0xdd, 0x12, 0xfe, + 0x15, 0x13, 0xe9, 0x63, 0x12, 0xbf, 0x28, 0xb1, 0xc3, 0xab, 0x2c, 0xd9, 0x89, 0xae, 0xb2, 0x90, + 0x65, 0xc8, 0xdb, 0x5c, 0xd9, 0xe6, 0x8e, 0x7c, 0x79, 0xe5, 0xce, 0x6d, 0xba, 0x87, 0x82, 0x59, + 0xfb, 0x61, 0x16, 0x80, 0x57, 0x5f, 0x99, 0x39, 0x8f, 0xd9, 0x8c, 0x7c, 0x1e, 0xa6, 0xbc, 0xbe, + 0xf0, 0xd6, 0xaa, 0xa5, 0x38, 0x74, 0x1e, 0xcb, 0x64, 0xf4, 0xf3, 0xb9, 0x25, 0xf4, 0x56, 0x9f, + 0xf6, 0x7d, 0x5f, 0x50, 0x60, 0x09, 0x7d, 0x9d, 0x27, 0xa2, 0xcc, 0x3b, 0x39, 0x43, 0xc6, 0xdf, + 0x35, 0x15, 0x4e, 0x68, 0xd7, 0xa4, 0x7d, 0x2b, 0x0b, 0x10, 0x3a, 0xf8, 0xc9, 0xfb, 0x19, 0x38, + 0x1f, 0xcc, 0x32, 0x26, 0x2f, 0x48, 0x2c, 0x5b, 0xba, 0xd9, 0x9d, 0x78, 0x23, 0x93, 0x36, 0xc3, + 0x85, 0xda, 0xd9, 0x48, 0x13, 0x87, 0xe9, 0xa5, 0x20, 0x08, 0x25, 0xda, 0xed, 0xb1, 0xbd, 0x15, + 0xd3, 0x55, 0xc3, 0x2e, 0xf5, 0x86, 0xc1, 0x75, 0x45, 0x23, 0x59, 0xd5, 0x61, 0x78, 0x31, 0x73, + 0xfc, 0x1c, 0x0c, 0x70, 0xb4, 0xef, 0x65, 0xe1, 0x5c, 0x4a, 0xe9, 0xc8, 0x4b, 0x70, 0x46, 0x45, + 0x38, 0xc2, 0x5b, 0xc2, 0x99, 0xf0, 0x96, 0x70, 0x23, 0x91, 0x87, 0x43, 0xd4, 0xe4, 0x0d, 0x00, + 0xdd, 0x30, 0xa8, 0xe7, 0xad, 0x3b, 0x4d, 0xdf, 0xe8, 0x7b, 0x91, 0x6f, 0x2a, 0x97, 0x82, 0xd4, + 0x47, 0x83, 0xda, 0x17, 0xd3, 0x42, 0x55, 0x89, 0xda, 0x87, 0x0c, 0x18, 0x81, 0x24, 0xaf, 0x03, + 0xc8, 0x6b, 0x2b, 0xc1, 0x61, 0xcb, 0xc7, 0x78, 0xd2, 0xe7, 0xfd, 0x2b, 0x15, 0xf3, 0x5f, 0xef, + 0xeb, 0x36, 0x33, 0xd9, 0x9e, 0x3c, 0x57, 0x7d, 0x2f, 0x40, 0xc1, 0x08, 0xa2, 0xf6, 0x37, 0x59, + 0x28, 0xf9, 0xc6, 0xe8, 0x27, 0x10, 0x2b, 0x69, 0xc7, 0x62, 0x25, 0xe3, 0xdf, 0x53, 0xf4, 0x8b, + 0x3c, 0x32, 0x3a, 0xe2, 0x24, 0xa2, 0x23, 0x37, 0x26, 0x17, 0x75, 0x70, 0x3c, 0xe4, 0x07, 0x59, + 0x38, 0xe5, 0x93, 0xaa, 0x73, 0xdc, 0x5f, 0x86, 0x19, 0x97, 0xea, 0xcd, 0xba, 0xce, 0x8c, 0x1d, + 0xd1, 0x7d, 0xf2, 0x14, 0xf7, 0xd9, 0xfd, 0x41, 0x6d, 0x06, 0xa3, 0x19, 0x18, 0xa7, 0x4b, 0x3b, + 0x00, 0x9e, 0x9d, 0xf0, 0x00, 0x78, 0xee, 0x28, 0x07, 0xc0, 0x89, 0x0e, 0x15, 0x5e, 0xa2, 0x4d, + 0xb3, 0x4b, 0x9d, 0xbe, 0xff, 0x30, 0xc2, 0x51, 0x0f, 0x0f, 0x8b, 0xd5, 0x1d, 0x43, 0x18, 0x8c, + 0x62, 0x6a, 0xff, 0x98, 0x81, 0xe9, 0xb0, 0xbd, 0x4e, 0x3c, 0x62, 0xd4, 0x8a, 0x47, 0x8c, 0x96, + 0x26, 0x1e, 0x0e, 0x23, 0x62, 0x44, 0xbf, 0x57, 0x0c, 0xab, 0x25, 0xa2, 0x42, 0xdb, 0x30, 0x6b, + 0xa6, 0x06, 0x4a, 0x22, 0xda, 0x26, 0x38, 0x04, 0x77, 0x73, 0x24, 0x25, 0x1e, 0x80, 0x42, 0xfa, + 0x50, 0xda, 0xa5, 0x2e, 0x33, 0x0d, 0xea, 0xd7, 0xef, 0xc6, 0xc4, 0xd6, 0x91, 0x3c, 0x00, 0x10, + 0xb6, 0xe9, 0x3d, 0x25, 0x00, 0x03, 0x51, 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, + 0xaf, 0x4e, 0x74, 0x25, 0x23, 0x6c, 0x4f, 0xfe, 0xe7, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, + 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xb6, 0x4e, 0xe0, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x49, 0x18, 0xca, + 0x21, 0x9d, 0xe0, 0xb2, 0x49, 0xe1, 0x98, 0x94, 0xc7, 0x01, 0x17, 0x4e, 0x3c, 0x28, 0x3f, 0xd0, + 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, 0x86, 0xff, 0xf8, 0x35, 0xbc, 0xef, 0x23, 0x85, 0x35, 0x0c, + 0x92, 0x30, 0x94, 0x43, 0x1c, 0x28, 0x33, 0x65, 0xc9, 0xfa, 0xb7, 0x1f, 0xc7, 0x17, 0xea, 0xdb, + 0xc4, 0x9e, 0x74, 0x6c, 0x07, 0xbf, 0x18, 0xca, 0xd0, 0x1e, 0xe5, 0x42, 0xf5, 0xf8, 0x49, 0x87, + 0x08, 0x5f, 0x88, 0x87, 0x08, 0xe7, 0x92, 0x21, 0xc2, 0x84, 0x37, 0xe6, 0xe8, 0x41, 0x42, 0x1d, + 0x2a, 0x96, 0xee, 0xb1, 0xad, 0x5e, 0x53, 0x67, 0xca, 0xbf, 0x5c, 0x59, 0xfc, 0xff, 0x87, 0xd3, + 0x5e, 0x5c, 0x1f, 0x86, 0x4e, 0x97, 0xb5, 0x10, 0x06, 0xa3, 0x98, 0xe4, 0x2a, 0x54, 0x76, 0xc5, + 0x8c, 0x94, 0xb7, 0x29, 0x0a, 0x42, 0x9d, 0x0b, 0x0d, 0x7b, 0x2f, 0x4c, 0xc6, 0x28, 0x0d, 0x67, + 0x91, 0x96, 0x80, 0x64, 0x29, 0x86, 0x2c, 0x8d, 0x30, 0x19, 0xa3, 0x34, 0x22, 0x56, 0x61, 0xda, + 0x1d, 0xc9, 0x30, 0x25, 0x18, 0x64, 0xac, 0xc2, 0x4f, 0xc4, 0x30, 0x9f, 0x5c, 0x81, 0x52, 0xbf, + 0xd9, 0x92, 0xb4, 0x25, 0x41, 0x2b, 0xec, 0xaf, 0xad, 0x95, 0x55, 0x75, 0xbb, 0xc3, 0xcf, 0xd5, + 0xfe, 0x2b, 0x03, 0x64, 0x38, 0xa8, 0x4d, 0x76, 0xa0, 0x68, 0x0b, 0xaf, 0xca, 0xc4, 0xb7, 0xb7, + 0x23, 0xce, 0x19, 0x39, 0xc7, 0x54, 0x82, 0xc2, 0x27, 0x36, 0x94, 0xe8, 0x43, 0x46, 0x5d, 0x5b, + 0xb7, 0x94, 0xe9, 0x71, 0x3c, 0x37, 0xc5, 0xa5, 0xc1, 0xa9, 0x90, 0x31, 0x90, 0xa1, 0xfd, 0x38, + 0x0b, 0x95, 0x08, 0xdd, 0xe3, 0x36, 0x2b, 0xe2, 0xcc, 0xa8, 0x74, 0x66, 0x6c, 0xb9, 0x96, 0x1a, + 0xa6, 0x91, 0x33, 0xa3, 0x2a, 0x0b, 0xd7, 0x30, 0x4a, 0x47, 0x16, 0x01, 0xba, 0xba, 0xc7, 0xa8, + 0x2b, 0x96, 0x92, 0xc4, 0x49, 0xcd, 0xf5, 0x20, 0x07, 0x23, 0x54, 0xe4, 0xb2, 0x7a, 0x47, 0x20, + 0x1f, 0xbf, 0x34, 0x35, 0xe2, 0x91, 0x80, 0xc2, 0x31, 0x3c, 0x12, 0x40, 0xda, 0x70, 0xc6, 0x2f, + 0xb5, 0x9f, 0xab, 0xf4, 0xdc, 0x21, 0x81, 0xa5, 0x31, 0x9e, 0x80, 0xc0, 0x21, 0x50, 0xed, 0x87, + 0x19, 0x98, 0x89, 0x6d, 0xa5, 0xf9, 0xd6, 0x2e, 0x3c, 0x92, 0x11, 0xd9, 0xda, 0xc5, 0x4e, 0x52, + 0x3c, 0x0f, 0x45, 0xd9, 0x40, 0xaa, 0xe1, 0x03, 0x35, 0x22, 0x9b, 0x10, 0x55, 0x2e, 0x57, 0x08, + 0xca, 0x59, 0x97, 0x54, 0x08, 0xca, 0x9b, 0x87, 0x7e, 0x3e, 0xf9, 0x02, 0x94, 0xfc, 0xd2, 0xa9, + 0x96, 0x0e, 0x9f, 0x90, 0x50, 0xe9, 0x18, 0x50, 0x68, 0xdf, 0x2e, 0x80, 0x7c, 0xff, 0x82, 0xf3, + 0x35, 0x4d, 0x4f, 0x46, 0xa9, 0x32, 0x22, 0x4a, 0x15, 0xf0, 0xad, 0xa8, 0x74, 0x0c, 0x28, 0xc8, + 0x45, 0xc8, 0x75, 0x4d, 0x5b, 0xb9, 0x15, 0xc5, 0xae, 0x72, 0xdd, 0xb4, 0x91, 0xa7, 0x89, 0x2c, + 0xfd, 0xa1, 0x0a, 0xb4, 0xc8, 0x2c, 0xfd, 0x21, 0xf2, 0x34, 0x6e, 0x5c, 0x5a, 0x8e, 0xd3, 0xd9, + 0xd6, 0x8d, 0x8e, 0xef, 0xfa, 0xce, 0x8b, 0xd9, 0x2b, 0x8c, 0xcb, 0xb5, 0x78, 0x16, 0x26, 0x69, + 0x39, 0xbb, 0xe1, 0x38, 0x56, 0xd3, 0x79, 0x60, 0xfb, 0xec, 0x85, 0x90, 0x7d, 0x39, 0x9e, 0x85, + 0x49, 0x5a, 0xb2, 0x05, 0xcf, 0xbc, 0x4d, 0x5d, 0x47, 0xb5, 0x58, 0xc3, 0xa2, 0xb4, 0xe7, 0xc3, + 0x48, 0x05, 0x25, 0xa2, 0x42, 0xaf, 0xa6, 0x93, 0xe0, 0x28, 0x5e, 0x11, 0x6c, 0xd2, 0xdd, 0x36, + 0x65, 0x1b, 0xae, 0xc3, 0xf7, 0x4e, 0xa6, 0xdd, 0xf6, 0x61, 0xa7, 0x42, 0xd8, 0xcd, 0x74, 0x12, + 0x1c, 0xc5, 0x4b, 0xd6, 0xe1, 0xac, 0xcc, 0x8a, 0xd8, 0xcc, 0x4a, 0xd7, 0xd5, 0xf6, 0x07, 0xb5, + 0xcf, 0xac, 0xd0, 0x9e, 0x4b, 0x0d, 0xae, 0xa0, 0x37, 0x93, 0x64, 0x38, 0xcc, 0x29, 0x5e, 0xa5, + 0x52, 0xee, 0xde, 0x0d, 0xea, 0x8a, 0x2e, 0x17, 0xbe, 0x23, 0x65, 0x98, 0x63, 0x22, 0x0f, 0x87, + 0xa8, 0xc9, 0x2b, 0x50, 0x8d, 0xc2, 0x2e, 0xed, 0xea, 0xa6, 0xa5, 0x6f, 0x9b, 0x96, 0xc9, 0xf6, + 0x44, 0xac, 0x78, 0x46, 0x3a, 0x23, 0x37, 0x47, 0xd0, 0xe0, 0x48, 0x6e, 0xed, 0xf7, 0x73, 0x20, + 0x1e, 0x30, 0x22, 0xf7, 0x21, 0x67, 0x39, 0x6d, 0xa5, 0x92, 0xc7, 0xf7, 0x74, 0xac, 0x39, 0x6d, + 0x39, 0xf0, 0xd6, 0x9c, 0x36, 0x72, 0x44, 0x62, 0x40, 0xa1, 0xa3, 0xb7, 0x3a, 0xba, 0xd2, 0xc0, + 0xe3, 0xdb, 0x1b, 0x41, 0x20, 0x4f, 0xdd, 0x10, 0xe5, 0xbf, 0x28, 0xb1, 0xb9, 0x61, 0xb3, 0xed, + 0xbf, 0x48, 0xa2, 0xb6, 0x7e, 0x13, 0xf8, 0xc6, 0x7c, 0x24, 0xb9, 0x0a, 0x06, 0xbf, 0x18, 0xca, + 0x20, 0x06, 0x14, 0xfb, 0x4d, 0xf1, 0x90, 0x54, 0x7e, 0x42, 0x2b, 0x66, 0x6b, 0x45, 0xd4, 0x49, + 0xac, 0x5f, 0xf2, 0x1b, 0x15, 0xb4, 0xf6, 0xe7, 0x19, 0x98, 0x69, 0x58, 0x66, 0xd3, 0xb4, 0xdb, + 0x27, 0x77, 0x27, 0x97, 0xdc, 0x85, 0x82, 0x67, 0x99, 0x4d, 0x3a, 0xe6, 0x65, 0x51, 0xd1, 0x19, + 0xbc, 0x94, 0x14, 0x25, 0x8e, 0xf6, 0x27, 0x79, 0x50, 0xaf, 0x6e, 0x91, 0x3e, 0x94, 0xdb, 0xfe, + 0xcd, 0x55, 0x55, 0xe4, 0x97, 0x27, 0xb8, 0xe1, 0x10, 0xbb, 0x03, 0x2b, 0x7b, 0x27, 0x48, 0xc4, + 0x50, 0x12, 0xa1, 0xf1, 0x31, 0xb7, 0x32, 0xe1, 0x98, 0x93, 0xe2, 0x86, 0x47, 0x9d, 0x0e, 0xf9, + 0x1d, 0xc6, 0x7a, 0x13, 0x1f, 0xc4, 0x0d, 0xcf, 0xd8, 0x4a, 0x37, 0x1e, 0xff, 0x47, 0x01, 0xcd, + 0x45, 0xd8, 0xfa, 0x31, 0x5c, 0x7f, 0x0f, 0x5d, 0xa8, 0xca, 0xc3, 0xaa, 0x33, 0x0f, 0x05, 0x34, + 0xf9, 0x35, 0xa8, 0x30, 0x57, 0xb7, 0xbd, 0x96, 0xe3, 0x76, 0xa9, 0xab, 0x16, 0xff, 0xd5, 0x09, + 0xc6, 0xf3, 0x66, 0x88, 0x26, 0xbd, 0x1e, 0xb1, 0x24, 0x8c, 0x4a, 0xd3, 0xba, 0xa0, 0xcc, 0x76, + 0x62, 0xc4, 0x9e, 0x19, 0x90, 0x91, 0xce, 0x85, 0xc3, 0x8d, 0xc5, 0xe0, 0x2e, 0x79, 0xe4, 0x6e, + 0x5d, 0xea, 0x7b, 0x02, 0xda, 0x3f, 0x67, 0x21, 0xb7, 0xb9, 0xd6, 0x90, 0x57, 0x45, 0xc4, 0x1b, + 0x1e, 0xb4, 0xd1, 0x31, 0x7b, 0xf7, 0xa8, 0x6b, 0xb6, 0xf6, 0xd4, 0xda, 0x1b, 0xb9, 0x2a, 0x92, + 0xa4, 0xc0, 0x14, 0x2e, 0xf2, 0x1a, 0x4c, 0x1b, 0xfa, 0x32, 0x75, 0x99, 0x34, 0x61, 0x8e, 0xe6, + 0x35, 0x17, 0x27, 0x18, 0x96, 0x97, 0x42, 0x76, 0x8c, 0x81, 0x91, 0x2d, 0x00, 0x23, 0x84, 0x3e, + 0x92, 0x27, 0x5d, 0xbe, 0xab, 0x10, 0x02, 0x47, 0x80, 0x08, 0x42, 0xb9, 0xc3, 0x49, 0x05, 0x6a, + 0xfe, 0x28, 0xa8, 0x62, 0xd2, 0xdd, 0xf6, 0x79, 0x31, 0x84, 0xd1, 0xfe, 0x23, 0x03, 0xe1, 0x26, + 0x90, 0x78, 0x50, 0x6c, 0x8a, 0x5b, 0xdb, 0x6a, 0xda, 0x8f, 0xbf, 0x99, 0x8e, 0xbf, 0x66, 0x52, + 0x27, 0xfb, 0x83, 0x5a, 0xe2, 0x85, 0x13, 0x54, 0xa2, 0x48, 0x1b, 0x72, 0x6f, 0x3a, 0xdb, 0x13, + 0xcf, 0xfa, 0xc8, 0xf9, 0x1f, 0xb9, 0x73, 0x8a, 0x24, 0x20, 0x97, 0xa0, 0x7d, 0x3b, 0x0b, 0x95, + 0xc8, 0x98, 0x9e, 0xf8, 0x51, 0x82, 0x87, 0x89, 0x47, 0x09, 0x36, 0xc6, 0xdf, 0x95, 0x87, 0xa5, + 0x3a, 0xe9, 0x77, 0x09, 0xfe, 0x36, 0x0b, 0xb9, 0xad, 0x95, 0x55, 0xbe, 0xf8, 0x06, 0xe7, 0x80, + 0x26, 0x0e, 0x4c, 0x85, 0xcf, 0xaf, 0x89, 0x91, 0x16, 0xfc, 0x62, 0x28, 0x83, 0xec, 0xc0, 0xd4, + 0x76, 0xdf, 0xb4, 0x98, 0x69, 0x4f, 0x7c, 0xea, 0xcc, 0x7f, 0xc3, 0x41, 0x1d, 0x97, 0x91, 0xa8, + 0xe8, 0xc3, 0x93, 0x36, 0x4c, 0xb5, 0xe5, 0x35, 0x10, 0x35, 0xf7, 0x5e, 0x1a, 0x7f, 0xf5, 0x92, + 0x38, 0x52, 0x90, 0xfa, 0x41, 0x1f, 0x5d, 0xfb, 0x26, 0xa8, 0xc5, 0x9f, 0x78, 0x27, 0xd3, 0x9a, + 0x81, 0x63, 0x28, 0xad, 0x45, 0xb5, 0xff, 0xcc, 0x40, 0x5c, 0x4b, 0x7f, 0xf2, 0x9d, 0xda, 0x49, + 0x76, 0xea, 0xca, 0x71, 0xcc, 0x81, 0xf4, 0x7e, 0xd5, 0xfe, 0x3a, 0x0b, 0x45, 0xf5, 0x2e, 0xe9, + 0xc9, 0x47, 0x3f, 0x68, 0x2c, 0xfa, 0xb1, 0x3c, 0xe1, 0x2b, 0x8d, 0x23, 0x63, 0x1f, 0xdd, 0x44, + 0xec, 0x63, 0xd2, 0xe7, 0x20, 0x1f, 0x13, 0xf9, 0xf8, 0xfb, 0x0c, 0x9c, 0x92, 0x84, 0x37, 0x6d, + 0x8f, 0xe9, 0xb6, 0x21, 0x8c, 0x62, 0xe9, 0x89, 0x9a, 0xd8, 0xb5, 0xa7, 0xdc, 0xd0, 0xc2, 0x5c, + 0x95, 0xdf, 0xa8, 0xa0, 0xf9, 0x66, 0x79, 0xc7, 0xf1, 0x98, 0x50, 0xb7, 0xd9, 0xf8, 0x26, 0xfb, + 0x65, 0x95, 0x8e, 0x01, 0x45, 0x72, 0xf7, 0x5e, 0x18, 0xbd, 0x7b, 0xd7, 0xfe, 0x34, 0x03, 0xd3, + 0xd1, 0x87, 0x30, 0xc7, 0x0f, 0xe4, 0x24, 0xe2, 0x28, 0xd9, 0x13, 0x88, 0xa3, 0x7c, 0x98, 0x01, + 0xf0, 0x0b, 0x7b, 0xe2, 0x51, 0x94, 0x66, 0x3c, 0x8a, 0x32, 0x71, 0xb7, 0xa6, 0xc7, 0x50, 0x7e, + 0x50, 0xf0, 0xab, 0x24, 0x22, 0x28, 0xef, 0x66, 0xe0, 0x94, 0x1e, 0x8b, 0x4a, 0x4c, 0x6c, 0x49, + 0x24, 0x82, 0x1c, 0xc1, 0xc3, 0xa1, 0xf1, 0x74, 0x4c, 0x88, 0x25, 0xd7, 0x60, 0xba, 0xa7, 0x5c, + 0xc5, 0x77, 0xc2, 0x51, 0x17, 0x1c, 0x40, 0xde, 0x88, 0xe4, 0x61, 0x8c, 0xf2, 0x31, 0x51, 0xa0, + 0xdc, 0xb1, 0x44, 0x81, 0xa2, 0x47, 0xcd, 0xf2, 0x07, 0x1e, 0x35, 0xb3, 0xa1, 0xdc, 0x72, 0x9d, + 0xae, 0x08, 0xb4, 0xa8, 0xa7, 0xe6, 0x26, 0x0c, 0xde, 0x04, 0x8b, 0xca, 0xaa, 0x8f, 0x8b, 0xa1, + 0x08, 0xbe, 0x4c, 0x33, 0x47, 0x4a, 0x2b, 0x1e, 0x87, 0xb4, 0x60, 0xea, 0x6e, 0x4a, 0x54, 0xf4, + 0xe1, 0xe3, 0xc1, 0x94, 0xa9, 0x4f, 0x26, 0x98, 0xa2, 0xfd, 0x53, 0xd6, 0xd7, 0x17, 0x8d, 0xc4, + 0x9d, 0xa4, 0xcc, 0x88, 0x3b, 0x49, 0xea, 0x76, 0x6d, 0x34, 0xdc, 0xf0, 0x3c, 0x14, 0x5d, 0xaa, + 0x7b, 0x8e, 0xad, 0xee, 0xa9, 0x07, 0xda, 0x16, 0x45, 0x2a, 0xaa, 0xdc, 0x68, 0x58, 0x22, 0xfb, + 0x98, 0xb0, 0xc4, 0x17, 0x22, 0x03, 0x42, 0xc6, 0x7f, 0x83, 0xb9, 0x9d, 0x32, 0x28, 0x84, 0xcf, + 0x52, 0xbd, 0xfe, 0x5f, 0x48, 0xfa, 0x2c, 0xd5, 0xcb, 0xfc, 0x01, 0x05, 0x69, 0xc2, 0xb4, 0xa5, + 0x7b, 0x4c, 0x78, 0xa5, 0x9a, 0x4b, 0x6c, 0x8c, 0x98, 0x47, 0x30, 0x6d, 0xd6, 0x22, 0x38, 0x18, + 0x43, 0xd5, 0x7e, 0x37, 0x03, 0x61, 0x93, 0x1f, 0xd1, 0x3b, 0xfa, 0x0a, 0x94, 0xba, 0xfa, 0xc3, + 0x15, 0x6a, 0xe9, 0x7b, 0x93, 0xbc, 0x7e, 0xb5, 0xae, 0x30, 0x30, 0x40, 0xd3, 0x06, 0x19, 0x50, + 0x37, 0x76, 0x09, 0x85, 0x42, 0xcb, 0x7c, 0xa8, 0xca, 0x33, 0x89, 0xa5, 0x12, 0x79, 0x6f, 0x4d, + 0xfa, 0x17, 0x44, 0x02, 0x4a, 0x74, 0xd2, 0x85, 0x29, 0x4f, 0xba, 0x7f, 0x54, 0x55, 0xc6, 0xdf, + 0x95, 0xc7, 0xdc, 0x48, 0xea, 0xba, 0xaf, 0x4c, 0x42, 0x5f, 0x46, 0x7d, 0xfe, 0x83, 0x8f, 0xe7, + 0x9e, 0xfa, 0xf0, 0xe3, 0xb9, 0xa7, 0x3e, 0xfa, 0x78, 0xee, 0xa9, 0x6f, 0xed, 0xcf, 0x65, 0x3e, + 0xd8, 0x9f, 0xcb, 0x7c, 0xb8, 0x3f, 0x97, 0xf9, 0x68, 0x7f, 0x2e, 0xf3, 0x6f, 0xfb, 0x73, 0x99, + 0xdf, 0xf9, 0xf7, 0xb9, 0xa7, 0x5e, 0x2d, 0xf9, 0x98, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x9a, + 0x20, 0x59, 0x9b, 0x6d, 0x64, 0x00, 0x00, } func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) { From a0e33e4dbe950750494675193fd8029a34322015 Mon Sep 17 00:00:00 2001 From: Keran Yang Date: Tue, 28 Mar 2023 14:27:19 -0400 Subject: [PATCH 5/6] . Signed-off-by: Keran Yang --- pkg/apis/numaflow/v1alpha1/const.go | 2 -- pkg/apis/numaflow/v1alpha1/edge_types.go | 2 ++ pkg/forward/forward.go | 2 +- test/e2e-suite-2/functional_test.go | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go index d8694de32e..8b50516d49 100644 --- a/pkg/apis/numaflow/v1alpha1/const.go +++ b/pkg/apis/numaflow/v1alpha1/const.go @@ -24,8 +24,6 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) -type BufferFullWritingStrategy string - const ( Project = "numaflow" diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go index 8bcb61a4b7..34b3a7508b 100644 --- a/pkg/apis/numaflow/v1alpha1/edge_types.go +++ b/pkg/apis/numaflow/v1alpha1/edge_types.go @@ -64,3 +64,5 @@ func (e Edge) BufferFullWritingStrategy() BufferFullWritingStrategy { return RetryUntilSuccess } } + +type BufferFullWritingStrategy string diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go index 582574a0a5..2954ff2191 100644 --- a/pkg/forward/forward.go +++ b/pkg/forward/forward.go @@ -491,7 +491,7 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is for idx, msg := range messages { if err := errs[idx]; err != nil { // ATM there are no user defined errors during write, all are InternalErrors. - if ok := errors.As(err, &isb.NoRetryableBufferWriteErr{}); ok { + if errors.As(err, &isb.NoRetryableBufferWriteErr{}) { // If toBuffer returns us a NoRetryableBufferWriteErr, we drop the message. dropBytes += float64(len(msg.Payload)) } else { diff --git a/test/e2e-suite-2/functional_test.go b/test/e2e-suite-2/functional_test.go index 2552452cb6..86a7821556 100644 --- a/test/e2e-suite-2/functional_test.go +++ b/test/e2e-suite-2/functional_test.go @@ -51,8 +51,9 @@ func (s *FunctionalSuite) TestDropOnFull() { VertexSizeScaledTo("drop-sink", 0) w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("1"))) - // give buffer writer 2 seconds to update it's isFull attribute. - time.Sleep(time.Second * 2) + // give buffer writer some time to update the isFull attribute. + // 5s is a carefully chosen number to create a stable buffer full scenario, it is a bit higher than the buffer writer's refresh interval. + time.Sleep(time.Second * 5) w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("2"))) // scale the sinks up to 1 pod to process the message from the buffer. From fd006d882ad00dbcbd8fd0ba876ad206056e5bd0 Mon Sep 17 00:00:00 2001 From: Keran Yang Date: Tue, 28 Mar 2023 14:37:59 -0400 Subject: [PATCH 6/6] . Signed-off-by: Keran Yang --- pkg/apis/numaflow/v1alpha1/const.go | 3 --- pkg/apis/numaflow/v1alpha1/edge_types.go | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go index 8b50516d49..dcfcb76fd0 100644 --- a/pkg/apis/numaflow/v1alpha1/const.go +++ b/pkg/apis/numaflow/v1alpha1/const.go @@ -122,9 +122,6 @@ const ( DefaultBufferUsageLimit = 0.8 DefaultReadBatchSize = 500 - RetryUntilSuccess BufferFullWritingStrategy = "retryUntilSuccess" - DiscardLatest BufferFullWritingStrategy = "discardLatest" - // Auto scaling DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending DefaultCooldownSeconds = 90 // Default cooldown seconds after a scaling operation diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go index 34b3a7508b..52d6c08399 100644 --- a/pkg/apis/numaflow/v1alpha1/edge_types.go +++ b/pkg/apis/numaflow/v1alpha1/edge_types.go @@ -66,3 +66,8 @@ func (e Edge) BufferFullWritingStrategy() BufferFullWritingStrategy { } type BufferFullWritingStrategy string + +const ( + RetryUntilSuccess BufferFullWritingStrategy = "retryUntilSuccess" + DiscardLatest BufferFullWritingStrategy = "discardLatest" +)