sonamu 0.10.12 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +131 -27
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +3 -2
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +27 -21
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +135 -128
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts.map +1 -1
- package/dist/ui/migrations-api.js +17 -15
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +153 -36
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +68 -41
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +727 -616
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +63 -51
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isFunctionValue, isObjectValue } from "../utils/runtime-value.js";
|
|
3
|
+
import { init_runtime_type, runtimeTypeOf } from "../runtime-type.js";
|
|
2
4
|
import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory } from "./ws-telemetry-memory.js";
|
|
3
5
|
import { generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
|
|
4
6
|
//#region src/stream/ws-telemetry.ts
|
|
@@ -10,7 +12,7 @@ function redactValue(value, key) {
|
|
|
10
12
|
if (key !== void 0 && isSensitiveKey(key)) return REDACTED_VALUE;
|
|
11
13
|
if (Array.isArray(value)) return value.map((item) => redactValue(item));
|
|
12
14
|
if (value instanceof Date) return value;
|
|
13
|
-
if (value &&
|
|
15
|
+
if (value && isObjectValue(value)) {
|
|
14
16
|
const redacted = {};
|
|
15
17
|
for (const [childKey, childValue] of Object.entries(value)) redacted[childKey] = redactValue(childValue, childKey);
|
|
16
18
|
return redacted;
|
|
@@ -70,7 +72,7 @@ function truncateUtf8String(value, maxBytes) {
|
|
|
70
72
|
return result + suffix;
|
|
71
73
|
}
|
|
72
74
|
function isPromiseLike(value) {
|
|
73
|
-
return
|
|
75
|
+
return isObjectValue(value) && value !== null && "then" in value && "catch" in value;
|
|
74
76
|
}
|
|
75
77
|
function buildController(options, runtimeMetadata) {
|
|
76
78
|
const defaults = options.defaults ?? {};
|
|
@@ -79,17 +81,17 @@ function buildController(options, runtimeMetadata) {
|
|
|
79
81
|
const spansOpt = options.spans ?? {};
|
|
80
82
|
const defaultsMaxRecordsPerSecond = defaults.maxRecordsPerSecond ?? DEFAULT_MAX_RECORDS_PER_SECOND;
|
|
81
83
|
const eventsSharedRedactor = eventsOpt.redactor === null ? void 0 : defaults.redactor;
|
|
82
|
-
const eventsSignalRedactor =
|
|
84
|
+
const eventsSignalRedactor = isFunctionValue(eventsOpt.redactor) ? eventsOpt.redactor : void 0;
|
|
83
85
|
const eventsSharedBeforeRecord = eventsOpt.beforeRecord === null ? void 0 : defaults.beforeRecord;
|
|
84
|
-
const eventsSignalBeforeRecord =
|
|
86
|
+
const eventsSignalBeforeRecord = isFunctionValue(eventsOpt.beforeRecord) ? eventsOpt.beforeRecord : void 0;
|
|
85
87
|
const metricsSharedRedactor = metricsOpt.redactor === null ? void 0 : defaults.redactor;
|
|
86
|
-
const metricsSignalRedactor =
|
|
88
|
+
const metricsSignalRedactor = isFunctionValue(metricsOpt.redactor) ? metricsOpt.redactor : void 0;
|
|
87
89
|
const metricsSharedBeforeRecord = metricsOpt.beforeRecord === null ? void 0 : defaults.beforeRecord;
|
|
88
|
-
const metricsSignalBeforeRecord =
|
|
90
|
+
const metricsSignalBeforeRecord = isFunctionValue(metricsOpt.beforeRecord) ? metricsOpt.beforeRecord : void 0;
|
|
89
91
|
const spansSharedRedactor = spansOpt.redactor === null ? void 0 : defaults.redactor;
|
|
90
|
-
const spansSignalRedactor =
|
|
92
|
+
const spansSignalRedactor = isFunctionValue(spansOpt.redactor) ? spansOpt.redactor : void 0;
|
|
91
93
|
const spansSharedBeforeRecord = spansOpt.beforeRecord === null ? void 0 : defaults.beforeRecord;
|
|
92
|
-
const spansSignalBeforeRecord =
|
|
94
|
+
const spansSignalBeforeRecord = isFunctionValue(spansOpt.beforeRecord) ? spansOpt.beforeRecord : void 0;
|
|
93
95
|
const eventSinks = eventsOpt.sinks ? [...eventsOpt.sinks] : [];
|
|
94
96
|
let eventStore = eventsOpt.store;
|
|
95
97
|
if (eventSinks.length === 0 && eventStore === void 0) {
|
|
@@ -186,6 +188,8 @@ function createWebSocketTelemetryController(telemetryOption, runtimeMetadata) {
|
|
|
186
188
|
}
|
|
187
189
|
var EMPTY_METRICS_SNAPSHOT, DEFAULT_TRACE_OPTIONS, DEFAULT_MAX_RECORDS_PER_SECOND, DEFAULT_SHUTDOWN_TIMEOUT_MS, DEFAULT_EVENT_SAMPLING_DEFAULT_RATE, DEFAULT_EVENT_ALWAYS_RECORD_LEVELS, DEFAULT_EVENT_CAPTURE_PAYLOAD, DEFAULT_EVENT_MAX_PAYLOAD_PREVIEW_BYTES, DEFAULT_METRIC_COLLECTION_ENABLED, DEFAULT_METRIC_SAMPLE_INTERVAL_MS, DEFAULT_SPAN_SAMPLING_DEFAULT_RATE, DEFAULT_MAX_IN_FLIGHT_EMITS_PER_SINK, SENSITIVE_KEY_PATTERNS, REDACTED_VALUE, TokenBucket, noopUnsubscribe, NoopWebSocketTelemetryController, TelemetryPipeline, EventPipeline, MetricPipeline, SpanPipeline, WebSocketTelemetryControllerImpl;
|
|
188
190
|
var init_ws_telemetry = __esmMin((() => {
|
|
191
|
+
init_runtime_type();
|
|
192
|
+
init_runtime_value();
|
|
189
193
|
init_ws_telemetry_memory();
|
|
190
194
|
init_ws_telemetry_trace();
|
|
191
195
|
EMPTY_METRICS_SNAPSHOT = {
|
|
@@ -281,7 +285,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
281
285
|
};
|
|
282
286
|
TelemetryPipeline = class {
|
|
283
287
|
sinks;
|
|
284
|
-
|
|
288
|
+
telemetryStore;
|
|
285
289
|
tokenBucket;
|
|
286
290
|
maxInFlightEmits;
|
|
287
291
|
runtimeMetadata;
|
|
@@ -294,7 +298,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
294
298
|
shutdownCalled = false;
|
|
295
299
|
constructor(sinks, store, maxRecordsPerSecond, maxInFlightEmits, sharedRedactor, sharedBeforeRecord, runtimeMetadata) {
|
|
296
300
|
this.sinks = sinks;
|
|
297
|
-
this.
|
|
301
|
+
this.telemetryStore = store;
|
|
298
302
|
this.tokenBucket = new TokenBucket(maxRecordsPerSecond, maxRecordsPerSecond);
|
|
299
303
|
this.maxInFlightEmits = maxInFlightEmits;
|
|
300
304
|
this.sharedRedactor = sharedRedactor;
|
|
@@ -302,7 +306,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
302
306
|
this.runtimeMetadata = runtimeMetadata;
|
|
303
307
|
}
|
|
304
308
|
get store() {
|
|
305
|
-
return this.
|
|
309
|
+
return this.telemetryStore;
|
|
306
310
|
}
|
|
307
311
|
setInternalEventReporter(reporter) {
|
|
308
312
|
this.internalEventReporter = reporter;
|
|
@@ -400,9 +404,9 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
400
404
|
this.inFlightEmits.set(sink, inFlight + 1);
|
|
401
405
|
result.then(() => {
|
|
402
406
|
this.decrementInFlightEmit(sink);
|
|
403
|
-
}, (
|
|
407
|
+
}, (cause) => {
|
|
404
408
|
this.decrementInFlightEmit(sink);
|
|
405
|
-
this.observeSinkFailure("emit",
|
|
409
|
+
this.observeSinkFailure("emit", cause, selfObserveFailures);
|
|
406
410
|
});
|
|
407
411
|
}
|
|
408
412
|
} catch (error) {
|
|
@@ -424,7 +428,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
424
428
|
this.dispatchInternalEvent("ws.telemetry.sink.failed", "warn", {
|
|
425
429
|
phase,
|
|
426
430
|
signal: this.signal,
|
|
427
|
-
errorType: error instanceof Error ? error.name :
|
|
431
|
+
errorType: error instanceof Error ? error.name : runtimeTypeOf(error)
|
|
428
432
|
});
|
|
429
433
|
}
|
|
430
434
|
dispatchInternalEvent(name, level, detail) {
|
|
@@ -445,8 +449,8 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
445
449
|
const result = sink.shutdown({ timeoutMs });
|
|
446
450
|
if (!isPromiseLike(result)) return;
|
|
447
451
|
let timeout = null;
|
|
448
|
-
const shutdownPromise = result.then(() => "completed", (
|
|
449
|
-
throw
|
|
452
|
+
const shutdownPromise = result.then(() => "completed", (cause) => {
|
|
453
|
+
throw cause;
|
|
450
454
|
});
|
|
451
455
|
const timeoutPromise = new Promise((resolve) => {
|
|
452
456
|
timeout = setTimeout(() => {
|
|
@@ -581,7 +585,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
581
585
|
this.collectionInterval = setInterval(() => {
|
|
582
586
|
this.collectAndEmit();
|
|
583
587
|
}, this.sampleIntervalMs);
|
|
584
|
-
if (this.collectionInterval &&
|
|
588
|
+
if (this.collectionInterval && isObjectValue(this.collectionInterval) && "unref" in this.collectionInterval) this.collectionInterval.unref();
|
|
585
589
|
}
|
|
586
590
|
}
|
|
587
591
|
emit(input) {
|
|
@@ -875,4 +879,4 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
875
879
|
init_ws_telemetry();
|
|
876
880
|
export { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, NoopWebSocketTelemetryController, WebSocketTelemetryControllerImpl, createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike };
|
|
877
881
|
|
|
878
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluTWVtb3J5RXZlbnRTdG9yZSwgSW5NZW1vcnlNZXRyaWNTdG9yZSwgSW5NZW1vcnlTcGFuU3RvcmUgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktbWVtb3J5XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVNwYW5JZCwgZ2VuZXJhdGVUcmFjZUlkLCBwYXJzZVRyYWNlUGFyZW50IH0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5LXRyYWNlXCI7XG5cbi8vIC0tIFJlY29yZCB0eXBlcyAodW5jaGFuZ2VkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmRCYXNlID0ge1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgbW9ub3RvbmljVGltZT86IG51bWJlcjtcbiAgcnVudGltZUlkOiBzdHJpbmc7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb25JZD86IHN0cmluZztcbiAgLy8gdXNlcklk64qUIGNvbm5lY3Rpb24g7IaM7Jyg7J6Q66W8IOyLneuzhO2VmOq4sCDsnITtlZwgb3BhcXVlIGlkZW50aWZpZXIgKOuztO2GtSBEQiBQSylcbiAgLy8gcHNldWRvbnltb3VzIGlkZW50aWZpZXLroZzrp4wg7IKs7Jqp7ZWY66mwLCDsnbTrqZTsnbwv7KCE7ZmU67KI7Zi4IOuTsSBQSUnripQg65Ok7Ja06rCA7KeAIOyViuuKlOuLpOqzoCDqsIDsoJXtlahcbiAgdXNlcklkPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgJiB7XG4gIHR5cGU6IFwiZXZlbnRcIjtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbDogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGF5bG9hZFByZXZpZXc/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgPSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmRCYXNlICYge1xuICB0eXBlOiBcIm1ldHJpY1wiO1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiY291bnRlclwiIHwgXCJoaXN0b2dyYW1cIiB8IFwiZ2F1Z2VcIjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdD86IFwiMVwiIHwgXCJtc1wiIHwgXCJCeVwiO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc25hcHNob3Q/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJzcGFuXCI7XG4gIG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAga2luZDogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgc3RhdHVzOiBcInVuc2V0XCIgfCBcIm9rXCIgfCBcImVycm9yXCI7XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgZXJyb3JUeXBlPzogc3RyaW5nO1xuICBldmVudHM/OiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkID1cbiAgfCBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFxuICB8IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFxuICB8IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQ7XG5cbi8vIC0tIElucHV0IHR5cGVzICh1bmNoYW5nZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGV2ZWw6IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCI7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBheWxvYWQ/OiB1bmtub3duO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRNZXRyaWNJbnB1dCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kOiBcImNvdW50ZXJcIiB8IFwiaGlzdG9ncmFtXCIgfCBcImdhdWdlXCI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHVuaXQ/OiBcIjFcIiB8IFwibXNcIiB8IFwiQnlcIjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbiAgc25hcHNob3Q/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRTcGFuSW5wdXQgPSB7XG4gIG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAga2luZDogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgc3RhdHVzOiBcInVuc2V0XCIgfCBcIm9rXCIgfCBcImVycm9yXCI7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgZXJyb3JUeXBlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG4gIGV2ZW50cz86IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9PjtcbiAgbGlua3M/OiBBcnJheTx7XG4gICAgdHJhY2VJZDogc3RyaW5nO1xuICAgIHNwYW5JZDogc3RyaW5nO1xuICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlJbnB1dCA9XG4gIHwgKHsgdHlwZTogXCJldmVudFwiIH0gJiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KVxuICB8ICh7IHR5cGU6IFwibWV0cmljXCIgfSAmIFdlYlNvY2tldE1ldHJpY0lucHV0KVxuICB8ICh7IHR5cGU6IFwic3BhblwiIH0gJiBXZWJTb2NrZXRTcGFuSW5wdXQpO1xuXG4vLyAtLSBNZXRyaWNzIHNuYXBzaG90IC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCA9IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHJvb21Db3VudDogbnVtYmVyO1xuICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dEpvYnM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5RHJvcHBlZFJlY29yZHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5U2lua0ZhaWx1cmVzOiBudW1iZXI7XG59O1xuXG4vLyAtLSBDb25uZWN0aW9uIHNuYXBzaG90IChUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24pIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCA9IHtcbiAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbnVtYmVyO1xuICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbnVtYmVyO1xuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbiB7XG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdDtcbn1cblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHNpbmtzIC0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1Npbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBxdWVyeSBmaWx0ZXJzIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxldmVsPzogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJjb3VudGVyXCIgfCBcImhpc3RvZ3JhbVwiIHwgXCJnYXVnZVwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyID0ge1xuICBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIHN0YXR1cz86IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBzdG9yZXMgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcbiAgcXVlcnkoZmlsdGVyOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmRbXTtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuLy8gLS0gTWV0cmljIHNvdXJjZSBpbnRlcmZhY2UgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2Uge1xuICBjb2xsZWN0KG5vdzogbnVtYmVyKTogUGFydGlhbDxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q+O1xufVxuXG4vLyAtLSBSZWRhY3RvciAvIGJlZm9yZVJlY29yZCB0eXBlcyAoc2lnbmFsLW5hcnJvd2VkICsgc2hhcmVkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbi8vIC0tIFRyYWNlIG9wdGlvbnMgLyBjb25uZWN0aW9uIGNvbnRleHQgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICBleHRyYWN0VHJhY2VQYXJlbnQ6IGJvb2xlYW47XG4gIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOiBib29sZWFuO1xuICBwcm9wYWdhdGVNZXNzYWdlVHJhY2U6IGJvb2xlYW47XG4gIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCA9IHtcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICBnZXRUZWxlbWV0cnlDb250ZXh0KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0O1xufVxuXG4vLyAtLSBPcHRpb25zIHNjaGVtYSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIHJhdGVCeUV2ZW50PzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbiAgYWx3YXlzUmVjb3JkTGV2ZWxzPzogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2FtcGxpbmdPcHRpb25zID0ge1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlEZWZhdWx0c09wdGlvbnMgPSB7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3I7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZDtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudHNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZT86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmU7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzPzogbnVtYmVyO1xuICByZWRhY3Rvcj86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IG51bGw7XG4gIHNhbXBsaW5nPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTYW1wbGluZ09wdGlvbnM7XG4gIGNhcHR1cmVQYXlsb2FkPzogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZTtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM/OiBudW1iZXI7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCBudWxsO1xuICBzYW1wbGluZz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NhbXBsaW5nT3B0aW9ucztcbiAgY29sbGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBzYW1wbGVJbnRlcnZhbE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhbnNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW107XG4gIHN0b3JlPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0cz86IG51bWJlcjtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgbnVsbDtcbiAgc2FtcGxpbmc/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2FtcGxpbmdPcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyA9IHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGNvbnRyb2xsZXI/OiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyO1xuICBkZWZhdWx0cz86IFdlYlNvY2tldFRlbGVtZXRyeURlZmF1bHRzT3B0aW9ucztcbiAgZXZlbnRzPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRzT3B0aW9ucztcbiAgbWV0cmljcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zO1xuICBzcGFucz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5zT3B0aW9ucztcbiAgdHJhY2U/OiBQYXJ0aWFsPFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucz47XG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xufTtcblxuLy8gLS0gQ29udHJvbGxlciBpbnRlcmZhY2UgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQ7XG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkO1xuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkO1xuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQ7XG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dDtcbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyAtLSBDb25zdGFudHMgYW5kIHNoYXJlZCBoZWxwZXJzIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmV4cG9ydCBjb25zdCBFTVBUWV9NRVRSSUNTX1NOQVBTSE9UOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gIHRpbWVzdGFtcDogMCxcbiAgYWN0aXZlQ29ubmVjdGlvbnM6IDAsXG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IHt9LFxuICByb29tQ291bnQ6IDAsXG4gIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IDAsXG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiAwLFxuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiAwLFxuICBwZW5kaW5nRmFuT3V0Sm9iczogMCxcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IDAsXG4gIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiAwLFxuICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IDAsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UUkFDRV9PUFRJT05TOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gIGV4dHJhY3RUcmFjZVBhcmVudDogdHJ1ZSxcbiAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6IHRydWUsXG4gIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTogdHJ1ZSxcbiAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjogZmFsc2UsXG59O1xuXG5jb25zdCBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVRfTVMgPSAyXzAwMDtcbmNvbnN0IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUzogUmVhZG9ubHlBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj4gPSBbXCJ3YXJuXCIsIFwiZXJyb3JcIl07XG5jb25zdCBERUZBVUxUX0VWRU5UX0NBUFRVUkVfUEFZTE9BRDogZmFsc2UgfCBcInByZXZpZXdcIiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9FVkVOVF9NQVhfUEFZTE9BRF9QUkVWSUVXX0JZVEVTID0gMTAyNDtcbmNvbnN0IERFRkFVTFRfTUVUUklDX0NPTExFQ1RJT05fRU5BQkxFRCA9IHRydWU7XG5jb25zdCBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NQQU5fU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LID0gMTAwO1xuXG5jb25zdCBTRU5TSVRJVkVfS0VZX1BBVFRFUk5TID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJjb29raWVcIixcbiAgXCJ0b2tlblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VjcmV0XCIsXG4gIFwiYXBpa2V5XCIsXG4gIFwic2Vzc2lvblwiLFxuICBcImVtYWlsXCIsXG5dIGFzIGNvbnN0O1xuY29uc3QgUkVEQUNURURfVkFMVUUgPSBcIltyZWRhY3RlZF1cIjtcblxuZnVuY3Rpb24gaXNTZW5zaXRpdmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGtleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFNFTlNJVElWRV9LRVlfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gbm9ybWFsaXplZC5pbmNsdWRlcyhwYXR0ZXJuKSk7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdFZhbHVlKHZhbHVlOiB1bmtub3duLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIGlzU2Vuc2l0aXZlS2V5KGtleSkpIHtcbiAgICByZXR1cm4gUkVEQUNURURfVkFMVUU7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiByZWRhY3RWYWx1ZShpdGVtKSk7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlZGFjdGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHJlZGFjdGVkW2NoaWxkS2V5XSA9IHJlZGFjdFZhbHVlKGNoaWxkVmFsdWUsIGNoaWxkS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZGFjdGVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg4oCUIHNlbnNpdGl2ZSBrZXkg7Yyo7YS0IOq4sOuwmCBidWlsdC1pbiByZWRhY3Rvci5cbiAqIHBpcGVsaW5lIGVtaXQgZmxvd+ydmCDssqsg64uo6rOE7JeQ7IScIO2VreyDgSDsoIHsmqnrkJzri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3QocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQpOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQge1xuICBpZiAocmVjb3JkLnR5cGUgPT09IFwiZXZlbnRcIikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBhdHRyaWJ1dGVzOiByZWNvcmQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJhdHRyaWJ1dGVzXCJdKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRldGFpbDogcmVjb3JkLmRldGFpbFxuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuZGV0YWlsKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImRldGFpbFwiXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwYXlsb2FkUHJldmlldzogcmVjb3JkLnBheWxvYWRQcmV2aWV3LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVjb3JkLnR5cGUgPT09IFwibWV0cmljXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3JkLFxuICAgICAgdGFnczogcmVjb3JkLnRhZ3NcbiAgICAgICAgPyAocmVkYWN0VmFsdWUocmVjb3JkLnRhZ3MpIGFzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtcInRhZ3NcIl0pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc25hcHNob3Q6IHJlY29yZC5zbmFwc2hvdCA/IHsgLi4ucmVjb3JkLnNuYXBzaG90IH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVjb3JkLFxuICAgIGF0dHJpYnV0ZXM6IHJlY29yZC5hdHRyaWJ1dGVzXG4gICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZFtcImF0dHJpYnV0ZXNcIl0pXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHJlY29yZC5ldmVudHM/Lm1hcCgoZXZlbnQpID0+ICh7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGF0dHJpYnV0ZXM6IGV2ZW50LmF0dHJpYnV0ZXNcbiAgICAgICAgPyAocmVkYWN0VmFsdWUoZXZlbnQuYXR0cmlidXRlcykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgICBsaW5rczogcmVjb3JkLmxpbmtzPy5tYXAoKGxpbmspID0+ICh7XG4gICAgICAuLi5saW5rLFxuICAgICAgYXR0cmlidXRlczogbGluay5hdHRyaWJ1dGVzXG4gICAgICAgID8gKHJlZGFjdFZhbHVlKGxpbmsuYXR0cmlidXRlcykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhwYXlsb2FkOiB1bmtub3duLCBtYXhCeXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkocmVkYWN0VmFsdWUocGF5bG9hZCkpO1xuICAgIGlmIChCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCBcInV0Zi04XCIpIDw9IG1heEJ5dGVzKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIHRydW5jYXRlVXRmOFN0cmluZyhzZXJpYWxpemVkLCBtYXhCeXRlcyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIlt1bnNlcmlhbGl6YWJsZV1cIjtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnVuY2F0ZVV0ZjhTdHJpbmcodmFsdWU6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtYXhCeXRlcyA8PSAwKSByZXR1cm4gXCJcIjtcblxuICBjb25zdCBzdWZmaXggPSBtYXhCeXRlcyA+PSAzID8gXCIuLi5cIiA6IFwiXCI7XG4gIGNvbnN0IGNvbnRlbnRCdWRnZXQgPSBtYXhCeXRlcyAtIEJ1ZmZlci5ieXRlTGVuZ3RoKHN1ZmZpeCwgXCJ1dGYtOFwiKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCB1c2VkQnl0ZXMgPSAwO1xuXG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNoYXJCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNoYXIsIFwidXRmLThcIik7XG4gICAgaWYgKHVzZWRCeXRlcyArIGNoYXJCeXRlcyA+IGNvbnRlbnRCdWRnZXQpIGJyZWFrO1xuICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIHVzZWRCeXRlcyArPSBjaGFyQnl0ZXM7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ICsgc3VmZml4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlTGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwidGhlblwiIGluIHZhbHVlICYmIFwiY2F0Y2hcIiBpbiB2YWx1ZTtcbn1cblxuLy8gLS0gVG9rZW5CdWNrZXQgKHVuY2hhbmdlZCkgLS1cblxuY2xhc3MgVG9rZW5CdWNrZXQge1xuICBwcml2YXRlIHRva2VuczogbnVtYmVyO1xuICBwcml2YXRlIGxhc3RSZWZpbGw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heFRva2VuczogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmaWxsUmF0ZTogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLnRva2VucyA9IG1heFRva2VucztcbiAgICB0aGlzLmxhc3RSZWZpbGwgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgdHJ5Q29uc3VtZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlZmlsbCgpO1xuICAgIGlmICh0aGlzLnRva2VucyA8IDEpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnRva2VucyAtPSAxO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZpbGwoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbGFwc2VkID0gKG5vdyAtIHRoaXMubGFzdFJlZmlsbCkgLyAxMDAwO1xuICAgIHRoaXMudG9rZW5zID0gTWF0aC5taW4odGhpcy5tYXhUb2tlbnMsIHRoaXMudG9rZW5zICsgZWxhcHNlZCAqIHRoaXMucmVmaWxsUmF0ZSk7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gbm93O1xuICB9XG59XG5cbi8vIC0tIE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmNvbnN0IG5vb3BVbnN1YnNjcmliZSA9ICgpOiB2b2lkID0+IHt9O1xuXG5leHBvcnQgY2xhc3MgTm9vcFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIgaW1wbGVtZW50cyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChfaW5wdXQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICByZWNvcmRNZXRyaWMoX2lucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IHZvaWQge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIHJlY29yZFNwYW4oX2lucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90IHtcbiAgICByZXR1cm4geyAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTtcbiAgfVxuXG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0U3BhblN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKF9zb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBub29wVW5zdWJzY3JpYmU7XG4gIH1cblxuICBjcmVhdGVDb25uZWN0aW9uQ29udGV4dChfcmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zIHtcbiAgICByZXR1cm4geyAuLi5ERUZBVUxUX1RSQUNFX09QVElPTlMgfTtcbiAgfVxuXG4gIHNodXRkb3duKF9vcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufVxuXG4vLyAtLSBSZXNvbHZlZCBwZXItcGlwZWxpbmUgb3B0aW9uIHR5cGVzIChpbnRlcm5hbCkgLS1cblxudHlwZSBSdW50aW1lTWV0YWRhdGEgPSB7XG4gIHJ1bnRpbWVJZDogc3RyaW5nO1xuICBub2RlSWQ6IHN0cmluZztcbn07XG5cbnR5cGUgUmVzb2x2ZWRFdmVudFBpcGVsaW5lT3B0aW9ucyA9IHtcbiAgc2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZDtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzOiBudW1iZXI7XG4gIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzYW1wbGluZzoge1xuICAgIGRlZmF1bHRSYXRlOiBudW1iZXI7XG4gICAgcmF0ZUJ5RXZlbnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgYWx3YXlzUmVjb3JkTGV2ZWxzOiBBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj47XG4gIH07XG4gIGNhcHR1cmVQYXlsb2FkOiBmYWxzZSB8IFwicHJldmlld1wiO1xuICBtYXhQYXlsb2FkUHJldmlld0J5dGVzOiBudW1iZXI7XG59O1xuXG50eXBlIFJlc29sdmVkTWV0cmljUGlwZWxpbmVPcHRpb25zID0ge1xuICBzaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdO1xuICBzdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQ7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ6IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgc2FtcGxlSW50ZXJ2YWxNczogbnVtYmVyO1xufTtcblxudHlwZSBSZXNvbHZlZFNwYW5QaXBlbGluZU9wdGlvbnMgPSB7XG4gIHNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdO1xuICBzdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzYW1wbGluZzoge1xuICAgIGRlZmF1bHRSYXRlOiBudW1iZXI7XG4gIH07XG59O1xuXG4vLyAtLSBJbnRlcm5hbCBldmVudCByZXBvcnRlciB0eXBlIC0tXG4vLyBFdmVudFBpcGVsaW5lIOyekOyLoOqzvCBjb250cm9sbGVy6rCAIOuCtOu2gCDsp4Tri6gg7J2067Kk7Yq466W8IOuwnO2Wie2VoCDrlYwg7IKs7Jqp7ZWc64ukLlxuLy8gdHlwZS1taXNtYXRjaCAvIHNodXRkb3duLnRpbWVvdXQgLyBzaW5rLmZhaWxlZCDrk7HsnYQgZXZlbnRzIHBpcGVsaW5lIOqyveuhnOuhnCDrs7Trgrjri6QuXG50eXBlIEludGVybmFsRXZlbnRSZXBvcnRlciA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBsZXZlbDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJsZXZlbFwiXSxcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pID0+IHZvaWQ7XG5cbi8vIC0tIFRlbGVtZXRyeVBpcGVsaW5lIChhYnN0cmFjdCkgLS1cblxuYWJzdHJhY3QgY2xhc3MgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFRSZWNvcmQgZXh0ZW5kcyBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4gIFRJbnB1dCxcbiAgVFNpbmsgZXh0ZW5kcyB7XG4gICAgZW1pdChyZWNvcmQ6IFRSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBzaHV0ZG93bj8ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfSxcbiAgVFN0b3JlIGV4dGVuZHMgeyByZWFkb25seSBzaW5rOiBUU2luazsgY2xlYXIoKTogdm9pZCB9IHwgdW5kZWZpbmVkLFxuPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHNpZ25hbDogXCJldmVudFwiIHwgXCJtZXRyaWNcIiB8IFwic3BhblwiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lua3M6IFRTaW5rW107XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RvcmU6IFRTdG9yZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRva2VuQnVja2V0OiBUb2tlbkJ1Y2tldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBpbnRlcm5hbEV2ZW50UmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodEVtaXRzID0gbmV3IFdlYWtNYXA8VFNpbmssIG51bWJlcj4oKTtcbiAgZHJvcHBlZENvdW50ID0gMDtcbiAgc2lua0ZhaWx1cmVDb3VudCA9IDA7XG4gIHNodXRkb3duQ2FsbGVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHNpbmtzOiBUU2lua1tdLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcixcbiAgICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQsXG4gICAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4gICkge1xuICAgIHRoaXMuc2lua3MgPSBzaW5rcztcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMudG9rZW5CdWNrZXQgPSBuZXcgVG9rZW5CdWNrZXQobWF4UmVjb3Jkc1BlclNlY29uZCwgbWF4UmVjb3Jkc1BlclNlY29uZCk7XG4gICAgdGhpcy5tYXhJbkZsaWdodEVtaXRzID0gbWF4SW5GbGlnaHRFbWl0cztcbiAgICB0aGlzLnNoYXJlZFJlZGFjdG9yID0gc2hhcmVkUmVkYWN0b3I7XG4gICAgdGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQgPSBzaGFyZWRCZWZvcmVSZWNvcmQ7XG4gICAgdGhpcy5ydW50aW1lTWV0YWRhdGEgPSBydW50aW1lTWV0YWRhdGE7XG4gIH1cblxuICBnZXQgc3RvcmUoKTogVFN0b3JlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmU7XG4gIH1cblxuICBzZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID0gcmVwb3J0ZXI7XG4gIH1cblxuICBhYnN0cmFjdCBlbWl0KGlucHV0OiBUSW5wdXQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZFJlY29yZChpbnB1dDogVElucHV0KTogVFJlY29yZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogVFJlY29yZCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBUUmVjb3JkKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsUmVkYWN0b3IoKTogKChyZWNvcmQ6IFRSZWNvcmQpID0+IFRSZWNvcmQgfCBudWxsKSB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6ICgocmVjb3JkOiBUUmVjb3JkKSA9PiBUUmVjb3JkIHwgbnVsbCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8g6rO17Ya1IGVtaXQg7Z2Q66aELiDrqqjrk6Ag7Iug7Zi467OEIHBpcGVsaW5l7J2YIGVtaXTsnbQg7J20IOuplOyEnOuTnOuhnCDsnITsnoTtlZzri6QuXG4gIHByb3RlY3RlZCBlbWl0SW50ZXJuYWwoaW5wdXQ6IFRJbnB1dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICBsZXQgcmVjb3JkOiBUUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gICAgaWYgKCFza2lwUmF0ZUxpbWl0ICYmICF0aGlzLnRva2VuQnVja2V0LnRyeUNvbnN1bWUoKSkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg7ZWt7IOBIOyggeyaqVxuICAgIGxldCBwcmVwYXJlZDogVFJlY29yZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWZ0ZXJEZWZhdWx0ID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKGFmdGVyRGVmYXVsdC50eXBlICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICAvLyDrsKnslrQg66Gc7KeBIOKAlCDrs7gg6rWs7ZiE7JeQ7ISc64qUIOuwnOyDne2VmOyngCDslYrsp4Drp4wgdHlwZS1uYXJyb3frpbwg7JyE7ZW0IOqygOymnVxuICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmVwYXJlZCA9IGFmdGVyRGVmYXVsdCBhcyBUUmVjb3JkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDI6IHNoYXJlZFJlZGFjdG9yICjsnbTrr7ggYnVpbGRDb250cm9sbGVy7JeQ7IScIHNpZ25hbFJlZGFjdG9yPT09bnVsbOydtOuptCBzaGFyZWRSZWRhY3Rvcj11bmRlZmluZWTroZwg642u7Ja07JO0IOyDge2DnClcbiAgICBpZiAodGhpcy5zaGFyZWRSZWRhY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzaGFyZWRSZWRhY3RvciA9IHRoaXMuc2hhcmVkUmVkYWN0b3I7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKHByZXBhcmVkLCAocikgPT4gc2hhcmVkUmVkYWN0b3IociksIFwic2hhcmVkXCIsIFwicmVkYWN0b3JcIik7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDM6IHNpZ25hbFJlZGFjdG9yXG4gICAgY29uc3Qgc2lnbmFsUmVkYWN0b3IgPSB0aGlzLmdldFNpZ25hbFJlZGFjdG9yKCk7XG4gICAgaWYgKHNpZ25hbFJlZGFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ocHJlcGFyZWQsIChyKSA9PiBzaWduYWxSZWRhY3RvcihyKSwgXCJzaWduYWxcIiwgXCJyZWRhY3RvclwiKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIHByZXBhcmVkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIHN0ZXAgNDogc2hhcmVkQmVmb3JlUmVjb3JkXG4gICAgaWYgKHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNoYXJlZEJlZm9yZVJlY29yZCA9IHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShcbiAgICAgICAgcHJlcGFyZWQsXG4gICAgICAgIChyKSA9PiBzaGFyZWRCZWZvcmVSZWNvcmQociksXG4gICAgICAgIFwic2hhcmVkXCIsXG4gICAgICAgIFwiYmVmb3JlUmVjb3JkXCIsXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gc3RlcCA1OiBzaWduYWxCZWZvcmVSZWNvcmRcbiAgICBjb25zdCBzaWduYWxCZWZvcmVSZWNvcmQgPSB0aGlzLmdldFNpZ25hbEJlZm9yZVJlY29yZCgpO1xuICAgIGlmIChzaWduYWxCZWZvcmVSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShcbiAgICAgICAgcHJlcGFyZWQsXG4gICAgICAgIChyKSA9PiBzaWduYWxCZWZvcmVSZWNvcmQociksXG4gICAgICAgIFwic2lnbmFsXCIsXG4gICAgICAgIFwiYmVmb3JlUmVjb3JkXCIsXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaFRvU2lua3MocHJlcGFyZWQpO1xuICB9XG5cbiAgLy8gcmVkYWN0b3Ig65iQ64qUIGJlZm9yZVJlY29yZCAx7ZqMIOyggeyaqS4g67CY7ZmY6rCS7J20IG51bGzsnbTrqbQgZHJvcCwgdHlwZSDrtojsnbzsuZjrqbQgZHJvcCArIGludGVybmFsIGV2ZW50LlxuICAvLyBzaGFyZWQg67OA7ZmY7J2AIHdpZGVyIHJlY29yZOulvCDrsJvslYQgd2lkZXIgcmVjb3Jk66W8IOuwmO2ZmO2VmOyngOunjCwgc2lnbmFsIOuzgO2ZmOydgCBuYXJyb3dlZCBUUmVjb3Jk64G866asIOuzgO2ZmO2VnOuLpC5cbiAgLy8g7JaR7Kq9IOuqqOuRkCDrj5nsnbztlZwgdHlwZS1taXNtYXRjaCBkZWZlbnNpdmUg6rKA7IKs66W8IOqxsOy5nOuLpC5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybShcbiAgICByZWNvcmQ6IFRSZWNvcmQsXG4gICAgcnVubmVyOiAocmVjb3JkOiBUUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgfCBudWxsLFxuICAgIHNvdXJjZTogXCJzaGFyZWRcIiB8IFwic2lnbmFsXCIsXG4gICAga2luZDogXCJyZWRhY3RvclwiIHwgXCJiZWZvcmVSZWNvcmRcIixcbiAgKTogVFJlY29yZCB8IG51bGwge1xuICAgIGxldCByZXN1bHQ6IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHJ1bm5lcihyZWNvcmQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgIT09IHJlY29yZC50eXBlKSB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgY29uc3QgZXZlbnROYW1lID1cbiAgICAgICAga2luZCA9PT0gXCJyZWRhY3RvclwiXG4gICAgICAgICAgPyBcIndzLnRlbGVtZXRyeS5yZWRhY3Rvci50eXBlX21pc21hdGNoXCJcbiAgICAgICAgICA6IFwid3MudGVsZW1ldHJ5LmJlZm9yZVJlY29yZC50eXBlX21pc21hdGNoXCI7XG4gICAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChldmVudE5hbWUsIFwid2FyblwiLCB7XG4gICAgICAgIGV4cGVjdGVkOiByZWNvcmQudHlwZSxcbiAgICAgICAgYWN0dWFsOiByZXN1bHQudHlwZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyByZXN1bHQudHlwZSA9PT0gcmVjb3JkLnR5cGUgPT09IFRSZWNvcmRbXCJ0eXBlXCJd7J2066+A66GcIG5hcnJvd2VkIFRSZWNvcmTroZwg7JWI7KCE7ZWY6rKMIOyige2ekCDsiJgg7J6I64ukLlxuICAgIHJldHVybiByZXN1bHQgYXMgVFJlY29yZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNwYXRjaFRvU2lua3MocmVjb3JkOiBUUmVjb3JkLCBzZWxmT2JzZXJ2ZUZhaWx1cmVzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGNvbnN0IGNyaXRpY2FsID0gdGhpcy5pc0NyaXRpY2FsUmVjb3JkKHJlY29yZCk7XG4gICAgbGV0IGRyb3BwZWRGb3JSZWNvcmQgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc2luayBvZiB0aGlzLnNpbmtzKSB7XG4gICAgICBjb25zdCBpbkZsaWdodCA9IHRoaXMuaW5GbGlnaHRFbWl0cy5nZXQoc2luaykgPz8gMDtcbiAgICAgIGlmICghY3JpdGljYWwgJiYgaW5GbGlnaHQgPj0gdGhpcy5tYXhJbkZsaWdodEVtaXRzKSB7XG4gICAgICAgIGlmICghZHJvcHBlZEZvclJlY29yZCkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgZHJvcHBlZEZvclJlY29yZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNpbmsuZW1pdChyZWNvcmQpO1xuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyZXN1bHQpKSB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodEVtaXRzLnNldChzaW5rLCBpbkZsaWdodCArIDEpO1xuICAgICAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRlY3JlbWVudEluRmxpZ2h0RW1pdChzaW5rKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luayk7XG4gICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwiZW1pdFwiLCBlcnJvciwgc2VsZk9ic2VydmVGYWlsdXJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwiZW1pdFwiLCBlcnJvciwgc2VsZk9ic2VydmVGYWlsdXJlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luazogVFNpbmspOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5pbkZsaWdodEVtaXRzLmdldChzaW5rKSA/PyAwO1xuICAgIGlmIChjdXJyZW50IDw9IDEpIHtcbiAgICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5kZWxldGUoc2luayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5zZXQoc2luaywgY3VycmVudCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlU2lua0ZhaWx1cmUoXG4gICAgcGhhc2U6IFwiZW1pdFwiIHwgXCJzaHV0ZG93blwiLFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIHNlbGZPYnNlcnZlRmFpbHVyZTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgaWYgKCFzZWxmT2JzZXJ2ZUZhaWx1cmUpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChcIndzLnRlbGVtZXRyeS5zaW5rLmZhaWxlZFwiLCBcIndhcm5cIiwge1xuICAgICAgcGhhc2UsXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHR5cGVvZiBlcnJvcixcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNwYXRjaEludGVybmFsRXZlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGxldmVsOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImxldmVsXCJdLFxuICAgIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmludGVybmFsRXZlbnRSZXBvcnRlcihuYW1lLCBsZXZlbCwgZGV0YWlsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOynhOuLqCDsnbTrsqTtirgg7J6Q7LK06rCAIOyLpO2MqO2VmOuptCBzd2FsbG93XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2h1dGRvd25DYWxsZWQgPSB0cnVlO1xuXG4gICAgY29uc3Qgc2lua1NodXRkb3ducyA9IHRoaXMuc2lua3MubWFwKChzaW5rKSA9PiB0aGlzLnNodXRkb3duU2luayhzaW5rLCB0aW1lb3V0TXMpKTtcbiAgICBpZiAoc2lua1NodXRkb3ducy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2lua1NodXRkb3ducyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaHV0ZG93blNpbmsoc2luazogVFNpbmssIHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzaW5rLnNodXRkb3duKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2luay5zaHV0ZG93bih7IHRpbWVvdXRNcyB9KTtcbiAgICAgIGlmICghaXNQcm9taXNlTGlrZShyZXN1bHQpKSByZXR1cm47XG5cbiAgICAgIGxldCB0aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3Qgc2h1dGRvd25Qcm9taXNlID0gcmVzdWx0LnRoZW4oXG4gICAgICAgICgpID0+IFwiY29tcGxldGVkXCIgYXMgY29uc3QsXG4gICAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8XCJ0aW1lb3V0XCI+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKFwidGltZW91dFwiKTtcbiAgICAgICAgfSwgdGltZW91dE1zKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtzaHV0ZG93blByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvdXRjb21lID09PSBcInRpbWVvdXRcIikge1xuICAgICAgICBzaHV0ZG93blByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB0aGlzLnNpbmtGYWlsdXJlQ291bnQgKz0gMTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEludGVybmFsRXZlbnQoXCJ3cy50ZWxlbWV0cnkuc2h1dGRvd24udGltZW91dFwiLCBcIndhcm5cIiwge1xuICAgICAgICAgIHRpbWVvdXRNcyxcbiAgICAgICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5vYnNlcnZlU2lua0ZhaWx1cmUoXCJzaHV0ZG93blwiLCBlcnJvciwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIC0tIEV2ZW50UGlwZWxpbmUgLS1cblxuY2xhc3MgRXZlbnRQaXBlbGluZSBleHRlbmRzIFRlbGVtZXRyeVBpcGVsaW5lPFxuICBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rLFxuICBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJldmVudFwiIGFzIGNvbnN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICAgIHJhdGVCeUV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGFsd2F5c1JlY29yZExldmVsczogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xuICB9O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FwdHVyZVBheWxvYWQ6IGZhbHNlIHwgXCJwcmV2aWV3XCI7XG4gIHByb3RlY3RlZCByZWFkb25seSBtYXhQYXlsb2FkUHJldmlld0J5dGVzOiBudW1iZXI7XG4gIC8vIGFsd2F5c1JlY29yZCBsZXZlbCDqsr3roZzsl5DshJwgcHJlcGFyZVJlY29yZChza2lwUmF0ZUxpbWl0PXRydWUpIOydmOuvuOulvCDrs7TsobTtlZjquLAg7JyE7ZWcIO2UjOuemOq3uC5cbiAgcHJpdmF0ZSBjdXJyZW50RW1pdEFsd2F5c1JlY29yZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMsIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhKSB7XG4gICAgc3VwZXIoXG4gICAgICBvcHRpb25zLnNpbmtzLFxuICAgICAgb3B0aW9ucy5zdG9yZSxcbiAgICAgIG9wdGlvbnMubWF4UmVjb3Jkc1BlclNlY29uZCxcbiAgICAgIG9wdGlvbnMubWF4SW5GbGlnaHRFbWl0cyxcbiAgICAgIG9wdGlvbnMuc2hhcmVkUmVkYWN0b3IsXG4gICAgICBvcHRpb25zLnNoYXJlZEJlZm9yZVJlY29yZCxcbiAgICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICApO1xuICAgIHRoaXMuc2lnbmFsUmVkYWN0b3IgPSBvcHRpb25zLnNpZ25hbFJlZGFjdG9yO1xuICAgIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkID0gb3B0aW9ucy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gICAgdGhpcy5zYW1wbGluZyA9IG9wdGlvbnMuc2FtcGxpbmc7XG4gICAgdGhpcy5jYXB0dXJlUGF5bG9hZCA9IG9wdGlvbnMuY2FwdHVyZVBheWxvYWQ7XG4gICAgdGhpcy5tYXhQYXlsb2FkUHJldmlld0J5dGVzID0gb3B0aW9ucy5tYXhQYXlsb2FkUHJldmlld0J5dGVzO1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBzYW1wbGluZzogYWx3YXlzUmVjb3JkTGV2ZWxzIOyasOyEoFxuICAgICAgY29uc3QgbGV2ZWxzOiBSZWFkb25seUFycmF5PHN0cmluZz4gPSB0aGlzLnNhbXBsaW5nLmFsd2F5c1JlY29yZExldmVscztcbiAgICAgIGNvbnN0IGFsd2F5c1JlY29yZCA9IGxldmVscy5pbmNsdWRlcyhpbnB1dC5sZXZlbCk7XG5cbiAgICAgIGlmICghYWx3YXlzUmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnNhbXBsaW5nLnJhdGVCeUV2ZW50W2lucHV0Lm5hbWVdID8/IHRoaXMuc2FtcGxpbmcuZGVmYXVsdFJhdGU7XG4gICAgICAgIGlmIChyYXRlIDw9IDApIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmF0ZSA8IDEgJiYgTWF0aC5yYW5kb20oKSA+PSByYXRlKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50RW1pdEFsd2F5c1JlY29yZCA9IGFsd2F5c1JlY29yZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQg65iQ7ZWcIHRocm93LWZyZWUg7KCV7LGFXG4gICAgfVxuICB9XG5cbiAgLy8g64K067aAIOynhOuLqCDsnbTrsqTtirgg4oCUIHNhbXBsaW5nL3JhdGUtbGltaXQg7Jqw7ZqMLiBzaHV0ZG93biDspJHsl5Drj4Qg67Cc7ZaJ7ZW0IHRpbWVvdXQv7Iuk7YyoIOynhOuLqOydtCDsnKDsi6TrkJjsp4Ag7JWK64+E66GdIO2VnOuLpC5cbiAgLy8g7IKs7Jqp7J6QIHJlZGFjdG9y7J2YIHR5cGUtbWlzbWF0Y2gg7JyE7ZeY7J2EIO2UvO2VmOq4sCDsnITtlbQgZGVmYXVsdCByZWRhY3RvcuunjCDsoIHsmqntlZzri6QuXG4gIGRpc3BhdGNoSW50ZXJuYWxEaWFnbm9zdGljRXZlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGxldmVsOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImxldmVsXCJdLFxuICAgIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0ge1xuICAgICAgdHlwZTogXCJldmVudFwiLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbW9ub3RvbmljVGltZTogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBydW50aW1lSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZCxcbiAgICAgIG5vZGVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEubm9kZUlkLFxuICAgICAgbmFtZSxcbiAgICAgIGxldmVsLFxuICAgICAgZGV0YWlsLFxuICAgIH07XG5cbiAgICAvLyDsp4Tri6gg7J2067Kk7Yq464qUIO2VreyDgSBkZWZhdWx0IHJlZGFjdG9y66eMIOyggeyaqe2VtCBzaW5r7JeQIOyngeygkSDsoITri6ztlZzri6QuXG4gICAgLy8gKOyCrOyaqeyekCByZWRhY3RvcuqwgCDsp4Tri6gg7J2067Kk7Yq47J2YIHR5cGXsnYQg7J6Y66q7IOuwlOq/lCDrrLTtlZwg66Oo7ZSE66W8IOydvOycvO2CpOuKlCDsnbzsnYQg66eJ64qU64ukLilcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKHNhbml0aXplZC50eXBlICE9PSBcImV2ZW50XCIpIHJldHVybjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hUb1NpbmtzKHNhbml0aXplZCwgZmFsc2UpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJlY29yZChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHtcbiAgICBsZXQgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IHtcbiAgICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBpbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgZGV0YWlsOiBpbnB1dC5kZXRhaWwsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNhcHR1cmVQYXlsb2FkID09PSBcInByZXZpZXdcIiAmJiBpbnB1dC5wYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBwYXlsb2FkUHJldmlldzogdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhpbnB1dC5wYXlsb2FkLCB0aGlzLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEJ5cGFzc1JhdGVMaW1pdChfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIC8vIGFsd2F5c1JlY29yZExldmVsc+yXkCDtlbTri7ntlZjripQgcmVjb3Jk64qUIHNhbXBsaW5n7J2EIOqxsOy5mOyngCDslYrqs6Ag65Ok7Ja07JmU7Jy866mwLFxuICAgIC8vIOq4sOyhtCBjb250cm9sbGVyIOuPmeyekeydhCDrs7TsobTtlZjquLAg7JyE7ZW0IHRva2VuIGJ1Y2tldOuPhCBza2lw7ZWc64ukLlxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQubGV2ZWwgPT09IFwid2FyblwiIHx8IHJlY29yZC5sZXZlbCA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG59XG5cbi8vIC0tIE1ldHJpY1BpcGVsaW5lIC0tXG5cbmNsYXNzIE1ldHJpY1BpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgV2ViU29ja2V0TWV0cmljSW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJtZXRyaWNcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljU291cmNlczogU2V0PFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZT4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbGxlY3Rpb25JbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzbmFwc2hvdFByb3ZpZGVyOiAoKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25FbmFibGVkID0gb3B0aW9ucy5jb2xsZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnNhbXBsZUludGVydmFsTXMgPSBvcHRpb25zLnNhbXBsZUludGVydmFsTXM7XG5cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnNhbXBsZUludGVydmFsTXMgPiAwKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0QW5kRW1pdCgpO1xuICAgICAgfSwgdGhpcy5zYW1wbGVJbnRlcnZhbE1zKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCAmJlxuICAgICAgICB0eXBlb2YgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgXCJ1bnJlZlwiIGluIHRoaXMuY29sbGVjdGlvbkludGVydmFsXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IHRocm93LWZyZWUg7KCV7LGFXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVjb3JkKGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwibWV0cmljXCIsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtb25vdG9uaWNUaW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIHJ1bnRpbWVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEucnVudGltZUlkLFxuICAgICAgbm9kZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQsXG4gICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAga2luZDogaW5wdXQua2luZCxcbiAgICAgIHZhbHVlOiBpbnB1dC52YWx1ZSxcbiAgICAgIHVuaXQ6IGlucHV0LnVuaXQsXG4gICAgICB0YWdzOiBpbnB1dC50YWdzLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBjb25uZWN0aW9uSWQ6IGlucHV0LmNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxuICAgICAgdHJhY2VJZDogaW5wdXQudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogaW5wdXQuc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiBpbnB1dC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiBpbnB1dC5zYW1wbGVkLFxuICAgICAgc25hcHNob3Q6IGlucHV0LnNuYXBzaG90LFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3V0Y29tZSA9IHJlY29yZC50YWdzPy5vdXRjb21lO1xuICAgIGlmIChvdXRjb21lID09PSBcImZhaWxlZFwiIHx8IG91dGNvbWUgPT09IFwicmVqZWN0ZWRcIiB8fCBvdXRjb21lID09PSBcImRyb3BwZWRcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmZhaWx1cmVzXCIpIHx8XG4gICAgICByZWNvcmQubmFtZS5lbmRzV2l0aChcIi5mYWlsdXJlXCIpIHx8XG4gICAgICByZWNvcmQubmFtZS5lbmRzV2l0aChcIi5kcm9wcGVkXCIpIHx8XG4gICAgICByZWNvcmQubmFtZS5pbmNsdWRlcyhcIi5mYWlsdXJlcy5cIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmluY2x1ZGVzKFwiLmRyb3BwZWQuXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRpY2FsUmVjb3JkKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJlZGFjdG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbEJlZm9yZVJlY29yZCgpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG5cbiAgcmVnaXN0ZXJNZXRyaWNTb3VyY2Uoc291cmNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2UpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubWV0cmljU291cmNlcy5kZWxldGUoc291cmNlKTtcbiAgICB9O1xuICB9XG5cbiAgc2V0U25hcHNob3RQcm92aWRlcihwcm92aWRlcjogKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KTogdm9pZCB7XG4gICAgdGhpcy5zbmFwc2hvdFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgYmFzZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90ID0ge1xuICAgICAgLi4uRU1QVFlfTUVUUklDU19TTkFQU0hPVCxcbiAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZToge30sXG4gICAgICB0ZWxlbWV0cnlEcm9wcGVkUmVjb3JkczogdGhpcy5kcm9wcGVkQ291bnQsXG4gICAgICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IHRoaXMuc2lua0ZhaWx1cmVDb3VudCxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgdGhpcy5tZXRyaWNTb3VyY2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJ0aWFsID0gc291cmNlLmNvbGxlY3Qobm93KTtcbiAgICAgICAgYmFzZS5hY3RpdmVDb25uZWN0aW9ucyArPSBwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zID8/IDA7XG4gICAgICAgIGJhc2Uucm9vbUNvdW50ICs9IHBhcnRpYWwucm9vbUNvdW50ID8/IDA7XG4gICAgICAgIGJhc2UucGVuZGluZ0luYm91bmRNZXNzYWdlcyArPSBwYXJ0aWFsLnBlbmRpbmdJbmJvdW5kTWVzc2FnZXMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcyArPSBwYXJ0aWFsLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzID8/IDA7XG4gICAgICAgIGJhc2Uuc29ja2V0QnVmZmVyZWRCeXRlcyArPSBwYXJ0aWFsLnNvY2tldEJ1ZmZlcmVkQnl0ZXMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nRmFuT3V0Sm9icyArPSBwYXJ0aWFsLnBlbmRpbmdGYW5PdXRKb2JzID8/IDA7XG4gICAgICAgIGJhc2UucGVuZGluZ0Zhbk91dFRhcmdldHMgKz0gcGFydGlhbC5wZW5kaW5nRmFuT3V0VGFyZ2V0cyA/PyAwO1xuICAgICAgICBpZiAocGFydGlhbC5hY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbbnMsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICBiYXNlLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2VbbnNdID1cbiAgICAgICAgICAgICAgKGJhc2UuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZVtuc10gPz8gMCkgKyBjb3VudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtZXRyaWMgc291cmNlIOyLpO2MqOuKlCDsmbjrtoDroZwg7KCE7YyM65CY7Ja07ISgIOyViCDrkKhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGNvbGxlY3RBbmRFbWl0KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90UHJvdmlkZXI/LigpID8/IHRoaXMuZ2V0U25hcHNob3QoKTtcbiAgICAgIGNvbnN0IGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCA9IHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9ucy5hY3RpdmVcIixcbiAgICAgICAga2luZDogXCJnYXVnZVwiLFxuICAgICAgICB2YWx1ZTogc25hcHNob3QuYWN0aXZlQ29ubmVjdGlvbnMsXG4gICAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgIH07XG4gICAgICB0aGlzLmVtaXQoaW5wdXQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbWV0cmljcyDsiJjsp5Eg7Iuk7Yyo64qUIOyZuOu2gOuhnCDsoITtjIzrkJjslrTshKAg7JWIIOuQqFxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbkludGVydmFsICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY29sbGVjdGlvbkludGVydmFsKTtcbiAgICAgIHRoaXMuY29sbGVjdGlvbkludGVydmFsID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24odGltZW91dE1zKTtcbiAgfVxufVxuXG4vLyAtLSBTcGFuUGlwZWxpbmUgLS1cblxuY2xhc3MgU3BhblBpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4gIFdlYlNvY2tldFNwYW5JbnB1dCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJlYWRvbmx5IHNpZ25hbCA9IFwic3BhblwiIGFzIGNvbnN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhbkJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZFNwYW5QaXBlbGluZU9wdGlvbnMsIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhKSB7XG4gICAgc3VwZXIoXG4gICAgICBvcHRpb25zLnNpbmtzLFxuICAgICAgb3B0aW9ucy5zdG9yZSxcbiAgICAgIG9wdGlvbnMubWF4UmVjb3Jkc1BlclNlY29uZCxcbiAgICAgIG9wdGlvbnMubWF4SW5GbGlnaHRFbWl0cyxcbiAgICAgIG9wdGlvbnMuc2hhcmVkUmVkYWN0b3IsXG4gICAgICBvcHRpb25zLnNoYXJlZEJlZm9yZVJlY29yZCxcbiAgICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICApO1xuICAgIHRoaXMuc2lnbmFsUmVkYWN0b3IgPSBvcHRpb25zLnNpZ25hbFJlZGFjdG9yO1xuICAgIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkID0gb3B0aW9ucy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gICAgdGhpcy5zYW1wbGluZyA9IHsgZGVmYXVsdFJhdGU6IG9wdGlvbnMuc2FtcGxpbmcuZGVmYXVsdFJhdGUgfTtcbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBzdGF0dXMgPT09IFwiZXJyb3JcIuuKlCBzYW1wbGluZyDsmrDtmoxcbiAgICAgIGlmIChpbnB1dC5zdGF0dXMgIT09IFwiZXJyb3JcIikge1xuICAgICAgICBjb25zdCByYXRlID0gdGhpcy5zYW1wbGluZy5kZWZhdWx0UmF0ZTtcbiAgICAgICAgaWYgKHJhdGUgPD0gMCkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXRlIDwgMSAmJiBNYXRoLnJhbmRvbSgpID49IHJhdGUpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IHRocm93LWZyZWUg7KCV7LGFXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVjb3JkKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzcGFuXCIsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtb25vdG9uaWNUaW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIHJ1bnRpbWVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEucnVudGltZUlkLFxuICAgICAgbm9kZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQsXG4gICAgICBvcGVyYXRpb25OYW1lOiBpbnB1dC5vcGVyYXRpb25OYW1lLFxuICAgICAga2luZDogaW5wdXQua2luZCxcbiAgICAgIGR1cmF0aW9uTXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIG5hbWVzcGFjZTogaW5wdXQubmFtZXNwYWNlLFxuICAgICAgY29ubmVjdGlvbklkOiBpbnB1dC5jb25uZWN0aW9uSWQsXG4gICAgICB1c2VySWQ6IGlucHV0LnVzZXJJZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGlucHV0LmF0dHJpYnV0ZXMsXG4gICAgICBlcnJvclR5cGU6IGlucHV0LmVycm9yVHlwZSxcbiAgICAgIHRyYWNlSWQ6IGlucHV0LnRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IGlucHV0LnNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogaW5wdXQucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogaW5wdXQuc2FtcGxlZCxcbiAgICAgIGV2ZW50czogaW5wdXQuZXZlbnRzLFxuICAgICAgbGlua3M6IGlucHV0LmxpbmtzLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQuc3RhdHVzID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNDcml0aWNhbFJlY29yZChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVjb3JkLnN0YXR1cyA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJlZGFjdG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbEJlZm9yZVJlY29yZCgpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cbn1cblxuLy8gLS0gV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwgLS1cblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXJJbXBsIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEV2ZW50UGlwZWxpbmU7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNzOiBNZXRyaWNQaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNwYW5zOiBTcGFuUGlwZWxpbmU7XG4gIHByb3RlY3RlZCByZWFkb25seSBydW50aW1lSWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vZGVJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VPcHRpb25zOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnM7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaHV0ZG93blRpbWVvdXRNczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBldmVudHM6IEV2ZW50UGlwZWxpbmUsXG4gICAgbWV0cmljczogTWV0cmljUGlwZWxpbmUsXG4gICAgc3BhbnM6IFNwYW5QaXBlbGluZSxcbiAgICB0cmFjZU9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyxcbiAgICBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNczogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcbiAgICB0aGlzLm1ldHJpY3MgPSBtZXRyaWNzO1xuICAgIHRoaXMuc3BhbnMgPSBzcGFucztcbiAgICB0aGlzLnRyYWNlT3B0aW9ucyA9IHRyYWNlT3B0aW9ucztcbiAgICB0aGlzLnJ1bnRpbWVJZCA9IHJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQ7XG4gICAgdGhpcy5ub2RlSWQgPSBydW50aW1lTWV0YWRhdGEubm9kZUlkO1xuICAgIHRoaXMuc2h1dGRvd25UaW1lb3V0TXMgPSBzaHV0ZG93blRpbWVvdXRNcztcblxuICAgIC8vIOuqqOuToCBwaXBlbGluZSDsp4Tri6gg7J2067Kk7Yq464qUIGV2ZW50cyBwaXBlbGluZSDqsr3roZzroZwg65287Jqw7YyF7ZWc64ukLlxuICAgIGNvbnN0IHJlcG9ydGVyOiBJbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPSAobmFtZSwgbGV2ZWwsIGRldGFpbCkgPT4ge1xuICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2hJbnRlcm5hbERpYWdub3N0aWNFdmVudChuYW1lLCBsZXZlbCwgZGV0YWlsKTtcbiAgICB9O1xuICAgIHRoaXMuZXZlbnRzLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5tZXRyaWNzLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5zcGFucy5zZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXIpO1xuICAgIHRoaXMubWV0cmljcy5zZXRTbmFwc2hvdFByb3ZpZGVyKCgpID0+IHRoaXMuZ2V0TWV0cmljc1NuYXBzaG90KCkpO1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHRocm93LWZyZWVcbiAgICB9XG4gIH1cblxuICByZWNvcmRNZXRyaWMoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICB0aGlzLm1ldHJpY3MuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHRocm93LWZyZWVcbiAgICB9XG4gIH1cblxuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc3BhbnMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHRocm93LWZyZWVcbiAgICB9XG4gIH1cblxuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMubWV0cmljcy5nZXRTbmFwc2hvdCgpO1xuICAgICAgYmFzZS50ZWxlbWV0cnlEcm9wcGVkUmVjb3JkcyA9XG4gICAgICAgIHRoaXMuZXZlbnRzLmRyb3BwZWRDb3VudCArIHRoaXMubWV0cmljcy5kcm9wcGVkQ291bnQgKyB0aGlzLnNwYW5zLmRyb3BwZWRDb3VudDtcbiAgICAgIGJhc2UudGVsZW1ldHJ5U2lua0ZhaWx1cmVzID1cbiAgICAgICAgdGhpcy5ldmVudHMuc2lua0ZhaWx1cmVDb3VudCArIHRoaXMubWV0cmljcy5zaW5rRmFpbHVyZUNvdW50ICsgdGhpcy5zcGFucy5zaW5rRmFpbHVyZUNvdW50O1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTtcbiAgICB9XG4gIH1cblxuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmVudHMuc3RvcmU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0cmljcy5zdG9yZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3BhblN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnNwYW5zLnN0b3JlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbm9vcFVuc3Vic2NyaWJlO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnRyYWNlT3B0aW9ucy5leHRyYWN0VHJhY2VQYXJlbnQgJiYgcmVxdWVzdD8uaGVhZGVycykge1xuICAgICAgICBjb25zdCB0cmFjZXBhcmVudEhlYWRlciA9IHJlcXVlc3QuaGVhZGVyc1tcInRyYWNlcGFyZW50XCJdO1xuICAgICAgICBjb25zdCB0cmFjZXBhcmVudFZhbHVlID0gQXJyYXkuaXNBcnJheSh0cmFjZXBhcmVudEhlYWRlcilcbiAgICAgICAgICA/IHRyYWNlcGFyZW50SGVhZGVyWzBdXG4gICAgICAgICAgOiB0cmFjZXBhcmVudEhlYWRlcjtcbiAgICAgICAgaWYgKHRyYWNlcGFyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVRyYWNlUGFyZW50KHRyYWNlcGFyZW50VmFsdWUpO1xuICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQ6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0ID0ge1xuICAgICAgICAgICAgICB0cmFjZUlkOiBwYXJzZWQudHJhY2VJZCxcbiAgICAgICAgICAgICAgcGFyZW50U3BhbklkOiBwYXJzZWQucGFyZW50SWQsXG4gICAgICAgICAgICAgIHNhbXBsZWQ6IHBhcnNlZC5zYW1wbGVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYWNlT3B0aW9ucy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnNwYW5JZCA9IGdlbmVyYXRlU3BhbklkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyAuLi5jb250ZXh0IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy50cmFjZU9wdGlvbnMuZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB0cmFjZUlkOiBnZW5lcmF0ZVRyYWNlSWQoKSwgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy50cmFjZU9wdGlvbnMgfTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICB0aGlzLnNodXRkb3duQ2FsbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnM/LnRpbWVvdXRNcyA/PyB0aGlzLnNodXRkb3duVGltZW91dE1zO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB0aGlzLmV2ZW50cy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgICB0aGlzLm1ldHJpY3Muc2h1dGRvd24odGltZW91dE1zKSxcbiAgICAgICAgdGhpcy5zcGFucy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgXSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHNodXRkb3du7J2AIHRocm93LWZyZWVcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0gRmFjdG9yeSAtLVxuXG5mdW5jdGlvbiBidWlsZENvbnRyb2xsZXIoXG4gIG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGNvbnN0IGRlZmF1bHRzID0gb3B0aW9ucy5kZWZhdWx0cyA/PyB7fTtcbiAgY29uc3QgZXZlbnRzT3B0ID0gb3B0aW9ucy5ldmVudHMgPz8ge307XG4gIGNvbnN0IG1ldHJpY3NPcHQgPSBvcHRpb25zLm1ldHJpY3MgPz8ge307XG4gIGNvbnN0IHNwYW5zT3B0ID0gb3B0aW9ucy5zcGFucyA/PyB7fTtcblxuICBjb25zdCBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQgPVxuICAgIGRlZmF1bHRzLm1heFJlY29yZHNQZXJTZWNvbmQgPz8gREVGQVVMVF9NQVhfUkVDT1JEU19QRVJfU0VDT05EO1xuXG4gIC8vIOyLoO2YuOuzhCByZWRhY3RvciAvIGJlZm9yZVJlY29yZCDtlbTshJ0uXG4gIC8vIG51bGzsnbTrqbQgc2hhcmVkUmVkYWN0b3LrpbwgdW5kZWZpbmVk66GcIOuNruyWtOyNqCBzdGVwIDIg7J6Q7LK066W8IHNraXDtlZzri6QuXG4gIGNvbnN0IGV2ZW50c1NoYXJlZFJlZGFjdG9yID0gZXZlbnRzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IGV2ZW50c1NpZ25hbFJlZGFjdG9yID1cbiAgICB0eXBlb2YgZXZlbnRzT3B0LnJlZGFjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBldmVudHNPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV2ZW50c1NoYXJlZEJlZm9yZVJlY29yZCA9XG4gICAgZXZlbnRzT3B0LmJlZm9yZVJlY29yZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLmJlZm9yZVJlY29yZDtcbiAgY29uc3QgZXZlbnRzU2lnbmFsQmVmb3JlUmVjb3JkID1cbiAgICB0eXBlb2YgZXZlbnRzT3B0LmJlZm9yZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiID8gZXZlbnRzT3B0LmJlZm9yZVJlY29yZCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtZXRyaWNzU2hhcmVkUmVkYWN0b3IgPSBtZXRyaWNzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IG1ldHJpY3NTaWduYWxSZWRhY3RvciA9XG4gICAgdHlwZW9mIG1ldHJpY3NPcHQucmVkYWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IG1ldHJpY3NPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1ldHJpY3NTaGFyZWRCZWZvcmVSZWNvcmQgPVxuICAgIG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBtZXRyaWNzU2lnbmFsQmVmb3JlUmVjb3JkID1cbiAgICB0eXBlb2YgbWV0cmljc09wdC5iZWZvcmVSZWNvcmQgPT09IFwiZnVuY3Rpb25cIiA/IG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNwYW5zU2hhcmVkUmVkYWN0b3IgPSBzcGFuc09wdC5yZWRhY3RvciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLnJlZGFjdG9yO1xuICBjb25zdCBzcGFuc1NpZ25hbFJlZGFjdG9yID1cbiAgICB0eXBlb2Ygc3BhbnNPcHQucmVkYWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IHNwYW5zT3B0LnJlZGFjdG9yIDogdW5kZWZpbmVkO1xuICBjb25zdCBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCA9XG4gICAgc3BhbnNPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBzcGFuc1NpZ25hbEJlZm9yZVJlY29yZCA9XG4gICAgdHlwZW9mIHNwYW5zT3B0LmJlZm9yZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiID8gc3BhbnNPcHQuYmVmb3JlUmVjb3JkIDogdW5kZWZpbmVkO1xuXG4gIC8vIGV2ZW50c1xuICBjb25zdCBldmVudFNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXSA9IGV2ZW50c09wdC5zaW5rcyA/IFsuLi5ldmVudHNPcHQuc2lua3NdIDogW107XG4gIGxldCBldmVudFN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkID0gZXZlbnRzT3B0LnN0b3JlO1xuICBpZiAoZXZlbnRTaW5rcy5sZW5ndGggPT09IDAgJiYgZXZlbnRTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRTdG9yZSA9IG5ldyBJbk1lbW9yeUV2ZW50U3RvcmUoe1xuICAgICAgbWF4UmVjb3JkczogZXZlbnRzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBldmVudHNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgZXZlbnRTaW5rcy5wdXNoKGV2ZW50U3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAoZXZlbnRTdG9yZSAhPT0gdW5kZWZpbmVkICYmICFldmVudFNpbmtzLmluY2x1ZGVzKGV2ZW50U3RvcmUuc2luaykpIHtcbiAgICBldmVudFNpbmtzLnB1c2goZXZlbnRTdG9yZS5zaW5rKTtcbiAgfVxuXG4gIGNvbnN0IGV2ZW50c1Jlc29sdmVkOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBldmVudFNpbmtzLFxuICAgIHN0b3JlOiBldmVudFN0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IGV2ZW50c09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogZXZlbnRzT3B0Lm1heEluRmxpZ2h0RW1pdHMgPz8gREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBldmVudHNTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogZXZlbnRzU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBldmVudHNTaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgc2lnbmFsQmVmb3JlUmVjb3JkOiBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgc2FtcGxpbmc6IHtcbiAgICAgIGRlZmF1bHRSYXRlOiBldmVudHNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFLFxuICAgICAgcmF0ZUJ5RXZlbnQ6IGV2ZW50c09wdC5zYW1wbGluZz8ucmF0ZUJ5RXZlbnQgPz8ge30sXG4gICAgICBhbHdheXNSZWNvcmRMZXZlbHM6IGV2ZW50c09wdC5zYW1wbGluZz8uYWx3YXlzUmVjb3JkTGV2ZWxzID8/IFtcbiAgICAgICAgLi4uREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjYXB0dXJlUGF5bG9hZDogZXZlbnRzT3B0LmNhcHR1cmVQYXlsb2FkID8/IERFRkFVTFRfRVZFTlRfQ0FQVFVSRV9QQVlMT0FELFxuICAgIG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6XG4gICAgICBldmVudHNPcHQubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA/PyBERUZBVUxUX0VWRU5UX01BWF9QQVlMT0FEX1BSRVZJRVdfQllURVMsXG4gIH07XG5cbiAgLy8gbWV0cmljc1xuICBjb25zdCBtZXRyaWNTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdID0gbWV0cmljc09wdC5zaW5rcyA/IFsuLi5tZXRyaWNzT3B0LnNpbmtzXSA6IFtdO1xuICBsZXQgbWV0cmljU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkID0gbWV0cmljc09wdC5zdG9yZTtcbiAgaWYgKG1ldHJpY1NpbmtzLmxlbmd0aCA9PT0gMCAmJiBtZXRyaWNTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWV0cmljU3RvcmUgPSBuZXcgSW5NZW1vcnlNZXRyaWNTdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBtZXRyaWNzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBtZXRyaWNzT3B0Lm1heEJ5dGVzID8/IGRlZmF1bHRzLm1heEJ5dGVzLFxuICAgIH0pO1xuICAgIG1ldHJpY1NpbmtzLnB1c2gobWV0cmljU3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAobWV0cmljU3RvcmUgIT09IHVuZGVmaW5lZCAmJiAhbWV0cmljU2lua3MuaW5jbHVkZXMobWV0cmljU3RvcmUuc2luaykpIHtcbiAgICBtZXRyaWNTaW5rcy5wdXNoKG1ldHJpY1N0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3QgbWV0cmljc1Jlc29sdmVkOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgICBzaW5rczogbWV0cmljU2lua3MsXG4gICAgc3RvcmU6IG1ldHJpY1N0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IG1ldHJpY3NPcHQuc2FtcGxpbmc/Lm1heFJlY29yZHNQZXJTZWNvbmQgPz8gZGVmYXVsdHNNYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG1ldHJpY3NPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IG1ldHJpY3NTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogbWV0cmljc1NpZ25hbFJlZGFjdG9yLFxuICAgIHNoYXJlZEJlZm9yZVJlY29yZDogbWV0cmljc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IG1ldHJpY3NTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgY29sbGVjdGlvbkVuYWJsZWQ6IG1ldHJpY3NPcHQuY29sbGVjdGlvbkVuYWJsZWQgPz8gREVGQVVMVF9NRVRSSUNfQ09MTEVDVElPTl9FTkFCTEVELFxuICAgIHNhbXBsZUludGVydmFsTXM6IG1ldHJpY3NPcHQuc2FtcGxlSW50ZXJ2YWxNcyA/PyBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMsXG4gIH07XG5cbiAgLy8gc3BhbnNcbiAgY29uc3Qgc3BhblNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdID0gc3BhbnNPcHQuc2lua3MgPyBbLi4uc3BhbnNPcHQuc2lua3NdIDogW107XG4gIGxldCBzcGFuU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCA9IHNwYW5zT3B0LnN0b3JlO1xuICBpZiAoc3BhblNpbmtzLmxlbmd0aCA9PT0gMCAmJiBzcGFuU3RvcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHNwYW5TdG9yZSA9IG5ldyBJbk1lbW9yeVNwYW5TdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBzcGFuc09wdC5tYXhSZWNvcmRzID8/IGRlZmF1bHRzLm1heFJlY29yZHMsXG4gICAgICBtYXhCeXRlczogc3BhbnNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9IGVsc2UgaWYgKHNwYW5TdG9yZSAhPT0gdW5kZWZpbmVkICYmICFzcGFuU2lua3MuaW5jbHVkZXMoc3BhblN0b3JlLnNpbmspKSB7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3Qgc3BhbnNSZXNvbHZlZDogUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBzcGFuU2lua3MsXG4gICAgc3RvcmU6IHNwYW5TdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBzcGFuc09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogc3BhbnNPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IHNwYW5zU2hhcmVkUmVkYWN0b3IsXG4gICAgc2lnbmFsUmVkYWN0b3I6IHNwYW5zU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkLFxuICAgIHNhbXBsaW5nOiB7XG4gICAgICBkZWZhdWx0UmF0ZTogc3BhbnNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfU1BBTl9TQU1QTElOR19ERUZBVUxUX1JBVEUsXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBldmVudFBpcGVsaW5lID0gbmV3IEV2ZW50UGlwZWxpbmUoZXZlbnRzUmVzb2x2ZWQsIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIGNvbnN0IG1ldHJpY1BpcGVsaW5lID0gbmV3IE1ldHJpY1BpcGVsaW5lKG1ldHJpY3NSZXNvbHZlZCwgcnVudGltZU1ldGFkYXRhKTtcbiAgY29uc3Qgc3BhblBpcGVsaW5lID0gbmV3IFNwYW5QaXBlbGluZShzcGFuc1Jlc29sdmVkLCBydW50aW1lTWV0YWRhdGEpO1xuXG4gIGNvbnN0IHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICAgIGV4dHJhY3RUcmFjZVBhcmVudDpcbiAgICAgIG9wdGlvbnMudHJhY2U/LmV4dHJhY3RUcmFjZVBhcmVudCA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMuZXh0cmFjdFRyYWNlUGFyZW50LFxuICAgIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOlxuICAgICAgb3B0aW9ucy50cmFjZT8uZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UgPz8gREVGQVVMVF9UUkFDRV9PUFRJT05TLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlLFxuICAgIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTpcbiAgICAgIG9wdGlvbnMudHJhY2U/LnByb3BhZ2F0ZU1lc3NhZ2VUcmFjZSA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMucHJvcGFnYXRlTWVzc2FnZVRyYWNlLFxuICAgIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46XG4gICAgICBvcHRpb25zLnRyYWNlPy5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuID8/XG4gICAgICBERUZBVUxUX1RSQUNFX09QVElPTlMucmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbixcbiAgfTtcblxuICBjb25zdCBzaHV0ZG93blRpbWVvdXRNcyA9IG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0TXMgPz8gREVGQVVMVF9TSFVURE9XTl9USU1FT1VUX01TO1xuXG4gIHJldHVybiBuZXcgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwoXG4gICAgZXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuUGlwZWxpbmUsXG4gICAgdHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgaWdub3JlZEtleXMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKVxuICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSBcImVuYWJsZWRcIiAmJiBrZXkgIT09IFwiY29udHJvbGxlclwiICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgaWYgKGlnbm9yZWRLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgV2ViU29ja2V0IHRlbGVtZXRyeSBjb250cm9sbGVyIG9wdGlvbiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB0ZWxlbWV0cnkgb3B0aW9uczogJHtpZ25vcmVkS2V5cy5qb2luKFxuICAgICAgXCIsIFwiLFxuICAgICl9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIoXG4gIHRlbGVtZXRyeU9wdGlvbjogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGlmICh0ZWxlbWV0cnlPcHRpb24gPT09IHVuZGVmaW5lZCB8fCB0ZWxlbWV0cnlPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBidWlsZENvbnRyb2xsZXIoe30sIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyKSB7XG4gICAgYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKHRlbGVtZXRyeU9wdGlvbik7XG4gICAgcmV0dXJuIHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkQ29udHJvbGxlcih0ZWxlbWV0cnlPcHRpb24sIHJ1bnRpbWVNZXRhZGF0YSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUErYUEsU0FBUyxlQUFlLEtBQXNCO0NBQzVDLE1BQU0sYUFBYSxJQUFJLFFBQVEsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLFlBQVk7Q0FDaEUsT0FBTyx1QkFBdUIsTUFBTSxZQUFZLFdBQVcsU0FBUyxPQUFPLENBQUM7QUFDOUU7QUFFQSxTQUFTLFlBQVksT0FBZ0IsS0FBdUI7Q0FDMUQsSUFBSSxRQUFRLFVBQWEsZUFBZSxHQUFHLEdBQ3pDLE9BQU87Q0FHVCxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQ3JCLE9BQU8sTUFBTSxLQUFLLFNBQVMsWUFBWSxJQUFJLENBQUM7Q0FHOUMsSUFBSSxpQkFBaUIs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
|
|
882
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bnRpbWVUeXBlT2YgfSBmcm9tIFwiLi4vcnVudGltZS10eXBlXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUsIGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgSW5NZW1vcnlFdmVudFN0b3JlLCBJbk1lbW9yeU1ldHJpY1N0b3JlLCBJbk1lbW9yeVNwYW5TdG9yZSB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS1tZW1vcnlcIjtcbmltcG9ydCB7IGdlbmVyYXRlU3BhbklkLCBnZW5lcmF0ZVRyYWNlSWQsIHBhcnNlVHJhY2VQYXJlbnQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWUgPVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBiaWdpbnRcbiAgfCBib29sZWFuXG4gIHwgbnVtYmVyXG4gIHwgc3RyaW5nXG4gIHwgRGF0ZVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeVZhbHVlW11cbiAgfCBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMge1xuICBba2V5OiBzdHJpbmddOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZTtcbn1cblxuLy8gLS0gUmVjb3JkIHR5cGVzICh1bmNoYW5nZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgPSB7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBtb25vdG9uaWNUaW1lPzogbnVtYmVyO1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICAvLyB1c2VySWTripQgY29ubmVjdGlvbiDshozsnKDsnpDrpbwg7Iud67OE7ZWY6riwIOychO2VnCBvcGFxdWUgaWRlbnRpZmllciAo67O07Ya1IERCIFBLKVxuICAvLyBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcuuhnOunjCDsgqzsmqntlZjrqbAsIOydtOuplOydvC/soITtmZTrsojtmLgg65OxIFBJSeuKlCDrk6TslrTqsIDsp4Ag7JWK64qU64uk6rOgIOqwgOygle2VqFxuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJldmVudFwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxldmVsOiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGRldGFpbD86IFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXM7XG4gIHBheWxvYWRQcmV2aWV3Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJtZXRyaWNcIjtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kOiBcImNvdW50ZXJcIiB8IFwiaGlzdG9ncmFtXCIgfCBcImdhdWdlXCI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHVuaXQ/OiBcIjFcIiB8IFwibXNcIiB8IFwiQnlcIjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHNuYXBzaG90PzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCA9IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgJiB7XG4gIHR5cGU6IFwic3BhblwiO1xuICBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiaW50ZXJuYWxcIiB8IFwicHJvZHVjZXJcIiB8IFwiY29uc3VtZXJcIiB8IFwic2VydmVyXCIgfCBcImNsaWVudFwiO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHN0YXR1czogXCJ1bnNldFwiIHwgXCJva1wiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGVycm9yVHlwZT86IHN0cmluZztcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgPVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZDtcblxuLy8gLS0gSW5wdXQgdHlwZXMgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbDogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBkZXRhaWw/OiBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzO1xuICBwYXlsb2FkPzogV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWU7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiY291bnRlclwiIHwgXCJoaXN0b2dyYW1cIiB8IFwiZ2F1Z2VcIjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdD86IFwiMVwiIHwgXCJtc1wiIHwgXCJCeVwiO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xuICBzbmFwc2hvdD86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFNwYW5JbnB1dCA9IHtcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICBraW5kOiBcImludGVybmFsXCIgfCBcInByb2R1Y2VyXCIgfCBcImNvbnN1bWVyXCIgfCBcInNlcnZlclwiIHwgXCJjbGllbnRcIjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBzdGF0dXM6IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBlcnJvclR5cGU/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlJbnB1dCA9XG4gIHwgKHsgdHlwZTogXCJldmVudFwiIH0gJiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KVxuICB8ICh7IHR5cGU6IFwibWV0cmljXCIgfSAmIFdlYlNvY2tldE1ldHJpY0lucHV0KVxuICB8ICh7IHR5cGU6IFwic3BhblwiIH0gJiBXZWJTb2NrZXRTcGFuSW5wdXQpO1xuXG4vLyAtLSBNZXRyaWNzIHNuYXBzaG90IC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCA9IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHJvb21Db3VudDogbnVtYmVyO1xuICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dEpvYnM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5RHJvcHBlZFJlY29yZHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5U2lua0ZhaWx1cmVzOiBudW1iZXI7XG59O1xuXG4vLyAtLSBDb25uZWN0aW9uIHNuYXBzaG90IChUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24pIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCA9IHtcbiAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbnVtYmVyO1xuICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbnVtYmVyO1xuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbiB7XG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdDtcbn1cblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHNpbmtzIC0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1Npbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBxdWVyeSBmaWx0ZXJzIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxldmVsPzogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJjb3VudGVyXCIgfCBcImhpc3RvZ3JhbVwiIHwgXCJnYXVnZVwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyID0ge1xuICBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIHN0YXR1cz86IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBzdG9yZXMgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcbiAgcXVlcnkoZmlsdGVyOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmRbXTtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuLy8gLS0gTWV0cmljIHNvdXJjZSBpbnRlcmZhY2UgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2Uge1xuICBjb2xsZWN0KG5vdzogbnVtYmVyKTogUGFydGlhbDxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q+O1xufVxuXG4vLyAtLSBSZWRhY3RvciAvIGJlZm9yZVJlY29yZCB0eXBlcyAoc2lnbmFsLW5hcnJvd2VkICsgc2hhcmVkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbi8vIC0tIFRyYWNlIG9wdGlvbnMgLyBjb25uZWN0aW9uIGNvbnRleHQgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICBleHRyYWN0VHJhY2VQYXJlbnQ6IGJvb2xlYW47XG4gIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOiBib29sZWFuO1xuICBwcm9wYWdhdGVNZXNzYWdlVHJhY2U6IGJvb2xlYW47XG4gIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCA9IHtcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICBnZXRUZWxlbWV0cnlDb250ZXh0KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0O1xufVxuXG4vLyAtLSBPcHRpb25zIHNjaGVtYSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIHJhdGVCeUV2ZW50PzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbiAgYWx3YXlzUmVjb3JkTGV2ZWxzPzogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2FtcGxpbmdPcHRpb25zID0ge1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlEZWZhdWx0c09wdGlvbnMgPSB7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3I7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZDtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudHNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZT86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmU7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzPzogbnVtYmVyO1xuICByZWRhY3Rvcj86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IG51bGw7XG4gIHNhbXBsaW5nPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTYW1wbGluZ09wdGlvbnM7XG4gIGNhcHR1cmVQYXlsb2FkPzogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZTtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM/OiBudW1iZXI7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCBudWxsO1xuICBzYW1wbGluZz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NhbXBsaW5nT3B0aW9ucztcbiAgY29sbGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBzYW1wbGVJbnRlcnZhbE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhbnNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW107XG4gIHN0b3JlPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0cz86IG51bWJlcjtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgbnVsbDtcbiAgc2FtcGxpbmc/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2FtcGxpbmdPcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyA9IHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGNvbnRyb2xsZXI/OiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyO1xuICBkZWZhdWx0cz86IFdlYlNvY2tldFRlbGVtZXRyeURlZmF1bHRzT3B0aW9ucztcbiAgZXZlbnRzPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRzT3B0aW9ucztcbiAgbWV0cmljcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zO1xuICBzcGFucz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5zT3B0aW9ucztcbiAgdHJhY2U/OiBQYXJ0aWFsPFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucz47XG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xufTtcblxuLy8gLS0gQ29udHJvbGxlciBpbnRlcmZhY2UgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQ7XG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkO1xuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkO1xuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQ7XG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dDtcbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyAtLSBDb25zdGFudHMgYW5kIHNoYXJlZCBoZWxwZXJzIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmV4cG9ydCBjb25zdCBFTVBUWV9NRVRSSUNTX1NOQVBTSE9UOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gIHRpbWVzdGFtcDogMCxcbiAgYWN0aXZlQ29ubmVjdGlvbnM6IDAsXG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IHt9LFxuICByb29tQ291bnQ6IDAsXG4gIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IDAsXG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiAwLFxuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiAwLFxuICBwZW5kaW5nRmFuT3V0Sm9iczogMCxcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IDAsXG4gIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiAwLFxuICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IDAsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UUkFDRV9PUFRJT05TOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gIGV4dHJhY3RUcmFjZVBhcmVudDogdHJ1ZSxcbiAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6IHRydWUsXG4gIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTogdHJ1ZSxcbiAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjogZmFsc2UsXG59O1xuXG5jb25zdCBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVRfTVMgPSAyXzAwMDtcbmNvbnN0IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUzogUmVhZG9ubHlBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj4gPSBbXCJ3YXJuXCIsIFwiZXJyb3JcIl07XG5jb25zdCBERUZBVUxUX0VWRU5UX0NBUFRVUkVfUEFZTE9BRDogZmFsc2UgfCBcInByZXZpZXdcIiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9FVkVOVF9NQVhfUEFZTE9BRF9QUkVWSUVXX0JZVEVTID0gMTAyNDtcbmNvbnN0IERFRkFVTFRfTUVUUklDX0NPTExFQ1RJT05fRU5BQkxFRCA9IHRydWU7XG5jb25zdCBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NQQU5fU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LID0gMTAwO1xuXG5jb25zdCBTRU5TSVRJVkVfS0VZX1BBVFRFUk5TID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJjb29raWVcIixcbiAgXCJ0b2tlblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VjcmV0XCIsXG4gIFwiYXBpa2V5XCIsXG4gIFwic2Vzc2lvblwiLFxuICBcImVtYWlsXCIsXG5dIGFzIGNvbnN0O1xuY29uc3QgUkVEQUNURURfVkFMVUUgPSBcIltyZWRhY3RlZF1cIjtcblxuZnVuY3Rpb24gaXNTZW5zaXRpdmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGtleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFNFTlNJVElWRV9LRVlfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gbm9ybWFsaXplZC5pbmNsdWRlcyhwYXR0ZXJuKSk7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdFZhbHVlKHZhbHVlOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZSwga2V5Pzogc3RyaW5nKTogV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWUge1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgaXNTZW5zaXRpdmVLZXkoa2V5KSkge1xuICAgIHJldHVybiBSRURBQ1RFRF9WQUxVRTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlZGFjdFZhbHVlKGl0ZW0pKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAodmFsdWUgJiYgaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICBjb25zdCByZWRhY3RlZDogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHJlZGFjdGVkW2NoaWxkS2V5XSA9IHJlZGFjdFZhbHVlKGNoaWxkVmFsdWUsIGNoaWxkS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZGFjdGVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg4oCUIHNlbnNpdGl2ZSBrZXkg7Yyo7YS0IOq4sOuwmCBidWlsdC1pbiByZWRhY3Rvci5cbiAqIHBpcGVsaW5lIGVtaXQgZmxvd+ydmCDssqsg64uo6rOE7JeQ7IScIO2VreyDgSDsoIHsmqnrkJzri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3QocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQpOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQge1xuICBpZiAocmVjb3JkLnR5cGUgPT09IFwiZXZlbnRcIikge1xuICAgIC8vIFNBRkVUWTogcmVkYWN0b3LripQg7J2067Kk7Yq4IOugiOy9lOuTnOydmCDtgqQg6rWs7KGw66W8IOycoOyngO2VmOqzoCDqsJLrp4wg66eI7Iqk7YK57ZWc64ukLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBhdHRyaWJ1dGVzOiByZWNvcmQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJhdHRyaWJ1dGVzXCJdKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRldGFpbDogcmVjb3JkLmRldGFpbFxuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuZGV0YWlsKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImRldGFpbFwiXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwYXlsb2FkUHJldmlldzogcmVjb3JkLnBheWxvYWRQcmV2aWV3LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVjb3JkLnR5cGUgPT09IFwibWV0cmljXCIpIHtcbiAgICAvLyBTQUZFVFk6IHJlZGFjdG9y64qUIOuplO2KuOumrSDroIjsvZTrk5zsnZgg7YKkIOq1rOyhsOulvCDsnKDsp4DtlZjqs6Ag6rCS66eMIOuniOyKpO2Cue2VnOuLpC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3JkLFxuICAgICAgdGFnczogcmVjb3JkLnRhZ3NcbiAgICAgICAgPyAocmVkYWN0VmFsdWUocmVjb3JkLnRhZ3MpIGFzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtcInRhZ3NcIl0pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc25hcHNob3Q6IHJlY29yZC5zbmFwc2hvdCA/IHsgLi4ucmVjb3JkLnNuYXBzaG90IH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFNBRkVUWTogcmVkYWN0b3LripQgc3BhbuqzvCDtlZjsnIQg7J2067Kk7Yq4wrfrp4HtgazsnZgg7YKkIOq1rOyhsOulvCDsnKDsp4DtlZjqs6Ag6rCS66eMIOuniOyKpO2Cue2VnOuLpC5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZWNvcmQsXG4gICAgYXR0cmlidXRlczogcmVjb3JkLmF0dHJpYnV0ZXNcbiAgICAgID8gKHJlZGFjdFZhbHVlKHJlY29yZC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkW1wiYXR0cmlidXRlc1wiXSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogcmVjb3JkLmV2ZW50cz8ubWFwKChldmVudCkgPT4gKHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgYXR0cmlidXRlczogZXZlbnQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShldmVudC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSksXG4gICAgbGlua3M6IHJlY29yZC5saW5rcz8ubWFwKChsaW5rKSA9PiAoe1xuICAgICAgLi4ubGluayxcbiAgICAgIGF0dHJpYnV0ZXM6IGxpbmsuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShsaW5rLmF0dHJpYnV0ZXMpIGFzIFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhwYXlsb2FkOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZSwgbWF4Qnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHJlZGFjdFZhbHVlKHBheWxvYWQpKTtcbiAgICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoc2VyaWFsaXplZCwgXCJ1dGYtOFwiKSA8PSBtYXhCeXRlcykge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVuY2F0ZVV0ZjhTdHJpbmcoc2VyaWFsaXplZCwgbWF4Qnl0ZXMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJbdW5zZXJpYWxpemFibGVdXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVVdGY4U3RyaW5nKHZhbHVlOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWF4Qnl0ZXMgPD0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgY29uc3Qgc3VmZml4ID0gbWF4Qnl0ZXMgPj0gMyA/IFwiLi4uXCIgOiBcIlwiO1xuICBjb25zdCBjb250ZW50QnVkZ2V0ID0gbWF4Qnl0ZXMgLSBCdWZmZXIuYnl0ZUxlbmd0aChzdWZmaXgsIFwidXRmLThcIik7XG4gIGxldCByZXN1bHQgPSBcIlwiO1xuICBsZXQgdXNlZEJ5dGVzID0gMDtcblxuICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICBjb25zdCBjaGFyQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChjaGFyLCBcInV0Zi04XCIpO1xuICAgIGlmICh1c2VkQnl0ZXMgKyBjaGFyQnl0ZXMgPiBjb250ZW50QnVkZ2V0KSBicmVhaztcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgICB1c2VkQnl0ZXMgKz0gY2hhckJ5dGVzO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCArIHN1ZmZpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IHZhbHVlIGlzIFZhbHVlICYgUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcInRoZW5cIiBpbiB2YWx1ZSAmJiBcImNhdGNoXCIgaW4gdmFsdWU7XG59XG5cbi8vIC0tIFRva2VuQnVja2V0ICh1bmNoYW5nZWQpIC0tXG5cbmNsYXNzIFRva2VuQnVja2V0IHtcbiAgcHJpdmF0ZSB0b2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSBsYXN0UmVmaWxsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhUb2tlbnM6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmlsbFJhdGU6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy50b2tlbnMgPSBtYXhUb2tlbnM7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHRyeUNvbnN1bWUoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZWZpbGwoKTtcbiAgICBpZiAodGhpcy50b2tlbnMgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50b2tlbnMgLT0gMTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmaWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZWxhcHNlZCA9IChub3cgLSB0aGlzLmxhc3RSZWZpbGwpIC8gMTAwMDtcbiAgICB0aGlzLnRva2VucyA9IE1hdGgubWluKHRoaXMubWF4VG9rZW5zLCB0aGlzLnRva2VucyArIGVsYXBzZWQgKiB0aGlzLnJlZmlsbFJhdGUpO1xuICAgIHRoaXMubGFzdFJlZmlsbCA9IG5vdztcbiAgfVxufVxuXG4vLyAtLSBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciAocHJlc2VydmVkLWJlaGF2aW9yKSAtLVxuXG5jb25zdCBub29wVW5zdWJzY3JpYmUgPSAoKTogdm9pZCA9PiB7fTtcblxuZXhwb3J0IGNsYXNzIE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGVtaXQoX2lucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgcmVjb3JkTWV0cmljKF9pbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICByZWNvcmRTcGFuKF9pbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgZ2V0TWV0cmljc1NuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHsgLi4uRU1QVFlfTUVUUklDU19TTkFQU0hPVCwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gIH1cblxuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRNZXRyaWNTdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFNwYW5TdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShfc291cmNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2UpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gbm9vcFVuc3Vic2NyaWJlO1xuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoX3JlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHsgLi4uREVGQVVMVF9UUkFDRV9PUFRJT05TIH07XG4gIH1cblxuICBzaHV0ZG93bihfb3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cblxuLy8gLS0gUmVzb2x2ZWQgcGVyLXBpcGVsaW5lIG9wdGlvbiB0eXBlcyAoaW50ZXJuYWwpIC0tXG5cbnR5cGUgUnVudGltZU1ldGFkYXRhID0ge1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG59O1xuXG50eXBlIFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMgPSB7XG4gIHNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ6IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICAgIHJhdGVCeUV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGFsd2F5c1JlY29yZExldmVsczogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xuICB9O1xuICBjYXB0dXJlUGF5bG9hZDogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlczogbnVtYmVyO1xufTtcblxudHlwZSBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgc2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgY29sbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbn07XG5cbnR5cGUgUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICBzaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZDtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzOiBudW1iZXI7XG4gIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhbkJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xufTtcblxuLy8gLS0gSW50ZXJuYWwgZXZlbnQgcmVwb3J0ZXIgdHlwZSAtLVxuLy8gRXZlbnRQaXBlbGluZSDsnpDsi6Dqs7wgY29udHJvbGxlcuqwgCDrgrTrtoAg7KeE64uoIOydtOuypO2KuOulvCDrsJztlontlaAg65WMIOyCrOyaqe2VnOuLpC5cbi8vIHR5cGUtbWlzbWF0Y2ggLyBzaHV0ZG93bi50aW1lb3V0IC8gc2luay5mYWlsZWQg65Ox7J2EIGV2ZW50cyBwaXBlbGluZSDqsr3roZzroZwg67O064K464ukLlxudHlwZSBJbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gIGRldGFpbD86IFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMsXG4pID0+IHZvaWQ7XG5cbi8vIC0tIFRlbGVtZXRyeVBpcGVsaW5lIChhYnN0cmFjdCkgLS1cblxuYWJzdHJhY3QgY2xhc3MgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFRSZWNvcmQgZXh0ZW5kcyBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4gIFRJbnB1dCxcbiAgVFNpbmsgZXh0ZW5kcyB7XG4gICAgZW1pdChyZWNvcmQ6IFRSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBzaHV0ZG93bj8ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfSxcbiAgVFN0b3JlIGV4dGVuZHMgeyByZWFkb25seSBzaW5rOiBUU2luazsgY2xlYXIoKTogdm9pZCB9IHwgdW5kZWZpbmVkLFxuPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHNpZ25hbDogXCJldmVudFwiIHwgXCJtZXRyaWNcIiB8IFwic3BhblwiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lua3M6IFRTaW5rW107XG4gIHByb3RlY3RlZCByZWFkb25seSB0ZWxlbWV0cnlTdG9yZTogVFN0b3JlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5CdWNrZXQ6IFRva2VuQnVja2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGE7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGludGVybmFsRXZlbnRSZXBvcnRlcjogSW50ZXJuYWxFdmVudFJlcG9ydGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGluRmxpZ2h0RW1pdHMgPSBuZXcgV2Vha01hcDxUU2luaywgbnVtYmVyPigpO1xuICBkcm9wcGVkQ291bnQgPSAwO1xuICBzaW5rRmFpbHVyZUNvdW50ID0gMDtcbiAgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgc2lua3M6IFRTaW5rW10sXG4gICAgc3RvcmU6IFRTdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXIsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZCxcbiAgICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZCxcbiAgICBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSxcbiAgKSB7XG4gICAgdGhpcy5zaW5rcyA9IHNpbmtzO1xuICAgIHRoaXMudGVsZW1ldHJ5U3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLnRva2VuQnVja2V0ID0gbmV3IFRva2VuQnVja2V0KG1heFJlY29yZHNQZXJTZWNvbmQsIG1heFJlY29yZHNQZXJTZWNvbmQpO1xuICAgIHRoaXMubWF4SW5GbGlnaHRFbWl0cyA9IG1heEluRmxpZ2h0RW1pdHM7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RvciA9IHNoYXJlZFJlZGFjdG9yO1xuICAgIHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkID0gc2hhcmVkQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMucnVudGltZU1ldGFkYXRhID0gcnVudGltZU1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0IHN0b3JlKCk6IFRTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMudGVsZW1ldHJ5U3RvcmU7XG4gIH1cblxuICBzZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID0gcmVwb3J0ZXI7XG4gIH1cblxuICBhYnN0cmFjdCBlbWl0KGlucHV0OiBUSW5wdXQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZFJlY29yZChpbnB1dDogVElucHV0KTogVFJlY29yZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogVFJlY29yZCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBUUmVjb3JkKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsUmVkYWN0b3IoKTogKChyZWNvcmQ6IFRSZWNvcmQpID0+IFRSZWNvcmQgfCBudWxsKSB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6ICgocmVjb3JkOiBUUmVjb3JkKSA9PiBUUmVjb3JkIHwgbnVsbCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8g6rO17Ya1IGVtaXQg7Z2Q66aELiDrqqjrk6Ag7Iug7Zi467OEIHBpcGVsaW5l7J2YIGVtaXTsnbQg7J20IOuplOyEnOuTnOuhnCDsnITsnoTtlZzri6QuXG4gIHByb3RlY3RlZCBlbWl0SW50ZXJuYWwoaW5wdXQ6IFRJbnB1dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICBsZXQgcmVjb3JkOiBUUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gICAgaWYgKCFza2lwUmF0ZUxpbWl0ICYmICF0aGlzLnRva2VuQnVja2V0LnRyeUNvbnN1bWUoKSkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg7ZWt7IOBIOyggeyaqVxuICAgIGxldCBwcmVwYXJlZDogVFJlY29yZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWZ0ZXJEZWZhdWx0ID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKGFmdGVyRGVmYXVsdC50eXBlICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICAvLyDrsKnslrQg66Gc7KeBIOKAlCDrs7gg6rWs7ZiE7JeQ7ISc64qUIOuwnOyDne2VmOyngCDslYrsp4Drp4wgdHlwZS1uYXJyb3frpbwg7JyE7ZW0IOqygOymnVxuICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmVwYXJlZCA9XG4gICAgICAgIC8qIFNBRkVUWTog65Ox66Gd65CcIFdlYlNvY2tldCDsnbTrsqTtirgg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gYWZ0ZXJEZWZhdWx0IGFzIFRSZWNvcmQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMjogc2hhcmVkUmVkYWN0b3IgKOydtOuvuCBidWlsZENvbnRyb2xsZXLsl5DshJwgc2lnbmFsUmVkYWN0b3I9PT1udWxs7J2066m0IHNoYXJlZFJlZGFjdG9yPXVuZGVmaW5lZOuhnCDrja7slrTsk7Qg7IOB7YOcKVxuICAgIGlmICh0aGlzLnNoYXJlZFJlZGFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNoYXJlZFJlZGFjdG9yID0gdGhpcy5zaGFyZWRSZWRhY3RvcjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ocHJlcGFyZWQsIChyKSA9PiBzaGFyZWRSZWRhY3RvcihyKSwgXCJzaGFyZWRcIiwgXCJyZWRhY3RvclwiKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIHByZXBhcmVkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMzogc2lnbmFsUmVkYWN0b3JcbiAgICBjb25zdCBzaWduYWxSZWRhY3RvciA9IHRoaXMuZ2V0U2lnbmFsUmVkYWN0b3IoKTtcbiAgICBpZiAoc2lnbmFsUmVkYWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShwcmVwYXJlZCwgKHIpID0+IHNpZ25hbFJlZGFjdG9yKHIpLCBcInNpZ25hbFwiLCBcInJlZGFjdG9yXCIpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gc3RlcCA0OiBzaGFyZWRCZWZvcmVSZWNvcmRcbiAgICBpZiAodGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2hhcmVkQmVmb3JlUmVjb3JkID0gdGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQ7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNoYXJlZEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaGFyZWRcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDU6IHNpZ25hbEJlZm9yZVJlY29yZFxuICAgIGNvbnN0IHNpZ25hbEJlZm9yZVJlY29yZCA9IHRoaXMuZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk7XG4gICAgaWYgKHNpZ25hbEJlZm9yZVJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNpZ25hbEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaWduYWxcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoVG9TaW5rcyhwcmVwYXJlZCk7XG4gIH1cblxuICAvLyByZWRhY3RvciDrmJDripQgYmVmb3JlUmVjb3JkIDHtmowg7KCB7JqpLiDrsJjtmZjqsJLsnbQgbnVsbOydtOuptCBkcm9wLCB0eXBlIOu2iOydvOy5mOuptCBkcm9wICsgaW50ZXJuYWwgZXZlbnQuXG4gIC8vIHNoYXJlZCDrs4DtmZjsnYAgd2lkZXIgcmVjb3Jk66W8IOuwm+yVhCB3aWRlciByZWNvcmTrpbwg67CY7ZmY7ZWY7KeA66eMLCBzaWduYWwg67OA7ZmY7J2AIG5hcnJvd2VkIFRSZWNvcmTrgbzrpqwg67OA7ZmY7ZWc64ukLlxuICAvLyDslpHsqr0g66qo65GQIOuPmeydvO2VnCB0eXBlLW1pc21hdGNoIGRlZmVuc2l2ZSDqsoDsgqzrpbwg6rGw7Lmc64ukLlxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtKFxuICAgIHJlY29yZDogVFJlY29yZCxcbiAgICBydW5uZXI6IChyZWNvcmQ6IFRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGwsXG4gICAgc291cmNlOiBcInNoYXJlZFwiIHwgXCJzaWduYWxcIixcbiAgICBraW5kOiBcInJlZGFjdG9yXCIgfCBcImJlZm9yZVJlY29yZFwiLFxuICApOiBUUmVjb3JkIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkIHwgbnVsbDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gcnVubmVyKHJlY29yZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudHlwZSAhPT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICBjb25zdCBldmVudE5hbWUgPVxuICAgICAgICBraW5kID09PSBcInJlZGFjdG9yXCJcbiAgICAgICAgICA/IFwid3MudGVsZW1ldHJ5LnJlZGFjdG9yLnR5cGVfbWlzbWF0Y2hcIlxuICAgICAgICAgIDogXCJ3cy50ZWxlbWV0cnkuYmVmb3JlUmVjb3JkLnR5cGVfbWlzbWF0Y2hcIjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KGV2ZW50TmFtZSwgXCJ3YXJuXCIsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IHJlY29yZC50eXBlLFxuICAgICAgICBhY3R1YWw6IHJlc3VsdC50eXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHJlc3VsdC50eXBlID09PSByZWNvcmQudHlwZSA9PT0gVFJlY29yZFtcInR5cGVcIl3snbTrr4DroZwgbmFycm93ZWQgVFJlY29yZOuhnCDslYjsoITtlZjqsowg7KKB7Z6QIOyImCDsnojri6QuXG4gICAgcmV0dXJuIC8qIFNBRkVUWTog65Ox66Gd65CcIFdlYlNvY2tldCDsnbTrsqTtirgg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmVzdWx0IGFzIFRSZWNvcmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzcGF0Y2hUb1NpbmtzKHJlY29yZDogVFJlY29yZCwgc2VsZk9ic2VydmVGYWlsdXJlcyA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zdCBjcml0aWNhbCA9IHRoaXMuaXNDcml0aWNhbFJlY29yZChyZWNvcmQpO1xuICAgIGxldCBkcm9wcGVkRm9yUmVjb3JkID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNpbmsgb2YgdGhpcy5zaW5rcykge1xuICAgICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLmluRmxpZ2h0RW1pdHMuZ2V0KHNpbmspID8/IDA7XG4gICAgICBpZiAoIWNyaXRpY2FsICYmIGluRmxpZ2h0ID49IHRoaXMubWF4SW5GbGlnaHRFbWl0cykge1xuICAgICAgICBpZiAoIWRyb3BwZWRGb3JSZWNvcmQpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIGRyb3BwZWRGb3JSZWNvcmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzaW5rLmVtaXQocmVjb3JkKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UocmVzdWx0KSkge1xuICAgICAgICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5zZXQoc2luaywgaW5GbGlnaHQgKyAxKTtcbiAgICAgICAgICByZXN1bHQudGhlbihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGNhdXNlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbmspO1xuICAgICAgICAgICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcImVtaXRcIiwgY2F1c2UsIHNlbGZPYnNlcnZlRmFpbHVyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcImVtaXRcIiwgZXJyb3IsIHNlbGZPYnNlcnZlRmFpbHVyZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbms6IFRTaW5rKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaW5GbGlnaHRFbWl0cy5nZXQoc2luaykgPz8gMDtcbiAgICBpZiAoY3VycmVudCA8PSAxKSB7XG4gICAgICB0aGlzLmluRmxpZ2h0RW1pdHMuZGVsZXRlKHNpbmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluRmxpZ2h0RW1pdHMuc2V0KHNpbmssIGN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZVNpbmtGYWlsdXJlPFZhbHVlPihcbiAgICBwaGFzZTogXCJlbWl0XCIgfCBcInNodXRkb3duXCIsXG4gICAgZXJyb3I6IFZhbHVlLFxuICAgIHNlbGZPYnNlcnZlRmFpbHVyZTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgaWYgKCFzZWxmT2JzZXJ2ZUZhaWx1cmUpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChcIndzLnRlbGVtZXRyeS5zaW5rLmZhaWxlZFwiLCBcIndhcm5cIiwge1xuICAgICAgcGhhc2UsXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoSW50ZXJuYWxFdmVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gICAgZGV0YWlsPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbnRlcm5hbEV2ZW50UmVwb3J0ZXIobmFtZSwgbGV2ZWwsIGRldGFpbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsp4Tri6gg7J2067Kk7Yq4IOyekOyytOqwgCDsi6TtjKjtlZjrqbQgc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICB0aGlzLnNodXRkb3duQ2FsbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNpbmtTaHV0ZG93bnMgPSB0aGlzLnNpbmtzLm1hcCgoc2luaykgPT4gdGhpcy5zaHV0ZG93blNpbmsoc2luaywgdGltZW91dE1zKSk7XG4gICAgaWYgKHNpbmtTaHV0ZG93bnMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHNpbmtTaHV0ZG93bnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2h1dGRvd25TaW5rKHNpbms6IFRTaW5rLCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2luay5zaHV0ZG93bikgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNpbmsuc2h1dGRvd24oeyB0aW1lb3V0TXMgfSk7XG4gICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocmVzdWx0KSkgcmV0dXJuO1xuXG4gICAgICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IHNodXRkb3duUHJvbWlzZSA9IHJlc3VsdC50aGVuKFxuICAgICAgICAoKSA9PiBcImNvbXBsZXRlZFwiIGFzIGNvbnN0LFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aHJvdyBjYXVzZTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPFwidGltZW91dFwiPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShcInRpbWVvdXRcIik7XG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3V0Y29tZSA9IGF3YWl0IFByb21pc2UucmFjZShbc2h1dGRvd25Qcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3V0Y29tZSA9PT0gXCJ0aW1lb3V0XCIpIHtcbiAgICAgICAgc2h1dGRvd25Qcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KFwid3MudGVsZW1ldHJ5LnNodXRkb3duLnRpbWVvdXRcIiwgXCJ3YXJuXCIsIHtcbiAgICAgICAgICB0aW1lb3V0TXMsXG4gICAgICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwic2h1dGRvd25cIiwgZXJyb3IsIHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBFdmVudFBpcGVsaW5lIC0tXG5cbmNsYXNzIEV2ZW50UGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJlYWRvbmx5IHNpZ25hbCA9IFwiZXZlbnRcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgICByYXRlQnlFdmVudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBhbHdheXNSZWNvcmRMZXZlbHM6IEFycmF5PFwid2FyblwiIHwgXCJlcnJvclwiPjtcbiAgfTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhcHR1cmVQYXlsb2FkOiBmYWxzZSB8IFwicHJldmlld1wiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4UGF5bG9hZFByZXZpZXdCeXRlczogbnVtYmVyO1xuICAvLyBhbHdheXNSZWNvcmQgbGV2ZWwg6rK966Gc7JeQ7IScIHByZXBhcmVSZWNvcmQoc2tpcFJhdGVMaW1pdD10cnVlKSDsnZjrr7jrpbwg67O07KG07ZWY6riwIOychO2VnCDtlIzrnpjqt7guXG4gIHByaXZhdGUgY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zLCBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSkge1xuICAgIHN1cGVyKFxuICAgICAgb3B0aW9ucy5zaW5rcyxcbiAgICAgIG9wdGlvbnMuc3RvcmUsXG4gICAgICBvcHRpb25zLm1heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgICBvcHRpb25zLm1heEluRmxpZ2h0RW1pdHMsXG4gICAgICBvcHRpb25zLnNoYXJlZFJlZGFjdG9yLFxuICAgICAgb3B0aW9ucy5zaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgICBydW50aW1lTWV0YWRhdGEsXG4gICAgKTtcbiAgICB0aGlzLnNpZ25hbFJlZGFjdG9yID0gb3B0aW9ucy5zaWduYWxSZWRhY3RvcjtcbiAgICB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZCA9IG9wdGlvbnMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMuc2FtcGxpbmcgPSBvcHRpb25zLnNhbXBsaW5nO1xuICAgIHRoaXMuY2FwdHVyZVBheWxvYWQgPSBvcHRpb25zLmNhcHR1cmVQYXlsb2FkO1xuICAgIHRoaXMubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA9IG9wdGlvbnMubWF4UGF5bG9hZFByZXZpZXdCeXRlcztcbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcblxuICAgICAgLy8gc2FtcGxpbmc6IGFsd2F5c1JlY29yZExldmVscyDsmrDshKBcbiAgICAgIGNvbnN0IGxldmVsczogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0gdGhpcy5zYW1wbGluZy5hbHdheXNSZWNvcmRMZXZlbHM7XG4gICAgICBjb25zdCBhbHdheXNSZWNvcmQgPSBsZXZlbHMuaW5jbHVkZXMoaW5wdXQubGV2ZWwpO1xuXG4gICAgICBpZiAoIWFsd2F5c1JlY29yZCkge1xuICAgICAgICBjb25zdCByYXRlID0gdGhpcy5zYW1wbGluZy5yYXRlQnlFdmVudFtpbnB1dC5uYW1lXSA/PyB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBhbHdheXNSZWNvcmQ7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IOuYkO2VnCB0aHJvdy1mcmVlIOygleyxhVxuICAgIH1cbiAgfVxuXG4gIC8vIOuCtOu2gCDsp4Tri6gg7J2067Kk7Yq4IOKAlCBzYW1wbGluZy9yYXRlLWxpbWl0IOyasO2ajC4gc2h1dGRvd24g7KSR7JeQ64+EIOuwnO2Wie2VtCB0aW1lb3V0L+yLpO2MqCDsp4Tri6jsnbQg7Jyg7Iuk65CY7KeAIOyViuuPhOuhnSDtlZzri6QuXG4gIC8vIOyCrOyaqeyekCByZWRhY3RvcuydmCB0eXBlLW1pc21hdGNoIOychO2XmOydhCDtlLztlZjquLAg7JyE7ZW0IGRlZmF1bHQgcmVkYWN0b3Lrp4wg7KCB7Jqp7ZWc64ukLlxuICBkaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBsZXZlbDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJsZXZlbFwiXSxcbiAgICBkZXRhaWw/OiBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0ge1xuICAgICAgdHlwZTogXCJldmVudFwiLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbW9ub3RvbmljVGltZTogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBydW50aW1lSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZCxcbiAgICAgIG5vZGVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEubm9kZUlkLFxuICAgICAgbmFtZSxcbiAgICAgIGxldmVsLFxuICAgICAgZGV0YWlsLFxuICAgIH07XG5cbiAgICAvLyDsp4Tri6gg7J2067Kk7Yq464qUIO2VreyDgSBkZWZhdWx0IHJlZGFjdG9y66eMIOyggeyaqe2VtCBzaW5r7JeQIOyngeygkSDsoITri6ztlZzri6QuXG4gICAgLy8gKOyCrOyaqeyekCByZWRhY3RvcuqwgCDsp4Tri6gg7J2067Kk7Yq47J2YIHR5cGXsnYQg7J6Y66q7IOuwlOq/lCDrrLTtlZwg66Oo7ZSE66W8IOydvOycvO2CpOuKlCDsnbzsnYQg66eJ64qU64ukLilcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKHNhbml0aXplZC50eXBlICE9PSBcImV2ZW50XCIpIHJldHVybjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hUb1NpbmtzKHNhbml0aXplZCwgZmFsc2UpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJlY29yZChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHtcbiAgICBsZXQgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IHtcbiAgICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBpbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgZGV0YWlsOiBpbnB1dC5kZXRhaWwsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNhcHR1cmVQYXlsb2FkID09PSBcInByZXZpZXdcIiAmJiBpbnB1dC5wYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBwYXlsb2FkUHJldmlldzogdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhpbnB1dC5wYXlsb2FkLCB0aGlzLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEJ5cGFzc1JhdGVMaW1pdChfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIC8vIGFsd2F5c1JlY29yZExldmVsc+yXkCDtlbTri7ntlZjripQgcmVjb3Jk64qUIHNhbXBsaW5n7J2EIOqxsOy5mOyngCDslYrqs6Ag65Ok7Ja07JmU7Jy866mwLFxuICAgIC8vIOq4sOyhtCBjb250cm9sbGVyIOuPmeyekeydhCDrs7TsobTtlZjquLAg7JyE7ZW0IHRva2VuIGJ1Y2tldOuPhCBza2lw7ZWc64ukLlxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQubGV2ZWwgPT09IFwid2FyblwiIHx8IHJlY29yZC5sZXZlbCA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG59XG5cbi8vIC0tIE1ldHJpY1BpcGVsaW5lIC0tXG5cbmNsYXNzIE1ldHJpY1BpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgV2ViU29ja2V0TWV0cmljSW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJtZXRyaWNcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljU291cmNlczogU2V0PFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZT4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbGxlY3Rpb25JbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzbmFwc2hvdFByb3ZpZGVyOiAoKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25FbmFibGVkID0gb3B0aW9ucy5jb2xsZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnNhbXBsZUludGVydmFsTXMgPSBvcHRpb25zLnNhbXBsZUludGVydmFsTXM7XG5cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnNhbXBsZUludGVydmFsTXMgPiAwKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0QW5kRW1pdCgpO1xuICAgICAgfSwgdGhpcy5zYW1wbGVJbnRlcnZhbE1zKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCAmJlxuICAgICAgICBpc09iamVjdFZhbHVlKHRoaXMuY29sbGVjdGlvbkludGVydmFsKSAmJlxuICAgICAgICBcInVucmVmXCIgaW4gdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbC51bnJlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJtZXRyaWNcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgdmFsdWU6IGlucHV0LnZhbHVlLFxuICAgICAgdW5pdDogaW5wdXQudW5pdCxcbiAgICAgIHRhZ3M6IGlucHV0LnRhZ3MsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgICBzbmFwc2hvdDogaW5wdXQuc25hcHNob3QsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICBjb25zdCBvdXRjb21lID0gcmVjb3JkLnRhZ3M/Lm91dGNvbWU7XG4gICAgaWYgKG91dGNvbWUgPT09IFwiZmFpbGVkXCIgfHwgb3V0Y29tZSA9PT0gXCJyZWplY3RlZFwiIHx8IG91dGNvbWUgPT09IFwiZHJvcHBlZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgcmVjb3JkLm5hbWUuZW5kc1dpdGgoXCIuZmFpbHVyZXNcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmZhaWx1cmVcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmRyb3BwZWRcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmluY2x1ZGVzKFwiLmZhaWx1cmVzLlwiKSB8fFxuICAgICAgcmVjb3JkLm5hbWUuaW5jbHVkZXMoXCIuZHJvcHBlZC5cIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaWduYWxSZWRhY3RvcigpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWV0cmljU291cmNlcy5hZGQoc291cmNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5tZXRyaWNTb3VyY2VzLmRlbGV0ZShzb3VyY2UpO1xuICAgIH07XG4gIH1cblxuICBzZXRTbmFwc2hvdFByb3ZpZGVyKHByb3ZpZGVyOiAoKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLnNuYXBzaG90UHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBiYXNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gICAgICAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULFxuICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiB7fSxcbiAgICAgIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiB0aGlzLmRyb3BwZWRDb3VudCxcbiAgICAgIHRlbGVtZXRyeVNpbmtGYWlsdXJlczogdGhpcy5zaW5rRmFpbHVyZUNvdW50LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLm1ldHJpY1NvdXJjZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWwgPSBzb3VyY2UuY29sbGVjdChub3cpO1xuICAgICAgICBiYXNlLmFjdGl2ZUNvbm5lY3Rpb25zICs9IHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnMgPz8gMDtcbiAgICAgICAgYmFzZS5yb29tQ291bnQgKz0gcGFydGlhbC5yb29tQ291bnQgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ0luYm91bmRNZXNzYWdlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ091dGJvdW5kTWVzc2FnZXMgPz8gMDtcbiAgICAgICAgYmFzZS5zb2NrZXRCdWZmZXJlZEJ5dGVzICs9IHBhcnRpYWwuc29ja2V0QnVmZmVyZWRCeXRlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdGYW5PdXRKb2JzICs9IHBhcnRpYWwucGVuZGluZ0Zhbk91dEpvYnMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nRmFuT3V0VGFyZ2V0cyArPSBwYXJ0aWFsLnBlbmRpbmdGYW5PdXRUYXJnZXRzID8/IDA7XG4gICAgICAgIGlmIChwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtucywgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIGJhc2UuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZVtuc10gPVxuICAgICAgICAgICAgICAoYmFzZS5hY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlW25zXSA/PyAwKSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG1ldHJpYyBzb3VyY2Ug7Iuk7Yyo64qUIOyZuOu2gOuhnCDsoITtjIzrkJjslrTshKAg7JWIIOuQqFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgY29sbGVjdEFuZEVtaXQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuc25hcHNob3RQcm92aWRlcj8uKCkgPz8gdGhpcy5nZXRTbmFwc2hvdCgpO1xuICAgICAgY29uc3QgaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb25zLmFjdGl2ZVwiLFxuICAgICAgICBraW5kOiBcImdhdWdlXCIsXG4gICAgICAgIHZhbHVlOiBzbmFwc2hvdC5hY3RpdmVDb25uZWN0aW9ucyxcbiAgICAgICAgdW5pdDogXCIxXCIsXG4gICAgICAgIHNuYXBzaG90LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBtZXRyaWNzIOyImOynkSDsi6TtjKjripQg7Jm467aA66GcIOyghO2MjOuQmOyWtOyEoCDslYgg65CoXG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93bih0aW1lb3V0TXMpO1xuICB9XG59XG5cbi8vIC0tIFNwYW5QaXBlbGluZSAtLVxuXG5jbGFzcyBTcGFuUGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbiAgV2ViU29ja2V0U3BhbklucHV0LFxuICBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJzcGFuXCIgYXMgY29uc3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkU3BhblBpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLnNhbXBsaW5nID0geyBkZWZhdWx0UmF0ZTogb3B0aW9ucy5zYW1wbGluZy5kZWZhdWx0UmF0ZSB9O1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHN0YXR1cyA9PT0gXCJlcnJvclwi64qUIHNhbXBsaW5nIOyasO2ajFxuICAgICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInNwYW5cIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IGlucHV0Lm9wZXJhdGlvbk5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgZHVyYXRpb25NczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBjb25uZWN0aW9uSWQ6IGlucHV0LmNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxuICAgICAgYXR0cmlidXRlczogaW5wdXQuYXR0cmlidXRlcyxcbiAgICAgIGVycm9yVHlwZTogaW5wdXQuZXJyb3JUeXBlLFxuICAgICAgdHJhY2VJZDogaW5wdXQudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogaW5wdXQuc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiBpbnB1dC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiBpbnB1dC5zYW1wbGVkLFxuICAgICAgZXZlbnRzOiBpbnB1dC5ldmVudHMsXG4gICAgICBsaW5rczogaW5wdXQubGlua3MsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZC5zdGF0dXMgPT09IFwiZXJyb3JcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRpY2FsUmVjb3JkKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQuc3RhdHVzID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgfVxufVxuXG4vLyAtLSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVySW1wbCAtLVxuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwgaW1wbGVtZW50cyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogRXZlbnRQaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1ldHJpY3M6IE1ldHJpY1BpcGVsaW5lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BhbnM6IFNwYW5QaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJ1bnRpbWVJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZUlkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFjZU9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNodXRkb3duVGltZW91dE1zOiBudW1iZXI7XG4gIHByb3RlY3RlZCBzaHV0ZG93bkNhbGxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGV2ZW50czogRXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNzOiBNZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuczogU3BhblBpcGVsaW5lLFxuICAgIHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuICAgIHNodXRkb3duVGltZW91dE1zOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7XG4gICAgdGhpcy5zcGFucyA9IHNwYW5zO1xuICAgIHRoaXMudHJhY2VPcHRpb25zID0gdHJhY2VPcHRpb25zO1xuICAgIHRoaXMucnVudGltZUlkID0gcnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZDtcbiAgICB0aGlzLm5vZGVJZCA9IHJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQ7XG4gICAgdGhpcy5zaHV0ZG93blRpbWVvdXRNcyA9IHNodXRkb3duVGltZW91dE1zO1xuXG4gICAgLy8g66qo65OgIHBpcGVsaW5lIOynhOuLqCDsnbTrsqTtirjripQgZXZlbnRzIHBpcGVsaW5lIOqyveuhnOuhnCDrnbzsmrDtjIXtlZzri6QuXG4gICAgY29uc3QgcmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciA9IChuYW1lLCBsZXZlbCwgZGV0YWlsKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5kaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KG5hbWUsIGxldmVsLCBkZXRhaWwpO1xuICAgIH07XG4gICAgdGhpcy5ldmVudHMuc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLm1ldHJpY3Muc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLnNwYW5zLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5tZXRyaWNzLnNldFNuYXBzaG90UHJvdmlkZXIoKCkgPT4gdGhpcy5nZXRNZXRyaWNzU25hcHNob3QoKSk7XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICAgIHRoaXMubWV0cmljcy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZFNwYW4oaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zcGFucy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIGdldE1ldHJpY3NTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5tZXRyaWNzLmdldFNuYXBzaG90KCk7XG4gICAgICBiYXNlLnRlbGVtZXRyeURyb3BwZWRSZWNvcmRzID1cbiAgICAgICAgdGhpcy5ldmVudHMuZHJvcHBlZENvdW50ICsgdGhpcy5tZXRyaWNzLmRyb3BwZWRDb3VudCArIHRoaXMuc3BhbnMuZHJvcHBlZENvdW50O1xuICAgICAgYmFzZS50ZWxlbWV0cnlTaW5rRmFpbHVyZXMgPVxuICAgICAgICB0aGlzLmV2ZW50cy5zaW5rRmFpbHVyZUNvdW50ICsgdGhpcy5tZXRyaWNzLnNpbmtGYWlsdXJlQ291bnQgKyB0aGlzLnNwYW5zLnNpbmtGYWlsdXJlQ291bnQ7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IC4uLkVNUFRZX01FVFJJQ1NfU05BUFNIT1QsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9O1xuICAgIH1cbiAgfVxuXG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5zdG9yZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWV0cmljU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnN0b3JlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhbnMuc3RvcmU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlKTogKCkgPT4gdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoc291cmNlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBub29wVW5zdWJzY3JpYmU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQocmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmV4dHJhY3RUcmFjZVBhcmVudCAmJiByZXF1ZXN0Py5oZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50SGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzW1widHJhY2VwYXJlbnRcIl07XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50VmFsdWUgPSBBcnJheS5pc0FycmF5KHRyYWNlcGFyZW50SGVhZGVyKVxuICAgICAgICAgID8gdHJhY2VwYXJlbnRIZWFkZXJbMF1cbiAgICAgICAgICA6IHRyYWNlcGFyZW50SGVhZGVyO1xuICAgICAgICBpZiAodHJhY2VwYXJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhY2VQYXJlbnQodHJhY2VwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIHRyYWNlSWQ6IHBhcnNlZC50cmFjZUlkLFxuICAgICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHBhcnNlZC5wYXJlbnRJZCxcbiAgICAgICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuc3BhbklkID0gZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbnRleHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRyYWNlT3B0aW9ucy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHRyYWNlSWQ6IGdlbmVyYXRlVHJhY2VJZCgpLCBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCkgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnRyYWNlT3B0aW9ucyB9O1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2h1dGRvd25DYWxsZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zID8/IHRoaXMuc2h1dGRvd25UaW1lb3V0TXM7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHRoaXMuZXZlbnRzLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICAgIHRoaXMubWV0cmljcy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgICB0aGlzLnNwYW5zLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgc2h1dGRvd27snYAgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBGYWN0b3J5IC0tXG5cbmZ1bmN0aW9uIGJ1aWxkQ29udHJvbGxlcihcbiAgb3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgY29uc3QgZGVmYXVsdHMgPSBvcHRpb25zLmRlZmF1bHRzID8/IHt9O1xuICBjb25zdCBldmVudHNPcHQgPSBvcHRpb25zLmV2ZW50cyA/PyB7fTtcbiAgY29uc3QgbWV0cmljc09wdCA9IG9wdGlvbnMubWV0cmljcyA/PyB7fTtcbiAgY29uc3Qgc3BhbnNPcHQgPSBvcHRpb25zLnNwYW5zID8/IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRzTWF4UmVjb3Jkc1BlclNlY29uZCA9XG4gICAgZGVmYXVsdHMubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQ7XG5cbiAgLy8g7Iug7Zi467OEIHJlZGFjdG9yIC8gYmVmb3JlUmVjb3JkIO2VtOyEnS5cbiAgLy8gbnVsbOydtOuptCBzaGFyZWRSZWRhY3RvcuulvCB1bmRlZmluZWTroZwg642u7Ja07I2oIHN0ZXAgMiDsnpDssrTrpbwgc2tpcO2VnOuLpC5cbiAgY29uc3QgZXZlbnRzU2hhcmVkUmVkYWN0b3IgPSBldmVudHNPcHQucmVkYWN0b3IgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5yZWRhY3RvcjtcbiAgY29uc3QgZXZlbnRzU2lnbmFsUmVkYWN0b3IgPSBpc0Z1bmN0aW9uVmFsdWUoZXZlbnRzT3B0LnJlZGFjdG9yKSA/IGV2ZW50c09wdC5yZWRhY3RvciA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXZlbnRzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBldmVudHNPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQgPSBpc0Z1bmN0aW9uVmFsdWUoZXZlbnRzT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IGV2ZW50c09wdC5iZWZvcmVSZWNvcmRcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtZXRyaWNzU2hhcmVkUmVkYWN0b3IgPSBtZXRyaWNzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IG1ldHJpY3NTaWduYWxSZWRhY3RvciA9IGlzRnVuY3Rpb25WYWx1ZShtZXRyaWNzT3B0LnJlZGFjdG9yKVxuICAgID8gbWV0cmljc09wdC5yZWRhY3RvclxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBtZXRyaWNzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBtZXRyaWNzT3B0LmJlZm9yZVJlY29yZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLmJlZm9yZVJlY29yZDtcbiAgY29uc3QgbWV0cmljc1NpZ25hbEJlZm9yZVJlY29yZCA9IGlzRnVuY3Rpb25WYWx1ZShtZXRyaWNzT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3BhbnNTaGFyZWRSZWRhY3RvciA9IHNwYW5zT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IHNwYW5zU2lnbmFsUmVkYWN0b3IgPSBpc0Z1bmN0aW9uVmFsdWUoc3BhbnNPcHQucmVkYWN0b3IpID8gc3BhbnNPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNwYW5zU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBzcGFuc09wdC5iZWZvcmVSZWNvcmQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5iZWZvcmVSZWNvcmQ7XG4gIGNvbnN0IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkID0gaXNGdW5jdGlvblZhbHVlKHNwYW5zT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IHNwYW5zT3B0LmJlZm9yZVJlY29yZFxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIGV2ZW50c1xuICBjb25zdCBldmVudFNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXSA9IGV2ZW50c09wdC5zaW5rcyA/IFsuLi5ldmVudHNPcHQuc2lua3NdIDogW107XG4gIGxldCBldmVudFN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkID0gZXZlbnRzT3B0LnN0b3JlO1xuICBpZiAoZXZlbnRTaW5rcy5sZW5ndGggPT09IDAgJiYgZXZlbnRTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRTdG9yZSA9IG5ldyBJbk1lbW9yeUV2ZW50U3RvcmUoe1xuICAgICAgbWF4UmVjb3JkczogZXZlbnRzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBldmVudHNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgZXZlbnRTaW5rcy5wdXNoKGV2ZW50U3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAoZXZlbnRTdG9yZSAhPT0gdW5kZWZpbmVkICYmICFldmVudFNpbmtzLmluY2x1ZGVzKGV2ZW50U3RvcmUuc2luaykpIHtcbiAgICBldmVudFNpbmtzLnB1c2goZXZlbnRTdG9yZS5zaW5rKTtcbiAgfVxuXG4gIGNvbnN0IGV2ZW50c1Jlc29sdmVkOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBldmVudFNpbmtzLFxuICAgIHN0b3JlOiBldmVudFN0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IGV2ZW50c09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogZXZlbnRzT3B0Lm1heEluRmxpZ2h0RW1pdHMgPz8gREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBldmVudHNTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogZXZlbnRzU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBldmVudHNTaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgc2lnbmFsQmVmb3JlUmVjb3JkOiBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgc2FtcGxpbmc6IHtcbiAgICAgIGRlZmF1bHRSYXRlOiBldmVudHNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFLFxuICAgICAgcmF0ZUJ5RXZlbnQ6IGV2ZW50c09wdC5zYW1wbGluZz8ucmF0ZUJ5RXZlbnQgPz8ge30sXG4gICAgICBhbHdheXNSZWNvcmRMZXZlbHM6IGV2ZW50c09wdC5zYW1wbGluZz8uYWx3YXlzUmVjb3JkTGV2ZWxzID8/IFtcbiAgICAgICAgLi4uREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjYXB0dXJlUGF5bG9hZDogZXZlbnRzT3B0LmNhcHR1cmVQYXlsb2FkID8/IERFRkFVTFRfRVZFTlRfQ0FQVFVSRV9QQVlMT0FELFxuICAgIG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6XG4gICAgICBldmVudHNPcHQubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA/PyBERUZBVUxUX0VWRU5UX01BWF9QQVlMT0FEX1BSRVZJRVdfQllURVMsXG4gIH07XG5cbiAgLy8gbWV0cmljc1xuICBjb25zdCBtZXRyaWNTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdID0gbWV0cmljc09wdC5zaW5rcyA/IFsuLi5tZXRyaWNzT3B0LnNpbmtzXSA6IFtdO1xuICBsZXQgbWV0cmljU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkID0gbWV0cmljc09wdC5zdG9yZTtcbiAgaWYgKG1ldHJpY1NpbmtzLmxlbmd0aCA9PT0gMCAmJiBtZXRyaWNTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWV0cmljU3RvcmUgPSBuZXcgSW5NZW1vcnlNZXRyaWNTdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBtZXRyaWNzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBtZXRyaWNzT3B0Lm1heEJ5dGVzID8/IGRlZmF1bHRzLm1heEJ5dGVzLFxuICAgIH0pO1xuICAgIG1ldHJpY1NpbmtzLnB1c2gobWV0cmljU3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAobWV0cmljU3RvcmUgIT09IHVuZGVmaW5lZCAmJiAhbWV0cmljU2lua3MuaW5jbHVkZXMobWV0cmljU3RvcmUuc2luaykpIHtcbiAgICBtZXRyaWNTaW5rcy5wdXNoKG1ldHJpY1N0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3QgbWV0cmljc1Jlc29sdmVkOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgICBzaW5rczogbWV0cmljU2lua3MsXG4gICAgc3RvcmU6IG1ldHJpY1N0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IG1ldHJpY3NPcHQuc2FtcGxpbmc/Lm1heFJlY29yZHNQZXJTZWNvbmQgPz8gZGVmYXVsdHNNYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG1ldHJpY3NPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IG1ldHJpY3NTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogbWV0cmljc1NpZ25hbFJlZGFjdG9yLFxuICAgIHNoYXJlZEJlZm9yZVJlY29yZDogbWV0cmljc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IG1ldHJpY3NTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgY29sbGVjdGlvbkVuYWJsZWQ6IG1ldHJpY3NPcHQuY29sbGVjdGlvbkVuYWJsZWQgPz8gREVGQVVMVF9NRVRSSUNfQ09MTEVDVElPTl9FTkFCTEVELFxuICAgIHNhbXBsZUludGVydmFsTXM6IG1ldHJpY3NPcHQuc2FtcGxlSW50ZXJ2YWxNcyA/PyBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMsXG4gIH07XG5cbiAgLy8gc3BhbnNcbiAgY29uc3Qgc3BhblNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdID0gc3BhbnNPcHQuc2lua3MgPyBbLi4uc3BhbnNPcHQuc2lua3NdIDogW107XG4gIGxldCBzcGFuU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCA9IHNwYW5zT3B0LnN0b3JlO1xuICBpZiAoc3BhblNpbmtzLmxlbmd0aCA9PT0gMCAmJiBzcGFuU3RvcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHNwYW5TdG9yZSA9IG5ldyBJbk1lbW9yeVNwYW5TdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBzcGFuc09wdC5tYXhSZWNvcmRzID8/IGRlZmF1bHRzLm1heFJlY29yZHMsXG4gICAgICBtYXhCeXRlczogc3BhbnNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9IGVsc2UgaWYgKHNwYW5TdG9yZSAhPT0gdW5kZWZpbmVkICYmICFzcGFuU2lua3MuaW5jbHVkZXMoc3BhblN0b3JlLnNpbmspKSB7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3Qgc3BhbnNSZXNvbHZlZDogUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBzcGFuU2lua3MsXG4gICAgc3RvcmU6IHNwYW5TdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBzcGFuc09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogc3BhbnNPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IHNwYW5zU2hhcmVkUmVkYWN0b3IsXG4gICAgc2lnbmFsUmVkYWN0b3I6IHNwYW5zU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkLFxuICAgIHNhbXBsaW5nOiB7XG4gICAgICBkZWZhdWx0UmF0ZTogc3BhbnNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfU1BBTl9TQU1QTElOR19ERUZBVUxUX1JBVEUsXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBldmVudFBpcGVsaW5lID0gbmV3IEV2ZW50UGlwZWxpbmUoZXZlbnRzUmVzb2x2ZWQsIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIGNvbnN0IG1ldHJpY1BpcGVsaW5lID0gbmV3IE1ldHJpY1BpcGVsaW5lKG1ldHJpY3NSZXNvbHZlZCwgcnVudGltZU1ldGFkYXRhKTtcbiAgY29uc3Qgc3BhblBpcGVsaW5lID0gbmV3IFNwYW5QaXBlbGluZShzcGFuc1Jlc29sdmVkLCBydW50aW1lTWV0YWRhdGEpO1xuXG4gIGNvbnN0IHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICAgIGV4dHJhY3RUcmFjZVBhcmVudDpcbiAgICAgIG9wdGlvbnMudHJhY2U/LmV4dHJhY3RUcmFjZVBhcmVudCA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMuZXh0cmFjdFRyYWNlUGFyZW50LFxuICAgIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOlxuICAgICAgb3B0aW9ucy50cmFjZT8uZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UgPz8gREVGQVVMVF9UUkFDRV9PUFRJT05TLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlLFxuICAgIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTpcbiAgICAgIG9wdGlvbnMudHJhY2U/LnByb3BhZ2F0ZU1lc3NhZ2VUcmFjZSA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMucHJvcGFnYXRlTWVzc2FnZVRyYWNlLFxuICAgIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46XG4gICAgICBvcHRpb25zLnRyYWNlPy5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuID8/XG4gICAgICBERUZBVUxUX1RSQUNFX09QVElPTlMucmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbixcbiAgfTtcblxuICBjb25zdCBzaHV0ZG93blRpbWVvdXRNcyA9IG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0TXMgPz8gREVGQVVMVF9TSFVURE9XTl9USU1FT1VUX01TO1xuXG4gIHJldHVybiBuZXcgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwoXG4gICAgZXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuUGlwZWxpbmUsXG4gICAgdHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgaWdub3JlZEtleXMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKVxuICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSBcImVuYWJsZWRcIiAmJiBrZXkgIT09IFwiY29udHJvbGxlclwiICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgaWYgKGlnbm9yZWRLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgV2ViU29ja2V0IHRlbGVtZXRyeSBjb250cm9sbGVyIG9wdGlvbiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB0ZWxlbWV0cnkgb3B0aW9uczogJHtpZ25vcmVkS2V5cy5qb2luKFxuICAgICAgXCIsIFwiLFxuICAgICl9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIoXG4gIHRlbGVtZXRyeU9wdGlvbjogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGlmICh0ZWxlbWV0cnlPcHRpb24gPT09IHVuZGVmaW5lZCB8fCB0ZWxlbWV0cnlPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBidWlsZENvbnRyb2xsZXIoe30sIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyKSB7XG4gICAgYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKHRlbGVtZXRyeU9wdGlvbik7XG4gICAgcmV0dXJuIHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkQ29udHJvbGxlcih0ZWxlbWV0cnlPcHRpb24sIHJ1bnRpbWVNZXRhZGF0YSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWdjQSxTQUFTLGVBQWUsS0FBc0I7Q0FDNUMsTUFBTSxhQUFhLElBQUksUUFBUSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsWUFBWTtDQUNoRSxPQUFPLHVCQUF1QixNQUFNLFlBQVksV0FBVyxTQUFTLE9BQU8sQ0FBQztBQUM5RTtBQUVB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
|