sonamu 0.7.11 → 0.7.12
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/api/config.d.ts +10 -3
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -1
- package/dist/api/sonamu.d.ts +4 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +36 -2
- package/dist/bin/cli.js +121 -117
- package/dist/database/base-model.d.ts +10 -50
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +19 -84
- package/dist/database/base-model.types.d.ts +4 -4
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +1 -0
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +24 -13
- package/dist/database/puri-subset.test-d.js +1 -1
- package/dist/database/puri-subset.types.d.ts +1 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +2 -2
- package/dist/database/puri.d.ts +82 -3
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +180 -14
- package/dist/database/puri.types.d.ts +33 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/puri.types.test-d.js +1 -1
- package/dist/entity/entity-manager.d.ts +5 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +8 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +33 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +53 -22
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite.js +2 -2
- package/dist/stream/sse.d.ts +2 -6
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +9 -3
- package/dist/syncer/api-parser.js +5 -1
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +6 -5
- package/dist/syncer/module-loader.d.ts +5 -0
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +17 -1
- package/dist/syncer/syncer.d.ts +3 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +12 -2
- package/dist/tasks/decorator.d.ts +26 -0
- package/dist/tasks/decorator.d.ts.map +1 -0
- package/dist/tasks/decorator.js +28 -0
- package/dist/tasks/step-wrapper.d.ts +18 -0
- package/dist/tasks/step-wrapper.d.ts.map +1 -0
- package/dist/tasks/step-wrapper.js +38 -0
- package/dist/tasks/workflow-manager.d.ts +40 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -0
- package/dist/tasks/workflow-manager.js +193 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +7 -3
- package/dist/types/types.d.ts +27 -11
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +15 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +10 -2
- package/dist/utils/model.d.ts +9 -2
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +16 -1
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +3 -1
- package/dist/vector/embedding.d.ts +2 -5
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +3 -7
- package/dist/vector/types.d.ts.map +1 -1
- package/dist/vector/types.js +1 -1
- package/package.json +5 -3
- package/src/api/config.ts +15 -8
- package/src/api/sonamu.ts +43 -2
- package/src/bin/cli.ts +58 -54
- package/src/database/base-model.ts +21 -128
- package/src/database/base-model.types.ts +3 -4
- package/src/database/db.ts +28 -18
- package/src/database/puri-subset.test-d.ts +1 -0
- package/src/database/puri-subset.types.ts +2 -0
- package/src/database/puri.ts +238 -27
- package/src/database/puri.types.test-d.ts +1 -1
- package/src/database/puri.types.ts +49 -6
- package/src/entity/entity-manager.ts +9 -0
- package/src/index.ts +1 -1
- package/src/migration/code-generation.ts +40 -1
- package/src/migration/postgresql-schema-reader.ts +53 -22
- package/src/naite/messaging-types.ts +43 -44
- package/src/naite/naite.ts +1 -1
- package/src/shared/app.shared.ts.txt +13 -0
- package/src/shared/web.shared.ts.txt +13 -0
- package/src/stream/sse.ts +15 -3
- package/src/syncer/api-parser.ts +4 -0
- package/src/syncer/file-patterns.ts +11 -9
- package/src/syncer/module-loader.ts +35 -0
- package/src/syncer/syncer.ts +14 -0
- package/src/tasks/decorator.ts +71 -0
- package/src/tasks/step-wrapper.ts +84 -0
- package/src/tasks/workflow-manager.ts +330 -0
- package/src/template/implementations/generated.template.ts +19 -6
- package/src/types/types.ts +20 -4
- package/src/utils/formatter.ts +8 -1
- package/src/utils/model.ts +26 -2
- package/src/utils/type-utils.ts +2 -0
- package/src/vector/embedding.ts +2 -8
- package/src/vector/types.ts +1 -2
- package/dist/vector/vector-search.d.ts +0 -47
- package/dist/vector/vector-search.d.ts.map +0 -1
- package/dist/vector/vector-search.js +0 -176
- package/src/vector/vector-search.ts +0 -261
package/dist/database/puri.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noThenProperty: Puri는 thenable 인터페이스를 구현하고 있습니다. */ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri는 다양한 타입을 사용하고 있습니다. */ import assert from "assert";
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
+
import inflection from "inflection";
|
|
3
4
|
import { Naite } from "../naite/naite.js";
|
|
4
5
|
export class Puri {
|
|
5
6
|
knex;
|
|
@@ -95,6 +96,13 @@ export class Puri {
|
|
|
95
96
|
_sql: sql
|
|
96
97
|
};
|
|
97
98
|
}
|
|
99
|
+
static rawStringArray(sql) {
|
|
100
|
+
return {
|
|
101
|
+
_type: "sql_expression",
|
|
102
|
+
_return: "string[]",
|
|
103
|
+
_sql: sql
|
|
104
|
+
};
|
|
105
|
+
}
|
|
98
106
|
static rawNumber(sql) {
|
|
99
107
|
return {
|
|
100
108
|
_type: "sql_expression",
|
|
@@ -128,21 +136,50 @@ export class Puri {
|
|
|
128
136
|
* maxFragments: 3,
|
|
129
137
|
* }),
|
|
130
138
|
* })
|
|
131
|
-
*/ static
|
|
132
|
-
const { parser = "websearch_to_tsquery", config = "simple",
|
|
133
|
-
const hlOptionParts = []
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (shortWord !== undefined) hlOptionParts.push(`ShortWord=${shortWord}`);
|
|
137
|
-
if (highlightAll !== undefined) hlOptionParts.push(`HighlightAll=${highlightAll}`);
|
|
138
|
-
if (maxFragments !== undefined) hlOptionParts.push(`MaxFragments=${maxFragments}`);
|
|
139
|
-
if (startSel !== undefined) hlOptionParts.push(`StartSel="${startSel}"`);
|
|
140
|
-
if (stopSel !== undefined) hlOptionParts.push(`StopSel="${stopSel}"`);
|
|
141
|
-
if (fragmentDelimiter !== undefined) hlOptionParts.push(`FragmentDelimiter="${fragmentDelimiter}"`);
|
|
139
|
+
*/ static tsHighlight(column, query, _options) {
|
|
140
|
+
const { parser = "websearch_to_tsquery", config = "simple", ...options } = _options ?? {};
|
|
141
|
+
const hlOptionParts = Object.entries(options).map(([key, value])=>{
|
|
142
|
+
return `${inflection.camelize(key)}=${value}`;
|
|
143
|
+
});
|
|
142
144
|
const hlOptions = hlOptionParts.length > 0 ? `, '${hlOptionParts.join(", ")}'` : "";
|
|
143
145
|
// TODO: rawBinding 메서드 만들어서 XSS 방지
|
|
144
146
|
return Puri.rawString(`ts_headline('${config}', ${column}, ${parser}('${config}', '${query}')${hlOptions})`);
|
|
145
147
|
}
|
|
148
|
+
// ts_rank
|
|
149
|
+
static tsRank(column, query, options) {
|
|
150
|
+
return Puri._tsRank("ts_rank", column, query, options);
|
|
151
|
+
}
|
|
152
|
+
// ts_rank_cd
|
|
153
|
+
static tsRankCd(column, query, options) {
|
|
154
|
+
return Puri._tsRank("ts_rank_cd", column, query, options);
|
|
155
|
+
}
|
|
156
|
+
static _tsRank(type, column, query, options) {
|
|
157
|
+
const { parser = "websearch_to_tsquery", config = "simple", normalization, weights } = options ?? {};
|
|
158
|
+
const weightClause = weights ? `ARRAY[${weights.join(", ")}], ` : "";
|
|
159
|
+
const normalizationClause = normalization ? `, ${normalization}` : "";
|
|
160
|
+
return Puri.rawNumber(`${type}(${weightClause}${column}, ${parser}('${config}', '${query}')${normalizationClause})`);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* PGroonga FullText 인덱스 검색 점수
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* .select({
|
|
167
|
+
* score: Puri.score(),
|
|
168
|
+
* })
|
|
169
|
+
*/ static score() {
|
|
170
|
+
return Puri.rawNumber("pgroonga_score(tableoid, ctid)");
|
|
171
|
+
}
|
|
172
|
+
static highlight(columnOrColumns, query) {
|
|
173
|
+
const queryClause = `ARRAY[${(Array.isArray(query) ? query : [
|
|
174
|
+
query
|
|
175
|
+
]).map((q)=>`'${q}'`).join(",")}]`;
|
|
176
|
+
// 단일 컬럼인 경우
|
|
177
|
+
if (typeof columnOrColumns === "string") {
|
|
178
|
+
return Puri.rawString(`pgroonga_highlight_html(${columnOrColumns}, ${queryClause})`);
|
|
179
|
+
}
|
|
180
|
+
// 컬럼 배열인 경우
|
|
181
|
+
return Puri.rawStringArray(`pgroonga_highlight_html(ARRAY[${columnOrColumns.join(",")}], ${queryClause})`);
|
|
182
|
+
}
|
|
146
183
|
// SELECT (overwrite)
|
|
147
184
|
select(selectObj) {
|
|
148
185
|
// 중첩 객체를 flat하게 변환
|
|
@@ -151,7 +188,7 @@ export class Puri {
|
|
|
151
188
|
for (const [alias, columnOrFunction] of Object.entries(flatSelect)){
|
|
152
189
|
if (typeof columnOrFunction === "object" && columnOrFunction._type === "sql_expression") {
|
|
153
190
|
// SQL 함수인 경우
|
|
154
|
-
selectClauses.push(this.knex.raw(`${columnOrFunction._sql} as ${alias}`));
|
|
191
|
+
selectClauses.push(this.knex.raw(`${columnOrFunction._sql} as "${alias}"`));
|
|
155
192
|
} else {
|
|
156
193
|
// 일반 컬럼인 경우
|
|
157
194
|
const columnPath = columnOrFunction;
|
|
@@ -341,8 +378,30 @@ export class Puri {
|
|
|
341
378
|
]);
|
|
342
379
|
return this;
|
|
343
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* PGroonga FullText 인덱스 검색
|
|
383
|
+
* - 사용할 PGroonga 인덱스와 동일한 컬럼 구성으로 검색해야 인덱스가 사용됩니다.
|
|
384
|
+
*
|
|
385
|
+
* 단일 컬럼 검색:
|
|
386
|
+
* ```sql
|
|
387
|
+
* WHERE name &@~ 'search'
|
|
388
|
+
* ```
|
|
389
|
+
*
|
|
390
|
+
* 복합 컬럼 검색:
|
|
391
|
+
* ```sql
|
|
392
|
+
* WHERE ARRAY[name::text, description::text] &@~ 'search'
|
|
393
|
+
* ```
|
|
394
|
+
*/ whereSearch(column, value, options) {
|
|
395
|
+
const { weights } = options ?? {};
|
|
396
|
+
const columnExpr = Array.isArray(column) ? `ARRAY[${column.map((c)=>`${c}::text`).join(",")}]` : column;
|
|
397
|
+
const pgroongaCondition = `pgroonga_condition(?${weights?.length ? `, weights => ARRAY[${weights.join(",")}]` : ""})`;
|
|
398
|
+
this.knexQuery.whereRaw(`${columnExpr} &@~ ${pgroongaCondition}`, [
|
|
399
|
+
value
|
|
400
|
+
]);
|
|
401
|
+
return this;
|
|
402
|
+
}
|
|
344
403
|
// WHERE FULLTEXT
|
|
345
|
-
|
|
404
|
+
whereTsSearch(column, value, options) {
|
|
346
405
|
const opts = typeof options === "string" ? {
|
|
347
406
|
config: options
|
|
348
407
|
} : options ?? {};
|
|
@@ -379,6 +438,113 @@ export class Puri {
|
|
|
379
438
|
this.knexQuery.orderBy(column, direction);
|
|
380
439
|
return this;
|
|
381
440
|
}
|
|
441
|
+
/**
|
|
442
|
+
* 벡터 유사도 검색 설정
|
|
443
|
+
*
|
|
444
|
+
* - SELECT에 similarity 컬럼 추가
|
|
445
|
+
* - WHERE col IS NOT NULL 추가
|
|
446
|
+
* - threshold가 있으면 WHERE 조건 추가
|
|
447
|
+
* - 기존 ORDER BY를 clear하고 원시 연산자로 정렬 (HNSW 인덱스 최적화)
|
|
448
|
+
*
|
|
449
|
+
* @param column 벡터 컬럼 경로
|
|
450
|
+
* @param embedding 쿼리 임베딩 벡터
|
|
451
|
+
* @param options method, threshold, as 등 옵션
|
|
452
|
+
*
|
|
453
|
+
* @example
|
|
454
|
+
* ```typescript
|
|
455
|
+
* // cosine similarity (기본값)
|
|
456
|
+
* qb.vectorSimilarity("columnName", queryVector, {
|
|
457
|
+
* method: "cosine",
|
|
458
|
+
* threshold: 0.5
|
|
459
|
+
* });
|
|
460
|
+
*
|
|
461
|
+
* // L2 distance
|
|
462
|
+
* qb.vectorSimilarity("columnName", queryVector, {
|
|
463
|
+
* method: "l2",
|
|
464
|
+
* threshold: 1.5 // 거리가 1.5 이하인 결과만
|
|
465
|
+
* });
|
|
466
|
+
*
|
|
467
|
+
* // Inner product
|
|
468
|
+
* qb.vectorSimilarity("columnName", queryVector, {
|
|
469
|
+
* method: "inner_product",
|
|
470
|
+
* threshold: 0.7
|
|
471
|
+
* });
|
|
472
|
+
* ```
|
|
473
|
+
*/ vectorSimilarity(column, embedding, options = {}) {
|
|
474
|
+
const { method = "cosine", threshold } = options;
|
|
475
|
+
if (!Array.isArray(embedding) || embedding.length === 0 || embedding.some((v)=>!Number.isFinite(v))) {
|
|
476
|
+
throw new Error("Invalid embedding vector: expected a non-empty array of finite numbers");
|
|
477
|
+
}
|
|
478
|
+
const vectorLiteral = JSON.stringify(embedding.map((v)=>Number(v)));
|
|
479
|
+
// method별 연산자 및 similarity 계산식
|
|
480
|
+
// - cosine: <=> (cosine distance, 0~2), similarity = 1 - distance
|
|
481
|
+
// - l2: <-> (euclidean distance), similarity = distance (낮을수록 유사)
|
|
482
|
+
// - inner_product: <#> (negative inner product), similarity = -distance (높을수록 유사)
|
|
483
|
+
const operatorMap = {
|
|
484
|
+
cosine: "<=>",
|
|
485
|
+
l2: "<->",
|
|
486
|
+
inner_product: "<#>"
|
|
487
|
+
};
|
|
488
|
+
const operator = operatorMap[method];
|
|
489
|
+
// SELECT에 similarity 추가
|
|
490
|
+
if (method === "cosine") {
|
|
491
|
+
// cosine: similarity = 1 - cosine_distance (0~1, 높을수록 유사)
|
|
492
|
+
this.knexQuery.select(this.knex.raw(`1 - (?? <=> ?::vector) as similarity`, [
|
|
493
|
+
column,
|
|
494
|
+
vectorLiteral
|
|
495
|
+
]));
|
|
496
|
+
} else if (method === "l2") {
|
|
497
|
+
// l2: distance 그대로 반환 (낮을수록 유사)
|
|
498
|
+
this.knexQuery.select(this.knex.raw(`?? <-> ?::vector as similarity`, [
|
|
499
|
+
column,
|
|
500
|
+
vectorLiteral
|
|
501
|
+
]));
|
|
502
|
+
} else {
|
|
503
|
+
// inner_product: pgvector는 음수 반환하므로 부호 반전 (높을수록 유사)
|
|
504
|
+
this.knexQuery.select(this.knex.raw(`-(?? <#> ?::vector) as similarity`, [
|
|
505
|
+
column,
|
|
506
|
+
vectorLiteral
|
|
507
|
+
]));
|
|
508
|
+
}
|
|
509
|
+
// WHERE col IS NOT NULL
|
|
510
|
+
this.knexQuery.whereNotNull(column);
|
|
511
|
+
// threshold가 있으면 WHERE 추가
|
|
512
|
+
if (typeof threshold === "number") {
|
|
513
|
+
if (!Number.isFinite(threshold)) {
|
|
514
|
+
throw new Error(`Invalid vectorSimilarity threshold: ${threshold}`);
|
|
515
|
+
}
|
|
516
|
+
if (method === "cosine") {
|
|
517
|
+
// similarity >= threshold <=> cosine_distance <= (1 - threshold)
|
|
518
|
+
this.knexQuery.whereRaw(`?? ${operator} ?::vector <= ?`, [
|
|
519
|
+
column,
|
|
520
|
+
vectorLiteral,
|
|
521
|
+
1 - threshold
|
|
522
|
+
]);
|
|
523
|
+
} else if (method === "l2") {
|
|
524
|
+
// distance <= threshold (거리가 threshold 이하)
|
|
525
|
+
this.knexQuery.whereRaw(`?? ${operator} ?::vector <= ?`, [
|
|
526
|
+
column,
|
|
527
|
+
vectorLiteral,
|
|
528
|
+
threshold
|
|
529
|
+
]);
|
|
530
|
+
} else {
|
|
531
|
+
// inner_product: -distance >= threshold <=> distance <= -threshold
|
|
532
|
+
this.knexQuery.whereRaw(`?? ${operator} ?::vector <= ?`, [
|
|
533
|
+
column,
|
|
534
|
+
vectorLiteral,
|
|
535
|
+
-threshold
|
|
536
|
+
]);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
// 기존 ORDER BY clear 후 원시 연산자로 정렬 (HNSW 인덱스 최적화)
|
|
540
|
+
// 모든 method에서 ASC: 거리/음수값이 작을수록 유사
|
|
541
|
+
this.knexQuery.clear("order");
|
|
542
|
+
this.knexQuery.orderByRaw(`?? ${operator} ?::vector`, [
|
|
543
|
+
column,
|
|
544
|
+
vectorLiteral
|
|
545
|
+
]);
|
|
546
|
+
return this;
|
|
547
|
+
}
|
|
382
548
|
// 기본 쿼리 메서드들
|
|
383
549
|
limit(count) {
|
|
384
550
|
if (count < 0) {
|
|
@@ -691,4 +857,4 @@ export class JoinClauseGroup {
|
|
|
691
857
|
}
|
|
692
858
|
}
|
|
693
859
|
|
|
694
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogUHVyaeuKlCB0aGVuYWJsZSDsnbjthLDtjpjsnbTsiqTrpbwg6rWs7ZiE7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cbi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXZhaWxhYmxlQ29sdW1ucyxcbiAgQ29sdW1uS2V5cyxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBFeHBhbmQsXG4gIEV4dHJhY3RDb2x1bW5UeXBlLFxuICBGdWxsdGV4dENvbHVtbnMsXG4gIEhpZ2hsaWdodE9wdGlvbnMsXG4gIEluc2VydERhdGEsXG4gIEluc2VydFJlc3VsdCxcbiAgTGVmdEpvaW5lZE1hcmtlcixcbiAgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIE51bWVyaWNDb2x1bW5zLFxuICBPbkNvbmZsaWN0QWN0aW9uLFxuICBQYXJzZVNlbGVjdE9iamVjdCxcbiAgUmVzdWx0QXZhaWxhYmxlQ29sdW1ucyxcbiAgU2VsZWN0QWxsUmVzdWx0LFxuICBTZWxlY3RPYmplY3QsXG4gIFNpbmdsZVRhYmxlVmFsdWUsXG4gIFNxbEV4cHJlc3Npb24sXG4gIFRzUXVlcnlDb25maWcsXG4gIFRzUXVlcnlPcHRpb25zLFxuICBXaGVyZUNvbmRpdGlvbixcbiAgV2hlcmVPcGVyYXRvcixcbn0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGVhclN0YXRlbWVudHMgfSBmcm9tIFwiLi9wdXJpLXN1YnNldC50eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVFJlc3VsdD4ge1xuICBwcml2YXRlIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXI7XG5cbiAgLy8g7IOd7ISx7J6QIOyLnOq3uOuLiOyymOuTpFxuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk7XG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlU3BlYzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUHVyaTxUU2NoZW1hLCBhbnksIGFueT4+KTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXg6IEtuZXgsXG4gICAgdGFibGVOYW1lT3JTcGVjOiBhbnksXG4gICkge1xuICAgIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBDYXNlOiBuZXcgUHVyaShrbmV4LCBcInVzZXJzXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leCh0YWJsZU5hbWVPclNwZWMpLmZyb20odGFibGVOYW1lT3JTcGVjKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNwZWMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNwZWMpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzcGVjXSA9IGVudHJpZXNbMF07XG4gICAgICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc3BlYykuZnJvbSh7IFthbGlhc106IHNwZWMgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIGNvbnN0IHN1YnF1ZXJ5QnVpbGRlciA9IHNwZWMucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKCR7Y29sdW1ufSk6OmludGVnZXJgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHN1bShjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBTVU0oJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgYXZnKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYEFWRygke2NvbHVtbn0pYCxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1pbihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNSU4oJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29uY2F0KC4uLmFyZ3M6IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYENPTkNBVCgke2FyZ3Muam9pbihcIiwgXCIpfSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYFVQUEVSKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYExPV0VSKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cblxuICAvLyBSYXcgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIHJhd1N0cmluZyhzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nXCIsIF9zcWw6IHNxbCB9O1xuICB9XG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcIm51bWJlclwiLCBfc3FsOiBzcWwgfTtcbiAgfVxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJib29sZWFuXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImJvb2xlYW5cIiwgX3NxbDogc3FsIH07XG4gIH1cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwiZGF0ZVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJkYXRlXCIsIF9zcWw6IHNxbCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZUUyDqsoDsg4nslrQg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqICAgY29udGVudDogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy5jb250ZW50XCIsIHNlYXJjaCwge1xuICAgKiAgICAgc3RhcnRTZWw6IFwiPG1hcms+XCIsXG4gICAqICAgICBzdG9wU2VsOiBcIjwvbWFyaz5cIixcbiAgICogICAgIG1heEZyYWdtZW50czogMyxcbiAgICogICB9KSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyBoaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG1heFdvcmRzLFxuICAgICAgbWluV29yZHMsXG4gICAgICBzaG9ydFdvcmQsXG4gICAgICBoaWdobGlnaHRBbGwsXG4gICAgICBtYXhGcmFnbWVudHMsXG4gICAgICBzdGFydFNlbCxcbiAgICAgIHN0b3BTZWwsXG4gICAgICBmcmFnbWVudERlbGltaXRlcixcbiAgICB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IGhsT3B0aW9uUGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAobWF4V29yZHMgIT09IHVuZGVmaW5lZCkgaGxPcHRpb25QYXJ0cy5wdXNoKGBNYXhXb3Jkcz0ke21heFdvcmRzfWApO1xuICAgIGlmIChtaW5Xb3JkcyAhPT0gdW5kZWZpbmVkKSBobE9wdGlvblBhcnRzLnB1c2goYE1pbldvcmRzPSR7bWluV29yZHN9YCk7XG4gICAgaWYgKHNob3J0V29yZCAhPT0gdW5kZWZpbmVkKSBobE9wdGlvblBhcnRzLnB1c2goYFNob3J0V29yZD0ke3Nob3J0V29yZH1gKTtcbiAgICBpZiAoaGlnaGxpZ2h0QWxsICE9PSB1bmRlZmluZWQpIGhsT3B0aW9uUGFydHMucHVzaChgSGlnaGxpZ2h0QWxsPSR7aGlnaGxpZ2h0QWxsfWApO1xuICAgIGlmIChtYXhGcmFnbWVudHMgIT09IHVuZGVmaW5lZCkgaGxPcHRpb25QYXJ0cy5wdXNoKGBNYXhGcmFnbWVudHM9JHttYXhGcmFnbWVudHN9YCk7XG4gICAgaWYgKHN0YXJ0U2VsICE9PSB1bmRlZmluZWQpIGhsT3B0aW9uUGFydHMucHVzaChgU3RhcnRTZWw9XCIke3N0YXJ0U2VsfVwiYCk7XG4gICAgaWYgKHN0b3BTZWwgIT09IHVuZGVmaW5lZCkgaGxPcHRpb25QYXJ0cy5wdXNoKGBTdG9wU2VsPVwiJHtzdG9wU2VsfVwiYCk7XG4gICAgaWYgKGZyYWdtZW50RGVsaW1pdGVyICE9PSB1bmRlZmluZWQpXG4gICAgICBobE9wdGlvblBhcnRzLnB1c2goYEZyYWdtZW50RGVsaW1pdGVyPVwiJHtmcmFnbWVudERlbGltaXRlcn1cImApO1xuXG4gICAgY29uc3QgaGxPcHRpb25zID0gaGxPcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYCwgJyR7aGxPcHRpb25QYXJ0cy5qb2luKFwiLCBcIil9J2AgOiBcIlwiO1xuXG4gICAgLy8gVE9ETzogcmF3QmluZGluZyDrqZTshJzrk5wg66eM65Ok7Ja07IScIFhTUyDrsKnsp4BcbiAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmcoXG4gICAgICBgdHNfaGVhZGxpbmUoJyR7Y29uZmlnfScsICR7Y29sdW1ufSwgJHtwYXJzZXJ9KCcke2NvbmZpZ30nLCAnJHtxdWVyeX0nKSR7aGxPcHRpb25zfSlgLFxuICAgICk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4+KFxuICAgIHNlbGVjdE9iajogVFNlbGVjdCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKHR5cGVvZiBjb2x1bW5PckZ1bmN0aW9uID09PSBcIm9iamVjdFwiICYmIGNvbHVtbk9yRnVuY3Rpb24uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIikge1xuICAgICAgICAvLyBTUUwg7ZWo7IiY7J24IOqyveyasFxuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2godGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uLl9zcWx9IGFzICR7YWxpYXN9YCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gYXMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIOqwneyytOulvCBmbGF0IOqwneyytOuhnCDrs4DtmZhcbiAgICog7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKiAgIOKGkiB7IHBhcmVudF9faWQ6IFwicGFyZW50LmlkXCIsIHBhcmVudF9fbmFtZTogXCJwYXJlbnQubmFtZVwiIH1cbiAgICovXG4gIHByaXZhdGUgZmxhdHRlblNlbGVjdChzZWxlY3RPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByZWZpeCA9IFwiXCIpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBmbGF0U2VsZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWxlY3RPYmopKSB7XG4gICAgICBjb25zdCBmdWxsS2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fV9fJHtrZXl9YCA6IGtleTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSkpIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytOyduCDqsr3smrAgLSDsnqzqt4Ag7LKY66asXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuZmxhdHRlblNlbGVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZmxhdFNlbGVjdCwgbmVzdGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDqsJLsnbgg6rK97JqwICjsu6zrn7wg6rK966GcIOuYkOuKlCBTcWxFeHByZXNzaW9uKVxuICAgICAgICBmbGF0U2VsZWN0W2Z1bGxLZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXRTZWxlY3Q7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gYXMgJHthbGlhc31gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uT3JGdW5jdGlvbiBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gY29sdW1uUGF0aCkge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gYXMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGtuZXjsl5Ag7JeG7Ja07IScIOyngeygkSDqtaztmITtlahcbiAgY2xlYXJKb2luKGFsaWFzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50cyA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl9zdGF0ZW1lbnRzLmZpbHRlcigoczogYW55KSA9PiB7XG4gICAgICBpZiAoXCJqb2luVHlwZVwiIGluIHMpIHtcbiAgICAgICAgY29uc3QgW19hbGlhcywgX3RhYmxlXSA9IE9iamVjdC5lbnRyaWVzKHMudGFibGUpWzBdO1xuICAgICAgICByZXR1cm4gX2FsaWFzICE9PSBhbGlhcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXNcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8gVFRhYmxlcyDtmZXsnqUhXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoVcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8g7YWM7J2067iU66qF7J20IO2CpFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbW1vbkpvaW4oXCJqb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+OyAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIC8vIEZLIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIExlZnRKb2luZWRNYXJrZXIg6rKw7KCVXG4gIGxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21tb25Kb2luKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCAuLi5hcmdzKTtcbiAgfVxuXG4gIF9fY29tbW9uSm9pbihqb2luVHlwZTogXCJqb2luXCIgfCBcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBDYXNlIDE6IGpvaW4oXCJwb3N0c1wiLCAuLi4pXG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZU5hbWVPclNwZWM7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBjYWxsYmFjaylcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBsZWZ0LCByaWdodClcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNwZWMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIC8vIENhc2UgMjogam9pbih7IGFsaWFzOiBcInRhYmxlXCIgfSwgLi4uKSBvciBqb2luKHsgYWxpYXM6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNwZWMpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW1thbGlhcywgc3BlY11dID0gZW50cmllcztcblxuICAgICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIO2FjOydtOu4lDogam9pbih7IHA6IFwicG9zdHNcIiB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgLy8g7ISc67iM7L+866asOiBqb2luKHsgc3E6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBDYWxsYmFja1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRTog6rCd7LK0IC0g7IKs7JqpOiAud2hlcmUoeyBcInUuaWRcIjogMSwgXCJ1LnN0YXR1c1wiOiBcImFjdGl2ZVwiIH0pXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCAxKSwgLndoZXJlKFwidS5pZFwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcIj5cIiwgMTApLCAud2hlcmUoXCJ1LmlkXCIsIFwiIT1cIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCIsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTogU1FMIO2RnO2YhOyLnSAtIOyCrOyaqTogLndoZXJlKHB1cmkucmF3KFwiQ09OQ0FUKHUubmFtZSwgdS5lbWFpbClcIiksIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgS25leC5SYXc+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCIsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAodHlwZW9mIGNvbHVtbk9yQ29uZGl0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIiE9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSU5cbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90SW4oY29sdW1uLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhjb2x1bW4pfSkgQUdBSU5TVCAoPylgLCBbdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/ICh7IGNvbmZpZzogb3B0aW9ucyB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChvcHRpb25zID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPVxuICAgICAgdHlwZW9mIGNvbHVtbiA9PT0gXCJvYmplY3RcIiAmJiBjb2x1bW4uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIlxuICAgICAgICA/IGNvbHVtbi5fc3FsXG4gICAgICAgIDogU3RyaW5nKGNvbHVtbik7XG5cbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBbY29uZmlnLCB2YWx1ZV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgUkFXXG4gIHdoZXJlUmF3KHNxbDogc3RyaW5nLCBiaW5kaW5ncz86IHJlYWRvbmx5IHVua25vd25bXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQllcbiAgb3JkZXJCeTxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIGRpcmVjdGlvbjogXCJhc2NcIiB8IFwiZGVzY1wiLFxuICApOiB0aGlzO1xuICBvcmRlckJ5KGNvbHVtbjogc3RyaW5nLCBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiA9IFwiYXNjXCIpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5KGNvbHVtbiwgZGlyZWN0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOq4sOuzuCDsv7zrpqwg66mU7ISc65Oc65OkXG4gIGxpbWl0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxpbWl0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmxpbWl0KGNvdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9mZnNldChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvZmZzZXQ6IG11c3QgYmUgPj0gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkub2Zmc2V0KGNvdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEdST1VQIEJZXG4gIGdyb3VwQnk8VENvbHVtbnMgZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZ3JvdXBCeSguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lmdyb3VwQnkoLi4uKGNvbHVtbnMgYXMgc3RyaW5nW10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEhBVklOR1xuICBoYXZpbmcoY29uZGl0aW9uOiBzdHJpbmcpOiB0aGlzO1xuICBoYXZpbmc8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBhbnksXG4gICk6IHRoaXM7XG4gIC8vIEhBVklORyDqtaztmIRcbiAgaGF2aW5nKC4uLmNvbmRpdGlvbnM6IGFueVtdKTogdGhpcyB7XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBoYXZpbmcoXCJDT1VOVCgqKSA+IDEwXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcodGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSk7XG4gICAgfSBlbHNlIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMykge1xuICAgICAgLy8gaGF2aW5nKFwiY291bnRcIiwgXCI+XCIsIDEwKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pLFxuICAgICAgICBjb25kaXRpb25zWzFdLFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMl0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoYXZpbmcgYXJndW1lbnRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOyLpO2WiSDrqZTshJzrk5zrk6QgLSB0aGVuYWJsZSDqtaztmIRcbiAgdGhlbjxUUmVzdWx0MSA9IEV4cGFuZDxUUmVzdWx0PltdLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IEV4cGFuZDxUUmVzdWx0PltdKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICBOYWl0ZS50KFwicHVyaTpleGVjdXRlZC1xdWVyeVwiLCB0aGlzLnRvUXVlcnkoKSk7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaDxUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0IHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxuXG4gIC8vIO2VmOuCmOunjCDsv7zrpqxcbiAgZmlyc3QoKTogUmVzb2x2ZWRQdXJpPEV4cGFuZDxUUmVzdWx0PiwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5maXJzdCgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8g7L+866as7ZWcIOugiOy9lOuTnOyXkOyEnCDtirnsoJUg7Lus65+866eMIOy2lOy2nO2VnCDrsLDsl7Qg66as7YS0XG4gIHBsdWNrPFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUUmVzdWx0IHwgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8XG4gICAgVENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHRcbiAgICAgID8gVFJlc3VsdFtUQ29sdW1uXVtdXG4gICAgICA6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICAgbmV2ZXJcbiAgPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkucGx1Y2soY29sdW1uIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBJTlNFUlRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQoZGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBVUERBVEVcbiAgdXBkYXRlKGRhdGE6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnVwZGF0ZShkYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIEluY3JlbWVudFxuICBpbmNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5jcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gREVMRVRFXG4gIGRlbGV0ZSgpOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVsZXRlKCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyDtmZXsnbgg7L+866asIOumrO2EtFxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIC8vIOy/vOumrCDrlJTrsoTquYUg66Gc6re4IOy2nOugpVxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyAnZHVhbCfsnYAg642U66+4IO2FjOydtOu4lOydtOupsCwg67CU66GcIOyVhOuemCDspITsl5DshJwga25leFF1ZXJ56rCAIOuNruyWtOyUjOybjOynkeuLiOuLpC5cbiAgICBjb25zdCBuZXdQdXJpID0gbmV3IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4odGhpcy5rbmV4LCBcImR1YWxcIik7XG4gICAgbmV3UHVyaS5rbmV4UXVlcnkgPSB0aGlzLmtuZXhRdWVyeS5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdQdXJpO1xuICB9XG5cbiAgZm9ybWF0U1FMKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNRTCDsmIjslb3slrQg66qp66GdXG4gICAgY29uc3Qga2V5d29yZHMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIklOU0VSVFwiLFxuICAgICAgXCJJTlRPXCIsXG4gICAgICBcIlZBTFVFU1wiLFxuICAgICAgXCJVUERBVEVcIixcbiAgICAgIFwiREVMRVRFXCIsXG4gICAgICBcIkNSRUFURVwiLFxuICAgICAgXCJUQUJMRVwiLFxuICAgICAgXCJBTFRFUlwiLFxuICAgICAgXCJEUk9QXCIsXG4gICAgICBcIkpPSU5cIixcbiAgICAgIFwiT05cIixcbiAgICAgIFwiSU5ORVJcIixcbiAgICAgIFwiTEVGVFwiLFxuICAgICAgXCJSSUdIVFwiLFxuICAgICAgXCJGVUxMXCIsXG4gICAgICBcIk9VVEVSXCIsXG4gICAgICBcIkdST1VQXCIsXG4gICAgICBcIkJZXCIsXG4gICAgICBcIk9SREVSXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJESVNUSU5DVFwiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJPRkZTRVRcIixcbiAgICAgIFwiQVNcIixcbiAgICAgIFwiQU5EXCIsXG4gICAgICBcIk9SXCIsXG4gICAgICBcIk5PVFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJMSUtFXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIk5VTExcIixcbiAgICAgIFwiQ0FTRVwiLFxuICAgICAgXCJXSEVOXCIsXG4gICAgICBcIlRIRU5cIixcbiAgICAgIFwiRUxTRVwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICAgIFwiQUxMXCIsXG4gICAgICBcIkVYSVNUU1wiLFxuICAgICAgXCJCRVRXRUVOXCIsXG4gICAgXTtcblxuICAgIGxldCBmb3JtYXR0ZWQgPSB1bmZvcm1hdHRlZDtcblxuICAgIC8vIOyYiOyVveyWtOulvCDrjIDrrLjsnpDroZwg67OA7ZmYXG4gICAga2V5d29yZHMuZm9yRWFjaCgoa2V5d29yZCkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7a2V5d29yZH1cXFxcYmAsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwga2V5d29yZC50b1VwcGVyQ2FzZSgpKTtcbiAgICB9KTtcblxuICAgIC8vIOyjvOyalCDsoIgg7JWe7JeQIOykhOuwlOq/iCDstpTqsIBcbiAgICBjb25zdCBtYWpvckNsYXVzZXMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBcIk9SREVSIEJZXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgIF07XG4gICAgbWFqb3JDbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxccysoJHtjbGF1c2V9KVxcXFxzK2AsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwgYFxcbiR7Y2xhdXNlLnRvVXBwZXJDYXNlKCl9IGApO1xuICAgIH0pO1xuXG4gICAgLy8gSk9JTiDsoIgg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoKD86SU5ORVJ8TEVGVHxSSUdIVHxGVUxMIE9VVEVSKVxccyspP0pPSU5cXHMrL2dpLCBcIlxcbiQxSk9JTiBcIik7XG5cbiAgICAvLyBBTkQsIE9SIOyhsOqxtCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKyhBTkR8T1IpXFxzKy9naSwgXCJcXG4gICQxIFwiKTtcblxuICAgIC8vIOq0hO2YuCDsspjrpqwg67CPIOuTpOyXrOyTsOq4sFxuICAgIGNvbnN0IGxpbmVzID0gZm9ybWF0dGVkLnNwbGl0KFwiXFxuXCIpO1xuICAgIGNvbnN0IGluZGVudGVkTGluZXMgPSBbXTtcbiAgICBsZXQgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkTGluZSkgY29udGludWU7XG5cbiAgICAgIC8vIOuLq+uKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg6rCQ7IaMXG4gICAgICBjb25zdCBjbG9zaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCkvZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG9wZW5pbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2xvc2luZ1BhcmVucyA+IDAgJiYgb3BlbmluZ1BhcmVucyA9PT0gMCkge1xuICAgICAgICBpbmRlbnRMZXZlbCA9IE1hdGgubWF4KDAsIGluZGVudExldmVsIC0gY2xvc2luZ1BhcmVucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2YhOyerCDrk6Tsl6zsk7DquLAg7KCB7JqpXG4gICAgICBjb25zdCBpbmRlbnQgPSBcIiAgXCIucmVwZWF0KGluZGVudExldmVsKTtcbiAgICAgIGluZGVudGVkTGluZXMucHVzaChpbmRlbnQgKyB0cmltbWVkTGluZSk7XG5cbiAgICAgIC8vIOyXrOuKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg7Kad6rCAXG4gICAgICBpZiAob3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgKz0gb3BlbmluZ1BhcmVucyAtIGNsb3NpbmdQYXJlbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudGVkTGluZXMuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICByYXcoc3FsOiBzdHJpbmcpOiBLbmV4LlJhdyB7XG4gICAgcmV0dXJuIHRoaXMua25leC5yYXcoc3FsKTtcbiAgfVxuXG4gIC8vIEtuZXgg7L+866asIOu5jOuNlCDsp4HsoJEg7KCR6re8XG4gIHJhd1F1ZXJ5KCk6IEtuZXguUXVlcnlCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdoZXJlR3JvdXA8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikge31cblxuICAvLyB3aGVyZSDrqZTshJzrk5zrk6RcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZSDrqZTshJzrk5zrk6RcbiAgb3JXaGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmUoLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxcbiAgVExlZnQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUUmlnaHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OKE9SKTog7Lus65+8ID0g7Lus65+8XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+KTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy9nOuwsVxuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VFJpZ2h0LCBUTGVmdD4pID0+IHZvaWQpOiB0aGlzO1xuICAvLyBPTihPUikg6rWs7ZiEXG4gIG9yT24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9yT24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qXG4gIFRSZXNvbHZlZDog7L+866asIOyLpO2WiSDtm4Qg67CY7ZmY65CgIOqysOqzvCDtg4DsnoVcbiAgVFJldHVybmluZzogUkVUVVJOSU5HIOygiOyXkCDsgqzsmqnrkKAg7YOA7J6FXG4qL1xuZXhwb3J0IGNsYXNzIFJlc29sdmVkUHVyaTxUUmVzb2x2ZWQsIFRSZXR1cm5pbmc+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBrbmV4OiBLbmV4LFxuICApIHt9XG5cbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVFJlc29sdmVkLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFRSZXNvbHZlZCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc29sdmVkIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIFwiX3R5cGVcIiBpbiB2YWx1ZSAmJlxuICAgICAgICAgICAgdmFsdWUuX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gU3FsRXhwcmVzc2lvbiDihpIga25leC5yYXcoKeuhnCDrs4DtmZhcbiAgICAgICAgICAgIG1lcmdlT2JqW2tleV0gPSB0aGlzLmtuZXgucmF3KCh2YWx1ZSBhcyBTcWxFeHByZXNzaW9uPGFueT4pLl9zcWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDsnbzrsJgg6rCSXG4gICAgICAgICAgICBtZXJnZU9ialtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKG1lcmdlT2JqKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFJFVFVSTklORzogXCIqXCIgLSDsoITssrQg7Lus65+8XG4gIHJldHVybmluZyhjb2x1bW46IFwiKlwiKTogUmVzb2x2ZWRQdXJpPFRSZXR1cm5pbmdbXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuLqOydvCDsu6zrn7xcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDrs7XsiJgg7Lus65+8ICjrsLDsl7QpXG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uczogVENvbHVtbltdLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORyDqtaztmIRcbiAgcmV0dXJuaW5nKGNvbHVtbk9yQ29sdW1uczogc3RyaW5nIHwgc3RyaW5nW10pOiBSZXNvbHZlZFB1cmk8YW55W10sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkucmV0dXJuaW5nKGNvbHVtbk9yQ29sdW1ucyk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsIk5haXRlIiwiUHVyaSIsImtuZXhRdWVyeSIsImtuZXgiLCJ0YWJsZU5hbWVPclNwZWMiLCJmcm9tIiwiZW50cmllcyIsIk9iamVjdCIsImxlbmd0aCIsIkVycm9yIiwiYWxpYXMiLCJzcGVjIiwic3VicXVlcnlCdWlsZGVyIiwicmF3UXVlcnkiLCJhcyIsImNvdW50IiwiY29sdW1uIiwiX3R5cGUiLCJfcmV0dXJuIiwiX3NxbCIsInN1bSIsImF2ZyIsIm1heCIsIm1pbiIsImNvbmNhdCIsImFyZ3MiLCJqb2luIiwidXBwZXIiLCJsb3dlciIsInJhd1N0cmluZyIsInNxbCIsInJhd051bWJlciIsInJhd0Jvb2xlYW4iLCJyYXdEYXRlIiwiaGlnaGxpZ2h0IiwicXVlcnkiLCJvcHRpb25zIiwicGFyc2VyIiwiY29uZmlnIiwibWF4V29yZHMiLCJtaW5Xb3JkcyIsInNob3J0V29yZCIsImhpZ2hsaWdodEFsbCIsIm1heEZyYWdtZW50cyIsInN0YXJ0U2VsIiwic3RvcFNlbCIsImZyYWdtZW50RGVsaW1pdGVyIiwiaGxPcHRpb25QYXJ0cyIsInVuZGVmaW5lZCIsInB1c2giLCJobE9wdGlvbnMiLCJzZWxlY3QiLCJzZWxlY3RPYmoiLCJmbGF0U2VsZWN0IiwiZmxhdHRlblNlbGVjdCIsInNlbGVjdENsYXVzZXMiLCJjb2x1bW5PckZ1bmN0aW9uIiwicmF3IiwiY29sdW1uUGF0aCIsInByZWZpeCIsImtleSIsInZhbHVlIiwiZnVsbEtleSIsIm5lc3RlZCIsImFzc2lnbiIsImFwcGVuZFNlbGVjdCIsInNlbGVjdEFsbCIsImNsZWFyIiwic3RhdGVtZW50IiwiY2xlYXJKb2luIiwiX3N0YXRlbWVudHMiLCJmaWx0ZXIiLCJzIiwiX2FsaWFzIiwiX3RhYmxlIiwidGFibGUiLCJfX2NvbW1vbkpvaW4iLCJsZWZ0Sm9pbiIsImpvaW5UeXBlIiwidGFibGVOYW1lIiwiY2FsbGJhY2siLCJqb2luQ2xhdXNlIiwiSm9pbkNsYXVzZUdyb3VwIiwibGVmdCIsInJpZ2h0Iiwid2hlcmUiLCJjb2x1bW5PckNvbmRpdGlvbnMiLCJvcGVyYXRvck9yVmFsdWUiLCJ3aGVyZU51bGwiLCJ3aGVyZU5vdE51bGwiLCJ3aGVyZUluIiwidmFsdWVzIiwid2hlcmVOb3RJbiIsIndoZXJlTWF0Y2giLCJ3aGVyZVJhdyIsIlN0cmluZyIsIndoZXJlU2VhcmNoIiwib3B0cyIsImNvbHVtbkV4cHIiLCJiaW5kaW5ncyIsIndoZXJlR3JvdXAiLCJidWlsZGVyIiwiZ3JvdXAiLCJXaGVyZUdyb3VwIiwib3JXaGVyZUdyb3VwIiwib3JXaGVyZSIsIm9yZGVyQnkiLCJkaXJlY3Rpb24iLCJsaW1pdCIsIm9mZnNldCIsImdyb3VwQnkiLCJjb2x1bW5zIiwiaGF2aW5nIiwiY29uZGl0aW9ucyIsInRoZW4iLCJvbmZ1bGZpbGxlZCIsIm9ucmVqZWN0ZWQiLCJ0IiwidG9RdWVyeSIsImNhdGNoIiwiZmluYWxseSIsIm9uZmluYWxseSIsImZpcnN0IiwiUmVzb2x2ZWRQdXJpIiwicGx1Y2siLCJpbnNlcnQiLCJkYXRhIiwidXBkYXRlIiwiaW5jcmVtZW50IiwiZGVjcmVtZW50IiwiZGVsZXRlIiwiZGVidWciLCJjb25zb2xlIiwibG9nIiwiY3lhbiIsInllbGxvdyIsImNsb25lIiwibmV3UHVyaSIsImZvcm1hdFNRTCIsInVuZm9ybWF0dGVkIiwia2V5d29yZHMiLCJmb3JtYXR0ZWQiLCJmb3JFYWNoIiwia2V5d29yZCIsInJlZ2V4IiwiUmVnRXhwIiwicmVwbGFjZSIsInRvVXBwZXJDYXNlIiwibWFqb3JDbGF1c2VzIiwiY2xhdXNlIiwibGluZXMiLCJzcGxpdCIsImluZGVudGVkTGluZXMiLCJpbmRlbnRMZXZlbCIsImxpbmUiLCJ0cmltbWVkTGluZSIsInRyaW0iLCJjbG9zaW5nUGFyZW5zIiwibWF0Y2giLCJvcGVuaW5nUGFyZW5zIiwiTWF0aCIsImluZGVudCIsInJlcGVhdCIsInNsaWNlIiwic3ViQnVpbGRlciIsInN1Ykdyb3VwIiwib24iLCJvck9uIiwib25Db25mbGljdCIsImFjdGlvbiIsInRhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsImlnbm9yZSIsIm1lcmdlIiwibWVyZ2VPYmoiLCJyZXR1cm5pbmciLCJjb2x1bW5PckNvbHVtbnMiXSwibWFwcGluZ3MiOiJBQUFBLHNGQUFzRixHQUN0Riw2RUFBNkUsR0FFN0UsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUUxQixTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBNEJ2QyxPQUFPLE1BQU1DOztJQUNIQyxVQUE2QjtJQUtyQyxZQUNFLEFBQU9DLElBQVUsRUFD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
|
|
860
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogUHVyaeuKlCB0aGVuYWJsZSDsnbjthLDtjpjsnbTsiqTrpbwg6rWs7ZiE7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cbi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF2YWlsYWJsZUNvbHVtbnMsXG4gIENvbHVtbktleXMsXG4gIENvbXBhcmlzb25PcGVyYXRvcixcbiAgRXhwYW5kLFxuICBFeHRyYWN0Q29sdW1uVHlwZSxcbiAgRnVsbHRleHRDb2x1bW5zLFxuICBJbnNlcnREYXRhLFxuICBJbnNlcnRSZXN1bHQsXG4gIExlZnRKb2luZWRNYXJrZXIsXG4gIExlZnRKb2luTWFya2VyRm9yLFxuICBOdW1lcmljQ29sdW1ucyxcbiAgT25Db25mbGljdEFjdGlvbixcbiAgUGFyc2VTZWxlY3RPYmplY3QsXG4gIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnMsXG4gIFNlbGVjdEFsbFJlc3VsdCxcbiAgU2VsZWN0T2JqZWN0LFxuICBTaW5nbGVUYWJsZVZhbHVlLFxuICBTcWxFeHByZXNzaW9uLFxuICBUc0hpZ2hsaWdodE9wdGlvbnMsXG4gIFRzUXVlcnlDb25maWcsXG4gIFRzUXVlcnlPcHRpb25zLFxuICBUc1JhbmtPcHRpb25zLFxuICBWZWN0b3JDb2x1bW5zLFxuICBXaGVyZUNvbmRpdGlvbixcbiAgV2hlcmVPcGVyYXRvcixcbn0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGVhclN0YXRlbWVudHMgfSBmcm9tIFwiLi9wdXJpLXN1YnNldC50eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVFJlc3VsdD4ge1xuICBwcml2YXRlIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXI7XG5cbiAgLy8g7IOd7ISx7J6QIOyLnOq3uOuLiOyymOuTpFxuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk7XG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlU3BlYzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUHVyaTxUU2NoZW1hLCBhbnksIGFueT4+KTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXg6IEtuZXgsXG4gICAgdGFibGVOYW1lT3JTcGVjOiBhbnksXG4gICkge1xuICAgIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBDYXNlOiBuZXcgUHVyaShrbmV4LCBcInVzZXJzXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leCh0YWJsZU5hbWVPclNwZWMpLmZyb20odGFibGVOYW1lT3JTcGVjKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNwZWMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNwZWMpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzcGVjXSA9IGVudHJpZXNbMF07XG4gICAgICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc3BlYykuZnJvbSh7IFthbGlhc106IHNwZWMgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIGNvbnN0IHN1YnF1ZXJ5QnVpbGRlciA9IHNwZWMucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKCR7Y29sdW1ufSk6OmludGVnZXJgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHN1bShjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBTVU0oJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgYXZnKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYEFWRygke2NvbHVtbn0pYCxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1pbihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNSU4oJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29uY2F0KC4uLmFyZ3M6IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYENPTkNBVCgke2FyZ3Muam9pbihcIiwgXCIpfSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYFVQUEVSKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYExPV0VSKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cblxuICAvLyBSYXcgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIHJhd1N0cmluZyhzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nXCIsIF9zcWw6IHNxbCB9O1xuICB9XG4gIHN0YXRpYyByYXdTdHJpbmdBcnJheShzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdbXVwiLCBfc3FsOiBzcWwgfTtcbiAgfVxuICBzdGF0aWMgcmF3TnVtYmVyKHNxbDogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsIH07XG4gIH1cbiAgc3RhdGljIHJhd0Jvb2xlYW4oc3FsOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwiYm9vbGVhblwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJib29sZWFuXCIsIF9zcWw6IHNxbCB9O1xuICB9XG4gIHN0YXRpYyByYXdEYXRlKHNxbDogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcImRhdGVcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiZGF0ZVwiLCBfc3FsOiBzcWwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFMg6rKA7IOJ7Ja0IO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiAgIGNvbnRlbnQ6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMuY29udGVudFwiLCBzZWFyY2gsIHtcbiAgICogICAgIHN0YXJ0U2VsOiBcIjxtYXJrPlwiLFxuICAgKiAgICAgc3RvcFNlbDogXCI8L21hcms+XCIsXG4gICAqICAgICBtYXhGcmFnbWVudHM6IDMsXG4gICAqICAgfSksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgdHNIaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBfb3B0aW9ucz86IFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3QgeyBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsIGNvbmZpZyA9IFwic2ltcGxlXCIsIC4uLm9wdGlvbnMgfSA9IF9vcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgaGxPcHRpb25QYXJ0cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShrZXkpfT0ke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBobE9wdGlvbnMgPSBobE9wdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgLCAnJHtobE9wdGlvblBhcnRzLmpvaW4oXCIsIFwiKX0nYCA6IFwiXCI7XG5cbiAgICAvLyBUT0RPOiByYXdCaW5kaW5nIOuplOyEnOuTnCDrp4zrk6TslrTshJwgWFNTIOuwqeyngFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZyhcbiAgICAgIGB0c19oZWFkbGluZSgnJHtjb25maWd9JywgJHtjb2x1bW59LCAke3BhcnNlcn0oJyR7Y29uZmlnfScsICcke3F1ZXJ5fScpJHtobE9wdGlvbnN9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIHRzX3JhbmtcbiAgc3RhdGljIHRzUmFuayhjb2x1bW46IHN0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFRzUmFua09wdGlvbnMpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaS5fdHNSYW5rKFwidHNfcmFua1wiLCBjb2x1bW4sIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIHRzX3JhbmtfY2RcbiAgc3RhdGljIHRzUmFua0NkKGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpLl90c1JhbmsoXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIF90c1JhbmsoXG4gICAgdHlwZTogXCJ0c19yYW5rXCIgfCBcInRzX3JhbmtfY2RcIixcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBjb25zdCB7XG4gICAgICBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsXG4gICAgICBjb25maWcgPSBcInNpbXBsZVwiLFxuICAgICAgbm9ybWFsaXphdGlvbixcbiAgICAgIHdlaWdodHMsXG4gICAgfSA9IG9wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCB3ZWlnaHRDbGF1c2UgPSB3ZWlnaHRzID8gYEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLCBcIil9XSwgYCA6IFwiXCI7XG4gICAgY29uc3Qgbm9ybWFsaXphdGlvbkNsYXVzZSA9IG5vcm1hbGl6YXRpb24gPyBgLCAke25vcm1hbGl6YXRpb259YCA6IFwiXCI7XG5cbiAgICByZXR1cm4gUHVyaS5yYXdOdW1iZXIoXG4gICAgICBgJHt0eXBlfSgke3dlaWdodENsYXVzZX0ke2NvbHVtbn0sICR7cGFyc2VyfSgnJHtjb25maWd9JywgJyR7cXVlcnl9Jykke25vcm1hbGl6YXRpb25DbGF1c2V9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIOygkOyImFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICBzY29yZTogUHVyaS5zY29yZSgpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIHNjb3JlKCk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpLnJhd051bWJlcihcInBncm9vbmdhX3Njb3JlKHRhYmxlb2lkLCBjdGlkKVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW46IHN0cmluZywgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPjtcbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW5zOiBzdHJpbmdbXSwgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1tdXCI+O1xuXG4gIHN0YXRpYyBoaWdobGlnaHQoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10sXG4gICk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIGNvbnN0IHF1ZXJ5Q2xhdXNlID0gYEFSUkFZWyR7KEFycmF5LmlzQXJyYXkocXVlcnkpID8gcXVlcnkgOiBbcXVlcnldKS5tYXAoKHEpID0+IGAnJHtxfSdgKS5qb2luKFwiLFwiKX1dYDtcblxuICAgIC8vIOuLqOydvCDsu6zrn7zsnbgg6rK97JqwXG4gICAgaWYgKHR5cGVvZiBjb2x1bW5PckNvbHVtbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBQdXJpLnJhd1N0cmluZyhgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoJHtjb2x1bW5PckNvbHVtbnN9LCAke3F1ZXJ5Q2xhdXNlfSlgKTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg67Cw7Je07J24IOqyveyasFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZ0FycmF5KFxuICAgICAgYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKEFSUkFZWyR7Y29sdW1uT3JDb2x1bW5zLmpvaW4oXCIsXCIpfV0sICR7cXVlcnlDbGF1c2V9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAob3ZlcndyaXRlKVxuICBzZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIC8vIFNRTCDtlajsiJjsnbgg6rK97JqwXG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gYXMgXCIke2FsaWFzfVwiYCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gYXMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIOqwneyytOulvCBmbGF0IOqwneyytOuhnCDrs4DtmZhcbiAgICog7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKiAgIOKGkiB7IHBhcmVudF9faWQ6IFwicGFyZW50LmlkXCIsIHBhcmVudF9fbmFtZTogXCJwYXJlbnQubmFtZVwiIH1cbiAgICovXG4gIHByaXZhdGUgZmxhdHRlblNlbGVjdChzZWxlY3RPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByZWZpeCA9IFwiXCIpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBmbGF0U2VsZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWxlY3RPYmopKSB7XG4gICAgICBjb25zdCBmdWxsS2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fV9fJHtrZXl9YCA6IGtleTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSkpIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytOyduCDqsr3smrAgLSDsnqzqt4Ag7LKY66asXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuZmxhdHRlblNlbGVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZmxhdFNlbGVjdCwgbmVzdGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDqsJLsnbgg6rK97JqwICjsu6zrn7wg6rK966GcIOuYkOuKlCBTcWxFeHByZXNzaW9uKVxuICAgICAgICBmbGF0U2VsZWN0W2Z1bGxLZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXRTZWxlY3Q7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gYXMgJHthbGlhc31gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uT3JGdW5jdGlvbiBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gY29sdW1uUGF0aCkge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gYXMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGtuZXjsl5Ag7JeG7Ja07IScIOyngeygkSDqtaztmITtlahcbiAgY2xlYXJKb2luKGFsaWFzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50cyA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl9zdGF0ZW1lbnRzLmZpbHRlcigoczogYW55KSA9PiB7XG4gICAgICBpZiAoXCJqb2luVHlwZVwiIGluIHMpIHtcbiAgICAgICAgY29uc3QgW19hbGlhcywgX3RhYmxlXSA9IE9iamVjdC5lbnRyaWVzKHMudGFibGUpWzBdO1xuICAgICAgICByZXR1cm4gX2FsaWFzICE9PSBhbGlhcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXNcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8gVFRhYmxlcyDtmZXsnqUhXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoVcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8g7YWM7J2067iU66qF7J20IO2CpFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbW1vbkpvaW4oXCJqb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+OyAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIC8vIEZLIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIExlZnRKb2luZWRNYXJrZXIg6rKw7KCVXG4gIGxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21tb25Kb2luKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCAuLi5hcmdzKTtcbiAgfVxuXG4gIF9fY29tbW9uSm9pbihqb2luVHlwZTogXCJqb2luXCIgfCBcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBDYXNlIDE6IGpvaW4oXCJwb3N0c1wiLCAuLi4pXG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZU5hbWVPclNwZWM7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBjYWxsYmFjaylcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBsZWZ0LCByaWdodClcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNwZWMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIC8vIENhc2UgMjogam9pbih7IGFsaWFzOiBcInRhYmxlXCIgfSwgLi4uKSBvciBqb2luKHsgYWxpYXM6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNwZWMpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW1thbGlhcywgc3BlY11dID0gZW50cmllcztcblxuICAgICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIO2FjOydtOu4lDogam9pbih7IHA6IFwicG9zdHNcIiB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgLy8g7ISc67iM7L+866asOiBqb2luKHsgc3E6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBDYWxsYmFja1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRTog6rCd7LK0IC0g7IKs7JqpOiAud2hlcmUoeyBcInUuaWRcIjogMSwgXCJ1LnN0YXR1c1wiOiBcImFjdGl2ZVwiIH0pXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCAxKSwgLndoZXJlKFwidS5pZFwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcIj5cIiwgMTApLCAud2hlcmUoXCJ1LmlkXCIsIFwiIT1cIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCIsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTogU1FMIO2RnO2YhOyLnSAtIOyCrOyaqTogLndoZXJlKHB1cmkucmF3KFwiQ09OQ0FUKHUubmFtZSwgdS5lbWFpbClcIiksIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgS25leC5SYXc+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCIsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAodHlwZW9mIGNvbHVtbk9yQ29uZGl0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIiE9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSU5cbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90SW4oY29sdW1uLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhjb2x1bW4pfSkgQUdBSU5TVCAoPylgLCBbdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJXG4gICAqIC0g7IKs7Jqp7ZWgIFBHcm9vbmdhIOyduOuNseyKpOyZgCDrj5nsnbztlZwg7Lus65+8IOq1rOyEseycvOuhnCDqsoDsg4ntlbTslbwg7J24642x7Iqk6rCAIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICog64uo7J28IOy7rOufvCDqsoDsg4k6XG4gICAqIGBgYHNxbFxuICAgKiBXSEVSRSBuYW1lICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICpcbiAgICog67O17ZWpIOy7rOufvCDqsoDsg4k6XG4gICAqIGBgYHNxbFxuICAgKiBXSEVSRSBBUlJBWVtuYW1lOjp0ZXh0LCBkZXNjcmlwdGlvbjo6dGV4dF0gJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoY29sdW1uKVxuICAgICAgPyBgQVJSQVlbJHtjb2x1bW4ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGNvbHVtbjtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW3ZhbHVlXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID8gKHsgY29uZmlnOiBvcHRpb25zIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKG9wdGlvbnMgPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9XG4gICAgICB0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiICYmIGNvbHVtbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgID8gY29sdW1uLl9zcWxcbiAgICAgICAgOiBTdHJpbmcoY29sdW1uKTtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIHZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBSQVdcbiAgd2hlcmVSYXcoc3FsOiBzdHJpbmcsIGJpbmRpbmdzPzogcmVhZG9ubHkgdW5rbm93bltdKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoc3FsLCBiaW5kaW5ncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSDqtITtmLgg6re466O57ZWRXG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oYnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhncm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lm9yV2hlcmUoKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oYnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhncm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPUkRFUiBCWVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCIsXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoY29sdW1uOiBzdHJpbmcsIGRpcmVjdGlvbjogXCJhc2NcIiB8IFwiZGVzY1wiID0gXCJhc2NcIik6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnkoY29sdW1uLCBkaXJlY3Rpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOuyoe2EsCDsnKDsgqzrj4Qg6rKA7IOJIOyEpOyglVxuICAgKlxuICAgKiAtIFNFTEVDVOyXkCBzaW1pbGFyaXR5IOy7rOufvCDstpTqsIBcbiAgICogLSBXSEVSRSBjb2wgSVMgTk9UIE5VTEwg7LaU6rCAXG4gICAqIC0gdGhyZXNob2xk6rCAIOyeiOycvOuptCBXSEVSRSDsobDqsbQg7LaU6rCAXG4gICAqIC0g6riw7KG0IE9SREVSIEJZ66W8IGNsZWFy7ZWY6rOgIOybkOyLnCDsl7DsgrDsnpDroZwg7KCV66CsIChITlNXIOyduOuNseyKpCDstZzsoIHtmZQpXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW4g67Kh7YSwIOy7rOufvCDqsr3roZxcbiAgICogQHBhcmFtIGVtYmVkZGluZyDsv7zrpqwg7J6E67Kg65SpIOuyoe2EsFxuICAgKiBAcGFyYW0gb3B0aW9ucyBtZXRob2QsIHRocmVzaG9sZCwgYXMg65OxIOyYteyFmFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIGNvc2luZSBzaW1pbGFyaXR5ICjquLDrs7jqsJIpXG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImNvc2luZVwiLFxuICAgKiAgIHRocmVzaG9sZDogMC41XG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBMMiBkaXN0YW5jZVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJsMlwiLFxuICAgKiAgIHRocmVzaG9sZDogMS41ICAvLyDqsbDrpqzqsIAgMS41IOydtO2VmOyduCDqsrDqs7zrp4xcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIElubmVyIHByb2R1Y3RcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwiaW5uZXJfcHJvZHVjdFwiLFxuICAgKiAgIHRocmVzaG9sZDogMC43XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHZlY3RvclNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBWZWN0b3JDb2x1bW5zPFRUYWJsZXM+LFxuICAgIGVtYmVkZGluZzogbnVtYmVyW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgbWV0aG9kPzogXCJjb3NpbmVcIiB8IFwibDJcIiB8IFwiaW5uZXJfcHJvZHVjdFwiO1xuICAgICAgdGhyZXNob2xkPzogbnVtYmVyO1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkIH0gPSBvcHRpb25zO1xuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGVtYmVkZGluZykgfHxcbiAgICAgIGVtYmVkZGluZy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGVtYmVkZGluZy5zb21lKCh2KSA9PiAhTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBlbWJlZGRpbmcgdmVjdG9yOiBleHBlY3RlZCBhIG5vbi1lbXB0eSBhcnJheSBvZiBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdmVjdG9yTGl0ZXJhbCA9IEpTT04uc3RyaW5naWZ5KGVtYmVkZGluZy5tYXAoKHYpID0+IE51bWJlcih2KSkpO1xuXG4gICAgLy8gbWV0aG9k67OEIOyXsOyCsOyekCDrsI8gc2ltaWxhcml0eSDqs4TsgrDsi51cbiAgICAvLyAtIGNvc2luZTogPD0+IChjb3NpbmUgZGlzdGFuY2UsIDB+MiksIHNpbWlsYXJpdHkgPSAxIC0gZGlzdGFuY2VcbiAgICAvLyAtIGwyOiA8LT4gKGV1Y2xpZGVhbiBkaXN0YW5jZSksIHNpbWlsYXJpdHkgPSBkaXN0YW5jZSAo64Ku7J2E7IiY66GdIOycoOyCrClcbiAgICAvLyAtIGlubmVyX3Byb2R1Y3Q6IDwjPiAobmVnYXRpdmUgaW5uZXIgcHJvZHVjdCksIHNpbWlsYXJpdHkgPSAtZGlzdGFuY2UgKOuGkuydhOyImOuhnSDsnKDsgqwpXG4gICAgY29uc3Qgb3BlcmF0b3JNYXAgPSB7XG4gICAgICBjb3NpbmU6IFwiPD0+XCIsXG4gICAgICBsMjogXCI8LT5cIixcbiAgICAgIGlubmVyX3Byb2R1Y3Q6IFwiPCM+XCIsXG4gICAgfSBhcyBjb25zdDtcbiAgICBjb25zdCBvcGVyYXRvciA9IG9wZXJhdG9yTWFwW21ldGhvZF07XG5cbiAgICAvLyBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDstpTqsIBcbiAgICBpZiAobWV0aG9kID09PSBcImNvc2luZVwiKSB7XG4gICAgICAvLyBjb3NpbmU6IHNpbWlsYXJpdHkgPSAxIC0gY29zaW5lX2Rpc3RhbmNlICgwfjEsIOuGkuydhOyImOuhnSDsnKDsgqwpXG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXG4gICAgICAgIHRoaXMua25leC5yYXcoYDEgLSAoPz8gPD0+ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwibDJcIikge1xuICAgICAgLy8gbDI6IGRpc3RhbmNlIOq3uOuMgOuhnCDrsJjtmZggKOuCruydhOyImOuhnSDsnKDsgqwpXG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXG4gICAgICAgIHRoaXMua25leC5yYXcoYD8/IDwtPiA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlubmVyX3Byb2R1Y3Q6IHBndmVjdG9y64qUIOydjOyImCDrsJjtmZjtlZjrr4DroZwg67aA7Zi4IOuwmOyghCAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhgLSg/PyA8Iz4gPzo6dmVjdG9yKSBhcyBzaW1pbGFyaXR5YCwgW2NvbHVtbiwgdmVjdG9yTGl0ZXJhbF0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXSEVSRSBjb2wgSVMgTk9UIE5VTExcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uKTtcblxuICAgIC8vIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7LaU6rCAXG4gICAgaWYgKHR5cGVvZiB0aHJlc2hvbGQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRocmVzaG9sZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZlY3RvclNpbWlsYXJpdHkgdGhyZXNob2xkOiAke3RocmVzaG9sZH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJjb3NpbmVcIikge1xuICAgICAgICAvLyBzaW1pbGFyaXR5ID49IHRocmVzaG9sZCAgPD0+ICBjb3NpbmVfZGlzdGFuY2UgPD0gKDEgLSB0aHJlc2hvbGQpXG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgPD0gP2AsIFtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgICAgICAxIC0gdGhyZXNob2xkLFxuICAgICAgICBdKTtcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcImwyXCIpIHtcbiAgICAgICAgLy8gZGlzdGFuY2UgPD0gdGhyZXNob2xkICjqsbDrpqzqsIAgdGhyZXNob2xkIOydtO2VmClcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvciA8PSA/YCwgW1xuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbm5lcl9wcm9kdWN0OiAtZGlzdGFuY2UgPj0gdGhyZXNob2xkICA8PT4gIGRpc3RhbmNlIDw9IC10aHJlc2hvbGRcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvciA8PSA/YCwgW1xuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgICAgIC10aHJlc2hvbGQsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOq4sOyhtCBPUkRFUiBCWSBjbGVhciDtm4Qg7JuQ7IucIOyXsOyCsOyekOuhnCDsoJXroKwgKEhOU1cg7J24642x7IqkIOy1nOygge2ZlClcbiAgICAvLyDrqqjrk6AgbWV0aG9k7JeQ7IScIEFTQzog6rGw66asL+ydjOyImOqwkuydtCDsnpHsnYTsiJjroZ0g7Jyg7IKsXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLihjb2x1bW5zIGFzIHN0cmluZ1tdKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBIQVZJTkdcbiAgaGF2aW5nKGNvbmRpdGlvbjogc3RyaW5nKTogdGhpcztcbiAgaGF2aW5nPFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICB2YWx1ZTogYW55LFxuICApOiB0aGlzO1xuICAvLyBIQVZJTkcg6rWs7ZiEXG4gIGhhdmluZyguLi5jb25kaXRpb25zOiBhbnlbXSk6IHRoaXMge1xuICAgIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gaGF2aW5nKFwiQ09VTlQoKikgPiAxMFwiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSkpO1xuICAgIH0gZWxzZSBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIGhhdmluZyhcImNvdW50XCIsIFwiPlwiLCAxMClcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyhcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSxcbiAgICAgICAgY29uZGl0aW9uc1sxXSxcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzJdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGF2aW5nIGFyZ3VtZW50c1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDsi6Ttlokg66mU7ISc65Oc65OkIC0gdGhlbmFibGUg6rWs7ZiEXG4gIHRoZW48VFJlc3VsdDEgPSBFeHBhbmQ8VFJlc3VsdD5bXSwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBFeHBhbmQ8VFJlc3VsdD5bXSkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIOy/vOumrO2VnCDroIjsvZTrk5zsl5DshJwg7Yq57KCVIOy7rOufvOunjCDstpTstpztlZwg67Cw7Je0IOumrO2EtFxuICBwbHVjazxUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdCB8IFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFxuICAgIFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUUmVzdWx0XG4gICAgICA/IFRSZXN1bHRbVENvbHVtbl1bXVxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICAgIG5ldmVyXG4gID4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gSU5TRVJUXG4gIGluc2VydChcbiAgICBkYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+LFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5zZXJ0KGRhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gVVBEQVRFXG4gIHVwZGF0ZShkYXRhOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS51cGRhdGUoZGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBJbmNyZW1lbnRcbiAgaW5jcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBOdW1lcmljQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jcmVtZW50IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmluY3JlbWVudChjb2x1bW4sIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuICAvLyBEZWNyZW1lbnRcbiAgZGVjcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBOdW1lcmljQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVjcmVtZW50IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmRlY3JlbWVudChjb2x1bW4sIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8g7ZmV7J24IOy/vOumrCDrpqzthLRcbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICAvLyDsv7zrpqwg65SU67KE6rmFIOuhnOq3uCDstpzroKVcbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2xvbmUoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgLy8gJ2R1YWwn7J2AIOuNlOuvuCDthYzsnbTruJTsnbTrqbAsIOuwlOuhnCDslYTrnpgg7KSE7JeQ7IScIGtuZXhRdWVyeeqwgCDrja7slrTslIzsm4zsp5Hri4jri6QuXG4gICAgY29uc3QgbmV3UHVyaSA9IG5ldyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+KHRoaXMua25leCwgXCJkdWFsXCIpO1xuICAgIG5ld1B1cmkua25leFF1ZXJ5ID0gdGhpcy5rbmV4UXVlcnkuY2xvbmUoKTtcbiAgICByZXR1cm4gbmV3UHVyaTtcbiAgfVxuXG4gIGZvcm1hdFNRTCh1bmZvcm1hdHRlZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTUUwg7JiI7JW97Ja0IOuqqeuhnVxuICAgIGNvbnN0IGtleXdvcmRzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJJTlNFUlRcIixcbiAgICAgIFwiSU5UT1wiLFxuICAgICAgXCJWQUxVRVNcIixcbiAgICAgIFwiVVBEQVRFXCIsXG4gICAgICBcIkRFTEVURVwiLFxuICAgICAgXCJDUkVBVEVcIixcbiAgICAgIFwiVEFCTEVcIixcbiAgICAgIFwiQUxURVJcIixcbiAgICAgIFwiRFJPUFwiLFxuICAgICAgXCJKT0lOXCIsXG4gICAgICBcIk9OXCIsXG4gICAgICBcIklOTkVSXCIsXG4gICAgICBcIkxFRlRcIixcbiAgICAgIFwiUklHSFRcIixcbiAgICAgIFwiRlVMTFwiLFxuICAgICAgXCJPVVRFUlwiLFxuICAgICAgXCJHUk9VUFwiLFxuICAgICAgXCJCWVwiLFxuICAgICAgXCJPUkRFUlwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiRElTVElOQ1RcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiT0ZGU0VUXCIsXG4gICAgICBcIkFTXCIsXG4gICAgICBcIkFORFwiLFxuICAgICAgXCJPUlwiLFxuICAgICAgXCJOT1RcIixcbiAgICAgIFwiSU5cIixcbiAgICAgIFwiTElLRVwiLFxuICAgICAgXCJJU1wiLFxuICAgICAgXCJOVUxMXCIsXG4gICAgICBcIkNBU0VcIixcbiAgICAgIFwiV0hFTlwiLFxuICAgICAgXCJUSEVOXCIsXG4gICAgICBcIkVMU0VcIixcbiAgICAgIFwiRU5EXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgICBcIkFMTFwiLFxuICAgICAgXCJFWElTVFNcIixcbiAgICAgIFwiQkVUV0VFTlwiLFxuICAgIF07XG5cbiAgICBsZXQgZm9ybWF0dGVkID0gdW5mb3JtYXR0ZWQ7XG5cbiAgICAvLyDsmIjslb3slrTrpbwg64yA66y47J6Q66GcIOuzgO2ZmFxuICAgIGtleXdvcmRzLmZvckVhY2goKGtleXdvcmQpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXGIke2tleXdvcmR9XFxcXGJgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGtleXdvcmQudG9VcHBlckNhc2UoKSk7XG4gICAgfSk7XG5cbiAgICAvLyDso7zsmpQg7KCIIOyVnuyXkCDspITrsJTqv4gg7LaU6rCAXG4gICAgY29uc3QgbWFqb3JDbGF1c2VzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJHUk9VUCBCWVwiLFxuICAgICAgXCJPUkRFUiBCWVwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICBdO1xuICAgIG1ham9yQ2xhdXNlcy5mb3JFYWNoKChjbGF1c2UpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHMrKCR7Y2xhdXNlfSlcXFxccytgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGBcXG4ke2NsYXVzZS50b1VwcGVyQ2FzZSgpfSBgKTtcbiAgICB9KTtcblxuICAgIC8vIEpPSU4g7KCIIOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKCg/OklOTkVSfExFRlR8UklHSFR8RlVMTCBPVVRFUilcXHMrKT9KT0lOXFxzKy9naSwgXCJcXG4kMUpPSU4gXCIpO1xuXG4gICAgLy8gQU5ELCBPUiDsobDqsbQg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoQU5EfE9SKVxccysvZ2ksIFwiXFxuICAkMSBcIik7XG5cbiAgICAvLyDqtITtmLgg7LKY66asIOuwjyDrk6Tsl6zsk7DquLBcbiAgICBjb25zdCBsaW5lcyA9IGZvcm1hdHRlZC5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBpbmRlbnRlZExpbmVzID0gW107XG4gICAgbGV0IGluZGVudExldmVsID0gMDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICghdHJpbW1lZExpbmUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyDri6vripQg6rSE7Zi46rCAIOyeiOycvOuptCDrk6Tsl6zsk7DquLAg66CI67KoIOqwkOyGjFxuICAgICAgY29uc3QgY2xvc2luZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwpL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICBjb25zdCBvcGVuaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCgvZykgfHwgW10pLmxlbmd0aDtcblxuICAgICAgaWYgKGNsb3NpbmdQYXJlbnMgPiAwICYmIG9wZW5pbmdQYXJlbnMgPT09IDApIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgPSBNYXRoLm1heCgwLCBpbmRlbnRMZXZlbCAtIGNsb3NpbmdQYXJlbnMpO1xuICAgICAgfVxuXG4gICAgICAvLyDtmITsnqwg65Ok7Jes7JOw6riwIOyggeyaqVxuICAgICAgY29uc3QgaW5kZW50ID0gXCIgIFwiLnJlcGVhdChpbmRlbnRMZXZlbCk7XG4gICAgICBpbmRlbnRlZExpbmVzLnB1c2goaW5kZW50ICsgdHJpbW1lZExpbmUpO1xuXG4gICAgICAvLyDsl6zripQg6rSE7Zi46rCAIOyeiOycvOuptCDrk6Tsl6zsk7DquLAg66CI67KoIOymneqwgFxuICAgICAgaWYgKG9wZW5pbmdQYXJlbnMgPiBjbG9zaW5nUGFyZW5zKSB7XG4gICAgICAgIGluZGVudExldmVsICs9IG9wZW5pbmdQYXJlbnMgLSBjbG9zaW5nUGFyZW5zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRlbnRlZExpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICB9XG5cbiAgcmF3KHNxbDogc3RyaW5nKTogS25leC5SYXcge1xuICAgIHJldHVybiB0aGlzLmtuZXgucmF3KHNxbCk7XG4gIH1cblxuICAvLyBLbmV4IOy/vOumrCDruYzrjZQg7KeB7KCRIOygkeq3vFxuICByYXdRdWVyeSgpOiBLbmV4LlF1ZXJ5QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXaGVyZUdyb3VwPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmUg66mU7ISc65Oc65OkXG4gIG9yV2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDspJHssqkg6re466O5XG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmUoKHN1YkJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oc3ViQnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vLyBKT0lOIOygiCDqt7jro7nsl5DripQgTGVmdOyZgCBSaWdodOyXkCDrjIDtlZwg7Iic7ISc6rCAIO2VhOyalO2VmOyngCDslYrsnLzrr4DroZwsIOuqqOuToCDqsr3smrDsnZgg7IiY66W8IOqzhOyCsO2VtOyVvO2VqC5cbmV4cG9ydCBjbGFzcyBKb2luQ2xhdXNlR3JvdXA8XG4gIFRMZWZ0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVFJpZ2h0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pixcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGxiYWNrOiBLbmV4LkpvaW5DbGF1c2UpIHt9XG5cbiAgLy8gT04oQU5EKTog7Lus65+8ID0g7Lus65+8XG4gIG9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy9nOuwsVxuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgb24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKEFORCkg6rWs7ZiEXG4gIG9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5jYWxsYmFjay5vbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPTihPUik6IOy7rOufvCA9IOy7rOufvFxuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ID0g6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ICjsl7DsgrDsnpApIOy7rOufvFxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ICjsl7DsgrDsnpApIOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsvZzrsLFcbiAgb3JPbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JPbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oT1IpIOq1rO2YhFxuICBvck9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5jYWxsYmFjay5vck9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKlxuICBUUmVzb2x2ZWQ6IOy/vOumrCDsi6Ttlokg7ZuEIOuwmO2ZmOuQoCDqsrDqs7wg7YOA7J6FXG4gIFRSZXR1cm5pbmc6IFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBUUmV0dXJuaW5nPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIHByaXZhdGUga25leDogS25leCxcbiAgKSB7fVxuXG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFRSZXNvbHZlZCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUUmVzb2x2ZWQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc29sdmVkPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxuXG4gIC8vIE9OIENPTkZMSUNUIC0g7Lus65+8IOq4sOuwmFxuICBvbkNvbmZsaWN0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgYWN0aW9uPzogT25Db25mbGljdEFjdGlvbjxUVGFibGVzPixcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSA/IGNvbHVtbnMgOiBbY29sdW1uc107XG5cbiAgICBpZiAoIWFjdGlvbiB8fCBhY3Rpb24gPT09IFwibm90aGluZ1wiKSB7XG4gICAgICAvLyBETyBOT1RISU5HXG4gICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkuaWdub3JlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERPIFVQREFURVxuICAgICAgY29uc3QgeyB1cGRhdGUgfSA9IGFjdGlvbjtcblxuICAgICAgLy8gYWN0aW9uLnVwZGF0ZSDrsLDsl7Qg7ZiV7YOcIDogW1wibmFtZVwiLCBcImVtYWlsXCJdXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGUpKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZSh1cGRhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWN0aW9uLnVwZGF0ZSDqsJ3ssrQg7ZiV7YOcOiB7IG5hbWU6IFwiSm9oblwiLCBjb3VudDogcmF3KC4uLikgfVxuICAgICAgICBjb25zdCBtZXJnZU9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZSkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcIl90eXBlXCIgaW4gdmFsdWUgJiZcbiAgICAgICAgICAgIHZhbHVlLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFNxbEV4cHJlc3Npb24g4oaSIGtuZXgucmF3KCnroZwg67OA7ZmYXG4gICAgICAgICAgICBtZXJnZU9ialtrZXldID0gdGhpcy5rbmV4LnJhdygodmFsdWUgYXMgU3FsRXhwcmVzc2lvbjxhbnk+KS5fc3FsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g7J2867CYIOqwklxuICAgICAgICAgICAgbWVyZ2VPYmpba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZShtZXJnZU9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBSRVRVUk5JTkc6IFwiKlwiIC0g7KCE7LK0IOy7rOufvFxuICByZXR1cm5pbmcoY29sdW1uOiBcIipcIik6IFJlc29sdmVkUHVyaTxUUmV0dXJuaW5nW10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDri6jsnbwg7Lus65+8XG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog67O17IiYIOy7rOufvCAo67Cw7Je0KVxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IFRDb2x1bW5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkcg6rWs7ZiEXG4gIHJldHVybmluZyhjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVzb2x2ZWRQdXJpPGFueVtdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnJldHVybmluZyhjb2x1bW5PckNvbHVtbnMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJpbmZsZWN0aW9uIiwiTmFpdGUiLCJQdXJpIiwia25leFF1ZXJ5Iiwia25leCIsInRhYmxlTmFtZU9yU3BlYyIsImZyb20iLCJlbnRyaWVzIiwiT2JqZWN0IiwibGVuZ3RoIiwiRXJyb3IiLCJhbGlhcyIsInNwZWMiLCJzdWJxdWVyeUJ1aWxkZXIiLCJyYXdRdWVyeSIsImFzIiwiY291bnQiLCJjb2x1bW4iLCJfdHlwZSIsIl9yZXR1cm4iLCJfc3FsIiwic3VtIiwiYXZnIiwibWF4IiwibWluIiwiY29uY2F0IiwiYXJncyIsImpvaW4iLCJ1cHBlciIsImxvd2VyIiwicmF3U3RyaW5nIiwic3FsIiwicmF3U3RyaW5nQXJyYXkiLCJyYXdOdW1iZXIiLCJyYXdCb29sZWFuIiwicmF3RGF0ZSIsInRzSGlnaGxpZ2h0IiwicXVlcnkiLCJfb3B0aW9ucyIsInBhcnNlciIsImNvbmZpZyIsIm9wdGlvbnMiLCJobE9wdGlvblBhcnRzIiwibWFwIiwia2V5IiwidmFsdWUiLCJjYW1lbGl6ZSIsImhsT3B0aW9ucyIsInRzUmFuayIsIl90c1JhbmsiLCJ0c1JhbmtDZCIsInR5cGUiLCJub3JtYWxpemF0aW9uIiwid2VpZ2h0cyIsIndlaWdodENsYXVzZSIsIm5vcm1hbGl6YXRpb25DbGF1c2UiLCJzY29yZSIsImhpZ2hsaWdodCIsImNvbHVtbk9yQ29sdW1ucyIsInF1ZXJ5Q2xhdXNlIiwiQXJyYXkiLCJpc0FycmF5IiwicSIsInNlbGVjdCIsInNlbGVjdE9iaiIsImZsYXRTZWxlY3QiLCJmbGF0dGVuU2VsZWN0Iiwic2VsZWN0Q2xhdXNlcyIsImNvbHVtbk9yRnVuY3Rpb24iLCJwdXNoIiwicmF3IiwiY29sdW1uUGF0aCIsInByZWZpeCIsImZ1bGxLZXkiLCJuZXN0ZWQiLCJhc3NpZ24iLCJhcHBlbmRTZWxlY3QiLCJzZWxlY3RBbGwiLCJjbGVhciIsInN0YXRlbWVudCIsImNsZWFySm9pbiIsIl9zdGF0ZW1lbnRzIiwiZmlsdGVyIiwicyIsIl9hbGlhcyIsIl90YWJsZSIsInRhYmxlIiwiX19jb21tb25Kb2luIiwibGVmdEpvaW4iLCJqb2luVHlwZSIsInRhYmxlTmFtZSIsImNhbGxiYWNrIiwiam9pbkNsYXVzZSIsIkpvaW5DbGF1c2VHcm91cCIsImxlZnQiLCJyaWdodCIsIndoZXJlIiwiY29sdW1uT3JDb25kaXRpb25zIiwib3BlcmF0b3JPclZhbHVlIiwid2hlcmVOdWxsIiwid2hlcmVOb3ROdWxsIiwid2hlcmVJbiIsInZhbHVlcyIsIndoZXJlTm90SW4iLCJ3aGVyZU1hdGNoIiwid2hlcmVSYXciLCJTdHJpbmciLCJ3aGVyZVNlYXJjaCIsImNvbHVtbkV4cHIiLCJjIiwicGdyb29uZ2FDb25kaXRpb24iLCJ3aGVyZVRzU2VhcmNoIiwib3B0cyIsImJpbmRpbmdzIiwid2hlcmVHcm91cCIsImJ1aWxkZXIiLCJncm91cCIsIldoZXJlR3JvdXAiLCJvcldoZXJlR3JvdXAiLCJvcldoZXJlIiwib3JkZXJCeSIsImRpcmVjdGlvbiIsInZlY3RvclNpbWlsYXJpdHkiLCJlbWJlZGRpbmciLCJtZXRob2QiLCJ0aHJlc2hvbGQiLCJzb21lIiwidiIsIk51bWJlciIsImlzRmluaXRlIiwidmVjdG9yTGl0ZXJhbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJvcGVyYXRvck1hcCIsImNvc2luZSIsImwyIiwiaW5uZXJfcHJvZHVjdCIsIm9wZXJhdG9yIiwib3JkZXJCeVJhdyIsImxpbWl0Iiwib2Zmc2V0IiwiZ3JvdXBCeSIsImNvbHVtbnMiLCJoYXZpbmciLCJjb25kaXRpb25zIiwidGhlbiIsIm9uZnVsZmlsbGVkIiwib25yZWplY3RlZCIsInQiLCJ0b1F1ZXJ5IiwiY2F0Y2giLCJmaW5hbGx5Iiwib25maW5hbGx5IiwiZmlyc3QiLCJSZXNvbHZlZFB1cmkiLCJwbHVjayIsImluc2VydCIsImRhdGEiLCJ1cGRhdGUiLCJpbmNyZW1lbnQiLCJkZWNyZW1lbnQiLCJkZWxldGUiLCJkZWJ1ZyIsImNvbnNvbGUiLCJsb2ciLCJjeWFuIiwieWVsbG93IiwiY2xvbmUiLCJuZXdQdXJpIiwiZm9ybWF0U1FMIiwidW5mb3JtYXR0ZWQiLCJrZXl3b3JkcyIsImZvcm1hdHRlZCIsImZvckVhY2giLCJrZXl3b3JkIiwicmVnZXgiLCJSZWdFeHAiLCJyZXBsYWNlIiwidG9VcHBlckNhc2UiLCJtYWpvckNsYXVzZXMiLCJjbGF1c2UiLCJsaW5lcyIsInNwbGl0IiwiaW5kZW50ZWRMaW5lcyIsImluZGVudExldmVsIiwibGluZSIsInRyaW1tZWRMaW5lIiwidHJpbSIsImNsb3NpbmdQYXJlbnMiLCJtYXRjaCIsIm9wZW5pbmdQYXJlbnMiLCJNYXRoIiwiaW5kZW50IiwicmVwZWF0Iiwic2xpY2UiLCJzdWJCdWlsZGVyIiwic3ViR3JvdXAiLCJvbiIsIm9yT24iLCJvbkNvbmZsaWN0IiwiYWN0aW9uIiwidGFyZ2V0IiwiaWdub3JlIiwibWVyZ2UiLCJtZXJnZU9iaiIsInJldHVybmluZyJdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGLEdBQ3RGLDZFQUE2RSxHQUU3RSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLGdCQUFnQixhQUFhO0FBRXBDLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUE4QnZDLE9B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
|