sonamu 0.7.32 → 0.7.33
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/dict/index.d.ts +1 -3
- package/dist/dict/index.d.ts.map +1 -1
- package/dist/dict/index.js +2 -1
- package/dist/dict/utils.d.ts +12 -0
- package/dist/dict/utils.d.ts.map +1 -0
- package/dist/dict/utils.js +28 -0
- package/dist/syncer/syncer.d.ts +0 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +10 -45
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +6 -12
- package/dist/ui-web/assets/{index-xXhmcdFz.js → index-D2dI7net.js} +75 -75
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/dict-parser.d.ts +4 -0
- package/dist/utils/dict-parser.d.ts.map +1 -1
- package/dist/utils/dict-parser.js +11 -1
- package/dist/utils/dict-utils.d.ts.map +1 -1
- package/dist/utils/dict-utils.js +49 -3
- package/dist/utils/fs-utils.d.ts +14 -0
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +37 -2
- package/package.json +3 -3
- package/src/dict/index.ts +1 -5
- package/src/dict/utils.ts +35 -0
- package/src/shared/app.shared.ts.txt +5 -0
- package/src/shared/web.shared.ts.txt +5 -0
- package/src/syncer/syncer.ts +14 -51
- package/src/ui/api.ts +10 -13
- package/src/utils/dict-parser.ts +14 -0
- package/src/utils/dict-utils.ts +51 -2
- package/src/utils/fs-utils.ts +46 -1
package/dist/dict/index.d.ts
CHANGED
|
@@ -8,7 +8,5 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export { default as sonamuDictEn } from "./en";
|
|
10
10
|
export { default as sonamuDictKo } from "./ko";
|
|
11
|
-
|
|
12
|
-
export type SonamuDictionary = typeof ko;
|
|
13
|
-
export type SonamuDictKey = keyof SonamuDictionary;
|
|
11
|
+
export * from "./utils";
|
|
14
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/dict/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dict/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dict/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAC/C,cAAc,SAAS,CAAC"}
|
package/dist/dict/index.js
CHANGED
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
* ```
|
|
8
8
|
*/ export { default as sonamuDictEn } from "./en.js";
|
|
9
9
|
export { default as sonamuDictKo } from "./ko.js";
|
|
10
|
+
export * from "./utils.js";
|
|
10
11
|
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWN0L2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29uYW11IEJ1aWx0LWluIERpY3Rpb25hcnlcbiAqXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHNvbmFtdURpY3RLbywgc29uYW11RGljdEVuIH0gZnJvbSAnc29uYW11L2RpY3QnO1xuICogYGBgXG4gKi9cblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBzb25hbXVEaWN0RW4gfSBmcm9tIFwiLi9lblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzb25hbXVEaWN0S28gfSBmcm9tIFwiLi9rb1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbiJdLCJuYW1lcyI6WyJkZWZhdWx0Iiwic29uYW11RGljdEVuIiwic29uYW11RGljdEtvIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztDQU9DLEdBRUQsU0FBU0EsV0FBV0MsWUFBWSxRQUFRLFVBQU87QUFDL0MsU0FBU0QsV0FBV0UsWUFBWSxRQUFRLFVBQU87QUFDL0MsY0FBYyxhQUFVIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type PluralForms = {
|
|
2
|
+
zero?: string | ((n: number) => string);
|
|
3
|
+
one?: string | ((n: number) => string);
|
|
4
|
+
other?: string | ((n: number) => string);
|
|
5
|
+
};
|
|
6
|
+
export declare function plural(n: number, forms: PluralForms): string;
|
|
7
|
+
export declare function createFormat(locale: string): {
|
|
8
|
+
number: (n: number) => string;
|
|
9
|
+
date: (d: Date) => string;
|
|
10
|
+
};
|
|
11
|
+
export declare function josa(word: string, type: "은는" | "이가" | "을를" | "과와" | "으로"): string;
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dict/utils.ts"],"names":[],"mappings":"AAAA,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;AAEF,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM;gBAE3B,MAAM;cACR,IAAI;EAEjB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,UAgBxE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function plural(n, forms) {
|
|
2
|
+
const form = n === 0 && forms.zero || n === 1 && forms.one || forms.other;
|
|
3
|
+
return typeof form === "function" ? form(n) : form ?? n.toString();
|
|
4
|
+
}
|
|
5
|
+
export function createFormat(locale) {
|
|
6
|
+
return {
|
|
7
|
+
number: (n)=>n.toLocaleString(locale),
|
|
8
|
+
date: (d)=>d.toLocaleDateString(locale)
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function josa(word, type) {
|
|
12
|
+
const has받침 = (()=>{
|
|
13
|
+
const lastChar = word.charCodeAt(word.length - 1);
|
|
14
|
+
if (lastChar < 0xac00 || lastChar > 0xd7a3) // 한글 유니코드 범위: 0xAC00 ~ 0xD7A3
|
|
15
|
+
return false;
|
|
16
|
+
return (lastChar - 0xac00) % 28 !== 0;
|
|
17
|
+
})();
|
|
18
|
+
const map = {
|
|
19
|
+
은는: has받침 ? "은" : "는",
|
|
20
|
+
이가: has받침 ? "이" : "가",
|
|
21
|
+
을를: has받침 ? "을" : "를",
|
|
22
|
+
과와: has받침 ? "과" : "와",
|
|
23
|
+
으로: has받침 ? "으로" : "로"
|
|
24
|
+
};
|
|
25
|
+
return word + map[type];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWN0L3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFBsdXJhbEZvcm1zID0ge1xuICB6ZXJvPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG4gIG9uZT86IHN0cmluZyB8ICgobjogbnVtYmVyKSA9PiBzdHJpbmcpO1xuICBvdGhlcj86IHN0cmluZyB8ICgobjogbnVtYmVyKSA9PiBzdHJpbmcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIsIGZvcm1zOiBQbHVyYWxGb3Jtcyk6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm0gPSAobiA9PT0gMCAmJiBmb3Jtcy56ZXJvKSB8fCAobiA9PT0gMSAmJiBmb3Jtcy5vbmUpIHx8IGZvcm1zLm90aGVyO1xuICByZXR1cm4gdHlwZW9mIGZvcm0gPT09IFwiZnVuY3Rpb25cIiA/IGZvcm0obikgOiAoZm9ybSA/PyBuLnRvU3RyaW5nKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybWF0KGxvY2FsZTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgbnVtYmVyOiAobjogbnVtYmVyKSA9PiBuLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSksXG4gICAgZGF0ZTogKGQ6IERhdGUpID0+IGQudG9Mb2NhbGVEYXRlU3RyaW5nKGxvY2FsZSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb3NhKHdvcmQ6IHN0cmluZywgdHlwZTogXCLsnYDripRcIiB8IFwi7J206rCAXCIgfCBcIuydhOulvFwiIHwgXCLqs7zsmYBcIiB8IFwi7Jy866GcXCIpIHtcbiAgY29uc3QgaGFz67Cb7LmoID0gKCgpID0+IHtcbiAgICBjb25zdCBsYXN0Q2hhciA9IHdvcmQuY2hhckNvZGVBdCh3b3JkLmxlbmd0aCAtIDEpO1xuICAgIGlmIChsYXN0Q2hhciA8IDB4YWMwMCB8fCBsYXN0Q2hhciA+IDB4ZDdhMylcbiAgICAgIC8vIO2VnOq4gCDsnKDri4jsvZTrk5wg67KU7JyEOiAweEFDMDAgfiAweEQ3QTNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKGxhc3RDaGFyIC0gMHhhYzAwKSAlIDI4ICE9PSAwO1xuICB9KSgpO1xuICBjb25zdCBtYXAgPSB7XG4gICAg7J2A64qUOiBoYXPrsJvsuaggPyBcIuydgFwiIDogXCLripRcIixcbiAgICDsnbTqsIA6IGhhc+uwm+y5qCA/IFwi7J20XCIgOiBcIuqwgFwiLFxuICAgIOydhOulvDogaGFz67Cb7LmoID8gXCLsnYRcIiA6IFwi66W8XCIsXG4gICAg6rO87JmAOiBoYXPrsJvsuaggPyBcIuqzvFwiIDogXCLsmYBcIixcbiAgICDsnLzroZw6IGhhc+uwm+y5qCA/IFwi7Jy866GcXCIgOiBcIuuhnFwiLFxuICB9O1xuICByZXR1cm4gd29yZCArIG1hcFt0eXBlXTtcbn1cbiJdLCJuYW1lcyI6WyJwbHVyYWwiLCJuIiwiZm9ybXMiLCJmb3JtIiwiemVybyIsIm9uZSIsIm90aGVyIiwidG9TdHJpbmciLCJjcmVhdGVGb3JtYXQiLCJsb2NhbGUiLCJudW1iZXIiLCJ0b0xvY2FsZVN0cmluZyIsImRhdGUiLCJkIiwidG9Mb2NhbGVEYXRlU3RyaW5nIiwiam9zYSIsIndvcmQiLCJ0eXBlIiwiaGFz67Cb7LmoIiwibGFzdENoYXIiLCJjaGFyQ29kZUF0IiwibGVuZ3RoIiwibWFwIiwi7J2A64qUIiwi7J206rCAIiwi7J2E66W8Iiwi6rO87JmAIiwi7Jy866GcIl0sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLFNBQVNBLE9BQU9DLENBQVMsRUFBRUMsS0FBa0I7SUFDbEQsTUFBTUMsT0FBTyxBQUFDRixNQUFNLEtBQUtDLE1BQU1FLElBQUksSUFBTUgsTUFBTSxLQUFLQyxNQUFNRyxHQUFHLElBQUtILE1BQU1JLEtBQUs7SUFDN0UsT0FBTyxPQUFPSCxTQUFTLGFBQWFBLEtBQUtGLEtBQU1FLFFBQVFGLEVBQUVNLFFBQVE7QUFDbkU7QUFFQSxPQUFPLFNBQVNDLGFBQWFDLE1BQWM7SUFDekMsT0FBTztRQUNMQyxRQUFRLENBQUNULElBQWNBLEVBQUVVLGNBQWMsQ0FBQ0Y7UUFDeENHLE1BQU0sQ0FBQ0MsSUFBWUEsRUFBRUMsa0JBQWtCLENBQUNMO0lBQzFDO0FBQ0Y7QUFFQSxPQUFPLFNBQVNNLEtBQUtDLElBQVksRUFBRUMsSUFBc0M7SUFDdkUsTUFBTUMsUUFBUSxBQUFDLENBQUE7UUFDYixNQUFNQyxXQUFXSCxLQUFLSSxVQUFVLENBQUNKLEtBQUtLLE1BQU0sR0FBRztRQUMvQyxJQUFJRixXQUFXLFVBQVVBLFdBQVcsUUFDbEMsOEJBQThCO1FBQzlCLE9BQU87UUFDVCxPQUFPLEFBQUNBLENBQUFBLFdBQVcsTUFBSyxJQUFLLE9BQU87SUFDdEMsQ0FBQTtJQUNBLE1BQU1HLE1BQU07UUFDVkMsSUFBSUwsUUFBUSxNQUFNO1FBQ2xCTSxJQUFJTixRQUFRLE1BQU07UUFDbEJPLElBQUlQLFFBQVEsTUFBTTtRQUNsQlEsSUFBSVIsUUFBUSxNQUFNO1FBQ2xCUyxJQUFJVCxRQUFRLE9BQU87SUFDckI7SUFDQSxPQUFPRixPQUFPTSxHQUFHLENBQUNMLEtBQUs7QUFDekIifQ==
|
package/dist/syncer/syncer.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIjF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAKjB,MAAM,iBAAiB,CAAC;AAEzB,KAAK,UAAU,GAAG;KACf,GAAG,IAAI,QAAQ,GAAG,YAAY,EAAE;CAClC,CAAC;AAEF,qBAAa,MAAM;IACjB,IAAI,EAAE,UAAU,CAAM;IACtB,KAAK,EAAE,WAAW,CAAM;IACxB,MAAM,EAAE,YAAY,CAAM;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAa;IACvD,YAAY,EAAE,YAAY,CAAsB;IAEhD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC3B;;;;;OAKG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAsE/E,+BAA+B,CAC7B,eAAe,EAAE,YAAY,GAC5B,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE;IAc9B,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
|
package/dist/syncer/syncer.js
CHANGED
|
@@ -2,7 +2,7 @@ import { hot } from "@sonamu-kit/hmr-hook";
|
|
|
2
2
|
import assert from "assert";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { EventEmitter } from "events";
|
|
5
|
-
import {
|
|
5
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
6
|
import inflection from "inflection";
|
|
7
7
|
import { minimatch } from "minimatch";
|
|
8
8
|
import path, { dirname } from "path";
|
|
@@ -17,7 +17,7 @@ import { TemplateKey } from "../types/types.js";
|
|
|
17
17
|
import { mapAsync, reduceAsync } from "../utils/async-utils.js";
|
|
18
18
|
import { centerText } from "../utils/console-util.js";
|
|
19
19
|
import { isTest } from "../utils/controller.js";
|
|
20
|
-
import { exists } from "../utils/fs-utils.js";
|
|
20
|
+
import { copyFileWithReplaceCoreToShared, exists } from "../utils/fs-utils.js";
|
|
21
21
|
import { runWithGracefulShutdown } from "../utils/process-utils.js";
|
|
22
22
|
import { areFilesSame, findChangedFilesUsingChecksums, renewChecksums } from "./checksum.js";
|
|
23
23
|
import { generateTemplate, renderTemplate } from "./code-generator.js";
|
|
@@ -143,9 +143,13 @@ export class Syncer {
|
|
|
143
143
|
return toRemove;
|
|
144
144
|
}
|
|
145
145
|
async copySharedToTargets(targets) {
|
|
146
|
+
// plural.ts 내용을 읽어서 shared 파일에 삽입합니다.
|
|
147
|
+
const dictUtilsPath = path.join(import.meta.dirname.replace("/dist/", "/src/"), "../dict/utils.ts");
|
|
148
|
+
const dictUtilsCode = await exists(dictUtilsPath) ? await readFile(dictUtilsPath, "utf-8") : "";
|
|
146
149
|
// 특정 변수 치환을 위해서 사용합니다.
|
|
147
150
|
const convertMap = {
|
|
148
|
-
baseUrl: Sonamu.config.server.baseUrl ?? `http://${Sonamu.config.server.listen?.host ?? "localhost"}:${Sonamu.config.server.listen?.port ?? 3000}
|
|
151
|
+
baseUrl: Sonamu.config.server.baseUrl ?? `http://${Sonamu.config.server.listen?.host ?? "localhost"}:${Sonamu.config.server.listen?.port ?? 3000}`,
|
|
152
|
+
dictUtils: dictUtilsCode
|
|
149
153
|
};
|
|
150
154
|
for (const target of targets){
|
|
151
155
|
// 지금 가져가려는 이 파일은 Sonamu 코드베이스의 일부입니다.
|
|
@@ -425,31 +429,10 @@ export class Syncer {
|
|
|
425
429
|
});
|
|
426
430
|
}
|
|
427
431
|
!isTest() && console.log(chalk.bold("Copied: ") + chalk.blue(dst.replace(`${Sonamu.appRootPath}/`, "")));
|
|
428
|
-
await
|
|
432
|
+
await copyFileWithReplaceCoreToShared(realSrc, dst);
|
|
429
433
|
return dst;
|
|
430
434
|
}))))).flat();
|
|
431
435
|
}
|
|
432
|
-
async copyFileWithReplaceCoreToShared(fromPath, toPath) {
|
|
433
|
-
if (!await exists(fromPath)) {
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
const oldFileContent = (await readFile(fromPath)).toString();
|
|
437
|
-
const newFileContent = (()=>{
|
|
438
|
-
// web이나 app 등에는 sonamu가 없습니다.
|
|
439
|
-
// 따라서 sonamu에 대한 import는 함께 복사되는 sonamu.shared.ts에 대한 import로 치환해야 합니다.
|
|
440
|
-
// 문제는 리소스 종류에 따라 sonamu.shared.ts로 가는 경로가 다르다는 점입니다.
|
|
441
|
-
// 예를 들어 sonamu.generated.ts 입장에서 sonamu.shared.ts는 같은 디렉토리에 있으니 ./sonamu.shared로 치환하면 되지만,
|
|
442
|
-
// user.types.ts 입장에서 sonamu.shared.ts는 상위 디렉토리에 있으니 ../sonamu.shared로 치환해야 합니다.
|
|
443
|
-
// 이 문제를 해결하기 위해 복사하고자 하는 리소스의 경로(toPath)를 기준으로 sonamu.shared.ts가 있는 디렉토리를 찾아서 상대 경로를 계산하도록 하였습니다.
|
|
444
|
-
const servicesDir = toPath.replace(/\/services\/.*$/, "/services");
|
|
445
|
-
const fileDir = dirname(toPath);
|
|
446
|
-
const relativePath = path.relative(fileDir, servicesDir);
|
|
447
|
-
const sharedPath = relativePath === "" ? "./sonamu.shared" : `${relativePath}/sonamu.shared`;
|
|
448
|
-
const nfc = oldFileContent.replace(/from "sonamu"/g, `from "${sharedPath}"`);
|
|
449
|
-
return nfc;
|
|
450
|
-
})();
|
|
451
|
-
return writeFile(toPath, newFileContent);
|
|
452
|
-
}
|
|
453
436
|
/**
|
|
454
437
|
* 주어진 엔티티와 템플릿 키에 대해, 생성된 코드가 존재하는지 확인합니다.
|
|
455
438
|
* @param entityId 엔티티 ID
|
|
@@ -560,28 +543,10 @@ export class Syncer {
|
|
|
560
543
|
for (const locale of locales){
|
|
561
544
|
const sourceFile = path.join(apiI18nDir, `${locale}.ts`);
|
|
562
545
|
const targetFile = path.join(targetI18nDir, `${locale}.ts`);
|
|
563
|
-
|
|
564
|
-
try {
|
|
565
|
-
await access(sourceFile);
|
|
566
|
-
} catch {
|
|
567
|
-
continue;
|
|
568
|
-
}
|
|
569
|
-
// 소스 파일 읽기
|
|
570
|
-
const sourceContent = await readFile(sourceFile, "utf-8");
|
|
571
|
-
// 타겟 파일이 존재하면 내용 비교
|
|
572
|
-
try {
|
|
573
|
-
const targetContent = await readFile(targetFile, "utf-8");
|
|
574
|
-
if (sourceContent === targetContent) {
|
|
575
|
-
continue; // 내용이 같으면 스킵
|
|
576
|
-
}
|
|
577
|
-
} catch {
|
|
578
|
-
// 파일이 없음 - 복사 진행
|
|
579
|
-
}
|
|
580
|
-
// 파일 복사
|
|
581
|
-
await writeFile(targetFile, sourceContent);
|
|
546
|
+
await copyFileWithReplaceCoreToShared(sourceFile, targetFile);
|
|
582
547
|
!isTest() && console.log(chalk.bold("Copied: ") + chalk.cyan(`${target}/src/i18n/${locale}.ts`));
|
|
583
548
|
}
|
|
584
549
|
}
|
|
585
550
|
}
|
|
586
551
|
|
|
587
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBhY2Nlc3MsIG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQge1xuICBjaGVja3N1bVBhdHRlcm5Hcm91cCxcbiAgdHlwZSBGaWxlVHlwZSxcbiAgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCxcbn0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiDssrTtgazshKzsnbQg67OA6rK965CcIOu2gOu2hOyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog64uk66eMIHNvbmFtdS5zaGFyZWQudHPripQg7LK07YGs7ISsIOu5hOq1kCDsl4bsnbQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzKTtcblxuICAgIC8vIOq3uCDri6TsnYzrtoDthLDripQg67OA6rK965CcIO2MjOydvOydhCDssL7slYTshJwg64+Z6riw7ZmUIOyekeyXheydhCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuXG4gICAgICAvLyDrs4Dqsr3sgqztla3snbQg7JeG7Ja064+EIFNTUiDthZztlIzrpr/snYAg7IOd7ISxICjstIjquLAg7ISk7KCVIOyLnCwg7J2066+4IOyhtOyerO2VmOuptCDsiqTtgrUpXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwicXVlcmllc1wiLCB7fSwgeyBvdmVyd3JpdGU6IGZhbHNlIH0pO1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiZW50cnlfc2VydmVyXCIsIHt9LCB7IG92ZXJ3cml0ZTogZmFsc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIO2MjOydvOydtCDsnbTrr7gg7KG07J6s7ZWY66m0IOustOyLnFxuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGdlbmVyYXRlIFNTUiB0ZW1wbGF0ZXM6XCIsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTU1Ig7ISk7KCVIO2MjOydvCDrs4Dqsr0g6rCQ7KeAXG4gICAgaWYgKGRpZmZGaWxlUGF0aC5pbmNsdWRlcyhcIi9zcmMvc3NyL1wiKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZC55ZWxsb3coXCJTU1IgY29uZmlnIGNoYW5nZWQgLSByZWxvYWRpbmcuLi5cIikpO1xuICAgICAgLy8gU1NSIO2MjOydvOuPhCBpbnZhbGlkYXRlIO2bhCByZWxvYWRcbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hdXRvbG9hZFNTUlJvdXRlcygpO1xuICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOydvOuLqCDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgLy8g7ZWcIOuyiCDsnbTsg4EgaW1wb3J065CcIOy5nOq1rOuTpOyXkCDrjIDtlbTshJzrp4wg7Iuk7KCcIOyekeyXheydtCDsnbzslrTrgqnri4jri6QuXG4gICAgLy8g6re465+s64uIIOyViOyLrO2VmOqzoCBpbnZhbGlkYXRlIO2VtOuPhCDrkKnri4jri6QuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zdCBpbnZhbGlkYXRlZFBhdGhzID0gKGF3YWl0IGhvdC5pbnZhbGlkYXRlRmlsZShkaWZmRmlsZVBhdGgsIGV2ZW50KSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgIGlmIChpbnZhbGlkYXRlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVtb3ZlIGludmFsaWRhdGVkIHJlZ2lzdGVyZWQgQVBJcyBmb3IgJHtpbnZhbGlkYXRlZFBhdGh9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpKS5zb21lKFxuICAgICAgKHBhdHRlcm4pID0+IG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICk7XG5cbiAgICAvLyDtlaAg7J28KHN5bmMp7J20IOyeiOycvOuptCDtlanri4jri6QuXG4gICAgaWYgKGlzSW5DaGVja1BhdHRlcm5Hcm91cCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKFtkaWZmRmlsZVBhdGhdKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCmOuptCDrqqjrk6Ag66qo65OI7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICAvLyBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcblxuICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoXCJvbkhNUkNvbXBsZXRlZFwiKTtcbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgaWYgKCFpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIiAvKuyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC4qLykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IGAke2VudGl0eUlkfU1vZGVsYCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShyZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDtirnsoJUg67OA7IiYIOy5mO2ZmOydhCDsnITtlbTshJwg7IKs7Jqp7ZWp64uI64ukLlxuICAgIGNvbnN0IGNvbnZlcnRNYXAgPSB7XG4gICAgICBiYXNlVXJsOlxuICAgICAgICBTb25hbXUuY29uZmlnLnNlcnZlci5iYXNlVXJsID8/XG4gICAgICAgIGBodHRwOi8vJHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMH1gLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyDsp4DquIgg6rCA7KC46rCA66Ck64qUIOydtCDtjIzsnbzsnYAgU29uYW11IOy9lOuTnOuyoOydtOyKpOydmCDsnbzrtoDsnoXri4jri6QuXG4gICAgICAvLyDqt7jrn7DrjbAgZGlzdCDsho0g67mM65Oc65CcIOyGjOyKpCDsvZTrk5wg7YyM7J287J20IO2VhOyalO2VnCDqsoPsnbQg7JWE64uI6rOgLCBzcmPsl5Drp4wg7J6I64qUIO2FjeyKpO2KuCDtjIzsnbzsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpLFxuICAgICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICAgICk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnVsbFRleHQgPSBhd2FpdCByZWFkRmlsZShzcmNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgY29udmVydGVkVGV4dCA9IE9iamVjdC5lbnRyaWVzKGNvbnZlcnRNYXApLnJlZHVjZShcbiAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiBhY2MucmVwbGFjZShgJFtbJHtrZXl9XV1gLCB2YWx1ZSksXG4gICAgICAgIGZ1bGxUZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCJzcmMvc2VydmljZXMvc29uYW11LnNoYXJlZC50c1wiKTtcblxuICAgICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShkZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBhcmVGaWxlc1NhbWUoeyBkYXRhOiBjb252ZXJ0ZWRUZXh0IH0sIHsgcGF0aDogZGVzdFBhdGggfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgY29udmVydGVkVGV4dCk7XG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkU1NSUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNzckNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9zc3JcIik7XG5cbiAgICAvLyDquLDsobQgcm91dGVzIOy0iOq4sO2ZlFxuICAgIGNvbnN0IHsgY2xlYXJTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjbGVhclNTUlJvdXRlcygpO1xuXG4gICAgLy8gc3NyIO2PtOuNlCDsl4bsnLzrqbQg7Iqk7YK1XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNzckNvbmZpZ1BhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNzciDtj7TrjZQg7JWI7J2YIOuqqOuToCAudHMg7YyM7J28IOuhnOuTnFxuICAgIGNvbnN0IHsgZ2xvYkFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9hc3luYy11dGlsc1wiKTtcbiAgICBjb25zdCB7IGltcG9ydE1lbWJlcnMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2VzbS11dGlsc1wiKTtcbiAgICBjb25zdCB7IHJ1bnRpbWVQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9wYXRoLXV0aWxzXCIpO1xuXG4gICAgLy8gcnVudGltZVBhdGjrpbwg7IKs7Jqp7ZWY7JesIOqwnOuwnC/tlITroZzrjZXshZgg7ZmY6rK97JeQIOunnuuKlCDtmZXsnqXsnpAg7LKY66asXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBnbG9iQXN5bmMocGF0aC5qb2luKHNzckNvbmZpZ1BhdGgsIHJ1bnRpbWVQYXRoKFwiKiovKi50c1wiKSkpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpbXBvcnRNZW1iZXJz66W8IOyCrOyaqe2VmOuptCDtjIzsnbzsnZggc2lkZSBlZmZlY3QocmVnaXN0ZXJTU1Ig7Zi47LacKeqwgCDsi6TtlonrkKhcbiAgICAgICAgYXdhaXQgaW1wb3J0TWVtYmVycyhmaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgU1NSIHJvdXRlOiAke2ZpbGV9YCwgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB3b3JrZmxvd1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJ3b3JrZmxvd1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIH1cblxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJpMThuXCIpIHx8IGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jU0QoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICBjb25zdCBmaWxlVHlwZXMgPSBPYmplY3Qua2V5cyhjaGVja3N1bVBhdHRlcm5Hcm91cCkgYXMgRmlsZVR5cGVbXTtcblxuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChmaWxlUGF0aCkgPT4ge1xuICAgICAgLy8g7KCI64yAIOqyveuhnOyXkOyEnCBzcmMv66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966GcIOu2gOu2hOydhCDstpTstpztlanri4jri6QuXG4gICAgICBjb25zdCBzcmNJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIvc3JjL1wiKTtcbiAgICAgIGlmIChzcmNJbmRleCA9PT0gLTEpIHJldHVybiBcInVua25vd25cIjtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnNsaWNlKHNyY0luZGV4ICsgMSk7IC8vIFwic3JjLy4uLlwiIO2Yle2DnFxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVUeXBlIG9mIGZpbGVUeXBlcykge1xuICAgICAgICBpZiAobWluaW1hdGNoKHJlbGF0aXZlUGF0aCwgY2hlY2tzdW1QYXR0ZXJuR3JvdXBbZmlsZVR5cGVdKSkge1xuICAgICAgICAgIHJldHVybiBmaWxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgWywgZnJhbWVOYW1lXSA9IG1vZGVsUGF0aC5tYXRjaCgvLitcXC8oLispXFwuZnJhbWVcXC50cyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIC8vIGZyYW1lTmFtZeydhCBQYXNjYWxDYXNl66GcIOuzgO2ZmCAoZGFzaGJvYXJkIC0+IERhc2hib2FyZClcbiAgICAgICAgY29uc3QgZnJhbWVJZCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcblxuICAgIC8vIHF1ZXJpZXMuZ2VuZXJhdGVkLnRzIOuwjyBlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeCDsnqzsg53shLFcbiAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwicXVlcmllc1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImVudHJ5X3NlcnZlclwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH1cblxuICAvLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG4gIGFzeW5jIGFjdGlvblN5bmNDb25maWcoKSB7XG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gICAgY29uc3QgY29udGVudCA9IGBBUElfSE9TVD0ke2hvc3QgPz8gXCJsb2NhbGhvc3RcIn1cXG5BUElfUE9SVD0ke3BvcnQgPz8gMzAwMH1gO1xuXG4gICAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VzLmdlbmVyYXRlZC50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEBwYXJhbSBwYXJhbXNBcnJheVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICAgIHBhcmFtc0FycmF5OiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgTmFpdGUudChcImFjdGlvbkdlbmVyYXRlU2VydmljZXNcIiwgcGFyYW1zQXJyYXkpO1xuXG4gICAgLy8gc2VydmljZXMuZ2VuZXJhdGVkLnRzIO2Gte2VqSDtjIzsnbwg7IOd7ISxXG4gICAgY29uc3Qgc2VydmljZXNGaWxlID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwic2VydmljZXNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnNlcnZpY2VzRmlsZV07XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2NoZW1hcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIF0pXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH0sXG4gICAgKTtcbiAgICBhc3NlcnQocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqICoudHlwZXMudHMsICouZnVuY3Rpb25zLnRzLCAqLmdlbmVyYXRlZC50c+ulvCDtg4Dqsp8g65SU66CJ7Yag66as7JeQIOuzteyCrO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHRzUGF0aHNcbiAgICogQHJldHVybnMg67O17IKs65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdHNQYXRocy5tYXAoYXN5bmMgKHJlYWxTcmMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIvYXBwbGljYXRpb24vXCIsIFwiL3NlcnZpY2VzL1wiKTtcbiAgICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoZnJvbVBhdGg6IHN0cmluZywgdG9QYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoZnJvbVBhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGZyb21QYXRoKSkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gKCgpID0+IHtcbiAgICAgIC8vIHdlYuydtOuCmCBhcHAg65Ox7JeQ64qUIHNvbmFtdeqwgCDsl4bsirXri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgc29uYW117JeQIOuMgO2VnCBpbXBvcnTripQg7ZWo6ruYIOuzteyCrOuQmOuKlCBzb25hbXUuc2hhcmVkLnRz7JeQIOuMgO2VnCBpbXBvcnTroZwg7LmY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOusuOygnOuKlCDrpqzshozsiqQg7KKF66WY7JeQIOuUsOudvCBzb25hbXUuc2hhcmVkLnRz66GcIOqwgOuKlCDqsr3roZzqsIAg64uk66W064uk64qUIOygkOyeheuLiOuLpC5cbiAgICAgIC8vIOyYiOulvCDrk6TslrQgc29uYW11LmdlbmVyYXRlZC50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDqsJnsnYAg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuL3NvbmFtdS5zaGFyZWTroZwg7LmY7ZmY7ZWY66m0IOuQmOyngOunjCxcbiAgICAgIC8vIHVzZXIudHlwZXMudHMg7J6F7J6l7JeQ7IScIHNvbmFtdS5zaGFyZWQudHPripQg7IOB7JyEIOuUlOugie2GoOumrOyXkCDsnojsnLzri4ggLi4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g7J20IOusuOygnOulvCDtlbTqsrDtlZjquLAg7JyE7ZW0IOuzteyCrO2VmOqzoOyekCDtlZjripQg66as7IaM7Iqk7J2YIOqyveuhnCh0b1BhdGgp66W8IOq4sOykgOycvOuhnCBzb25hbXUuc2hhcmVkLnRz6rCAIOyeiOuKlCDrlJTroInthqDrpqzrpbwg7LC+7JWE7IScIOyDgeuMgCDqsr3roZzrpbwg6rOE7IKw7ZWY64+E66GdIO2VmOyYgOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNlcnZpY2VzRGlyID0gdG9QYXRoLnJlcGxhY2UoL1xcL3NlcnZpY2VzXFwvLiokLywgXCIvc2VydmljZXNcIik7XG4gICAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmaWxlRGlyLCBzZXJ2aWNlc0Rpcik7XG4gICAgICBjb25zdCBzaGFyZWRQYXRoID0gcmVsYXRpdmVQYXRoID09PSBcIlwiID8gXCIuL3NvbmFtdS5zaGFyZWRcIiA6IGAke3JlbGF0aXZlUGF0aH0vc29uYW11LnNoYXJlZGA7XG5cbiAgICAgIGNvbnN0IG5mYyA9IG9sZEZpbGVDb250ZW50LnJlcGxhY2UoL2Zyb20gXCJzb25hbXVcIi9nLCBgZnJvbSBcIiR7c2hhcmVkUGF0aH1cImApO1xuICAgICAgcmV0dXJuIG5mYztcbiAgICB9KSgpO1xuICAgIHJldHVybiB3cml0ZUZpbGUodG9QYXRoLCBuZXdGaWxlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pj47XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogU0QoU29uYW11IERpY3Rpb25hcnkpIO2FnO2UjOumv+ydhCDsg53shLHtlanri4jri6QuXG4gICAqIGkxOG4g7ISk7KCV7J20IOyeiOydhCDrlYzrp4wg7Zi47Lac65Cp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgc3luY1NEKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG4gICAgaWYgKCFpMThuQ29uZmlnKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRMaXN0ID0gW1wiYXBpXCIsIC4uLnRhcmdldHNdIGFzIChcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIpW107XG5cbiAgICBjb25zdCBhcGlJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgU29uYW11LmNvbmZpZy5hcGkuZGlyLCBcInNyYy9pMThuXCIpO1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0TGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViL2FwcOydmCDqsr3smrAgbG9jYWxlIO2MjOydvOuTpOydhCBhcGnsl5DshJwg67O17IKsXG4gICAgICAgIGlmICh0YXJnZXQgIT09IFwiYXBpXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNMb2NhbGVGaWxlcyh0YXJnZXQsIGFwaUkxOG5EaXIsIGkxOG5Db25maWcuc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwic2RcIiwgeyB0YXJnZXQgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZW5lcmF0ZSBTRCB0ZW1wbGF0ZSBmb3IgJHt0YXJnZXR9OmAsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhcGnsnZggbG9jYWxlIO2MjOydvOydhCB3ZWIvYXBw7Jy866GcIOuzteyCrO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3luY0xvY2FsZUZpbGVzKFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIGFwaUkxOG5EaXI6IHN0cmluZyxcbiAgICBsb2NhbGVzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0STE4bkRpciA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCJzcmMvaTE4blwiKTtcblxuICAgIC8vIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQg7IOd7ISxXG4gICAgYXdhaXQgbWtkaXIodGFyZ2V0STE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VGaWxlID0gcGF0aC5qb2luKGFwaUkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICAgIGNvbnN0IHRhcmdldEZpbGUgPSBwYXRoLmpvaW4odGFyZ2V0STE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuXG4gICAgICAvLyDshozsiqQg7YyM7J287J20IOyhtOyerO2VmOuKlOyngCDtmZXsnbhcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFjY2Vzcyhzb3VyY2VGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyDshozsiqQg7YyM7J287J20IOyXhuycvOuptCDsiqTtgrVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOyGjOyKpCDtjIzsnbwg7J296riwXG4gICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8g7YOA6rKfIO2MjOydvOydtCDsobTsnqztlZjrqbQg64K07JqpIOu5hOq1kFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldEZpbGUsIFwidXRmLThcIik7XG4gICAgICAgIGlmIChzb3VyY2VDb250ZW50ID09PSB0YXJnZXRDb250ZW50KSB7XG4gICAgICAgICAgY29udGludWU7IC8vIOuCtOyaqeydtCDqsJnsnLzrqbQg7Iqk7YK1XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyDtjIzsnbzsnbQg7JeG7J2MIC0g67O17IKsIOynhO2WiVxuICAgICAgfVxuXG4gICAgICAvLyDtjIzsnbwg67O17IKsXG4gICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0RmlsZSwgc291cmNlQ29udGVudCk7XG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuY3lhbihgJHt0YXJnZXR9L3NyYy9pMThuLyR7bG9jYWxlfS50c2ApKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIkV2ZW50RW1pdHRlciIsImFjY2VzcyIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIkFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24iLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJleGlzdHMiLCJydW5XaXRoR3JhY2VmdWxTaHV0ZG93biIsImFyZUZpbGVzU2FtZSIsImZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcyIsInJlbmV3Q2hlY2tzdW1zIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsInJlbmRlclRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwiY2hlY2tzdW1QYXR0ZXJuR3JvdXAiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwibG9hZEFwaXMiLCJsb2FkTW9kZWxzIiwibG9hZFR5cGVzIiwibG9hZFdvcmtmbG93cyIsIlN5bmNlciIsImFwaXMiLCJ0eXBlcyIsIm1vZGVscyIsIndvcmtmbG93cyIsIk1hcCIsImV2ZW50RW1pdHRlciIsInN5bmMiLCJ0YXJnZXRzIiwiY29uZmlnIiwiY29weVNoYXJlZFRvVGFyZ2V0cyIsImNoYW5nZWRGaWxlcyIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJibGFjayIsImJnR3JlZW4iLCJvdmVyd3JpdGUiLCJlIiwiZXJyb3IiLCJkb1N5bmNBY3Rpb25zIiwid2hlblRoaXNIYXBwZW5zIiwid2FpdEZvclVwVG8iLCJzeW5jRnJvbVdhdGNoZXIiLCJldmVudCIsImRpZmZGaWxlUGF0aCIsImluY2x1ZGVzIiwiYm9sZCIsInllbGxvdyIsImludmFsaWRhdGVGaWxlIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJlbWl0IiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsInJlZCIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsImNvbnZlcnRNYXAiLCJiYXNlVXJsIiwic2VydmVyIiwibGlzdGVuIiwiaG9zdCIsInBvcnQiLCJ0YXJnZXQiLCJzcmNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZnVsbFRleHQiLCJjb252ZXJ0ZWRUZXh0IiwiZW50cmllcyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGF0YSIsInN5bmNocm9uaXplIiwic3NyQ29uZmlnUGF0aCIsImNsZWFyU1NSUm91dGVzIiwiZ2xvYkFzeW5jIiwiaW1wb3J0TWVtYmVycyIsInJ1bnRpbWVQYXRoIiwiZmlsZXMiLCJmaWxlIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJzeW5jU0QiLCJkaWZmRmlsZXMiLCJmaWxlVHlwZXMiLCJmaWxlUGF0aCIsInNyY0luZGV4IiwicmVsYXRpdmVQYXRoIiwic2xpY2UiLCJmaWxlVHlwZSIsInQiLCJyZWxvYWQiLCJlbnRpdHkiLCJnZXQiLCJ0eXBlRmlsZVBhdGgiLCJuYW1lcyIsImZzIiwicGFyZW50SWQiLCJ1bmRlZmluZWQiLCJhY3Rpb25HZW5lcmF0ZVNjaGVtYXMiLCJnZW5lcmF0ZWQiLCJwdXNoIiwidHNQYXRocyIsImZ1bmN0aW9ucyIsImFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIm1lcmdlZEdyb3VwIiwibW9kZWwiLCJmcmFtZSIsInBhcmFtcyIsIm1hcCIsIm1vZGVsUGF0aCIsIm5hbWVzUmVjb3JkIiwiZ2V0TmFtZXNGcm9tSWQiLCJmcmFtZU5hbWUiLCJtYXRjaCIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiY29udGVudCIsIlByb21pc2UiLCJhbGwiLCJwYXJhbXNBcnJheSIsInNlcnZpY2VzRmlsZSIsImZsYXQiLCJyZXMiLCJkaXIiLCJhcGlEaXIiLCJyZWFsU3JjIiwiZHN0IiwiY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCIsImZyb21QYXRoIiwidG9QYXRoIiwib2xkRmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsIm5ld0ZpbGVDb250ZW50Iiwic2VydmljZXNEaXIiLCJmaWxlRGlyIiwic2hhcmVkUGF0aCIsIm5mYyIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIiwiaTE4bkNvbmZpZyIsImkxOG4iLCJ0YXJnZXRMaXN0IiwiYXBpSTE4bkRpciIsInN5bmNMb2NhbGVGaWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJsb2NhbGVzIiwidGFyZ2V0STE4bkRpciIsImxvY2FsZSIsInNvdXJjZUZpbGUiLCJ0YXJnZXRGaWxlIiwic291cmNlQ29udGVudCIsInRhcmdldENvbnRlbnQiLCJjeWFuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsWUFBWSxRQUFRLFNBQVM7QUFDdEMsU0FBU0MsTUFBTSxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ2pFLE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLE9BQU9DLFFBQVFDLE9BQU8sUUFBUSxPQUFPO0FBQ3JDLFNBQVNDLEtBQUssRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFHeEMsU0FBU0MsY0FBYyxRQUFRLHVCQUFvQjtBQUNuRCxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLGFBQWEsUUFBZ0MsOEJBQTJCO0FBQ2pGLFNBQVNDLHlCQUF5QixRQUFRLGlDQUE4QjtBQUN4RSxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLGVBQWUsUUFBUSxrQ0FBK0I7QUFFL0QsU0FBU0MsV0FBVyxRQUE4QixvQkFBaUI7QUFD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
|
|
552
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVPcHRpb25zLCBQYXRoQW5kQ29kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVLZXksIHR5cGUgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBtYXBBc3luYywgcmVkdWNlQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCwgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBhcmVGaWxlc1NhbWUsIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgY2hlY2tzdW1QYXR0ZXJuR3JvdXAsXG4gIHR5cGUgRmlsZVR5cGUsXG4gIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgsXG59IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTG9hZGVkQXBpcyxcbiAgdHlwZSBMb2FkZWRNb2RlbHMsXG4gIHR5cGUgTG9hZGVkVHlwZXMsXG4gIGxvYWRBcGlzLFxuICBsb2FkTW9kZWxzLFxuICBsb2FkVHlwZXMsXG4gIGxvYWRXb3JrZmxvd3MsXG59IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBEaWZmR3JvdXBzID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogQWJzb2x1dGVQYXRoW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcblxuICAgICAgLy8g67OA6rK97IKs7ZWt7J20IOyXhuyWtOuPhCBTU1Ig7YWc7ZSM66a/7J2AIOyDneyEsSAo7LSI6riwIOyEpOyglSDsi5wsIOydtOuvuCDsobTsnqztlZjrqbQg7Iqk7YK1KVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcInF1ZXJpZXNcIiwge30sIHsgb3ZlcndyaXRlOiBmYWxzZSB9KTtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImVudHJ5X3NlcnZlclwiLCB7fSwgeyBvdmVyd3JpdGU6IGZhbHNlIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyDtjIzsnbzsnbQg7J2066+4IOyhtOyerO2VmOuptCDrrLTsi5xcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24pKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBnZW5lcmF0ZSBTU1IgdGVtcGxhdGVzOlwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g66eM7JW9IOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAg6rCQ7KeA7ZWcIO2MjOydvCDrs4Dqsr0g7IKs7ZWt7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDso7zslrTsp4Qg67OA6rK9IO2MjOydvOuTpCDspJEg7LK07YGs7ISsIOq0gOumrCDrjIDsg4Hsnbgg6rKD65Ok66eMIOqwgOyguOuLpOqwgCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDssrTtgazshKwg7YyM7J28IOyXheuNsOydtO2KuOuKlCDsl6zquLDsl5DshJwg7ZWY7KeAIOyViuyKteuLiOuLpC4g7Zi47Lac7J6Q6rCAIO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aCAtIOuzgOqyvSDtjIzsnbzrk6QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAgXCJzcmMvXCIg65iQ64qUIFwiZGlzdC9cIuuhnCDsi5zsnpHtlZjripQg7IOB64yAIOqyveuhnOyeheuLiOuLpC4g7JiI7IucOiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICAgKi9cbiAgYXN5bmMgc3luY0Zyb21XYXRjaGVyKGV2ZW50OiBzdHJpbmcsIGRpZmZGaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiICYmIGV2ZW50ICE9PSBcInVubGlua1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIOyEpOyglSDtjIzsnbwg67OA6rK9IOqwkOyngFxuICAgIGlmIChkaWZmRmlsZVBhdGguaW5jbHVkZXMoXCIvc3JjL3Nzci9cIikpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQueWVsbG93KFwiU1NSIGNvbmZpZyBjaGFuZ2VkIC0gcmVsb2FkaW5nLi4uXCIpKTtcbiAgICAgIC8vIFNTUiDtjIzsnbzrj4QgaW52YWxpZGF0ZSDtm4QgcmVsb2FkXG4gICAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICAgIGF3YWl0IGhvdC5pbnZhbGlkYXRlRmlsZShkaWZmRmlsZVBhdGgsIGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRTU1JSb3V0ZXMoKTtcbiAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoXCJvbkhNUkNvbXBsZXRlZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIGlmICghaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIgLyrshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuKi8pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBgJHtlbnRpdHlJZH1Nb2RlbGApO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UocmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBjb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gcGx1cmFsLnRzIOuCtOyaqeydhCDsnb3slrTshJwgc2hhcmVkIO2MjOydvOyXkCDsgr3snoXtlanri4jri6QuXG4gICAgY29uc3QgZGljdFV0aWxzUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpLFxuICAgICAgXCIuLi9kaWN0L3V0aWxzLnRzXCIsXG4gICAgKTtcbiAgICBjb25zdCBkaWN0VXRpbHNDb2RlID0gKGF3YWl0IGV4aXN0cyhkaWN0VXRpbHNQYXRoKSlcbiAgICAgID8gYXdhaXQgcmVhZEZpbGUoZGljdFV0aWxzUGF0aCwgXCJ1dGYtOFwiKVxuICAgICAgOiBcIlwiO1xuXG4gICAgLy8g7Yq57KCVIOuzgOyImCDsuZjtmZjsnYQg7JyE7ZW07IScIOyCrOyaqe2VqeuLiOuLpC5cbiAgICBjb25zdCBjb252ZXJ0TWFwID0ge1xuICAgICAgYmFzZVVybDpcbiAgICAgICAgU29uYW11LmNvbmZpZy5zZXJ2ZXIuYmFzZVVybCA/P1xuICAgICAgICBgaHR0cDovLyR7U29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7U29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDB9YCxcbiAgICAgIGRpY3RVdGlsczogZGljdFV0aWxzQ29kZSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgICAgLy8g6re465+w642wIGRpc3Qg7IaNIOu5jOuTnOuQnCDshozsiqQg7L2U65OcIO2MjOydvOydtCDtlYTsmpTtlZwg6rKD7J20IOyVhOuLiOqzoCwgc3Jj7JeQ66eMIOyeiOuKlCDthY3siqTtirgg7YyM7J287J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCAvc3JjL+yXkOyEnCDssL7sirXri4jri6QuXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICAgICAgYC4uL3NoYXJlZC8ke3RhcmdldH0uc2hhcmVkLnRzLnR4dGAsXG4gICAgICApO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZFRleHQgPSBPYmplY3QuZW50cmllcyhjb252ZXJ0TWFwKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4gYWNjLnJlcGxhY2UoYCRbWyR7a2V5fV1dYCwgdmFsdWUpLFxuICAgICAgICBmdWxsVGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHsgZGF0YTogY29udmVydGVkVGV4dCB9LCB7IHBhdGg6IGRlc3RQYXRoIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGNvbnZlcnRlZFRleHQpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRXb3JrZmxvd3MoKSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBhd2FpdCBsb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgU29uYW11LndvcmtmbG93cy5zeW5jaHJvbml6ZSh0aGlzLndvcmtmbG93cyk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFNTUlJvdXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzc3JDb25maWdQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvc3NyXCIpO1xuXG4gICAgLy8g6riw7KG0IHJvdXRlcyDstIjquLDtmZRcbiAgICBjb25zdCB7IGNsZWFyU1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY2xlYXJTU1JSb3V0ZXMoKTtcblxuICAgIC8vIHNzciDtj7TrjZQg7JeG7Jy866m0IOyKpO2CtVxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzc3JDb25maWdQYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyViOydmCDrqqjrk6AgLnRzIO2MjOydvCDroZzrk5xcbiAgICBjb25zdCB7IGdsb2JBc3luYyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIik7XG4gICAgY29uc3QgeyBpbXBvcnRNZW1iZXJzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9lc20tdXRpbHNcIik7XG4gICAgY29uc3QgeyBydW50aW1lUGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiKTtcblxuICAgIC8vIHJ1bnRpbWVQYXRo66W8IOyCrOyaqe2VmOyXrCDqsJzrsJwv7ZSE66Gc642V7IWYIO2ZmOqyveyXkCDrp57ripQg7ZmV7J6l7J6QIOyymOumrFxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYkFzeW5jKHBhdGguam9pbihzc3JDb25maWdQYXRoLCBydW50aW1lUGF0aChcIioqLyoudHNcIikpKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlZjrqbQg7YyM7J287J2YIHNpZGUgZWZmZWN0KHJlZ2lzdGVyU1NSIO2YuOy2nCnqsIAg7Iuk7ZaJ65CoXG4gICAgICAgIGF3YWl0IGltcG9ydE1lbWJlcnMoZmlsZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFNTUiByb3V0ZTogJHtmaWxlfWAsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwg7Iux7YGs66W8IOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAqIOuzgOqyveuQnCDtjIzsnbzrk6TsnYQg7YOA7J6F67OE66GcIOu2hOulmO2VmOqzoCDqsIEg7YOA7J6F7JeQIOunnuuKlCDslaHshZjsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRocyAtIOuzgOqyveuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrqqnroZ1cbiAgICogQHJldHVybnMgZGlmZlR5cGVzIC0g67OA6rK965CcIO2MjOydvOydmCDtg4DsnoUg66qp66GdIChlbnRpdHksIHR5cGVzLCBtb2RlbCDrk7EpXG4gICAqL1xuICBhc3luYyBkb1N5bmNBY3Rpb25zKGRpZmZGaWxlUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTx7IGRpZmZUeXBlczogc3RyaW5nW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID0gT2JqZWN0LmtleXMoZGlmZkdyb3Vwcyk7XG5cbiAgICAvLyDtirjrpqzqsbA6IGVudGl0eSwgdHlwZXNcbiAgICAvLyDslaHshZg6IOyKpO2CpOuniCDsg53shLFcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiZW50aXR5XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzLCBkaWZmVHlwZXMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWQg67OA6rK97IucXG4gICAgLy8g7JWh7IWYOiDtjIzsnbwg7Iux7YGsIHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkXG4gICAgaWYgKFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwidHlwZXNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImZ1bmN0aW9uc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZ2VuZXJhdGVkXCIpXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IG1vZGVsXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIm1vZGVsXCIpIHx8IGRpZmZUeXBlcy5pbmNsdWRlcyhcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IGNvbmZpZ1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0NvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogd29ya2Zsb3dcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwid29ya2Zsb3dcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICB9XG5cbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiaTE4blwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY1NEKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgY29uc3QgZmlsZVR5cGVzID0gT2JqZWN0LmtleXMoY2hlY2tzdW1QYXR0ZXJuR3JvdXApIGFzIEZpbGVUeXBlW107XG5cbiAgICByZXR1cm4gZ3JvdXAoZGlmZkZpbGVzLCAoZmlsZVBhdGgpID0+IHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZzsl5DshJwgc3JjL+uhnCDsi5zsnpHtlZjripQg7IOB64yAIOqyveuhnCDrtoDrtoTsnYQg7LaU7Lac7ZWp64uI64ukLlxuICAgICAgY29uc3Qgc3JjSW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiL3NyYy9cIik7XG4gICAgICBpZiAoc3JjSW5kZXggPT09IC0xKSByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5zbGljZShzcmNJbmRleCArIDEpOyAvLyBcInNyYy8uLi5cIiDtmJXtg5xcblxuICAgICAgZm9yIChjb25zdCBmaWxlVHlwZSBvZiBmaWxlVHlwZXMpIHtcbiAgICAgICAgaWYgKG1pbmltYXRjaChyZWxhdGl2ZVBhdGgsIGNoZWNrc3VtUGF0dGVybkdyb3VwW2ZpbGVUeXBlXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmlsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgICB9KSBhcyB1bmtub3duIGFzIERpZmZHcm91cHM7XG4gIH1cblxuICBhc3luYyBoYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3VwcywgZGlmZlR5cGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVFbnRpdHlDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzLCBkaWZmVHlwZXMgfSk7XG5cbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgLy8gdHlwZXMg7IOd7ISxKGVudGl0eSDsg4jroZwg7LaU6rCA65CcIOqyveyasClcbiAgICAvLyBwYXJlbnRJZOqwgCDsl4bqs6AsIHR5cGVz6rCAIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZGlmZkdyb3Vwcy5lbnRpdHk/LlswXSk7XG5cbiAgICBpZiAoZW50aXR5SWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICApO1xuICAgICAgaWYgKGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmICEoYXdhaXQgZXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJpbml0X3R5cGVzXCIsIHsgZW50aXR5SWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIGRpZmZHcm91cHMuZ2VuZXJhdGVkID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUuZ2VuZXJhdGVkLnRzXCIpIGFzIEFic29sdXRlUGF0aCxcbiAgICBdKTtcbiAgICBkaWZmVHlwZXMucHVzaChcImdlbmVyYXRlZFwiKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTxGaWxlVHlwZVtdPiB7XG4gICAgY29uc3QgdHNQYXRocyA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5mdW5jdGlvbnMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyB0eXBlcy9mdW5jdGlvbnMvZ2VuZXJhdGVkIGNoYW5nZXM6ICR7dHNQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRocyk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyBtb2RlbC9mcmFtZSBjaGFuZ2VzOiAke21lcmdlZEdyb3VwLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICAvLyBnZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIudHlwZXPrpbwg7JSB64uI64ukLlxuICAgIC8vIHNlcnZpY2UudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLmFwaXPrpbwg7JSB64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgY29uc3QgcGFyYW1zOiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdID0gbWVyZ2VkR3JvdXAubWFwKChtb2RlbFBhdGgpID0+IHtcbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lXFwudHMkLykgPz8gW107XG4gICAgICAgIGFzc2VydChmcmFtZU5hbWUpO1xuICAgICAgICAvLyBmcmFtZU5hbWXsnYQgUGFzY2FsQ2FzZeuhnCDrs4DtmZggKGRhc2hib2FyZCAtPiBEYXNoYm9hcmQpXG4gICAgICAgIGNvbnN0IGZyYW1lSWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGZyYW1lTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZnJhbWVJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG5cbiAgICAvLyBxdWVyaWVzLmdlbmVyYXRlZC50cyDrsI8gZW50cnktc2VydmVyLmdlbmVyYXRlZC50c3gg7J6s7IOd7ISxXG4gICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcInF1ZXJpZXNcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJlbnRyeV9zZXJ2ZXJcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICB9XG5cbiAgLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuICBhc3luYyBhY3Rpb25TeW5jQ29uZmlnKCkge1xuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICAgIE5haXRlLnQoXCJhY3Rpb25TeW5jQ29uZmlnXCIsIHsgY29udGVudCB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNvbmFtdS5jb25maWcuc3luYy50YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwiLnNvbmFtdS5lbnZcIiksIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXJ2aWNlcy5nZW5lcmF0ZWQudHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gcGFyYW1zQXJyYXlcbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhcbiAgICBwYXJhbXNBcnJheToge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIE5haXRlLnQoXCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzXCIsIHBhcmFtc0FycmF5KTtcblxuICAgIC8vIHNlcnZpY2VzLmdlbmVyYXRlZC50cyDthrXtlakg7YyM7J28IOyDneyEsVxuICAgIGNvbnN0IHNlcnZpY2VzRmlsZSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICBcInNlcnZpY2VzXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi5zZXJ2aWNlc0ZpbGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZFwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBdKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC5odHRw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICAgICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgYXNzZXJ0KHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnR5cGVzLnRzLCAqLmZ1bmN0aW9ucy50cywgKi5nZW5lcmF0ZWQudHPrpbwg7YOA6rKfIOuUlOugie2GoOumrOyXkCDrs7Xsgqztlanri4jri6QuXG4gICAqIEBwYXJhbSB0c1BhdGhzXG4gICAqIEByZXR1cm5zIOuzteyCrOuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICBjb25zdCB7IGRpcjogYXBpRGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT5cbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRzdCA9IHJlYWxTcmNcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoZHN0KTtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUoZHN0LnJlcGxhY2UoYCR7U29uYW11LmFwcFJvb3RQYXRofS9gLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTRChTb25hbXUgRGljdGlvbmFyeSkg7YWc7ZSM66a/7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICogaTE4biDshKTsoJXsnbQg7J6I7J2EIOuVjOunjCDtmLjstpzrkKnri4jri6QuXG4gICAqL1xuICBhc3luYyBzeW5jU0QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgaTE4bkNvbmZpZyA9IFNvbmFtdS5jb25maWcuaTE4bjtcbiAgICBpZiAoIWkxOG5Db25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldExpc3QgPSBbXCJhcGlcIiwgLi4udGFyZ2V0c10gYXMgKFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIilbXTtcblxuICAgIGNvbnN0IGFwaUkxOG5EaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBTb25hbXUuY29uZmlnLmFwaS5kaXIsIFwic3JjL2kxOG5cIik7XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRMaXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB3ZWIvYXBw7J2YIOqyveyasCBsb2NhbGUg7YyM7J2865Ok7J2EIGFwaeyXkOyEnCDrs7XsgqxcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gXCJhcGlcIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3luY0xvY2FsZUZpbGVzKHRhcmdldCwgYXBpSTE4bkRpciwgaTE4bkNvbmZpZy5zdXBwb3J0ZWRMb2NhbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJzZFwiLCB7IHRhcmdldCB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGdlbmVyYXRlIFNEIHRlbXBsYXRlIGZvciAke3RhcmdldH06YCwgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGFwaeydmCBsb2NhbGUg7YyM7J287J2EIHdlYi9hcHDsnLzroZwg67O17IKs7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzeW5jTG9jYWxlRmlsZXMoXG4gICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgYXBpSTE4bkRpcjogc3RyaW5nLFxuICAgIGxvY2FsZXM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXJnZXRJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9pMThuXCIpO1xuXG4gICAgLy8g65SU66CJ7Yag66as6rCAIOyXhuycvOuptCDsg53shLFcbiAgICBhd2FpdCBta2Rpcih0YXJnZXRJMThuRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBwYXRoLmpvaW4oYXBpSTE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuICAgICAgY29uc3QgdGFyZ2V0RmlsZSA9IHBhdGguam9pbih0YXJnZXRJMThuRGlyLCBgJHtsb2NhbGV9LnRzYCk7XG5cbiAgICAgIGF3YWl0IGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7XG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuY3lhbihgJHt0YXJnZXR9L3NyYy9pMThuLyR7bG9jYWxlfS50c2ApKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIkV2ZW50RW1pdHRlciIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIkFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24iLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJhcmVGaWxlc1NhbWUiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImNoZWNrc3VtUGF0dGVybkdyb3VwIiwiZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCIsImxvYWRBcGlzIiwibG9hZE1vZGVscyIsImxvYWRUeXBlcyIsImxvYWRXb3JrZmxvd3MiLCJTeW5jZXIiLCJhcGlzIiwidHlwZXMiLCJtb2RlbHMiLCJ3b3JrZmxvd3MiLCJNYXAiLCJldmVudEVtaXR0ZXIiLCJzeW5jIiwidGFyZ2V0cyIsImNvbmZpZyIsImNvcHlTaGFyZWRUb1RhcmdldHMiLCJjaGFuZ2VkRmlsZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwiYmxhY2siLCJiZ0dyZWVuIiwib3ZlcndyaXRlIiwiZSIsImVycm9yIiwiZG9TeW5jQWN0aW9ucyIsIndoZW5UaGlzSGFwcGVucyIsIndhaXRGb3JVcFRvIiwic3luY0Zyb21XYXRjaGVyIiwiZXZlbnQiLCJkaWZmRmlsZVBhdGgiLCJpbmNsdWRlcyIsImJvbGQiLCJ5ZWxsb3ciLCJpbnZhbGlkYXRlRmlsZSIsImF1dG9sb2FkU1NSUm91dGVzIiwiZW1pdCIsImludmFsaWRhdGVkUGF0aHMiLCJpbnZhbGlkYXRlZFBhdGgiLCJyZW1vdmVkQXBpcyIsInJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMiLCJibHVlIiwicmVsYXRpdmUiLCJhcGlSb290UGF0aCIsImdyYXkiLCJyZWQiLCJpc0luQ2hlY2tQYXR0ZXJuR3JvdXAiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwicGF0dGVybiIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJkaWN0VXRpbHNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJkaWN0VXRpbHNDb2RlIiwiY29udmVydE1hcCIsImJhc2VVcmwiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJob3N0IiwicG9ydCIsImRpY3RVdGlscyIsInRhcmdldCIsInNyY1BhdGgiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZnVsbFRleHQiLCJjb252ZXJ0ZWRUZXh0IiwiZW50cmllcyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGF0YSIsInN5bmNocm9uaXplIiwic3NyQ29uZmlnUGF0aCIsImNsZWFyU1NSUm91dGVzIiwiZ2xvYkFzeW5jIiwiaW1wb3J0TWVtYmVycyIsInJ1bnRpbWVQYXRoIiwiZmlsZXMiLCJmaWxlIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJzeW5jU0QiLCJkaWZmRmlsZXMiLCJmaWxlVHlwZXMiLCJmaWxlUGF0aCIsInNyY0luZGV4IiwicmVsYXRpdmVQYXRoIiwic2xpY2UiLCJmaWxlVHlwZSIsInQiLCJyZWxvYWQiLCJlbnRpdHkiLCJnZXQiLCJ0eXBlRmlsZVBhdGgiLCJuYW1lcyIsImZzIiwicGFyZW50SWQiLCJ1bmRlZmluZWQiLCJhY3Rpb25HZW5lcmF0ZVNjaGVtYXMiLCJnZW5lcmF0ZWQiLCJwdXNoIiwidHNQYXRocyIsImZ1bmN0aW9ucyIsImFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIm1lcmdlZEdyb3VwIiwibW9kZWwiLCJmcmFtZSIsInBhcmFtcyIsIm1hcCIsIm1vZGVsUGF0aCIsIm5hbWVzUmVjb3JkIiwiZ2V0TmFtZXNGcm9tSWQiLCJmcmFtZU5hbWUiLCJtYXRjaCIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiY29udGVudCIsIlByb21pc2UiLCJhbGwiLCJwYXJhbXNBcnJheSIsInNlcnZpY2VzRmlsZSIsImZsYXQiLCJyZXMiLCJkaXIiLCJhcGlEaXIiLCJyZWFsU3JjIiwiZHN0IiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiLCJpMThuQ29uZmlnIiwiaTE4biIsInRhcmdldExpc3QiLCJhcGlJMThuRGlyIiwic3luY0xvY2FsZUZpbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsImxvY2FsZXMiLCJ0YXJnZXRJMThuRGlyIiwibG9jYWxlIiwic291cmNlRmlsZSIsInRhcmdldEZpbGUiLCJjeWFuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsWUFBWSxRQUFRLFNBQVM7QUFDdEMsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxRQUFRQyxPQUFPLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBR3hDLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxhQUFhLFFBQWdDLDhCQUEyQjtBQUNqRixTQUFTQyx5QkFBeUIsUUFBUSxpQ0FBOEI7QUFDeEUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUN2QyxTQUFTQyxlQUFlLFFBQVEsa0NBQStCO0FBRS9ELFNBQVNDLFdBQVcsUUFBOEIsb0JBQWlCO0FBQ25FLFNBQVNDLFFBQVEsRUFBRUMsV0FBVyxRQUFRLDBCQUF1QjtBQUM3RCxTQUFTQyxVQUFVLFFBQVEsMkJBQXdC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
|
package/dist/ui/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAuC/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAg1C/D"}
|