sonamu 0.12.0 → 0.13.0
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/_virtual/_rolldown/runtime.js +1 -2
- package/dist/ai/agents/agent.js +2 -3
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +1 -2
- package/dist/ai/providers/rtzr/error.js +2 -3
- package/dist/ai/providers/rtzr/model.js +1 -2
- package/dist/ai/providers/rtzr/options.js +1 -2
- package/dist/ai/providers/rtzr/provider.js +1 -2
- package/dist/ai/providers/rtzr/utils.js +1 -2
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +9 -9
- package/dist/api/code-converters.js +6 -5
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -3
- package/dist/api/context.d.ts +2 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +2 -3
- package/dist/api/http-validator.js +2 -3
- package/dist/api/index.js +8 -3
- package/dist/api/secret.js +1 -2
- package/dist/api/sonamu.d.ts +3 -5
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +19 -18
- package/dist/api/validator.js +1 -2
- package/dist/api/websocket-helpers.js +2 -3
- package/dist/auth/audit-log/builders.js +1 -2
- package/dist/auth/audit-log/client-ip.js +2 -3
- package/dist/auth/audit-log/events.js +1 -2
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +2 -3
- package/dist/auth/audit-log-ingestor.js +2 -3
- package/dist/auth/auth-generator.js +2 -3
- package/dist/auth/better-auth-entities.js +1 -2
- package/dist/auth/better-auth-request.js +2 -3
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +2 -3
- package/dist/auth/plugins/entity-definitions/admin.js +1 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
- package/dist/auth/plugins/entity-definitions/index.js +1 -2
- package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
- package/dist/auth/plugins/entity-definitions/organization.js +1 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
- package/dist/auth/plugins/entity-definitions/sso.js +1 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
- package/dist/auth/plugins/entity-definitions/username.js +1 -2
- package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +1 -2
- package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.d.ts +39 -5
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +5 -5
- package/dist/bin/compiler-policy.js +2 -3
- package/dist/bin/fixture.js +7 -5
- package/dist/bin/hmr-hook-register.js +1 -2
- package/dist/bin/migrate-targets.js +2 -3
- package/dist/bin/test-command.js +2 -3
- package/dist/bin/ts-loader-register.js +2 -3
- package/dist/bin/ts-loader-registration.js +2 -3
- package/dist/bin/typecheck-web.js +2 -3
- package/dist/cache/cache-manager.js +1 -2
- package/dist/cache/decorator.js +2 -3
- package/dist/cache/drivers.js +1 -2
- package/dist/cache/index.js +2 -3
- package/dist/cache-control/cache-control.js +1 -2
- package/dist/code-formatting/index.js +2 -3
- package/dist/code-formatting/oxfmt.js +2 -3
- package/dist/code-formatting/oxlint.js +2 -3
- package/dist/compress/compress.js +1 -2
- package/dist/compress/index.js +2 -2
- package/dist/compress/types.d.ts +1 -1
- package/dist/compress/types.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +2 -3
- package/dist/database/_batch_update.js +1 -2
- package/dist/database/base-model.js +4 -4
- package/dist/database/db.js +4 -4
- package/dist/database/knex.js +2 -3
- package/dist/database/puri-wrapper.js +2 -3
- package/dist/database/puri.js +23 -22
- package/dist/database/puri.types.js +1 -2
- package/dist/database/transaction-context.js +1 -2
- package/dist/database/upsert-builder.js +2 -3
- package/dist/dict/en.js +2 -3
- package/dist/dict/index.js +3 -3
- package/dist/dict/ko.js +2 -3
- package/dist/dict/rc-keys.js +1 -2
- package/dist/dict/sd.js +2 -3
- package/dist/dict/sonamu-dictionary.js +7 -6
- package/dist/dict/utils.js +2 -3
- package/dist/entity/entity-manager.d.ts +66 -66
- package/dist/entity/entity-manager.js +4 -4
- package/dist/entity/entity-template-cone.js +2 -3
- package/dist/entity/entity.js +21 -18
- package/dist/env.js +1 -2
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +2 -3
- package/dist/filter/index.js +3 -2
- package/dist/filter/types.js +1 -2
- package/dist/filter/utils.js +7 -6
- package/dist/index.js +39 -5
- package/dist/logger/category.js +2 -3
- package/dist/logger/configure.js +5 -5
- package/dist/migration/code-generation.js +23 -16
- package/dist/migration/index-where-predicate.js +2 -3
- package/dist/migration/migration-set.js +2 -3
- package/dist/migration/migrator.js +2 -3
- package/dist/migration/postgresql-schema-reader.js +6 -9
- package/dist/migration/slack-confirm.js +2 -3
- package/dist/naite/naite-reporter.js +2 -3
- package/dist/naite/naite.js +10 -8
- package/dist/runtime-type.js +2 -3
- package/dist/ssr/hmr-opt-out.js +1 -2
- package/dist/ssr/index.js +7 -4
- package/dist/ssr/registry.js +1 -2
- package/dist/ssr/renderer.js +2 -3
- package/dist/storage/base-file.js +1 -2
- package/dist/storage/buffered-file.js +2 -3
- package/dist/storage/drivers.js +1 -2
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +1 -2
- package/dist/storage/storage-manager.js +2 -3
- package/dist/storage/uploaded-file.js +2 -3
- package/dist/stream/__tests__/ws-test-helpers.js +2 -3
- package/dist/stream/index.js +11 -2
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.js +2 -3
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.js +1 -2
- package/dist/stream/ws-delivery.js +2 -3
- package/dist/stream/ws-frame.js +1 -2
- package/dist/stream/ws-local-connection-store.js +2 -3
- package/dist/stream/ws-presence-index.js +1 -2
- package/dist/stream/ws-presence-store.js +2 -3
- package/dist/stream/ws-registry.js +2 -3
- package/dist/stream/ws-session-id.js +1 -2
- package/dist/stream/ws-telemetry-memory.js +3 -4
- package/dist/stream/ws-telemetry-trace.js +1 -2
- package/dist/stream/ws-telemetry.js +2 -3
- package/dist/stream/ws.js +2 -3
- package/dist/syncer/api-parser.js +2 -3
- package/dist/syncer/checksum.js +4 -4
- package/dist/syncer/code-generator.js +4 -4
- package/dist/syncer/entity-operations.js +2 -3
- package/dist/syncer/event-batcher.js +1 -2
- package/dist/syncer/file-copy.js +2 -3
- package/dist/syncer/file-patterns.js +2 -3
- package/dist/syncer/file-tracking.js +2 -3
- package/dist/syncer/filesystem-dependencies.js +1 -2
- package/dist/syncer/index.js +8 -2
- package/dist/syncer/module-loader.js +8 -6
- package/dist/syncer/syncer-actions.js +8 -7
- package/dist/syncer/syncer.js +13 -8
- package/dist/syncer/watcher.js +2 -3
- package/dist/tasks/decorator.js +1 -2
- package/dist/tasks/step-wrapper.js +2 -3
- package/dist/tasks/workflow-manager.js +2 -3
- package/dist/template/entity-converter.js +17 -16
- package/dist/template/helpers.js +2 -3
- package/dist/template/implementations/entity.template.js +2 -3
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +2 -3
- package/dist/template/implementations/generated_http.template.js +6 -6
- package/dist/template/implementations/generated_sso.template.js +2 -3
- package/dist/template/implementations/http_validators.template.js +2 -3
- package/dist/template/implementations/init_types.template.js +2 -3
- package/dist/template/implementations/model.template.js +4 -4
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +2 -3
- package/dist/template/implementations/sd.template.js +2 -3
- package/dist/template/implementations/services.template.js +2 -3
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +19 -17
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +9 -3
- package/dist/template/template-manager.js +2 -3
- package/dist/template/template-types.js +1 -2
- package/dist/template/template.js +2 -3
- package/dist/template/zod-converter.js +54 -47
- package/dist/testing/_relation-graph.js +2 -3
- package/dist/testing/bootstrap.js +2 -3
- package/dist/testing/data-explorer.js +2 -3
- package/dist/testing/dev-test-routes.js +2 -3
- package/dist/testing/dev-vitest-manager.js +15 -12
- package/dist/testing/faker-mappings.js +1 -2
- package/dist/testing/filesystem.js +2 -3
- package/dist/testing/fixture-generator.js +2 -3
- package/dist/testing/fixture-loader.js +1 -2
- package/dist/testing/fixture-manager.js +12 -9
- package/dist/testing/global-setup.js +5 -5
- package/dist/testing/index.js +6 -3
- package/dist/testing/naite-vitest-reporter.js +1 -2
- package/dist/testing/parallel-db-manager.js +2 -3
- package/dist/testing/vitest-helpers.js +2 -3
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
- package/dist/tooling/cdd-service.js +1 -2
- package/dist/tooling/cli-tooling.js +1 -2
- package/dist/tooling/fixture-service.js +1 -2
- package/dist/tooling/index.js +1 -2
- package/dist/tooling/test-run-client.js +2 -3
- package/dist/tsdown.api.config.js +1 -2
- package/dist/types/types.js +2 -3
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +4 -5
- package/dist/ui/ai-client.d.ts +2 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -8
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -8
- package/dist/ui/async-route.js +1 -2
- package/dist/ui/cdd-service.js +22 -21
- package/dist/ui/migrations-api.js +6 -5
- package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
- package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +1 -2
- package/dist/utils/class-name.js +1 -2
- package/dist/utils/console-util.js +1 -2
- package/dist/utils/controller.js +2 -3
- package/dist/utils/esm-utils.js +1 -2
- package/dist/utils/fs-utils.js +2 -3
- package/dist/utils/lodash-able.js +1 -2
- package/dist/utils/model.js +1 -2
- package/dist/utils/object-utils.js +2 -3
- package/dist/utils/path-utils.js +2 -3
- package/dist/utils/process-utils.js +2 -3
- package/dist/utils/runtime-value.js +1 -2
- package/dist/utils/sql-parser.js +2 -3
- package/dist/utils/type-utils.js +8 -8
- package/dist/utils/utils.js +2 -3
- package/dist/utils/zod-error.js +2 -3
- package/dist/vector/chunking.js +1 -2
- package/dist/vector/config.js +1 -2
- package/dist/vector/embedding.js +4 -4
- package/package.json +63 -63
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +26 -21
- package/src/auth/audit-log/plugin.ts +2 -0
- package/src/compress/types.ts +1 -1
- package/src/exceptions/error-handler.ts +3 -2
- package/src/template/implementations/model.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +12 -13
- package/src/ui/ai-api.ts +4 -2
- package/src/ui/ai-client.ts +2 -2
- package/src/ui/api.ts +58 -62
- package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
- package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
|
@@ -3,7 +3,7 @@ import { cached, init_async_utils } from "../utils/async-utils.js";
|
|
|
3
3
|
import { init_oxfmt, runOxfmt } from "./oxfmt.js";
|
|
4
4
|
import { init_oxlint, runOxlint } from "./oxlint.js";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
|
-
|
|
6
|
+
// src/code-formatting/index.ts
|
|
7
7
|
/**
|
|
8
8
|
* 캐시 없는 포맷함수 엔트리.
|
|
9
9
|
*/
|
|
@@ -20,8 +20,7 @@ var init_code_formatting = __esmMin((() => {
|
|
|
20
20
|
return `${filePath.endsWith(".tsx") ? "tsx" : filePath.endsWith(".json") ? "json" : "ts"}:${createHash("sha1").update(code).digest("hex")}`;
|
|
21
21
|
});
|
|
22
22
|
}));
|
|
23
|
-
//#endregion
|
|
24
23
|
init_code_formatting();
|
|
25
24
|
export { formatCode, init_code_formatting };
|
|
26
25
|
|
|
27
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvZGUtZm9ybWF0dGluZy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGNhY2hlZCB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgcnVuT3hmbXQgfSBmcm9tIFwiLi9veGZtdFwiO1xuaW1wb3J0IHsgcnVuT3hsaW50IH0gZnJvbSBcIi4vb3hsaW50XCI7XG5cbi8qKlxuICog7L2U65Oc66W8IO2UhOuhnOygne2KuOydmCBveGZtdCArIG94bGludCDshKTsoJXsl5Ag66ee7LawIO2PrOunpO2Mhe2VnCDrrLjsnpDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIOy6kOyLseuPhCDsnojslrTsmpQg44WO44WOIOuYkeqwmeydgCDsnoXroKXsl5Ag64yA7ZW07IScIOy6kOyLnCDsu6TrsoTrkKnri4jri6QuXG4gKiDsiJjrqoXsnYAg7ZSE66Gc7IS47IqkIOyjveydhOuVjOq5jOyngCDjhYtcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdENvZGUgPSBjYWNoZWQoZm9ybWF0Q29kZUludGVybmFsLCAoY29kZSwgZmlsZVBhdGgpID0+IHtcbiAgY29uc3QgZXh0ID0gZmlsZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpID8gXCJ0c3hcIiA6IGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikgPyBcImpzb25cIiA6IFwidHNcIjtcbiAgcmV0dXJuIGAke2V4dH06JHtjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUoY29kZSkuZGlnZXN0KFwiaGV4XCIpfWA7XG59KTtcblxuLyoqXG4gKiDsupDsi5wg7JeG64qUIO2PrOunt+2VqOyImCDsl5TtirjrpqwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvZGVJbnRlcm5hbChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBqc29u7J2AIO2PrOunt+unjCDtlZjrqbQg65Cp64uI64ukLlxuICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgIHJldHVybiBydW5PeGZtdChjb2RlLCBmaWxlUGF0aCk7XG4gIH1cblxuICAvLyDrprDtirgg66i87KCAIO2VnCDri6TsnYzsl5Ag7Y+
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvZGUtZm9ybWF0dGluZy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGNhY2hlZCB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgcnVuT3hmbXQgfSBmcm9tIFwiLi9veGZtdFwiO1xuaW1wb3J0IHsgcnVuT3hsaW50IH0gZnJvbSBcIi4vb3hsaW50XCI7XG5cbi8qKlxuICog7L2U65Oc66W8IO2UhOuhnOygne2KuOydmCBveGZtdCArIG94bGludCDshKTsoJXsl5Ag66ee7LawIO2PrOunpO2Mhe2VnCDrrLjsnpDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIOy6kOyLseuPhCDsnojslrTsmpQg44WO44WOIOuYkeqwmeydgCDsnoXroKXsl5Ag64yA7ZW07IScIOy6kOyLnCDsu6TrsoTrkKnri4jri6QuXG4gKiDsiJjrqoXsnYAg7ZSE66Gc7IS47IqkIOyjveydhOuVjOq5jOyngCDjhYtcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdENvZGUgPSBjYWNoZWQoZm9ybWF0Q29kZUludGVybmFsLCAoY29kZSwgZmlsZVBhdGgpID0+IHtcbiAgY29uc3QgZXh0ID0gZmlsZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpID8gXCJ0c3hcIiA6IGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikgPyBcImpzb25cIiA6IFwidHNcIjtcbiAgcmV0dXJuIGAke2V4dH06JHtjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUoY29kZSkuZGlnZXN0KFwiaGV4XCIpfWA7XG59KTtcblxuLyoqXG4gKiDsupDsi5wg7JeG64qUIO2PrOunt+2VqOyImCDsl5TtirjrpqwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvZGVJbnRlcm5hbChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBqc29u7J2AIO2PrOunt+unjCDtlZjrqbQg65Cp64uI64ukLlxuICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgIHJldHVybiBydW5PeGZtdChjb2RlLCBmaWxlUGF0aCk7XG4gIH1cblxuICAvLyDrprDtirgg66i87KCAIO2VnCDri6TsnYzsl5Ag7Y+s66e37Jy866GcIOuniOustOumrO2VtOyalC5cbiAgcmV0dXJuIHJ1bk94Zm10KGF3YWl0IHJ1bk94bGludChjb2RlKSwgZmlsZVBhdGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFvQkEsZUFBZSxtQkFBbUIsTUFBYyxVQUFtQztDQUVqRixJQUFJLFNBQVMsU0FBUyxPQUFPLEdBQzNCLE9BQU8sU0FBUyxNQUFNLFFBQVE7Q0FJaEMsT0FBTyxTQUFTLE1BQU0sVUFBVSxJQUFJLEdBQUcsUUFBUTtBQUNqRDs7O0NBMUI2QyxpQkFBQTtDQUNYLFdBQUE7Q0FDRSxZQUFBO0NBUXZCLGFBQWEsT0FBTyxxQkFBcUIsTUFBTSxhQUFhO0VBRXZFLE9BQU8sR0FESyxTQUFTLFNBQVMsTUFBTSxJQUFJLFFBQVEsU0FBUyxTQUFTLE9BQU8sSUFBSSxTQUFTLEtBQ3hFLEdBQUcsV0FBVyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSztDQUMvRCxDQUFDIn0=
|
|
@@ -3,7 +3,7 @@ import { init_controller, isTest } from "../utils/controller.js";
|
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import path, { dirname, join } from "node:path";
|
|
5
5
|
import { format } from "oxfmt";
|
|
6
|
-
|
|
6
|
+
// src/code-formatting/oxfmt.ts
|
|
7
7
|
/**
|
|
8
8
|
* 프로젝트 설정을 찾아서 이에 맞춰서 코드를 포맷합니다.
|
|
9
9
|
*/
|
|
@@ -54,8 +54,7 @@ var init_oxfmt = __esmMin((() => {
|
|
|
54
54
|
init_controller();
|
|
55
55
|
cachedOxfmtConfig = null;
|
|
56
56
|
}));
|
|
57
|
-
//#endregion
|
|
58
57
|
init_oxfmt();
|
|
59
58
|
export { init_oxfmt, runOxfmt };
|
|
60
59
|
|
|
61
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3hmbXQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvZGUtZm9ybWF0dGluZy9veGZtdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBmb3JtYXQsIHR5cGUgRm9ybWF0Q29uZmlnIH0gZnJvbSBcIm94Zm10XCI7XG5cbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5cbi8qKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleydhCDssL7slYTshJwg7J207JeQIOunnuy2sOyEnCDsvZTrk5zrpbwg7Y+s66e37ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuT3hmbXQoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm9ybWF0KHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLCBjb2RlLCBhd2FpdCBsb2FkT3hmbXRDb25maWcoKSk7XG5cbiAgY29uc3QgZXJyb3JzID0gcmVzdWx0LmVycm9ycy5maWx0ZXIoKGUpID0+IGUuc2V2ZXJpdHkgPT09IFwiRXJyb3JcIik7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG94Zm10IGVycm9ycyAoJHtmaWxlUGF0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gZXJyLmxhYmVsc1swXTtcbiAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgY29uc3QgYmVmb3JlID0gY29kZS5zbGljZShNYXRoLm1heCgwLCBsYWJlbC5zdGFydCAtIDgwKSwgbGFiZWwuc3RhcnQpO1xuICAgICAgICAgIGNvbnN0IGF0ID0gY29kZS5zbGljZShsYWJlbC5zdGFydCwgbGFiZWwuZW5kKTtcbiAgICAgICAgICBjb25zdCBhZnRlciA9IGNvZGUuc2xpY2UobGFiZWwuZW5kLCBNYXRoLm1pbihjb2RlLmxlbmd0aCwgbGFiZWwuZW5kICsgODApKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnIubWVzc2FnZX0gKG9mZnNldCAke2xhYmVsLnN0YXJ0fS0ke2xhYmVsLmVuZH0pYCk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAgIGFyb3VuZDogLi4uJHtiZWZvcmV9wrske2F0fcKrJHthZnRlcn0uLi5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmNvZGU7XG59XG5cbmxldCBjYWNoZWRPeGZtdENvbmZpZzogRm9ybWF0Q29uZmlnIHwgbnVsbCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBsb2FkT3hmbXRDb25maWcoKTogUHJvbWlzZTxGb3JtYXRDb25maWc+
|
|
60
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3hmbXQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvZGUtZm9ybWF0dGluZy9veGZtdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCwgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBmb3JtYXQsIHR5cGUgRm9ybWF0Q29uZmlnIH0gZnJvbSBcIm94Zm10XCI7XG5cbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5cbi8qKlxuICog7ZSE66Gc7KCd7Yq4IOyEpOygleydhCDssL7slYTshJwg7J207JeQIOunnuy2sOyEnCDsvZTrk5zrpbwg7Y+s66e37ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuT3hmbXQoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm9ybWF0KHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLCBjb2RlLCBhd2FpdCBsb2FkT3hmbXRDb25maWcoKSk7XG5cbiAgY29uc3QgZXJyb3JzID0gcmVzdWx0LmVycm9ycy5maWx0ZXIoKGUpID0+IGUuc2V2ZXJpdHkgPT09IFwiRXJyb3JcIik7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG94Zm10IGVycm9ycyAoJHtmaWxlUGF0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gZXJyLmxhYmVsc1swXTtcbiAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgY29uc3QgYmVmb3JlID0gY29kZS5zbGljZShNYXRoLm1heCgwLCBsYWJlbC5zdGFydCAtIDgwKSwgbGFiZWwuc3RhcnQpO1xuICAgICAgICAgIGNvbnN0IGF0ID0gY29kZS5zbGljZShsYWJlbC5zdGFydCwgbGFiZWwuZW5kKTtcbiAgICAgICAgICBjb25zdCBhZnRlciA9IGNvZGUuc2xpY2UobGFiZWwuZW5kLCBNYXRoLm1pbihjb2RlLmxlbmd0aCwgbGFiZWwuZW5kICsgODApKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnIubWVzc2FnZX0gKG9mZnNldCAke2xhYmVsLnN0YXJ0fS0ke2xhYmVsLmVuZH0pYCk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgICAgIGFyb3VuZDogLi4uJHtiZWZvcmV9wrske2F0fcKrJHthZnRlcn0uLi5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmNvZGU7XG59XG5cbmxldCBjYWNoZWRPeGZtdENvbmZpZzogRm9ybWF0Q29uZmlnIHwgbnVsbCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBsb2FkT3hmbXRDb25maWcoKTogUHJvbWlzZTxGb3JtYXRDb25maWc+IHtcbiAgaWYgKGNhY2hlZE94Zm10Q29uZmlnICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNhY2hlZE94Zm10Q29uZmlnO1xuICB9XG5cbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gam9pbihkaXIsIFwiLm94Zm10cmMuanNvblwiKTtcbiAgICB0cnkge1xuICAgICAgLy8gU0FGRVRZOiDshKDtlokg67aE6riw7JmAIO2VqOyImCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBjYWNoZWRPeGZtdENvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoY2FuZGlkYXRlLCBcInV0Zi04XCIpKSBhcyBGb3JtYXRDb25maWc7XG4gICAgICByZXR1cm4gY2FjaGVkT3hmbXRDb25maWc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gU0FGRVRZOiDshKDtlokg67aE6riw7JmAIO2VqOyImCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpZiAoKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke2NhbmRpZGF0ZX06YCwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSBicmVhaztcbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cblxuICBjYWNoZWRPeGZtdENvbmZpZyA9IHt9O1xuICByZXR1cm4gY2FjaGVkT3hmbXRDb25maWc7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVVBLGVBQXNCLFNBQVMsTUFBYyxVQUFtQztDQUM5RSxNQUFNLFNBQVMsTUFBTSxPQUFPLEtBQUssU0FBUyxRQUFRLEdBQUcsTUFBTSxNQUFNLGdCQUFnQixDQUFDO0NBRWxGLE1BQU0sU0FBUyxPQUFPLE9BQU8sUUFBUSxNQUFNLEVBQUUsYUFBYSxPQUFPO0NBQ2pFLElBQUksT0FBTyxTQUFTLEdBQUc7RUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRztHQUNiLFFBQVEsTUFBTSxpQkFBaUIsU0FBUyxHQUFHO0dBQzNDLEtBQUssTUFBTSxPQUFPLFFBQVE7SUFDeEIsTUFBTSxRQUFRLElBQUksT0FBTztJQUN6QixJQUFJLE9BQU87S0FDVCxNQUFNLFNBQVMsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLO0tBQ3BFLE1BQU0sS0FBSyxLQUFLLE1BQU0sTUFBTSxPQUFPLE1BQU0sR0FBRztLQUM1QyxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sS0FBSyxLQUFLLElBQUksS0FBSyxRQUFRLE1BQU0sTUFBTSxFQUFFLENBQUM7S0FDekUsUUFBUSxNQUFNLE9BQU8sSUFBSSxRQUFRLFdBQVcsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUU7S0FDdkUsUUFBUSxNQUFNLGtCQUFrQixPQUFPLEdBQUcsR0FBRyxHQUFHLE1BQU0sSUFBSTtJQUM1RCxPQUNFLFFBQVEsTUFBTSxPQUFPLElBQUksU0FBUztHQUV0QztFQUNGO0VBQ0EsT0FBTztDQUNUO0NBQ0EsT0FBTyxPQUFPO0FBQ2hCO0FBR0EsZUFBZSxrQkFBeUM7Q0FDdEQsSUFBSSxzQkFBc0IsTUFDeEIsT0FBTztDQUdULElBQUksTUFBTSxRQUFRLElBQUk7Q0FDdEIsT0FBTyxNQUFNO0VBQ1gsTUFBTSxZQUFZLEtBQUssS0FBSyxlQUFlO0VBQzNDLElBQUk7R0FFRixvQkFBb0IsS0FBSyxNQUFNLE1BQU0sU0FBUyxXQUFXLE9BQU8sQ0FBQztHQUNqRSxPQUFPO0VBQ1QsU0FBUyxHQUFHO0dBRVYsSUFBSyxFQUE0QixTQUFTLFVBQVU7SUFDbEQsQ0FBQyxPQUFPLEtBQUssUUFBUSxNQUFNLGtCQUFrQixVQUFVLElBQUksQ0FBQztJQUM1RDtHQUNGO0VBQ0Y7RUFDQSxNQUFNLFNBQVMsUUFBUSxHQUFHO0VBQzFCLElBQUksV0FBVyxLQUFLO0VBQ3BCLE1BQU07Q0FDUjtDQUVBLG9CQUFvQixDQUFDO0NBQ3JCLE9BQU87QUFDVDs7O0NBekQ0QyxnQkFBQTtDQThCeEMsb0JBQXlDIn0=
|
|
@@ -7,7 +7,7 @@ import { z } from "zod";
|
|
|
7
7
|
import { access, readFile, unlink, writeFile } from "node:fs/promises";
|
|
8
8
|
import path, { dirname, join } from "node:path";
|
|
9
9
|
import { constants } from "node:fs";
|
|
10
|
-
|
|
10
|
+
// src/code-formatting/oxlint.ts
|
|
11
11
|
/**
|
|
12
12
|
* 프로젝트 설정에 맞춰 코드를 lint합니다.
|
|
13
13
|
*
|
|
@@ -123,8 +123,7 @@ var init_oxlint = __esmMin((() => {
|
|
|
123
123
|
oxlintQueue = [];
|
|
124
124
|
isOxlintRunning = false;
|
|
125
125
|
}));
|
|
126
|
-
//#endregion
|
|
127
126
|
init_oxlint();
|
|
128
127
|
export { init_oxlint, resolveOxlintBin, runOxlint };
|
|
129
128
|
|
|
130
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3hsaW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2RlLWZvcm1hdHRpbmcvb3hsaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgZnMvcHJvbWlzZXPqsIAgbW9ja+uQmOyngOunjCwg7JWE656YIHJ1bk94bGludOydtCBpc1Rlc3Qg6rCA65Oc66GcIOyViCDrj4Tri4jquYxcbi8vIOq3uOuDpSBmcy9wcm9taXNlcyDqt7jrjIDroZwg7IKs7JqpLiAocHJvZHVjdGlvbuyXkOyEnOunjCDsnoTsi5ztjIzsnbwg7Z2Q66aE7J20IOuPleuLiOuLpC4pXG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgYWNjZXNzLCByZWFkRmlsZSwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4ZWN1dGUgfSBmcm9tIFwiLi4vdXRpbHMvcHJvY2Vzcy11dGlsc1wiO1xuaW1wb3J0IHsgaXNOdW1iZXJWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbmNvbnN0IHJlcXVpcmVGcm9tSGVyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2ZU94bGludEJpbk9wdGlvbnMgPSB7XG4gIHJlc29sdmVNb2R1bGU6IChzcGVjaWZpZXI6IHN0cmluZykgPT4gc3RyaW5nO1xuICByZWFkRmlsZTogKGZpbGVQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgYWNjZXNzOiAoZmlsZVBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxuY29uc3QgT3hsaW50U3RyaW5nQmluTWFuaWZlc3RTY2hlbWEgPSB6Lm9iamVjdCh7IGJpbjogei5zdHJpbmcoKS50cmltKCkubWluKDEpIH0pO1xuY29uc3QgT3hsaW50TmFtZWRCaW5NYW5pZmVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgYmluOiB6Lm9iamVjdCh7IG94bGludDogei5zdHJpbmcoKS50cmltKCkubWluKDEpIH0pLFxufSk7XG5cbnR5cGUgT3hsaW50UmVxdWVzdCA9IHtcbiAgdG1wRmlsZTogc3RyaW5nO1xuICByZXNvbHZlOiAoKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogT3hsaW50RXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIE94bGludEVycm9yID0gRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIH07XG5cbmNvbnN0IG94bGludFF1ZXVlOiBPeGxpbnRSZXF1ZXN0W10gPSBbXTtcbmxldCBpc094bGludFJ1bm5pbmcgPSBmYWxzZTtcblxuLyoqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7JeQIOunnuy2sCDsvZTrk5zrpbwgbGludO2VqeuLiOuLpC5cbiAqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7J2EIOyggeyaqeuwm+uKlCBveGxpbnQgY2xp66W8IOywvuyVhCDrnYTsm4zshJwsXG4gKiDsnoTsi5wg7YyM7J287JeQIGluLXBsYWNl66GcIOyNqOyEnCDqt7gg6rKw6rO866W8IOu5vOyYpOuKlCDrsKnsi53snLzroZwg7J6R64+Z7ZWp64uI64ukLlxuICog7JmcIOydtOugh+qyjCDtlZjripDrg5A/IG94bGludOqwgCBub2RlIGFwaeuPhCDslYgg7KO86rOgIGNsaeyXkOyEnCBzdGRpbiDsmLXshZjrj4Qg7JWIIOyjvOq4sCDrlYzrrLguLi5cbiAqXG4gKiDqt7jrn7DrjbAg7J20IOy5nOq1rOuKlCDtmLjstpztlaAg65WM66eI64ukIOustOyngOyEseycvOuhnCBveGxpbnQgY2xp66W8IOuPjOumrOyngOuKlCDslYrsirXri4jri6QuXG4gKiDqt7jrn7Ag7Iud7Jy866GcIO2WiOuLpOqwgOuKlCBveGxpbnQg7ZSE66Gc7IS47Iqk66eMIOuPmeyLnOyXkCDsiJjsi60g6rCc6rCAIOuWoCDsnojqsowg65CgIOyImOuPhCDsnojslrTsmpQuXG4gKiDqt7jrn6zri6TqsIAgc3luY+yXkOyEnCDtjIzsnbwg7IOd7ISx7J20IDEw7LSI64+EIOuEmOqyjCDqsbjrpqzripQg7J2864+EIOyeiOyXiOyKteuLiOuLpC5cbiAqIOydtOulvCDrp4nquLAg7JyE7ZW0LCBveGxpbnTqsIAg64+M7JWE6rCA6rOgIOyeiOydhCDrlYzsl5Ag7IOIIHJ1bk94bGludCDtmLjstpzsnbQg65Ok7Ja07Jik66m0IOuCtOu2gOyXkOyEnCDslYzslYTshJwg7J6YIOyfgeyXrOuGqOuLpOqwgCDsi6Ttlokg64Gd64KY66m0IOuwsOy5mOuhnCDqtbTrpr3ri4jri6QuXG4gKiDtlZwg67KI7JeQIOyYpOyngSDtlZjrgpjsnZggb3hsaW50IGNsaSDsi6Ttlonrp4wg64+M7JWE6rCA6rKMIO2VmOuKlCDqsoHri4jri6QuXG4gKlxuICog7J6Q7IS47ZWcIOuwsOy5rSDsoITrnrU6XG4gKiAtIOyVhOustCDqsoPrj4Qg7JeG7J2EIOuVjOyXkCDtmLjstpzrkJjrqbQg67CU66GcIG94bGludCDsi6Ttlontlanri4jri6QuXG4gKiAtIG94bGludCDsi6Ttlokg7KSR7JeQIOuTpOyWtOyYpOuptCDtgZDsl5Ag7J+B7Jes65Gh64uI64ukLlxuICogLSBveGxpbnQg7Iuk7ZaJIOyZhOujjCDsi5zsoJDsl5DshJwg7YGQ7JeQIOutkOqwgCDsnojsnLzrqbQg6re46rG466GcIOuLpOydjCDrsLDsuZgg67CU66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDqt7jrnpjshJwg652E7JeE652E7JeEIO2VmOuCmOyUqSDrk6TslrTsmKTrqbQg6re464OlIOyInOywqCDsi6Ttlonqs7wg64uk66aE7J20IOyXhuqzoCwg7Jes65+s6rCcIOyasOujqOujqCDrk6TslrTsmKTrqbQg6re465WMIO2aqOyaqeydtCDsg53quYHri4jri6QuXG4gKiDri6Trp4wg64+Z7Iuc7JeQIDMw6rCc6rCAIO2VnOuyiOyXkCDrk6TslrTsmKjri6Tqs6AgMzDqsJzqsIAg66qo65GQIO2VnCDrsLDsuZjrpbwg7YOA7KeA64qUIOyViuqzoCxcbiAqIGlkbGXsl5DshJzsnZgg7LKrIOyalOyyreyXkCDsponsi5wg67Cw7LmY66W8IOyLnOyeke2VmOuvgOuhnCDstZzshowgMuuwsOy5mOqwgCDshozsmpTrkJzri6TripQg7KCQIOyjvOydmOyXvC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk94bGludChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNUZXN0KCkpIHtcbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIOuKkOugpOyngOq4sOunjCDtlZjqs6Ag6rKA7Kad7ZWgIOqwgOy5mOuPhCDsl4bslrTshJwg7JWIIO2VqeuLiOuLpC5cbiAgICAvLyBHaXRIdWIgQWN0aW9ucyDtmZjqsr3sl5DshJwgbGludOqwgCDsmKTrnpgg6rG466Ck7IScIOu7l+q4sOuPhCDtlojslrTsmpQuIChodHRwczovL2dpdGh1Yi5jb20vY2FydGFub3ZhLWFpL3NvbmFtdS9hY3Rpb25zL3J1bnMvMjUyNjcyMTQwMjcvam9iLzc0MDgzNjMwMTY5KVxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgY29uc3QgdG1wRmlsZSA9IGpvaW4oXG4gICAgLy8g7YOA6rKfIO2MjOydvOydtCDro6jtirgg7JWE656Y7JeQIOyeiOyWtOyVvCDtlbTsmpQuIOq3uOuemOyEnCB0bXAg65SU66CJ7Yag66as6rCZ7J2A6rGwIOyViCDslIHri4jri6QhXG4gICAgcHJvY2Vzcy5jd2QoKSxcbiAgICBgLnNvbmFtdS1veGxpbnQtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfS50c2AsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUodG1wRmlsZSwgY29kZSwgXCJ1dGYtOFwiKTtcbiAgICBhd2FpdCBlbnF1ZXVlT3hsaW50KHRtcEZpbGUpO1xuICAgIHJldHVybiBhd2FpdCByZWFkRmlsZSh0bXBGaWxlLCBcInV0Zi04XCIpO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1bmxpbmsodG1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsgq3soJwg7Iuk7Yyo7ZW064+EIOyWtOywqO2UvCBpZ25vcmXrkKguXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWVPeGxpbnQodG1wRmlsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgb3hsaW50UXVldWUucHVzaCh7IHRtcEZpbGUsIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICBpZiAoIWlzT3hsaW50UnVubmluZykge1xuICAgICAgdm9pZCBmbHVzaE94bGludFF1ZXVlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmx1c2hPeGxpbnRRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzT3hsaW50UnVubmluZyB8fCBveGxpbnRRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpc094bGludFJ1bm5pbmcgPSB0cnVlO1xuICAvLyDsi6TtlonsnYQg7Iuc7J6R7ZWgIOuVjOq5jOyngCDspIDruYTrkJwg7YyM7J2866eMIOustuyWtCDri6TsnYwg7JqU7LKt7J2AIO2bhOyGjSDrsLDsuZjroZwg64SY6rmB64uI64ukLlxuICBjb25zdCBiYXRjaCA9IG94bGludFF1ZXVlLnNwbGljZSgwKTtcblxuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjdXRlKFxuICAgICAgICBhd2FpdCByZXNvbHZlT3hsaW50QmluKCksXG4gICAgICAgIFtcIi0tZml4XCIsIFwiLS1maXgtc3VnZ2VzdGlvbnNcIiwgXCItLXR5cGUtYXdhcmVcIiwgLi4uYmF0Y2gubWFwKCh7IHRtcEZpbGUgfSkgPT4gdG1wRmlsZSldLFxuICAgICAgICB7XG4gICAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGxpbnQg7JyE67CYIOyLnCBleGl0IGNvZGUgIT0gMOydtOyngOunjCAtLWZpeOuKlCDsoIHsmqnrkKguIGV4ZWMg7J6Q7LK0IOyLpO2MqOunjCDrsLDsuZgg7KCE7LK07JeQIOyghOuLrO2VqeuLiOuLpC5cbiAgICAgIC8vIFNBRkVUWTog7ISg7ZaJIOu2hOq4sOyZgCDtlajsiJgg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgY29uc3QgZXJyb3IgPSBlIGFzIE94bGludEVycm9yO1xuICAgICAgaWYgKCFpc051bWJlclZhbHVlKGVycm9yLmNvZGUpKSB7XG4gICAgICAgIGJhdGNoLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmF0Y2guZm9yRWFjaCgoeyByZXNvbHZlIH0pID0+IHJlc29sdmUoKSk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNPeGxpbnRSdW5uaW5nID0gZmFsc2U7XG4gICAgaWYgKG94bGludFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvaWQgZmx1c2hPeGxpbnRRdWV1ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU94bGludEJpbihcbiAgb3B0aW9uczogUmVzb2x2ZU94bGludEJpbk9wdGlvbnMgPSB7XG4gICAgcmVzb2x2ZU1vZHVsZTogKHNwZWNpZmllcikgPT4gcmVxdWlyZUZyb21IZXJlLnJlc29sdmUoc3BlY2lmaWVyKSxcbiAgICByZWFkRmlsZTogKGZpbGVQYXRoKSA9PiByZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICBhY2Nlc3M6IChmaWxlUGF0aCwgbW9kZSkgPT4gYWNjZXNzKGZpbGVQYXRoLCBtb2RlKSxcbiAgfSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBtYW5pZmVzdFBhdGg6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdFBhdGggPSBvcHRpb25zLnJlc29sdmVNb2R1bGUoXCJveGxpbnQvcGFja2FnZS5qc29uXCIpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBjcmVhdGVPeGxpbnRCaW5SZXNvbHV0aW9uRXJyb3IoXG4gICAgICBcIm94bGludCBwYWNrYWdlLmpzb27snYQg7LC+7J2EIOyImCDsl4bsirXri4jri6QuIG94bGludCDsnZjsobTshLHsnYQg7ISk7LmY7ZWcIOuSpCDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC5cIixcbiAgICApO1xuICB9XG5cbiAgbGV0IG1hbmlmZXN0OiB1bmtub3duO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCBvcHRpb25zLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBjcmVhdGVPeGxpbnRCaW5SZXNvbHV0aW9uRXJyb3IoXG4gICAgICBcIm94bGludCBwYWNrYWdlLmpzb27snYQg7J296rGw64KYIO2VtOyEne2VoCDsiJgg7JeG7Iq164uI64ukLiDtjKjtgqTsp4Drpbwg64uk7IucIOyEpOy5mO2VnCDrkqQg7Iuc64+E7ZW0IOyjvOyEuOyalC5cIixcbiAgICApO1xuICB9XG5cbiAgLy8gbnBt7J2YIGJpbuydgCDri6jsnbwg7Iuk7ZaJIO2MjOydvCDrrLjsnpDsl7Tqs7wg66qF66C5IOydtOumhOuzhCDqsJ3ssrTrpbwg66qo65GQIO2XiOyaqe2VqeuLiOuLpC5cbiAgY29uc3Qgc3RyaW5nQmluTWFuaWZlc3QgPSBPeGxpbnRTdHJpbmdCaW5NYW5pZmVzdFNjaGVtYS5zYWZlUGFyc2UobWFuaWZlc3QpO1xuICBjb25zdCBuYW1lZEJpbk1hbmlmZXN0ID0gT3hsaW50TmFtZWRCaW5NYW5pZmVzdFNjaGVtYS5zYWZlUGFyc2UobWFuaWZlc3QpO1xuICBsZXQgYmluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgaWYgKHN0cmluZ0Jpbk1hbmlmZXN0LnN1Y2Nlc3MpIHtcbiAgICBiaW4gPSBzdHJpbmdCaW5NYW5pZmVzdC5kYXRhLmJpbjtcbiAgfSBlbHNlIGlmIChuYW1lZEJpbk1hbmlmZXN0LnN1Y2Nlc3MpIHtcbiAgICBiaW4gPSBuYW1lZEJpbk1hbmlmZXN0LmRhdGEuYmluLm94bGludDtcbiAgfVxuICBpZiAoYmluID09PSBudWxsKSB7XG4gICAgdGhyb3cgY3JlYXRlT3hsaW50QmluUmVzb2x1dGlvbkVycm9yKFxuICAgICAgXCJveGxpbnQgcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zqsIAg7JeG6rGw64KYIOyYrOuwlOultOyngCDslYrsirXri4jri6QuIO2YuO2ZmOuQmOuKlCBveGxpbnQg7Yyo7YKk7KeA66W8IOyEpOy5mO2VtCDso7zshLjsmpQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGJpblBhdGggPSBwYXRoLnJlc29sdmUoZGlybmFtZShtYW5pZmVzdFBhdGgpLCBiaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IG9wdGlvbnMuYWNjZXNzKGJpblBhdGgsIGNvbnN0YW50cy5GX09LIHwgY29uc3RhbnRzLlhfT0spO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBjcmVhdGVPeGxpbnRCaW5SZXNvbHV0aW9uRXJyb3IoXG4gICAgICBcIm94bGludCBwYWNrYWdlLmpzb27snZggYmluIOyLpO2WiSDtjIzsnbzsnbQg7JeG6rGw64KYIOyLpO2Wie2VoCDsiJgg7JeG7Iq164uI64ukLiDtjKjtgqTsp4Drpbwg64uk7IucIOyEpOy5mO2VtCDso7zshLjsmpQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBiaW5QYXRoO1xufVxuZnVuY3Rpb24gY3JlYXRlT3hsaW50QmluUmVzb2x1dGlvbkVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihtZXNzYWdlKSwgeyBjb2RlOiBcIk9YTElOVF9CSU5fUkVTT0xVVElPTl9GQUlMRURcIiB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyREEsZUFBc0IsVUFBVSxNQUErQjtDQUM3RCxJQUFJLE9BQU8sR0FHVCxPQUFPO0NBR1QsTUFBTSxVQUFVLEtBRWQsUUFBUSxJQUFJLEdBQ1osa0JBQWtCLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQ3RFO0NBRUEsSUFBSTtFQUNGLE1BQU0sVUFBVSxTQUFTLE1BQU0sT0FBTztFQUN0QyxNQUFNLGNBQWMsT0FBTztFQUMzQixPQUFPLE1BQU0sU0FBUyxTQUFTLE9BQU87Q0FDeEMsVUFBVTtFQUNSLElBQUk7R0FDRixNQUFNLE9BQU8sT0FBTztFQUN0QixRQUFRLENBRVI7Q0FDRjtBQUNGO0FBRUEsU0FBUyxjQUFjLFNBQWdDO0NBQ3JELE9BQU8sSUFBSSxTQUFTLFNBQVMsV0FBVztFQUN0QyxZQUFZLEtBQUs7R0FBRTtHQUFTO0dBQVM7RUFBTyxDQUFDO0VBQzdDLElBQUksQ0FBQyxpQkFDSCxBQUFLLGlCQUFpQjtDQUUxQixDQUFDO0FBQ0g7QUFFQSxlQUFlLG1CQUFrQztDQUMvQyxJQUFJLG1CQUFtQixZQUFZLFdBQVcsR0FDNUM7Q0FHRixrQkFBa0I7Q0FFbEIsTUFBTSxRQUFRLFlBQVksT0FBTyxDQUFDO0NBRWxDLElBQUk7RUFDRixJQUFJO0dBQ0YsTUFBTSxRQUNKLE1BQU0saUJBQWlCLEdBQ3ZCO0lBQUM7SUFBUztJQUFxQjtJQUFnQixHQUFHLE1BQU0sS0FBSyxFQUFFLGNBQWMsT0FBTztHQUFDLEdBQ3JGLEVBQ0UsU0FBUyxJQUNYLENBQ0Y7RUFDRixTQUFTLEdBQUc7R0FHVixNQUFNLFFBQVE7R0FDZCxJQUFJLENBQUMsY0FBYyxNQUFNLElBQUksR0FBRztJQUM5QixNQUFNLFNBQVMsRUFBRSxhQUFhLE9BQU8sS0FBSyxDQUFDO0lBQzNDO0dBQ0Y7RUFDRjtFQUVBLE1BQU0sU0FBUyxFQUFFLGNBQWMsUUFBUSxDQUFDO0NBQzFDLFVBQVU7RUFDUixrQkFBa0I7RUFDbEIsSUFBSSxZQUFZLFNBQVMsR0FDdkIsQUFBSyxpQkFBaUI7Q0FFMUI7QUFDRjtBQUVBLGVBQXNCLGlCQUNwQixVQUFtQztDQUNqQyxnQkFBZ0IsY0FBYyxnQkFBZ0IsUUFBUSxTQUFTO0NBQy9ELFdBQVcsYUFBYSxTQUFTLFVBQVUsT0FBTztDQUNsRCxTQUFTLFVBQVUsU0FBUyxPQUFPLFVBQVUsSUFBSTtBQUNuRCxHQUNpQjtDQUNqQixJQUFJO0NBQ0osSUFBSTtFQUNGLGVBQWUsUUFBUSxjQUFjLHFCQUFxQjtDQUM1RCxRQUFRO0VBQ04sTUFBTSwrQkFDSiwrREFDRjtDQUNGO0NBRUEsSUFBSTtDQUNKLElBQUk7RUFDRixXQUFXLEtBQUssTUFBTSxNQUFNLFFBQVEsU0FBUyxZQUFZLENBQUM7Q0FDNUQsUUFBUTtFQUNOLE1BQU0sK0JBQ0osNkRBQ0Y7Q0FDRjtDQUdBLE1BQU0sb0JBQW9CLDhCQUE4QixVQUFVLFFBQVE7Q0FDMUUsTUFBTSxtQkFBbUIsNkJBQTZCLFVBQVUsUUFBUTtDQUN4RSxJQUFJLE1BQXFCO0NBQ3pCLElBQUksa0JBQWtCLFNBQ3BCLE1BQU0sa0JBQWtCLEtBQUs7TUFDeEIsSUFBSSxpQkFBaUIsU0FDMUIsTUFBTSxpQkFBaUIsS0FBSyxJQUFJO0NBRWxDLElBQUksUUFBUSxNQUNWLE1BQU0sK0JBQ0osdUVBQ0Y7Q0FHRixNQUFNLFVBQVUsS0FBSyxRQUFRLFFBQVEsWUFBWSxHQUFHLEdBQUc7Q0FDdkQsSUFBSTtFQUNGLE1BQU0sUUFBUSxPQUFPLFNBQVMsVUFBVSxPQUFPLFVBQVUsSUFBSTtDQUMvRCxRQUFRO0VBQ04sTUFBTSwrQkFDSixrRUFDRjtDQUNGO0NBRUEsT0FBTztBQUNUO0FBQ0EsU0FBUywrQkFBK0IsU0FBd0M7Q0FDOUUsT0FBTyxPQUFPLE9BQU8sSUFBSSxNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkY7OztpQkEvSzRDO29CQUNJO29CQUNNO0NBRWhELGtCQUFrQixjQUFjLE9BQU8sS0FBSyxHQUFHO0NBUS9DLGdDQUFnQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztDQUMxRSwrQkFBK0IsRUFBRSxPQUFPLEVBQzVDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDcEQsQ0FBQztDQVVLLGNBQStCLENBQUM7Q0FDbEMsa0JBQWtCIn0=
|
|
129
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3hsaW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2RlLWZvcm1hdHRpbmcvb3hsaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgZnMvcHJvbWlzZXPqsIAgbW9ja+uQmOyngOunjCwg7JWE656YIHJ1bk94bGludOydtCBpc1Rlc3Qg6rCA65Oc66GcIOyViCDrj4Tri4jquYxcbi8vIOq3uOuDpSBmcy9wcm9taXNlcyDqt7jrjIDroZwg7IKs7JqpLiAocHJvZHVjdGlvbuyXkOyEnOunjCDsnoTsi5ztjIzsnbwg7Z2Q66aE7J20IOuPleuLiOuLpC4pXG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgYWNjZXNzLCByZWFkRmlsZSwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4ZWN1dGUgfSBmcm9tIFwiLi4vdXRpbHMvcHJvY2Vzcy11dGlsc1wiO1xuaW1wb3J0IHsgaXNOdW1iZXJWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbmNvbnN0IHJlcXVpcmVGcm9tSGVyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2ZU94bGludEJpbk9wdGlvbnMgPSB7XG4gIHJlc29sdmVNb2R1bGU6IChzcGVjaWZpZXI6IHN0cmluZykgPT4gc3RyaW5nO1xuICByZWFkRmlsZTogKGZpbGVQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgYWNjZXNzOiAoZmlsZVBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxuY29uc3QgT3hsaW50U3RyaW5nQmluTWFuaWZlc3RTY2hlbWEgPSB6Lm9iamVjdCh7IGJpbjogei5zdHJpbmcoKS50cmltKCkubWluKDEpIH0pO1xuY29uc3QgT3hsaW50TmFtZWRCaW5NYW5pZmVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgYmluOiB6Lm9iamVjdCh7IG94bGludDogei5zdHJpbmcoKS50cmltKCkubWluKDEpIH0pLFxufSk7XG5cbnR5cGUgT3hsaW50UmVxdWVzdCA9IHtcbiAgdG1wRmlsZTogc3RyaW5nO1xuICByZXNvbHZlOiAoKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogT3hsaW50RXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIE94bGludEVycm9yID0gRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIH07XG5cbmNvbnN0IG94bGludFF1ZXVlOiBPeGxpbnRSZXF1ZXN0W10gPSBbXTtcbmxldCBpc094bGludFJ1bm5pbmcgPSBmYWxzZTtcblxuLyoqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7JeQIOunnuy2sCDsvZTrk5zrpbwgbGludO2VqeuLiOuLpC5cbiAqXG4gKiDtlITroZzsoJ3tirgg7ISk7KCV7J2EIOyggeyaqeuwm+uKlCBveGxpbnQgY2xp66W8IOywvuyVhCDrnYTsm4zshJwsXG4gKiDsnoTsi5wg7YyM7J287JeQIGluLXBsYWNl66GcIOyNqOyEnCDqt7gg6rKw6rO866W8IOu5vOyYpOuKlCDrsKnsi53snLzroZwg7J6R64+Z7ZWp64uI64ukLlxuICog7JmcIOydtOugh+qyjCDtlZjripDrg5A/IG94bGludOqwgCBub2RlIGFwaeuPhCDslYgg7KO86rOgIGNsaeyXkOyEnCBzdGRpbiDsmLXshZjrj4Qg7JWIIOyjvOq4sCDrlYzrrLguLi5cbiAqXG4gKiDqt7jrn7DrjbAg7J20IOy5nOq1rOuKlCDtmLjstpztlaAg65WM66eI64ukIOustOyngOyEseycvOuhnCBveGxpbnQgY2xp66W8IOuPjOumrOyngOuKlCDslYrsirXri4jri6QuXG4gKiDqt7jrn7Ag7Iud7Jy866GcIO2WiOuLpOqwgOuKlCBveGxpbnQg7ZSE66Gc7IS47Iqk66eMIOuPmeyLnOyXkCDsiJjsi60g6rCc6rCAIOuWoCDsnojqsowg65CgIOyImOuPhCDsnojslrTsmpQuXG4gKiDqt7jrn6zri6TqsIAgc3luY+yXkOyEnCDtjIzsnbwg7IOd7ISx7J20IDEw7LSI64+EIOuEmOqyjCDqsbjrpqzripQg7J2864+EIOyeiOyXiOyKteuLiOuLpC5cbiAqIOydtOulvCDrp4nquLAg7JyE7ZW0LCBveGxpbnTqsIAg64+M7JWE6rCA6rOgIOyeiOydhCDrlYzsl5Ag7IOIIHJ1bk94bGludCDtmLjstpzsnbQg65Ok7Ja07Jik66m0IOuCtOu2gOyXkOyEnCDslYzslYTshJwg7J6YIOyfgeyXrOuGqOuLpOqwgCDsi6Ttlokg64Gd64KY66m0IOuwsOy5mOuhnCDqtbTrpr3ri4jri6QuXG4gKiDtlZwg67KI7JeQIOyYpOyngSDtlZjrgpjsnZggb3hsaW50IGNsaSDsi6Ttlonrp4wg64+M7JWE6rCA6rKMIO2VmOuKlCDqsoHri4jri6QuXG4gKlxuICog7J6Q7IS47ZWcIOuwsOy5rSDsoITrnrU6XG4gKiAtIOyVhOustCDqsoPrj4Qg7JeG7J2EIOuVjOyXkCDtmLjstpzrkJjrqbQg67CU66GcIG94bGludCDsi6Ttlontlanri4jri6QuXG4gKiAtIG94bGludCDsi6Ttlokg7KSR7JeQIOuTpOyWtOyYpOuptCDtgZDsl5Ag7J+B7Jes65Gh64uI64ukLlxuICogLSBveGxpbnQg7Iuk7ZaJIOyZhOujjCDsi5zsoJDsl5DshJwg7YGQ7JeQIOutkOqwgCDsnojsnLzrqbQg6re46rG466GcIOuLpOydjCDrsLDsuZgg67CU66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDqt7jrnpjshJwg652E7JeE652E7JeEIO2VmOuCmOyUqSDrk6TslrTsmKTrqbQg6re464OlIOyInOywqCDsi6Ttlonqs7wg64uk66aE7J20IOyXhuqzoCwg7Jes65+s6rCcIOyasOujqOujqCDrk6TslrTsmKTrqbQg6re465WMIO2aqOyaqeydtCDsg53quYHri4jri6QuXG4gKiDri6Trp4wg64+Z7Iuc7JeQIDMw6rCc6rCAIO2VnOuyiOyXkCDrk6TslrTsmKjri6Tqs6AgMzDqsJzqsIAg66qo65GQIO2VnCDrsLDsuZjrpbwg7YOA7KeA64qUIOyViuqzoCxcbiAqIGlkbGXsl5DshJzsnZgg7LKrIOyalOyyreyXkCDsponsi5wg67Cw7LmY66W8IOyLnOyeke2VmOuvgOuhnCDstZzshowgMuuwsOy5mOqwgCDshozsmpTrkJzri6TripQg7KCQIOyjvOydmOyXvC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk94bGludChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNUZXN0KCkpIHtcbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIOuKkOugpOyngOq4sOunjCDtlZjqs6Ag6rKA7Kad7ZWgIOqwgOy5mOuPhCDsl4bslrTshJwg7JWIIO2VqeuLiOuLpC5cbiAgICAvLyBHaXRIdWIgQWN0aW9ucyDtmZjqsr3sl5DshJwgbGludOqwgCDsmKTrnpgg6rG466Ck7IScIOu7l+q4sOuPhCDtlojslrTsmpQuIChodHRwczovL2dpdGh1Yi5jb20vY2FydGFub3ZhLWFpL3NvbmFtdS9hY3Rpb25zL3J1bnMvMjUyNjcyMTQwMjcvam9iLzc0MDgzNjMwMTY5KVxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgY29uc3QgdG1wRmlsZSA9IGpvaW4oXG4gICAgLy8g7YOA6rKfIO2MjOydvOydtCDro6jtirgg7JWE656Y7JeQIOyeiOyWtOyVvCDtlbTsmpQuIOq3uOuemOyEnCB0bXAg65SU66CJ7Yag66as6rCZ7J2A6rGwIOyViCDslIHri4jri6QhXG4gICAgcHJvY2Vzcy5jd2QoKSxcbiAgICBgLnNvbmFtdS1veGxpbnQtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfS50c2AsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUodG1wRmlsZSwgY29kZSwgXCJ1dGYtOFwiKTtcbiAgICBhd2FpdCBlbnF1ZXVlT3hsaW50KHRtcEZpbGUpO1xuICAgIHJldHVybiBhd2FpdCByZWFkRmlsZSh0bXBGaWxlLCBcInV0Zi04XCIpO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1bmxpbmsodG1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsgq3soJwg7Iuk7Yyo7ZW064+EIOyWtOywqO2UvCBpZ25vcmXrkKguXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWVPeGxpbnQodG1wRmlsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgb3hsaW50UXVldWUucHVzaCh7IHRtcEZpbGUsIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICBpZiAoIWlzT3hsaW50UnVubmluZykge1xuICAgICAgdm9pZCBmbHVzaE94bGludFF1ZXVlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmx1c2hPeGxpbnRRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzT3hsaW50UnVubmluZyB8fCBveGxpbnRRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpc094bGludFJ1bm5pbmcgPSB0cnVlO1xuICAvLyDsi6TtlonsnYQg7Iuc7J6R7ZWgIOuVjOq5jOyngCDspIDruYTrkJwg7YyM7J2866eMIOustuyWtCDri6TsnYwg7JqU7LKt7J2AIO2bhOyGjSDrsLDsuZjroZwg64SY6rmB64uI64ukLlxuICBjb25zdCBiYXRjaCA9IG94bGludFF1ZXVlLnNwbGljZSgwKTtcblxuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjdXRlKFxuICAgICAgICBhd2FpdCByZXNvbHZlT3hsaW50QmluKCksXG4gICAgICAgIFtcIi0tZml4XCIsIFwiLS1maXgtc3VnZ2VzdGlvbnNcIiwgXCItLXR5cGUtYXdhcmVcIiwgLi4uYmF0Y2gubWFwKCh7IHRtcEZpbGUgfSkgPT4gdG1wRmlsZSldLFxuICAgICAgICB7XG4gICAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGxpbnQg7JyE67CYIOyLnCBleGl0IGNvZGUgIT0gMOydtOyngOunjCAtLWZpeOuKlCDsoIHsmqnrkKguIGV4ZWMg7J6Q7LK0IOyLpO2MqOunjCDrsLDsuZgg7KCE7LK07JeQIOyghOuLrO2VqeuLiOuLpC5cbiAgICAgIC8vIFNBRkVUWTog7ISg7ZaJIOu2hOq4sOyZgCDtlajsiJgg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgY29uc3QgZXJyb3IgPSBlIGFzIE94bGludEVycm9yO1xuICAgICAgaWYgKCFpc051bWJlclZhbHVlKGVycm9yLmNvZGUpKSB7XG4gICAgICAgIGJhdGNoLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmF0Y2guZm9yRWFjaCgoeyByZXNvbHZlIH0pID0+IHJlc29sdmUoKSk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNPeGxpbnRSdW5uaW5nID0gZmFsc2U7XG4gICAgaWYgKG94bGludFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvaWQgZmx1c2hPeGxpbnRRdWV1ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU94bGludEJpbihcbiAgb3B0aW9uczogUmVzb2x2ZU94bGludEJpbk9wdGlvbnMgPSB7XG4gICAgcmVzb2x2ZU1vZHVsZTogKHNwZWNpZmllcikgPT4gcmVxdWlyZUZyb21IZXJlLnJlc29sdmUoc3BlY2lmaWVyKSxcbiAgICByZWFkRmlsZTogKGZpbGVQYXRoKSA9PiByZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICBhY2Nlc3M6IChmaWxlUGF0aCwgbW9kZSkgPT4gYWNjZXNzKGZpbGVQYXRoLCBtb2RlKSxcbiAgfSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBtYW5pZmVzdFBhdGg6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdFBhdGggPSBvcHRpb25zLnJlc29sdmVNb2R1bGUoXCJveGxpbnQvcGFja2FnZS5qc29uXCIpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBjcmVhdGVPeGxpbnRCaW5SZXNvbHV0aW9uRXJyb3IoXG4gICAgICBcIm94bGludCBwYWNrYWdlLmpzb27snYQg7LC+7J2EIOyImCDsl4bsirXri4jri6QuIG94bGludCDsnZjsobTshLHsnYQg7ISk7LmY7ZWcIOuSpCDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC5cIixcbiAgICApO1xuICB9XG5cbiAgbGV0IG1hbmlmZXN0OiB1bmtub3duO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCBvcHRpb25zLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBjcmVhdGVPeGxpbnRCaW5SZXNvbHV0aW9uRXJyb3IoXG4gICAgICBcIm94bGludCBwYWNrYWdlLmpzb27snYQg7J296rGw64KYIO2VtOyEne2VoCDsiJgg7JeG7Iq164uI64ukLiDtjKjtgqTsp4Drpbwg64uk7IucIOyEpOy5mO2VnCDrkqQg7Iuc64+E7ZW0IOyjvOyEuOyalC5cIixcbiAgICApO1xuICB9XG5cbiAgLy8gbnBt7J2YIGJpbuydgCDri6jsnbwg7Iuk7ZaJIO2MjOydvCDrrLjsnpDsl7Tqs7wg66qF66C5IOydtOumhOuzhCDqsJ3ssrTrpbwg66qo65GQIO2XiOyaqe2VqeuLiOuLpC5cbiAgY29uc3Qgc3RyaW5nQmluTWFuaWZlc3QgPSBPeGxpbnRTdHJpbmdCaW5NYW5pZmVzdFNjaGVtYS5zYWZlUGFyc2UobWFuaWZlc3QpO1xuICBjb25zdCBuYW1lZEJpbk1hbmlmZXN0ID0gT3hsaW50TmFtZWRCaW5NYW5pZmVzdFNjaGVtYS5zYWZlUGFyc2UobWFuaWZlc3QpO1xuICBsZXQgYmluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgaWYgKHN0cmluZ0Jpbk1hbmlmZXN0LnN1Y2Nlc3MpIHtcbiAgICBiaW4gPSBzdHJpbmdCaW5NYW5pZmVzdC5kYXRhLmJpbjtcbiAgfSBlbHNlIGlmIChuYW1lZEJpbk1hbmlmZXN0LnN1Y2Nlc3MpIHtcbiAgICBiaW4gPSBuYW1lZEJpbk1hbmlmZXN0LmRhdGEuYmluLm94bGludDtcbiAgfVxuICBpZiAoYmluID09PSBudWxsKSB7XG4gICAgdGhyb3cgY3JlYXRlT3hsaW50QmluUmVzb2x1dGlvbkVycm9yKFxuICAgICAgXCJveGxpbnQgcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zqsIAg7JeG6rGw64KYIOyYrOuwlOultOyngCDslYrsirXri4jri6QuIO2YuO2ZmOuQmOuKlCBveGxpbnQg7Yyo7YKk7KeA66W8IOyEpOy5mO2VtCDso7zshLjsmpQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGJpblBhdGggPSBwYXRoLnJlc29sdmUoZGlybmFtZShtYW5pZmVzdFBhdGgpLCBiaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IG9wdGlvbnMuYWNjZXNzKGJpblBhdGgsIGNvbnN0YW50cy5GX09LIHwgY29uc3RhbnRzLlhfT0spO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBjcmVhdGVPeGxpbnRCaW5SZXNvbHV0aW9uRXJyb3IoXG4gICAgICBcIm94bGludCBwYWNrYWdlLmpzb27snZggYmluIOyLpO2WiSDtjIzsnbzsnbQg7JeG6rGw64KYIOyLpO2Wie2VoCDsiJgg7JeG7Iq164uI64ukLiDtjKjtgqTsp4Drpbwg64uk7IucIOyEpOy5mO2VtCDso7zshLjsmpQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBiaW5QYXRoO1xufVxuZnVuY3Rpb24gY3JlYXRlT3hsaW50QmluUmVzb2x1dGlvbkVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihtZXNzYWdlKSwgeyBjb2RlOiBcIk9YTElOVF9CSU5fUkVTT0xVVElPTl9GQUlMRURcIiB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyREEsZUFBc0IsVUFBVSxNQUErQjtDQUM3RCxJQUFJLE9BQU8sR0FHVCxPQUFPO0NBR1QsTUFBTSxVQUFVLEtBRWQsUUFBUSxJQUFJLEdBQ1osa0JBQWtCLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQ3RFO0NBRUEsSUFBSTtFQUNGLE1BQU0sVUFBVSxTQUFTLE1BQU0sT0FBTztFQUN0QyxNQUFNLGNBQWMsT0FBTztFQUMzQixPQUFPLE1BQU0sU0FBUyxTQUFTLE9BQU87Q0FDeEMsVUFBVTtFQUNSLElBQUk7R0FDRixNQUFNLE9BQU8sT0FBTztFQUN0QixRQUFRLENBRVI7Q0FDRjtBQUNGO0FBRUEsU0FBUyxjQUFjLFNBQWdDO0NBQ3JELE9BQU8sSUFBSSxTQUFTLFNBQVMsV0FBVztFQUN0QyxZQUFZLEtBQUs7R0FBRTtHQUFTO0dBQVM7RUFBTyxDQUFDO0VBQzdDLElBQUksQ0FBQyxpQkFDSCxBQUFLLGlCQUFpQjtDQUUxQixDQUFDO0FBQ0g7QUFFQSxlQUFlLG1CQUFrQztDQUMvQyxJQUFJLG1CQUFtQixZQUFZLFdBQVcsR0FDNUM7Q0FHRixrQkFBa0I7Q0FFbEIsTUFBTSxRQUFRLFlBQVksT0FBTyxDQUFDO0NBRWxDLElBQUk7RUFDRixJQUFJO0dBQ0YsTUFBTSxRQUNKLE1BQU0saUJBQWlCLEdBQ3ZCO0lBQUM7SUFBUztJQUFxQjtJQUFnQixHQUFHLE1BQU0sS0FBSyxFQUFFLGNBQWMsT0FBTztHQUFDLEdBQ3JGLEVBQ0UsU0FBUyxJQUNYLENBQ0Y7RUFDRixTQUFTLEdBQUc7R0FHVixNQUFNLFFBQVE7R0FDZCxJQUFJLENBQUMsY0FBYyxNQUFNLElBQUksR0FBRztJQUM5QixNQUFNLFNBQVMsRUFBRSxhQUFhLE9BQU8sS0FBSyxDQUFDO0lBQzNDO0dBQ0Y7RUFDRjtFQUVBLE1BQU0sU0FBUyxFQUFFLGNBQWMsUUFBUSxDQUFDO0NBQzFDLFVBQVU7RUFDUixrQkFBa0I7RUFDbEIsSUFBSSxZQUFZLFNBQVMsR0FDdkIsQUFBSyxpQkFBaUI7Q0FFMUI7QUFDRjtBQUVBLGVBQXNCLGlCQUNwQixVQUFtQztDQUNqQyxnQkFBZ0IsY0FBYyxnQkFBZ0IsUUFBUSxTQUFTO0NBQy9ELFdBQVcsYUFBYSxTQUFTLFVBQVUsT0FBTztDQUNsRCxTQUFTLFVBQVUsU0FBUyxPQUFPLFVBQVUsSUFBSTtBQUNuRCxHQUNpQjtDQUNqQixJQUFJO0NBQ0osSUFBSTtFQUNGLGVBQWUsUUFBUSxjQUFjLHFCQUFxQjtDQUM1RCxRQUFRO0VBQ04sTUFBTSwrQkFDSiwrREFDRjtDQUNGO0NBRUEsSUFBSTtDQUNKLElBQUk7RUFDRixXQUFXLEtBQUssTUFBTSxNQUFNLFFBQVEsU0FBUyxZQUFZLENBQUM7Q0FDNUQsUUFBUTtFQUNOLE1BQU0sK0JBQ0osNkRBQ0Y7Q0FDRjtDQUdBLE1BQU0sb0JBQW9CLDhCQUE4QixVQUFVLFFBQVE7Q0FDMUUsTUFBTSxtQkFBbUIsNkJBQTZCLFVBQVUsUUFBUTtDQUN4RSxJQUFJLE1BQXFCO0NBQ3pCLElBQUksa0JBQWtCLFNBQ3BCLE1BQU0sa0JBQWtCLEtBQUs7TUFDeEIsSUFBSSxpQkFBaUIsU0FDMUIsTUFBTSxpQkFBaUIsS0FBSyxJQUFJO0NBRWxDLElBQUksUUFBUSxNQUNWLE1BQU0sK0JBQ0osdUVBQ0Y7Q0FHRixNQUFNLFVBQVUsS0FBSyxRQUFRLFFBQVEsWUFBWSxHQUFHLEdBQUc7Q0FDdkQsSUFBSTtFQUNGLE1BQU0sUUFBUSxPQUFPLFNBQVMsVUFBVSxPQUFPLFVBQVUsSUFBSTtDQUMvRCxRQUFRO0VBQ04sTUFBTSwrQkFDSixrRUFDRjtDQUNGO0NBRUEsT0FBTztBQUNUO0FBQ0EsU0FBUywrQkFBK0IsU0FBd0M7Q0FDOUUsT0FBTyxPQUFPLE9BQU8sSUFBSSxNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkY7OztDQS9LNEMsZ0JBQUE7Q0FDSSxtQkFBQTtDQUNNLG1CQUFBO0NBRWhELGtCQUFrQixjQUFjLFlBQVksR0FBRztDQVEvQyxnQ0FBZ0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Q0FDMUUsK0JBQStCLEVBQUUsT0FBTyxFQUM1QyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQ3BELENBQUM7Q0FVSyxjQUErQixDQUFDO0NBQ2xDLGtCQUFrQiJ9
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
-
|
|
2
|
+
// src/compress/compress.ts
|
|
3
3
|
/**
|
|
4
4
|
* CompressConfig가 비활성화 상태인지 확인합니다.
|
|
5
5
|
*/
|
|
@@ -56,7 +56,6 @@ var init_compress = __esmMin((() => {
|
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
58
|
}));
|
|
59
|
-
//#endregion
|
|
60
59
|
init_compress();
|
|
61
60
|
export { CompressPresets, init_compress, isCompressDisabled, toFastifyCompressOption };
|
|
62
61
|
|
package/dist/compress/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CompressPresets, init_compress, isCompressDisabled, toFastifyCompressOption } from "./compress.js";
|
|
2
|
-
|
|
2
|
+
// src/compress/index.ts
|
|
3
|
+
init_compress();
|
|
3
4
|
init_compress();
|
|
4
|
-
//#endregion
|
|
5
5
|
export { CompressPresets, isCompressDisabled, toFastifyCompressOption };
|
|
6
6
|
|
|
7
7
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXByZXNzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2NvbXByZXNzXCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL3R5cGVzXCI7XG4iXSwibWFwcGluZ3MiOiIifQ==
|
package/dist/compress/types.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export type CompressOptions = {
|
|
|
13
13
|
/** 압축을 적용할 최소 바이트 크기 (기본값: 1024) */
|
|
14
14
|
threshold?: number;
|
|
15
15
|
/** 사용할 인코딩 우선순위 (기본값: ["br", "gzip", "deflate"]) */
|
|
16
|
-
encodings?: ("br" | "gzip" | "deflate" | "identity")[];
|
|
16
|
+
encodings?: ("zstd" | "br" | "gzip" | "deflate" | "identity")[];
|
|
17
17
|
/** 압축할 Content-Type 필터 */
|
|
18
18
|
customTypes?: RegExp | ((contentType: string) => boolean);
|
|
19
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compress/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,eAAe,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compress/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,eAAe,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC;IAChE,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CAC3D,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
|
|
|
3
3
|
import { api_exports, init_api } from "../api/index.js";
|
|
4
4
|
import * as path$1 from "node:path";
|
|
5
5
|
import * as fs$1 from "node:fs";
|
|
6
|
-
|
|
6
|
+
// src/cone/cone-generator.ts
|
|
7
7
|
/**
|
|
8
8
|
* LLM을 사용하여 Entity의 cone 메타데이터를 생성합니다.
|
|
9
9
|
*
|
|
@@ -290,10 +290,9 @@ function mergeOnlyEmpty(generated, existing) {
|
|
|
290
290
|
}
|
|
291
291
|
return result;
|
|
292
292
|
}
|
|
293
|
-
//#endregion
|
|
294
293
|
__esmMin((() => {
|
|
295
294
|
init_runtime_value();
|
|
296
295
|
}))();
|
|
297
296
|
export { generateCones };
|
|
298
297
|
|
|
299
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJwYXRoIiwiZnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZS9jb25lLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgTGFuZ3VhZ2VNb2RlbCB9IGZyb20gXCJhaVwiO1xuXG5pbXBvcnQgeyB0eXBlIENvbmUsIHR5cGUgRW50aXR5SnNvbiB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbi8qKlxuICogQ29uZSDsg53shLEg7Luo7YWN7Iqk7Yq4XG4gKlxuICogRW50aXR5IOygleuztOyZgCDsg53shLEg7Ji17IWY7J2EIOuLtOqzoCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmVHZW5lcmF0aW9uQ29udGV4dCA9IHtcbiAgZW50aXR5OiBFbnRpdHlKc29uO1xuICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gIGV4aXN0aW5nQ29uZXM/OiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgLyoqIHRydWXsnbgg6rK97JqwIG5vdGXqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISxICovXG4gIG9ubHlFbXB0eT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIENvbmUg7IOd7ISxIOqysOqzvFxuICpcbiAqIEVudGl0eSwgUHJvcHMsIFN1YnNldHMsIEVudW1z7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOuLtOqzoCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmVHZW5lcmF0aW9uUmVzdWx0ID0ge1xuICBlbnRpdHlDb25lPzogQ29uZTtcbiAgcHJvcENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgc3Vic2V0Q29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICBlbnVtQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICB0b2tlbnNVc2VkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBDb25lVGV4dEdlbmVyYXRvciA9IChyZXF1ZXN0OiB7XG4gIG1vZGVsOiBMYW5ndWFnZU1vZGVsO1xuICBwcm9tcHQ6IHN0cmluZztcbn0pID0+IFByb21pc2U8eyB0ZXh0OiBzdHJpbmc7IHVzYWdlPzogeyB0b3RhbFRva2Vucz86IG51bWJlciB9IH0+O1xuXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdG9yRGVwZW5kZW5jaWVzID0ge1xuICBnZW5lcmF0ZVRleHQ/OiBDb25lVGV4dEdlbmVyYXRvcjtcbn07XG5cbi8qKlxuICogTExN7J2EIOyCrOyaqe2VmOyXrCBFbnRpdHnsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gRW50aXR5IOygleuztOyZgCDsg53shLEg7Ji17IWYXG4gKiBAcmV0dXJucyDsg53shLHrkJwgY29uZSDrqZTtg4DrjbDsnbTthLBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ29uZXMoXG4gIGNvbnRleHQ6IENvbmVHZW5lcmF0aW9uQ29udGV4dCxcbiAgZGVwZW5kZW5jaWVzOiBDb25lR2VuZXJhdG9yRGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPENvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IGFwaUtleSA9IGdldEFwaUtleSgpO1xuICBjb25zdCBwcm9tcHQgPSBidWlsZFByb21wdChjb250ZXh0KTtcbiAgY29uc3QgeyB0ZXh0OiByZXNwb25zZVRleHQsIHRva2Vuc1VzZWQgfSA9IGF3YWl0IGNhbGxBbnRocm9waWNBUEkoXG4gICAgcHJvbXB0LFxuICAgIGFwaUtleSxcbiAgICBkZXBlbmRlbmNpZXMuZ2VuZXJhdGVUZXh0LFxuICApO1xuICBjb25zdCByZXN1bHQgPSBwYXJzZUNvbmVSZXNwb25zZShyZXNwb25zZVRleHQpO1xuICByZXN1bHQudG9rZW5zVXNlZCA9IHRva2Vuc1VzZWQ7XG5cbiAgaWYgKGNvbnRleHQuZXhpc3RpbmdDb25lcykge1xuICAgIGlmIChjb250ZXh0Lm9ubHlFbXB0eSkge1xuICAgICAgcmV0dXJuIG1lcmdlT25seUVtcHR5KHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlV2l0aEV4aXN0aW5nKHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQVBJIO2CpOulvCDqsIDsoLjsmLXri4jri6QuXG4gKlxuICogU29uYW11LnNlY3JldCDrmJDripQg7ZmY6rK967OA7IiY7JeQ7IScIOqwgOyguOyYteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gIC8vIFNvbmFtdS5zZWNyZXTsnYAg65+w7YOA7J6E7JeQIOuhnOuTnOuQmOuvgOuhnCDrj5nsoIHsnLzroZwgaW1wb3J0XG4gIGxldCBhcGlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbmFtdeqwgCDstIjquLDtmZTrkJjslrQg7J6I64qUIOqyveyasFxuICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgIGFwaUtleSA9IFNvbmFtdS5zZWNyZXRzPy5hbnRocm9waWNfYXBpX2tleTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg65OxKVxuICAgIGFwaUtleSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghYXBpS2V5KSB7XG4gICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gIH1cblxuICBpZiAoIWFwaUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQU5USFJPUElDX0FQSV9LRVkgbm90IGZvdW5kLiBcIiArXG4gICAgICAgIFwiU2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcGlLZXk7XG59XG5cbi8qKlxuICog64+E66mU7J2467OEIHtkb21haW59LmNvbnRyYWN0Lm1k66W8IOydveyWtCDsu6jthY3siqTtirjroZwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIC0gY29udHJhY3Qve2RvbWFpbn0ve2RvbWFpbn0uY29udHJhY3QubWQ6IOuPhOuplOyduCDqt5zsuZnqs7wg6rKw7KCVIOq3vOqxsFxuICpcbiAqIGNvbmUg7IOd7ISxIOyLnCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIOuPhOuplOyduCDrp6Xrnb3sl5Ag66ee64qUIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlZjrj4TroZ0g7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZWFkUHJvamVjdFNraWxscygpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gU29uYW11LmFwcFJvb3RQYXRoO1xuICAgIGNvbnN0IGNvbnRlbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gY29udHJhY3QvKiovKi5jb250cmFjdC5tZCDsiJjsp5FcbiAgICBjb25zdCBjb250cmFjdERpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgXCJjb250cmFjdFwiKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb250cmFjdERpcikpIHtcbiAgICAgIGNvbnN0IGRvbWFpbnMgPSBmc1xuICAgICAgICAucmVhZGRpclN5bmMoY29udHJhY3REaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoKGQpID0+IGQubmFtZSk7XG5cbiAgICAgIGZvciAoY29uc3QgZG9tYWluIG9mIGRvbWFpbnMpIHtcbiAgICAgICAgY29uc3QgZG9tYWluRGlyID0gcGF0aC5qb2luKGNvbnRyYWN0RGlyLCBkb21haW4pO1xuICAgICAgICBjb25zdCBjb250cmFjdEZpbGVzID0gZnNcbiAgICAgICAgICAucmVhZGRpclN5bmMoZG9tYWluRGlyKVxuICAgICAgICAgIC5maWx0ZXIoKGY6IHN0cmluZykgPT4gZi5lbmRzV2l0aChcIi5jb250cmFjdC5tZFwiKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNvbnRyYWN0RmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkb21haW5EaXIsIGZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIikudHJpbSgpO1xuICAgICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjb250ZW50cy5wdXNoKGAtLS0gY29udHJhY3QvJHtkb21haW59LyR7ZmlsZX0gLS0tXFxuJHtjb250ZW50fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50cy5qb2luKFwiXFxuXFxuXCIpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBTb25hbXUg66+47LSI6riw7ZmUIOuYkOuKlCDtjIzsnbwg7KCR6re8IOyYpOulmCDsi5wg67mIIOusuOyekOyXtCDrsJjtmZhcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuXG4vKipcbiAqIExMTSDtlITroaztlITtirjrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIGFpLWNsaWVudC50cyDtjKjthLTsnYQg7LC46rOg7ZWY7JesIOuqhe2Zle2VnCDsp4Dsi5zsgqztla3qs7wg7Lac66ClIO2YleyLneydhCDsoJzqs7Xtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUHJvbXB0KGNvbnRleHQ6IENvbmVHZW5lcmF0aW9uQ29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IGxvY2FsZSA9IGNvbnRleHQubG9jYWxlIHx8IFwia29cIjtcbiAgY29uc3QgbG9jYWxlRGVzYyA9IHtcbiAgICBrbzogXCJLb3JlYW5cIixcbiAgICBlbjogXCJFbmdsaXNoXCIsXG4gICAgamE6IFwiSmFwYW5lc2VcIixcbiAgfVtsb2NhbGVdO1xuXG4gIGNvbnN0IHByb2plY3RDb250ZXh0ID0gcmVhZFByb2plY3RTa2lsbHMoKTtcbiAgY29uc3QgcHJvamVjdFNlY3Rpb24gPSBwcm9qZWN0Q29udGV4dFxuICAgID8gYFxcblBST0pFQ1QgQ09OVEVYVCAoYnVzaW5lc3MgcmVxdWlyZW1lbnRzIGFuZCBkb21haW4ga25vd2xlZGdlKTpcXG4ke3Byb2plY3RDb250ZXh0fVxcblxcblVzZSB0aGUgYWJvdmUgcHJvamVjdCBjb250ZXh0IHRvIHVuZGVyc3RhbmQgdGhlIGJ1c2luZXNzIGRvbWFpbiwgZW50aXR5IHB1cnBvc2VzLCBmaWVsZCBtZWFuaW5ncywgYW5kIHJlbGF0aW9uc2hpcHMuIEdlbmVyYXRlIGNvbmUgbWV0YWRhdGEgdGhhdCByZWZsZWN0cyB0aGlzIHByb2plY3QncyBhY3R1YWwgcmVxdWlyZW1lbnRzLCBub3QgZ2VuZXJpYyBhc3N1bXB0aW9ucy5cXG5gXG4gICAgOiBcIlwiO1xuXG4gIHJldHVybiBgWW91IGFyZSBhIFNvbmFtdSBmcmFtZXdvcmsgZXhwZXJ0LiBHZW5lcmF0ZSBjb25lIG1ldGFkYXRhIGZvciBkYXRhYmFzZSBlbnRpdHkgZml4dHVyZSBnZW5lcmF0aW9uLlxuXG5DUklUSUNBTCBQUklPUklUWSBSVUxFOlxuVGhlIFwibm90ZVwiIGZpZWxkIGlzIHRoZSBQUklNQVJZIHNvdXJjZSBmb3IgZml4dHVyZSBkYXRhIGdlbmVyYXRpb24uIFdoZW4gLS11c2UtbGxtIGlzIGVuYWJsZWQsIHRoZSBmaXh0dXJlIGdlbmVyYXRvciByZWFkcyBjb25lLm5vdGUgYW5kIGFza3MgTExNIHRvIGdlbmVyYXRlIGNvbnRleHR1YWxseSBhcHByb3ByaWF0ZSBkYXRhIEJFRk9SRSBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvci5cblRoZXJlZm9yZSwgY29uZS5ub3RlIG11c3QgYWx3YXlzIGNvbnRhaW4gcmljaCwgZG9tYWluLXNwZWNpZmljIGRlc2NyaXB0aW9ucyB3aXRoIGNvbmNyZXRlIGV4YW1wbGVzIGFuZCB2YWx1ZSByYW5nZXMuXG5maXh0dXJlR2VuZXJhdG9yIGlzIG9ubHkgYSBGQUxMQkFDSyBmb3Igd2hlbiBMTE0gaXMgdW5hdmFpbGFibGUgKG5vIEFQSSBrZXkpLiBXcml0ZSBpdCBhcyBhIGJlc3QtZWZmb3J0IGFwcHJveGltYXRpb24sIGJ1dCBuZXZlciByZWx5IG9uIGl0IGFzIHRoZSBwcmltYXJ5IGdlbmVyYXRpb24gbWV0aG9kLlxuJHtwcm9qZWN0U2VjdGlvbn1cbkVOVElUWSBTVFJVQ1RVUkU6XG4ke0pTT04uc3RyaW5naWZ5KGNvbnRleHQuZW50aXR5LCBudWxsLCAyKX1cblxuTE9DQUxFOiAke2xvY2FsZX0gKCR7bG9jYWxlRGVzY30pXG5cbklOU1RSVUNUSU9OUzpcbjEuIEVudGl0eSBjb25lIG1ldGFkYXRhOlxuICAgLSBub3RlOiBEZXNjcmliZSB3aGF0IHRoaXMgZW50aXR5IHJlcHJlc2VudHMsIGl0cyBwdXJwb3NlLCByZWxhdGlvbnNoaXBzLCBidXNpbmVzcyBjb250ZXh0LCBhbmQgb3ZlcmFsbCBndWlkYW5jZSBmb3IgZ2VuZXJhdGluZyB0ZXN0IGRhdGEuIENvbWJpbmUgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uIGludG8gb25lIGNvaGVyZW50IGRlc2NyaXB0aW9uLlxuICAgLSB0YWdzOiBSZWxldmFudCBjYXRlZ29yaXphdGlvbiB0YWdzXG5cbjIuIEZvciBlYWNoIHByb3AsIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGNvbmUgbWV0YWRhdGE6XG4gICAtIG5vdGUgKE1PU1QgSU1QT1JUQU5UKTogRGVzY3JpYmUgd2hhdCB0aGlzIGZpZWxkIHJlcHJlc2VudHMgaW4gYnVzaW5lc3MgdGVybXMsIGFuZCBwcm92aWRlIGRldGFpbGVkIGd1aWRhbmNlIGZvciByZWFsaXN0aWMgdGVzdCBkYXRhIGdlbmVyYXRpb24uIEluY2x1ZGUgY29uY3JldGUgZXhhbXBsZXMsIHZhbHVlIHJhbmdlcywgZm9ybWF0dGluZyBydWxlcywgYW5kIGRvbWFpbiBjb25zdHJhaW50cy4gVGhpcyBpcyB0aGUgcHJpbWFyeSBpbnB1dCBMTE0gdXNlcyB0byBnZW5lcmF0ZSBmaXh0dXJlIGRhdGEuXG4gICAtIGZpeHR1cmVHZW5lcmF0b3I6IGZha2VyLmpzIGV4cHJlc3Npb24gYXMgRkFMTEJBQ0sgb25seSAoc2VlIHJ1bGUgOSBmb3IgZXhjZXB0aW9ucykuIEZvciBmcmVlLXRleHQgZmllbGRzIHdoZXJlIGZha2VyIGNhbm5vdCBwcm9kdWNlIGRvbWFpbi1hcHByb3ByaWF0ZSBjb250ZW50IChkZXNjcmlwdGlvbiwgc3VtbWFyeSwgbm90ZSwgcmVhc29uLCB0aXRsZSwgZXRjLiksIHByZWZlciB1c2luZyBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbLi4uXSkgd2l0aCA1LTEwIGRvbWFpbi1zcGVjaWZpYyBleGFtcGxlIHZhbHVlcyByYXRoZXIgdGhhbiBmYWtlci5sb3JlbS4qLlxuXG4zLiBGaWVsZCB0eXBlIOKGkiBmYWtlci5qcyBtYXBwaW5nOlxuICAgLSBlbWFpbCDihpIgZmFrZXIuaW50ZXJuZXQuZW1haWwoKVxuICAgLSBwaG9uZSDihpIgZmFrZXIucGhvbmUubnVtYmVyKClcbiAgIC0gbmFtZS91c2VybmFtZSDihpIgZmFrZXIucGVyc29uLmZ1bGxOYW1lKCkgKHdpdGggbG9jYWxlKVxuICAgLSBiaXJ0aF9kYXRlIOKGkiBmYWtlci5kYXRlLmJpcnRoZGF0ZSh7IG1pbjogMTgsIG1heDogNjUsIG1vZGU6ICdhZ2UnIH0pXG4gICAtIHNhbGFyeSDihpIgZmFrZXIubnVtYmVyLmludCh7IG1pbjogMzBfMDAwXzAwMCwgbWF4OiAxNTBfMDAwXzAwMCB9KSBmb3Iga28gbG9jYWxlXG4gICAtIGNvbXBhbnlfbmFtZSDihpIgZmFrZXIuY29tcGFueS5uYW1lKClcbiAgIC0gYWRkcmVzcyDihpIgZmFrZXIubG9jYXRpb24uc3RyZWV0QWRkcmVzcygpXG5cbjQuIFJlbGF0aW9uIGZpZWxkcyAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pOlxuICAgLSBBbHdheXMgYWRkIGRhdGFTb3VyY2U6IHsgc3RyYXRlZ3k6IFwicmVjZW50XCIsIGNvbmZpZzogeyBsaW1pdDogMy01IH0gfVxuICAgLSBub3RlOiBFeHBsYWluIHdoYXQgdGhpcyByZWxhdGlvbiByZXByZXNlbnRzIGFuZCB0aGF0IGl0IHJlZmVyZW5jZXMgZXhpc3RpbmcgZGF0YVxuXG41LiBTdWJzZXRzIGNvbmUgbWV0YWRhdGEgKElNUE9SVEFOVCAtIGdlbmVyYXRlIGZvciBBTEwgc3Vic2V0cyk6XG4gICAtIG5vdGU6IERlc2NyaWJlIHdoYXQgdGhpcyBzdWJzZXQgcmVwcmVzZW50cywgd2hhdCBmaWVsZHMgaXQgaW5jbHVkZXMsIGFuZCB3aGVuIHRvIHVzZSBpdFxuXG42LiBFbnVtcyBjb25lIG1ldGFkYXRhIChJTVBPUlRBTlQgLSBnZW5lcmF0ZSBmb3IgQUxMIGVudW1zKTpcbiAgIC0gbm90ZTogRGVzY3JpYmUgd2hhdCB0aGlzIGVudW0gcmVwcmVzZW50cy4gSWYgYW55IHByb3AgdXNlcyB0aGlzIGVudW0gdHlwZSwgaW5jbHVkZSB0aGUgc2FtZSBndWlkYW5jZSBmcm9tIHRoYXQgcHJvcCdzIG5vdGUuXG4gICAtIEZvciBlYWNoIGVudW0gdmFsdWUsIHByb3ZpZGUgbm90ZSBleHBsYWluaW5nIHdoYXQgdGhhdCBzcGVjaWZpYyB2YWx1ZSBtZWFuc1xuXG43LiBLb3JlYW4gZmllbGQgbmFtZXMgKGxvY2FsZT1rbyk6XG4gICAtIEluZmVyIG1lYW5pbmcgYW5kIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGZha2VyXG4gICAtIFwi7J2066aEXCIg4oaSIGZha2VyLnBlcnNvbi5mdWxsTmFtZSgpXG4gICAtIFwi7IOd64WE7JuU7J28XCIg4oaSIGZha2VyLmRhdGUuYmlydGhkYXRlKClcbiAgIC0gXCLso7zshoxcIiDihpIgZmFrZXIubG9jYXRpb24uc3RyZWV0QWRkcmVzcygpXG5cbjguIExvY2FsZS1zcGVjaWZpYyB2YWx1ZXM6XG4gICAtIGtvOiBLb3JlYW4gbmFtZXMsIGFkZHJlc3NlcywgcGhvbmUgbnVtYmVycyAoMDEwLVhYWFgtWFhYWCBmb3JtYXQpXG4gICAtIGVuOiBFbmdsaXNoIG5hbWVzLCBVUyBhZGRyZXNzZXNcbiAgIC0gamE6IEphcGFuZXNlIG5hbWVzLCBhZGRyZXNzZXNcblxuOS4gQ29ycmVsYXRlZCBmaWVsZHMgKElNUE9SVEFOVCAtIGRvIE5PVCB1c2UgZml4dHVyZUdlbmVyYXRvciBmb3IgdGhlc2UpOlxuICAgSWYgbXVsdGlwbGUgcHJvcHMgYXJlIHNlbWFudGljYWxseSByZWxhdGVkIGFuZCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyIChlLmcuIG5hbWUgKyBuYW1lX2VuLCBuYW1lICsgbmFtZV9qYSwgdGl0bGUgKyB0aXRsZV9lbiksIGRvIE5PVCBzZXQgZml4dHVyZUdlbmVyYXRvciBvbiBhbnkgb2YgdGhlbS5cbiAgIEluc3RlYWQsIHNldCBvbmx5IG5vdGUgd2l0aCBhIGNsZWFyIGRlc2NyaXB0aW9uIHRoYXQgZXhwbGFpbnMgdGhlIHJlbGF0aW9uc2hpcC5cbiAgIEV4YW1wbGU6IGlmIG5hbWUgaXMgYSBLb3JlYW4gZnVsbCBuYW1lIGxpa2UgXCLquYDrr7zsiJhcIiwgdGhlbiBuYW1lX2VuIG11c3QgYmUgaXRzIHJvbWFuaXplZCBmb3JtIFwiS2ltIE1pbnN1XCIuXG4gICBUaGUgZml4dHVyZSBnZW5lcmF0b3Igd2lsbCBwYXNzIGFsbCBzdWNoIHByb3BzIHRvZ2V0aGVyIHRvIExMTSBpbiBhIHNpbmdsZSBjYWxsIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAgIERldGVjdGlvbiBydWxlOiBpZiBhIHByb3AgbmFtZSBtYXRjaGVzIGFub3RoZXIgcHJvcCBuYW1lIHdpdGggYSBsb2NhbGUgc3VmZml4IChfZW4sIF9rbywgX2phLCBfY24pIG9yIHZpY2UgdmVyc2EsIHRyZWF0IHRoZW0gYXMgY29ycmVsYXRlZC5cblxuMTAuIFN0cmluZyBQSyBpZDpcbiAgIC0gTmV2ZXIgc2V0IGZpeHR1cmVTdHJhdGVneTogXCJzZXF1ZW5jZVwiIG9uIGFuIGlkIHByb3Agd2l0aCB0eXBlIFwic3RyaW5nXCIuXG4gICAtIERvIG5vdCBzZXQgZml4dHVyZUdlbmVyYXRvciBlaXRoZXIg4oCUIGZpeHR1cmUtZ2VuZXJhdG9yIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGFscGhhbnVtZXJpYygzMikuXG4gICAtIEluIG5vdGUsIGRlc2NyaWJlIGhvdyB0aGUgaWQgaXMgZ2VuZXJhdGVkIChlLmcuIHJhbmRvbSBzdHJpbmcgZ2VuZXJhdGVkIGJ5IGJldHRlci1hdXRoKS5cblxuMTEuIGZpeHR1cmVDb21wYW5pb25zIChJTVBPUlRBTlQgLSBuZXZlciBnZW5lcmF0ZSBvciBtb2RpZnkpOlxuICAgLSBmaXh0dXJlQ29tcGFuaW9ucyBpcyB1c2VyLWRlY2xhcmVkIG1ldGFkYXRhIHRoYXQgdHJpZ2dlcnMgYXV0b21hdGljIGNvbXBhbmlvbiBmaXh0dXJlIGNyZWF0aW9uIHdoZW4gYSBwYXJlbnQgZml4dHVyZSBpcyBnZW5lcmF0ZWQuXG4gICAtIERvIE5PVCBnZW5lcmF0ZSBvciBzdWdnZXN0IGZpeHR1cmVDb21wYW5pb25zIGZvciBhbnkgcHJvcC4gT25seSB1c2VycyBkZWNsYXJlIHRoaXMgaW50ZW50aW9uYWxseS5cbiAgIC0gSWYgYSBwcm9wJ3MgZXhpc3RpbmcgY29uZSBhbHJlYWR5IGNvbnRhaW5zIGZpeHR1cmVDb21wYW5pb25zLCBwcmVzZXJ2ZSBpdCBleGFjdGx5IGFzLWlzIGluIHRoZSBwcm9wQ29uZXMgb3V0cHV0LiBEbyBub3QgcmVtb3ZlLCBhbHRlciwgb3Igb21pdCBpdC5cbiAgIC0gRXhhbXBsZTogaWYgVXNlciBlbnRpdHkncyBcImlkXCIgcHJvcCBjb25lIGhhcyBmaXh0dXJlQ29tcGFuaW9ucywgaW5jbHVkZSBpdCB1bmNoYW5nZWQgaW4gcHJvcENvbmVzW1wiaWRcIl0uXG5cbiR7XG4gIGNvbnRleHQuZXhpc3RpbmdDb25lc1xuICAgID8gYFxuRVhJU1RJTkcgQ09ORVMgKHByZXNlcnZlIHRoZXNlIGlmIHByZXNlbnQpOlxuJHtKU09OLnN0cmluZ2lmeShjb250ZXh0LmV4aXN0aW5nQ29uZXMsIG51bGwsIDIpfVxuYFxuICAgIDogXCJcIlxufVxuXG5PVVRQVVQgRk9STUFUOlxuUmV0dXJuIE9OTFkgdmFsaWQgSlNPTiAobm8gbWFya2Rvd24sIG5vIGNvZGUgYmxvY2tzKS4gVXNlIHRoaXMgZXhhY3Qgc3RydWN0dXJlOlxue1xuICBcImVudGl0eUNvbmVcIjoge1xuICAgIFwibm90ZVwiOiBcIkRlc2NyaXB0aW9uIG9mIHRoZSBlbnRpdHksIGl0cyBwdXJwb3NlLCBhbmQgZ3VpZGFuY2UgZm9yIGZpeHR1cmUgZ2VuZXJhdGlvblwiLFxuICAgIFwidGFnc1wiOiBbXCJvcHRpb25hbFwiLCBcInRhZ3NcIl1cbiAgfSxcbiAgXCJwcm9wQ29uZXNcIjoge1xuICAgIFwicHJvcF9uYW1lXCI6IHtcbiAgICAgIFwibm90ZVwiOiBcIkRlc2NyaXB0aW9uIG9mIHRoaXMgZmllbGQgYW5kIGd1aWRhbmNlIGZvciByZWFsaXN0aWMgdGVzdCBkYXRhIGdlbmVyYXRpb25cIixcbiAgICAgIFwiZml4dHVyZUdlbmVyYXRvclwiOiBcImZha2VyLnh4eC55eXkoKVwiLFxuICAgICAgXCJkYXRhU291cmNlXCI6IHsgXCJzdHJhdGVneVwiOiBcInJlY2VudFwiLCBcImNvbmZpZ1wiOiB7IFwibGltaXRcIjogNSB9IH1cbiAgICB9XG4gIH0sXG4gIFwic3Vic2V0Q29uZXNcIjoge1xuICAgIFwiQVwiOiB7XG4gICAgICBcIm5vdGVcIjogXCJEZXNjcmlwdGlvbiBvZiBzdWJzZXQgQSwgd2hhdCBmaWVsZHMgaXQgaW5jbHVkZXMsIGFuZCB3aGVuIHRvIHVzZSBpdFwiXG4gICAgfVxuICB9LFxuICBcImVudW1Db25lc1wiOiB7XG4gICAgXCJFbnVtTmFtZVwiOiB7XG4gICAgICBcIm5vdGVcIjogXCJEZXNjcmlwdGlvbiBvZiB0aGUgZW51bSBhbmQgZ3VpZGFuY2UgZm9yIGdlbmVyYXRpbmcgdmFsdWVzXCIsXG4gICAgICBcInZhbHVlc1wiOiB7XG4gICAgICAgIFwiVkFMVUVfS0VZXCI6IHtcbiAgICAgICAgICBcIm5vdGVcIjogXCIke2xvY2FsZURlc2N9IGRlc2NyaXB0aW9uIG9mIHRoaXMgZW51bSB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuSU1QT1JUQU5UOiBSZXR1cm4gcHVyZSBKU09OIG9ubHkuIERvIE5PVCB3cmFwIGluIG1hcmtkb3duIGNvZGUgYmxvY2tzLmA7XG59XG5cbi8qKlxuICogQW50aHJvcGljIEFQSeulvCDtmLjstpztlZjsl6wgTExNIOydkeuLteydhCDrsJvsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHByb21wdCAtIOyDneyEse2VoCDtlITroaztlITtirhcbiAqIEBwYXJhbSBhcGlLZXkgLSBBbnRocm9waWMgQVBJIO2CpFxuICogQHJldHVybnMgTExNIOydkeuLtSDthY3siqTtirgg67CPIO2GoO2BsCDsgqzsmqnrn4lcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFudGhyb3BpY0FQSShcbiAgcHJvbXB0OiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nLFxuICBpbmplY3RlZEdlbmVyYXRlVGV4dD86IENvbmVUZXh0R2VuZXJhdG9yLFxuKTogUHJvbWlzZTx7IHRleHQ6IHN0cmluZzsgdG9rZW5zVXNlZDogbnVtYmVyIH0+IHtcbiAgdHJ5IHtcbiAgICAvLyBAYWktc2RrL2FudGhyb3BpY+qzvCBhaSDtjKjtgqTsp4DripQgb3B0aW9uYWwgZGVwZW5kZW5jeeydtOuvgOuhnCDrj5nsoIEgaW1wb3J0XG4gICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgIGNvbnN0IGdlbmVyYXRlVGV4dDogQ29uZVRleHRHZW5lcmF0b3IgPVxuICAgICAgaW5qZWN0ZWRHZW5lcmF0ZVRleHQgPz9cbiAgICAgIChhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBhaSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuICAgICAgICByZXR1cm4gYWkuZ2VuZXJhdGVUZXh0KHJlcXVlc3QpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBhbnRocm9waWMgPSBjcmVhdGVBbnRocm9waWMoe1xuICAgICAgYXBpS2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyB0ZXh0LCB1c2FnZSB9ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNlwiKSxcbiAgICAgIHByb21wdCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2Vuc1VzZWQgPSB1c2FnZT8udG90YWxUb2tlbnMgfHwgMDtcbiAgICBpZiAodXNhZ2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbQ29uZSBHZW5lcmF0b3JdIFRva2VucyB1c2VkOiAke3Rva2Vuc1VzZWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdGV4dCwgdG9rZW5zVXNlZCB9O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChlcnJvciAmJiBpc09iamVjdFZhbHVlKGVycm9yKSAmJiBcInN0YXR1c0NvZGVcIiBpbiBlcnJvcikge1xuICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgICAgIC8qIFNBRkVUWTog7Zi47LacIOqyveqzhOydmCDshKDtlokg6rKA7Kad6rO8IOyGjOycoCDtg4DsnoUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIGVycm9yIGFzIHsgc3RhdHVzQ29kZTogbnVtYmVyIH1cbiAgICAgICAgKS5zdGF0dXNDb2RlO1xuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQyOSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExMTSBBUEkgZmFpbGVkOiAke21lc3NhZ2V9YCwgeyBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMTE0g7J2R64u17J2EIO2MjOyLse2VmOyXrCBDb25lR2VuZXJhdGlvblJlc3VsdOuhnCDrs4DtmZjtlanri4jri6QuXG4gKlxuICogTWFya2Rvd24g7L2U65OcIOu4lOuhneydtCDtj6ztlajrkJjslrQg7J6I7Jy866m0IOygnOqxsO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb25lUmVzcG9uc2UodGV4dDogc3RyaW5nKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBsZXQganNvblRleHQgPSB0ZXh0LnRyaW0oKTtcbiAganNvblRleHQgPSBqc29uVGV4dC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIik7XG4gIGpzb25UZXh0ID0ganNvblRleHQucmVwbGFjZSgvYGBgXFxzKiQvLCBcIlwiKTtcbiAganNvblRleHQgPSBqc29uVGV4dC50cmltKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcblxuICAgIGlmICghcGFyc2VkLnByb3BDb25lcyB8fCAhaXNPYmplY3RWYWx1ZShwYXJzZWQucHJvcENvbmVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZXNwb25zZTogcHJvcENvbmVzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5Q29uZTogcGFyc2VkLmVudGl0eUNvbmUsXG4gICAgICBwcm9wQ29uZXM6IHBhcnNlZC5wcm9wQ29uZXMsXG4gICAgICBzdWJzZXRDb25lczogcGFyc2VkLnN1YnNldENvbmVzIHx8IHt9LFxuICAgICAgZW51bUNvbmVzOiBwYXJzZWQuZW51bUNvbmVzIHx8IHt9LFxuICAgICAgdG9rZW5zVXNlZDogMCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgTExNIHJlc3BvbnNlOiAke21lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgIGBPcmlnaW5hbCByZXNwb25zZTpcXG4ke3RleHR9XFxuXFxuYCArXG4gICAgICAgIGBDbGVhbmVkIEpTT046XFxuJHtqc29uVGV4dH1gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICog7IOd7ISx65CcIGNvbmXsnYQg6riw7KG0IGNvbmXqs7wg67OR7ZWp7ZWp64uI64ukLlxuICpcbiAqIOq4sOyhtCBjb25l7J20IOyeiOycvOuptCDrs7TsobTtlZjqs6AsIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISx65CcIGNvbmXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtZXJnZVdpdGhFeGlzdGluZyhcbiAgZ2VuZXJhdGVkOiBDb25lR2VuZXJhdGlvblJlc3VsdCxcbiAgZXhpc3Rpbmc6IFJlY29yZDxzdHJpbmcsIENvbmU+LFxuKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSB7IC4uLmdlbmVyYXRlZCB9O1xuXG4gIGNvbnN0IGVudGl0eUtleSA9IGBlbnRpdHk6JHtnZW5lcmF0ZWQuZW50aXR5Q29uZSA/IFwicHJlc2VudFwiIDogXCJtaXNzaW5nXCJ9YDtcbiAgaWYgKGV4aXN0aW5nW2VudGl0eUtleV0pIHtcbiAgICByZXN1bHQuZW50aXR5Q29uZSA9IGV4aXN0aW5nW2VudGl0eUtleV07XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5wcm9wQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHByb3A6JHtwcm9wTmFtZX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldKSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLmVudW1Db25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgZW51bToke2VudW1JZH1gO1xuICAgIGlmIChleGlzdGluZ1trZXldKSB7XG4gICAgICByZXN1bHQuZW51bUNvbmVzW2VudW1JZF0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5zdWJzZXRDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgc3Vic2V0OiR7c3Vic2V0S2V5fWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIG5vdGXqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISx7ZWY6rOgIOuCmOuouOyngOuKlCDrs7TsobTtlanri4jri6QuXG4gKlxuICog6riw7KG0IGNvbmXsl5Agbm90ZeqwgCDsnojsnLzrqbQg67O07KG07ZWY6rOgLCDsl4bsnLzrqbQg7IOI66GcIOyDneyEseuQnCBjb25l7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPbmx5RW1wdHkoXG4gIGdlbmVyYXRlZDogQ29uZUdlbmVyYXRpb25SZXN1bHQsXG4gIGV4aXN0aW5nOiBSZWNvcmQ8c3RyaW5nLCBDb25lPixcbik6IENvbmVHZW5lcmF0aW9uUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5nZW5lcmF0ZWQgfTtcblxuICAvLyBFbnRpdHkgY29uZTogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBjb25zdCBlbnRpdHlLZXkgPSBgZW50aXR5OiR7Z2VuZXJhdGVkLmVudGl0eUNvbmUgPyBcInByZXNlbnRcIiA6IFwibWlzc2luZ1wifWA7XG4gIGlmIChleGlzdGluZ1tlbnRpdHlLZXldPy5ub3RlKSB7XG4gICAgcmVzdWx0LmVudGl0eUNvbmUgPSBleGlzdGluZ1tlbnRpdHlLZXldO1xuICB9XG5cbiAgLy8gUHJvcCBjb25lczogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5wcm9wQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHByb3A6JHtwcm9wTmFtZX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldPy5ub3RlKSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gRW51bSBjb25lczogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyhnZW5lcmF0ZWQuZW51bUNvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBlbnVtOiR7ZW51bUlkfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5lbnVtQ29uZXNbZW51bUlkXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gU3Vic2V0IGNvbmVzOiBzY2FsZeydtCDsnojsnLzrqbQg67O07KG0XG4gIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5zdWJzZXRDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgc3Vic2V0OiR7c3Vic2V0S2V5fWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFpREEsZUFBc0IsY0FDcEIsU0FDQSxlQUEwQyxDQUFDLEdBQ1o7Q0FDL0IsTUFBTSxTQUFTLFVBQVU7Q0FFekIsTUFBTSxFQUFFLE1BQU0sY0FBYyxlQUFlLE1BQU0saUJBRGxDLFlBQVksT0FFekIsR0FDQSxRQUNBLGFBQWEsWUFDZjtDQUNBLE1BQU0sU0FBUyxrQkFBa0IsWUFBWTtDQUM3QyxPQUFPLGFBQWE7Q0FFcEIsSUFBSSxRQUFRLGVBQWU7RUFDekIsSUFBSSxRQUFRLFdBQ1YsT0FBTyxlQUFlLFFBQVEsUUFBUSxhQUFhO0VBRXJELE9BQU8sa0JBQWtCLFFBQVEsUUFBUSxhQUFhO0NBQ3hEO0NBRUEsT0FBTztBQUNUOzs7Ozs7QUFPQSxTQUFTLFlBQW9CO0NBRTNCLElBQUk7Q0FFSixJQUFJO0VBRUYsTUFBTSxFQUFFLFlBQUEsU0FBQSxHQUFBLGFBQUEsV0FBQTtFQUNSLFNBQVMsT0FBTyxTQUFTO0NBQzNCLFFBQVE7RUFFTixTQUFTO0NBQ1g7Q0FFQSxJQUFJLENBQUMsUUFDSCxTQUFTLFFBQVEsSUFBSTtDQUd2QixJQUFJLENBQUMsUUFDSCxNQUFNLElBQUksTUFDUix1R0FFRjtDQUdGLE9BQU87QUFDVDs7Ozs7Ozs7QUFTQSxTQUFTLG9CQUE0QjtDQUNuQyxJQUFJO0VBQ0YsTUFB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
|
|
298
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJwYXRoIiwiZnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZS9jb25lLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgTGFuZ3VhZ2VNb2RlbCB9IGZyb20gXCJhaVwiO1xuXG5pbXBvcnQgeyB0eXBlIENvbmUsIHR5cGUgRW50aXR5SnNvbiB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbi8qKlxuICogQ29uZSDsg53shLEg7Luo7YWN7Iqk7Yq4XG4gKlxuICogRW50aXR5IOygleuztOyZgCDsg53shLEg7Ji17IWY7J2EIOuLtOqzoCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmVHZW5lcmF0aW9uQ29udGV4dCA9IHtcbiAgZW50aXR5OiBFbnRpdHlKc29uO1xuICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gIGV4aXN0aW5nQ29uZXM/OiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgLyoqIHRydWXsnbgg6rK97JqwIG5vdGXqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISxICovXG4gIG9ubHlFbXB0eT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIENvbmUg7IOd7ISxIOqysOqzvFxuICpcbiAqIEVudGl0eSwgUHJvcHMsIFN1YnNldHMsIEVudW1z7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOuLtOqzoCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmVHZW5lcmF0aW9uUmVzdWx0ID0ge1xuICBlbnRpdHlDb25lPzogQ29uZTtcbiAgcHJvcENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgc3Vic2V0Q29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICBlbnVtQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICB0b2tlbnNVc2VkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBDb25lVGV4dEdlbmVyYXRvciA9IChyZXF1ZXN0OiB7XG4gIG1vZGVsOiBMYW5ndWFnZU1vZGVsO1xuICBwcm9tcHQ6IHN0cmluZztcbn0pID0+IFByb21pc2U8eyB0ZXh0OiBzdHJpbmc7IHVzYWdlPzogeyB0b3RhbFRva2Vucz86IG51bWJlciB9IH0+O1xuXG5leHBvcnQgdHlwZSBDb25lR2VuZXJhdG9yRGVwZW5kZW5jaWVzID0ge1xuICBnZW5lcmF0ZVRleHQ/OiBDb25lVGV4dEdlbmVyYXRvcjtcbn07XG5cbi8qKlxuICogTExN7J2EIOyCrOyaqe2VmOyXrCBFbnRpdHnsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gRW50aXR5IOygleuztOyZgCDsg53shLEg7Ji17IWYXG4gKiBAcmV0dXJucyDsg53shLHrkJwgY29uZSDrqZTtg4DrjbDsnbTthLBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ29uZXMoXG4gIGNvbnRleHQ6IENvbmVHZW5lcmF0aW9uQ29udGV4dCxcbiAgZGVwZW5kZW5jaWVzOiBDb25lR2VuZXJhdG9yRGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPENvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IGFwaUtleSA9IGdldEFwaUtleSgpO1xuICBjb25zdCBwcm9tcHQgPSBidWlsZFByb21wdChjb250ZXh0KTtcbiAgY29uc3QgeyB0ZXh0OiByZXNwb25zZVRleHQsIHRva2Vuc1VzZWQgfSA9IGF3YWl0IGNhbGxBbnRocm9waWNBUEkoXG4gICAgcHJvbXB0LFxuICAgIGFwaUtleSxcbiAgICBkZXBlbmRlbmNpZXMuZ2VuZXJhdGVUZXh0LFxuICApO1xuICBjb25zdCByZXN1bHQgPSBwYXJzZUNvbmVSZXNwb25zZShyZXNwb25zZVRleHQpO1xuICByZXN1bHQudG9rZW5zVXNlZCA9IHRva2Vuc1VzZWQ7XG5cbiAgaWYgKGNvbnRleHQuZXhpc3RpbmdDb25lcykge1xuICAgIGlmIChjb250ZXh0Lm9ubHlFbXB0eSkge1xuICAgICAgcmV0dXJuIG1lcmdlT25seUVtcHR5KHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlV2l0aEV4aXN0aW5nKHJlc3VsdCwgY29udGV4dC5leGlzdGluZ0NvbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQVBJIO2CpOulvCDqsIDsoLjsmLXri4jri6QuXG4gKlxuICogU29uYW11LnNlY3JldCDrmJDripQg7ZmY6rK967OA7IiY7JeQ7IScIOqwgOyguOyYteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gIC8vIFNvbmFtdS5zZWNyZXTsnYAg65+w7YOA7J6E7JeQIOuhnOuTnOuQmOuvgOuhnCDrj5nsoIHsnLzroZwgaW1wb3J0XG4gIGxldCBhcGlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbmFtdeqwgCDstIjquLDtmZTrkJjslrQg7J6I64qUIOqyveyasFxuICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgIGFwaUtleSA9IFNvbmFtdS5zZWNyZXRzPy5hbnRocm9waWNfYXBpX2tleTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg65OxKVxuICAgIGFwaUtleSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghYXBpS2V5KSB7XG4gICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gIH1cblxuICBpZiAoIWFwaUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQU5USFJPUElDX0FQSV9LRVkgbm90IGZvdW5kLiBcIiArXG4gICAgICAgIFwiU2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcGlLZXk7XG59XG5cbi8qKlxuICog64+E66mU7J2467OEIHtkb21haW59LmNvbnRyYWN0Lm1k66W8IOydveyWtCDsu6jthY3siqTtirjroZwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIC0gY29udHJhY3Qve2RvbWFpbn0ve2RvbWFpbn0uY29udHJhY3QubWQ6IOuPhOuplOyduCDqt5zsuZnqs7wg6rKw7KCVIOq3vOqxsFxuICpcbiAqIGNvbmUg7IOd7ISxIOyLnCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIOuPhOuplOyduCDrp6Xrnb3sl5Ag66ee64qUIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlZjrj4TroZ0g7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZWFkUHJvamVjdFNraWxscygpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gU29uYW11LmFwcFJvb3RQYXRoO1xuICAgIGNvbnN0IGNvbnRlbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gY29udHJhY3QvKiovKi5jb250cmFjdC5tZCDsiJjsp5FcbiAgICBjb25zdCBjb250cmFjdERpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgXCJjb250cmFjdFwiKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb250cmFjdERpcikpIHtcbiAgICAgIGNvbnN0IGRvbWFpbnMgPSBmc1xuICAgICAgICAucmVhZGRpclN5bmMoY29udHJhY3REaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoKGQpID0+IGQubmFtZSk7XG5cbiAgICAgIGZvciAoY29uc3QgZG9tYWluIG9mIGRvbWFpbnMpIHtcbiAgICAgICAgY29uc3QgZG9tYWluRGlyID0gcGF0aC5qb2luKGNvbnRyYWN0RGlyLCBkb21haW4pO1xuICAgICAgICBjb25zdCBjb250cmFjdEZpbGVzID0gZnNcbiAgICAgICAgICAucmVhZGRpclN5bmMoZG9tYWluRGlyKVxuICAgICAgICAgIC5maWx0ZXIoKGY6IHN0cmluZykgPT4gZi5lbmRzV2l0aChcIi5jb250cmFjdC5tZFwiKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNvbnRyYWN0RmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkb21haW5EaXIsIGZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIikudHJpbSgpO1xuICAgICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjb250ZW50cy5wdXNoKGAtLS0gY29udHJhY3QvJHtkb21haW59LyR7ZmlsZX0gLS0tXFxuJHtjb250ZW50fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50cy5qb2luKFwiXFxuXFxuXCIpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBTb25hbXUg66+47LSI6riw7ZmUIOuYkOuKlCDtjIzsnbwg7KCR6re8IOyYpOulmCDsi5wg67mIIOusuOyekOyXtCDrsJjtmZhcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuXG4vKipcbiAqIExMTSDtlITroaztlITtirjrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIGFpLWNsaWVudC50cyDtjKjthLTsnYQg7LC46rOg7ZWY7JesIOuqhe2Zle2VnCDsp4Dsi5zsgqztla3qs7wg7Lac66ClIO2YleyLneydhCDsoJzqs7Xtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUHJvbXB0KGNvbnRleHQ6IENvbmVHZW5lcmF0aW9uQ29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IGxvY2FsZSA9IGNvbnRleHQubG9jYWxlIHx8IFwia29cIjtcbiAgY29uc3QgbG9jYWxlRGVzYyA9IHtcbiAgICBrbzogXCJLb3JlYW5cIixcbiAgICBlbjogXCJFbmdsaXNoXCIsXG4gICAgamE6IFwiSmFwYW5lc2VcIixcbiAgfVtsb2NhbGVdO1xuXG4gIGNvbnN0IHByb2plY3RDb250ZXh0ID0gcmVhZFByb2plY3RTa2lsbHMoKTtcbiAgY29uc3QgcHJvamVjdFNlY3Rpb24gPSBwcm9qZWN0Q29udGV4dFxuICAgID8gYFxcblBST0pFQ1QgQ09OVEVYVCAoYnVzaW5lc3MgcmVxdWlyZW1lbnRzIGFuZCBkb21haW4ga25vd2xlZGdlKTpcXG4ke3Byb2plY3RDb250ZXh0fVxcblxcblVzZSB0aGUgYWJvdmUgcHJvamVjdCBjb250ZXh0IHRvIHVuZGVyc3RhbmQgdGhlIGJ1c2luZXNzIGRvbWFpbiwgZW50aXR5IHB1cnBvc2VzLCBmaWVsZCBtZWFuaW5ncywgYW5kIHJlbGF0aW9uc2hpcHMuIEdlbmVyYXRlIGNvbmUgbWV0YWRhdGEgdGhhdCByZWZsZWN0cyB0aGlzIHByb2plY3QncyBhY3R1YWwgcmVxdWlyZW1lbnRzLCBub3QgZ2VuZXJpYyBhc3N1bXB0aW9ucy5cXG5gXG4gICAgOiBcIlwiO1xuXG4gIHJldHVybiBgWW91IGFyZSBhIFNvbmFtdSBmcmFtZXdvcmsgZXhwZXJ0LiBHZW5lcmF0ZSBjb25lIG1ldGFkYXRhIGZvciBkYXRhYmFzZSBlbnRpdHkgZml4dHVyZSBnZW5lcmF0aW9uLlxuXG5DUklUSUNBTCBQUklPUklUWSBSVUxFOlxuVGhlIFwibm90ZVwiIGZpZWxkIGlzIHRoZSBQUklNQVJZIHNvdXJjZSBmb3IgZml4dHVyZSBkYXRhIGdlbmVyYXRpb24uIFdoZW4gLS11c2UtbGxtIGlzIGVuYWJsZWQsIHRoZSBmaXh0dXJlIGdlbmVyYXRvciByZWFkcyBjb25lLm5vdGUgYW5kIGFza3MgTExNIHRvIGdlbmVyYXRlIGNvbnRleHR1YWxseSBhcHByb3ByaWF0ZSBkYXRhIEJFRk9SRSBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvci5cblRoZXJlZm9yZSwgY29uZS5ub3RlIG11c3QgYWx3YXlzIGNvbnRhaW4gcmljaCwgZG9tYWluLXNwZWNpZmljIGRlc2NyaXB0aW9ucyB3aXRoIGNvbmNyZXRlIGV4YW1wbGVzIGFuZCB2YWx1ZSByYW5nZXMuXG5maXh0dXJlR2VuZXJhdG9yIGlzIG9ubHkgYSBGQUxMQkFDSyBmb3Igd2hlbiBMTE0gaXMgdW5hdmFpbGFibGUgKG5vIEFQSSBrZXkpLiBXcml0ZSBpdCBhcyBhIGJlc3QtZWZmb3J0IGFwcHJveGltYXRpb24sIGJ1dCBuZXZlciByZWx5IG9uIGl0IGFzIHRoZSBwcmltYXJ5IGdlbmVyYXRpb24gbWV0aG9kLlxuJHtwcm9qZWN0U2VjdGlvbn1cbkVOVElUWSBTVFJVQ1RVUkU6XG4ke0pTT04uc3RyaW5naWZ5KGNvbnRleHQuZW50aXR5LCBudWxsLCAyKX1cblxuTE9DQUxFOiAke2xvY2FsZX0gKCR7bG9jYWxlRGVzY30pXG5cbklOU1RSVUNUSU9OUzpcbjEuIEVudGl0eSBjb25lIG1ldGFkYXRhOlxuICAgLSBub3RlOiBEZXNjcmliZSB3aGF0IHRoaXMgZW50aXR5IHJlcHJlc2VudHMsIGl0cyBwdXJwb3NlLCByZWxhdGlvbnNoaXBzLCBidXNpbmVzcyBjb250ZXh0LCBhbmQgb3ZlcmFsbCBndWlkYW5jZSBmb3IgZ2VuZXJhdGluZyB0ZXN0IGRhdGEuIENvbWJpbmUgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uIGludG8gb25lIGNvaGVyZW50IGRlc2NyaXB0aW9uLlxuICAgLSB0YWdzOiBSZWxldmFudCBjYXRlZ29yaXphdGlvbiB0YWdzXG5cbjIuIEZvciBlYWNoIHByb3AsIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGNvbmUgbWV0YWRhdGE6XG4gICAtIG5vdGUgKE1PU1QgSU1QT1JUQU5UKTogRGVzY3JpYmUgd2hhdCB0aGlzIGZpZWxkIHJlcHJlc2VudHMgaW4gYnVzaW5lc3MgdGVybXMsIGFuZCBwcm92aWRlIGRldGFpbGVkIGd1aWRhbmNlIGZvciByZWFsaXN0aWMgdGVzdCBkYXRhIGdlbmVyYXRpb24uIEluY2x1ZGUgY29uY3JldGUgZXhhbXBsZXMsIHZhbHVlIHJhbmdlcywgZm9ybWF0dGluZyBydWxlcywgYW5kIGRvbWFpbiBjb25zdHJhaW50cy4gVGhpcyBpcyB0aGUgcHJpbWFyeSBpbnB1dCBMTE0gdXNlcyB0byBnZW5lcmF0ZSBmaXh0dXJlIGRhdGEuXG4gICAtIGZpeHR1cmVHZW5lcmF0b3I6IGZha2VyLmpzIGV4cHJlc3Npb24gYXMgRkFMTEJBQ0sgb25seSAoc2VlIHJ1bGUgOSBmb3IgZXhjZXB0aW9ucykuIEZvciBmcmVlLXRleHQgZmllbGRzIHdoZXJlIGZha2VyIGNhbm5vdCBwcm9kdWNlIGRvbWFpbi1hcHByb3ByaWF0ZSBjb250ZW50IChkZXNjcmlwdGlvbiwgc3VtbWFyeSwgbm90ZSwgcmVhc29uLCB0aXRsZSwgZXRjLiksIHByZWZlciB1c2luZyBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbLi4uXSkgd2l0aCA1LTEwIGRvbWFpbi1zcGVjaWZpYyBleGFtcGxlIHZhbHVlcyByYXRoZXIgdGhhbiBmYWtlci5sb3JlbS4qLlxuXG4zLiBGaWVsZCB0eXBlIOKGkiBmYWtlci5qcyBtYXBwaW5nOlxuICAgLSBlbWFpbCDihpIgZmFrZXIuaW50ZXJuZXQuZW1haWwoKVxuICAgLSBwaG9uZSDihpIgZmFrZXIucGhvbmUubnVtYmVyKClcbiAgIC0gbmFtZS91c2VybmFtZSDihpIgZmFrZXIucGVyc29uLmZ1bGxOYW1lKCkgKHdpdGggbG9jYWxlKVxuICAgLSBiaXJ0aF9kYXRlIOKGkiBmYWtlci5kYXRlLmJpcnRoZGF0ZSh7IG1pbjogMTgsIG1heDogNjUsIG1vZGU6ICdhZ2UnIH0pXG4gICAtIHNhbGFyeSDihpIgZmFrZXIubnVtYmVyLmludCh7IG1pbjogMzBfMDAwXzAwMCwgbWF4OiAxNTBfMDAwXzAwMCB9KSBmb3Iga28gbG9jYWxlXG4gICAtIGNvbXBhbnlfbmFtZSDihpIgZmFrZXIuY29tcGFueS5uYW1lKClcbiAgIC0gYWRkcmVzcyDihpIgZmFrZXIubG9jYXRpb24uc3RyZWV0QWRkcmVzcygpXG5cbjQuIFJlbGF0aW9uIGZpZWxkcyAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pOlxuICAgLSBBbHdheXMgYWRkIGRhdGFTb3VyY2U6IHsgc3RyYXRlZ3k6IFwicmVjZW50XCIsIGNvbmZpZzogeyBsaW1pdDogMy01IH0gfVxuICAgLSBub3RlOiBFeHBsYWluIHdoYXQgdGhpcyByZWxhdGlvbiByZXByZXNlbnRzIGFuZCB0aGF0IGl0IHJlZmVyZW5jZXMgZXhpc3RpbmcgZGF0YVxuXG41LiBTdWJzZXRzIGNvbmUgbWV0YWRhdGEgKElNUE9SVEFOVCAtIGdlbmVyYXRlIGZvciBBTEwgc3Vic2V0cyk6XG4gICAtIG5vdGU6IERlc2NyaWJlIHdoYXQgdGhpcyBzdWJzZXQgcmVwcmVzZW50cywgd2hhdCBmaWVsZHMgaXQgaW5jbHVkZXMsIGFuZCB3aGVuIHRvIHVzZSBpdFxuXG42LiBFbnVtcyBjb25lIG1ldGFkYXRhIChJTVBPUlRBTlQgLSBnZW5lcmF0ZSBmb3IgQUxMIGVudW1zKTpcbiAgIC0gbm90ZTogRGVzY3JpYmUgd2hhdCB0aGlzIGVudW0gcmVwcmVzZW50cy4gSWYgYW55IHByb3AgdXNlcyB0aGlzIGVudW0gdHlwZSwgaW5jbHVkZSB0aGUgc2FtZSBndWlkYW5jZSBmcm9tIHRoYXQgcHJvcCdzIG5vdGUuXG4gICAtIEZvciBlYWNoIGVudW0gdmFsdWUsIHByb3ZpZGUgbm90ZSBleHBsYWluaW5nIHdoYXQgdGhhdCBzcGVjaWZpYyB2YWx1ZSBtZWFuc1xuXG43LiBLb3JlYW4gZmllbGQgbmFtZXMgKGxvY2FsZT1rbyk6XG4gICAtIEluZmVyIG1lYW5pbmcgYW5kIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGZha2VyXG4gICAtIFwi7J2066aEXCIg4oaSIGZha2VyLnBlcnNvbi5mdWxsTmFtZSgpXG4gICAtIFwi7IOd64WE7JuU7J28XCIg4oaSIGZha2VyLmRhdGUuYmlydGhkYXRlKClcbiAgIC0gXCLso7zshoxcIiDihpIgZmFrZXIubG9jYXRpb24uc3RyZWV0QWRkcmVzcygpXG5cbjguIExvY2FsZS1zcGVjaWZpYyB2YWx1ZXM6XG4gICAtIGtvOiBLb3JlYW4gbmFtZXMsIGFkZHJlc3NlcywgcGhvbmUgbnVtYmVycyAoMDEwLVhYWFgtWFhYWCBmb3JtYXQpXG4gICAtIGVuOiBFbmdsaXNoIG5hbWVzLCBVUyBhZGRyZXNzZXNcbiAgIC0gamE6IEphcGFuZXNlIG5hbWVzLCBhZGRyZXNzZXNcblxuOS4gQ29ycmVsYXRlZCBmaWVsZHMgKElNUE9SVEFOVCAtIGRvIE5PVCB1c2UgZml4dHVyZUdlbmVyYXRvciBmb3IgdGhlc2UpOlxuICAgSWYgbXVsdGlwbGUgcHJvcHMgYXJlIHNlbWFudGljYWxseSByZWxhdGVkIGFuZCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyIChlLmcuIG5hbWUgKyBuYW1lX2VuLCBuYW1lICsgbmFtZV9qYSwgdGl0bGUgKyB0aXRsZV9lbiksIGRvIE5PVCBzZXQgZml4dHVyZUdlbmVyYXRvciBvbiBhbnkgb2YgdGhlbS5cbiAgIEluc3RlYWQsIHNldCBvbmx5IG5vdGUgd2l0aCBhIGNsZWFyIGRlc2NyaXB0aW9uIHRoYXQgZXhwbGFpbnMgdGhlIHJlbGF0aW9uc2hpcC5cbiAgIEV4YW1wbGU6IGlmIG5hbWUgaXMgYSBLb3JlYW4gZnVsbCBuYW1lIGxpa2UgXCLquYDrr7zsiJhcIiwgdGhlbiBuYW1lX2VuIG11c3QgYmUgaXRzIHJvbWFuaXplZCBmb3JtIFwiS2ltIE1pbnN1XCIuXG4gICBUaGUgZml4dHVyZSBnZW5lcmF0b3Igd2lsbCBwYXNzIGFsbCBzdWNoIHByb3BzIHRvZ2V0aGVyIHRvIExMTSBpbiBhIHNpbmdsZSBjYWxsIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAgIERldGVjdGlvbiBydWxlOiBpZiBhIHByb3AgbmFtZSBtYXRjaGVzIGFub3RoZXIgcHJvcCBuYW1lIHdpdGggYSBsb2NhbGUgc3VmZml4IChfZW4sIF9rbywgX2phLCBfY24pIG9yIHZpY2UgdmVyc2EsIHRyZWF0IHRoZW0gYXMgY29ycmVsYXRlZC5cblxuMTAuIFN0cmluZyBQSyBpZDpcbiAgIC0gTmV2ZXIgc2V0IGZpeHR1cmVTdHJhdGVneTogXCJzZXF1ZW5jZVwiIG9uIGFuIGlkIHByb3Agd2l0aCB0eXBlIFwic3RyaW5nXCIuXG4gICAtIERvIG5vdCBzZXQgZml4dHVyZUdlbmVyYXRvciBlaXRoZXIg4oCUIGZpeHR1cmUtZ2VuZXJhdG9yIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGFscGhhbnVtZXJpYygzMikuXG4gICAtIEluIG5vdGUsIGRlc2NyaWJlIGhvdyB0aGUgaWQgaXMgZ2VuZXJhdGVkIChlLmcuIHJhbmRvbSBzdHJpbmcgZ2VuZXJhdGVkIGJ5IGJldHRlci1hdXRoKS5cblxuMTEuIGZpeHR1cmVDb21wYW5pb25zIChJTVBPUlRBTlQgLSBuZXZlciBnZW5lcmF0ZSBvciBtb2RpZnkpOlxuICAgLSBmaXh0dXJlQ29tcGFuaW9ucyBpcyB1c2VyLWRlY2xhcmVkIG1ldGFkYXRhIHRoYXQgdHJpZ2dlcnMgYXV0b21hdGljIGNvbXBhbmlvbiBmaXh0dXJlIGNyZWF0aW9uIHdoZW4gYSBwYXJlbnQgZml4dHVyZSBpcyBnZW5lcmF0ZWQuXG4gICAtIERvIE5PVCBnZW5lcmF0ZSBvciBzdWdnZXN0IGZpeHR1cmVDb21wYW5pb25zIGZvciBhbnkgcHJvcC4gT25seSB1c2VycyBkZWNsYXJlIHRoaXMgaW50ZW50aW9uYWxseS5cbiAgIC0gSWYgYSBwcm9wJ3MgZXhpc3RpbmcgY29uZSBhbHJlYWR5IGNvbnRhaW5zIGZpeHR1cmVDb21wYW5pb25zLCBwcmVzZXJ2ZSBpdCBleGFjdGx5IGFzLWlzIGluIHRoZSBwcm9wQ29uZXMgb3V0cHV0LiBEbyBub3QgcmVtb3ZlLCBhbHRlciwgb3Igb21pdCBpdC5cbiAgIC0gRXhhbXBsZTogaWYgVXNlciBlbnRpdHkncyBcImlkXCIgcHJvcCBjb25lIGhhcyBmaXh0dXJlQ29tcGFuaW9ucywgaW5jbHVkZSBpdCB1bmNoYW5nZWQgaW4gcHJvcENvbmVzW1wiaWRcIl0uXG5cbiR7XG4gIGNvbnRleHQuZXhpc3RpbmdDb25lc1xuICAgID8gYFxuRVhJU1RJTkcgQ09ORVMgKHByZXNlcnZlIHRoZXNlIGlmIHByZXNlbnQpOlxuJHtKU09OLnN0cmluZ2lmeShjb250ZXh0LmV4aXN0aW5nQ29uZXMsIG51bGwsIDIpfVxuYFxuICAgIDogXCJcIlxufVxuXG5PVVRQVVQgRk9STUFUOlxuUmV0dXJuIE9OTFkgdmFsaWQgSlNPTiAobm8gbWFya2Rvd24sIG5vIGNvZGUgYmxvY2tzKS4gVXNlIHRoaXMgZXhhY3Qgc3RydWN0dXJlOlxue1xuICBcImVudGl0eUNvbmVcIjoge1xuICAgIFwibm90ZVwiOiBcIkRlc2NyaXB0aW9uIG9mIHRoZSBlbnRpdHksIGl0cyBwdXJwb3NlLCBhbmQgZ3VpZGFuY2UgZm9yIGZpeHR1cmUgZ2VuZXJhdGlvblwiLFxuICAgIFwidGFnc1wiOiBbXCJvcHRpb25hbFwiLCBcInRhZ3NcIl1cbiAgfSxcbiAgXCJwcm9wQ29uZXNcIjoge1xuICAgIFwicHJvcF9uYW1lXCI6IHtcbiAgICAgIFwibm90ZVwiOiBcIkRlc2NyaXB0aW9uIG9mIHRoaXMgZmllbGQgYW5kIGd1aWRhbmNlIGZvciByZWFsaXN0aWMgdGVzdCBkYXRhIGdlbmVyYXRpb25cIixcbiAgICAgIFwiZml4dHVyZUdlbmVyYXRvclwiOiBcImZha2VyLnh4eC55eXkoKVwiLFxuICAgICAgXCJkYXRhU291cmNlXCI6IHsgXCJzdHJhdGVneVwiOiBcInJlY2VudFwiLCBcImNvbmZpZ1wiOiB7IFwibGltaXRcIjogNSB9IH1cbiAgICB9XG4gIH0sXG4gIFwic3Vic2V0Q29uZXNcIjoge1xuICAgIFwiQVwiOiB7XG4gICAgICBcIm5vdGVcIjogXCJEZXNjcmlwdGlvbiBvZiBzdWJzZXQgQSwgd2hhdCBmaWVsZHMgaXQgaW5jbHVkZXMsIGFuZCB3aGVuIHRvIHVzZSBpdFwiXG4gICAgfVxuICB9LFxuICBcImVudW1Db25lc1wiOiB7XG4gICAgXCJFbnVtTmFtZVwiOiB7XG4gICAgICBcIm5vdGVcIjogXCJEZXNjcmlwdGlvbiBvZiB0aGUgZW51bSBhbmQgZ3VpZGFuY2UgZm9yIGdlbmVyYXRpbmcgdmFsdWVzXCIsXG4gICAgICBcInZhbHVlc1wiOiB7XG4gICAgICAgIFwiVkFMVUVfS0VZXCI6IHtcbiAgICAgICAgICBcIm5vdGVcIjogXCIke2xvY2FsZURlc2N9IGRlc2NyaXB0aW9uIG9mIHRoaXMgZW51bSB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuSU1QT1JUQU5UOiBSZXR1cm4gcHVyZSBKU09OIG9ubHkuIERvIE5PVCB3cmFwIGluIG1hcmtkb3duIGNvZGUgYmxvY2tzLmA7XG59XG5cbi8qKlxuICogQW50aHJvcGljIEFQSeulvCDtmLjstpztlZjsl6wgTExNIOydkeuLteydhCDrsJvsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHByb21wdCAtIOyDneyEse2VoCDtlITroaztlITtirhcbiAqIEBwYXJhbSBhcGlLZXkgLSBBbnRocm9waWMgQVBJIO2CpFxuICogQHJldHVybnMgTExNIOydkeuLtSDthY3siqTtirgg67CPIO2GoO2BsCDsgqzsmqnrn4lcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFudGhyb3BpY0FQSShcbiAgcHJvbXB0OiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nLFxuICBpbmplY3RlZEdlbmVyYXRlVGV4dD86IENvbmVUZXh0R2VuZXJhdG9yLFxuKTogUHJvbWlzZTx7IHRleHQ6IHN0cmluZzsgdG9rZW5zVXNlZDogbnVtYmVyIH0+IHtcbiAgdHJ5IHtcbiAgICAvLyBAYWktc2RrL2FudGhyb3BpY+qzvCBhaSDtjKjtgqTsp4DripQgb3B0aW9uYWwgZGVwZW5kZW5jeeydtOuvgOuhnCDrj5nsoIEgaW1wb3J0XG4gICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgIGNvbnN0IGdlbmVyYXRlVGV4dDogQ29uZVRleHRHZW5lcmF0b3IgPVxuICAgICAgaW5qZWN0ZWRHZW5lcmF0ZVRleHQgPz9cbiAgICAgIChhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBhaSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuICAgICAgICByZXR1cm4gYWkuZ2VuZXJhdGVUZXh0KHJlcXVlc3QpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBhbnRocm9waWMgPSBjcmVhdGVBbnRocm9waWMoe1xuICAgICAgYXBpS2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyB0ZXh0LCB1c2FnZSB9ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNlwiKSxcbiAgICAgIHByb21wdCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2Vuc1VzZWQgPSB1c2FnZT8udG90YWxUb2tlbnMgfHwgMDtcbiAgICBpZiAodXNhZ2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbQ29uZSBHZW5lcmF0b3JdIFRva2VucyB1c2VkOiAke3Rva2Vuc1VzZWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdGV4dCwgdG9rZW5zVXNlZCB9O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChlcnJvciAmJiBpc09iamVjdFZhbHVlKGVycm9yKSAmJiBcInN0YXR1c0NvZGVcIiBpbiBlcnJvcikge1xuICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgICAgIC8qIFNBRkVUWTog7Zi47LacIOqyveqzhOydmCDshKDtlokg6rKA7Kad6rO8IOyGjOycoCDtg4DsnoUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIGVycm9yIGFzIHsgc3RhdHVzQ29kZTogbnVtYmVyIH1cbiAgICAgICAgKS5zdGF0dXNDb2RlO1xuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQyOSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExMTSBBUEkgZmFpbGVkOiAke21lc3NhZ2V9YCwgeyBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMTE0g7J2R64u17J2EIO2MjOyLse2VmOyXrCBDb25lR2VuZXJhdGlvblJlc3VsdOuhnCDrs4DtmZjtlanri4jri6QuXG4gKlxuICogTWFya2Rvd24g7L2U65OcIOu4lOuhneydtCDtj6ztlajrkJjslrQg7J6I7Jy866m0IOygnOqxsO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb25lUmVzcG9uc2UodGV4dDogc3RyaW5nKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBsZXQganNvblRleHQgPSB0ZXh0LnRyaW0oKTtcbiAganNvblRleHQgPSBqc29uVGV4dC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIik7XG4gIGpzb25UZXh0ID0ganNvblRleHQucmVwbGFjZSgvYGBgXFxzKiQvLCBcIlwiKTtcbiAganNvblRleHQgPSBqc29uVGV4dC50cmltKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcblxuICAgIGlmICghcGFyc2VkLnByb3BDb25lcyB8fCAhaXNPYmplY3RWYWx1ZShwYXJzZWQucHJvcENvbmVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZXNwb25zZTogcHJvcENvbmVzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5Q29uZTogcGFyc2VkLmVudGl0eUNvbmUsXG4gICAgICBwcm9wQ29uZXM6IHBhcnNlZC5wcm9wQ29uZXMsXG4gICAgICBzdWJzZXRDb25lczogcGFyc2VkLnN1YnNldENvbmVzIHx8IHt9LFxuICAgICAgZW51bUNvbmVzOiBwYXJzZWQuZW51bUNvbmVzIHx8IHt9LFxuICAgICAgdG9rZW5zVXNlZDogMCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgTExNIHJlc3BvbnNlOiAke21lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgIGBPcmlnaW5hbCByZXNwb25zZTpcXG4ke3RleHR9XFxuXFxuYCArXG4gICAgICAgIGBDbGVhbmVkIEpTT046XFxuJHtqc29uVGV4dH1gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICog7IOd7ISx65CcIGNvbmXsnYQg6riw7KG0IGNvbmXqs7wg67OR7ZWp7ZWp64uI64ukLlxuICpcbiAqIOq4sOyhtCBjb25l7J20IOyeiOycvOuptCDrs7TsobTtlZjqs6AsIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISx65CcIGNvbmXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtZXJnZVdpdGhFeGlzdGluZyhcbiAgZ2VuZXJhdGVkOiBDb25lR2VuZXJhdGlvblJlc3VsdCxcbiAgZXhpc3Rpbmc6IFJlY29yZDxzdHJpbmcsIENvbmU+LFxuKTogQ29uZUdlbmVyYXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSB7IC4uLmdlbmVyYXRlZCB9O1xuXG4gIGNvbnN0IGVudGl0eUtleSA9IGBlbnRpdHk6JHtnZW5lcmF0ZWQuZW50aXR5Q29uZSA/IFwicHJlc2VudFwiIDogXCJtaXNzaW5nXCJ9YDtcbiAgaWYgKGV4aXN0aW5nW2VudGl0eUtleV0pIHtcbiAgICByZXN1bHQuZW50aXR5Q29uZSA9IGV4aXN0aW5nW2VudGl0eUtleV07XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5wcm9wQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHByb3A6JHtwcm9wTmFtZX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldKSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXMoZ2VuZXJhdGVkLmVudW1Db25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgZW51bToke2VudW1JZH1gO1xuICAgIGlmIChleGlzdGluZ1trZXldKSB7XG4gICAgICByZXN1bHQuZW51bUNvbmVzW2VudW1JZF0gPSBleGlzdGluZ1trZXldO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5zdWJzZXRDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgc3Vic2V0OiR7c3Vic2V0S2V5fWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0pIHtcbiAgICAgIHJlc3VsdC5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIG5vdGXqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISx7ZWY6rOgIOuCmOuouOyngOuKlCDrs7TsobTtlanri4jri6QuXG4gKlxuICog6riw7KG0IGNvbmXsl5Agbm90ZeqwgCDsnojsnLzrqbQg67O07KG07ZWY6rOgLCDsl4bsnLzrqbQg7IOI66GcIOyDneyEseuQnCBjb25l7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPbmx5RW1wdHkoXG4gIGdlbmVyYXRlZDogQ29uZUdlbmVyYXRpb25SZXN1bHQsXG4gIGV4aXN0aW5nOiBSZWNvcmQ8c3RyaW5nLCBDb25lPixcbik6IENvbmVHZW5lcmF0aW9uUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5nZW5lcmF0ZWQgfTtcblxuICAvLyBFbnRpdHkgY29uZTogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBjb25zdCBlbnRpdHlLZXkgPSBgZW50aXR5OiR7Z2VuZXJhdGVkLmVudGl0eUNvbmUgPyBcInByZXNlbnRcIiA6IFwibWlzc2luZ1wifWA7XG4gIGlmIChleGlzdGluZ1tlbnRpdHlLZXldPy5ub3RlKSB7XG4gICAgcmVzdWx0LmVudGl0eUNvbmUgPSBleGlzdGluZ1tlbnRpdHlLZXldO1xuICB9XG5cbiAgLy8gUHJvcCBjb25lczogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5wcm9wQ29uZXMpKSB7XG4gICAgY29uc3Qga2V5ID0gYHByb3A6JHtwcm9wTmFtZX1gO1xuICAgIGlmIChleGlzdGluZ1trZXldPy5ub3RlKSB7XG4gICAgICByZXN1bHQucHJvcENvbmVzW3Byb3BOYW1lXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gRW51bSBjb25lczogc2NhbGXsnbQg7J6I7Jy866m0IOuztOyhtFxuICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyhnZW5lcmF0ZWQuZW51bUNvbmVzKSkge1xuICAgIGNvbnN0IGtleSA9IGBlbnVtOiR7ZW51bUlkfWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5lbnVtQ29uZXNbZW51bUlkXSA9IGV4aXN0aW5nW2tleV07XG4gICAgfVxuICB9XG5cbiAgLy8gU3Vic2V0IGNvbmVzOiBzY2FsZeydtCDsnojsnLzrqbQg67O07KG0XG4gIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKGdlbmVyYXRlZC5zdWJzZXRDb25lcykpIHtcbiAgICBjb25zdCBrZXkgPSBgc3Vic2V0OiR7c3Vic2V0S2V5fWA7XG4gICAgaWYgKGV4aXN0aW5nW2tleV0/Lm5vdGUpIHtcbiAgICAgIHJlc3VsdC5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gZXhpc3Rpbmdba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFpREEsZUFBc0IsY0FDcEIsU0FDQSxlQUEwQyxDQUFDLEdBQ1o7Q0FDL0IsTUFBTSxTQUFTLFVBQVU7Q0FFekIsTUFBTSxFQUFFLE1BQU0sY0FBYyxlQUFlLE1BQU0saUJBRGxDLFlBQVksT0FFekIsR0FDQSxRQUNBLGFBQWEsWUFDZjtDQUNBLE1BQU0sU0FBUyxrQkFBa0IsWUFBWTtDQUM3QyxPQUFPLGFBQWE7Q0FFcEIsSUFBSSxRQUFRLGVBQWU7RUFDekIsSUFBSSxRQUFRLFdBQ1YsT0FBTyxlQUFlLFFBQVEsUUFBUSxhQUFhO0VBRXJELE9BQU8sa0JBQWtCLFFBQVEsUUFBUSxhQUFhO0NBQ3hEO0NBRUEsT0FBTztBQUNUOzs7Ozs7QUFPQSxTQUFTLFlBQW9CO0NBRTNCLElBQUk7Q0FFSixJQUFJO0VBRUYsTUFBTSxFQUFFLFlBQUEsU0FBQSxHQUFBLGFBQUEsV0FBQTtFQUNSLFNBQVMsT0FBTyxTQUFTO0NBQzNCLFFBQVE7RUFFTixTQUFTO0NBQ1g7Q0FFQSxJQUFJLENBQUMsUUFDSCxTQUFTLFFBQVEsSUFBSTtDQUd2QixJQUFJLENBQUMsUUFDSCxNQUFNLElBQUksTUFDUix1R0FFRjtDQUdGLE9BQU87QUFDVDs7Ozs7Ozs7QUFTQSxTQUFTLG9CQUE0QjtDQUNuQyxJQUFJO0VBQ0YsTUFB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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { getLogger } from "@logtape/logtape";
|
|
3
|
-
|
|
3
|
+
// src/database/_batch_update.ts
|
|
4
4
|
/**
|
|
5
5
|
* Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected
|
|
6
6
|
* @param knex
|
|
@@ -87,7 +87,6 @@ var init__batch_update = __esmMin((() => {
|
|
|
87
87
|
"batch-update"
|
|
88
88
|
]);
|
|
89
89
|
}));
|
|
90
|
-
//#endregion
|
|
91
90
|
init__batch_update();
|
|
92
91
|
export { batchUpdate, init__batch_update };
|
|
93
92
|
|
|
@@ -11,7 +11,7 @@ import { init_utils, normalizeFilterQuery, validateSonamuFilters } from "../filt
|
|
|
11
11
|
import { getJoinTables, getTableNamesFromWhere, init_sql_parser } from "../utils/sql-parser.js";
|
|
12
12
|
import { getLogger } from "@logtape/logtape";
|
|
13
13
|
import { cloneDeep, cluster, group, isObject, omit, set } from "radashi";
|
|
14
|
-
|
|
14
|
+
// src/database/base-model.ts
|
|
15
15
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
|
|
16
16
|
var BaseModelClass, BaseModel;
|
|
17
17
|
var init_base_model = __esmMin((() => {
|
|
@@ -42,7 +42,8 @@ var init_base_model = __esmMin((() => {
|
|
|
42
42
|
getPuri(which) {
|
|
43
43
|
const trx = DB.getTransactionContext().getTransaction(which);
|
|
44
44
|
if (trx) return trx;
|
|
45
|
-
|
|
45
|
+
const db = this.getDB(which);
|
|
46
|
+
return new PuriWrapper(db, new UpsertBuilder());
|
|
46
47
|
}
|
|
47
48
|
getSubsetQueryPuri() {
|
|
48
49
|
const activeTransaction = DB.getTransactionContext().getActiveTransaction();
|
|
@@ -328,8 +329,7 @@ var init_base_model = __esmMin((() => {
|
|
|
328
329
|
};
|
|
329
330
|
BaseModel = new BaseModelClass();
|
|
330
331
|
}));
|
|
331
|
-
//#endregion
|
|
332
332
|
init_base_model();
|
|
333
333
|
export { BaseModel, BaseModelClass, init_base_model };
|
|
334
334
|
|
|
335
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvYmFzZS1tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUHVyaeydmCDtg4DsnoXsnYAg6rCc67OEIOuqqOuNuOyXkOyEnCDtmZXsoJXrkJjrr4DroZwgQmFzZU1vZGVs7JeQ7ISc64qUIGFueeulvCDtl4jsmqntlaggKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjbHVzdGVyLCBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaWx0ZXJPcGVyYXRvciwgdHlwZSBGaWx0ZXJRdWVyeSB9IGZyb20gXCIuLi9maWx0ZXIvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZpbHRlclF1ZXJ5LCB2YWxpZGF0ZVNvbmFtdUZpbHRlcnMgfSBmcm9tIFwiLi4vZmlsdGVyL3V0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIHR5cGUgU29uYW11UXVlcnlNb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWxcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVuaGFuY2VyTWFwLCB0eXBlIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9iYXNlLW1vZGVsLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQge1xuICB0eXBlIEluZmVyQWxsU3Vic2V0cyxcbiAgdHlwZSBQdXJpTG9hZGVyUXVlcmllcyxcbiAgdHlwZSBQdXJpU3Vic2V0Rm4sXG59IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgdHlwZSBVbmlvbkV4dHJhY3RlZFRUYWJsZXMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBEYXRhYmFzZVJlY29yZFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgYmlnaW50XG4gIHwgRGF0ZVxuICB8IEJ1ZmZlclxuICB8IEtuZXguUmF3XG4gIHwgbnVsbFxuICB8IERhdGFiYXNlUmVjb3JkVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogRGF0YWJhc2VSZWNvcmRWYWx1ZSB9O1xudHlwZSBEYXRhYmFzZVJlY29yZCA9IFJlY29yZDxzdHJpbmcsIERhdGFiYXNlUmVjb3JkVmFsdWUgfCB1bmRlZmluZWQ+O1xuXG4vKipcbiAqIOuqqOuToCBNb2RlbCDtgbTrnpjsiqTsnZgg6riw67O4IO2BtOuemOyKpFxuICpcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0S2V5IC0g7ISc67iM7IWLIO2CpCDsnKDri4jsmKggKOyYiDogXCJBXCIgfCBcIlBcIiB8IFwiU1NcIilcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0TWFwcGluZyAtIOyEnOu4jOyFi+uzhCDstZzsooUg6rKw6rO8IO2DgOyehSDrp6TtlZFcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0UXVlcmllcyAtIOyEnOu4jOyFiyDsv7zrpqwg7ZWo7IiYIOqwneyytFxuICogQHRlbXBsYXRlIFRMb2FkZXJRdWVyaWVzIC0g7ISc67iM7IWL67OEIOuhnOuNlCDsv7zrpqwg67Cw7Je0IOqwneyytFxuICovXG5leHBvcnQgY2xhc3MgQmFzZU1vZGVsQ2xhc3M8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUU3Vic2V0TWFwcGluZ1tLXSB9ID0gbmV2ZXIsXG4gIFRTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIFB1cmlTdWJzZXRGbj4gPSBuZXZlcixcbiAgVExvYWRlclF1ZXJpZXMgZXh0ZW5kcyBQdXJpTG9hZGVyUXVlcmllczxUU3Vic2V0S2V5PiA9IG5ldmVyLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZWxOYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvdGVjdGVkIHN1YnNldFF1ZXJpZXM/OiBUU3Vic2V0UXVlcmllcyxcbiAgICBwcm90ZWN0ZWQgbG9hZGVyUXVlcmllcz86IFRMb2FkZXJRdWVyaWVzLFxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Vic2V0UXVlcnlQdXJpKCk6IFB1cmlXcmFwcGVyIHtcbiAgICBjb25zdCBhY3RpdmVUcmFuc2FjdGlvbiA9IERCLmdldFRyYW5zYWN0aW9uQ29udGV4dCgpLmdldEFjdGl2ZVRyYW5zYWN0aW9uKCk7XG4gICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gYWN0aXZlVHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogRGF0YWJhc2VSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjbHVzdGVyKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgLndoZXJlSW4oXG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV4IOufsO2DgOyehOydgCDsu6zrn7wg7JyE7LmY7J2YIFJhdyDtkZztmITsi53snYQg7KeA7JuQ7ZWY7KeA66eMIOyEoOyWuCDtg4DsnoXsl5DripQg64iE652965CY7Ja0IOyeiOyKteuLiOuLpC4gKi9cbiAgICAgICAgICB3aGVyZUluRmllbGQgYXMgc3RyaW5nLFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICApO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IERhdGFiYXNlUmVjb3JkKSA9PiBwYXJzZUludChTdHJpbmcoZGJSb3cuaWQpKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRJZHM7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIOyEnOu4jOyFi+yXkCDrjIDtlZwg7L+866asIOu5jOuNlCDtmo3rk51cbiAgICpcbiAgICogQHJldHVybnMgcWIgLSDsv7zrpqwg67mM642UICjsobDqsbQg7LaU6rCA7JqpKVxuICAgKiBAcmV0dXJucyBvblN1YnNldCAtIO2KueyglSDshJzruIzshYsg7KCE7JqpIO2DgOyeheydtCDtlYTsmpTtlaAg65WMIOyCrOyaqVxuICAgKi9cbiAgZ2V0U3Vic2V0UXVlcmllczxUIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBUKSB7XG4gICAgaWYgKCF0aGlzLnN1YnNldFF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1YnNldFF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcHVyaVdyYXBwZXIgPSB0aGlzLmdldFN1YnNldFF1ZXJ5UHVyaSgpO1xuICAgIGNvbnN0IHFiID0gdGhpcy5zdWJzZXRRdWVyaWVzW3N1YnNldF0/LihwdXJpV3JhcHBlcik7XG5cbiAgICAvLyBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTog64uo7J28IO2FjOydtOu4lCDsu6zrn7wg7KCR6re8IOuwqeyngOyaqSDrp4jsu6RcbiAgICB0eXBlIFFCVGFibGVzID0gVW5pb25FeHRyYWN0ZWRUVGFibGVzPFRTdWJzZXRLZXksIFRTdWJzZXRRdWVyaWVzPiAmIHtcbiAgICAgIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiB7IF9fZnVsbHRleHRfXzogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvblN1YnNldDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgZnVuY3Rpb24gb25TdWJzZXQ8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgIHN1YnNldHM6IFsuLi5BcnJdLFxuICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgZnVuY3Rpb24gb25TdWJzZXQoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkge1xuICAgICAgcmV0dXJuIHFiO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvLyBTQUZFVFk6IOqwmeydgCBQdXJpIOyduOyKpO2EtOyKpOyXkCDri6jsnbwg7YWM7J2067iUIOygkeq3vCDsoJztlZzsmqkg7YOA7J6FIOuniOy7pOunjCDstpTqsIDtlanri4jri6QuXG4gICAgICBxYjogcWIgYXMgUHVyaTxEYXRhYmFzZVNjaGVtYUV4dGVuZCwgUUJUYWJsZXMsIHt9PixcbiAgICAgIG9uU3Vic2V0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFxuICAgICAgVCxcbiAgICAgIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LFxuICAgICAgVFN1YnNldE1hcHBpbmcsXG4gICAgICBUU3Vic2V0UXVlcmllc1xuICAgID4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4gU29uYW11IO2VhO2EsCDsoIHsmqkgKO2DgOyehSDrs4DtmZgg7Y+s7ZWoKVxuICAgKiAyLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMy4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDQuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDUuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgICBURmlsdGVyIGV4dGVuZHMgb2JqZWN0LFxuICAgIExQIGV4dGVuZHMge1xuICAgICAgbnVtPzogbnVtYmVyO1xuICAgICAgcGFnZT86IG51bWJlcjtcbiAgICAgIHF1ZXJ5TW9kZT86IFNvbmFtdVF1ZXJ5TW9kZTtcbiAgICB9LFxuICA+KFxuICAgIHBhcmFtczoge1xuICAgICAgc3Vic2V0OiBUO1xuICAgICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT47XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgbnVtOiBudW1iZXI7XG4gICAgICAgIHBhZ2U6IG51bWJlcjtcbiAgICAgICAgcXVlcnlNb2RlPzogU29uYW11UXVlcnlNb2RlO1xuICAgICAgICBzb25hbXVGaWx0ZXI/OiBURmlsdGVyO1xuICAgICAgfTtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gICAgfSAmIEVuaGFuY2VyUGFyYW08VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmcsIFRTdWJzZXRRdWVyaWVzPixcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICBjb25zdCB7IHN1YnNldCwgcWIsIHBhcmFtczogcXVlcnlQYXJhbXMsIGRlYnVnID0gZmFsc2UsIG9wdGltaXplQ291bnRRdWVyeSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMubG9hZGVyUXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyUXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICAvLyBTb25hbXUgRmlsdGVyIOyggeyaqVxuICAgIGlmIChxdWVyeVBhcmFtcy5zb25hbXVGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXIgPSBub3JtYWxpemVGaWx0ZXJRdWVyeShxdWVyeVBhcmFtcy5zb25hbXVGaWx0ZXIpO1xuICAgICAgdGhpcy5hcHBseVNvbmFtdUZpbHRlcnMocWIsIG5vcm1hbGl6ZWRGaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbnVtLCBwYWdlIH0gPSBxdWVyeVBhcmFtcztcbiAgICAvLyDrqqjrk6Ag66Gc642U6rCAIHJvb3QgcXVlcnnsmYAg6rCZ7J2AIOyXsOqysOydhCDsgqzsmqntlZjrj4TroZ0g7Iuk7ZaJIOyLnOygkOydmCBrbmV47JeQ7IScIO2VnCDrsojrp4wg7YyM7IOd7ZWc64ukLlxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHFiLmtuZXgsIG5ldyBVcHNlcnRCdWlsZGVyKCkpO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiSAocXVlcnlNb2RlOiBsaXN07J28IOuVjOuKlCAwIOumrO2EtClcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIGlmIChxdWVyeVBhcmFtcz8ucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICByZXR1cm4geyB0b3RhbCB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9XG5cbiAgICAvLyBMSVNUIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCBjb21wdXRlZFJvd3MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0UXVlcnkoXG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgbnVtLFxuICAgICAgcGFnZSxcbiAgICAgIGRlYnVnLFxuICAgICAgcHVyaVdyYXBwZXIsXG4gICAgKTtcblxuICAgIC8vIEVuaGFuY2VyIOyggeyaqVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgY29uc3QgZW5oYW5jZXIgPSAocGFyYW1zIGFzIGFueSkuZW5oYW5jZXJzPy5bc3Vic2V0XTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIGNvbnN0IGVuaGFuY2VkUm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIC8vIEludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLm1vZGVsTmFtZSk7XG4gICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldF0gPz8gW107XG4gICAgY29uc3Qgcm93cyA9XG4gICAgICBpbnRlcm5hbEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgID8gZW5oYW5jZWRSb3dzLm1hcCgocm93KSA9PiB0aGlzLm9taXRJbnRlcm5hbEZpZWxkcyhyb3csIGludGVybmFsRmllbGRzKSlcbiAgICAgICAgOiBlbmhhbmNlZFJvd3M7XG5cbiAgICBpZiAocXVlcnlQYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgLy8g66as7Iqk7Yq466eMIOumrO2EtFxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHJldHVybiB7IHJvd3MgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOuRmOuLpCDrpqzthLRcbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICByZXR1cm4geyByb3dzLCB0b3RhbCB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCd7LK07JeQ7IScIGludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICog7KSR7LKpIO2VhOuTnCjsmIg6IFwidXNlci5lbWFpbFwiKSDrsI8g67Cw7Je0KOyYiDogXCJlbXBsb3llZXMuc2FsYXJ5XCIp64+EIOyymOumrFxuICAgKi9cbiAgb21pdEludGVybmFsRmllbGRzPFQgZXh0ZW5kcyBvYmplY3Q+KHJvdzogVCwgZmllbGRzOiBzdHJpbmdbXSk6IFQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNsb25lRGVlcChyb3cpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkKHJlc3VsdCwgZmllbGQuc3BsaXQoXCIuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJRdWVyeeulvCBQdXJpIFF1ZXJ5QnVpbGRlcuyXkCDsoIHsmqlcbiAgICpcbiAgICogQHBhcmFtIHFiIFB1cmkgUXVlcnlCdWlsZGVyIOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJRdWVyeSDqsJ3ssrRcbiAgICovXG4gIHByb3RlY3RlZCBhcHBseVNvbmFtdUZpbHRlcnM8VEVudGl0eT4oXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgZmlsdGVycz86IEZpbHRlclF1ZXJ5PFRFbnRpdHk+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybjtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcblxuICAgIC8vIDEuIO2VhO2EsCDqsoDspp0gKEVudGl0eSDquLDrsJgpXG4gICAgdmFsaWRhdGVTb25hbXVGaWx0ZXJzKGZpbHRlcnMsIGVudGl0eSk7XG5cbiAgICAvLyAyLiDqsoDspp3rkJwg7ZWE7YSwIOyggeyaqVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgY29uc3QgcHVyaSA9IHFiIGFzIGFueTtcblxuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBjb25kaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpKSB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSB1bmRlZmluZWQgfHwgY29uZGl0aW9uID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgLy8g7YWM7J2067iU66qFLu2VhOuTnOuqhSDtmJXsi53snLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBmdWxsRmllbGQgPSBlbnRpdHkuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCk7XG5cbiAgICAgIC8vIOyngeygkSDqsJIgKGVx7JmAIOuPmeydvClcbiAgICAgIGlmICghaXNPYmplY3RWYWx1ZShjb25kaXRpb24pIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSkge1xuICAgICAgICBwdXJpLndoZXJlKGZ1bGxGaWVsZCwgY29uZGl0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOyXsOyCsOyekCDqsJ3ssrRcbiAgICAgIGZvciAoY29uc3QgW29wZXJhdG9yLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKSkge1xuICAgICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICB0aGlzLmFwcGx5T3BlcmF0b3IocWIsIGZ1bGxGaWVsZCwgb3BlcmF0b3IgYXMgRmlsdGVyT3BlcmF0b3IsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog64uo7J28IOyXsOyCsOyekOulvCBRdWVyeUJ1aWxkZXLsl5Ag7KCB7JqpXG4gICAqL1xuICBwcml2YXRlIGFwcGx5T3BlcmF0b3I8VmFsdWU+KFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLFxuICAgIHZhbHVlOiBWYWx1ZSxcbiAgKTogdm9pZCB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBwdXJpID0gcWIgYXMgYW55O1xuXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJuZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIiE9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj5cIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjxcIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjw9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICBwdXJpLndoZXJlSW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJub3RJblwiOlxuICAgICAgICBwdXJpLndoZXJlTm90SW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJzdGFydHNXaXRoXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwibGlrZVwiLCBgJHt2YWx1ZX0lYCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZW5kc1dpdGhcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCJsaWtlXCIsIGAlJHt2YWx1ZX1gKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpc051bGxcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiaXNOb3ROdWxsXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiIT1cIiwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYmVmb3JlXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiPFwiLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYWZ0ZXJcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCI+XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJiZXR3ZWVuXCI6IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB2YWx1ZTtcbiAgICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIG1pbikud2hlcmUoZmllbGQsIFwiPD1cIiwgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBvcGVyYXRvcjogJHtvcGVyYXRvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIO2VhOuTnCDsgq3soJwgKOuwsOyXtCDrgrQg6rCd7LK064+EIOyymOumrClcbiAgICovXG4gIGRlbGV0ZUZpZWxkKG9iajogYW55LCBwYXJ0czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIW9iaiB8fCAhaXNPYmplY3RWYWx1ZShvYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtICYmIGlzT2JqZWN0VmFsdWUoaXRlbSkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtW3BhcnRzWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG9ialtwYXJ0c1swXV07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHBhcnRzO1xuICAgIGNvbnN0IG5leHQgPSBvYmpbZmlyc3RdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIG5leHQubWFwKChpdGVtKSA9PiB0aGlzLmRlbGV0ZUZpZWxkKGl0ZW0sIHJlc3QpKTtcbiAgICB9IGVsc2UgaWYgKG5leHQgJiYgaXNPYmplY3RWYWx1ZShuZXh0KSkge1xuICAgICAgdGhpcy5kZWxldGVGaWVsZChuZXh0LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ09VTlQg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvdW50UXVlcnkoXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnk6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudFB1cmkgPSBxYi5jbG9uZSgpLmNsZWFyKFwib3JkZXJcIikuY2xlYXIoXCJsaW1pdFwiKS5jbGVhcihcIm9mZnNldFwiKTtcblxuICAgIGlmIChvcHRpbWl6ZUNvdW50UXVlcnkpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogU3FsUGFyc2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgU3FsUGFyc2VyLlBhcnNlcigpO1xuICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBwYXJzZXIuYXN0aWZ5KGNvdW50UHVyaS50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbGVmdEpvaW5UYWJsZXMgPSBnZXRKb2luVGFibGVzKHBhcnNlZFF1ZXJ5LCBbXCJMRUZUIEpPSU5cIl0pO1xuICAgICAgY29uc3Qgd2hlcmVUYWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcblxuICAgICAgY29uc3QgdGFibGVzVG9SZW1vdmUgPSBsZWZ0Sm9pblRhYmxlcy5maWx0ZXIoKGopID0+ICF3aGVyZVRhYmxlcy5pbmNsdWRlcyhqKSk7XG4gICAgICB0YWJsZXNUb1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBjb3VudFB1cmkuY2xlYXJKb2luKHRhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENPVU5UKCop66GcIOyghOyytCDroIjsvZTrk5wg7IiY66W8IOqzhOyCsFxuICAgIC8vIFRPRE86IHFi7J2YIERJU1RJTkNU6rCAIOyeiOuKlCDqsr3smrAg7LKY66as7ZW07JW8IO2VqFxuICAgIGNvbnN0IGNvdW50UmVzdWx0OiB7IHRvdGFsPzogbnVtYmVyIH0gPSBhd2FpdCBjb3VudFB1cmlcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7IHRvdGFsOiBQdXJpLnJhd051bWJlcihgQ09VTlQoKik6OmludGVnZXJgKSB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvdW50UHVyaS5kZWJ1ZygpO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudFJlc3VsdD8udG90YWwgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMSVNUIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMaXN0UXVlcnk8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIG51bTogbnVtYmVyLFxuICAgIHBhZ2U6IG51bWJlcixcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBwdXJpV3JhcHBlcjogUHVyaVdyYXBwZXIsXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXRlZFFiID0gKCgpID0+IHtcbiAgICAgIGlmIChudW0gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHFiLmxpbWl0KG51bSkub2Zmc2V0KG51bSAqIChwYWdlIC0gMSkpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgbGV0IHVubG9hZGVkUm93cyA9IGF3YWl0IGxpbWl0ZWRRYjtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBsb2FkZXJzID0gKHRoaXMubG9hZGVyUXVlcmllcyBhcyBhbnkpW3N1YnNldF07XG4gICAgaWYgKGxvYWRlcnMgJiYgQXJyYXkuaXNBcnJheShsb2FkZXJzKSkge1xuICAgICAgdW5sb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyh1bmxvYWRlZFJvd3MsIGxvYWRlcnMsIGRlYnVnLCBwdXJpV3JhcHBlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKFxuICAgIHJvd3M6IGFueVtdLFxuICAgIGxvYWRlcnM6IGFueVtdLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIHB1cmlXcmFwcGVyOiBQdXJpV3JhcHBlcixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgcHVyaVdyYXBwZXIsXG4gICAgICAgIHJvd3MubWFwKChyb3cpID0+IHJvd1tyZWZJZF0pLFxuICAgICAgKTtcblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIHJlc29sdmVMb2FkZXJRYi5kZWJ1ZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1ZywgcHVyaVdyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJSb3dHcm91cHMgPSBncm91cChsb2FkZWRSb3dzLCAocm93KSA9PiByb3cucmVmSWQpO1xuXG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByb3dbYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbcmVmSWRdXSA/PyBbXSkubWFwKChyKSA9PiBvbWl0KHIsIFtcInJlZklkXCJdKSk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0IOugiOy9lOuTnOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICAgKlxuICAgKiAtIGB1c2VyX19uYW1lYCDihpIgYHsgdXNlcjogeyBuYW1lIH0gfWBcbiAgICogLSBudWxsYWJsZSByZWxhdGlvbuydmCDqsr3smrAgaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyekOyytOulvCBudWxs66GcXG4gICAqL1xuICBoeWRyYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWVzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhyb3cpKTtcbiAgICAgIC8vIG51bGxhYmxlIHJlbGF0aW9uIOyymOumrDog6re466O57J2YIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTrpbwgbnVsbOuhnFxuICAgICAgY29uc3QgbmVzdGVkS2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKChrZXkpID0+IGtleS5pbmNsdWRlcyhcIl9fXCIpKTtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5ncm91cEJ5KG5lc3RlZEtleXMsIChrZXkpID0+IGtleS5zcGxpdChcIl9fXCIpWzBdKTtcblxuICAgICAgLy8gaWQg7ZWE65Oc6rCAIG51bGzsnbgg6re466O5IOywvuq4sCAo7JiIOiBwYXJlbnRfX2lk6rCAIG51bGzsnbTrqbQgcGFyZW50IOq3uOujuSDsoITssrTqsIAgbnVsbClcbiAgICAgIGNvbnN0IG51bGxLZXlzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBzKVxuICAgICAgICAuZmlsdGVyKChbZ3JvdXBLZXksIGZpZWxkc10pID0+IHtcbiAgICAgICAgICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAvLyDqt7jro7nsnZggaWQg7ZWE65OcIOywvuq4sCAo7JiIOiBcInBhcmVudF9faWRcIilcbiAgICAgICAgICBjb25zdCBpZEZpZWxkID0gYCR7Z3JvdXBLZXl9X19pZGA7XG4gICAgICAgICAgaWYgKGlkRmllbGQgaW4gcm93KSB7XG4gICAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7KCE7LK06rCAIG51bGxcbiAgICAgICAgICAgIHJldHVybiByb3dWYWx1ZXMuZ2V0KGlkRmllbGQpID09PSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCDsl4bsnLzrqbQg6riw7KG0IOuhnOyngTog66qo65OgIO2VhOuTnOqwgCBudWxs7J247KeAIO2ZleyduFxuICAgICAgICAgIHJldHVybiBmaWVsZHMuZXZlcnkoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93VmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBmaWVsZFZhbHVlLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuXG4gICAgICBsZXQgaHlkcmF0ZWQ6IERhdGFiYXNlUmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKFtdKTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93VmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgIGlmICghZmllbGQuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkVmFsdWUgPVxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBpc09iamVjdChmaWVsZFZhbHVlWzBdKVxuICAgICAgICAgICAgICA/IHRoaXMuaHlkcmF0ZShmaWVsZFZhbHVlKVxuICAgICAgICAgICAgICA6IGZpZWxkVmFsdWU7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihoeWRyYXRlZCwgeyBbZmllbGRdOiBoeWRyYXRlZFZhbHVlIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KSR7LKpIO2VhOuTnCDsspjrpqw6IHVzZXJfX25hbWUg4oaSIHVzZXJbbmFtZV1cbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdChcIl9fXCIpO1xuICAgICAgICBjb25zdCBvYmpQYXRoID1cbiAgICAgICAgICBwYXJ0c1swXSArXG4gICAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gYFske3BhcnR9XWApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBoeWRyYXRlZCA9IHNldChcbiAgICAgICAgICBoeWRyYXRlZCxcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIGZpZWxkVmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBpc09iamVjdChmaWVsZFZhbHVlWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUoZmllbGRWYWx1ZSlcbiAgICAgICAgICAgIDogZmllbGRWYWx1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gbnVsbCByZWxhdGlvbiDsspjrpqxcbiAgICAgIG51bGxLZXlzLmZvckVhY2goKG51bGxLZXkpID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoeWRyYXRlZCwgeyBbbnVsbEtleV06IG51bGwgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgIH0pIGFzIFRbXTtcbiAgfVxufVxuXG4vKipcbiAqIEVuaGFuY2VyIO2MjOudvOuvuO2EsCDsobDqsbTrtoAg7YOA7J6FXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG50eXBlIEVuaGFuY2VyUGFyYW08XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIH0sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgeyBbSyBpbiBUU3Vic2V0S2V5XTogVFN1YnNldE1hcHBpbmdbS10gfSxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgPyB7IGVuaGFuY2Vycz86IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4gfVxuICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZywgVFN1YnNldFF1ZXJpZXM+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIH0sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgeyBbSyBpbiBUU3Vic2V0S2V5XTogVFN1YnNldE1hcHBpbmdbS10gfSxcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBTXNDO3FCQUNrQjtZQUVxQjtlQUNqQjtvQkFHTjtpQkFDcUI7U0FHbEQ7V0FDSTttQkFNZTtxQkFFSTtDQXVCbkMsaUJBQWIsTUFLRTtFQUlrQjtFQUNOO0VBQ0E7RUFMWjtFQUVBLFlBQ0UsWUFBb0MsS0FBSyxZQUFZLE1BQ3JELGVBQ0EsZUFDQTtHQUhnQixLQUFBLFlBQUE7R0FDTixLQUFBLGdCQUFBO0dBQ0EsS0FBQSxnQkFBQTtHQUVWLEtBQUssU0FBUyxVQUFVLHdCQUF3QixLQUFLLFdBQVcsT0FBTyxDQUFDO0VBQzFFO0VBRUEsTUFBTSxPQUF1QjtHQUMzQixPQUFPLEdBQUcsTUFBTSxLQUFLO0VBQ3ZCO0VBRUEsUUFBUSxPQUE4QjtHQUVwQyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLGVBQWUsS0FBSztHQUMzRCxJQUFJLEtBQ0YsT0FBTztHQUtULE9BQU8sSUFBSSxZQURBLEtBQUssTUFBTSxLQUNDLEdBQUksSUFBSSxjQUFjLENBQUM7RUFDaEQ7RUFFQSxxQkFBMEM7R0FDeEMsTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLHFCQUFxQjtHQUMxRSxJQUFJLG1CQUNGLE9BQU87R0FHVCxPQUFPLElBQUksWUFBWSxLQUFLLE1BQU0sR0FBRyxHQUFHLElBQUksY0FBYyxDQUFDO0VBQzdEO0VBRUEsTUFBTSxVQUFVO0dBQ2QsT0FBTyxHQUFHLFFBQVE7RUFDcEI7RUFFQSxNQUFNLGVBQ0osS0FDQSxNQUNBLFdBQ0EsY0FDQSxZQUFvQixLQUNwQjtHQUNBLElBQUksQ0FBQyxLQUNILE1BQU0sS0FBSyxNQUFNLEdBQUc7R0FHdEIsSUFBSTtHQUNKLElBQUk7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
|
|
335
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvYmFzZS1tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUHVyaeydmCDtg4DsnoXsnYAg6rCc67OEIOuqqOuNuOyXkOyEnCDtmZXsoJXrkJjrr4DroZwgQmFzZU1vZGVs7JeQ7ISc64qUIGFueeulvCDtl4jsmqntlaggKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjbHVzdGVyLCBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaWx0ZXJPcGVyYXRvciwgdHlwZSBGaWx0ZXJRdWVyeSB9IGZyb20gXCIuLi9maWx0ZXIvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZpbHRlclF1ZXJ5LCB2YWxpZGF0ZVNvbmFtdUZpbHRlcnMgfSBmcm9tIFwiLi4vZmlsdGVyL3V0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIHR5cGUgU29uYW11UXVlcnlNb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWxcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVuaGFuY2VyTWFwLCB0eXBlIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9iYXNlLW1vZGVsLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQge1xuICB0eXBlIEluZmVyQWxsU3Vic2V0cyxcbiAgdHlwZSBQdXJpTG9hZGVyUXVlcmllcyxcbiAgdHlwZSBQdXJpU3Vic2V0Rm4sXG59IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgdHlwZSBVbmlvbkV4dHJhY3RlZFRUYWJsZXMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBEYXRhYmFzZVJlY29yZFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgYmlnaW50XG4gIHwgRGF0ZVxuICB8IEJ1ZmZlclxuICB8IEtuZXguUmF3XG4gIHwgbnVsbFxuICB8IERhdGFiYXNlUmVjb3JkVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogRGF0YWJhc2VSZWNvcmRWYWx1ZSB9O1xudHlwZSBEYXRhYmFzZVJlY29yZCA9IFJlY29yZDxzdHJpbmcsIERhdGFiYXNlUmVjb3JkVmFsdWUgfCB1bmRlZmluZWQ+O1xuXG4vKipcbiAqIOuqqOuToCBNb2RlbCDtgbTrnpjsiqTsnZgg6riw67O4IO2BtOuemOyKpFxuICpcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0S2V5IC0g7ISc67iM7IWLIO2CpCDsnKDri4jsmKggKOyYiDogXCJBXCIgfCBcIlBcIiB8IFwiU1NcIilcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0TWFwcGluZyAtIOyEnOu4jOyFi+uzhCDstZzsooUg6rKw6rO8IO2DgOyehSDrp6TtlZFcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0UXVlcmllcyAtIOyEnOu4jOyFiyDsv7zrpqwg7ZWo7IiYIOqwneyytFxuICogQHRlbXBsYXRlIFRMb2FkZXJRdWVyaWVzIC0g7ISc67iM7IWL67OEIOuhnOuNlCDsv7zrpqwg67Cw7Je0IOqwneyytFxuICovXG5leHBvcnQgY2xhc3MgQmFzZU1vZGVsQ2xhc3M8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUU3Vic2V0TWFwcGluZ1tLXSB9ID0gbmV2ZXIsXG4gIFRTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIFB1cmlTdWJzZXRGbj4gPSBuZXZlcixcbiAgVExvYWRlclF1ZXJpZXMgZXh0ZW5kcyBQdXJpTG9hZGVyUXVlcmllczxUU3Vic2V0S2V5PiA9IG5ldmVyLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZWxOYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvdGVjdGVkIHN1YnNldFF1ZXJpZXM/OiBUU3Vic2V0UXVlcmllcyxcbiAgICBwcm90ZWN0ZWQgbG9hZGVyUXVlcmllcz86IFRMb2FkZXJRdWVyaWVzLFxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Vic2V0UXVlcnlQdXJpKCk6IFB1cmlXcmFwcGVyIHtcbiAgICBjb25zdCBhY3RpdmVUcmFuc2FjdGlvbiA9IERCLmdldFRyYW5zYWN0aW9uQ29udGV4dCgpLmdldEFjdGl2ZVRyYW5zYWN0aW9uKCk7XG4gICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gYWN0aXZlVHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogRGF0YWJhc2VSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjbHVzdGVyKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgLndoZXJlSW4oXG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV4IOufsO2DgOyehOydgCDsu6zrn7wg7JyE7LmY7J2YIFJhdyDtkZztmITsi53snYQg7KeA7JuQ7ZWY7KeA66eMIOyEoOyWuCDtg4DsnoXsl5DripQg64iE652965CY7Ja0IOyeiOyKteuLiOuLpC4gKi9cbiAgICAgICAgICB3aGVyZUluRmllbGQgYXMgc3RyaW5nLFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICApO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IERhdGFiYXNlUmVjb3JkKSA9PiBwYXJzZUludChTdHJpbmcoZGJSb3cuaWQpKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRJZHM7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIOyEnOu4jOyFi+yXkCDrjIDtlZwg7L+866asIOu5jOuNlCDtmo3rk51cbiAgICpcbiAgICogQHJldHVybnMgcWIgLSDsv7zrpqwg67mM642UICjsobDqsbQg7LaU6rCA7JqpKVxuICAgKiBAcmV0dXJucyBvblN1YnNldCAtIO2KueyglSDshJzruIzshYsg7KCE7JqpIO2DgOyeheydtCDtlYTsmpTtlaAg65WMIOyCrOyaqVxuICAgKi9cbiAgZ2V0U3Vic2V0UXVlcmllczxUIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBUKSB7XG4gICAgaWYgKCF0aGlzLnN1YnNldFF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1YnNldFF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcHVyaVdyYXBwZXIgPSB0aGlzLmdldFN1YnNldFF1ZXJ5UHVyaSgpO1xuICAgIGNvbnN0IHFiID0gdGhpcy5zdWJzZXRRdWVyaWVzW3N1YnNldF0/LihwdXJpV3JhcHBlcik7XG5cbiAgICAvLyBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTog64uo7J28IO2FjOydtOu4lCDsu6zrn7wg7KCR6re8IOuwqeyngOyaqSDrp4jsu6RcbiAgICB0eXBlIFFCVGFibGVzID0gVW5pb25FeHRyYWN0ZWRUVGFibGVzPFRTdWJzZXRLZXksIFRTdWJzZXRRdWVyaWVzPiAmIHtcbiAgICAgIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiB7IF9fZnVsbHRleHRfXzogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvblN1YnNldDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgZnVuY3Rpb24gb25TdWJzZXQ8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgIHN1YnNldHM6IFsuLi5BcnJdLFxuICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgZnVuY3Rpb24gb25TdWJzZXQoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkge1xuICAgICAgcmV0dXJuIHFiO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvLyBTQUZFVFk6IOqwmeydgCBQdXJpIOyduOyKpO2EtOyKpOyXkCDri6jsnbwg7YWM7J2067iUIOygkeq3vCDsoJztlZzsmqkg7YOA7J6FIOuniOy7pOunjCDstpTqsIDtlanri4jri6QuXG4gICAgICBxYjogcWIgYXMgUHVyaTxEYXRhYmFzZVNjaGVtYUV4dGVuZCwgUUJUYWJsZXMsIHt9PixcbiAgICAgIG9uU3Vic2V0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFxuICAgICAgVCxcbiAgICAgIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LFxuICAgICAgVFN1YnNldE1hcHBpbmcsXG4gICAgICBUU3Vic2V0UXVlcmllc1xuICAgID4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4gU29uYW11IO2VhO2EsCDsoIHsmqkgKO2DgOyehSDrs4DtmZgg7Y+s7ZWoKVxuICAgKiAyLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMy4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDQuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDUuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgICBURmlsdGVyIGV4dGVuZHMgb2JqZWN0LFxuICAgIExQIGV4dGVuZHMge1xuICAgICAgbnVtPzogbnVtYmVyO1xuICAgICAgcGFnZT86IG51bWJlcjtcbiAgICAgIHF1ZXJ5TW9kZT86IFNvbmFtdVF1ZXJ5TW9kZTtcbiAgICB9LFxuICA+KFxuICAgIHBhcmFtczoge1xuICAgICAgc3Vic2V0OiBUO1xuICAgICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT47XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgbnVtOiBudW1iZXI7XG4gICAgICAgIHBhZ2U6IG51bWJlcjtcbiAgICAgICAgcXVlcnlNb2RlPzogU29uYW11UXVlcnlNb2RlO1xuICAgICAgICBzb25hbXVGaWx0ZXI/OiBURmlsdGVyO1xuICAgICAgfTtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gICAgfSAmIEVuaGFuY2VyUGFyYW08VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmcsIFRTdWJzZXRRdWVyaWVzPixcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICBjb25zdCB7IHN1YnNldCwgcWIsIHBhcmFtczogcXVlcnlQYXJhbXMsIGRlYnVnID0gZmFsc2UsIG9wdGltaXplQ291bnRRdWVyeSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMubG9hZGVyUXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyUXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICAvLyBTb25hbXUgRmlsdGVyIOyggeyaqVxuICAgIGlmIChxdWVyeVBhcmFtcy5zb25hbXVGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXIgPSBub3JtYWxpemVGaWx0ZXJRdWVyeShxdWVyeVBhcmFtcy5zb25hbXVGaWx0ZXIpO1xuICAgICAgdGhpcy5hcHBseVNvbmFtdUZpbHRlcnMocWIsIG5vcm1hbGl6ZWRGaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbnVtLCBwYWdlIH0gPSBxdWVyeVBhcmFtcztcbiAgICAvLyDrqqjrk6Ag66Gc642U6rCAIHJvb3QgcXVlcnnsmYAg6rCZ7J2AIOyXsOqysOydhCDsgqzsmqntlZjrj4TroZ0g7Iuk7ZaJIOyLnOygkOydmCBrbmV47JeQ7IScIO2VnCDrsojrp4wg7YyM7IOd7ZWc64ukLlxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHFiLmtuZXgsIG5ldyBVcHNlcnRCdWlsZGVyKCkpO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiSAocXVlcnlNb2RlOiBsaXN07J28IOuVjOuKlCAwIOumrO2EtClcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIGlmIChxdWVyeVBhcmFtcz8ucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICByZXR1cm4geyB0b3RhbCB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9XG5cbiAgICAvLyBMSVNUIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCBjb21wdXRlZFJvd3MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0UXVlcnkoXG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgbnVtLFxuICAgICAgcGFnZSxcbiAgICAgIGRlYnVnLFxuICAgICAgcHVyaVdyYXBwZXIsXG4gICAgKTtcblxuICAgIC8vIEVuaGFuY2VyIOyggeyaqVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgY29uc3QgZW5oYW5jZXIgPSAocGFyYW1zIGFzIGFueSkuZW5oYW5jZXJzPy5bc3Vic2V0XTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIGNvbnN0IGVuaGFuY2VkUm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIC8vIEludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLm1vZGVsTmFtZSk7XG4gICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldF0gPz8gW107XG4gICAgY29uc3Qgcm93cyA9XG4gICAgICBpbnRlcm5hbEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgID8gZW5oYW5jZWRSb3dzLm1hcCgocm93KSA9PiB0aGlzLm9taXRJbnRlcm5hbEZpZWxkcyhyb3csIGludGVybmFsRmllbGRzKSlcbiAgICAgICAgOiBlbmhhbmNlZFJvd3M7XG5cbiAgICBpZiAocXVlcnlQYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgLy8g66as7Iqk7Yq466eMIOumrO2EtFxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHJldHVybiB7IHJvd3MgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOuRmOuLpCDrpqzthLRcbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICByZXR1cm4geyByb3dzLCB0b3RhbCB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCd7LK07JeQ7IScIGludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICog7KSR7LKpIO2VhOuTnCjsmIg6IFwidXNlci5lbWFpbFwiKSDrsI8g67Cw7Je0KOyYiDogXCJlbXBsb3llZXMuc2FsYXJ5XCIp64+EIOyymOumrFxuICAgKi9cbiAgb21pdEludGVybmFsRmllbGRzPFQgZXh0ZW5kcyBvYmplY3Q+KHJvdzogVCwgZmllbGRzOiBzdHJpbmdbXSk6IFQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNsb25lRGVlcChyb3cpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkKHJlc3VsdCwgZmllbGQuc3BsaXQoXCIuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJRdWVyeeulvCBQdXJpIFF1ZXJ5QnVpbGRlcuyXkCDsoIHsmqlcbiAgICpcbiAgICogQHBhcmFtIHFiIFB1cmkgUXVlcnlCdWlsZGVyIOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJRdWVyeSDqsJ3ssrRcbiAgICovXG4gIHByb3RlY3RlZCBhcHBseVNvbmFtdUZpbHRlcnM8VEVudGl0eT4oXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgZmlsdGVycz86IEZpbHRlclF1ZXJ5PFRFbnRpdHk+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybjtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcblxuICAgIC8vIDEuIO2VhO2EsCDqsoDspp0gKEVudGl0eSDquLDrsJgpXG4gICAgdmFsaWRhdGVTb25hbXVGaWx0ZXJzKGZpbHRlcnMsIGVudGl0eSk7XG5cbiAgICAvLyAyLiDqsoDspp3rkJwg7ZWE7YSwIOyggeyaqVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgY29uc3QgcHVyaSA9IHFiIGFzIGFueTtcblxuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBjb25kaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpKSB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSB1bmRlZmluZWQgfHwgY29uZGl0aW9uID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgLy8g7YWM7J2067iU66qFLu2VhOuTnOuqhSDtmJXsi53snLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBmdWxsRmllbGQgPSBlbnRpdHkuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCk7XG5cbiAgICAgIC8vIOyngeygkSDqsJIgKGVx7JmAIOuPmeydvClcbiAgICAgIGlmICghaXNPYmplY3RWYWx1ZShjb25kaXRpb24pIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSkge1xuICAgICAgICBwdXJpLndoZXJlKGZ1bGxGaWVsZCwgY29uZGl0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOyXsOyCsOyekCDqsJ3ssrRcbiAgICAgIGZvciAoY29uc3QgW29wZXJhdG9yLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKSkge1xuICAgICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICB0aGlzLmFwcGx5T3BlcmF0b3IocWIsIGZ1bGxGaWVsZCwgb3BlcmF0b3IgYXMgRmlsdGVyT3BlcmF0b3IsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog64uo7J28IOyXsOyCsOyekOulvCBRdWVyeUJ1aWxkZXLsl5Ag7KCB7JqpXG4gICAqL1xuICBwcml2YXRlIGFwcGx5T3BlcmF0b3I8VmFsdWU+KFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLFxuICAgIHZhbHVlOiBWYWx1ZSxcbiAgKTogdm9pZCB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBwdXJpID0gcWIgYXMgYW55O1xuXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJuZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIiE9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj5cIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjxcIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjw9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICBwdXJpLndoZXJlSW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJub3RJblwiOlxuICAgICAgICBwdXJpLndoZXJlTm90SW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJzdGFydHNXaXRoXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwibGlrZVwiLCBgJHt2YWx1ZX0lYCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZW5kc1dpdGhcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCJsaWtlXCIsIGAlJHt2YWx1ZX1gKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpc051bGxcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiaXNOb3ROdWxsXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiIT1cIiwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYmVmb3JlXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiPFwiLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYWZ0ZXJcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCI+XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJiZXR3ZWVuXCI6IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB2YWx1ZTtcbiAgICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIG1pbikud2hlcmUoZmllbGQsIFwiPD1cIiwgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBvcGVyYXRvcjogJHtvcGVyYXRvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIO2VhOuTnCDsgq3soJwgKOuwsOyXtCDrgrQg6rCd7LK064+EIOyymOumrClcbiAgICovXG4gIGRlbGV0ZUZpZWxkKG9iajogYW55LCBwYXJ0czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIW9iaiB8fCAhaXNPYmplY3RWYWx1ZShvYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtICYmIGlzT2JqZWN0VmFsdWUoaXRlbSkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtW3BhcnRzWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG9ialtwYXJ0c1swXV07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHBhcnRzO1xuICAgIGNvbnN0IG5leHQgPSBvYmpbZmlyc3RdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIG5leHQubWFwKChpdGVtKSA9PiB0aGlzLmRlbGV0ZUZpZWxkKGl0ZW0sIHJlc3QpKTtcbiAgICB9IGVsc2UgaWYgKG5leHQgJiYgaXNPYmplY3RWYWx1ZShuZXh0KSkge1xuICAgICAgdGhpcy5kZWxldGVGaWVsZChuZXh0LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ09VTlQg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvdW50UXVlcnkoXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnk6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudFB1cmkgPSBxYi5jbG9uZSgpLmNsZWFyKFwib3JkZXJcIikuY2xlYXIoXCJsaW1pdFwiKS5jbGVhcihcIm9mZnNldFwiKTtcblxuICAgIGlmIChvcHRpbWl6ZUNvdW50UXVlcnkpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogU3FsUGFyc2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgU3FsUGFyc2VyLlBhcnNlcigpO1xuICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBwYXJzZXIuYXN0aWZ5KGNvdW50UHVyaS50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbGVmdEpvaW5UYWJsZXMgPSBnZXRKb2luVGFibGVzKHBhcnNlZFF1ZXJ5LCBbXCJMRUZUIEpPSU5cIl0pO1xuICAgICAgY29uc3Qgd2hlcmVUYWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcblxuICAgICAgY29uc3QgdGFibGVzVG9SZW1vdmUgPSBsZWZ0Sm9pblRhYmxlcy5maWx0ZXIoKGopID0+ICF3aGVyZVRhYmxlcy5pbmNsdWRlcyhqKSk7XG4gICAgICB0YWJsZXNUb1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBjb3VudFB1cmkuY2xlYXJKb2luKHRhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENPVU5UKCop66GcIOyghOyytCDroIjsvZTrk5wg7IiY66W8IOqzhOyCsFxuICAgIC8vIFRPRE86IHFi7J2YIERJU1RJTkNU6rCAIOyeiOuKlCDqsr3smrAg7LKY66as7ZW07JW8IO2VqFxuICAgIGNvbnN0IGNvdW50UmVzdWx0OiB7IHRvdGFsPzogbnVtYmVyIH0gPSBhd2FpdCBjb3VudFB1cmlcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7IHRvdGFsOiBQdXJpLnJhd051bWJlcihgQ09VTlQoKik6OmludGVnZXJgKSB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvdW50UHVyaS5kZWJ1ZygpO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudFJlc3VsdD8udG90YWwgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMSVNUIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMaXN0UXVlcnk8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIG51bTogbnVtYmVyLFxuICAgIHBhZ2U6IG51bWJlcixcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBwdXJpV3JhcHBlcjogUHVyaVdyYXBwZXIsXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXRlZFFiID0gKCgpID0+IHtcbiAgICAgIGlmIChudW0gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHFiLmxpbWl0KG51bSkub2Zmc2V0KG51bSAqIChwYWdlIC0gMSkpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgbGV0IHVubG9hZGVkUm93cyA9IGF3YWl0IGxpbWl0ZWRRYjtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBsb2FkZXJzID0gKHRoaXMubG9hZGVyUXVlcmllcyBhcyBhbnkpW3N1YnNldF07XG4gICAgaWYgKGxvYWRlcnMgJiYgQXJyYXkuaXNBcnJheShsb2FkZXJzKSkge1xuICAgICAgdW5sb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyh1bmxvYWRlZFJvd3MsIGxvYWRlcnMsIGRlYnVnLCBwdXJpV3JhcHBlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKFxuICAgIHJvd3M6IGFueVtdLFxuICAgIGxvYWRlcnM6IGFueVtdLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIHB1cmlXcmFwcGVyOiBQdXJpV3JhcHBlcixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgcHVyaVdyYXBwZXIsXG4gICAgICAgIHJvd3MubWFwKChyb3cpID0+IHJvd1tyZWZJZF0pLFxuICAgICAgKTtcblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIHJlc29sdmVMb2FkZXJRYi5kZWJ1ZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1ZywgcHVyaVdyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJSb3dHcm91cHMgPSBncm91cChsb2FkZWRSb3dzLCAocm93KSA9PiByb3cucmVmSWQpO1xuXG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByb3dbYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbcmVmSWRdXSA/PyBbXSkubWFwKChyKSA9PiBvbWl0KHIsIFtcInJlZklkXCJdKSk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0IOugiOy9lOuTnOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICAgKlxuICAgKiAtIGB1c2VyX19uYW1lYCDihpIgYHsgdXNlcjogeyBuYW1lIH0gfWBcbiAgICogLSBudWxsYWJsZSByZWxhdGlvbuydmCDqsr3smrAgaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyekOyytOulvCBudWxs66GcXG4gICAqL1xuICBoeWRyYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWVzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhyb3cpKTtcbiAgICAgIC8vIG51bGxhYmxlIHJlbGF0aW9uIOyymOumrDog6re466O57J2YIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTrpbwgbnVsbOuhnFxuICAgICAgY29uc3QgbmVzdGVkS2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKChrZXkpID0+IGtleS5pbmNsdWRlcyhcIl9fXCIpKTtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5ncm91cEJ5KG5lc3RlZEtleXMsIChrZXkpID0+IGtleS5zcGxpdChcIl9fXCIpWzBdKTtcblxuICAgICAgLy8gaWQg7ZWE65Oc6rCAIG51bGzsnbgg6re466O5IOywvuq4sCAo7JiIOiBwYXJlbnRfX2lk6rCAIG51bGzsnbTrqbQgcGFyZW50IOq3uOujuSDsoITssrTqsIAgbnVsbClcbiAgICAgIGNvbnN0IG51bGxLZXlzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBzKVxuICAgICAgICAuZmlsdGVyKChbZ3JvdXBLZXksIGZpZWxkc10pID0+IHtcbiAgICAgICAgICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAvLyDqt7jro7nsnZggaWQg7ZWE65OcIOywvuq4sCAo7JiIOiBcInBhcmVudF9faWRcIilcbiAgICAgICAgICBjb25zdCBpZEZpZWxkID0gYCR7Z3JvdXBLZXl9X19pZGA7XG4gICAgICAgICAgaWYgKGlkRmllbGQgaW4gcm93KSB7XG4gICAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7KCE7LK06rCAIG51bGxcbiAgICAgICAgICAgIHJldHVybiByb3dWYWx1ZXMuZ2V0KGlkRmllbGQpID09PSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCDsl4bsnLzrqbQg6riw7KG0IOuhnOyngTog66qo65OgIO2VhOuTnOqwgCBudWxs7J247KeAIO2ZleyduFxuICAgICAgICAgIHJldHVybiBmaWVsZHMuZXZlcnkoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93VmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBmaWVsZFZhbHVlLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuXG4gICAgICBsZXQgaHlkcmF0ZWQ6IERhdGFiYXNlUmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKFtdKTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93VmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgIGlmICghZmllbGQuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkVmFsdWUgPVxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBpc09iamVjdChmaWVsZFZhbHVlWzBdKVxuICAgICAgICAgICAgICA/IHRoaXMuaHlkcmF0ZShmaWVsZFZhbHVlKVxuICAgICAgICAgICAgICA6IGZpZWxkVmFsdWU7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihoeWRyYXRlZCwgeyBbZmllbGRdOiBoeWRyYXRlZFZhbHVlIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KSR7LKpIO2VhOuTnCDsspjrpqw6IHVzZXJfX25hbWUg4oaSIHVzZXJbbmFtZV1cbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdChcIl9fXCIpO1xuICAgICAgICBjb25zdCBvYmpQYXRoID1cbiAgICAgICAgICBwYXJ0c1swXSArXG4gICAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gYFske3BhcnR9XWApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBoeWRyYXRlZCA9IHNldChcbiAgICAgICAgICBoeWRyYXRlZCxcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIGZpZWxkVmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBpc09iamVjdChmaWVsZFZhbHVlWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUoZmllbGRWYWx1ZSlcbiAgICAgICAgICAgIDogZmllbGRWYWx1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gbnVsbCByZWxhdGlvbiDsspjrpqxcbiAgICAgIG51bGxLZXlzLmZvckVhY2goKG51bGxLZXkpID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoeWRyYXRlZCwgeyBbbnVsbEtleV06IG51bGwgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgIH0pIGFzIFRbXTtcbiAgfVxufVxuXG4vKipcbiAqIEVuaGFuY2VyIO2MjOudvOuvuO2EsCDsobDqsbTrtoAg7YOA7J6FXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG50eXBlIEVuaGFuY2VyUGFyYW08XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIH0sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgeyBbSyBpbiBUU3Vic2V0S2V5XTogVFN1YnNldE1hcHBpbmdbS10gfSxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgPyB7IGVuaGFuY2Vycz86IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4gfVxuICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZywgVFN1YnNldFF1ZXJpZXM+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIH0sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgeyBbSyBpbiBUU3Vic2V0S2V5XTogVFN1YnNldE1hcHBpbmdbS10gfSxcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBTXNDLFlBQUE7Q0FDa0Isb0JBQUE7Q0FFcUIsV0FBQTtDQUNqQixjQUFBO0NBR04sbUJBQUE7Q0FDcUIsZ0JBQUE7Q0FHbEQsUUFBQTtDQUNJLFVBQUE7Q0FNZSxrQkFBQTtDQUVJLG9CQUFBO0NBdUJuQyxpQkFBYixNQUtFO0VBSWtCO0VBQ047RUFDQTtFQUxaO0VBRUEsWUFDRSxZQUFvQyxLQUFLLFlBQVksTUFDckQsZUFDQSxlQUNBO0dBSGdCLEtBQUEsWUFBQTtHQUNOLEtBQUEsZ0JBQUE7R0FDQSxLQUFBLGdCQUFBO0dBRVYsS0FBSyxTQUFTLFVBQVUsd0JBQXdCLEtBQUssV0FBVyxPQUFPLENBQUM7RUFDMUU7RUFFQSxNQUFNLE9BQXVCO0dBQzNCLE9BQU8sR0FBRyxNQUFNLEtBQUs7RUFDdkI7RUFFQSxRQUFRLE9BQThCO0dBRXBDLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLENBQUMsZUFBZSxLQUFLO0dBQzNELElBQUksS0FDRixPQUFPO0dBSVQsTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLO0dBQzNCLE9BQU8sSUFBSSxZQUFZLElBQUksSUFBSSxjQUFjLENBQUM7RUFDaEQ7RUFFQSxxQkFBMEM7R0FDeEMsTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLHFCQUFxQjtHQUMxRSxJQUFJLG1CQUNGLE9BQU87R0FHVCxPQUFPLElBQUksWUFBWSxLQUFLLE1BQU0sR0FBRyxHQUFHLElBQUksY0FBYyxDQUFDO0VBQzdEO0VBRUEsTUFBTSxVQUFVO0dBQ2QsT0FBTyxHQUFHLFFBQVE7RUFDcEI7RUFFQSxNQUFNLGVBQ0osS0FDQSxNQUNBLFdBQ0EsY0FDQSxZQUFvQixLQUNwQjtHQUNBLElBQUksQ0FBQyxLQUNILE1BQU0sS0FBSyxNQUFNLEdBQUc7R0FHdEIsSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBRUosSUFBSSxhQUFhLFNBQVMsR0FBRztJQUMzQixlQUFlLElBQUksSUFBSSxtQkFBbUIsYUFBYSxLQUFLLEdBQUcsRUFBRSxHQUFHO0lBQ3BFLGNBQWMsR0FBRyxhQUFhO0lBQzlCLFVBQVUsS0FBSyxLQUFLLFFBQVEsYUFBYSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztHQUMvRSxPQUFPO0lBQ0wsZUFBZSxhQUFhO0lBQzVCLGNBQWMsYUFBYTtJQUUzQixVQUFVLEtBQUssS0FBSyxRQUFRLElBQUksYUFBYSxHQUFhO0dBQzVEO0dBRUEsSUFBSSxZQUFzQixDQUFDO0dBQzNCLEtBQUssTUFBTSxTQUFTLFFBQVEsU0FBUyxTQUFTLEdBQUc7SUFDL0MsTUFBTSxTQUFTLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FDaEMsT0FBTyxNQUFNLElBQUksSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUVsQyxRQUVDLGNBQ0EsS0FDRjtJQUNGLFlBQVksVUFBVSxPQUNwQixPQUFPLEtBQUssVUFBMEIsU0FBUyxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FDbEU7R0FDRjtHQUVBLE9BQU87RUFDVDs7Ozs7OztFQVFBLGlCQUF1QyxRQUFXO0dBQ2hELElBQUksQ0FBQyxLQUFLLGVBQ1IsTUFBTSxJQUFJLE1BQU0sOEJBQThCO0dBR2hELE1BQU0sY0FBYyxLQUFLLG1CQUFtQjtHQUM1QyxNQUFNLEtBQUssS0FBSyxjQUFjLE9BQU8sR0FBRyxXQUFXO0dBV25ELFNBQVMsU0FBUyxTQUE2QztJQUM3RCxPQUFPO0dBQ1Q7R0FFQSxPQUFPO0lBRUQ7SUFDSjtHQUNGO0VBQ0Y7Ozs7O0VBTUEsZ0JBQ0UsV0FNQTtHQUNBLE9BQU87RUFDVDs7Ozs7Ozs7OztFQVdBLE1BQU0sbUJBVUosUUFZNEM7R0FDNUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxRQUFRLGFBQWEsUUFBUSxPQUFPLHFCQUFxQixVQUFVO0dBRXZGLElBQUksQ0FBQyxLQUFLLGVBQ1IsTUFBTSxJQUFJLE1BQU0sOEJBQThCO0dBSWhELElBQUksWUFBWSxjQUFjO0lBQzVCLE1BQU0sbUJBQW1CLHFCQUFxQixZQUFZLFlBQVk7SUFDdEUsS0FBSyxtQkFBbUIsSUFBSSxnQkFBZ0I7R0FDOUM7R0FFQSxNQUFNLEVBQUUsS0FBSyxTQUFTO0dBRXRCLE1BQU0sY0FBYyxJQUFJLFlBQVksR0FBRyxNQUFNLElBQUksY0FBYyxDQUFDO0dBR2hFLE1BQU0sUUFBUSxNQUFNLEtBQUssa0JBQWtCLElBQUksYUFBYSxPQUFPLGtCQUFrQjtHQUVyRixJQUFJLGFBQWEsY0FBYyxTQUU3QixPQUFPLEVBQUUsTUFBTTtHQUlqQixNQUFNLGVBQWUsTUFBTSxLQUFLLGlCQUM5QixRQUNBLElBQ0EsYUFDQSxLQUNBLE1BQ0EsT0FDQSxXQUNGO0dBSUEsTUFBTSxXQUFZLE9BQWUsWUFBWTtHQUU3QyxNQUFNLGVBQWdCLE1BQU0sUUFBUSxJQUNsQyxhQUFhLEtBQUssUUFBUSxXQUFXLEdBQUcsS0FBSyxHQUFHLENBQ2xEO0dBSUEsTUFBTSxpQkFEUyxjQUFjLElBQUksS0FBSyxTQUNmLENBQUEsQ0FBTyxnQkFBZ0IsV0FBVyxDQUFDO0dBQzFELE1BQU0sT0FDSixlQUFlLFNBQVMsSUFDcEIsYUFBYSxLQUFLLFFBQVEsS0FBSyxtQkFBbUIsS0FBSyxjQUFjLENBQUMsSUFDdEU7R0FFTixJQUFJLFlBQVksY0FBYyxRQUc1QixPQUFPLEVBQUUsS0FBSztRQUlkLE9BQU87SUFBRTtJQUFNO0dBQU07RUFFekI7Ozs7O0VBTUEsbUJBQXFDLEtBQVEsUUFBcUI7R0FDaEUsTUFBTSxTQUFTLFVBQVUsR0FBRztHQUM1QixLQUFLLE1BQU0sU0FBUyxRQUNsQixLQUFLLFlBQVksUUFBUSxNQUFNLE1BQU0sR0FBRyxDQUFDO0dBRTNDLE9BQU87RUFDVDs7Ozs7OztFQVFBLG1CQUNFLElBQ0EsU0FDTTtHQUNOLElBQUksQ0FBQyxTQUFTO0dBRWQsTUFBTSxTQUFTLGNBQWMsSUFBSSxLQUFLLFNBQVM7R0FHL0Msc0JBQXNCLFNBQVMsTUFBTTtHQUlyQyxNQUFNLE9BQU87R0FFYixLQUFLLE1BQU0sQ0FBQyxPQUFPLGNBQWMsT0FBTyxRQUFRLE9BQU8sR0FBRztJQUN4RCxJQUFJLGNBQWMsVUFBYSxjQUFjLE1BQU07SUFHbkQsTUFBTSxZQUFZLE9BQU8saUJBQWlCLEtBQUs7SUFHL0MsSUFBSSxDQUFDLGNBQWMsU0FBUyxLQUFLLE1BQU0sUUFBUSxTQUFTLEdBQUc7S0FDekQsS0FBSyxNQUFNLFdBQVcsU0FBUztLQUMvQjtJQUNGO0lBR0EsS0FBSyxNQUFNLENBQUMsVUFBVSxVQUFVLE9BQU8sUUFBUSxTQUFTLEdBRXRELEtBQUssY0FBYyxJQUFJLFdBQVcsVUFBNEIsS0FBSztHQUV2RTtFQUNGOzs7O0VBS0EsY0FDRSxJQUNBLE9BQ0EsVUFDQSxPQUNNO0dBRU4sTUFBTSxPQUFPO0dBRWIsUUFBUSxVQUFSO0lBQ0UsS0FBSztLQUNILEtBQUssTUFBTSxPQUFPLEtBQUs7S0FDdkI7SUFFRixLQUFLO0tBQ0gsS0FBSyxNQUFNLE9BQU8sTUFBTSxLQUFLO0tBQzdCO0lBRUYsS0FBSztLQUNILEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSztLQUM1QjtJQUVGLEtBQUs7S0FDSCxLQUFLLE1BQU0sT0FBTyxNQUFNLEtBQUs7S0FDN0I7SUFFRixLQUFLO0tBQ0gsS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLO0tBQzVCO0lBRUYsS0FBSztLQUNILEtBQUssTUFBTSxPQUFPLE1BQU0sS0FBSztLQUM3QjtJQUVGLEtBQUs7S0FDSCxLQUFLLFFBQVEsT0FBTyxLQUFLO0tBQ3pCO0lBRUYsS0FBSztLQUNILEtBQUssV0FBVyxPQUFPLEtBQUs7S0FDNUI7SUFFRixLQUFLO0tBQ0gsS0FBSyxNQUFNLE9BQU8sUUFBUSxJQUFJLE1BQU0sRUFBRTtLQUN0QztJQUVGLEtBQUs7S0FDSCxLQUFLLE1BQU0sT0FBTyxRQUFRLEdBQUcsTUFBTSxFQUFFO0tBQ3JDO0lBRUYsS0FBSztLQUNILEtBQUssTUFBTSxPQUFPLFFBQVEsSUFBSSxPQUFPO0tBQ3JDO0lBRUYsS0FBSztLQUNILEtBQUssTUFBTSxPQUFPLElBQUk7S0FDdEI7SUFFRixLQUFLO0tBQ0gsS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUFJO0tBQzVCO0lBRUYsS0FBSztLQUNILEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSztLQUM1QjtJQUVGLEtBQUs7S0FDSCxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUs7S0FDNUI7SUFFRixLQUFLO0tBQ0gsSUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLE1BQU0sV0FBVyxHQUFHO01BQzlDLE1BQU0sQ0FBQyxLQUFLLE9BQU87TUFDbkIsS0FBSyxNQUFNLE9BQU8sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLE9BQU8sTUFBTSxHQUFHO0tBQ3JEO0tBQ0E7SUFHRixTQUNFLFFBQVEsS0FBSyx5QkFBeUIsVUFBVTtHQUNwRDtFQUNGOzs7O0VBS0EsWUFBWSxLQUFVLE9BQXVCO0dBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLEdBQzVCO0dBR0YsSUFBSSxNQUFNLFdBQVcsR0FBRztJQUN0QixJQUFJLE1BQU0sUUFBUSxHQUFHLEdBQ25CLElBQUksU0FBUyxTQUFTO0tBQ3BCLElBQUksUUFBUSxjQUFjLElBQUksR0FDNUIsT0FBTyxLQUFLLE1BQU07SUFFdEIsQ0FBQztTQUVELE9BQU8sSUFBSSxNQUFNO0lBRW5CO0dBQ0Y7R0FFQSxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVE7R0FDekIsTUFBTSxPQUFPLElBQUk7R0FFakIsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUNwQixLQUFLLEtBQUssU0FBUyxLQUFLLFlBQVksTUFBTSxJQUFJLENBQUM7UUFDMUMsSUFBSSxRQUFRLGNBQWMsSUFBSSxHQUNuQyxLQUFLLFlBQVksTUFBTSxJQUFJO0VBRS9COzs7O0VBS0EsTUFBYyxrQkFDWixJQUNBLFFBQ0EsT0FDQSxvQkFDaUI7R0FDakIsSUFBSSxPQUFPLGNBQWMsUUFDdkIsT0FBTztHQUdULE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsQ0FBQyxNQUFNLFFBQVE7R0FFekUsSUFBSSxvQkFBb0I7SUFDdEIsTUFBTSxFQUFFLFNBQVMsY0FBYyxNQUFNLE9BQU87SUFFNUMsTUFBTSxjQUFjLElBREQsVUFBVSxPQUNULENBQUEsQ0FBTyxPQUFPLFVBQVUsUUFBUSxHQUFHLEVBQ3JELFVBQVUsT0FBTyxPQUFPLFNBQVMsU0FDbkMsQ0FBQztJQUVELE1BQU0saUJBQWlCLGNBQWMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUMvRCxNQUFNLGNBQWMsdUJBQXVCLFdBQVc7SUFHdEQsQUFEdUIsZUFBZSxRQUFRLE1BQU0sQ0FBQyxZQUFZLFNBQVMsQ0FBQyxDQUMzRSxDQUFBLENBQWUsU0FBUyxVQUFVO0tBQ2hDLFVBQVUsVUFBVSxLQUFLO0lBQzNCLENBQUM7R0FDSDtHQUlBLE1BQU0sY0FBa0MsTUFBTSxVQUMzQyxNQUFNLFFBQVEsQ0FBQyxDQUNmLE9BQU8sRUFBRSxPQUFPLEtBQUssVUFBVSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FDdEQsTUFBTTtHQUVULElBQUksT0FDRixVQUFVLE1BQU07R0FHbEIsT0FBTyxhQUFhLFNBQVM7RUFDL0I7Ozs7RUFLQSxNQUFjLGlCQUNaLFFBQ0EsSUFDQSxRQUNBLEtBQ0EsTUFDQSxPQUNBLGFBQ2dCO0dBQ2hCLElBQUksT0FBTyxjQUFjLFNBQ3ZCLE9BQU8sQ0FBQztHQVVWLElBQUksZUFBZSxhQVBNO0lBQ3ZCLElBQUksUUFBUSxHQUNWLE9BQU87U0FFUCxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLE9BQU8sT0FBTyxFQUFFO0dBRWhELEVBQUEsQ0FDeUI7R0FFekIsSUFBSSxPQUNGLEdBQUcsTUFBTTtHQUtYLE1BQU0sVUFBVyxLQUFLLGNBQXNCO0dBQzVDLElBQUksV0FBVyxNQUFNLFFBQVEsT0FBTyxHQUNsQyxlQUFlLE1BQU0sS0FBSyxlQUFlLGNBQWMsU0FBUyxPQUFPLFdBQVc7R0FHcEYsT0FBTyxLQUFLLFFBQVEsWUFBWTtFQUNsQzs7OztFQUtBLE1BQWMsZUFDWixNQUNBLFNBQ0EsT0FDQSxhQUNnQjtHQUNoQixLQUFLLE1BQU0saUJBQWlCLFNBQVM7SUFDbkMsTUFBTSxFQUFFLElBQUksT0FBTyxJQUFJLG1CQUFtQixTQUFTLGtCQUFrQjtJQUVyRSxNQUFNLGtCQUFrQixrQkFDdEIsYUFDQSxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FDOUI7SUFFQSxJQUFJLE9BQ0YsZ0JBQWdCLE1BQU07SUFJeEIsSUFBSSxhQUFjLE1BQU07SUFHeEIsSUFBSSxpQkFBaUIsY0FBYyxTQUFTLEdBQzFDLGFBQWEsTUFBTSxLQUFLLGVBQWUsWUFBWSxlQUFlLE9BQU8sV0FBVztJQUd0RixNQUFNLGVBQWUsTUFBTSxhQUFhLFFBQVEsSUFBSSxLQUFLO0lBRXpELE9BQU8sS0FBSyxLQUFLLFFBQVE7S0FDdkIsSUFBSSxPQUFPLGFBQWEsSUFBSSxXQUFXLENBQUMsRUFBQSxDQUFHLEtBQUssTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN4RSxPQUFPO0lBQ1QsQ0FBQztHQUNIO0dBRUEsT0FBTztFQUNUOzs7Ozs7O0VBUUEsUUFBMEIsTUFBZ0I7R0FFeEMsT0FBTyxLQUFLLEtBQUssUUFBVztJQUMxQixNQUFNLFlBQVksSUFBSSxJQUFJLE9BQU8sUUFBUSxHQUFHLENBQUM7SUFFN0MsTUFBTSxhQUFhLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLFFBQVEsSUFBSSxTQUFTLElBQUksQ0FBQztJQUN0RSxNQUFNLFNBQVMsT0FBTyxRQUFRLGFBQWEsUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRTtJQUdyRSxNQUFNLFdBQVcsT0FBTyxRQUFRLE1BQU0sQ0FBQyxDQUNwQyxRQUFRLENBQUMsVUFBVSxZQUFZO0tBQzlCLElBQUksQ0FBQyxVQUFVLE9BQU8sV0FBVyxHQUFHLE9BQU87S0FHM0MsTUFBTSxVQUFVLEdBQUcsU0FBUztLQUM1QixJQUFJLFdBQVcsS0FFYixPQUFPLFVBQVUsSUFBSSxPQUFPLE1BQU07S0FJcEMsT0FBTyxPQUFPLE9BQU8sVUFBVTtNQUM3QixNQUFNLGFBQWEsVUFBVSxJQUFJLEtBQUs7TUFDdEMsT0FBTyxlQUFlLFFBQVMsTUFBTSxRQUFRLFVBQVUsS0FBSyxXQUFXLFdBQVc7S0FDcEYsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUNELEtBQUssQ0FBQyxTQUFTLEdBQUc7SUFFckIsSUFBSSxXQUEyQixPQUFPLFlBQVksQ0FBQyxDQUFDO0lBQ3BELEtBQUssTUFBTSxTQUFTLE9BQU8sS0FBSyxHQUFHLEdBQUc7S0FDcEMsTUFBTSxhQUFhLFVBQVUsSUFBSSxLQUFLO0tBQ3RDLElBQUksQ0FBQyxNQUFNLFNBQVMsSUFBSSxHQUFHO01BQ3pCLE1BQU0sZ0JBQ0osTUFBTSxRQUFRLFVBQVUsS0FBSyxTQUFTLFdBQVcsRUFBRSxJQUMvQyxLQUFLLFFBQVEsVUFBVSxJQUN2QjtNQUNOLE9BQU8sT0FBTyxVQUFVLEdBQUcsUUFBUSxjQUFjLENBQUM7TUFDbEQ7S0FDRjtLQUdBLE1BQU0sUUFBUSxNQUFNLE1BQU0sSUFBSTtLQUM5QixNQUFNLFVBQ0osTUFBTSxLQUNOLE1BQ0csTUFBTSxDQUFDLENBQUMsQ0FDUixLQUFLLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUMxQixLQUFLLEVBQUU7S0FFWixXQUFXLElBQ1QsVUFDQSxTQUNBLGNBQWMsTUFBTSxRQUFRLFVBQVUsS0FBSyxTQUFTLFdBQVcsRUFBRSxJQUM3RCxLQUFLLFFBQVEsVUFBVSxJQUN2QixVQUNOO0lBQ0Y7SUFHQSxTQUFTLFNBQVMsWUFBWTtLQUM1QixPQUFPLE9BQU8sVUFBVSxHQUFHLFVBQVUsS0FBSyxDQUFDO0lBQzdDLENBQUM7SUFFRCxPQUFPO0dBQ1QsQ0FBQztFQUNIO0NBQ0Y7Q0F1QmEsWUFBWSxJQUFJLGVBQWUifQ==
|