sonamu 0.10.13 → 0.11.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/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +3 -2
- package/dist/api/validator.d.ts.map +1 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -3
- package/dist/auth/knex-adapter.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +4 -4
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/bin/build-config.d.ts +10 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +130 -6
- package/dist/bin/fixture.d.ts +7 -4
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +161 -13
- package/dist/bin/test-command.d.ts +7 -0
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -4
- package/dist/bin/typecheck-web.d.ts +2 -0
- package/dist/bin/typecheck-web.d.ts.map +1 -0
- package/dist/bin/typecheck-web.js +36 -0
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/drivers.d.ts.map +1 -1
- package/dist/cache-control/cache-control.d.ts.map +1 -1
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +1 -1
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.types.d.ts +0 -1
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/puri-subset.types.d.ts +0 -1
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-wrapper.d.ts +0 -1
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri.d.ts +0 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.types.d.ts +0 -1
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/dict/en.d.ts +58 -58
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/ko.d.ts +58 -58
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/rc-keys.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +2 -2
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/entity/entity-manager.d.ts +115 -113
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +25 -19
- package/dist/entity/entity-template-cone.d.ts +4 -4
- package/dist/entity/entity.d.ts +6 -1
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +8 -3
- package/dist/env.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/filter/types.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/logger/configure.d.ts +10 -1
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +30 -5
- package/dist/migration/migrator.d.ts +12 -1
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +77 -30
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/naite/messaging-types.d.ts +0 -1
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/naite-reporter.d.ts +0 -1
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/storage/base-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/drivers.d.ts.map +1 -1
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
- package/dist/stream/ws-audience.d.ts.map +1 -1
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-presence-store.d.ts.map +1 -1
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry-memory.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +2 -2
- package/dist/syncer/file-patterns.d.ts +17 -17
- package/dist/syncer/filesystem-dependencies.js +1 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.d.ts +2 -2
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entry-server.template.d.ts +2 -2
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.d.ts +2 -2
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.d.ts +2 -2
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.d.ts +2 -2
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/http_validators.template.d.ts +2 -2
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.d.ts +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.d.ts +2 -2
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.d.ts +2 -2
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.d.ts +2 -2
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.d.ts +2 -2
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +1 -1
- package/dist/template/implementations/services.template.d.ts +2 -2
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.d.ts +3 -3
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.d.ts +2 -2
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts +2 -2
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/data-explorer.d.ts +2 -2
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +1 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-manager.d.ts +4 -0
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +99 -25
- package/dist/testing/naite-vitest-reporter.d.ts.map +1 -1
- package/dist/testing/parallel-db-manager.d.ts.map +1 -1
- package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts +10 -0
- package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts.map +1 -0
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +42 -0
- package/dist/tooling/cdd-service.d.ts +87 -0
- package/dist/tooling/cdd-service.d.ts.map +1 -0
- package/dist/tooling/cdd-service.js +215 -0
- package/dist/tooling/cli-tooling.d.ts +11 -0
- package/dist/tooling/cli-tooling.d.ts.map +1 -0
- package/dist/tooling/cli-tooling.js +901 -0
- package/dist/tooling/fixture-service.d.ts +29 -0
- package/dist/tooling/fixture-service.d.ts.map +1 -0
- package/dist/tooling/fixture-service.js +53 -0
- package/dist/tooling/index.d.ts +2 -0
- package/dist/tooling/index.d.ts.map +1 -0
- package/dist/tooling/index.js +2 -0
- package/dist/tooling/test-run-client.d.ts +27 -0
- package/dist/tooling/test-run-client.d.ts.map +1 -0
- package/dist/tooling/test-run-client.js +120 -0
- package/dist/tsdown.api.config.js +48 -0
- package/dist/types/types.d.ts +527 -527
- package/dist/types/types.d.ts.map +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/utils/formatter.d.ts +6 -0
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +42 -11
- package/dist/utils/model.d.ts +1 -1
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/api/sonamu.ts +2 -1
- package/src/auth/index.ts +1 -1
- package/src/bin/__tests__/zod-compiler-build.test.ts +67 -0
- package/src/bin/build-config.ts +151 -5
- package/src/bin/fixture.ts +204 -21
- package/src/bin/test-command.ts +27 -4
- package/src/bin/typecheck-web.ts +56 -0
- package/src/dict/sonamu-dictionary.ts +1 -1
- package/src/entity/__tests__/entity-manager-autoload.contract.test.ts +55 -0
- package/src/entity/__tests__/entity-manager-explicit-root-registration.contract.test.ts +107 -0
- package/src/entity/entity-manager.ts +31 -19
- package/src/entity/entity.ts +7 -2
- package/src/logger/__tests__/configure.test.ts +33 -0
- package/src/logger/configure.ts +45 -3
- package/src/migration/__tests__/migrator.test.ts +51 -0
- package/src/migration/migrator.ts +103 -34
- package/src/syncer/api-parser.ts +1 -1
- package/src/testing/fixture-manager.ts +124 -32
- package/src/tooling/__tests__/cdd-rule-bootstrap.contract.test.ts +118 -0
- package/src/tooling/__tests__/cli-tooling-auth.contract.test.ts +72 -0
- package/src/tooling/__tests__/cli-tooling-cone-locale.contract.test.ts +150 -0
- package/src/tooling/__tests__/cli-tooling-entity-patch.contract.test.ts +131 -0
- package/src/tooling/__tests__/cli-tooling-fixture-transfer.contract.test.ts +255 -0
- package/src/tooling/__tests__/cli-tooling-i18n-update.contract.test.ts +104 -0
- package/src/tooling/__tests__/cli-tooling-scaffold.contract.test.ts +86 -0
- package/src/tooling/__tests__/cli-tooling-stub-practice.contract.test.ts +147 -0
- package/src/tooling/__tests__/default-cdd-adapter.contract.test.ts +73 -0
- package/src/tooling/__tests__/helpers/sonamu-test-root.ts +42 -0
- package/src/tooling/__tests__/test-run-client-config.contract.test.ts +154 -0
- package/src/tooling/cdd-service.ts +256 -0
- package/src/tooling/cli-tooling.ts +937 -0
- package/src/tooling/fixture-service.ts +72 -0
- package/src/tooling/index.ts +1 -0
- package/src/tooling/test-run-client.ts +196 -0
- package/src/utils/__tests__/formatter-bin.test.ts +99 -0
- package/src/utils/formatter.ts +74 -10
- package/tsdown.api.config.ts +8 -10
- package/bin/cli.js +0 -75
- package/dist/bin/cli.d.ts +0 -2
- package/dist/bin/cli.d.ts.map +0 -1
- package/dist/bin/cli.js +0 -956
- package/src/bin/cli.ts +0 -1166
package/dist/dict/ko.d.ts
CHANGED
|
@@ -3,64 +3,6 @@
|
|
|
3
3
|
* 프로젝트에서 동일한 키를 정의하면 덮어씁니다.
|
|
4
4
|
*/
|
|
5
5
|
declare const _default: {
|
|
6
|
-
readonly "error.badRequest": "잘못된 요청입니다";
|
|
7
|
-
readonly "error.unauthorized": "인증이 필요합니다";
|
|
8
|
-
readonly "error.forbidden": "권한이 없습니다";
|
|
9
|
-
readonly "error.notFound": "찾을 수 없습니다";
|
|
10
|
-
readonly "error.serviceUnavailable": "서비스를 사용할 수 없습니다";
|
|
11
|
-
readonly "error.internalServerError": "서버 오류가 발생했습니다";
|
|
12
|
-
readonly "error.alreadyProcessed": "이미 처리되었습니다";
|
|
13
|
-
readonly "error.duplicateRow": "중복된 데이터입니다";
|
|
14
|
-
readonly "error.targetNotFound": "대상을 찾을 수 없습니다";
|
|
15
|
-
readonly "error.api.notFound": "존재하지 않는 API입니다";
|
|
16
|
-
readonly "common.save": "저장";
|
|
17
|
-
readonly "common.cancel": "취소";
|
|
18
|
-
readonly "common.delete": "삭제";
|
|
19
|
-
readonly "common.edit": "수정";
|
|
20
|
-
readonly "common.create": "생성";
|
|
21
|
-
readonly "common.search": "검색";
|
|
22
|
-
readonly "common.searchPlaceholder": "검색...";
|
|
23
|
-
readonly "common.all": "전체";
|
|
24
|
-
readonly "common.confirm": "확인";
|
|
25
|
-
readonly "common.close": "닫기";
|
|
26
|
-
readonly "common.backToList": "목록으로";
|
|
27
|
-
readonly "form.createdAt": "생성일시";
|
|
28
|
-
readonly "confirm.delete": "정말 삭제하시겠습니까?";
|
|
29
|
-
readonly "confirm.save": "저장하시겠습니까?";
|
|
30
|
-
readonly "validation.required": (field: string) => string;
|
|
31
|
-
readonly "validation.minLength": (field: string, min: number) => string;
|
|
32
|
-
readonly "validation.maxLength": (field: string, max: number) => string;
|
|
33
|
-
readonly "validation.range": (field: string, min: number, max: number) => string;
|
|
34
|
-
readonly "validation.email": "올바른 이메일 형식이 아닙니다";
|
|
35
|
-
readonly "validation.url": "올바른 URL 형식이 아닙니다";
|
|
36
|
-
readonly "entity.list": (name: string) => string;
|
|
37
|
-
readonly "entity.listManage": (name: string) => string;
|
|
38
|
-
readonly "entity.create": (name: string) => string;
|
|
39
|
-
readonly "entity.edit": (name: string, id: number | string) => string;
|
|
40
|
-
readonly "error.entityNotFound": (name: string, id: number | string) => string;
|
|
41
|
-
readonly "error.unknownSearchField": (field: string) => string;
|
|
42
|
-
readonly "sonamu.error.entityIdCamelCase": "entityId는 CamelCase 형식이어야 합니다.";
|
|
43
|
-
readonly "sonamu.error.subsetNotFound": (subset: string) => string;
|
|
44
|
-
readonly "sonamu.error.shadowDbTestFailed": "Shadow DB 테스트 진행 중 에러";
|
|
45
|
-
readonly "sonamu.error.allFilesExist": "이미 경로에 모든 파일이 존재합니다.";
|
|
46
|
-
readonly "sonamu.error.allFilesGenerated": "이미 모든 파일이 생성된 상태입니다.";
|
|
47
|
-
readonly "sonamu.error.fixtureRecordRequired": "픽스쳐 레코드가 없습니다. 픽스쳐 조회 후 시도하세요.";
|
|
48
|
-
readonly "sonamu.error.presetOrAbsPathRequired": "preset or absPath must be provided";
|
|
49
|
-
readonly "sonamu.error.entityIdsRequired": "entityIds must be provided";
|
|
50
|
-
readonly "sonamu.error.templateKeysRequired": "templateKeys must be provided";
|
|
51
|
-
readonly "sonamu.error.enumIdsRequired": "enumIds must be provided";
|
|
52
|
-
readonly "sonamu.error.optionsRequired": "options must be provided";
|
|
53
|
-
readonly "sonamu.error.fileNotUploaded": "파일이 업로드되지 않았습니다";
|
|
54
|
-
readonly "sonamu.error.headerRowNotFound": "헤더 행을 찾을 수 없습니다. 첫 번째 컬럼이 'key'인 행이 필요합니다.";
|
|
55
|
-
readonly "sonamu.error.keyRequired": "키를 입력해주세요";
|
|
56
|
-
readonly "sonamu.error.keyAlreadyExists": (key: string) => string;
|
|
57
|
-
readonly "sonamu.error.keyNotFound": (key: string) => string;
|
|
58
|
-
readonly "sonamu.error.migrationRejected": "마이그레이션이 거절되었습니다";
|
|
59
|
-
readonly "sonamu.error.slackConfirmNotConfigured": "Slack Confirm이 설정되지 않았습니다";
|
|
60
|
-
readonly "sonamu.error.slackConfirmInvalidTargets": (targets: string, validTargets: string) => string;
|
|
61
|
-
readonly "sonamu.error.devRunner.notEnabled": "devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다";
|
|
62
|
-
readonly "sonamu.error.devRunner.notReady": "Vitest 인스턴스가 아직 준비되지 않았습니다";
|
|
63
|
-
readonly "sonamu.error.devRunner.serverUnreachable": "dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요";
|
|
64
6
|
readonly "rc.asyncSelect.loading": string;
|
|
65
7
|
readonly "rc.asyncSelect.noOptions": string;
|
|
66
8
|
readonly "rc.asyncSelect.noResults": string;
|
|
@@ -129,6 +71,64 @@ declare const _default: {
|
|
|
129
71
|
readonly "rc.sonamuFilter.appliedFilters": string;
|
|
130
72
|
readonly "rc.common.cancel": string;
|
|
131
73
|
readonly "rc.common.save": string;
|
|
74
|
+
readonly "error.badRequest": "잘못된 요청입니다";
|
|
75
|
+
readonly "error.unauthorized": "인증이 필요합니다";
|
|
76
|
+
readonly "error.forbidden": "권한이 없습니다";
|
|
77
|
+
readonly "error.notFound": "찾을 수 없습니다";
|
|
78
|
+
readonly "error.serviceUnavailable": "서비스를 사용할 수 없습니다";
|
|
79
|
+
readonly "error.internalServerError": "서버 오류가 발생했습니다";
|
|
80
|
+
readonly "error.alreadyProcessed": "이미 처리되었습니다";
|
|
81
|
+
readonly "error.duplicateRow": "중복된 데이터입니다";
|
|
82
|
+
readonly "error.targetNotFound": "대상을 찾을 수 없습니다";
|
|
83
|
+
readonly "error.api.notFound": "존재하지 않는 API입니다";
|
|
84
|
+
readonly "common.save": "저장";
|
|
85
|
+
readonly "common.cancel": "취소";
|
|
86
|
+
readonly "common.delete": "삭제";
|
|
87
|
+
readonly "common.edit": "수정";
|
|
88
|
+
readonly "common.create": "생성";
|
|
89
|
+
readonly "common.search": "검색";
|
|
90
|
+
readonly "common.searchPlaceholder": "검색...";
|
|
91
|
+
readonly "common.all": "전체";
|
|
92
|
+
readonly "common.confirm": "확인";
|
|
93
|
+
readonly "common.close": "닫기";
|
|
94
|
+
readonly "common.backToList": "목록으로";
|
|
95
|
+
readonly "form.createdAt": "생성일시";
|
|
96
|
+
readonly "confirm.delete": "정말 삭제하시겠습니까?";
|
|
97
|
+
readonly "confirm.save": "저장하시겠습니까?";
|
|
98
|
+
readonly "validation.required": (field: string) => string;
|
|
99
|
+
readonly "validation.minLength": (field: string, min: number) => string;
|
|
100
|
+
readonly "validation.maxLength": (field: string, max: number) => string;
|
|
101
|
+
readonly "validation.range": (field: string, min: number, max: number) => string;
|
|
102
|
+
readonly "validation.email": "올바른 이메일 형식이 아닙니다";
|
|
103
|
+
readonly "validation.url": "올바른 URL 형식이 아닙니다";
|
|
104
|
+
readonly "entity.list": (name: string) => string;
|
|
105
|
+
readonly "entity.listManage": (name: string) => string;
|
|
106
|
+
readonly "entity.create": (name: string) => string;
|
|
107
|
+
readonly "entity.edit": (name: string, id: number | string) => string;
|
|
108
|
+
readonly "error.entityNotFound": (name: string, id: number | string) => string;
|
|
109
|
+
readonly "error.unknownSearchField": (field: string) => string;
|
|
110
|
+
readonly "sonamu.error.entityIdCamelCase": "entityId는 CamelCase 형식이어야 합니다.";
|
|
111
|
+
readonly "sonamu.error.subsetNotFound": (subset: string) => string;
|
|
112
|
+
readonly "sonamu.error.shadowDbTestFailed": "Shadow DB 테스트 진행 중 에러";
|
|
113
|
+
readonly "sonamu.error.allFilesExist": "이미 경로에 모든 파일이 존재합니다.";
|
|
114
|
+
readonly "sonamu.error.allFilesGenerated": "이미 모든 파일이 생성된 상태입니다.";
|
|
115
|
+
readonly "sonamu.error.fixtureRecordRequired": "픽스쳐 레코드가 없습니다. 픽스쳐 조회 후 시도하세요.";
|
|
116
|
+
readonly "sonamu.error.presetOrAbsPathRequired": "preset or absPath must be provided";
|
|
117
|
+
readonly "sonamu.error.entityIdsRequired": "entityIds must be provided";
|
|
118
|
+
readonly "sonamu.error.templateKeysRequired": "templateKeys must be provided";
|
|
119
|
+
readonly "sonamu.error.enumIdsRequired": "enumIds must be provided";
|
|
120
|
+
readonly "sonamu.error.optionsRequired": "options must be provided";
|
|
121
|
+
readonly "sonamu.error.fileNotUploaded": "파일이 업로드되지 않았습니다";
|
|
122
|
+
readonly "sonamu.error.headerRowNotFound": "헤더 행을 찾을 수 없습니다. 첫 번째 컬럼이 'key'인 행이 필요합니다.";
|
|
123
|
+
readonly "sonamu.error.keyRequired": "키를 입력해주세요";
|
|
124
|
+
readonly "sonamu.error.keyAlreadyExists": (key: string) => string;
|
|
125
|
+
readonly "sonamu.error.keyNotFound": (key: string) => string;
|
|
126
|
+
readonly "sonamu.error.migrationRejected": "마이그레이션이 거절되었습니다";
|
|
127
|
+
readonly "sonamu.error.slackConfirmNotConfigured": "Slack Confirm이 설정되지 않았습니다";
|
|
128
|
+
readonly "sonamu.error.slackConfirmInvalidTargets": (targets: string, validTargets: string) => string;
|
|
129
|
+
readonly "sonamu.error.devRunner.notEnabled": "devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다";
|
|
130
|
+
readonly "sonamu.error.devRunner.notReady": "Vitest 인스턴스가 아직 준비되지 않았습니다";
|
|
131
|
+
readonly "sonamu.error.devRunner.serverUnreachable": "dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요";
|
|
132
132
|
};
|
|
133
133
|
export default _default;
|
|
134
134
|
//# sourceMappingURL=ko.d.ts.map
|
package/dist/dict/ko.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/dict/ko.ts"],"names":[],"mappings":"AAEA;;;GAGG
|
|
1
|
+
{"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/dict/ko.ts"],"names":[],"mappings":"AAEA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAMmB,WAAW;mCACT,WAAW;gCACd,UAAU;+BACX,WAAW;yCACD,iBAAiB;0CAChB,eAAe;uCAClB,YAAY;mCAChB,YAAY;qCACV,eAAe;mCACjB,gBAAgB;4BAGvB,IAAI;8BACF,IAAI;8BACJ,IAAI;4BACN,IAAI;8BACF,IAAI;8BACJ,IAAI;yCACO,OAAO;2BACrB,IAAI;+BACA,IAAI;6BACN,IAAI;kCACC,MAAM;+BAGT,MAAM;+BAGN,cAAc;6BAChB,WAAW;4CAGI,MAAM;6CACL,MAAM,OAAO,MAAM;6CAEnB,MAAM,OAAO,MAAM;yCAEvB,MAAM,OAAO,MAAM,OAAO,MAAM;iCAExC,kBAAkB;+BACpB,kBAAkB;mCAGd,MAAM;yCACA,MAAM;qCACV,MAAM;mCACR,MAAM,MAAM,MAAM,GAAG,MAAM;4CAGlB,MAAM,MAAM,MAAM,GAAG,MAAM;iDACtB,MAAM;+CAGR,gCAAgC;qDAC1B,MAAM;gDACX,uBAAuB;2CAC5B,sBAAsB;+CAClB,sBAAsB;mDAClB,gCAAgC;qDAC9B,oCAAoC;+CAC1C,4BAA4B;kDACzB,+BAA+B;6CACpC,0BAA0B;6CAC1B,0BAA0B;6CAC1B,iBAAiB;+CAE/C,4CAA4C;yCAClB,WAAW;oDACA,MAAM;+CACX,MAAM;+CACN,iBAAiB;uDACT,2BAA2B;kEAChB,MAAM,gBAAgB,MAAM;kDAG/E,mFAAmF;gDAClD,4BAA4B;yDAE7D,8CAA8C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc-keys.d.ts","sourceRoot":"","sources":["../../src/dict/rc-keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,QAAQ
|
|
1
|
+
{"version":3,"file":"rc-keys.d.ts","sourceRoot":"","sources":["../../src/dict/rc-keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;IAEnB,wBAAwB;IACxB,0BAA0B;IAC1B,0BAA0B;IAC1B,kCAAkC;IAGlC,uBAAuB;IACvB,+BAA+B;IAG/B,wBAAwB;IACxB,2BAA2B;IAC3B,0BAA0B;IAG1B,iCAAiC;IACjC,mCAAmC;IACnC,qCAAqC;IACrC,oCAAoC;IAGpC,0BAA0B;IAC1B,uBAAuB;IACvB,8BAA8B;IAC9B,+BAA+B;IAC/B,+BAA+B,aAAa,MAAM;IAElD,sBAAsB;IACtB,qBAAqB;IACrB,2BAA2B;IAC3B,wBAAwB;IAGxB,iCAAiC;IACjC,kCAAkC;IAClC,gCAAgC;IAChC,oCAAoC;IACpC,mCAAmC;IACnC,kCAAkC;IAGlC,sBAAsB;IACtB,sBAAsB;IACtB,0BAA0B,UAAU,MAAM;IAC1C,0BAA0B;IAC1B,kCAAkC;IAClC,0BAA0B;IAC1B,6BAA6B,UAAU,MAAM;IAC7C,0BAA0B;IAC1B,kCAAkC;IAGlC,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB,UAAU,MAAM,OAAO,MAAM,SAAS,MAAM;IAInE,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;IAGtB,uBAAuB;IACvB,uBAAuB;IACvB,uBAAuB;IACvB,yBAAyB;IACzB,4BAA4B;IAC5B,6BAA6B;IAC7B,gCAAgC;IAChC,qCAAqC;IACrC,4BAA4B;IAC5B,6BAA6B;IAC7B,8BAA8B;IAC9B,2BAA2B;IAC3B,yBAAyB;IACzB,gCAAgC;IAGhC,kBAAkB;IAClB,gBAAgB;CACjB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC;AACrC,MAAM,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC;AAErC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;gDA2ByB,MAAM;;;;;;;;;;;;;wCAiBd,MAAM;;;;2CAIH,MAAM;;;;;qCAOZ,MAAM,OAAO,MAAM,SAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonamu-dictionary.d.ts","sourceRoot":"","sources":["../../src/dict/sonamu-dictionary.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAElB,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,SAAS,CAAC;AAejB;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;OAQG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"sonamu-dictionary.d.ts","sourceRoot":"","sources":["../../src/dict/sonamu-dictionary.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ import { EntityManager, init_entity_manager } from "../entity/entity-manager.js"
|
|
|
7
7
|
import fs from "fs";
|
|
8
8
|
import path from "path";
|
|
9
9
|
import { execSync } from "child_process";
|
|
10
|
+
import ts from "@typescript/typescript6";
|
|
10
11
|
import { Workbook } from "@sheetkit/node";
|
|
11
|
-
import ts from "typescript";
|
|
12
12
|
//#region src/dict/sonamu-dictionary.ts
|
|
13
13
|
/**
|
|
14
14
|
* 0-based 컬럼 인덱스를 엑셀 컬럼 문자로 변환 (0 -> "A", 25 -> "Z", 26 -> "AA")
|
|
@@ -746,4 +746,4 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
746
746
|
init_sonamu_dictionary();
|
|
747
747
|
export { SonamuDictionary, init_sonamu_dictionary, sonamuDictionary };
|
|
748
748
|
|
|
749
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3Qvc29uYW11LWRpY3Rpb25hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tIFwiQHNoZWV0a2l0L25vZGVcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBmb3JtYXRDb2RlIH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdHRlclwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi9zZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaWN0RW50cnksXG4gIHR5cGUgRGljdGlvbmFyeVJlc3VsdCxcbiAgdHlwZSBEaWN0aW9uYXJ5Um93LFxuICB0eXBlIEVudGl0eUtleUluZm8sXG4gIHR5cGUgSTE4bkNvbmZpZyxcbiAgdHlwZSBJbXBvcnRSZXN1bHQsXG4gIHR5cGUgVXNhZ2VSZXN1bHQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogMC1iYXNlZCDsu6zrn7wg7J24642x7Iqk66W8IOyXkeyFgCDsu6zrn7wg66y47J6Q66GcIOuzgO2ZmCAoMCAtPiBcIkFcIiwgMjUgLT4gXCJaXCIsIDI2IC0+IFwiQUFcIilcbiAqL1xuZnVuY3Rpb24gY29sTGV0dGVyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IG4gPSBpbmRleDtcbiAgd2hpbGUgKG4gPj0gMCkge1xuICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyAobiAlIDI2KSkgKyByZXN1bHQ7XG4gICAgbiA9IE1hdGguZmxvb3IobiAvIDI2KSAtIDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDqtIDrpqwg7YG0656Y7IqkXG4gKiBpMThuIOuUleyFlOuEiOumrOydmCBDUlVEIOuwjyBFeGNlbCBpbXBvcnQvZXhwb3J066W8IOuLtOuLue2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvbmFtdURpY3Rpb25hcnkge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBDb21waWxlciBBUEnrpbwg7IKs7Jqp7ZWY7JesIGRpY3Qg7YyM7J28IO2MjOyLsVxuICAgKlxuICAgKiDsp4Dsm5Ag7Yyo7YS0OlxuICAgKiAtIGV4cG9ydCBkZWZhdWx0IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqIC0gZXhwb3J0IGRlZmF1bHQgZGVmaW5lTG9jYWxlKHsgLi4uIH0pO1xuICAgKiAtIOusuOyekOyXtCDqsJI6IFwia2V5XCI6IFwidmFsdWVcIiDrmJDripQga2V5OiBgdmFsdWVgXG4gICAqIC0g7ZWo7IiYIOqwkjogXCJrZXlcIjogKHBhcmFtOiBUeXBlKSA9PiBgdGVtcGxhdGVgXG4gICAqL1xuICBwYXJzZURpY3RGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBlbnRyaWVzOiBEaWN0RW50cnlbXSA9IFtdO1xuXG4gICAgdHMuZm9yRWFjaENoaWxkKHNvdXJjZUZpbGUsIChub2RlKSA9PiB7XG4gICAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB0aGlzLnVud3JhcFRvT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgIHRoaXMuZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KG9iamVjdExpdGVyYWwsIHNvdXJjZUZpbGUsIGVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtjIzsnbzsl5DshJwg7Yq57KCVIOydtOumhOydmCBjb25zdCDshKDslrjsnYQg7LC+7JWEIE9iamVjdExpdGVyYWwg7YyM7IuxXG4gICAqIOyYiDogY29uc3QgZW50aXR5TGFiZWxzID0geyAuLi4gfSBhcyBjb25zdDtcbiAgICovXG4gIHBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihmaWxlUGF0aDogc3RyaW5nLCB2YXJOYW1lOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBlbnRyaWVzOiBEaWN0RW50cnlbXSA9IFtdO1xuXG4gICAgdHMuZm9yRWFjaENoaWxkKHNvdXJjZUZpbGUsIChub2RlKSA9PiB7XG4gICAgICBpZiAodHMuaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlY2wgb2Ygbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihkZWNsLm5hbWUpICYmIGRlY2wubmFtZS50ZXh0ID09PSB2YXJOYW1lICYmIGRlY2wuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB0aGlzLnVud3JhcFRvT2JqZWN0TGl0ZXJhbChkZWNsLmluaXRpYWxpemVyKTtcbiAgICAgICAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KG9iamVjdExpdGVyYWwsIHNvdXJjZUZpbGUsIGVudHJpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog66y47J6Q7Je07J20IO2ZlOyCtO2RnCDtlajsiJgg65iQ64qUIO2VqOyImCDtkZztmITsi53snbjsp4Ag7YyQ67OEXG4gICAqL1xuICBpc0V4cHJlc3Npb25GdW5jdGlvbihjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyDruYgg66y47J6Q7Je07J2064KYIOqzteuwseunjCDsnojripQg6rK97JqwXG4gICAgaWYgKCFjb2RlLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4gPSAvXlxccypcXChbXildKlxcKVxccyo9Pi87XG5cbiAgICByZXR1cm4gQVJST1dfRlVOQ1RJT05fUEFUVEVSTi50ZXN0KGNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4cG9ydCBkZWZhdWx0IO2RnO2YhOyLneyXkOyEnCBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiDstpTstpxcbiAgICogLSBhcyBjb25zdCDsspjrpqxcbiAgICogLSBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacIOyymOumrFxuICAgKi9cbiAgcHJpdmF0ZSB1bndyYXBUb09iamVjdExpdGVyYWwoZXhwcjogdHMuRXhwcmVzc2lvbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgbnVsbCB7XG4gICAgLy8gYXMgY29uc3Qg7LKY66asXG4gICAgaWYgKHRzLmlzQXNFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZXhwci5leHByZXNzaW9uKTtcbiAgICB9XG4gICAgLy8g7KeB7KCRIOqwneyytCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIC8vIGRlZmluZUxvY2FsZSh7IC4uLiB9KSDtmLjstpxcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgY29uc3QgZmlyc3RBcmcgPSBleHByLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgICByZXR1cm4gZmlyc3RBcmc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9iamVjdExpdGVyYWxFeHByZXNzaW9u7JeQ7IScIERpY3RFbnRyeSDstpTstpxcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KFxuICAgIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgZW50cmllczogRGljdEVudHJ5W10sXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5leHRyYWN0RGljdEVudHJ5KHByb3AsIHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5TmFtZeyXkOyEnCDtgqQg66y47J6Q7Je0IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtCDrpqzthLDrn7Q6IFwia2V5XCJcbiAgICogLSDsi53rs4TsnpA6IGtleSAodW5xdW90ZWQpXG4gICAqL1xuICBwcml2YXRlIGdldFByb3BlcnR5S2V5KG5hbWU6IHRzLlByb3BlcnR5TmFtZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLnRleHQ7XG4gICAgfVxuICAgIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIO2UhOuhnO2NvO2LsOyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqIC0g66y47J6Q7Je0OiDsi6TsoJwg66y47J6Q7Je0IOqwklxuICAgKiAtIO2VqOyImDog7JuQ67O4IOyGjOyKpCAo7Jes65+sIOykhOydgCDtlZwg7KSE66GcIOygleq3nO2ZlClcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdERpY3RFbnRyeShcbiAgICBwcm9wOiB0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2UsXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgKTogRGljdEVudHJ5IHwgbnVsbCB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcm9wZXJ0eUtleShwcm9wLm5hbWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGluaXQgPSBwcm9wLmluaXRpYWxpemVyO1xuXG4gICAgLy8g7ZmU7IK07ZGcIO2VqOyImFxuICAgIGlmICh0cy5pc0Fycm93RnVuY3Rpb24oaW5pdCkpIHtcbiAgICAgIGNvbnN0IGZ1bmNUZXh0ID0gaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZ1bmNUZXh0LnJlcGxhY2UoL1xccypcXG5cXHMqL2csIFwiIFwiKS50cmltKCk7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBub3JtYWxpemVkLCBpc0Z1bmN0aW9uOiB0cnVlIH07XG4gICAgfVxuXG4gICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwoaW5pdCkpIHtcbiAgICAgIHJldHVybiB7IGtleSwgdmFsdWU6IGluaXQudGV4dCwgaXNGdW5jdGlvbjogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyDthZztlIzrpr8g66as7YSw65+0ICjrs4DsiJgg7JeG7J2MKVxuICAgIGlmICh0cy5pc05vU3Vic3RpdHV0aW9uVGVtcGxhdGVMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g6riw7YOAICjsmIg6IO2VqOyImCDtkZztmITsi50pXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlOiBpbml0LmdldFRleHQoc291cmNlRmlsZSksXG4gICAgICBpc0Z1bmN0aW9uOiB0cy5pc0Z1bmN0aW9uRXhwcmVzc2lvbihpbml0KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2UhOuhnOygne2KuOydmCBpMThuIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDroZzsvIDsnbwgKGtvLCBlbiDrk7EpXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKi9cbiAgZ2V0UHJvamVjdERpY3RQYXRoKGxvY2FsZTogc3RyaW5nLCB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpciA9IHRhcmdldCA9PT0gXCJhcGlcIiA/IFNvbmFtdS5jb25maWcuYXBpLmRpciA6IHRhcmdldDtcbiAgICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgZGlyLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdSDrgrTsnqUgZGljdCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U29uYW11RGljdFBhdGgobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VSb290LCBcInNyY1wiLCBcImRpY3RcIiwgYCR7bG9jYWxlfS50c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOyalO2VnCBkaWN0IO2CpOqwgCDtlITroZzsoJ3tirjsl5Ag7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VmOqzoCwg7JeG7Jy866m0IOy2lOqwgO2VqeuLiOuLpC5cbiAgICogZGVmYXVsdExvY2FsZeyXkOunjCDstpTqsIDtlZjrqbAsIOuLpOuluCBsb2NhbGXsnYAg7IKs7Jqp7J6Q6rCAIOyngeygkSDrsojsl63tlbTslbwg7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWlyZWRLZXlzIC0g7ZWE7JqU7ZWcIO2CpCDrqqnroZ1cbiAgICogQHBhcmFtIHRhcmdldCAtIO2DgOqynyDrlJTroInthqDrpqwgKGFwaSwgd2ViLCBhcHApXG4gICAqIEByZXR1cm5zIOy2lOqwgOuQnCDtgqQg66qp66GdXG4gICAqL1xuICBhc3luYyBlbnN1cmVEaWN0S2V5cyhcbiAgICByZXF1aXJlZEtleXM6IHN0cmluZ1tdLFxuICAgIHRhcmdldDogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiID0gXCJhcGlcIixcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSB9ID0gU29uYW11LmNvbmZpZy5pMThuO1xuICAgIGNvbnN0IHByb2plY3REaWN0UGF0aCA9IHRoaXMuZ2V0UHJvamVjdERpY3RQYXRoKGRlZmF1bHRMb2NhbGUsIHRhcmdldCk7XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdCDtjIzsnbzsnbQg7JeG7Jy866m0IOyVhOustOqyg+uPhCDtlZjsp4Ag7JWK7J2MXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHByb2plY3REaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdOyXkOyEnCDquLDsobQg7YKkIO2MjOyLsVxuICAgIGNvbnN0IHByb2plY3RFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKHByb2plY3REaWN0UGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChwcm9qZWN0RW50cmllcy5tYXAoKGUpID0+IGUua2V5KSk7XG5cbiAgICAvLyDriITrnb3rkJwg7YKkIOywvuq4sFxuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gcmVxdWlyZWRLZXlzLmZpbHRlcigoa2V5KSA9PiAhZXhpc3RpbmdLZXlzLmhhcyhrZXkpKTtcblxuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBzb25hbXUgZGljdOyXkOyEnCDquLDrs7jqsJIg6rCA7KC47Jik6riwXG4gICAgY29uc3Qgc29uYW11RGljdFBhdGggPSB0aGlzLmdldFNvbmFtdURpY3RQYXRoKGRlZmF1bHRMb2NhbGUpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzb25hbXVEaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzb25hbXVFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKHNvbmFtdURpY3RQYXRoKTtcbiAgICBjb25zdCBzb25hbXVEaWN0ID0gbmV3IE1hcChzb25hbXVFbnRyaWVzLm1hcCgoZSkgPT4gW2Uua2V5LCBlXSkpO1xuXG4gICAgLy8g7LaU6rCA7ZWgIOyXlO2KuOumrCDsg53shLFcbiAgICBjb25zdCBlbnRyaWVzVG9BZGQgPSBtaXNzaW5nS2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiBzb25hbXVEaWN0LmdldChrZXkpKVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBOb25OdWxsYWJsZTx0eXBlb2YgZW50cnk+ID0+IGVudHJ5ICE9PSB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVudHJpZXNUb0FkZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdCDtjIzsnbzsl5Ag7LaU6rCAXG4gICAgYXdhaXQgdGhpcy5hcHBlbmRFbnRyaWVzVG9EaWN0RmlsZShwcm9qZWN0RGljdFBhdGgsIGVudHJpZXNUb0FkZCwgZGVmYXVsdExvY2FsZSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gZW50cmllc1RvQWRkLm1hcCgoZSkgPT4gZS5rZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287JeQIOyXlO2KuOumrOulvCDstpTqsIDtlanri4jri6QuXG4gICAqIOq4sOyhtCDtjIzsnbzsnYQg7YyM7Iux7ZWY6rOgLCDsg4gg7JeU7Yq466as66W8IOy2lOqwgO2VnCDrkqQsIOyghOyytCDtjIzsnbzsnYQg7J6s7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcHBlbmRFbnRyaWVzVG9EaWN0RmlsZShcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6riw7KG0IGVudHJpZXMg7YyM7IuxXG4gICAgY29uc3QgZXhpc3RpbmdFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKGZpbGVQYXRoKTtcblxuICAgIC8vIOyDiCBlbnRyaWVzIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgZXhpc3RpbmdFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIC8vIO2MjOydvCDsnqzsg53shLFcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZXhpc3RpbmdFbnRyaWVzLCBpc0RlZmF1bHRMb2NhbGUpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdENvZGUoY29udGVudCwgZmlsZVBhdGgpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZvcm1hdHRlZCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlajsiJgg6rCS65Ok7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiY66W8IOqwkOyngO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VXNlZEhlbHBlcnMoZW50cmllczogRGljdEVudHJ5W10pIHtcbiAgICBjb25zdCBmdW5jdGlvbkVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5pc0Z1bmN0aW9uKTtcbiAgICBjb25zdCBoZWxwZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBoZWxwZXIgb2YgW1wicGx1cmFsXCIsIFwiam9zYVwiXSkge1xuICAgICAgLy8g7ZWo7IiY66qF7J20IOuLqOyWtCDqsr3qs4TroZwg7IKs7Jqp65CY64qU7KeAIO2ZleyduCAo7JiIOiBwbHVyYWwoIOuYkOuKlCBwbHVyYWwsKVxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYFxcXFxiJHtoZWxwZXJ9XFxcXHMqXFxcXChgKTtcbiAgICAgIGlmIChmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gcGF0dGVybi50ZXN0KGUudmFsdWUpKSkge1xuICAgICAgICBoZWxwZXJzLnB1c2goaGVscGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXQg7IKs7JqpIOyXrOu2gCDrs4Trj4Qg6rCQ7KeAIChmb3JtYXQubnVtYmVyKC4uLiksIGZvcm1hdC5kYXRlKC4uLikg65OxKVxuICAgIGNvbnN0IGZvcm1hdFBhdHRlcm4gPSAvXFxiZm9ybWF0XFwuXFx3K1xccypcXCgvO1xuICAgIGNvbnN0IHVzZXNGb3JtYXQgPSBmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gZm9ybWF0UGF0dGVybi50ZXN0KGUudmFsdWUpKTtcblxuICAgIHJldHVybiB7IGhlbHBlcnMsIHVzZXNGb3JtYXQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgKi9cbiAgZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZywgZW50cmllczogRGljdEVudHJ5W10sIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8ga2V5IOyVjO2MjOuysyDsiJwg7KCV66CsXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnRvU29ydGVkKChhLCBiKSA9PiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIO2VqOyImCDqsJLsl5DshJwg7IKs7Jqp65CY64qUIO2XrO2NvCDtlajsiJgg6rCQ7KeAXG4gICAgY29uc3QgeyBoZWxwZXJzLCB1c2VzRm9ybWF0IH0gPSB0aGlzLmRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXMpO1xuXG4gICAgLy8g7Zes7Y28IO2VqOyImCBpbXBvcnQg7LaU6rCAXG4gICAgY29uc3QgaW1wb3J0cyA9IFsuLi5oZWxwZXJzXTtcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgaW1wb3J0cy5wdXNoKFwiY3JlYXRlRm9ybWF0XCIpO1xuICAgIH1cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGBpbXBvcnQgeyAke2ltcG9ydHMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJzb25hbXUvZGljdFwiO2ApO1xuICAgIH1cblxuICAgIGlmICghaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKCdpbXBvcnQgeyBkZWZpbmVMb2NhbGUgfSBmcm9tIFwiLi9zZC5nZW5lcmF0ZWRcIjsnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwIHx8ICFpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsi5wgY3JlYXRlRm9ybWF0IO2YuOy2nCDstpTqsIBcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgbGluZXMucHVzaChgY29uc3QgZm9ybWF0ID0gY3JlYXRlRm9ybWF0KFwiJHtsb2NhbGV9XCIpO2ApO1xuICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKFwiLyoqXCIpO1xuICAgIGxpbmVzLnB1c2goYCAqIFByb2plY3QgJHtsb2NhbGUudG9VcHBlckNhc2UoKX0gRGljdGlvbmFyeWApO1xuICAgIGxpbmVzLnB1c2goXCIgKi9cIik7XG5cbiAgICBpZiAoaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiZXhwb3J0IGRlZmF1bHQge1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7XCIpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgICBpZiAoZW50cnkuaXNGdW5jdGlvbikge1xuICAgICAgICAvLyDtlajsiJjsnbgg6rK97JqwOiDsm5DtmJUg6re464yA66GcIOy2nOugpVxuICAgICAgICBsaW5lcy5wdXNoKGAgIFwiJHtlbnRyeS5rZXl9XCI6ICR7ZW50cnkudmFsdWV9LGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke0pTT04uc3RyaW5naWZ5KGVudHJ5LnZhbHVlKX0sYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcIn0gYXMgY29uc3Q7XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKFwifSk7XCIpO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKFwiXCIpO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogaTE4biDshKTsoJXsnYQg6rCA7KC47Ji164uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJMThuQ29uZmlnKCk6IEkxOG5Db25maWcge1xuICAgIHJldHVybiBTb25hbXUuY29uZmlnLmkxOG47XG4gIH1cblxuICAvKipcbiAgICogaTE4biDrlJTroInthqDrpqwg6rK966Gc66W8IOuwmO2ZmO2VmOqzoCwg7JeG7Jy866m0IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlSTE4bkRpcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGkxOG5EaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGkxOG5EaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoaTE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBpMThuRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287J2EIOyggOyepe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZURpY3RGaWxlKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaTE4bkRpciA9IHRoaXMuZW5zdXJlSTE4bkRpcigpO1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKGkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIGRpY3RQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGRpY3RQYXRoLCBmb3JtYXR0ZWQsIFwidXRmLThcIik7XG4gIH1cblxuICAvKipcbiAgICogaTE4biBrZXnrpbwg7YyM7Iux7ZWY7JesIGVudGl0eSDqtIDroKgg7KCV67O0IOy2lOy2nFxuICAgKi9cbiAgcGFyc2VFbnRpdHlLZXkoa2V5OiBzdHJpbmcpOiBFbnRpdHlLZXlJbmZvIHtcbiAgICAvLyBlbnRpdHkue0VudGl0eUlkfSAobGlzdCwgY3JlYXRlLCBlZGl0IOygnOyZuClcbiAgICBjb25zdCBlbnRpdHlUaXRsZU1hdGNoID0ga2V5Lm1hdGNoKC9eZW50aXR5XFwuKFtBLVpdW2EtekEtWjAtOV0qKSQvKTtcbiAgICBpZiAoXG4gICAgICBlbnRpdHlUaXRsZU1hdGNoICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmxpc3RcIikgJiZcbiAgICAgICFrZXkuaW5jbHVkZXMoXCIuY3JlYXRlXCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmVkaXRcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwiZW50aXR5VGl0bGVcIiwgZW50aXR5SWQ6IGVudGl0eVRpdGxlTWF0Y2hbMV0gfTtcbiAgICB9XG5cbiAgICAvLyBlbnRpdHkue0VudGl0eUlkfS57cHJvcE5hbWV9XG4gICAgY29uc3QgcHJvcERlc2NNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oW2Etel9dW2EtejAtOV9dKikkLyk7XG4gICAgaWYgKHByb3BEZXNjTWF0Y2gpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwicHJvcERlc2NcIiwgZW50aXR5SWQ6IHByb3BEZXNjTWF0Y2hbMV0sIHByb3BOYW1lOiBwcm9wRGVzY01hdGNoWzJdIH07XG4gICAgfVxuXG4gICAgLy8gZW51bS57RW51bUlkfS57dmFsdWV9XG4gICAgY29uc3QgZW51bUxhYmVsTWF0Y2ggPSBrZXkubWF0Y2goL15lbnVtXFwuKFtBLVpdW2EtekEtWjAtOV0qKVxcLiguKykkLyk7XG4gICAgaWYgKGVudW1MYWJlbE1hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudW1MYWJlbFwiLCBlbnVtSWQ6IGVudW1MYWJlbE1hdGNoWzFdLCBlbnVtVmFsdWU6IGVudW1MYWJlbE1hdGNoWzJdIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHlwZTogXCJvdGhlclwiIH07XG4gIH1cblxuICAvKipcbiAgICogZW50aXR5IGtleeyXkCDrjIDtlbQgZW50aXR5Lmpzb24g7JeF642w7J207Yq4IOyImO2WiVxuICAgKiBAcmV0dXJucyDsl4XrjbDsnbTtirgg7Jes67aAXG4gICAqL1xuICBhc3luYyB1cGRhdGVFbnRpdHlCeUtleShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGtleUluZm8gPSB0aGlzLnBhcnNlRW50aXR5S2V5KGtleSk7XG5cbiAgICBzd2l0Y2ggKGtleUluZm8udHlwZSkge1xuICAgICAgY2FzZSBcImVudGl0eVRpdGxlXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBpZiAoZW50aXR5LnRpdGxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgZW50aXR5LnRpdGxlID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicHJvcERlc2NcIjoge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGtleUluZm8uZW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IHByb3BJbmRleCA9IGVudGl0eS5wcm9wcy5maW5kSW5kZXgoKHApID0+IHAubmFtZSA9PT0ga2V5SW5mby5wcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3BJbmRleCAhPT0gLTEgJiYgZW50aXR5LnByb3BzW3Byb3BJbmRleF0uZGVzYyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgPSB2YWx1ZTtcbiAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGVudGl0eSBub3QgZm91bmRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJlbnVtTGFiZWxcIjoge1xuICAgICAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS5lbnVtTGFiZWxzW2tleUluZm8uZW51bUlkXSkge1xuICAgICAgICAgICAgaWYgKGVudGl0eS5lbnVtTGFiZWxzW2tleUluZm8uZW51bUlkXVtrZXlJbmZvLmVudW1WYWx1ZV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzW2tleUluZm8uZW51bUlkXVtrZXlJbmZvLmVudW1WYWx1ZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNkLmdlbmVyYXRlZC50c+yXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDqtIDrpqzrkJjripQg6rCS66eMIO2PrO2VqCAoLmxpc3QsIC5jcmVhdGUsIC5lZGl0IOygnOyZuClcbiAgICovXG4gIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IHNkUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwiaTE4blwiLCBcInNkLmdlbmVyYXRlZC50c1wiKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2RQYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIFwiZW50aXR5TGFiZWxzXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNkLmdlbmVyYXRlZC50c+yXkOyEnCByYy1rZXlzIOy2lOy2nFxuICAgKiByZWFjdC1jb21wb25lbnRz7JeQ7IScIOq0gOumrOuQmOuKlCBpMThuIO2CpOuTpFxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKi9cbiAgZXh0cmFjdFJDS2V5cyhsb2NhbGU6IHN0cmluZyk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBsb2NhbGXrs4Qg67OA7IiY66qFIOunpO2VkSAoc2QudGVtcGxhdGUudHPsnZggZ2V0UkNLZXlzVmFyTmFtZeqzvCDrj5nsnbwpXG4gICAgY29uc3QgdmFyTmFtZSA9ICgoKSA9PiB7XG4gICAgICBpZiAobG9jYWxlID09PSBcImtvXCIpIHJldHVybiBcInJjS2V5c0tvXCI7XG4gICAgICBpZiAobG9jYWxlID09PSBcImVuXCIpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyDri6TrpbggbG9jYWxl7J2AIGVu7J2EIGZhbGxiYWNr7Jy866GcIOyCrOyaqVxuICAgICAgcmV0dXJuIFwicmNLZXlzRW5cIjtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VDb25zdE9iamVjdERlY2xhcmF0aW9uKHNkUGF0aCwgdmFyTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBkaWN0IO2MjOydvChbbG9jYWxlXS50cynsl5DshJwg65SV7IWU64SI66asIOuhnOuTnFxuICAgKi9cbiAgbG9hZFByb2plY3REaWN0KGxvY2FsZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGljdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXM6IHRoaXMucGFyc2VEaWN0RmlsZShkaWN0UGF0aCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg642w7J207YSwIOyImOynkSAoc29uYW11ICsgZW50aXR5ICsgcHJvamVjdClcbiAgICovXG4gIGFzeW5jIGNvbGxlY3REaWN0aW9uYXJ5KCk6IFByb21pc2U8RGljdGlvbmFyeVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICBjb25zdCByb3dzOiBEaWN0aW9uYXJ5Um93W10gPSBbXTtcbiAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPHN0cmluZywgRGljdGlvbmFyeVJvdz4oKTtcblxuICAgIC8vIDEuIFJDIEtleXMgKHNvbmFtdSBzb3VyY2UsIOqwgSBsb2NhbGXrs4QpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgcmNLZXlzID0gdGhpcy5leHRyYWN0UkNLZXlzKGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IHJjS2V5IG9mIHJjS2V5cykge1xuICAgICAgICBsZXQgcm93ID0gcm93TWFwLmdldChyY0tleS5rZXkpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIGtleTogcmNLZXkua2V5LFxuICAgICAgICAgICAgc291cmNlOiBcInNvbmFtdVwiLFxuICAgICAgICAgICAgaXNGdW5jdGlvbjogcmNLZXkuaXNGdW5jdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJvd01hcC5zZXQocmNLZXkua2V5LCByb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd1tsb2NhbGVdID0gcmNLZXkudmFsdWU7XG4gICAgICAgIGlmIChyY0tleS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgcm93LmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRW50aXR5IGxhYmVscyAoZGVmYXVsdCBsb2NhbGUg6riw7KSAKVxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgZW50aXR5TGFiZWxzKSB7XG4gICAgICBjb25zdCByb3c6IERpY3Rpb25hcnlSb3cgPSB7XG4gICAgICAgIGtleTogbGFiZWwua2V5LFxuICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIsXG4gICAgICAgIGlzRnVuY3Rpb246IGxhYmVsLmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIFtkZWZhdWx0TG9jYWxlXTogbGFiZWwudmFsdWUsXG4gICAgICB9O1xuICAgICAgcm93TWFwLnNldChsYWJlbC5rZXksIHJvdyk7XG4gICAgfVxuXG4gICAgLy8gMy4gUHJvamVjdCBkaWN0ICjqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgLy8gc29uYW11LCBlbnRpdHkgc291cmNl6rCAIOyeiOycvOuptCDtlbTri7kgbG9jYWxlIOqwkuunjCDstpTqsIBcbiAgICAgICAgICBleGlzdGluZ1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcm9qZWN0IHNvdXJjZeuhnCDsg4jroZwg7LaU6rCAXG4gICAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgICBrZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICAgICAgc291cmNlOiBcInByb2plY3RcIixcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZW50cnkuaXNGdW5jdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByb3dNYXAuc2V0KGVudHJ5LmtleSwgcm93KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93W2xvY2FsZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MucHVzaCguLi5yb3dNYXAudmFsdWVzKCkpO1xuICAgIHJvd3Muc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgLy8g7Ya16rOEIOqzhOyCsDogbG9jYWxl67OEICjssYTsm4zsp4Qg6rCSIC8g7KCE7LK0IO2CpCDsiJgpXG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiA9IHt9O1xuICAgIGNvbnN0IHRvdGFsID0gcm93cy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgZmlsbGVkID0gcm93cy5maWx0ZXIoKHJvdykgPT4gISFyb3dbbG9jYWxlXSkubGVuZ3RoO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGZpbGxlZCAvIHRvdGFsKSAqIDEwMCkgOiAwO1xuICAgICAgc3RhdHNbbG9jYWxlXSA9IHsgdG90YWwsIGZpbGxlZCwgcGVyY2VudCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHJvd3MsIGxvY2FsZXMsIGRlZmF1bHRMb2NhbGUsIHN0YXRzIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2Vs66GcIOuCtOuztOuCtOq4sFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCgpOiBQcm9taXNlPHsgZmlsZW5hbWU6IHN0cmluZzsgYnVmZmVyOiBCdWZmZXIgfT4ge1xuICAgIGNvbnN0IHsgcm93cywgbG9jYWxlcyB9ID0gYXdhaXQgdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuXG4gICAgY29uc3Qgd2IgPSBuZXcgV29ya2Jvb2soKTtcbiAgICBjb25zdCBzaGVldCA9IFwiaTE4blwiO1xuICAgIHdiLnNldFNoZWV0TmFtZShcIlNoZWV0MVwiLCBzaGVldCk7XG5cbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGAke1NvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJTb25hbXVcIn0gRGljdGlvbmFyeWA7XG4gICAgY29uc3QgaGVhZGVycyA9IFtcImtleVwiLCBcInNvdXJjZVwiLCAuLi5sb2NhbGVzXTtcblxuICAgIC8vIOyKpO2DgOydvCDsoJXsnZhcbiAgICBjb25zdCB0aXRsZVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDIzIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG4gICAgY29uc3QgaGVhZGVyU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyBob3Jpem9udGFsOiBcImNlbnRlclwiLCB2ZXJ0aWNhbDogXCJjZW50ZXJcIiB9LFxuICAgICAgZmlsbDogeyBwYXR0ZXJuOiBcInNvbGlkXCIsIGZnQ29sb3I6IFwiRjFGMUYxXCIgfSxcbiAgICAgIGJvcmRlcjoge1xuICAgICAgICB0b3A6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyB2ZXJ0aWNhbDogXCJjZW50ZXJcIiwgaG9yaXpvbnRhbDogXCJsZWZ0XCIgfSxcbiAgICB9KTtcblxuICAgIC8vIO2WiSAxOiDtlITroZzsoJ3tirjrqoVcbiAgICB3Yi5zZXRDZWxsVmFsdWUoc2hlZXQsIFwiQTFcIiwgcHJvamVjdE5hbWUpO1xuICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgXCJBMVwiLCB0aXRsZVN0eWxlSWQpO1xuICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgMSwgMjgpO1xuXG4gICAgLy8g7ZaJIDI6IOu5iCDtlokgKOq4sOuzuOqwkilcblxuICAgIC8vIO2WiSAzOiDtl6TrjZRcbiAgICB3Yi5zZXRSb3dWYWx1ZXMoc2hlZXQsIDMsIFwiQVwiLCBoZWFkZXJzKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDMsIDI2KTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBoZWFkZXJzLmxlbmd0aDsgY29sKyspIHtcbiAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9M2AsIGhlYWRlclN0eWxlSWQpO1xuICAgIH1cblxuICAgIC8vIO2WiSA0IOydtO2bhDog642w7J207YSwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIGNvbnN0IHJvd051bSA9IGkgKyA0O1xuICAgICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCByb3dOdW0sIFwiQVwiLCB2YWx1ZXMpO1xuICAgICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCByb3dOdW0sIDI0KTtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHZhbHVlcy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9JHtyb3dOdW19YCwgZGF0YVN0eWxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOy7rOufvCDrhIjruYQg6rOE7IKwXG4gICAgY29uc3QgTUFYX1dJRFRIID0gNTA7XG4gICAgY29uc3QgTUlOX1dJRFRIID0gMTA7XG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBudW1iZXJbXSA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IE1hdGgubWF4KGhlYWRlci5sZW5ndGgsIE1JTl9XSURUSCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbiAgICAgICAgY29sdW1uV2lkdGhzW2lkeF0gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW5XaWR0aHNbaWR4XSwgdGV4dExlbmd0aCksIE1BWF9XSURUSCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOyggeyaqVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHVtbldpZHRocy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDb2xXaWR0aChzaGVldCwgY29sTGV0dGVyKGNvbCksIGNvbHVtbldpZHRoc1tjb2xdICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBgJHtwcm9qZWN0TmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfS54bHN4YCxcbiAgICAgIGJ1ZmZlcjogd2Iud3JpdGVCdWZmZXJTeW5jKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOyXkOyEnCDqsIDsoLjsmKTquLBcbiAgICpcbiAgICog7ZiV7IudOlxuICAgKiAtIDHtlok6IO2UhOuhnOygne2KuOuqhVxuICAgKiAtIDLtlok6IOu5iCDtlolcbiAgICogLSAz7ZaJOiDtl6TrjZQgKGtleSwgc291cmNlLCBsb2NhbGVzLi4uKVxuICAgKiAtIDTtlokg7J207ZuEOiDrjbDsnbTthLBcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21FeGNlbChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8SW1wb3J0UmVzdWx0PiB7XG4gICAgY29uc3Qgd2IgPSBXb3JrYm9vay5vcGVuQnVmZmVyU3luYyhidWZmZXIpO1xuICAgIGNvbnN0IHNoZWV0ID0gd2Iuc2hlZXROYW1lc1swXTtcbiAgICBjb25zdCBhbGxSb3dzID0gd2IuZ2V0Um93cyhzaGVldCk7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IHVwZGF0ZWRFbnRpdGllcyA9IDA7XG4gICAgbGV0IHVwZGF0ZWRMb2NhbGVzID0gMDtcblxuICAgIC8vIGxvY2FsZeuzhCBwcm9qZWN0IGRpY3QgZW50cmllc1xuICAgIGNvbnN0IHByb2plY3REaWN0RW50cmllczogUmVjb3JkPHN0cmluZywgRGljdEVudHJ5W10+ID0ge307XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyDtl6TrjZQg7ZaJIOywvuq4sDog7LKrIOuyiOynuCDsu6zrn7woQSnsnbQgXCJrZXlcIuyduCDtlolcbiAgICBsZXQgaGVhZGVyUm93TnVtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2YgYWxsUm93cykge1xuICAgICAgY29uc3QgZmlyc3RDZWxsID0gcm93RGF0YS5jZWxscy5maW5kKChjKSA9PiBjLmNvbHVtbiA9PT0gXCJBXCIpO1xuICAgICAgY29uc3QgZmlyc3RDZWxsVmFsdWUgPSBTdHJpbmcoZmlyc3RDZWxsPy52YWx1ZSA/PyBcIlwiKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZpcnN0Q2VsbFZhbHVlID09PSBcImtleVwiKSB7XG4gICAgICAgIGhlYWRlclJvd051bSA9IHJvd0RhdGEucm93O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyUm93TnVtID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5oZWFkZXJSb3dOb3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WieyXkOyEnCDsu6zrn7wg66ek7ZWRIOq1rOyEsVxuICAgIGNvbnN0IGhlYWRlclJvd0RhdGEgPSBhbGxSb3dzLmZpbmQoKHIpID0+IHIucm93ID09PSBoZWFkZXJSb3dOdW0pO1xuICAgIGNvbnN0IGNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICAgIGlmIChoZWFkZXJSb3dEYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgaGVhZGVyUm93RGF0YS5jZWxscykge1xuICAgICAgICBjb2xUb0hlYWRlci5zZXQoY2VsbC5jb2x1bW4sIFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDrjbDsnbTthLAg7ZaJIOydveq4sCAo7Zek642UIOuLpOydjCDtlonrtoDthLApXG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGlmIChyb3dEYXRhLnJvdyA8PSBoZWFkZXJSb3dOdW0pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByb3dWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3dEYXRhLmNlbGxzKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBjb2xUb0hlYWRlci5nZXQoY2VsbC5jb2x1bW4pO1xuICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJvd1ZhbHVlc1toZWFkZXJOYW1lXSA9IFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHJvd1ZhbHVlcy5rZXk7XG4gICAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgICAvKiBTQUZFVFk6IOuPmeq4sO2ZlOuQnCDsgqzsoIQg7YKk7JmAIOqwkiDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyByb3dWYWx1ZXMuc291cmNlIGFzXG4gICAgICAgICAgfCBcImVudGl0eVwiXG4gICAgICAgICAgfCBcInByb2plY3RcIjtcblxuICAgICAgaWYgKCFrZXkgfHwgIXNvdXJjZSkgY29udGludWU7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgLy8gZW50aXR5IHNvdXJjZTogZGVmYXVsdCBsb2NhbGXrp4wgZW50aXR5Lmpzb27sl5Ag7KCA7J6lXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJvd1ZhbHVlc1tkZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZUVudGl0eUJ5S2V5KGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdXBkYXRlZEVudGl0aWVzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9uLWRlZmF1bHQgbG9jYWxl7J2AIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGlmIChsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gXCJwcm9qZWN0XCIpIHtcbiAgICAgICAgLy8gcHJvamVjdCBzb3VyY2U6IOuqqOuToCBsb2NhbGXsnYQgcHJvamVjdCBkaWN07JeQIOyggOyepVxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gcm93VmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlKSB7XG4gICAgICAgICAgICBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgICB1cGRhdGVkTG9jYWxlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXBkYXRlZEVudGl0aWVzLFxuICAgICAgdXBkYXRlZExvY2FsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOyImOyglVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50cnkocGFyYW1zOiB7XG4gICAgb2xkS2V5OiBzdHJpbmc7XG4gICAgbmV3S2V5OiBzdHJpbmc7XG4gICAgc291cmNlOiBcImVudGl0eVwiIHwgXCJwcm9qZWN0XCIgfCBcInNvbmFtdVwiO1xuICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgb2xkS2V5LCBuZXdLZXksIHNvdXJjZSwgdmFsdWVzIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZSDsspjrpqxcbiAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShuZXdLZXksIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSk7XG4gICAgfVxuXG4gICAgLy8gcHJvamVjdCBkaWN0IOyXheuNsOydtO2KuFxuICAgIC8vIC0gZW50aXR57J2YIG5vbi1kZWZhdWx0IGxvY2FsZVxuICAgIC8vIC0gcHJvamVjdCBzb3VyY2XsnZgg66qo65OgIGxvY2FsZVxuICAgIC8vIC0gc29uYW11IHNvdXJjZeydmCDrqqjrk6AgbG9jYWxlIChvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAvLyBlbnRpdHkgc291cmNl7J2YIGRlZmF1bHQgbG9jYWxl7J2AIGVudGl0eS5qc29u7JeQ7IScIOyymOumrO2WiOycvOuvgOuhnCDsiqTtgrVcbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIgJiYgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY2VsbFZhbHVlID0gdmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgIGlmICghY2VsbFZhbHVlKSBjb250aW51ZTtcblxuICAgICAgLy8g6riw7KG0IGRpY3Qg66Gc65OcXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG5cbiAgICAgIC8vIGtleSDrs4Dqsr0g7IucIOq4sOyhtCBrZXkg7KCc6rGwXG4gICAgICBpZiAob2xkS2V5ICE9PSBuZXdLZXkpIHtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG9sZEtleSk7XG4gICAgICAgIGlmIChvbGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7IOIIOqwkiDsl4XrjbDsnbTtirgg65iQ64qUIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0gbmV3S2V5KTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5OiBEaWN0RW50cnkgPSB7XG4gICAgICAgIGtleTogbmV3S2V5LFxuICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllc1tleGlzdGluZ0luZGV4XSA9IG5ld0VudHJ5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cblxuICAgICAgLy8gZGljdCDtjIzsnbwg7KCA7J6lXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7LaU6rCAXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRyeShwYXJhbXM6IHsga2V5OiBzdHJpbmc7IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFrZXk/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5UmVxdWlyZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICAvLyDspJHrs7Ug7YKkIOyytO2BrFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleUFscmVhZHlFeGlzdHNcIikoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6rCBIGxvY2FsZeyXkCDsg4gg7YKkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsgq3soJxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFkZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlOb3RGb3VuZFwiKShrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66+47IKs7JqpIO2CpCDqsoDsgqwgKGFzdC1ncmVwIOyCrOyaqSlcbiAgICovXG4gIGFzeW5jIGNoZWNrVXNhZ2Uoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFVzYWdlUmVzdWx0PiB7XG4gICAgLy8gYXN0LWdyZXAg7ISk7LmYIO2ZleyduFxuICAgIGxldCBzZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIHNnXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIGFzdC1ncmVwXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYXN0LWdyZXAgbm90IGluc3RhbGxlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2dQYXRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjpcbiAgICAgICAgICBcImFzdC1ncmVw7J20IOyEpOy5mOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLiBicmV3IGluc3RhbGwgYXN0LWdyZXAg65iQ64qUIG5wbSBpbnN0YWxsIC1nIEBhc3QtZ3JlcC9jbGnroZwg7ISk7LmY7ZW07KO87IS47JqULlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBbXCJhcGlcIiwgXCJ3ZWJcIiwgXCJhcHBcIl0pIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBlbnRyeSwgXCJzcmNcIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhzcmNQYXRoKSkge1xuICAgICAgICBzZWFyY2hQYXRocy5wdXNoKHNyY1BhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2hQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBcIuqygOyDie2VoCBzcmMg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBhc3QtZ3JlcOycvOuhnCBTRChcIi4uLlwiKSDtjKjthLQg6rKA7IOJXG4gICAgICAvLyDtjKjthLQ6IFNEKFwiS0VZXCIpIOuYkOuKlCBTRCgnS0VZJykg7ZiV7YOcXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IFsnU0QoXCIkS0VZXCIpJywgXCJTRCgnJEtFWScpXCJdO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGAke3NnUGF0aH0gLS1wYXR0ZXJuICcke3BhdHRlcm59JyAtLWpzb24gJHtzZWFyY2hQYXRofWAsIHtcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICAgICAgbWF4QnVmZmVyOiA1MCAqIDEwMjQgKiAxMDI0LCAvLyA1ME1CXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gbWV0YVZhcmlhYmxlcy5zaW5nbGUuS0VZLnRleHTsl5DshJwg7YKkIOy2lOy2nFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVRleHQgPSBtYXRjaC5tZXRhVmFyaWFibGVzPy5zaW5nbGU/LktFWT8udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5VGV4dCkge1xuICAgICAgICAgICAgICAgICAgLy8g65Sw7Ji07ZGcIOygnOqxsFxuICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5LZXkgPSBrZXlUZXh0LnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICB1c2VkS2V5cy5hZGQoY2xlYW5LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Yyo7YS0IOunpOy5mCDsl4bsnLzrqbQg7JeQ65+sICjrrLTsi5wpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGtleXMg7KSR7JeQ7IScIHVzZWRLZXlz7JeQIOyXhuuKlCDqsoPrk6TsnbQg66+47IKs7JqpIO2CpFxuICAgICAgY29uc3QgdW51c2VkS2V5cyA9IGtleXMuZmlsdGVyKChrKSA9PiAhdXNlZEtleXMuaGFzKGspKTtcblxuICAgICAgcmV0dXJuIHsgdW51c2VkS2V5cywgdXNlZEtleXNDb3VudDogdXNlZEtleXMuc2l6ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBg6rKA7IOJIOykkSDsmKTrpZgg67Cc7IOdOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzb25hbXVEaWN0aW9uYXJ5ID0gbmV3IFNvbmFtdURpY3Rpb25hcnkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQVMsVUFBVSxPQUF1QjtDQUN4QyxJQUFJLFNBQVM7Q0FDYixJQUFJLElBQUk7Q0FDUixPQUFPLEtBQUssR0FBRztFQUNiLFNBQVMsT0FBTyxhQUFhLEtBQU0sSUFBSSxFQUFHLElBQUk7RUFDOUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUk7Q0FDM0I7Q0FDQSxPQUFPO0FBQ1Q7OzthQTFCc0M7cUJBQ2tCO29CQUNTO2dCQUNsQjtTQUN0QjtDQTRCWixtQkFBYixNQUE4Qjs7Ozs7Ozs7OztFQVU1QixjQUFjLFVBQStCO0dBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsVUFBVSxPQUFPO0dBQ2pELE1BQU0sYUFBYSxHQUFHLGlCQUFpQixVQUFVLFNBQVMsR0FBRyxhQUFhLFFBQVEsSUFBSTtHQUV0RixNQUFNLFVBQXVCLENBQUM7R0FFOUIsR0FBRyxhQUFhLGFBQWEsU0FBUztJQUNwQyxJQUFJLEdBQUcsbUJBQW1CLElBQUksR0FBRztLQUMvQixNQUFNLGdCQUFnQixLQUFLLHNCQUFzQixLQUFLLFVBQVU7S0FDaEUsSUFBSSxlQUNGLEtBQUsseUJBQXlCLGVBQWUsWUFBWSxPQUFPO0lBRXBFO0dBQ0YsQ0FBQztHQUVELE9BQU87RUFDVDs7Ozs7RUFNQSw0QkFBNEIsVUFBa0IsU0FBOEI7R0FDMUUsTUFBTSxVQUFVLEdBQUcsYUFBYSxVQUFVLE9BQU87R0FDakQsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLFVBQVUsU0FBUyxHQUFHLGFBQWEsUUFBUSxJQUFJO0dBRXRGLE1BQU0s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
|
|
749
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3Qvc29uYW11LWRpY3Rpb25hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tIFwiQHNoZWV0a2l0L25vZGVcIjtcbmltcG9ydCB0cyBmcm9tIFwiQHR5cGVzY3JpcHQvdHlwZXNjcmlwdDZcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4vc2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGljdEVudHJ5LFxuICB0eXBlIERpY3Rpb25hcnlSZXN1bHQsXG4gIHR5cGUgRGljdGlvbmFyeVJvdyxcbiAgdHlwZSBFbnRpdHlLZXlJbmZvLFxuICB0eXBlIEkxOG5Db25maWcsXG4gIHR5cGUgSW1wb3J0UmVzdWx0LFxuICB0eXBlIFVzYWdlUmVzdWx0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIDAtYmFzZWQg7Lus65+8IOyduOuNseyKpOulvCDsl5HshYAg7Lus65+8IOusuOyekOuhnCDrs4DtmZggKDAgLT4gXCJBXCIsIDI1IC0+IFwiWlwiLCAyNiAtPiBcIkFBXCIpXG4gKi9cbmZ1bmN0aW9uIGNvbExldHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBuID0gaW5kZXg7XG4gIHdoaWxlIChuID49IDApIHtcbiAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgKG4gJSAyNikpICsgcmVzdWx0O1xuICAgIG4gPSBNYXRoLmZsb29yKG4gLyAyNikgLSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg6rSA66asIO2BtOuemOyKpFxuICogaTE4biDrlJXshZTrhIjrpqzsnZggQ1JVRCDrsI8gRXhjZWwgaW1wb3J0L2V4cG9ydOulvCDri7Tri7ntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb25hbXVEaWN0aW9uYXJ5IHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgQ29tcGlsZXIgQVBJ66W8IOyCrOyaqe2VmOyXrCBkaWN0IO2MjOydvCDtjIzsi7FcbiAgICpcbiAgICog7KeA7JuQIO2MqO2EtDpcbiAgICogLSBleHBvcnQgZGVmYXVsdCB7IC4uLiB9IGFzIGNvbnN0O1xuICAgKiAtIGV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7IC4uLiB9KTtcbiAgICogLSDrrLjsnpDsl7Qg6rCSOiBcImtleVwiOiBcInZhbHVlXCIg65iQ64qUIGtleTogYHZhbHVlYFxuICAgKiAtIO2VqOyImCDqsJI6IFwia2V5XCI6IChwYXJhbTogVHlwZSkgPT4gYHRlbXBsYXRlYFxuICAgKi9cbiAgcGFyc2VEaWN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J287JeQ7IScIO2KueyglSDsnbTrpoTsnZggY29uc3Qg7ISg7Ja47J2EIOywvuyVhCBPYmplY3RMaXRlcmFsIO2MjOyLsVxuICAgKiDsmIg6IGNvbnN0IGVudGl0eUxhYmVscyA9IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqL1xuICBwYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oZmlsZVBhdGg6IHN0cmluZywgdmFyTmFtZTogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoZGVjbC5uYW1lKSAmJiBkZWNsLm5hbWUudGV4dCA9PT0gdmFyTmFtZSAmJiBkZWNsLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZGVjbC5pbml0aWFsaXplcik7XG4gICAgICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOusuOyekOyXtOydtCDtmZTsgrTtkZwg7ZWo7IiYIOuYkOuKlCDtlajsiJgg7ZGc7ZiE7Iud7J247KeAIO2MkOuzhFxuICAgKi9cbiAgaXNFeHByZXNzaW9uRnVuY3Rpb24oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8g67mIIOusuOyekOyXtOydtOuCmCDqs7XrsLHrp4wg7J6I64qUIOqyveyasFxuICAgIGlmICghY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBBUlJPV19GVU5DVElPTl9QQVRURVJOID0gL15cXHMqXFwoW14pXSpcXClcXHMqPT4vO1xuXG4gICAgcmV0dXJuIEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4udGVzdChjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHBvcnQgZGVmYXVsdCDtkZztmITsi53sl5DshJwgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24g7LaU7LacXG4gICAqIC0gYXMgY29uc3Qg7LKY66asXG4gICAqIC0gZGVmaW5lTG9jYWxlKHsgLi4uIH0pIO2YuOy2nCDsspjrpqxcbiAgICovXG4gIHByaXZhdGUgdW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHI6IHRzLkV4cHJlc3Npb24pOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IG51bGwge1xuICAgIC8vIGFzIGNvbnN0IOyymOumrFxuICAgIGlmICh0cy5pc0FzRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIHRoaXMudW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHIuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIC8vIOyngeygkSDqsJ3ssrQg66as7YSw65+0XG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICAvLyBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacXG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJnID0gZXhwci5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbuyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChcbiAgICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZXh0cmFjdERpY3RFbnRyeShwcm9wLCBzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eU5hbWXsl5DshJwg7YKkIOusuOyekOyXtCDstpTstpxcbiAgICogLSDrrLjsnpDsl7Qg66as7YSw65+0OiBcImtleVwiXG4gICAqIC0g7Iud67OE7J6QOiBrZXkgKHVucXVvdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUtleShuYW1lOiB0cy5Qcm9wZXJ0eU5hbWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZztjbzti7Dsl5DshJwgRGljdEVudHJ5IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtDog7Iuk7KCcIOusuOyekOyXtCDqsJJcbiAgICogLSDtlajsiJg6IOybkOuzuCDshozsiqQgKOyXrOufrCDspITsnYAg7ZWcIOykhOuhnCDsoJXqt5ztmZQpXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3REaWN0RW50cnkoXG4gICAgcHJvcDogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICk6IERpY3RFbnRyeSB8IG51bGwge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJvcGVydHlLZXkocHJvcC5uYW1lKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBpbml0ID0gcHJvcC5pbml0aWFsaXplcjtcblxuICAgIC8vIO2ZlOyCtO2RnCDtlajsiJhcbiAgICBpZiAodHMuaXNBcnJvd0Z1bmN0aW9uKGluaXQpKSB7XG4gICAgICBjb25zdCBmdW5jVGV4dCA9IGluaXQuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmdW5jVGV4dC5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9ybWFsaXplZCwgaXNGdW5jdGlvbjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g7YWc7ZSM66a/IOumrO2EsOuftCAo67OA7IiYIOyXhuydjClcbiAgICBpZiAodHMuaXNOb1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbChpbml0KSkge1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogaW5pdC50ZXh0LCBpc0Z1bmN0aW9uOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIOq4sO2DgCAo7JiIOiDtlajsiJgg7ZGc7ZiE7IudKVxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpLFxuICAgICAgaXNGdW5jdGlvbjogdHMuaXNGdW5jdGlvbkV4cHJlc3Npb24oaW5pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZzsoJ3tirjsnZggaTE4biBkaWN0IO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0g7YOA6rKfIOuUlOugie2GoOumrCAoYXBpLCB3ZWIsIGFwcClcbiAgICovXG4gIGdldFByb2plY3REaWN0UGF0aChsb2NhbGU6IHN0cmluZywgdGFyZ2V0OiBcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIgPSBcImFwaVwiKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIGRpciwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUg64K07J6lIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFNvbmFtdURpY3RQYXRoKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIik7XG4gICAgcmV0dXJuIHBhdGguam9pbihwYWNrYWdlUm9vdCwgXCJzcmNcIiwgXCJkaWN0XCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTsmpTtlZwgZGljdCDtgqTqsIAg7ZSE66Gc7KCd7Yq47JeQIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlZjqs6AsIOyXhuycvOuptCDstpTqsIDtlanri4jri6QuXG4gICAqIGRlZmF1bHRMb2NhbGXsl5Drp4wg7LaU6rCA7ZWY66mwLCDri6TrpbggbG9jYWxl7J2AIOyCrOyaqeyekOqwgCDsp4HsoJEg67KI7Jet7ZW07JW8IO2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVpcmVkS2V5cyAtIO2VhOyalO2VnCDtgqQg66qp66GdXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKiBAcmV0dXJucyDstpTqsIDrkJwg7YKkIOuqqeuhnVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRGljdEtleXMoXG4gICAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXSxcbiAgICB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IFNvbmFtdS5jb25maWcuaTE4bjtcbiAgICBjb25zdCBwcm9qZWN0RGljdFBhdGggPSB0aGlzLmdldFByb2plY3REaWN0UGF0aChkZWZhdWx0TG9jYWxlLCB0YXJnZXQpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287J20IOyXhuycvOuptCDslYTrrLTqsoPrj4Qg7ZWY7KeAIOyViuydjFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9qZWN0RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Tsl5DshJwg6riw7KG0IO2CpCDtjIzsi7FcbiAgICBjb25zdCBwcm9qZWN0RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShwcm9qZWN0RGljdFBhdGgpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQocHJvamVjdEVudHJpZXMubWFwKChlKSA9PiBlLmtleSkpO1xuXG4gICAgLy8g64iE652965CcIO2CpCDssL7quLBcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWV4aXN0aW5nS2V5cy5oYXMoa2V5KSk7XG5cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gc29uYW11IGRpY3Tsl5DshJwg6riw67O46rCSIOqwgOyguOyYpOq4sFxuICAgIGNvbnN0IHNvbmFtdURpY3RQYXRoID0gdGhpcy5nZXRTb25hbXVEaWN0UGF0aChkZWZhdWx0TG9jYWxlKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc29uYW11RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYW11RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShzb25hbXVEaWN0UGF0aCk7XG4gICAgY29uc3Qgc29uYW11RGljdCA9IG5ldyBNYXAoc29uYW11RW50cmllcy5tYXAoKGUpID0+IFtlLmtleSwgZV0pKTtcblxuICAgIC8vIOy2lOqwgO2VoCDsl5Ttirjrpqwg7IOd7ISxXG4gICAgY29uc3QgZW50cmllc1RvQWRkID0gbWlzc2luZ0tleXNcbiAgICAgIC5tYXAoKGtleSkgPT4gc29uYW11RGljdC5nZXQoa2V5KSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgTm9uTnVsbGFibGU8dHlwZW9mIGVudHJ5PiA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGlmIChlbnRyaWVzVG9BZGQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287JeQIOy2lOqwgFxuICAgIGF3YWl0IHRoaXMuYXBwZW5kRW50cmllc1RvRGljdEZpbGUocHJvamVjdERpY3RQYXRoLCBlbnRyaWVzVG9BZGQsIGRlZmF1bHRMb2NhbGUsIHRydWUpO1xuXG4gICAgcmV0dXJuIGVudHJpZXNUb0FkZC5tYXAoKGUpID0+IGUua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOyXkCDsl5Ttirjrpqzrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgKiDquLDsobQg7YyM7J287J2EIO2MjOyLse2VmOqzoCwg7IOIIOyXlO2KuOumrOulvCDstpTqsIDtlZwg65KkLCDsoITssrQg7YyM7J287J2EIOyerOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kRW50cmllc1RvRGljdEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOq4sOyhtCBlbnRyaWVzIO2MjOyLsVxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShmaWxlUGF0aCk7XG5cbiAgICAvLyDsg4ggZW50cmllcyDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbwg7J6s7IOd7ISxXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGV4aXN0aW5nRW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmb3JtYXR0ZWQsIFwidXRmLThcIik7XG4gIH1cblxuICAvKipcbiAgICog7ZWo7IiYIOqwkuuTpOyXkOyEnCDsgqzsmqnrkJjripQg7Zes7Y28IO2VqOyImOulvCDqsJDsp4Dtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXM6IERpY3RFbnRyeVtdKSB7XG4gICAgY29uc3QgZnVuY3Rpb25FbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuaXNGdW5jdGlvbik7XG4gICAgY29uc3QgaGVscGVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaGVscGVyIG9mIFtcInBsdXJhbFwiLCBcImpvc2FcIl0pIHtcbiAgICAgIC8vIO2VqOyImOuqheydtCDri6jslrQg6rK96rOE66GcIOyCrOyaqeuQmOuKlOyngCDtmZXsnbggKOyYiDogcGx1cmFsKCDrmJDripQgcGx1cmFsLClcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxcYiR7aGVscGVyfVxcXFxzKlxcXFwoYCk7XG4gICAgICBpZiAoZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IHBhdHRlcm4udGVzdChlLnZhbHVlKSkpIHtcbiAgICAgICAgaGVscGVycy5wdXNoKGhlbHBlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsl6zrtoAg67OE64+EIOqwkOyngCAoZm9ybWF0Lm51bWJlciguLi4pLCBmb3JtYXQuZGF0ZSguLi4pIOuTsSlcbiAgICBjb25zdCBmb3JtYXRQYXR0ZXJuID0gL1xcYmZvcm1hdFxcLlxcdytcXHMqXFwoLztcbiAgICBjb25zdCB1c2VzRm9ybWF0ID0gZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IGZvcm1hdFBhdHRlcm4udGVzdChlLnZhbHVlKSk7XG5cbiAgICByZXR1cm4geyBoZWxwZXJzLCB1c2VzRm9ybWF0IH07XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICovXG4gIGdlbmVyYXRlUHJvamVjdERpY3QobG9jYWxlOiBzdHJpbmcsIGVudHJpZXM6IERpY3RFbnRyeVtdLCBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIGtleSDslYztjIzrsrMg7IicIOygleugrFxuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyDtlajsiJgg6rCS7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiYIOqwkOyngFxuICAgIGNvbnN0IHsgaGVscGVycywgdXNlc0Zvcm1hdCB9ID0gdGhpcy5kZXRlY3RVc2VkSGVscGVycyhlbnRyaWVzKTtcblxuICAgIC8vIO2XrO2NvCDtlajsiJggaW1wb3J0IOy2lOqwgFxuICAgIGNvbnN0IGltcG9ydHMgPSBbLi4uaGVscGVyc107XG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGltcG9ydHMucHVzaChcImNyZWF0ZUZvcm1hdFwiKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChgaW1wb3J0IHsgJHtpbXBvcnRzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwic29uYW11L2RpY3RcIjtgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaCgnaW1wb3J0IHsgZGVmaW5lTG9jYWxlIH0gZnJvbSBcIi4vc2QuZ2VuZXJhdGVkXCI7Jyk7XG4gICAgfVxuXG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCB8fCAhaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiXCIpO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCDsgqzsmqkg7IucIGNyZWF0ZUZvcm1hdCDtmLjstpwg7LaU6rCAXG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGxpbmVzLnB1c2goYGNvbnN0IGZvcm1hdCA9IGNyZWF0ZUZvcm1hdChcIiR7bG9jYWxlfVwiKTtgKTtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICBsaW5lcy5wdXNoKGAgKiBQcm9qZWN0ICR7bG9jYWxlLnRvVXBwZXJDYXNlKCl9IERpY3Rpb25hcnlgKTtcbiAgICBsaW5lcy5wdXNoKFwiICovXCIpO1xuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IHtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goXCJleHBvcnQgZGVmYXVsdCBkZWZpbmVMb2NhbGUoe1wiKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgLy8g7ZWo7IiY7J24IOqyveyasDog7JuQ7ZiVIOq3uOuMgOuhnCDstpzroKVcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke2VudHJ5LnZhbHVlfSxgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgXCIke2VudHJ5LmtleX1cIjogJHtKU09OLnN0cmluZ2lmeShlbnRyeS52YWx1ZSl9LGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJ9IGFzIGNvbnN0O1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcIn0pO1wiKTtcbiAgICB9XG4gICAgbGluZXMucHVzaChcIlwiKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g7ISk7KCV7J2EIOqwgOyguOyYteuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0STE4bkNvbmZpZygpOiBJMThuQ29uZmlnIHtcbiAgICByZXR1cm4gU29uYW11LmNvbmZpZy5pMThuO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g65SU66CJ7Yag66asIOqyveuhnOulvCDrsJjtmZjtlZjqs6AsIOyXhuycvOuptCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUkxOG5EaXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhpMThuRGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKGkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaTE4bkRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVEaWN0RmlsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGkxOG5EaXIgPSB0aGlzLmVuc3VyZUkxOG5EaXIoKTtcbiAgICBjb25zdCBkaWN0UGF0aCA9IHBhdGguam9pbihpMThuRGlyLCBgJHtsb2NhbGV9LnRzYCk7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGVudHJpZXMsIGlzRGVmYXVsdExvY2FsZSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShjb250ZW50LCBkaWN0UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkaWN0UGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4ga2V566W8IO2MjOyLse2VmOyXrCBlbnRpdHkg6rSA66CoIOygleuztCDstpTstpxcbiAgICovXG4gIHBhcnNlRW50aXR5S2V5KGtleTogc3RyaW5nKTogRW50aXR5S2V5SW5mbyB7XG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0gKGxpc3QsIGNyZWF0ZSwgZWRpdCDsoJzsmbgpXG4gICAgY29uc3QgZW50aXR5VGl0bGVNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKikkLyk7XG4gICAgaWYgKFxuICAgICAgZW50aXR5VGl0bGVNYXRjaCAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5saXN0XCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmNyZWF0ZVwiKSAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5lZGl0XCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudGl0eVRpdGxlXCIsIGVudGl0eUlkOiBlbnRpdHlUaXRsZU1hdGNoWzFdIH07XG4gICAgfVxuXG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0ue3Byb3BOYW1lfVxuICAgIGNvbnN0IHByb3BEZXNjTWF0Y2ggPSBrZXkubWF0Y2goL15lbnRpdHlcXC4oW0EtWl1bYS16QS1aMC05XSopXFwuKFthLXpfXVthLXowLTlfXSopJC8pO1xuICAgIGlmIChwcm9wRGVzY01hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInByb3BEZXNjXCIsIGVudGl0eUlkOiBwcm9wRGVzY01hdGNoWzFdLCBwcm9wTmFtZTogcHJvcERlc2NNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIC8vIGVudW0ue0VudW1JZH0ue3ZhbHVlfVxuICAgIGNvbnN0IGVudW1MYWJlbE1hdGNoID0ga2V5Lm1hdGNoKC9eZW51bVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oLispJC8pO1xuICAgIGlmIChlbnVtTGFiZWxNYXRjaCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtTGFiZWxcIiwgZW51bUlkOiBlbnVtTGFiZWxNYXRjaFsxXSwgZW51bVZhbHVlOiBlbnVtTGFiZWxNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eSBrZXnsl5Ag64yA7ZW0IGVudGl0eS5qc29uIOyXheuNsOydtO2KuCDsiJjtlolcbiAgICogQHJldHVybnMg7JeF642w7J207Yq4IOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50aXR5QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXlJbmZvID0gdGhpcy5wYXJzZUVudGl0eUtleShrZXkpO1xuXG4gICAgc3dpdGNoIChrZXlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbnRpdHlUaXRsZVwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoa2V5SW5mby5lbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS50aXRsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS50aXRsZSA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZW50aXR5IG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb3BEZXNjXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBwcm9wSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IGtleUluZm8ucHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wSW5kZXggIT09IC0xICYmIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbnRpdHkucHJvcHNbcHJvcEluZGV4XS5kZXNjID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZW51bUxhYmVsXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF0pIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKC5saXN0LCAuY3JlYXRlLCAuZWRpdCDsoJzsmbgpXG4gICAqL1xuICBleHRyYWN0RW50aXR5TGFiZWxzKCk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oc2RQYXRoLCBcImVudGl0eUxhYmVsc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgcmMta2V5cyDstpTstpxcbiAgICogcmVhY3QtY29tcG9uZW50c+yXkOyEnCDqtIDrpqzrkJjripQgaTE4biDtgqTrk6RcbiAgICogQHBhcmFtIGxvY2FsZSAtIOuhnOy8gOydvCAoa28sIGVuIOuTsSlcbiAgICovXG4gIGV4dHJhY3RSQ0tleXMobG9jYWxlOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3Qgc2RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIFwic2QuZ2VuZXJhdGVkLnRzXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzZFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gbG9jYWxl67OEIOuzgOyImOuqhSDrp6TtlZEgKHNkLnRlbXBsYXRlLnRz7J2YIGdldFJDS2V5c1Zhck5hbWXqs7wg64+Z7J28KVxuICAgIGNvbnN0IHZhck5hbWUgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiKSByZXR1cm4gXCJyY0tleXNLb1wiO1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJlblwiKSByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgICAgLy8g64uk66W4IGxvY2FsZeydgCBlbuydhCBmYWxsYmFja+ycvOuhnCDsgqzsmqlcbiAgICAgIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIHZhck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZGljdCDtjIzsnbwoW2xvY2FsZV0udHMp7JeQ7IScIOuUleyFlOuEiOumrCDroZzrk5xcbiAgICovXG4gIGxvYWRQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZykge1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBlbnRyaWVzOiB0aGlzLnBhcnNlRGljdEZpbGUoZGljdFBhdGgpIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOuNsOydtO2EsCDsiJjsp5EgKHNvbmFtdSArIGVudGl0eSArIHByb2plY3QpXG4gICAqL1xuICBhc3luYyBjb2xsZWN0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgY29uc3Qgcm93czogRGljdGlvbmFyeVJvd1tdID0gW107XG4gICAgY29uc3Qgcm93TWFwID0gbmV3IE1hcDxzdHJpbmcsIERpY3Rpb25hcnlSb3c+KCk7XG5cbiAgICAvLyAxLiBSQyBLZXlzIChzb25hbXUgc291cmNlLCDqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHJjS2V5cyA9IHRoaXMuZXh0cmFjdFJDS2V5cyhsb2NhbGUpO1xuICAgICAgZm9yIChjb25zdCByY0tleSBvZiByY0tleXMpIHtcbiAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQocmNLZXkua2V5KTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByb3cgPSB7XG4gICAgICAgICAgICBrZXk6IHJjS2V5LmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogXCJzb25hbXVcIixcbiAgICAgICAgICAgIGlzRnVuY3Rpb246IHJjS2V5LmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByb3dNYXAuc2V0KHJjS2V5LmtleSwgcm93KTtcbiAgICAgICAgfVxuICAgICAgICByb3dbbG9jYWxlXSA9IHJjS2V5LnZhbHVlO1xuICAgICAgICBpZiAocmNLZXkuaXNGdW5jdGlvbikge1xuICAgICAgICAgIHJvdy5pc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEVudGl0eSBsYWJlbHMgKGRlZmF1bHQgbG9jYWxlIOq4sOykgClcbiAgICBjb25zdCBlbnRpdHlMYWJlbHMgPSB0aGlzLmV4dHJhY3RFbnRpdHlMYWJlbHMoKTtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGVudGl0eUxhYmVscykge1xuICAgICAgY29uc3Qgcm93OiBEaWN0aW9uYXJ5Um93ID0ge1xuICAgICAgICBrZXk6IGxhYmVsLmtleSxcbiAgICAgICAgc291cmNlOiBcImVudGl0eVwiLFxuICAgICAgICBpc0Z1bmN0aW9uOiBsYWJlbC5pc0Z1bmN0aW9uID8/IGZhbHNlLFxuICAgICAgICBbZGVmYXVsdExvY2FsZV06IGxhYmVsLnZhbHVlLFxuICAgICAgfTtcbiAgICAgIHJvd01hcC5zZXQobGFiZWwua2V5LCByb3cpO1xuICAgIH1cblxuICAgIC8vIDMuIFByb2plY3QgZGljdCAo6rCBIGxvY2FsZeuzhClcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByb3dNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIC8vIHNvbmFtdSwgZW50aXR5IHNvdXJjZeqwgCDsnojsnLzrqbQg7ZW064u5IGxvY2FsZSDqsJLrp4wg7LaU6rCAXG4gICAgICAgICAgZXhpc3RpbmdbbG9jYWxlXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICAgIGlmIChlbnRyeS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBleGlzdGluZy5pc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcHJvamVjdCBzb3VyY2XroZwg7IOI66GcIOy2lOqwgFxuICAgICAgICAgIGxldCByb3cgPSByb3dNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgICAga2V5OiBlbnRyeS5rZXksXG4gICAgICAgICAgICAgIHNvdXJjZTogXCJwcm9qZWN0XCIsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb246IGVudHJ5LmlzRnVuY3Rpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcm93TWFwLnNldChlbnRyeS5rZXksIHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJvd1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3dzLnB1c2goLi4ucm93TWFwLnZhbHVlcygpKTtcbiAgICByb3dzLnNvcnQoKGEsIGIpID0+IGEua2V5LmxvY2FsZUNvbXBhcmUoYi5rZXkpKTtcblxuICAgIC8vIO2GteqzhCDqs4TsgrA6IGxvY2FsZeuzhCAo7LGE7JuM7KeEIOqwkiAvIOyghOyytCDtgqQg7IiYKVxuICAgIGNvbnN0IHN0YXRzOiBSZWNvcmQ8c3RyaW5nLCB7IHRvdGFsOiBudW1iZXI7IGZpbGxlZDogbnVtYmVyOyBwZXJjZW50OiBudW1iZXIgfT4gPSB7fTtcbiAgICBjb25zdCB0b3RhbCA9IHJvd3MubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGxlZCA9IHJvd3MuZmlsdGVyKChyb3cpID0+ICEhcm93W2xvY2FsZV0pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBlcmNlbnQgPSB0b3RhbCA+IDAgPyBNYXRoLnJvdW5kKChmaWxsZWQgLyB0b3RhbCkgKiAxMDApIDogMDtcbiAgICAgIHN0YXRzW2xvY2FsZV0gPSB7IHRvdGFsLCBmaWxsZWQsIHBlcmNlbnQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByb3dzLCBsb2NhbGVzLCBkZWZhdWx0TG9jYWxlLCBzdGF0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDsobDtmoxcbiAgICovXG4gIGFzeW5jIGdldERpY3Rpb25hcnkoKTogUHJvbWlzZTxEaWN0aW9uYXJ5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdERpY3Rpb25hcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOuhnCDrgrTrs7TrgrTquLBcbiAgICovXG4gIGFzeW5jIGV4cG9ydFRvRXhjZWwoKTogUHJvbWlzZTx7IGZpbGVuYW1lOiBzdHJpbmc7IGJ1ZmZlcjogQnVmZmVyIH0+IHtcbiAgICBjb25zdCB7IHJvd3MsIGxvY2FsZXMgfSA9IGF3YWl0IHRoaXMuY29sbGVjdERpY3Rpb25hcnkoKTtcblxuICAgIGNvbnN0IHdiID0gbmV3IFdvcmtib29rKCk7XG4gICAgY29uc3Qgc2hlZXQgPSBcImkxOG5cIjtcbiAgICB3Yi5zZXRTaGVldE5hbWUoXCJTaGVldDFcIiwgc2hlZXQpO1xuXG4gICAgY29uc3QgcHJvamVjdE5hbWUgPSBgJHtTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiU29uYW11XCJ9IERpY3Rpb25hcnlgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBbXCJrZXlcIiwgXCJzb3VyY2VcIiwgLi4ubG9jYWxlc107XG5cbiAgICAvLyDsiqTtg4Dsnbwg7KCV7J2YXG4gICAgY29uc3QgdGl0bGVTdHlsZUlkID0gd2IuYWRkU3R5bGUoe1xuICAgICAgZm9udDogeyBzaXplOiAyMyB9LFxuICAgICAgYWxpZ25tZW50OiB7IHZlcnRpY2FsOiBcImNlbnRlclwiLCBob3Jpem9udGFsOiBcImxlZnRcIiB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGhlYWRlclN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IGJvbGQ6IHRydWUsIHNpemU6IDExIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgaG9yaXpvbnRhbDogXCJjZW50ZXJcIiwgdmVydGljYWw6IFwiY2VudGVyXCIgfSxcbiAgICAgIGZpbGw6IHsgcGF0dGVybjogXCJzb2xpZFwiLCBmZ0NvbG9yOiBcIkYxRjFGMVwiIH0sXG4gICAgICBib3JkZXI6IHtcbiAgICAgICAgdG9wOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgbGVmdDogeyBzdHlsZTogXCJ0aGluXCIsIGNvbG9yOiBcIkQwRDBEMFwiIH0sXG4gICAgICAgIGJvdHRvbTogeyBzdHlsZTogXCJ0aGluXCIsIGNvbG9yOiBcIkQwRDBEMFwiIH0sXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDExIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG5cbiAgICAvLyDtlokgMTog7ZSE66Gc7KCd7Yq466qFXG4gICAgd2Iuc2V0Q2VsbFZhbHVlKHNoZWV0LCBcIkExXCIsIHByb2plY3ROYW1lKTtcbiAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIFwiQTFcIiwgdGl0bGVTdHlsZUlkKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDEsIDI4KTtcblxuICAgIC8vIO2WiSAyOiDruYgg7ZaJICjquLDrs7jqsJIpXG5cbiAgICAvLyDtlokgMzog7Zek642UXG4gICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCAzLCBcIkFcIiwgaGVhZGVycyk7XG4gICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCAzLCAyNik7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaGVhZGVycy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIGAke2NvbExldHRlcihjb2wpfTNgLCBoZWFkZXJTdHlsZUlkKTtcbiAgICB9XG5cbiAgICAvLyDtlokgNCDsnbTtm4Q6IOuNsOydtO2EsFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtyb3cua2V5LCByb3cuc291cmNlLCAuLi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiByb3dbbG9jYWxlXSA/PyBcIlwiKV07XG4gICAgICBjb25zdCByb3dOdW0gPSBpICsgNDtcbiAgICAgIHdiLnNldFJvd1ZhbHVlcyhzaGVldCwgcm93TnVtLCBcIkFcIiwgdmFsdWVzKTtcbiAgICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgcm93TnVtLCAyNCk7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB2YWx1ZXMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIGAke2NvbExldHRlcihjb2wpfSR7cm93TnVtfWAsIGRhdGFTdHlsZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOqzhOyCsFxuICAgIGNvbnN0IE1BWF9XSURUSCA9IDUwO1xuICAgIGNvbnN0IE1JTl9XSURUSCA9IDEwO1xuICAgIGNvbnN0IGNvbHVtbldpZHRoczogbnVtYmVyW10gPSBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiBNYXRoLm1heChoZWFkZXIubGVuZ3RoLCBNSU5fV0lEVEgpKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtyb3cua2V5LCByb3cuc291cmNlLCAuLi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiByb3dbbG9jYWxlXSA/PyBcIlwiKV07XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gU3RyaW5nKHZhbHVlKS5sZW5ndGg7XG4gICAgICAgIGNvbHVtbldpZHRoc1tpZHhdID0gTWF0aC5taW4oTWF0aC5tYXgoY29sdW1uV2lkdGhzW2lkeF0sIHRleHRMZW5ndGgpLCBNQVhfV0lEVEgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g7Lus65+8IOuEiOu5hCDsoIHsmqlcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2x1bW5XaWR0aHMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgd2Iuc2V0Q29sV2lkdGgoc2hlZXQsIGNvbExldHRlcihjb2wpLCBjb2x1bW5XaWR0aHNbY29sXSArIDIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogYCR7cHJvamVjdE5hbWV9LSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX0ueGxzeGAsXG4gICAgICBidWZmZXI6IHdiLndyaXRlQnVmZmVyU3luYygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhjZWzsl5DshJwg6rCA7KC47Jik6riwXG4gICAqXG4gICAqIO2YleyLnTpcbiAgICogLSAx7ZaJOiDtlITroZzsoJ3tirjrqoVcbiAgICogLSAy7ZaJOiDruYgg7ZaJXG4gICAqIC0gM+2WiTog7Zek642UIChrZXksIHNvdXJjZSwgbG9jYWxlcy4uLilcbiAgICogLSA07ZaJIOydtO2bhDog642w7J207YSwXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tRXhjZWwoYnVmZmVyOiBCdWZmZXIpOiBQcm9taXNlPEltcG9ydFJlc3VsdD4ge1xuICAgIGNvbnN0IHdiID0gV29ya2Jvb2sub3BlbkJ1ZmZlclN5bmMoYnVmZmVyKTtcbiAgICBjb25zdCBzaGVldCA9IHdiLnNoZWV0TmFtZXNbMF07XG4gICAgY29uc3QgYWxsUm93cyA9IHdiLmdldFJvd3Moc2hlZXQpO1xuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIGxldCB1cGRhdGVkRW50aXRpZXMgPSAwO1xuICAgIGxldCB1cGRhdGVkTG9jYWxlcyA9IDA7XG5cbiAgICAvLyBsb2NhbGXrs4QgcHJvamVjdCBkaWN0IGVudHJpZXNcbiAgICBjb25zdCBwcm9qZWN0RGljdEVudHJpZXM6IFJlY29yZDxzdHJpbmcsIERpY3RFbnRyeVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIHByb2plY3REaWN0RW50cmllc1tsb2NhbGVdID0gW107XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WiSDssL7quLA6IOyyqyDrsojsp7gg7Lus65+8KEEp7J20IFwia2V5XCLsnbgg7ZaJXG4gICAgbGV0IGhlYWRlclJvd051bSA9IDA7XG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHJvd0RhdGEuY2VsbHMuZmluZCgoYykgPT4gYy5jb2x1bW4gPT09IFwiQVwiKTtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFZhbHVlID0gU3RyaW5nKGZpcnN0Q2VsbD8udmFsdWUgPz8gXCJcIilcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmaXJzdENlbGxWYWx1ZSA9PT0gXCJrZXlcIikge1xuICAgICAgICBoZWFkZXJSb3dOdW0gPSByb3dEYXRhLnJvdztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlclJvd051bSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuaGVhZGVyUm93Tm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIC8vIO2XpOuNlCDtlonsl5DshJwg7Lus65+8IOunpO2VkSDqtazshLFcbiAgICBjb25zdCBoZWFkZXJSb3dEYXRhID0gYWxsUm93cy5maW5kKChyKSA9PiByLnJvdyA9PT0gaGVhZGVyUm93TnVtKTtcbiAgICBjb25zdCBjb2xUb0hlYWRlcjogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICBpZiAoaGVhZGVyUm93RGF0YSkge1xuICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGhlYWRlclJvd0RhdGEuY2VsbHMpIHtcbiAgICAgICAgY29sVG9IZWFkZXIuc2V0KGNlbGwuY29sdW1uLCBTdHJpbmcoY2VsbC52YWx1ZSA/PyBcIlwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g642w7J207YSwIO2WiSDsnb3quLAgKO2XpOuNlCDri6TsnYwg7ZaJ67aA7YSwKVxuICAgIGZvciAoY29uc3Qgcm93RGF0YSBvZiBhbGxSb3dzKSB7XG4gICAgICBpZiAocm93RGF0YS5yb3cgPD0gaGVhZGVyUm93TnVtKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgcm93VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93RGF0YS5jZWxscykge1xuICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gY29sVG9IZWFkZXIuZ2V0KGNlbGwuY29sdW1uKTtcbiAgICAgICAgaWYgKGhlYWRlck5hbWUpIHtcbiAgICAgICAgICByb3dWYWx1ZXNbaGVhZGVyTmFtZV0gPSBTdHJpbmcoY2VsbC52YWx1ZSA/PyBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSByb3dWYWx1ZXMua2V5O1xuICAgICAgY29uc3Qgc291cmNlID1cbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTrkJwg7IKs7KCEIO2CpOyZgCDqsJIg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcm93VmFsdWVzLnNvdXJjZSBhc1xuICAgICAgICAgIHwgXCJlbnRpdHlcIlxuICAgICAgICAgIHwgXCJwcm9qZWN0XCI7XG5cbiAgICAgIGlmICgha2V5IHx8ICFzb3VyY2UpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiKSB7XG4gICAgICAgIC8vIGVudGl0eSBzb3VyY2U6IGRlZmF1bHQgbG9jYWxl66eMIGVudGl0eS5qc29u7JeQIOyggOyepVxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSByb3dWYWx1ZXNbZGVmYXVsdExvY2FsZV07XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRFbnRpdGllcysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vbi1kZWZhdWx0IGxvY2FsZeydgCBwcm9qZWN0IGRpY3Tsl5Ag7KCA7J6lXG4gICAgICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgICAgICBpZiAobG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dWYWx1ZXNbbG9jYWxlXT8udHJpbSgpO1xuICAgICAgICAgIGlmIChjZWxsVmFsdWUpIHtcbiAgICAgICAgICAgIHByb2plY3REaWN0RW50cmllc1tsb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlOiBjZWxsVmFsdWUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb246IHRoaXMuaXNFeHByZXNzaW9uRnVuY3Rpb24oY2VsbFZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT09IFwicHJvamVjdFwiKSB7XG4gICAgICAgIC8vIHByb2plY3Qgc291cmNlOiDrqqjrk6AgbG9jYWxl7J2EIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV07XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgdXBkYXRlZExvY2FsZXMrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHVwZGF0ZWRFbnRpdGllcyxcbiAgICAgIHVwZGF0ZWRMb2NhbGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsiJjsoJVcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUVudHJ5KHBhcmFtczoge1xuICAgIG9sZEtleTogc3RyaW5nO1xuICAgIG5ld0tleTogc3RyaW5nO1xuICAgIHNvdXJjZTogXCJlbnRpdHlcIiB8IFwicHJvamVjdFwiIHwgXCJzb25hbXVcIjtcbiAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IG9sZEtleSwgbmV3S2V5LCBzb3VyY2UsIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIC8vIGVudGl0eSBzb3VyY2XsnZggZGVmYXVsdCBsb2NhbGUg7LKY66asXG4gICAgaWYgKHNvdXJjZSA9PT0gXCJlbnRpdHlcIiAmJiB2YWx1ZXNbZGVmYXVsdExvY2FsZV0pIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRW50aXR5QnlLZXkobmV3S2V5LCB2YWx1ZXNbZGVmYXVsdExvY2FsZV0pO1xuICAgIH1cblxuICAgIC8vIHByb2plY3QgZGljdCDsl4XrjbDsnbTtirhcbiAgICAvLyAtIGVudGl0eeydmCBub24tZGVmYXVsdCBsb2NhbGVcbiAgICAvLyAtIHByb2plY3Qgc291cmNl7J2YIOuqqOuToCBsb2NhbGVcbiAgICAvLyAtIHNvbmFtdSBzb3VyY2XsnZgg66qo65OgIGxvY2FsZSAob3ZlcnJpZGUpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZeydgCBlbnRpdHkuanNvbuyXkOyEnCDsspjrpqztlojsnLzrr4DroZwg7Iqk7YK1XG4gICAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIC8vIOq4sOyhtCBkaWN0IOuhnOuTnFxuICAgICAgY29uc3QgeyBlbnRyaWVzIH0gPSB0aGlzLmxvYWRQcm9qZWN0RGljdChsb2NhbGUpO1xuXG4gICAgICAvLyBrZXkg67OA6rK9IOyLnCDquLDsobQga2V5IOygnOqxsFxuICAgICAgaWYgKG9sZEtleSAhPT0gbmV3S2V5KSB7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGUpID0+IGUua2V5ID09PSBvbGRLZXkpO1xuICAgICAgICBpZiAob2xkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZW50cmllcy5zcGxpY2Uob2xkSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCDqsJIg7JeF642w7J207Yq4IOuYkOuKlCDstpTqsIBcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG5ld0tleSk7XG4gICAgICBjb25zdCBuZXdFbnRyeTogRGljdEVudHJ5ID0ge1xuICAgICAgICBrZXk6IG5ld0tleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfTtcblxuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXNbZXhpc3RpbmdJbmRleF0gPSBuZXdFbnRyeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRpY3Qg7YyM7J28IOyggOyepVxuICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOy2lOqwgFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50cnkocGFyYW1zOiB7IGtleTogc3RyaW5nOyB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCB2YWx1ZXMgfSA9IHBhcmFtcztcblxuICAgIGlmICgha2V5Py50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8g7KSR67O1IO2CpCDssrTtgaxcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlKSA9PiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlBbHJlYWR5RXhpc3RzXCIpKGtleSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOqwgSBsb2NhbGXsl5Ag7IOIIO2CpCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBjZWxsVmFsdWUgPSB2YWx1ZXNbbG9jYWxlXT8udHJpbSgpO1xuICAgICAgaWYgKCFjZWxsVmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBjZWxsVmFsdWUsXG4gICAgICAgIGlzRnVuY3Rpb246IHRoaXMuaXNFeHByZXNzaW9uRnVuY3Rpb24oY2VsbFZhbHVlKSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7IKt7KCcXG4gICAqL1xuICBhc3luYyBkZWxldGVFbnRyeShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlSZXF1aXJlZFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgeyBlbnRyaWVzIH0gPSB0aGlzLmxvYWRQcm9qZWN0RGljdChsb2NhbGUpO1xuICAgICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZGVsZXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5Tm90Rm91bmRcIikoa2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuvuOyCrOyaqSDtgqQg6rKA7IKsIChhc3QtZ3JlcCDsgqzsmqkpXG4gICAqL1xuICBhc3luYyBjaGVja1VzYWdlKGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVc2FnZVJlc3VsdD4ge1xuICAgIC8vIGFzdC1ncmVwIOyEpOy5mCDtmZXsnbhcbiAgICBsZXQgc2dQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgc2dQYXRoID0gZXhlY1N5bmMoXCJ3aGljaCBzZ1wiLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSkudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2dQYXRoID0gZXhlY1N5bmMoXCJ3aGljaCBhc3QtZ3JlcFwiLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSkudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGFzdC1ncmVwIG5vdCBpbnN0YWxsZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNnUGF0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6XG4gICAgICAgICAgXCJhc3QtZ3JlcOydtCDshKTsuZjrkJjslrQg7J6I7KeAIOyViuyKteuLiOuLpC4gYnJldyBpbnN0YWxsIGFzdC1ncmVwIOuYkOuKlCBucG0gaW5zdGFsbCAtZyBAYXN0LWdyZXAvY2xp66GcIOyEpOy5mO2VtOyjvOyEuOyalC5cIixcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgW1wiYXBpXCIsIFwid2ViXCIsIFwiYXBwXCJdKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgZW50cnksIFwic3JjXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc3JjUGF0aCkpIHtcbiAgICAgICAgc2VhcmNoUGF0aHMucHVzaChzcmNQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogXCLqsoDsg4ntlaAgc3JjIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gYXN0LWdyZXDsnLzroZwgU0QoXCIuLi5cIikg7Yyo7YS0IOqygOyDiVxuICAgICAgLy8g7Yyo7YS0OiBTRChcIktFWVwiKSDrmJDripQgU0QoJ0tFWScpIO2Yle2DnFxuICAgICAgY29uc3QgcGF0dGVybnMgPSBbJ1NEKFwiJEtFWVwiKScsIFwiU0QoJyRLRVknKVwiXTtcblxuICAgICAgZm9yIChjb25zdCBzZWFyY2hQYXRoIG9mIHNlYXJjaFBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleGVjU3luYyhgJHtzZ1BhdGh9IC0tcGF0dGVybiAnJHtwYXR0ZXJufScgLS1qc29uICR7c2VhcmNoUGF0aH1gLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgICAgIG1heEJ1ZmZlcjogNTAgKiAxMDI0ICogMTAyNCwgLy8gNTBNQlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIC8vIG1ldGFWYXJpYWJsZXMuc2luZ2xlLktFWS50ZXh07JeQ7IScIO2CpCDstpTstpxcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlUZXh0ID0gbWF0Y2gubWV0YVZhcmlhYmxlcz8uc2luZ2xlPy5LRVk/LnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGtleVRleHQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOuUsOyYtO2RnCDsoJzqsbBcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuS2V5ID0ga2V5VGV4dC5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgdXNlZEtleXMuYWRkKGNsZWFuS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIO2MqO2EtCDrp6TsuZgg7JeG7Jy866m0IOyXkOufrCAo66y07IucKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBrZXlzIOykkeyXkOyEnCB1c2VkS2V5c+yXkCDsl4bripQg6rKD65Ok7J20IOuvuOyCrOyaqSDtgqRcbiAgICAgIGNvbnN0IHVudXNlZEtleXMgPSBrZXlzLmZpbHRlcigoaykgPT4gIXVzZWRLZXlzLmhhcyhrKSk7XG5cbiAgICAgIHJldHVybiB7IHVudXNlZEtleXMsIHVzZWRLZXlzQ291bnQ6IHVzZWRLZXlzLnNpemUgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYOqygOyDiSDspJEg7Jik66WYIOuwnOyDnTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc29uYW11RGljdGlvbmFyeSA9IG5ldyBTb25hbXVEaWN0aW9uYXJ5KCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxTQUFTLFVBQVUsT0FBdUI7Q0FDeEMsSUFBSSxTQUFTO0NBQ2IsSUFBSSxJQUFJO0NBQ1IsT0FBTyxLQUFLLEdBQUc7RUFDYixTQUFTLE9BQU8sYUFBYSxLQUFNLElBQUksRUFBRyxJQUFJO0VBQzlDLElBQUksS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJO0NBQzNCO0NBQ0EsT0FBTztBQUNUOzs7YUExQnNDO3FCQUNrQjtvQkFDUztnQkFDbEI7U0FDdEI7Q0E0QlosbUJBQWIsTUFBOEI7Ozs7Ozs7Ozs7RUFVNUIsY0FBYyxVQUErQjtHQUMzQyxNQUFNLFVBQVUsR0FBRyxhQUFhLFVBQVUsT0FBTztHQUNqRCxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsVUFBVSxTQUFTLEdBQUcsYUFBYSxRQUFRLElBQUk7R0FFdEYsTUFBTSxVQUF1QixDQUFDO0dBRTlCLEdBQUcsYUFBYSxhQUFhLFNBQVM7SUFDcEMsSUFBSSxHQUFHLG1CQUFtQixJQUFJLEdBQUc7S0FDL0IsTUFBTSxnQkFBZ0IsS0FBSyxzQkFBc0IsS0FBSyxVQUFVO0tBQ2hFLElBQUksZUFDRixLQUFLLHlCQUF5QixlQUFlLFlBQVksT0FBTztJQUVwRTtHQUNGLENBQUM7R0FFRCxPQUFPO0VBQ1Q7Ozs7O0VBTUEsNEJBQTRCLFVBQWtCLFNBQThCO0dBQzFFLE1BQU0sVUFBVSxHQUFHLGFBQWEsVUFBVSxPQUFPO0dBQ2pELE1BQU0sYUFBYSxHQUFHLGlCQUFpQixVQUFVLFNBQVMsR0FBRyxhQUFhLFFBQVEsSUFB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
|
package/dist/dict/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dict/utils.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CAC1C,CAAC;AAQF,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dict/utils.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CAC1C,CAAC;AAQF,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM;IAEvC,MAAM,MAAM,MAAM;IAClB,IAAI,MAAM,IAAI;EAEjB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,UAkBxE"}
|