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,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isObjectValue, isStringValue } from "../utils/runtime-value.js";
|
|
2
3
|
import { getSonamuEnvironment, init_env } from "../env.js";
|
|
3
4
|
import { createKnexInstance, init_knex } from "../database/knex.js";
|
|
4
5
|
import { DB, init_db } from "../database/db.js";
|
|
@@ -19,6 +20,9 @@ import path from "path";
|
|
|
19
20
|
import chalk from "chalk";
|
|
20
21
|
import { mkdir, readdir, writeFile } from "fs/promises";
|
|
21
22
|
//#region src/migration/migrator.ts
|
|
23
|
+
function padDatePart(number, size = 2) {
|
|
24
|
+
return number.toString().padStart(size, "0");
|
|
25
|
+
}
|
|
22
26
|
/**
|
|
23
27
|
* 주어진 Promise가 ms 안에 완료되지 않으면 onTimeout 에러로 reject한다.
|
|
24
28
|
* 원본 Promise 자체는 계속 진행되므로, 호출측에서 커넥션 정리(destroy)를 책임진다.
|
|
@@ -47,14 +51,15 @@ var init_migrator = __esmMin((() => {
|
|
|
47
51
|
init_naite();
|
|
48
52
|
init_controller();
|
|
49
53
|
init_fs_utils();
|
|
54
|
+
init_runtime_value();
|
|
50
55
|
init_code_generation();
|
|
51
56
|
init_migration_set();
|
|
52
57
|
init_postgresql_schema_reader();
|
|
53
58
|
init_slack_confirm();
|
|
54
59
|
MigrationTargetExecutionError = class extends Error {
|
|
55
60
|
connKey;
|
|
56
|
-
constructor(connKey,
|
|
57
|
-
super(
|
|
61
|
+
constructor(connKey, cause) {
|
|
62
|
+
super(cause instanceof Error ? cause.message : String(cause));
|
|
58
63
|
this.connKey = connKey;
|
|
59
64
|
this.name = "MigrationTargetExecutionError";
|
|
60
65
|
}
|
|
@@ -68,10 +73,11 @@ var init_migrator = __esmMin((() => {
|
|
|
68
73
|
]);
|
|
69
74
|
Migrator = class {
|
|
70
75
|
isMissingMigrationTableError(error) {
|
|
71
|
-
if (
|
|
76
|
+
if (!isObjectValue(error) || error === null) return false;
|
|
72
77
|
const maybePostgresError = error;
|
|
73
|
-
return maybePostgresError.code === "42P01" &&
|
|
78
|
+
return maybePostgresError.code === "42P01" && isStringValue(maybePostgresError.message) && maybePostgresError.message.includes("knex_migrations");
|
|
74
79
|
}
|
|
80
|
+
/** 현재 실행 환경에서 허용된 마이그레이션 대상 키를 반환합니다. */
|
|
75
81
|
getMigrationTargetKeys() {
|
|
76
82
|
const connKeys = Object.keys(Sonamu.dbConfig).filter((key) => !key.endsWith("_readonly"));
|
|
77
83
|
if (isLocal()) return connKeys;
|
|
@@ -105,11 +111,11 @@ var init_migrator = __esmMin((() => {
|
|
|
105
111
|
return results;
|
|
106
112
|
}
|
|
107
113
|
migrationName(migration) {
|
|
108
|
-
if (
|
|
109
|
-
if (
|
|
114
|
+
if (isStringValue(migration)) return path.basename(migration);
|
|
115
|
+
if (isObjectValue(migration) && migration !== null) {
|
|
110
116
|
const candidate = migration;
|
|
111
|
-
if (
|
|
112
|
-
if (
|
|
117
|
+
if (isStringValue(candidate.file)) return path.basename(candidate.file);
|
|
118
|
+
if (isStringValue(candidate.name)) return path.basename(candidate.name);
|
|
113
119
|
}
|
|
114
120
|
return String(migration);
|
|
115
121
|
}
|
|
@@ -228,25 +234,26 @@ var init_migrator = __esmMin((() => {
|
|
|
228
234
|
error = caught instanceof Error ? caught.message : String(caught);
|
|
229
235
|
return "error";
|
|
230
236
|
});
|
|
231
|
-
const pending = await tConn.migrate.list().then(([, files]) => files.map(({ file }) => file.replace(/\.ts$/, "")), (
|
|
232
|
-
if (this.isMissingMigrationTableError(
|
|
233
|
-
error ??=
|
|
237
|
+
const pending = await tConn.migrate.list().then(([, files]) => files.map(({ file }) => file.replace(/\.ts$/, "")), (cause) => {
|
|
238
|
+
if (this.isMissingMigrationTableError(cause)) return codes.map(({ name }) => name);
|
|
239
|
+
error ??= cause instanceof Error ? cause.message : String(cause);
|
|
234
240
|
return [];
|
|
235
241
|
});
|
|
236
|
-
const currentVersion = await tConn.migrate.currentVersion().catch((
|
|
237
|
-
if (this.isMissingMigrationTableError(
|
|
238
|
-
error ??=
|
|
242
|
+
const currentVersion = await tConn.migrate.currentVersion().catch((cause) => {
|
|
243
|
+
if (this.isMissingMigrationTableError(cause)) return "none";
|
|
244
|
+
error ??= cause instanceof Error ? cause.message : String(cause);
|
|
239
245
|
return "error";
|
|
240
246
|
});
|
|
241
247
|
Naite.t("migrator:getStatus:status", status);
|
|
242
|
-
|
|
248
|
+
const connectionStatus = {
|
|
243
249
|
connKey,
|
|
244
250
|
currentVersion,
|
|
245
251
|
status,
|
|
246
252
|
pending,
|
|
247
|
-
latencyMs: performance.now() - startedAt
|
|
248
|
-
...error === void 0 ? {} : { error }
|
|
253
|
+
latencyMs: performance.now() - startedAt
|
|
249
254
|
};
|
|
255
|
+
if (error !== void 0) connectionStatus.error = error;
|
|
256
|
+
return connectionStatus;
|
|
250
257
|
} catch (caught) {
|
|
251
258
|
const error = caught instanceof Error ? caught.message : String(caught);
|
|
252
259
|
console.warn(chalk.yellow(`${String(connKey)}의 마이그레이션 상태를 가져오는 데에 실패하였습니다.\n${error}`));
|
|
@@ -350,7 +357,7 @@ var init_migrator = __esmMin((() => {
|
|
|
350
357
|
const configs = unique(targets.map((target) => ({
|
|
351
358
|
connKey: target,
|
|
352
359
|
options: Sonamu.dbConfig[target]
|
|
353
|
-
})).filter((c) => c.options !== void 0), ({ options }) => `${
|
|
360
|
+
})).filter((c) => c.options !== void 0), ({ options: dbOptions }) => `${dbOptions.connection.host}:${dbOptions.connection.port ?? 5432}/${dbOptions.connection.database}`);
|
|
354
361
|
const conns = await Promise.all(configs.map(async (config) => ({
|
|
355
362
|
connKey: config.connKey,
|
|
356
363
|
knex: createKnexInstance(config.options)
|
|
@@ -367,8 +374,7 @@ var init_migrator = __esmMin((() => {
|
|
|
367
374
|
}
|
|
368
375
|
genDateTag(index, baseDate = /* @__PURE__ */ new Date()) {
|
|
369
376
|
const date = new Date(baseDate.getTime() + index * 1e3);
|
|
370
|
-
|
|
371
|
-
return date.getFullYear().toString() + pad(date.getMonth() + 1) + pad(date.getDate()) + pad(date.getHours()) + pad(date.getMinutes()) + pad(date.getSeconds());
|
|
377
|
+
return date.getFullYear().toString() + padDatePart(date.getMonth() + 1) + padDatePart(date.getDate()) + padDatePart(date.getHours()) + padDatePart(date.getMinutes()) + padDatePart(date.getSeconds());
|
|
372
378
|
}
|
|
373
379
|
/**
|
|
374
380
|
* 마이그레이션 코드 파일을 생성합니다.
|
|
@@ -509,4 +515,4 @@ var init_migrator = __esmMin((() => {
|
|
|
509
515
|
init_migrator();
|
|
510
516
|
export { MigrationTargetExecutionError, Migrator, init_migrator };
|
|
511
517
|
|
|
512
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGdlbmVyYXRlQWx0ZXJDb2RlLCBnZW5lcmF0ZUNyZWF0ZUNvZGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IGdldE1pZ3JhdGlvblNldEZyb21FbnRpdHkgfSBmcm9tIFwiLi9taWdyYXRpb24tc2V0XCI7XG5pbXBvcnQgeyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyIH0gZnJvbSBcIi4vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0gfSBmcm9tIFwiLi9zbGFjay1jb25maXJtXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbm5TdHJpbmcsXG4gIHR5cGUgTWlncmF0aW9uQWN0aW9uLFxuICB0eXBlIE1pZ3JhdGlvbkNvZGUsXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvbk1ldGEsXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gIHR5cGUgTWlncmF0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uUmVzdWx0ID0ge1xuICBjb25uS2V5OiBzdHJpbmc7XG4gIGJhdGNoTm86IG51bWJlcjtcbiAgYXBwbGllZDogc3RyaW5nW107XG59W107XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgY2F1Z2h0OiB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCkpO1xuICAgIHRoaXMubmFtZSA9IFwiTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG4vLyDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOcIOyhsO2ajCDsi5wgREIg7Jew6rKwIO2ZleyduCDtg4DsnoTslYTsm4MobXMpLlxuLy8gY3JlYXRlS25leEluc3RhbmNl7J2YIOy7pOuEpeyFmCDtmo3rk50g7YOA7J6E7JWE7JuDKDMw7LSIKeyXkCBzdGF0dXMvbGlzdC9jdXJyZW50VmVyc2lvbuydtFxuLy8g6rCB6rCBIOqxuOumrOuptCBDTEkvVUnqsIAg7LWc64yAIOyImOyLrSDstIggaGFuZ+2VnOuLpC4g7KCV7IOBIOydkeuLteydgCDsiJjrsLEgbXPsnbTrr4DroZwgNey0iOuptCDstqnrtoTtlZjri6QuXG5jb25zdCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IExPQ0FMX0RCX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcblxuLyoqXG4gKiDso7zslrTsp4QgUHJvbWlzZeqwgCBtcyDslYjsl5Ag7JmE66OM65CY7KeAIOyViuycvOuptCBvblRpbWVvdXQg7JeQ65+s66GcIHJlamVjdO2VnOuLpC5cbiAqIOybkOuzuCBQcm9taXNlIOyekOyytOuKlCDqs4Tsho0g7KeE7ZaJ65CY66+A66GcLCDtmLjstpzsuKHsl5DshJwg7Luk64Sl7IWYIOygleumrChkZXN0cm95KeulvCDssYXsnoTsp4Tri6QuXG4gKi9cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIG1zOiBudW1iZXIsIG9uVGltZW91dDogKCkgPT4gRXJyb3IpOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG9uVGltZW91dCgpKSwgbXMpO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTm90ZSAyMDI2LTA4LTI2LCDrs5HspIBcbiAqIOydtCDtgbTrnpjsiqTsl5DshJwgZGVwcmVjYXRlZCDrtpnslrTsnojripQg7Lmc6rWs65Ok7J2AIO2YhCBDTEnrpbwg7JyE7ZWcIO2VmOychCDtmLjtmZjsnbTri4gsXG4gKiBDTEkg66as7Yyp7Yag66eBIOyLnOygkOyXkOyEnCDsoJzqsbDtlbTso7zshZTrj4Qg66y067Cp7ZWp64uI64ukLlxuICovXG5leHBvcnQgY2xhc3MgTWlncmF0b3Ige1xuICBwcml2YXRlIGlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGVycm9yICE9PSBcIm9iamVjdFwiIHx8IGVycm9yID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbWF5YmVQb3N0Z3Jlc0Vycm9yID0gZXJyb3IgYXMgeyBjb2RlPzogdW5rbm93bjsgbWVzc2FnZT86IHVua25vd24gfTtcbiAgICByZXR1cm4gKFxuICAgICAgbWF5YmVQb3N0Z3Jlc0Vycm9yLmNvZGUgPT09IFwiNDJQMDFcIiAmJlxuICAgICAgdHlwZW9mIG1heWJlUG9zdGdyZXNFcnJvci5tZXNzYWdlID09PSBcInN0cmluZ1wiICYmXG4gICAgICBtYXliZVBvc3RncmVzRXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImtuZXhfbWlncmF0aW9uc1wiKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE1pZ3JhdGlvblRhcmdldEtleXMoKTogTWlncmF0aW9uVGFyZ2V0W10ge1xuICAgIGNvbnN0IGNvbm5LZXlzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoXG4gICAgICAoa2V5KSA9PiAha2V5LmVuZHNXaXRoKFwiX3JlYWRvbmx5XCIpLFxuICAgICkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZShtaWdyYXRpb246IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgbWlncmF0aW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShtaWdyYXRpb24pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG1pZ3JhdGlvbiA9PT0gXCJvYmplY3RcIiAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1pZ3JhdGlvbiBhcyB7IGZpbGU/OiB1bmtub3duOyBuYW1lPzogdW5rbm93biB9O1xuICAgICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUuZmlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZS5uYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhtaWdyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UHJvZ3Jlc3Mob3B0aW9uczogTWlncmF0aW9uUnVuT3B0aW9ucyB8IHVuZGVmaW5lZCwgZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpIHtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucz8ub25Qcm9ncmVzcz8uKGV2ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8g7KeE7ZaJ66WgIOyGjOu5hOyekOydmCDsi6TtjKjqsIAg7J2066+4IOyLnOyeke2VnCBEQiDsnpHsl4Xqs7wg7KCV66as66W8IOuwqe2VtO2VmOuptCDslYgg65Cp64uI64ukLlxuICAgICAgY29uc29sZS53YXJuKFwiTWlncmF0aW9uIHByb2dyZXNzIG9ic2VydmVyIGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUHJvZ3Jlc3NIb29rcyhcbiAgICBhY3Rpb246IE1pZ3JhdGlvbkFjdGlvbixcbiAgICBjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfCBcInNoYWRvd1wiLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBLbmV4Lk1pZ3JhdG9yQ29uZmlnV2l0aExpZmVjeWNsZUhvb2tzIHtcbiAgICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZW1pdEZpbGUgPSAodHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gdGhpcy5taWdyYXRpb25OYW1lKG1pZ3JhdGlvbik7XG4gICAgICBjb25zdCBpbmRleCA9IE1hdGgubWF4KGZpbGVzLmluZGV4T2YoZmlsZSksIDApO1xuICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICB0eXBlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGluZGV4LFxuICAgICAgICB0b3RhbDogZmlsZXMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWZvcmVBbGw6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBmaWxlcyA9IG1pZ3JhdGlvbnMubWFwKChtaWdyYXRpb24pID0+IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pKTtcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywgeyB0eXBlOiBcInRhcmdldC1zdGFydFwiLCBhY3Rpb24sIGNvbm5LZXksIGZpbGVzIH0pO1xuICAgICAgfSxcbiAgICAgIGJlZm9yZUVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLXN0YXJ0XCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICAgIGFmdGVyRWFjaDogYXN5bmMgKF9rbmV4LCBtaWdyYXRpb25zKSA9PiB7XG4gICAgICAgIG1pZ3JhdGlvbnMuZm9yRWFjaCgobWlncmF0aW9uKSA9PiBlbWl0RmlsZShcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE1pZ3JhdGlvblRhcmdldChjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpLmluY2x1ZGVzKGNvbm5LZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaWdyYXRpb24gdGFyZ2V0IGlzIG5vdCBhbGxvd2VkIGluIE5PREVfRU5WPSR7Z2V0U29uYW11RW52aXJvbm1lbnQoKX06ICR7U3RyaW5nKGNvbm5LZXkpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg64yA7IOBIOy7pOuEpeyFmOydmCDsoJXsoIEg66mU7YOA642w7J207YSw66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogRELsl5Ag7Jew6rKw7ZWY7KeAIOyViuycvOuvgOuhnCBDTEnsmYAgV2Vi7J20IOyDge2DnCDsobDtmowg7KCE7JeQIOymieyLnCDsgqzsmqntlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBnZXRDb25uZWN0aW9ucygpOiBNaWdyYXRpb25Db25uZWN0aW9uTWV0YVtdIHtcbiAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpLm1hcCgoY29ubktleSkgPT4ge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IFNvbmFtdS5kYkNvbmZpZ1tjb25uS2V5XS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm5lY3Rpb24uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgbmFtZTogU3RyaW5nKGNvbm5LZXkpLFxuICAgICAgICBob3N0LFxuICAgICAgICBwb3J0OiBjb25uZWN0aW9uLnBvcnQgPz8gNTQzMixcbiAgICAgICAgZGF0YWJhc2U6IGNvbm5lY3Rpb24uZGF0YWJhc2UgPz8gXCJcIixcbiAgICAgICAgcmVtb3RlOiAhTE9DQUxfREJfSE9TVFMuaGFzKGhvc3QudG9Mb3dlckNhc2UoKSksXG4gICAgICAgIHJlcXVpcmVzQXBwcm92YWw6IHNsYWNrQ29uZmlybS5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwoY29ubktleSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyGjOyKpOyXkCDsobTsnqztlZjripQg66eI7J206re466CI7J207IWYIO2MjOydvCDrqqnroZ3snYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldE1pZ3JhdGlvbkNvZGVzKCk6IFByb21pc2U8TWlncmF0aW9uQ29kZVtdPiB7XG4gICAgY29uc3Qgc3JjTWlncmF0aW9uc0RpciA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwibWlncmF0aW9uc1wiKTsgLy8g7J206rG0IO2ZmOqyveyXkCDqtIDqs4Tsl4bsnbQg7ZWt7IOBIHNyY+yXkOyEnCDssL7slYTslbwg7ZW07JqULlxuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY01pZ3JhdGlvbnNEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIoc3JjTWlncmF0aW9uc0Rpciwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2RlcyA9IChhd2FpdCByZWFkZGlyKHNyY01pZ3JhdGlvbnNEaXIpKVxuICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAgIC5tYXAoKGYpID0+ICh7XG4gICAgICAgIG5hbWU6IGYucmVwbGFjZShcIi50c1wiLCBcIlwiKSxcbiAgICAgICAgcGF0aDogcGF0aC5qb2luKHNyY01pZ3JhdGlvbnNEaXIsIGYpLFxuICAgICAgfSkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IChhLm5hbWUgPCBiLm5hbWUgPyAxIDogLTEpKTsgLy8g7J2066aEIOuCtOumvOywqOyInCDsoJXroKwo7LWc7Iug7IicKVxuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldE1pZ3JhdGlvbkNvZGVzOnJlc3VsdHNcIiwgY29kZXMpO1xuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6TrhKXshZgg7ZWY64KY7J2YIO2YhOyerCDrsoTsoITqs7wgcGVuZGluZyDrqqnroZ3snYQg64+F66a97KCB7Jy866GcIOyhsO2ajO2VqeuLiOuLpC5cbiAgICog7Jes65+sIOuMgOyDgeydgCDtmLjstpzsnpDqsIAg67OR66Cs66GcIOyhsOumve2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldENvbm5lY3Rpb25TdGF0dXMoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzPiB7XG4gICAgdGhpcy5hc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleSk7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCk7XG4gICAgY29uc3Qga25leE9wdGlvbnMgPSBTb25hbXUuZGJDb25maWdbY29ubktleV07XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGtuZXhPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLihjb25uZWN0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICB9LFxuICAgICAgcG9vbDoge1xuICAgICAgICAuLi5rbmV4T3B0aW9ucy5wb29sLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIGFjcXVpcmVUaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgICBjcmVhdGVUaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgICBwcm9wYWdhdGVDcmVhdGVFcnJvcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFRpbWVvdXQodENvbm4ucmF3KFwic2VsZWN0IDFcIiksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgICBgREIg7Jew6rKwIOyLnOqwhCDstIjqs7wgKCR7TUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NU31tcykg4oCUICR7Y29ubmVjdGlvbi5ob3N0fToke2Nvbm5lY3Rpb24ucG9ydH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAsXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgbGV0IGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzdGF0dXM6IG51bWJlciB8IFwiZXJyb3JcIiA9IGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCkuY2F0Y2goKGNhdWdodCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHtcbiAgICAgICAgICByZXR1cm4gY29kZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yID0gY2F1Z2h0IGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHQubWVzc2FnZSA6IFN0cmluZyhjYXVnaHQpO1xuICAgICAgICByZXR1cm4gXCJlcnJvclwiIGFzIGNvbnN0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBwZW5kaW5nOiBzdHJpbmdbXSA9IGF3YWl0IHRDb25uLm1pZ3JhdGUubGlzdCgpLnRoZW4oXG4gICAgICAgIChbLCBmaWxlc106IFt1bmtub3duW10sIHsgZmlsZTogc3RyaW5nIH1bXV0pID0+XG4gICAgICAgICAgZmlsZXMubWFwKCh7IGZpbGUgfSkgPT4gZmlsZS5yZXBsYWNlKC9cXC50cyQvLCBcIlwiKSksXG4gICAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2Rlcy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPz89IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgY3VycmVudFZlcnNpb246IHN0cmluZyB8IFwibm9uZVwiIHwgXCJlcnJvclwiID0gYXdhaXQgdENvbm4ubWlncmF0ZVxuICAgICAgICAuY3VycmVudFZlcnNpb24oKVxuICAgICAgICAuY2F0Y2goKGNhdWdodDogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3IoY2F1Z2h0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1Z2h0IGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHQubWVzc2FnZSA6IFN0cmluZyhjYXVnaHQpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICAgIC4uLihlcnJvciA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVycm9yIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gY2F1Z2h0IGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHQubWVzc2FnZSA6IFN0cmluZyhjYXVnaHQpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYCR7U3RyaW5nKGNvbm5LZXkpfeydmCDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOc66W8IOqwgOyguOyYpOuKlCDrjbDsl5Ag7Iuk7Yyo7ZWY7JiA7Iq164uI64ukLlxcbiR7ZXJyb3J9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBjdXJyZW50VmVyc2lvbjogXCJlcnJvclwiLFxuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgcGVuZGluZzogW10sXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICAgIGVycm9yLFxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgd2l0aFRpbWVvdXQodENvbm4uZGVzdHJveSgpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGRlc3Ryb3kgdGltZW91dFwiKTtcbiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7LWc7IugIOyDge2DnOyduCDquLDspIAgRELsmYAg7JeU7Yuw7YuwIOygleydmOulvCDruYTqtZDtlbQg7IOd7ISxIOyYiOyglSDsvZTrk5zrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldFByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uU3RhdHVzKGNvbXBhcmVDb25uS2V5KTtcbiAgICBpZiAoc3RhdHVzLnN0YXR1cyAhPT0gMCB8fCBzdGF0dXMuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIGNvbXBhcmlzb24gcmVxdWlyZXMgYW4gdXAtdG8tZGF0ZSBkYXRhYmFzZTogJHtTdHJpbmcoY29tcGFyZUNvbm5LZXkpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVXaXRoQ29ubmVjdGlvbihjb21wYXJlQ29ubktleSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbXBhcmVXaXRoQ29ubmVjdGlvbihjb21wYXJlQ29ubktleTogTWlncmF0aW9uVGFyZ2V0KSB7XG4gICAgY29uc3QgY29tcGFyZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tjb21wYXJlQ29ubktleV0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjb21wYXJlREIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCDsi6Dqt5wgVUnsl5DshJzripQg7Luk64Sl7IWY67OEIOyhsO2ajCBBUEnrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQgQ0xJ7JmAIOyKpO2BrOumve2KuCDtmLjtmZjsnYQg7JyE7ZW0IOyghOyytCDsg4Htg5zrpbwg7KGw66a97ZWp64uI64ukLlxuICAgKiBAY2F0ZWdvcnkg7Zi47ZmY7JqpIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPE1pZ3JhdGlvblN0YXR1cz4ge1xuICAgIGNvbnN0IFtjb2RlcywgY29ubmVjdGlvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSksXG4gICAgXSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb2Rlc1wiLCBjb2Rlcyk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uU3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbm5lY3Rpb25zLm1hcCgoeyBjb25uS2V5IH0pID0+IHRoaXMuZ2V0Q29ubmVjdGlvblN0YXR1cyhjb25uS2V5KSksXG4gICAgKTtcbiAgICBjb25zdCBjb25ucyA9IGNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNvbm5lY3Rpb25TdGF0dXNlc1tpbmRleF07XG4gICAgICBhc3NlcnQoc3RhdHVzICE9PSB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgY29uZmlndXJlZCA9IFNvbmFtdS5kYkNvbmZpZ1tjb25uZWN0aW9uLmNvbm5LZXldLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBjb25uZWN0aW9uLm5hbWUsXG4gICAgICAgIGNvbm5LZXk6IGNvbm5lY3Rpb24uY29ubktleSxcbiAgICAgICAgY29ublN0cmluZzpcbiAgICAgICAgICBgcGc6Ly8ke2NvbmZpZ3VyZWQudXNlciA/PyBcIlwifUAke2NvbmZpZ3VyZWQuaG9zdH06JHtjb25maWd1cmVkLnBvcnR9LyR7Y29uZmlndXJlZC5kYXRhYmFzZX1gIGFzIENvbm5TdHJpbmcsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBzdGF0dXMuY3VycmVudFZlcnNpb24sXG4gICAgICAgIHN0YXR1czogc3RhdHVzLnN0YXR1cyxcbiAgICAgICAgcGVuZGluZzogc3RhdHVzLnBlbmRpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgY29ubnMpO1xuXG4gICAgY29uc3QgY29tcGFyZUNvbm4gPSBjb25uZWN0aW9uU3RhdHVzZXMuZmluZChcbiAgICAgICh7IHN0YXR1cywgZXJyb3IgfSkgPT4gc3RhdHVzID09PSAwICYmIGVycm9yID09PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uID09PSB1bmRlZmluZWQgPyBbXSA6IGF3YWl0IHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uLmNvbm5LZXkpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb25ucyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBjb25uZWN0aW9uU3RhdHVzZXMuZmluZCgoeyBlcnJvciB9KSA9PiBlcnJvciAhPT0gdW5kZWZpbmVkKT8uZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5AgcGVuZGluZyDrp4jsnbTqt7jroIjsnbTshZjsnYQg7KCB7Jqp7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgYXBwbHkodGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXCJhcHBseVwiLCB0YXJnZXRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vCBtaWdyYXRpb24gYmF0Y2jrpbwg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2soXG4gICAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwicm9sbGJhY2tcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYWN0aW9uIOusuOyekOyXtCDrjIDsi6Age0BsaW5rIGFwcGx5fSDrmJDripQge0BsaW5rIHJvbGxiYWNrfeydhCDsp4HsoJEg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQg7Jm467aAIO2YuOy2nOydmCDtlZjsnIQg7Zi47ZmY66eM7J2EIOychO2VtCDsnKDsp4Dtlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gYWN0aW9uID09PSBcImFwcGx5XCIgPyB0aGlzLmFwcGx5KHRhcmdldHMpIDogdGhpcy5yb2xsYmFjayh0YXJnZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWN0aW9uV2l0aFByb2dyZXNzKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246YWN0aW9uXCIsIGFjdGlvbik7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjp0YXJnZXRzXCIsIHRhcmdldHMpO1xuXG4gICAgY29uc3QgYWxsb3dlZFRhcmdldHMgPSBuZXcgU2V0KHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpKTtcbiAgICBjb25zdCBkaXNhbGxvd2VkVGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkVGFyZ2V0cy5oYXModGFyZ2V0KSk7XG4gICAgaWYgKGRpc2FsbG93ZWRUYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiB0YXJnZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke2Rpc2FsbG93ZWRUYXJnZXRzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5vcHRpb25zICE9PSB1bmRlZmluZWQpLFxuICAgICAgKHsgb3B0aW9ucyB9KSA9PlxuICAgICAgICBgJHsob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5ob3N0fToke1xuICAgICAgICAgIChvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLnBvcnQgPz8gNTQzMlxuICAgICAgICB9LyR7KG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuZGF0YWJhc2V9YCxcbiAgICApO1xuXG4gICAgLy8gZ2V0IGNvbm5lY3Rpb25zXG4gICAgY29uc3QgY29ubnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbmZpZ3MubWFwKGFzeW5jIChjb25maWcpID0+ICh7XG4gICAgICAgIGNvbm5LZXk6IGNvbmZpZy5jb25uS2V5LFxuICAgICAgICBrbmV4OiBjcmVhdGVLbmV4SW5zdGFuY2UoY29uZmlnLm9wdGlvbnMpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KGNvbm5zLCBhY3Rpb24sIG9wdGlvbnMpO1xuXG4gICAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnJlc3VsdFwiLCByZXN1bHQpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29ubnMubWFwKCh7IGtuZXggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBrbmV4LmRlc3Ryb3koKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuRGF0ZVRhZyhpbmRleDogbnVtYmVyLCBiYXNlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiYXNlRGF0ZS5nZXRUaW1lKCkgKyBpbmRleCAqIDEwMDApO1xuICAgIGNvbnN0IHBhZCA9IChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyID0gMikgPT4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0RGF0ZSgpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRIb3VycygpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uS2V5ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoYXdhaXQgdGhpcy5nZXRTdGF0dXMoKSkucHJlcGFyZWRDb2Rlc1xuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0UHJlcGFyZWRDb2Rlcyhjb21wYXJlQ29ubktleSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlUHJlcGFyZWRDb2RlczpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuICAgIGlmIChwcmVwYXJlZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJcXG7tmITsnqwg66qo65GQIOyLse2BrOuQnCDsg4Htg5zsnoXri4jri6QuXCIpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIOyLpOygnCDsvZTrk5wg7IOd7ISxXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnNgO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHBjb2RlXSBvZiBwcmVwYXJlZENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHBjb2RlLmZvcm1hdHRlZCkge1xuICAgICAgICBjb25zdCBkYXRlVGFnID0gdGhpcy5nZW5EYXRlVGFnKGluZGV4KTtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHttaWdyYXRpb25zRGlyfS8ke2RhdGVUYWd9XyR7cGNvZGUudGl0bGV9LnRzYDtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBwY29kZS5mb3JtYXR0ZWQpO1xuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYE1JR1JBVElPTiBDUkVBVEVEICR7ZmlsZVBhdGh9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcmVwYXJlZENvZGVzLmxlbmd0aDtcbiAgfVxuXG4gIGFzeW5jIGNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQjogS25leCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gICAgLy8gRW50aXR5IOyInO2ajO2VmOyXrCDsi7HtgaxcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBFbnRpdHnsl5DshJwgTWlncmF0aW9uU2V0IOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eVNldHNXaXRoSm9pblRhYmxlID0gZW50aXR5SWRzXG4gICAgICAuZmlsdGVyKChlbnRpdHlJZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKChlbnRpdHlJZCkgPT4gZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eShFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkpKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lOunjCDstpTstpxcbiAgICBjb25zdCBqb2luVGFibGVzV2l0aER1cCA9IGVudGl0eVNldHNXaXRoSm9pblRhYmxlLmZsYXRNYXAoKGVudGl0eVNldCkgPT4gZW50aXR5U2V0LmpvaW5UYWJsZXMpO1xuICAgIC8vIOykkeuztSDsoJzqsbAgKOykkeuzteyduCDqsr3smrAgaW5kZXhlc+ulvCDrs5HtlakpXG4gICAgY29uc3Qgam9pblRhYmxlcyA9IE9iamVjdC52YWx1ZXMoZ3JvdXAoam9pblRhYmxlc1dpdGhEdXAsIChqdCkgPT4ganQudGFibGUpKS5tYXAoKHRhYmxlcykgPT4ge1xuICAgICAgYXNzZXJ0KHRhYmxlcyAhPT0gdW5kZWZpbmVkLCBcInRhYmxlcyBpcyB1bmRlZmluZWRcIik7XG4gICAgICBpZiAodGFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGFibGVzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFibGVzWzBdLFxuICAgICAgICBpbmRleGVzOiB1bmlxdWUoXG4gICAgICAgICAgdGFibGVzLmZsYXRNYXAoKHQpID0+IHQuaW5kZXhlcyksXG4gICAgICAgICAgKGluZGV4KSA9PiBbaW5kZXgudHlwZSwgLi4uaW5kZXguY29sdW1uc10uam9pbihcIi1cIiksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBNaWdyYXRpb25TZXQg67Cw7Je0XG4gICAgY29uc3QgZW50aXR5U2V0czogTWlncmF0aW9uU2V0W10gPSBbLi4uZW50aXR5U2V0c1dpdGhKb2luVGFibGUsIC4uLmpvaW5UYWJsZXNdO1xuXG4gICAgY29uc3QgY29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IFtdO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0eVNldHMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2hDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRpdHlTZXRzLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLm1hcChhc3luYyAoZW50aXR5U2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGJTZXQgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldE1pZ3JhdGlvblNldEZyb21EQihcbiAgICAgICAgICAgIGNvbXBhcmVEQixcbiAgICAgICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmVudGl0eVNldDoke2VudGl0eVNldC50YWJsZX1gLCBlbnRpdHlTZXQpO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmRiU2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGRiU2V0KTtcblxuICAgICAgICAgIGlmIChkYlNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsl4bsnYwsIOyDiOuhnCDthYzsnbTruJQg7IOd7ISxXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7KG07J6s7ZWY64qUIOy8gOydtOyKpFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlKGVudGl0eVNldCwgZGJTZXQsIGNvbXBhcmVEQik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNvZGVzLnB1c2goLi4uYmF0Y2hDb2Rlcy5mbGF0KCkpO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbCDtg4DsnoXsnbQg7JWe7Jy866GcLCBmb3JlaWdu7J20IOuSpOuhnFxuICAgIGNvZGVzLnNvcnQoKGNvZGVBLCBjb2RlQikgPT4ge1xuICAgICAgaWYgKGNvZGVBLnR5cGUgPT09IFwiZm9yZWlnblwiICYmIGNvZGVCLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVBLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgY29kZUIudHlwZSA9PT0gXCJmb3JlaWduXCIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogdGVzdCBEQuydmCBzbmFwc2hvdOycvOuhnCDsnoTsi5wgU2hhZG93IERC66W8IOunjOuTpOqzoCDsoITssrQg66eI7J206re466CI7J207IWY7J2EIOqygOymne2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCBgb25Qcm9ncmVzc2Ag7Jyg66y066eMIOuLrOumrO2VtCDqsJnsnYAg7Iuk7ZaJIOydmOuvuOulvCDqs7XsnKDtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBydW5TaGFkb3dUZXN0KG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBiYXNlVGVzdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHdvcmtlcklkID0gcHJvY2Vzcy5lbnYuU09OQU1VX1dPUktFUl9EQiA9PT0gXCJ0cnVlXCIgPyBwcm9jZXNzLmVudi5WSVRFU1RfUE9PTF9JRCA6IG51bGw7XG4gICAgY29uc3QgdGVtcGxhdGVEYXRhYmFzZSA9XG4gICAgICB3b3JrZXJJZCAhPT0gbnVsbCA/IGAke2Jhc2VUZXN0Q29ubi5kYXRhYmFzZX1fJHt3b3JrZXJJZCA/PyBcIjFcIn1gIDogYmFzZVRlc3RDb25uLmRhdGFiYXNlO1xuICAgIGNvbnN0IHRkYkNvbm4gPSB7IC4uLmJhc2VUZXN0Q29ubiwgZGF0YWJhc2U6IHRlbXBsYXRlRGF0YWJhc2UgfTtcbiAgICBjb25zdCBzaGFkb3dEYXRhYmFzZSA9IGAke3RlbXBsYXRlRGF0YWJhc2V9X19taWdyYXRpb25fc2hhZG93YDtcblxuICAgIC8vIO2FjOyKpO2KuCDsg4Htmansl5DshJzripQg7Yq4656c7J6t7IWY7J2EIOy0iOq4sO2ZlO2VmOqzoCwg7IOIIOuNsOydtO2EsOuyoOydtOyKpCDsu6TrhKXshZjsnYQg6rCA7KC47JmA7JW8IO2VqFxuICAgIGlmIChpc1Rlc3QoKSkge1xuICAgICAgYXdhaXQgREIuY2xlYXJUZXN0VHJhbnNhY3Rpb24oKTtcbiAgICAgIGF3YWl0IERCLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvLyDquLDsobQgU2hhZG93IERCIOyCreygnCDtm4QgU2hhZG93IERCIOyDneyEsVxuICAgIGNvbnN0IHRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAuLi5Tb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uYmFzZVRlc3RDb25uLFxuICAgICAgICBkYXRhYmFzZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG4gICAgICBhd2FpdCB0ZGIucmF3KGBcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3RkYkNvbm4uZGF0YWJhc2V9J1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIGApO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgQ1JFQVRFIERBVEFCQVNFICR7c2hhZG93RGF0YWJhc2V9IFRFTVBMQVRFICR7dGRiQ29ubi5kYXRhYmFzZX1gKTtcblxuICAgICAgLy8gU2hhZG93IERC7JeQIOyXsOqysFxuICAgICAgY29uc3Qgc2RiID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgICAgLi4uU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAuLi50ZGJDb25uLFxuICAgICAgICAgIGRhdGFiYXNlOiBzaGFkb3dEYXRhYmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogdGRiQ29ubi5wYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzaGFkb3cgREIg7YWM7Iqk7Yq4IOynhO2WiVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLmNyZWF0ZVByb2dyZXNzSG9va3MoXCJzaGFkb3dcIiwgXCJzaGFkb3dcIiwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9IGF3YWl0IHNkYi5taWdyYXRlLmxhdGVzdChwcm9ncmVzcyk7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiU2hhZG93IERCIO2FjOyKpO2KuOyXkCDshLHqs7XtlojsirXri4jri6QhXCIpLCB7XG4gICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgYXBwbGllZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgICAgdHlwZTogXCJ0YXJnZXQtY29tcGxldGVcIixcbiAgICAgICAgICBhY3Rpb246IFwic2hhZG93XCIsXG4gICAgICAgICAgY29ubktleTogXCJzaGFkb3dcIixcbiAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgIGZpbGVzOiBhcHBsaWVkLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgYXBwbGllZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB0aHJvdyBuZXcgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgXCJzaGFkb3dcIixcbiAgICAgICAgICBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnNoYWRvd0RiVGVzdEZhaWxlZFwiKSksXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBzZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBTaGFkb3cgREIg7IKt7KCcXG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGRiLnJhdyhgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtzaGFkb3dEYXRhYmFzZX1gKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNoYWRvdyBEQiDsoJXrpqwg7Iuk7YyoOlwiLCBlKTsgLy8g7J206rKMIOyXhuycvOuptCDsobDsmqntnogg64iE7IiYXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOERBLFNBQVMsWUFBZSxTQUFxQixJQUFZLFdBQW9DO0NBQzNGLE9BQU8sSUFBSSxTQUFZLFNBQVMsV0FBVztFQUN6QyxNQUFNLFFBQVEsaUJBQWlCLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRTtFQUN0RCxRQUFRLE1BQ0wsVUFBVTtHQUNULGFBQWEsS0FBSztHQUNsQixRQUFRLEtBQUs7RUFDZixJQUNDLFVBQVU7R0FDVCxhQUFhLEtBQUs7R0FDbEIsT0FBTyxLQUFLO0VBQ2QsQ0FDRjtDQUNGLENBQUM7QUFDSDs7O2FBcEVzQztTQUNIO1dBRWtCO1NBQ3RCO3FCQUN5QjtVQUNYO29CQUM0QjtZQUNuQztpQkFFZTtlQUNYO3NCQUMrQjtvQkFDZDsrQkFDUTtvQkFDckI7Q0FtQmpDLGdDQUFiLGNBQW1ELE1BQU07RUFFckM7RUFEbEIsWUFDRSxTQUNBLFFBQ0E7R0FDQSxNQUFNLGtCQUFrQixRQUFRLE9BQU8sVUFBVSxPQUFPLE1BQU0sQ0FBQztHQUgvQyxLQUFBLFVBQUE7R0FJaEIsS0FBSyxPQUFPO0VBQ2Q7Q0FDRjtDQUtNLDRCQUE0QjtDQUM1QixpQ0FBaUIsSUFBSSxJQUFJO0VBQUM7RUFBYTtFQUFhO0VBQVc7Q0FBSyxDQUFDO0NBMkI5RCxXQUFiLE1BQXNCO0VBQ3BCLDZCQUFxQyxPQUF5QjtHQUM1RCxJQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFDekMsT0FBTztHQUdULE1BQU0scUJBQXFCO0dBQzNCLE9BQ0UsbUJBQW1CLFNBQVMsV0FDNUIsT0FBTyxtQkFBbUIsWUFBWSxZQUN0QyxtQkFBbUIsUUFBUSxTQUFTLGlCQUFpQjtFQUV6RDtFQUVBLHlCQUFvRDtHQUNsRCxNQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sUUFBUSxDQUFDLENBQUMsUUFDM0MsUUFBUSxDQUFDLElBQUksU0FBUyxXQUFXLENBQ3BDO0dBRUEsSUFBSSxRQUFRLEdBQ1YsT0FBTztHQUdULE1BQU0sY0FBYyxxQkFBcUI7R0FDekMsT0FBTyxTQUFTLFFBQVEsUUFBUSxRQUFRLFdBQVc7RUFDckQ7RUFFQSxNQUFjLDBCQUNaLE9BQ0EsUUFDQSxTQUMwQjtHQUMxQixNQUFNLFVBQTJCLENBQUM7R0FFbEMsS0FBSyxNQUFNLEVBQUUsU0FBUyxVQUFVLE9BQU87SUFDckMsTUFBTSxXQUFXLEtBQUssb0JBQW9CLFFBQVEsU0FBUyxPQUFPO0lBQ2xFLElBQUk7SUFDSixJQUFJO0tBQ0Ysa0JBQ0UsV0FBVyxVQUNQLE1BQU0sS0FBSyxRQUFRLE9BQU8sUUFBUSxJQUNsQyxNQUFNLEtBQUssUUFBUSxTQUFTLFFBQVE7SUFDNUMsU0FBUyxRQUFRO0tBRWYsTUFBTSxJQUFJLDhCQUE4QixTQUFTLE1BQU07SUFDekQ7SUFDQSxNQUFNLENBQUMsU0FBUyxXQUFXO0lBRTNCLFFBQVEsS0FBSztLQUNYO0tBQ0E7S0FDQTtJQUNGLENBQUM7SUFDRCxLQUFLLGFBQWEsU0FBUztLQUN6QixNQUFNO0tBQ047S0FDQTtLQUNBO0tBQ0EsT0FBTztJQUNULENBQUM7R0FDSDtHQUVBLE9BQU87RUFDVDtFQUVBLGNBQXNCLFdBQTRCO0dBQ2hELElBQUksT0FBTyxjQUFjLFVBQ3ZCLE9BQU8sS0FBSyxTQUFTLFNBQVM7R0FFaEMsSUFBSSxPQUFPLGNBQWMsWUFBWSxjQUFjLE1BQU07SUFDdkQsTUFBTSxZQUFZO0lBQ2xCLElBQUksT0FBTyxVQUFVLFNBQVMsVUFDNUIsT0FBTyxLQUFLLFNBQVMsVUFBVSxJQUFJO0lBRXJDLElBQUksT0FBTyxVQUFVLFNBQVMsVUFDNUIsT0FBTyxLQUFLLFNBQVMsVUFBVSxJQUFJO0dBRXZDO0dBQ0EsT0FBTyxPQUFPLFNBQVM7RUFDekI7RUFFQSxhQUFxQixTQUEwQyxPQUErQjtHQUM1RixJQUFJO0lBQ0YsU0FBUyxhQUFhLEtBQUs7R0FDN0IsU0FBUyxPQUFPO0lBRWQsUUFBUSxLQUFLLHVDQUF1QyxLQUFLO0dBQzNEO0VBQ0Y7RUFFQSxvQkFDRSxRQUNBLFNBQ0EsU0FDdUM7R0FDdkMsSUFBSSxRQUFrQixDQUFDO0dBQ3ZCLE1BQU0sWUFBWSxNQUFzQyxjQUF1QjtJQUM3RSxNQUFNLE9BQU8sS0FBSyxjQUFjLFNBQVM7SUFDekMsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHLENBQUM7SUFDN0MsS0FBSyxhQUFhLFNBQVM7S0FDekI7S0FDQTtLQUNBO0tBQ0E7S0FDQTtLQUNBLE9BQU8sTUFBTTtJQUNmLENBQUM7R0FDSDtHQUVBLE9BQU87SUFDTCxXQUFXLE9BQU8sT0FBTyxlQUFlO0tBQ3RDLFFBQVEsV0FBVyxLQUFLLGNBQWMsS0FBSyxjQUFjLFNBQVMsQ0FBQztLQUNuRSxLQUFLLGFBQWEsU0FBUztNQUFFLE1BQU07TUFBZ0I7TUFBUTtNQUFTO0tBQU0sQ0FBQztJQUM3RTtJQUNBLFlBQVksT0FBTyxPQUFPLGVBQWU7S0FDdkMsV0FBVyxTQUFTLGNBQWMsU0FBUyxjQUFjLFNBQVMsQ0FBQztJQUNyRTtJQUNBLFdBQVcsT0FBTyxPQUFPLGVBQWU7S0FDdEMsV0FBVyxTQUFTLGNBQWMsU0FBUyxpQkFBaUIsU0FBUyxDQUFDO0lBQ3hFO0dBQ0Y7RUFDRjtFQUVBLHNCQUE4QixTQUFnQztHQUM1RCxJQUFJLENBQUMsS0FBSyx1QkFBdUIsQ0FBQyxDQUFDLFNBQVMsT0FBTyxHQUNqRCxNQUFNLElBQUksTUFDUiwrQ0FBK0MscUJBQXFCLEVBQUUsSUFBSSxPQUFPLE9BQU8sR0FDMUY7RUFFSjs7Ozs7OztFQVFBLGlCQUE0QztHQUMxQyxNQUFNLGVBQWUsSUFBSSxhQUFhO0dBQ3RDLE9BQU8sS0FBSyx1QkFBdUIsQ0FBQyxDQUFDLEtBQUssWUFBWTtJQUNwRCxNQUFNLGFBQWEsT0FBTyxTQUFTLFFBQVEsQ0FBQztJQUM1QyxNQUFNLE9BQU8sV0FBVyxRQUFRO0lBQ2hDLE9BQU87S0FDTDtLQUNBLE1BQU0sT0FBTyxPQUFPO0tBQ3BCO0tBQ0EsTUFBTSxXQUFXLFFBQVE7S0FDekIsVUFBVSxXQUFXLFlBQVk7S0FDakMsUUFBUSxDQUFDLGVBQWUsSUFBSSxLQUFLLFlBQVksQ0FBQztLQUM5QyxrQkFBa0IsYUFBYSx5QkFBeUIsT0FBTztJQUNqRTtHQUNGLENBQUM7RUFDSDs7Ozs7O0VBT0EsTUFBTSxvQkFBOEM7R0FDbEQsTUFBTSxtQkFBbUIsS0FBSyxLQUFLLE9BQU8sYUFBYSxPQUFPLFlBQVk7R0FFMUUsSUFBSSxDQUFFLE1BQU0sT0FBTyxnQkFBZ0IsR0FDakMsTUFBTSxNQUFNLGtCQUFrQixFQUM1QixXQUFXLEtBQ2IsQ0FBQztHQUdILE1BQU0sU0FBUyxNQUFNLFFBQVEsZ0JBQWdCLEVBQUEsQ0FDMUMsUUFBUSxNQUFNLEVBQUUsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUNoQyxLQUFLLE9BQU87SUFDWCxNQUFNLEVBQUUsUUFBUSxPQUFPLEVBQUU7SUFDekIsTUFBTSxLQUFLLEtBQUssa0JBQWtCLENBQUM7R0FDckMsRUFBRSxDQUFDLENBQ0YsVUFBVSxHQUFHLE1BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUc7R0FFaEQsTUFBTSxFQUFFLHNDQUFzQyxLQUFLO0dBQ25ELE9BQU87RUFDVDs7Ozs7OztFQVFBLE1BQU0sb0JBQW9CLFNBQThEO0dBQ3RGLEtBQUssc0JBQXNCLE9BQU87R0FDbEMsTUFBTSxZQUFZLFlBQVksSUFBSTtHQUNsQyxNQUFNLFFBQVEsTUFBTSxLQUFLLGtCQUFrQjtHQUMzQyxNQUFNLGNBQWMsT0FBTyxTQUFTO0dBQ3BDLE1BQU0sYUFBYSxZQUFZO0dBQy9CLE1BQU0sUUFBUSxtQkFBbUI7SUFDL0IsR0FBRztJQUNILFlBQVk7S0FDVixHQUFJO0tBQ0oseUJBQXlCO0lBQzNCO0lBQ0EsTUFBTTtLQUNKLEdBQUcsWUFBWTtLQUNmLEtBQUs7S0FDTCxzQkFBc0I7S0FDdEIscUJBQXFCO0tBQ3JCLHNCQUFzQjtJQUN4QjtHQUNGLENBQUM7R0FFRCxJQUFJO0lBQ0YsTUFBTSxZQUFZLE1BQU0sSUFBSSxVQUFVLEdBQUcsaUNBQWlDO0tBQ3hFLHVCQUFPLElBQUksTUFDVCxnQkFBZ0IsMEJBQTBCLFFBQVEsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLEdBQUcsV0FBVyxVQUNyRztJQUNGLENBQUM7SUFFRCxJQUFJO0lBQ0osTUFBTSxTQUEyQixNQUFNLE1BQU0sUUFBUSxPQUFPLENBQUMsQ0FBQyxPQUFPLFdBQVc7S0FDOUUsSUFBSSxLQUFLLDZCQUE2QixNQUFNLEdBQzFDLE9BQU8sTUFBTTtLQUVmLFFBQVEsa0JBQWtCLFFBQVEsT0FBTyxVQUFVLE9BQU8sTUFBTTtLQUNoRSxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sVUFBb0IsTUFBTSxNQUFNLFFBQVEsS0FBSyxDQUFDLENBQUMsTUFDbEQsR0FBRyxXQUNGLE1BQU0sS0FBSyxFQUFFLFdBQVcsS0FBSyxRQUFRLFNBQVMsRUFBRSxDQUFDLElBQ2xELFdBQW9CO0tBQ25CLElBQUksS0FBSyw2QkFBNkIsTUFBTSxHQUMxQyxPQUFPLE1BQU0sS0FBSyxFQUFFLFdBQVcsSUFBSTtLQUVyQyxVQUFVLGtCQUFrQixRQUFRLE9BQU8sVUFBVSxPQUFPLE1BQU07S0FDbEUsT0FBTyxDQUFDO0lBQ1YsQ0FDRjtJQUNBLE1BQU0saUJBQTRDLE1BQU0sTUFBTSxRQUMzRCxlQUFlLENBQUMsQ0FDaEIsT0FBTyxXQUFvQjtLQUMxQixJQUFJLEtBQUssNkJBQTZCLE1BQU0sR0FDMUMsT0FBTztLQUVULFVBQVUsa0JBQWtCLFFBQVEsT0FBTyxVQUFVLE9BQU8sTUFBTTtLQUNsRSxPQUFPO0lBQ1QsQ0FBQztJQUNILE1BQU0sRUFBRSw2QkFBNkIsTUFBTTtJQUMzQyxPQUFPO0tBQ0w7S0FDQTtLQUNBO0tBQ0E7S0FDQSxXQUFXLFlBQVksSUFBSSxJQUFJO0tBQy9CLEdBQUksVUFBVSxTQUFZLENBQUMsSUFBSSxFQUFFLE1BQU07SUFDekM7R0FDRixTQUFTLFFBQVE7SUFDZixNQUFNLFFBQVEsa0JBQWtCLFFBQVEsT0FBTyxVQUFVLE9BQU8sTUFBTTtJQUN0RSxRQUFRLEtBQ04sTUFBTSxPQUNKLEdBQUcsT0FBTyxPQUFPLEVBQUUsaUNBQWlDLE9BQ3RELENBQ0Y7SUFDQSxPQUFPO0tBQ0w7S0FDQSxnQkFBZ0I7S0FDaEIsUUFBUTtLQUNSLFNBQVMsQ0FBQztLQUNWLFdBQVcsWUFBWSxJQUFJLElBQUk7S0FDL0I7SUFDRjtHQUNGLFVBQVU7SUFDUixNQUFNLFlBQVksTUFBTSxRQUFRLEdBQUcsaUNBQWlDO0tBQ2xFLHVCQUFPLElBQUksTUFBTSw0QkFBNEI7SUFDL0MsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7R0FDbkI7RUFDRjs7Ozs7O0VBT0EsTUFBTSxpQkFBaUIsZ0JBQThEO0dBQ25GLE1BQU0sU0FBUyxNQUFNLEtBQUssb0JBQW9CLGNBQWM7R0FDNUQsSUFBSSxPQUFPLFdBQVcsS0FBSyxPQUFPLFVBQVUsUUFDMUMsTUFBTSxJQUFJLE1BQ1IseURBQXlELE9BQU8sY0FBYyxHQUNoRjtHQUdGLE9BQU8sS0FBSyxzQkFBc0IsY0FBYztFQUNsRDtFQUVBLE1BQWMsc0JBQXNCLGdCQUFpQztHQUNuRSxNQUFNLFlBQVksbUJBQW1CLE9BQU8sU0FBUyxlQUFlO0dBQ3BFLElBQUk7SUFDRixPQUFPLE1BQU0sS0FBSyxrQkFBa0IsU0FBUztHQUMvQyxVQUFVO0lBQ1IsTUFBTSxVQUFVLFFBQVE7R0FDMUI7RUFDRjs7Ozs7O0VBT0EsTUFBTSxZQUFzQztHQUMxQyxNQUFNLENBQUMsT0FBTyxlQUFlLE1BQU0sUUFBUSxJQUFJLENBQzdDLEtBQUssa0JBQWtCLEdBQ3ZCLFFBQVEsUUFBUSxLQUFLLGVBQWUsQ0FBQyxDQUN2QyxDQUFDO0dBQ0QsTUFBTSxFQUFFLDRCQUE0QixLQUFLO0dBRXpDLE1BQU0scUJBQXFCLE1BQU0sUUFBUSxJQUN2QyxZQUFZLEtBQUssRUFBRSxjQUFjLEtBQUssb0JBQW9CLE9BQU8sQ0FBQyxDQUNwRTtHQUNBLE1BQU0sUUFBUSxZQUFZLEtBQUssWUFBWSxVQUFVO0lBQ25ELE1BQU0sU0FBUyxtQkFBbUI7SUFDbEMsT0FBTyxXQUFXLE1BQVM7SUFDM0IsTUFBTSxhQUFhLE9BQU8sU0FBUyxXQUFXLFFBQVEsQ0FBQztJQUN2RCxPQUFPO0tBQ0wsTUFBTSxXQUFXO0tBQ2pCLFNBQVMsV0FBVztLQUNwQixZQUNFLFFBQVEsV0FBVyxRQUFRLEdBQUcsR0FBRyxXQUFXLEtBQUssR0FBRyxXQUFXLEtBQUssR0FBRyxXQUFXO0tBQ3BGLGdCQUFnQixPQUFPO0tBQ3ZCLFFBQVEsT0FBTztLQUNmLFNBQVMsT0FBTztJQUNsQjtHQUNGLENBQUM7R0FDRCxNQUFNLEVBQUUsNEJBQTRCLEtBQUs7R0FFekMsTUFBTSxjQUFjLG1CQUFtQixNQUNwQyxFQUFFLFFBQVEsWUFBWSxXQUFXLEtBQUssVUFBVSxNQUNuRDtHQUNBLE1BQU0sZ0JBQ0osZ0JBQWdCLFNBQVksQ0FBQyxJQUFJLE1BQU0sS0FBSyxzQkFBc0IsWUFBWSxPQUFPO0dBQ3ZGLE1BQU0sRUFBRSxvQ0FBb0MsYUFBYTtHQUV6RCxPQUFPO0lBQ0w7SUFDQTtJQUNBO0lBQ0EsT0FBTyxtQkFBbUIsTUFBTSxFQUFFLFlBQVksVUFBVSxNQUFTLENBQUMsRUFBRTtHQUN0RTtFQUNGOzs7Ozs7O0VBUUEsTUFBTSxNQUFNLFNBQTRCLFNBQXlEO0dBQy9GLE9BQU8sS0FBSyxzQkFBc0IsU0FBUyxTQUFTLE9BQU87RUFDN0Q7Ozs7Ozs7RUFRQSxNQUFNLFNBQ0osU0FDQSxTQUMwQjtHQUMxQixPQUFPLEtBQUssc0JBQXNCLFlBQVksU0FBUyxPQUFPO0VBQ2hFOzs7Ozs7RUFPQSxNQUFNLFVBQ0osUUFDQSxTQUMwQjtHQUMxQixPQUFPLFdBQVcsVUFBVSxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssU0FBUyxPQUFPO0VBQ3pFO0VBRUEsTUFBYyxzQkFDWixRQUNBLFNBQ0EsU0FDMEI7R0FDMUIsTUFBTSxFQUFFLDZCQUE2QixNQUFNO0dBQzNDLE1BQU0sRUFBRSw4QkFBOEIsT0FBTztHQUU3QyxNQUFNLGlCQUFpQixJQUFJLElBQUksS0FBSyx1QkFBdUIsQ0FBQztHQUM1RCxNQUFNLG9CQUFvQixRQUFRLFFBQVEsV0FBVyxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUM7R0FDaEYsSUFBSSxrQkFBa0IsU0FBUyxHQUM3QixNQUFNLElBQUksTUFDUixpREFBaUQscUJBQXFCLEVBQUUsSUFBSSxrQkFBa0IsS0FBSyxJQUFJLEdBQ3pHO0dBSUYsTUFBTSxVQUFVLE9BQ2QsUUFDRyxLQUFLLFlBQVk7SUFDaEIsU0FBUztJQUNULFNBQVMsT0FBTyxTQUFTO0dBQzNCLEVBQUUsQ0FBQyxDQUNGLFFBQVEsTUFBTSxFQUFFLFlBQVksTUFBUyxJQUN2QyxFQUFFLGNBQ0QsR0FBSSxRQUFRLFdBQXVDLEtBQUssR0FDckQsUUFBUSxXQUF1QyxRQUFRLEtBQ3pELEdBQUksUUFBUSxXQUF1QyxVQUN4RDtHQUdBLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFDMUIsUUFBUSxJQUFJLE9BQU8sWUFBWTtJQUM3QixTQUFTLE9BQU87SUFDaEIsTUFBTSxtQkFBbUIsT0FBTyxPQUFPO0dBQ3pDLEVBQUUsQ0FDSjtHQUVBLElBQUk7SUFDRixNQUFNLFNBQVMsTUFBTSxLQUFLLDBCQUEwQixPQUFPLFFBQVEsT0FBTztJQUUxRSxNQUFNLEVBQUUsNkJBQTZCLE1BQU07SUFFM0MsT0FBTztHQUNULFVBQVU7SUFDUixNQUFNLFFBQVEsSUFDWixNQUFNLEtBQUssRUFBRSxXQUFXO0tBQ3RCLE9BQU8sS0FBSyxRQUFRO0lBQ3RCLENBQUMsQ0FDSDtHQUNGO0VBQ0Y7RUFFQSxXQUFtQixPQUFlLDJCQUFpQixJQUFJLEtBQUssR0FBVztHQUNyRSxNQUFNLE9BQU8sSUFBSSxLQUFLLFNBQVMsUUFBUSxJQUFJLFFBQVEsR0FBSTtHQUN2RCxNQUFNLE9BQU8sS0FBYSxPQUFlLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxTQUFTLE1BQU0sR0FBRztHQUNoRixPQUNFLEtBQUssWUFBWSxDQUFDLENBQUMsU0FBUyxJQUM1QixJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsSUFDdkIsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUNsQixJQUFJLEtBQUssU0FBUyxDQUFDLElBQ25CLElBQUksS0FBSyxXQUFXLENBQUMsSUFDckIsSUFBSSxLQUFLLFdBQVcsQ0FBQztFQUV6Qjs7Ozs7Ozs7RUFTQSxNQUFNLHNCQUFzQixnQkFBbUQ7R0FDN0UsTUFBTSxnQkFDSixtQkFBbUIsVUFDZCxNQUFNLEtBQUssVUFBVSxFQUFBLENBQUcsZ0JBQ3pCLE1BQU0sS0FBSyxpQkFBaUIsY0FBYztHQUNoRCxNQUFNLEVBQUUsZ0RBQWdELGFBQWE7R0FDckUsSUFBSSxjQUFjLFdBQVcsR0FBRztJQUM5QixRQUFRLElBQUksTUFBTSxNQUFNLG9CQUFvQixDQUFDO0lBQzdDLE9BQU87R0FDVDtHQUdBLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxZQUFZO0dBRTVDLEtBQUssTUFBTSxDQUFDLE9BQU8sVUFBVSxjQUFjLFFBQVEsR0FDakQsSUFBSSxNQUFNLFdBQVc7SUFFbkIsTUFBTSxXQUFXLEdBQUcsY0FBYyxHQURsQixLQUFLLFdBQVcsS0FDSyxFQUFRLEdBQUcsTUFBTSxNQUFNO0lBQzVELE1BQU0sVUFBVSxVQUFVLE1BQU0sU0FBUztJQUN6QyxDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksTUFBTSxNQUFNLHFCQUFxQixVQUFVLENBQUM7R0FDdkU7R0FHRixPQUFPLGNBQWM7RUFDdkI7RUFFQSxNQUFNLGtCQUFrQixXQUE4QztHQUtwRSxNQUFNLDBCQUhZLGNBQWMsVUFHQSxDQUFBLENBQzdCLFFBQVEsYUFBYSxjQUFjLElBQUksUUFBUSxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQyxDQUNsRSxLQUFLLGFBQWEsMEJBQTBCLGNBQWMsSUFBSSxRQUFRLENBQUMsQ0FBQztHQUczRSxNQUFNLG9CQUFvQix3QkFBd0IsU0FBUyxjQUFjLFVBQVUsVUFBVTtHQUU3RixNQUFNLGFBQWEsT0FBTyxPQUFPLE1BQU0sb0JBQW9CLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVztJQUMzRixPQUFPLFdBQVcsUUFBVyxxQkFBcUI7SUFDbEQsSUFBSSxPQUFPLFdBQVcsR0FDcEIsT0FBTyxPQUFPO0lBRWhCLE9BQU87S0FDTCxHQUFHLE9BQU87S0FDVixTQUFTLE9BQ1AsT0FBTyxTQUFTLE1BQU0sRUFBRSxPQUFPLElBQzlCLFVBQVUsQ0FBQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUNwRDtJQUNGO0dBQ0YsQ0FBQztHQUdELE1BQU0sYUFBNkIsQ0FBQyxHQUFHLHlCQUF5QixHQUFHLFVBQVU7R0FFN0UsTUFBTSxRQUE0QixDQUFDO0dBQ25DLE1BQU0sWUFBWTtHQUVsQixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksV0FBVyxRQUFRLEtBQUssV0FBVztJQUNyRCxNQUFNLGFBQWEsTUFBTSxRQUFRLElBQy9CLFdBQVcsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLENBQUMsSUFBSSxPQUFPLGNBQWM7S0FDMUQsTUFBTSxRQUFRLE1BQU0sdUJBQXVCLHNCQUN6QyxXQUNBLFVBQVUsS0FDWjtLQUNBLE1BQU0sRUFBRSx3Q0FBd0MsVUFBVSxTQUFTLFNBQVM7S0FDNUUsTUFBTSxFQUFFLG9DQUFvQyxVQUFVLFNBQVMsS0FBSztLQUVwRSxJQUFJLFVBQVUsTUFFWixPQUFPLE1BQU0sbUJBQW1CLFNBQVM7VUFHekMsT0FBTyxNQUFNLGtCQUFrQixXQUFXLE9BQU8sU0FBUztJQUU5RCxDQUFDLENBQ0g7SUFFQSxNQUFNLEtBQUssR0FBRyxXQUFXLEtBQUssQ0FBQztHQUNqQztHQUdBLE1BQU0sTUFBTSxPQUFPLFVBQVU7SUFDM0IsSUFBSSxNQUFNLFNBQVMsYUFBYSxNQUFNLFNBQVMsVUFDN0MsT0FBTztTQUNGLElBQUksTUFBTSxTQUFTLFlBQVksTUFBTSxTQUFTLFdBQ25ELE9BQU87U0FFUCxPQUFPO0dBRVgsQ0FBQztHQUVELE9BQU87RUFDVDs7Ozs7OztFQVFBLE1BQU0sY0FBYyxTQUF5RDtHQUMzRSxNQUFNLGVBQWUsT0FBTyxTQUFTLEtBQUs7R0FDMUMsTUFBTSxXQUFXLFFBQVEsSUFBSSxxQkFBcUIsU0FBUyxRQUFRLElBQUksaUJBQWlCO0dBQ3hGLE1BQU0sbUJBQ0osYUFBYSxPQUFPLEdBQUcsYUFBYSxTQUFTLEdBQUcsWUFBWSxRQUFRLGFBQWE7R0FDbkYsTUFBTSxVQUFVO0lBQUUsR0FBRztJQUFjLFVBQVU7R0FBaUI7R0FDOUQsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUI7R0FHM0MsSUFBSSxPQUFPLEdBQUc7SUFDWixNQUFNLEdBQUcscUJBQXFCO0lBQzlCLE1BQU0sR0FBRyxRQUFRO0dBQ25CO0dBR0EsTUFBTSxNQUFNLG1CQUFtQjtJQUM3QixHQUFHLE9BQU8sU0FBUztJQUNuQixZQUFZO0tBQ1YsR0FBRztLQUNILFVBQVU7SUFDWjtHQUNGLENBQUM7R0FDRCxJQUFJO0lBQ0YsQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLE1BQU0sUUFBUSxHQUFHLGVBQWUsSUFBSSxDQUFDO0lBQzlELE1BQU0sSUFBSSxJQUFJLDJCQUEyQixnQkFBZ0I7SUFDekQsTUFBTSxJQUFJLElBQUk7OzsyQkFHTyxRQUFRLFNBQVM7O09BRXJDO0lBQ0QsTUFBTSxJQUFJLElBQUksbUJBQW1CLGVBQWUsWUFBWSxRQUFRLFVBQVU7SUFHOUUsTUFBTSxNQUFNLG1CQUFtQjtLQUM3QixHQUFHLE9BQU8sU0FBUztLQUNuQixZQUFZO01BQ1YsR0FBRztNQUNILFVBQVU7TUFDVixVQUFVLFFBQVE7S0FDcEI7SUFDRixDQUFDO0lBR0QsSUFBSTtLQUNGLE1BQU0sV0FBVyxLQUFLLG9CQUFvQixVQUFVLFVBQVUsT0FBTztLQUNyRSxNQUFNLENBQUMsU0FBUyxXQUFXLE1BQU0sSUFBSSxRQUFRLE9BQU8sUUFBUTtLQUM1RCxDQUFDLE9BQU8sS0FDTixRQUFRLElBQUksTUFBTSxNQUFNLHdCQUF3QixHQUFHO01BQ2pEO01BQ0E7S0FDRixDQUFDO0tBRUgsS0FBSyxhQUFhLFNBQVM7TUFDekIsTUFBTTtNQUNOLFFBQVE7TUFDUixTQUFTO01BQ1Q7TUFDQSxPQUFPO0tBQ1QsQ0FBQztLQUVELE9BQU8sQ0FDTDtNQUNFLFNBQVM7TUFDVDtNQUNBO0tBQ0YsQ0FDRjtJQUNGLFNBQVMsR0FBRztLQUNWLFFBQVEsTUFBTSxDQUFDO0tBQ2YsTUFBTSxJQUFJLDhCQUNSLFVBQ0EsSUFBSSw0QkFBNEIsR0FBRyxpQ0FBaUMsQ0FBQyxDQUN2RTtJQUNGLFVBQVU7S0FDUixNQUFNLElBQUksUUFBUTtJQUNwQjtHQUNGLFVBQVU7SUFFUixDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksTUFBTSxRQUFRLEdBQUcsZUFBZSxJQUFJLENBQUM7SUFDOUQsSUFBSTtLQUNGLE1BQU0sSUFBSSxJQUFJLDJCQUEyQixnQkFBZ0I7SUFDM0QsU0FBUyxHQUFHO0tBQ1YsUUFBUSxNQUFNLG9CQUFvQixDQUFDO0lBQ3JDLFVBQVU7S0FDUixNQUFNLElBQUksUUFBUTtJQUNwQjtHQUNGO0VBQ0Y7Q0FDRiJ9
|
|
518
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ublN0cmluZyxcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uTWV0YSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblByb2dyZXNzRXZlbnQsXG4gIHR5cGUgTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgdHlwZSBNaWdyYXRpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uVGFyZ2V0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxuZnVuY3Rpb24gcGFkRGF0ZVBhcnQobnVtYmVyOiBudW1iZXIsIHNpemU6IG51bWJlciA9IDIpOiBzdHJpbmcge1xuICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xufVxuXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfCBcInNoYWRvd1wiLFxuICAgIGNhdXNlOiB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSkpO1xuICAgIHRoaXMubmFtZSA9IFwiTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG4vLyDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOcIOyhsO2ajCDsi5wgREIg7Jew6rKwIO2ZleyduCDtg4DsnoTslYTsm4MobXMpLlxuLy8gY3JlYXRlS25leEluc3RhbmNl7J2YIOy7pOuEpeyFmCDtmo3rk50g7YOA7J6E7JWE7JuDKDMw7LSIKeyXkCBzdGF0dXMvbGlzdC9jdXJyZW50VmVyc2lvbuydtFxuLy8g6rCB6rCBIOqxuOumrOuptCBDTEkvVUnqsIAg7LWc64yAIOyImOyLrSDstIggaGFuZ+2VnOuLpC4g7KCV7IOBIOydkeuLteydgCDsiJjrsLEgbXPsnbTrr4DroZwgNey0iOuptCDstqnrtoTtlZjri6QuXG5jb25zdCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IExPQ0FMX0RCX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcblxuLyoqXG4gKiDso7zslrTsp4QgUHJvbWlzZeqwgCBtcyDslYjsl5Ag7JmE66OM65CY7KeAIOyViuycvOuptCBvblRpbWVvdXQg7JeQ65+s66GcIHJlamVjdO2VnOuLpC5cbiAqIOybkOuzuCBQcm9taXNlIOyekOyytOuKlCDqs4Tsho0g7KeE7ZaJ65CY66+A66GcLCDtmLjstpzsuKHsl5DshJwg7Luk64Sl7IWYIOygleumrChkZXN0cm95KeulvCDssYXsnoTsp4Tri6QuXG4gKi9cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIG1zOiBudW1iZXIsIG9uVGltZW91dDogKCkgPT4gRXJyb3IpOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG9uVGltZW91dCgpKSwgbXMpO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTm90ZSAyMDI2LTA4LTI2LCDrs5HspIBcbiAqIOydtCDtgbTrnpjsiqTsl5DshJwgZGVwcmVjYXRlZCDrtpnslrTsnojripQg7Lmc6rWs65Ok7J2AIO2YhCBDTEnrpbwg7JyE7ZWcIO2VmOychCDtmLjtmZjsnbTri4gsXG4gKiBDTEkg66as7Yyp7Yag66eBIOyLnOygkOyXkOyEnCDsoJzqsbDtlbTso7zshZTrj4Qg66y067Cp7ZWp64uI64ukLlxuICovXG5leHBvcnQgY2xhc3MgTWlncmF0b3Ige1xuICBwcml2YXRlIGlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3I8VmFsdWU+KGVycm9yOiBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNPYmplY3RWYWx1ZShlcnJvcikgfHwgZXJyb3IgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXliZVBvc3RncmVzRXJyb3IgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBlcnJvciBhcyB7XG4gICAgICAgIGNvZGU/OiB1bmtub3duO1xuICAgICAgICBtZXNzYWdlPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCIgJiZcbiAgICAgIGlzU3RyaW5nVmFsdWUobWF5YmVQb3N0Z3Jlc0Vycm9yLm1lc3NhZ2UpICYmXG4gICAgICBtYXliZVBvc3RncmVzRXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImtuZXhfbWlncmF0aW9uc1wiKVxuICAgICk7XG4gIH1cblxuICAvKiog7ZiE7J6sIOyLpO2WiSDtmZjqsr3sl5DshJwg7ZeI7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDrjIDsg4Eg7YKk66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbiAgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiBNaWdyYXRpb25UYXJnZXRbXSB7XG4gICAgY29uc3QgY29ubktleXMgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgU29uYW11LmRiQ29uZmlnLFxuICAgICAgKS5maWx0ZXIoKGtleSkgPT4gIWtleS5lbmRzV2l0aChcIl9yZWFkb25seVwiKSkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZTxWYWx1ZT4obWlncmF0aW9uOiBWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUobWlncmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUobWlncmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUobWlncmF0aW9uKSAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWlncmF0aW9uIGFzIHtcbiAgICAgICAgICBmaWxlPzogdW5rbm93bjtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5maWxlKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjYW5kaWRhdGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY2FuZGlkYXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1pZ3JhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9ncmVzcyhvcHRpb25zOiBNaWdyYXRpb25SdW5PcHRpb25zIHwgdW5kZWZpbmVkLCBldmVudDogTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zPy5vblByb2dyZXNzPy4oZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDsp4TtlonrpaAg7IaM67mE7J6Q7J2YIOyLpO2MqOqwgCDsnbTrr7gg7Iuc7J6R7ZWcIERCIOyekeyXheqzvCDsoJXrpqzrpbwg67Cp7ZW07ZWY66m0IOyViCDrkKnri4jri6QuXG4gICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gcHJvZ3Jlc3Mgb2JzZXJ2ZXIgZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9ncmVzc0hvb2tzKFxuICAgIGFjdGlvbjogTWlncmF0aW9uQWN0aW9uLFxuICAgIGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IEtuZXguTWlncmF0b3JDb25maWdXaXRoTGlmZWN5Y2xlSG9va3Mge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0RmlsZSA9IDxWYWx1ZT4odHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pO1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLm1heChmaWxlcy5pbmRleE9mKGZpbGUpLCAwKTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdG90YWw6IGZpbGVzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlQWxsOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgZmlsZXMgPSBtaWdyYXRpb25zLm1hcCgobWlncmF0aW9uKSA9PiB0aGlzLm1pZ3JhdGlvbk5hbWUobWlncmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHsgdHlwZTogXCJ0YXJnZXQtc3RhcnRcIiwgYWN0aW9uLCBjb25uS2V5LCBmaWxlcyB9KTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVFYWNoOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IGVtaXRGaWxlKFwiZmlsZS1zdGFydFwiLCBtaWdyYXRpb24pKTtcbiAgICAgIH0sXG4gICAgICBhZnRlckVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLWV4ZWN1dGVkXCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5pbmNsdWRlcyhjb25uS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldCBpcyBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke1N0cmluZyhjb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuMgOyDgSDsu6TrhKXshZjsnZgg7KCV7KCBIOuplO2DgOuNsOydtO2EsOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIERC7JeQIOyXsOqysO2VmOyngCDslYrsnLzrr4DroZwgQ0xJ7JmAIFdlYuydtCDsg4Htg5wg7KGw7ZqMIOyghOyXkCDsponsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbnMoKTogTWlncmF0aW9uQ29ubmVjdGlvbk1ldGFbXSB7XG4gICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgIHJldHVybiB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5tYXAoKGNvbm5LZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25uZWN0aW9uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIG5hbWU6IFN0cmluZyhjb25uS2V5KSxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydDogY29ubmVjdGlvbi5wb3J0ID8/IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiBjb25uZWN0aW9uLmRhdGFiYXNlID8/IFwiXCIsXG4gICAgICAgIHJlbW90ZTogIUxPQ0FMX0RCX0hPU1RTLmhhcyhob3N0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsOiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKGNvbm5LZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshozsiqTsl5Ag7KG07J6s7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbwg66qp66Gd7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7Luk64Sl7IWYIO2VmOuCmOydmCDtmITsnqwg67KE7KCE6rO8IHBlbmRpbmcg66qp66Gd7J2EIOuPheumveyggeycvOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIOyXrOufrCDrjIDsg4HsnYAg7Zi47Lac7J6Q6rCAIOuzkeugrOuhnCDsobDrpr3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8TWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cz4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIC8vIFNBRkVUWTogS25leOqwgCDsoJzqs7XtlZwgUG9zdGdyZVNRTCDsl7DqsrAg6rWs7ISx7J2EIOuzteyCrO2VtCB0aW1lb3V0IO2VhOuTnOunjCDrja7slrTsk7Tri6QuXG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLnJhdyhcInNlbGVjdCAxXCIpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlLnN0YXR1cygpLmNhdGNoKChjYXVnaHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihjYXVnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKS50aGVuKFxuICAgICAgICAoWywgZmlsZXNdOiBbdW5rbm93bltdLCB7IGZpbGU6IHN0cmluZyB9W11dKSA9PlxuICAgICAgICAgIGZpbGVzLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgXCJub25lXCIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlXG4gICAgICAgIC5jdXJyZW50VmVyc2lvbigpXG4gICAgICAgIC5jYXRjaCgoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMgPSB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIGNvbm5lY3Rpb25TdGF0dXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgJHtTdHJpbmcoY29ubktleSl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuXFxuJHtlcnJvcn1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBcImVycm9yXCIsXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB3aXRoVGltZW91dCh0Q29ubi5kZXN0cm95KCksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDstZzsi6Ag7IOB7YOc7J24IOq4sOykgCBEQuyZgCDsl5Tti7Dti7Ag7KCV7J2Y66W8IOu5hOq1kO2VtCDsg53shLEg7JiI7KCVIOy9lOuTnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0UHJlcGFyZWRDb2Rlcyhjb21wYXJlQ29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29tcGFyZUNvbm5LZXkpO1xuICAgIGlmIChzdGF0dXMuc3RhdHVzICE9PSAwIHx8IHN0YXR1cy5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaWdyYXRpb24gY29tcGFyaXNvbiByZXF1aXJlcyBhbiB1cC10by1kYXRlIGRhdGFiYXNlOiAke1N0cmluZyhjb21wYXJlQ29ubktleSl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpIHtcbiAgICBjb25zdCBjb21wYXJlREIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW2NvbXBhcmVDb25uS2V5XSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNvbXBhcmVEQi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIOyLoOq3nCBVSeyXkOyEnOuKlCDsu6TrhKXshZjrs4Qg7KGw7ZqMIEFQSeulvCDsgqzsmqntlanri4jri6QuXG4gICAqIOq4sOyhtCBDTEnsmYAg7Iqk7YGs66a97Yq4IO2YuO2ZmOydhCDsnITtlbQg7KCE7LK0IOyDge2DnOulvCDsobDrpr3tlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8TWlncmF0aW9uU3RhdHVzPiB7XG4gICAgY29uc3QgW2NvZGVzLCBjb25uZWN0aW9uc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCksXG4gICAgICBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRDb25uZWN0aW9ucygpKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvZGVzXCIsIGNvZGVzKTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29ubmVjdGlvbnMubWFwKCh7IGNvbm5LZXkgfSkgPT4gdGhpcy5nZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXkpKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbm5zID0gY29ubmVjdGlvbnMubWFwKChjb25uZWN0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gY29ubmVjdGlvblN0YXR1c2VzW2luZGV4XTtcbiAgICAgIGFzc2VydChzdGF0dXMgIT09IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBjb25maWd1cmVkID1cbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdbXG4gICAgICAgICAgY29ubmVjdGlvbi5jb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGNvbm5lY3Rpb24ubmFtZSxcbiAgICAgICAgY29ubktleTogY29ubmVjdGlvbi5jb25uS2V5LFxuICAgICAgICBjb25uU3RyaW5nOlxuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gYHBnOi8vJHtjb25maWd1cmVkLnVzZXIgPz8gXCJcIn1AJHtjb25maWd1cmVkLmhvc3R9OiR7Y29uZmlndXJlZC5wb3J0fS8ke2NvbmZpZ3VyZWQuZGF0YWJhc2V9YCBhcyBDb25uU3RyaW5nLFxuICAgICAgICBjdXJyZW50VmVyc2lvbjogc3RhdHVzLmN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXM6IHN0YXR1cy5zdGF0dXMsXG4gICAgICAgIHBlbmRpbmc6IHN0YXR1cy5wZW5kaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvbm5zXCIsIGNvbm5zKTtcblxuICAgIGNvbnN0IGNvbXBhcmVDb25uID0gY29ubmVjdGlvblN0YXR1c2VzLmZpbmQoXG4gICAgICAoeyBzdGF0dXMsIGVycm9yIH0pID0+IHN0YXR1cyA9PT0gMCAmJiBlcnJvciA9PT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgY29uc3QgcHJlcGFyZWRDb2RlcyA9XG4gICAgICBjb21wYXJlQ29ubiA9PT0gdW5kZWZpbmVkID8gW10gOiBhd2FpdCB0aGlzLmNvbXBhcmVXaXRoQ29ubmVjdGlvbihjb21wYXJlQ29ubi5jb25uS2V5KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29ubnMsXG4gICAgICBjb2RlcyxcbiAgICAgIHByZXBhcmVkQ29kZXMsXG4gICAgICBlcnJvcjogY29ubmVjdGlvblN0YXR1c2VzLmZpbmQoKHsgZXJyb3IgfSkgPT4gZXJyb3IgIT09IHVuZGVmaW5lZCk/LmVycm9yLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog64yA7IOBIERC7JeQIHBlbmRpbmcg66eI7J206re466CI7J207IWY7J2EIOyggeyaqe2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCDqsJnsnYAg66mU7ISc65Oc66W8IOyCrOyaqe2VmOupsCwgV2Vi7J2AIGBvblByb2dyZXNzYOulvCBzdHJlYW3snLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGFwcGx5KHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLCBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwiYXBwbHlcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog64yA7IOBIERC7JeQ7IScIOqwgOyepSDstZzqt7wgbWlncmF0aW9uIGJhdGNo66W8IOuhpOuwse2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCDqsJnsnYAg66mU7ISc65Oc66W8IOyCrOyaqe2VmOupsCwgV2Vi7J2AIGBvblByb2dyZXNzYOulvCBzdHJlYW3snLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrKFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bkFjdGlvbldpdGhQcm9ncmVzcyhcInJvbGxiYWNrXCIsIHRhcmdldHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIGFjdGlvbiDrrLjsnpDsl7Qg64yA7IugIHtAbGluayBhcHBseX0g65iQ64qUIHtAbGluayByb2xsYmFja33snYQg7KeB7KCRIOyCrOyaqe2VqeuLiOuLpC5cbiAgICog6riw7KG0IOyZuOu2gCDtmLjstpzsnZgg7ZWY7JyEIO2YuO2ZmOunjOydhCDsnITtlbQg7Jyg7KeA7ZWp64uI64ukLlxuICAgKiBAY2F0ZWdvcnkg7Zi47ZmY7JqpIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJ1bkFjdGlvbihcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW10sXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIGFjdGlvbiA9PT0gXCJhcHBseVwiID8gdGhpcy5hcHBseSh0YXJnZXRzKSA6IHRoaXMucm9sbGJhY2sodGFyZ2V0cyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkFjdGlvbldpdGhQcm9ncmVzcyhcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOmFjdGlvblwiLCBhY3Rpb24pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246dGFyZ2V0c1wiLCB0YXJnZXRzKTtcblxuICAgIGNvbnN0IGFsbG93ZWRUYXJnZXRzID0gbmV3IFNldCh0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKSk7XG4gICAgY29uc3QgZGlzYWxsb3dlZFRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhYWxsb3dlZFRhcmdldHMuaGFzKHRhcmdldCkpO1xuICAgIGlmIChkaXNhbGxvd2VkVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaWdyYXRpb24gdGFyZ2V0cyBhcmUgbm90IGFsbG93ZWQgaW4gTk9ERV9FTlY9JHtnZXRTb25hbXVFbnZpcm9ubWVudCgpfTogJHtkaXNhbGxvd2VkVGFyZ2V0cy5qb2luKFwiLCBcIil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHVuaXEga25leCBjb25maWdzXG4gICAgY29uc3QgY29uZmlncyA9IHVuaXF1ZShcbiAgICAgIHRhcmdldHNcbiAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiAoe1xuICAgICAgICAgIGNvbm5LZXk6IHRhcmdldCxcbiAgICAgICAgICBvcHRpb25zOiBTb25hbXUuZGJDb25maWdbdGFyZ2V0XSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICh7IG9wdGlvbnM6IGRiT3B0aW9ucyB9KSA9PlxuICAgICAgICBgJHsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChkYk9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuaG9zdH06JHtcbiAgICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAgIGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnXG4gICAgICAgICAgKS5wb3J0ID8/IDU0MzJcbiAgICAgICAgfS8key8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZX1gLFxuICAgICk7XG5cbiAgICAvLyBnZXQgY29ubmVjdGlvbnNcbiAgICBjb25zdCBjb25ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29uZmlncy5tYXAoYXN5bmMgKGNvbmZpZykgPT4gKHtcbiAgICAgICAgY29ubktleTogY29uZmlnLmNvbm5LZXksXG4gICAgICAgIGtuZXg6IGNyZWF0ZUtuZXhJbnN0YW5jZShjb25maWcub3B0aW9ucyksXG4gICAgICB9KSksXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bk1pZ3JhdGlvbnNTZXF1ZW50aWFsbHkoY29ubnMsIGFjdGlvbiwgb3B0aW9ucyk7XG5cbiAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246cmVzdWx0XCIsIHJlc3VsdCk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtuZXguZGVzdHJveSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5EYXRlVGFnKGluZGV4OiBudW1iZXIsIGJhc2VEYXRlOiBEYXRlID0gbmV3IERhdGUoKSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGJhc2VEYXRlLmdldFRpbWUoKSArIGluZGV4ICogMTAwMCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0TW9udGgoKSArIDEpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0RGF0ZSgpKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldEhvdXJzKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0TWludXRlcygpKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldFNlY29uZHMoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uS2V5ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoYXdhaXQgdGhpcy5nZXRTdGF0dXMoKSkucHJlcGFyZWRDb2Rlc1xuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0UHJlcGFyZWRDb2Rlcyhjb21wYXJlQ29ubktleSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlUHJlcGFyZWRDb2RlczpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuICAgIGlmIChwcmVwYXJlZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJcXG7tmITsnqwg66qo65GQIOyLse2BrOuQnCDsg4Htg5zsnoXri4jri6QuXCIpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIOyLpOygnCDsvZTrk5wg7IOd7ISxXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnNgO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHBjb2RlXSBvZiBwcmVwYXJlZENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHBjb2RlLmZvcm1hdHRlZCkge1xuICAgICAgICBjb25zdCBkYXRlVGFnID0gdGhpcy5nZW5EYXRlVGFnKGluZGV4KTtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHttaWdyYXRpb25zRGlyfS8ke2RhdGVUYWd9XyR7cGNvZGUudGl0bGV9LnRzYDtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBwY29kZS5mb3JtYXR0ZWQpO1xuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYE1JR1JBVElPTiBDUkVBVEVEICR7ZmlsZVBhdGh9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcmVwYXJlZENvZGVzLmxlbmd0aDtcbiAgfVxuXG4gIGFzeW5jIGNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQjogS25leCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gICAgLy8gRW50aXR5IOyInO2ajO2VmOyXrCDsi7HtgaxcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBFbnRpdHnsl5DshJwgTWlncmF0aW9uU2V0IOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eVNldHNXaXRoSm9pblRhYmxlID0gZW50aXR5SWRzXG4gICAgICAuZmlsdGVyKChlbnRpdHlJZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKChlbnRpdHlJZCkgPT4gZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eShFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkpKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lOunjCDstpTstpxcbiAgICBjb25zdCBqb2luVGFibGVzV2l0aER1cCA9IGVudGl0eVNldHNXaXRoSm9pblRhYmxlLmZsYXRNYXAoKGVudGl0eVNldCkgPT4gZW50aXR5U2V0LmpvaW5UYWJsZXMpO1xuICAgIC8vIOykkeuztSDsoJzqsbAgKOykkeuzteyduCDqsr3smrAgaW5kZXhlc+ulvCDrs5HtlakpXG4gICAgY29uc3Qgam9pblRhYmxlcyA9IE9iamVjdC52YWx1ZXMoZ3JvdXAoam9pblRhYmxlc1dpdGhEdXAsIChqdCkgPT4ganQudGFibGUpKS5tYXAoKHRhYmxlcykgPT4ge1xuICAgICAgYXNzZXJ0KHRhYmxlcyAhPT0gdW5kZWZpbmVkLCBcInRhYmxlcyBpcyB1bmRlZmluZWRcIik7XG4gICAgICBpZiAodGFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGFibGVzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFibGVzWzBdLFxuICAgICAgICBpbmRleGVzOiB1bmlxdWUoXG4gICAgICAgICAgdGFibGVzLmZsYXRNYXAoKHQpID0+IHQuaW5kZXhlcyksXG4gICAgICAgICAgKGluZGV4KSA9PiBbaW5kZXgudHlwZSwgLi4uaW5kZXguY29sdW1uc10uam9pbihcIi1cIiksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBNaWdyYXRpb25TZXQg67Cw7Je0XG4gICAgY29uc3QgZW50aXR5U2V0czogTWlncmF0aW9uU2V0W10gPSBbLi4uZW50aXR5U2V0c1dpdGhKb2luVGFibGUsIC4uLmpvaW5UYWJsZXNdO1xuXG4gICAgY29uc3QgY29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IFtdO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0eVNldHMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2hDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRpdHlTZXRzLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLm1hcChhc3luYyAoZW50aXR5U2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGJTZXQgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldE1pZ3JhdGlvblNldEZyb21EQihcbiAgICAgICAgICAgIGNvbXBhcmVEQixcbiAgICAgICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmVudGl0eVNldDoke2VudGl0eVNldC50YWJsZX1gLCBlbnRpdHlTZXQpO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmRiU2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGRiU2V0KTtcblxuICAgICAgICAgIGlmIChkYlNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsl4bsnYwsIOyDiOuhnCDthYzsnbTruJQg7IOd7ISxXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7KG07J6s7ZWY64qUIOy8gOydtOyKpFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlKGVudGl0eVNldCwgZGJTZXQsIGNvbXBhcmVEQik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNvZGVzLnB1c2goLi4uYmF0Y2hDb2Rlcy5mbGF0KCkpO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbCDtg4DsnoXsnbQg7JWe7Jy866GcLCBmb3JlaWdu7J20IOuSpOuhnFxuICAgIGNvZGVzLnNvcnQoKGNvZGVBLCBjb2RlQikgPT4ge1xuICAgICAgaWYgKGNvZGVBLnR5cGUgPT09IFwiZm9yZWlnblwiICYmIGNvZGVCLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVBLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgY29kZUIudHlwZSA9PT0gXCJmb3JlaWduXCIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogdGVzdCBEQuydmCBzbmFwc2hvdOycvOuhnCDsnoTsi5wgU2hhZG93IERC66W8IOunjOuTpOqzoCDsoITssrQg66eI7J206re466CI7J207IWY7J2EIOqygOymne2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCBgb25Qcm9ncmVzc2Ag7Jyg66y066eMIOuLrOumrO2VtCDqsJnsnYAg7Iuk7ZaJIOydmOuvuOulvCDqs7XsnKDtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBydW5TaGFkb3dUZXN0KG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBiYXNlVGVzdENvbm4gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdcbiAgICAgICAgLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB3b3JrZXJJZCA9IHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtiYXNlVGVzdENvbm4uZGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGJhc2VUZXN0Q29ubi5kYXRhYmFzZTtcbiAgICBjb25zdCB0ZGJDb25uID0geyAuLi5iYXNlVGVzdENvbm4sIGRhdGFiYXNlOiB0ZW1wbGF0ZURhdGFiYXNlIH07XG4gICAgY29uc3Qgc2hhZG93RGF0YWJhc2UgPSBgJHt0ZW1wbGF0ZURhdGFiYXNlfV9fbWlncmF0aW9uX3NoYWRvd2A7XG5cbiAgICAvLyDthYzsiqTtirgg7IOB7Zmp7JeQ7ISc64qUIO2KuOuenOyereyFmOydhCDstIjquLDtmZTtlZjqs6AsIOyDiCDrjbDsnbTthLDrsqDsnbTsiqQg7Luk64Sl7IWY7J2EIOqwgOyguOyZgOyVvCDtlahcbiAgICBpZiAoaXNUZXN0KCkpIHtcbiAgICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG4gICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4uU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmJhc2VUZXN0Q29ubixcbiAgICAgICAgZGF0YWJhc2U6IFwicG9zdGdyZXNcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgICBhd2FpdCB0ZGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAke3NoYWRvd0RhdGFiYXNlfWApO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgXG4gICAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwZ19zdGF0X2FjdGl2aXR5LnBpZClcbiAgICAgICAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5XG4gICAgICAgIFdIRVJFIGRhdG5hbWUgPSAnJHt0ZGJDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBgKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYENSRUFURSBEQVRBQkFTRSAke3NoYWRvd0RhdGFiYXNlfSBURU1QTEFURSAke3RkYkNvbm4uZGF0YWJhc2V9YCk7XG5cbiAgICAgIC8vIFNoYWRvdyBEQuyXkCDsl7DqsrBcbiAgICAgIGNvbnN0IHNkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgIC4uLlNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4udGRiQ29ubixcbiAgICAgICAgICBkYXRhYmFzZTogc2hhZG93RGF0YWJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IHRkYkNvbm4ucGFzc3dvcmQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKFwic2hhZG93XCIsIFwic2hhZG93XCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgICAgYWN0aW9uOiBcInNoYWRvd1wiLFxuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwic2hhZG93XCIsXG4gICAgICAgICAgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTaGFkb3cgREIg7KCV66asIOyLpO2MqDpcIiwgZSk7IC8vIOydtOqyjCDsl4bsnLzrqbQg7KGw7Jqp7Z6IIOuIhOyImFxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdGRiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJDQSxTQUFTLFlBQVksUUFBZ0IsT0FBZSxHQUFXO0NBQzdELE9BQU8sT0FBTyxTQUFTLENBQUMsQ0FBQyxTQUFTLE1BQU0sR0FBRztBQUM3Qzs7Ozs7QUFzQkEsU0FBUyxZQUFlLFNBQXFCLElBQVksV0FBb0M7Q0FDM0YsT0FBTyxJQUFJLFNBQVksU0FBUyxXQUFXO0VBQ3pDLE1BQU0sUUFBUSxpQkFBaUIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFO0VBQ3RELFFBQVEsTUFDTCxVQUFVO0dBQ1QsYUFBYSxLQUFLO0dBQ2xCLFFBQVEsS0FBSztFQUNmLElBQ0MsVUFBVTtHQUNULGFBQWEsS0FBSztHQUNsQixPQUFPLEtBQUs7RUFDZCxDQUNGO0NBQ0YsQ0FBQztBQUNIOzs7YUF6RXNDO1NBQ0g7V0FFa0I7U0FDdEI7cUJBQ3lCO1VB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAExC,cAAM,2BAA2B;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyD;IAE3F;;;;;OAKG;IACG,qBAAqB,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}
|