experimental-agent 0.1.2 → 0.1.4
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/README.md +9 -0
- package/dist/agent-workflow.d.mts +1 -1
- package/dist/agent-workflow.d.ts +1 -1
- package/dist/agent-workflow.js +352 -104
- package/dist/agent-workflow.mjs +1 -1
- package/dist/{chunk-W4SSZPDX.mjs → chunk-24UDM5XV.mjs} +4 -4
- package/dist/chunk-2ZXHR6T6.mjs +401 -0
- package/dist/chunk-4WDKWMVB.mjs +389 -0
- package/dist/{chunk-E7TOPGHY.mjs → chunk-GYOBANFH.mjs} +3 -3
- package/dist/chunk-IACG26TC.mjs +2212 -0
- package/dist/chunk-NGLND33F.mjs +1247 -0
- package/dist/{chunk-HJGPUEFC.mjs → chunk-YRYXN7W4.mjs} +7 -1
- package/dist/client-Bkuq-Dfa.d.mts +2340 -0
- package/dist/client-Bkuq-Dfa.d.ts +2340 -0
- package/dist/{client-YUU54ZZH.mjs → client-SNN3XDKO.mjs} +2 -2
- package/dist/client.d.mts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/client.mjs +1 -1
- package/dist/{handler-LDFBSCRA.mjs → handler-WFNQWR6V.mjs} +2 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +624 -223
- package/dist/index.mjs +79 -43
- package/dist/lifecycle-workflow.d.mts +1 -1
- package/dist/lifecycle-workflow.d.ts +1 -1
- package/dist/lifecycle-workflow.js +88 -6
- package/dist/lifecycle-workflow.mjs +1 -1
- package/dist/local-fs-handlers-ESZBRAWK.mjs +439 -0
- package/dist/next/loader.js +3 -3
- package/dist/next/loader.mjs +1 -1
- package/dist/next.js +10 -4
- package/dist/next.mjs +9 -3
- package/dist/{sandbox-GPCA35PJ.mjs → sandbox-IFK5MVRM.mjs} +3 -3
- package/dist/{storage-LL6IA24R.mjs → storage-FCSHTDLC.mjs} +3 -3
- package/package.json +2 -2
- package/dist/chunk-2SPAJ777.mjs +0 -365
- package/dist/chunk-6J462JGP.mjs +0 -1267
- package/dist/chunk-ILPVXRI5.mjs +0 -2026
- package/dist/chunk-ORE6LK2L.mjs +0 -344
- package/dist/client-CKLwB-ES.d.mts +0 -2115
- package/dist/client-CKLwB-ES.d.ts +0 -2115
- package/dist/local-fs-handlers-SY2RDXZE.mjs +0 -314
package/dist/agent-workflow.js
CHANGED
|
@@ -192,7 +192,7 @@ chmod +x $HOME/.agent/bin/run.sh`
|
|
|
192
192
|
});
|
|
193
193
|
|
|
194
194
|
// src/errors.ts
|
|
195
|
-
var errore, SessionNotFoundError, SessionError, SandboxNotFoundError, StorageError, SandboxError, MessageNotFoundError;
|
|
195
|
+
var errore, SessionNotFoundError, SessionError, SandboxNotFoundError, StorageError, StorageConflictError, SandboxError, MessageNotFoundError;
|
|
196
196
|
var init_errors = __esm({
|
|
197
197
|
"src/errors.ts"() {
|
|
198
198
|
"use strict";
|
|
@@ -217,6 +217,11 @@ var init_errors = __esm({
|
|
|
217
217
|
message: "$reason"
|
|
218
218
|
}) {
|
|
219
219
|
};
|
|
220
|
+
StorageConflictError = class extends errore.createTaggedError({
|
|
221
|
+
name: "StorageConflictError",
|
|
222
|
+
message: "$reason"
|
|
223
|
+
}) {
|
|
224
|
+
};
|
|
220
225
|
SandboxError = class extends errore.createTaggedError({
|
|
221
226
|
name: "SandboxError",
|
|
222
227
|
message: "$reason"
|
|
@@ -242,7 +247,12 @@ function getStorageClient(rpcFn, name) {
|
|
|
242
247
|
async function rpc(method, params) {
|
|
243
248
|
const result = await rpcFn({ name, method, params });
|
|
244
249
|
if ("error" in result) {
|
|
245
|
-
|
|
250
|
+
if (result.error.code === "CONFLICT") {
|
|
251
|
+
throw new StorageConflictError({ reason: result.error.message });
|
|
252
|
+
}
|
|
253
|
+
throw new StorageError({
|
|
254
|
+
reason: `[${result.error.code}] ${result.error.message}`
|
|
255
|
+
});
|
|
246
256
|
}
|
|
247
257
|
return result.result;
|
|
248
258
|
}
|
|
@@ -272,6 +282,19 @@ function getStorageClient(rpcFn, name) {
|
|
|
272
282
|
return new StorageError({ reason: String(e), cause: e });
|
|
273
283
|
}
|
|
274
284
|
},
|
|
285
|
+
update: async (opts) => {
|
|
286
|
+
try {
|
|
287
|
+
return await rpc("session.update", opts);
|
|
288
|
+
} catch (e) {
|
|
289
|
+
if (e instanceof StorageConflictError) {
|
|
290
|
+
return e;
|
|
291
|
+
}
|
|
292
|
+
if (e instanceof StorageError) {
|
|
293
|
+
return e;
|
|
294
|
+
}
|
|
295
|
+
return new StorageError({ reason: String(e), cause: e });
|
|
296
|
+
}
|
|
297
|
+
},
|
|
275
298
|
delete: async (id) => {
|
|
276
299
|
try {
|
|
277
300
|
await rpc("session.delete", { id });
|
|
@@ -297,6 +320,22 @@ function getStorageClient(rpcFn, name) {
|
|
|
297
320
|
return new StorageError({ reason: String(e), cause: e });
|
|
298
321
|
}
|
|
299
322
|
},
|
|
323
|
+
listBySandbox: async (opts) => {
|
|
324
|
+
try {
|
|
325
|
+
return await rpc("session.listBySandbox", {
|
|
326
|
+
sandboxId: opts.sandboxId,
|
|
327
|
+
tags: opts.tags,
|
|
328
|
+
order: opts.order,
|
|
329
|
+
cursor: opts.cursor,
|
|
330
|
+
limit: opts.limit
|
|
331
|
+
});
|
|
332
|
+
} catch (e) {
|
|
333
|
+
if (e instanceof StorageError) {
|
|
334
|
+
return e;
|
|
335
|
+
}
|
|
336
|
+
return new StorageError({ reason: String(e), cause: e });
|
|
337
|
+
}
|
|
338
|
+
},
|
|
300
339
|
tag: {
|
|
301
340
|
set: async ({ sessionId, tags }) => {
|
|
302
341
|
try {
|
|
@@ -442,6 +481,16 @@ function getStorageClient(rpcFn, name) {
|
|
|
442
481
|
return new StorageError({ reason: String(e), cause: e });
|
|
443
482
|
}
|
|
444
483
|
},
|
|
484
|
+
update: async (opts) => {
|
|
485
|
+
try {
|
|
486
|
+
return await rpc("sandbox.update", opts);
|
|
487
|
+
} catch (e) {
|
|
488
|
+
if (e instanceof StorageError) {
|
|
489
|
+
return e;
|
|
490
|
+
}
|
|
491
|
+
return new StorageError({ reason: String(e), cause: e });
|
|
492
|
+
}
|
|
493
|
+
},
|
|
445
494
|
list: async (opts) => {
|
|
446
495
|
try {
|
|
447
496
|
return await rpc("sandbox.list", {
|
|
@@ -946,7 +995,7 @@ function ListResultSchema(itemSchema) {
|
|
|
946
995
|
nextCursor: import_zod3.z.string().nullable()
|
|
947
996
|
});
|
|
948
997
|
}
|
|
949
|
-
var import_zod3, VercelLifecycleConfigSchema, NetworkPolicySchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, CommandBaseSchema, CommandSchema, SetupSnapshotSchema, methods, STORAGE_RPC_METHODS;
|
|
998
|
+
var import_zod3, VercelLifecycleConfigSchema, NetworkPolicySchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, InterruptedLastPartSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, SessionUpdateSchema, SandboxUpdateSchema, CommandBaseSchema, CommandSchema, SetupSnapshotSchema, methods, STORAGE_RPC_METHODS;
|
|
950
999
|
var init_rpc = __esm({
|
|
951
1000
|
"src/storage/rpc.ts"() {
|
|
952
1001
|
"use strict";
|
|
@@ -1036,6 +1085,10 @@ var init_rpc = __esm({
|
|
|
1036
1085
|
steps: import_zod3.z.array(StepUsageSchema),
|
|
1037
1086
|
summary: UsageSummarySchema
|
|
1038
1087
|
});
|
|
1088
|
+
InterruptedLastPartSchema = import_zod3.z.object({
|
|
1089
|
+
index: import_zod3.z.number(),
|
|
1090
|
+
part: import_zod3.z.unknown()
|
|
1091
|
+
});
|
|
1039
1092
|
MessageSchema = import_zod3.z.object({
|
|
1040
1093
|
id: import_zod3.z.string(),
|
|
1041
1094
|
sessionId: import_zod3.z.string(),
|
|
@@ -1044,6 +1097,7 @@ var init_rpc = __esm({
|
|
|
1044
1097
|
startedAt: import_zod3.z.number().nullable(),
|
|
1045
1098
|
completedAt: import_zod3.z.number().nullable(),
|
|
1046
1099
|
interruptedAt: import_zod3.z.number().nullable(),
|
|
1100
|
+
interruptedLastPart: InterruptedLastPartSchema.nullable().default(null),
|
|
1047
1101
|
usage: MessageUsageSchema.nullable()
|
|
1048
1102
|
});
|
|
1049
1103
|
PartSchema = import_zod3.z.object({
|
|
@@ -1075,6 +1129,16 @@ var init_rpc = __esm({
|
|
|
1075
1129
|
})
|
|
1076
1130
|
]).optional()
|
|
1077
1131
|
});
|
|
1132
|
+
SessionUpdateSchema = SessionSchema.omit({
|
|
1133
|
+
id: true,
|
|
1134
|
+
generation: true
|
|
1135
|
+
}).partial().extend({
|
|
1136
|
+
id: SessionSchema.shape.id,
|
|
1137
|
+
generation: GenerationSchema.nullable().optional()
|
|
1138
|
+
}).strict();
|
|
1139
|
+
SandboxUpdateSchema = SandboxRecordSchema.omit({ id: true }).partial().extend({
|
|
1140
|
+
id: SandboxRecordSchema.shape.id
|
|
1141
|
+
}).strict();
|
|
1078
1142
|
CommandBaseSchema = import_zod3.z.object({
|
|
1079
1143
|
id: import_zod3.z.string(),
|
|
1080
1144
|
sessionId: import_zod3.z.string(),
|
|
@@ -1114,6 +1178,10 @@ var init_rpc = __esm({
|
|
|
1114
1178
|
params: SessionSchema,
|
|
1115
1179
|
result: SessionSchema
|
|
1116
1180
|
},
|
|
1181
|
+
"session.update": {
|
|
1182
|
+
params: SessionUpdateSchema,
|
|
1183
|
+
result: SessionSchema
|
|
1184
|
+
},
|
|
1117
1185
|
"session.list": {
|
|
1118
1186
|
params: import_zod3.z.object({
|
|
1119
1187
|
tags: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional(),
|
|
@@ -1206,6 +1274,10 @@ var init_rpc = __esm({
|
|
|
1206
1274
|
params: SandboxRecordSchema,
|
|
1207
1275
|
result: import_zod3.z.void()
|
|
1208
1276
|
},
|
|
1277
|
+
"sandbox.update": {
|
|
1278
|
+
params: SandboxUpdateSchema,
|
|
1279
|
+
result: SandboxRecordSchema
|
|
1280
|
+
},
|
|
1209
1281
|
"sandbox.list": {
|
|
1210
1282
|
params: import_zod3.z.object({
|
|
1211
1283
|
tags: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional(),
|
|
@@ -1296,6 +1368,15 @@ async function handleStorageRpc(body, handlers) {
|
|
|
1296
1368
|
const result = await handler(parsed.data);
|
|
1297
1369
|
return { result };
|
|
1298
1370
|
} catch (e) {
|
|
1371
|
+
const isConflict = e instanceof StorageConflictError || e instanceof Error && e.name === "StorageConflictError";
|
|
1372
|
+
if (isConflict) {
|
|
1373
|
+
return {
|
|
1374
|
+
error: {
|
|
1375
|
+
code: "CONFLICT",
|
|
1376
|
+
message: e instanceof Error ? e.message : String(e)
|
|
1377
|
+
}
|
|
1378
|
+
};
|
|
1379
|
+
}
|
|
1299
1380
|
return {
|
|
1300
1381
|
error: {
|
|
1301
1382
|
code: "INTERNAL_ERROR",
|
|
@@ -1307,6 +1388,7 @@ async function handleStorageRpc(body, handlers) {
|
|
|
1307
1388
|
var init_handler = __esm({
|
|
1308
1389
|
"src/storage/handler.ts"() {
|
|
1309
1390
|
"use strict";
|
|
1391
|
+
init_errors();
|
|
1310
1392
|
init_rpc();
|
|
1311
1393
|
}
|
|
1312
1394
|
});
|
|
@@ -1382,8 +1464,8 @@ async function checkAndSnapshotStep(input) {
|
|
|
1382
1464
|
...getTestCredentials()
|
|
1383
1465
|
});
|
|
1384
1466
|
const snapshot = await sandbox.snapshot();
|
|
1385
|
-
await storage.sandbox.
|
|
1386
|
-
|
|
1467
|
+
await storage.sandbox.update({
|
|
1468
|
+
id: record.id,
|
|
1387
1469
|
acquiringLockId: null,
|
|
1388
1470
|
acquiringLockAt: null,
|
|
1389
1471
|
providerMetadata: {
|
|
@@ -1884,8 +1966,8 @@ var init_vercel = __esm({
|
|
|
1884
1966
|
}
|
|
1885
1967
|
const lockedRecord = locked;
|
|
1886
1968
|
async function releaseSandboxLock() {
|
|
1887
|
-
await storage.sandbox.
|
|
1888
|
-
|
|
1969
|
+
await storage.sandbox.update({
|
|
1970
|
+
id: lockedRecord.id,
|
|
1889
1971
|
acquiringLockId: null,
|
|
1890
1972
|
acquiringLockAt: null
|
|
1891
1973
|
}).catch(() => void 0);
|
|
@@ -1999,12 +2081,8 @@ var init_vercel = __esm({
|
|
|
1999
2081
|
}
|
|
2000
2082
|
const existingVercel = existing.providerMetadata?.provider === "vercel" ? existing.providerMetadata : null;
|
|
2001
2083
|
if (existingVercel?.sandboxId) {
|
|
2002
|
-
await storage.sandbox.
|
|
2084
|
+
await storage.sandbox.update({
|
|
2003
2085
|
id: existing.id,
|
|
2004
|
-
config: existing.config,
|
|
2005
|
-
tags: existing.tags,
|
|
2006
|
-
createdAt: existing.createdAt,
|
|
2007
|
-
lastActivityAt: existing.lastActivityAt,
|
|
2008
2086
|
acquiringLockId: null,
|
|
2009
2087
|
acquiringLockAt: null,
|
|
2010
2088
|
providerMetadata: {
|
|
@@ -2027,11 +2105,8 @@ var init_vercel = __esm({
|
|
|
2027
2105
|
return;
|
|
2028
2106
|
}
|
|
2029
2107
|
const existingVercel = existing.providerMetadata?.provider === "vercel" ? existing.providerMetadata : null;
|
|
2030
|
-
await storage.sandbox.
|
|
2108
|
+
await storage.sandbox.update({
|
|
2031
2109
|
id: existing.id,
|
|
2032
|
-
config: existing.config,
|
|
2033
|
-
tags: existing.tags,
|
|
2034
|
-
createdAt: existing.createdAt,
|
|
2035
2110
|
lastActivityAt: now,
|
|
2036
2111
|
acquiringLockId: null,
|
|
2037
2112
|
acquiringLockAt: null,
|
|
@@ -2058,14 +2133,9 @@ var init_vercel = __esm({
|
|
|
2058
2133
|
}
|
|
2059
2134
|
return errore3.tryAsync({
|
|
2060
2135
|
try: async () => {
|
|
2061
|
-
const existing = await storage.sandbox.get(id);
|
|
2062
2136
|
const snapshot = await sandbox2.snapshot();
|
|
2063
|
-
await storage.sandbox.
|
|
2137
|
+
await storage.sandbox.update({
|
|
2064
2138
|
id,
|
|
2065
|
-
config,
|
|
2066
|
-
tags: existing instanceof Error ? null : existing?.tags ?? null,
|
|
2067
|
-
createdAt: existing instanceof Error ? null : existing?.createdAt ?? null,
|
|
2068
|
-
lastActivityAt: existing instanceof Error ? null : existing?.lastActivityAt ?? null,
|
|
2069
2139
|
acquiringLockId: null,
|
|
2070
2140
|
acquiringLockAt: null,
|
|
2071
2141
|
providerMetadata: {
|
|
@@ -2087,16 +2157,8 @@ var init_vercel = __esm({
|
|
|
2087
2157
|
return errore3.tryAsync({
|
|
2088
2158
|
try: async () => {
|
|
2089
2159
|
await sandbox2.stop();
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
return void 0;
|
|
2093
|
-
}
|
|
2094
|
-
await storage.sandbox.set({
|
|
2095
|
-
id: existing.id,
|
|
2096
|
-
config: existing.config,
|
|
2097
|
-
tags: existing.tags,
|
|
2098
|
-
createdAt: existing.createdAt,
|
|
2099
|
-
lastActivityAt: existing.lastActivityAt,
|
|
2160
|
+
await storage.sandbox.update({
|
|
2161
|
+
id,
|
|
2100
2162
|
acquiringLockId: null,
|
|
2101
2163
|
acquiringLockAt: null,
|
|
2102
2164
|
providerMetadata: {
|
|
@@ -2637,7 +2699,7 @@ try {
|
|
|
2637
2699
|
} catch (err) {
|
|
2638
2700
|
const output = {
|
|
2639
2701
|
success: false,
|
|
2640
|
-
error: err instanceof Error ? err.message
|
|
2702
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2641
2703
|
};
|
|
2642
2704
|
if (logs.length > 0) output.logs = logs;
|
|
2643
2705
|
process.stdout.write(JSON.stringify(output));
|
|
@@ -2951,6 +3013,7 @@ var builtInTools = {
|
|
|
2951
3013
|
Read: (0, import_ai2.tool)({
|
|
2952
3014
|
description: "Reads a file and returns its contents with metadata. For files over 200 lines, automatically shows first 100 lines unless a specific line range is provided. Use startLine and endLine parameters to read specific portions of large files.",
|
|
2953
3015
|
inputSchema: import_zod2.z.object({
|
|
3016
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
2954
3017
|
path: import_zod2.z.string().describe("Path to the file relative to workspace root"),
|
|
2955
3018
|
startLine: import_zod2.z.number().optional().describe(
|
|
2956
3019
|
"Starting line number (1-indexed). If provided with endLine, reads exact range regardless of file size."
|
|
@@ -2975,6 +3038,7 @@ var builtInTools = {
|
|
|
2975
3038
|
Grep: (0, import_ai2.tool)({
|
|
2976
3039
|
description: "Search for patterns in files using ripgrep. Use this to find code patterns, function definitions, imports, etc.",
|
|
2977
3040
|
inputSchema: import_zod2.z.object({
|
|
3041
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
2978
3042
|
pattern: import_zod2.z.string().describe("Regex pattern to search for (ripgrep syntax)"),
|
|
2979
3043
|
path: import_zod2.z.string().optional().describe(
|
|
2980
3044
|
"Path to search in (defaults to workspace root). Can be a file or directory."
|
|
@@ -3011,6 +3075,7 @@ var builtInTools = {
|
|
|
3011
3075
|
List: (0, import_ai2.tool)({
|
|
3012
3076
|
description: "Recursively list directory contents. Use this to understand the codebase structure, find files, or explore directories. Control depth to balance detail vs. overview. Depth 1 shows immediate children, depth 2 includes subdirectories, etc.",
|
|
3013
3077
|
inputSchema: import_zod2.z.object({
|
|
3078
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
3014
3079
|
path: import_zod2.z.string().optional().describe("Path to list (defaults to workspace root)"),
|
|
3015
3080
|
depth: import_zod2.z.number().optional().describe(
|
|
3016
3081
|
"Maximum depth to traverse. Choose based on context: 1-2 for quick overview, 3-4 for detailed exploration, 5+ for comprehensive mapping"
|
|
@@ -3037,6 +3102,7 @@ var builtInTools = {
|
|
|
3037
3102
|
Write: (0, import_ai2.tool)({
|
|
3038
3103
|
description: "Write content to a file. Creates parent directories automatically. Overwrites existing files.",
|
|
3039
3104
|
inputSchema: import_zod2.z.object({
|
|
3105
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
3040
3106
|
path: import_zod2.z.string().describe("Path to the file relative to workspace root"),
|
|
3041
3107
|
content: import_zod2.z.string().describe("Content to write to the file")
|
|
3042
3108
|
}),
|
|
@@ -3050,6 +3116,7 @@ var builtInTools = {
|
|
|
3050
3116
|
Edit: (0, import_ai2.tool)({
|
|
3051
3117
|
description: "Edit a file by replacing an exact string. Fails if old_string is not found or appears multiple times (not unique). For multiple replacements, call this tool multiple times with unique context.",
|
|
3052
3118
|
inputSchema: import_zod2.z.object({
|
|
3119
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
3053
3120
|
path: import_zod2.z.string().describe("Path to the file relative to workspace root"),
|
|
3054
3121
|
old_string: import_zod2.z.string().describe("Exact string to find and replace (must be unique in file)"),
|
|
3055
3122
|
new_string: import_zod2.z.string().describe("String to replace old_string with")
|
|
@@ -3063,6 +3130,7 @@ var builtInTools = {
|
|
|
3063
3130
|
Bash: (0, import_ai2.tool)({
|
|
3064
3131
|
description: "Executes a bash command inside the workspace. CWD persists between commands within a session. Use waitUntil:0 for background processes (dev servers).",
|
|
3065
3132
|
inputSchema: import_zod2.z.object({
|
|
3133
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
3066
3134
|
command: import_zod2.z.string().describe("The shell command to execute"),
|
|
3067
3135
|
waitUntil: import_zod2.z.number().optional().describe(
|
|
3068
3136
|
`Max ms to wait for completion (default: ${DEFAULT_WAIT_UNTIL}). Use 0 to run in background and return immediately.`
|
|
@@ -3079,8 +3147,22 @@ var builtInTools = {
|
|
|
3079
3147
|
outputFile: import_zod2.z.string().describe("Path to output log (for background processes)")
|
|
3080
3148
|
})
|
|
3081
3149
|
}),
|
|
3150
|
+
Skill: (0, import_ai2.tool)({
|
|
3151
|
+
description: "Load a skill's full instructions by name. Call this before following a skill.",
|
|
3152
|
+
inputSchema: import_zod2.z.object({
|
|
3153
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
3154
|
+
name: import_zod2.z.string().describe("Skill name from the Available Skills list")
|
|
3155
|
+
}),
|
|
3156
|
+
outputSchema: import_zod2.z.object({
|
|
3157
|
+
name: import_zod2.z.string(),
|
|
3158
|
+
description: import_zod2.z.string(),
|
|
3159
|
+
content: import_zod2.z.string().describe("Full SKILL.md content"),
|
|
3160
|
+
path: import_zod2.z.string().describe("Path to the skill directory in the sandbox")
|
|
3161
|
+
})
|
|
3162
|
+
}),
|
|
3082
3163
|
JavaScript: (0, import_ai2.tool)({
|
|
3083
3164
|
inputSchema: import_zod2.z.object({
|
|
3165
|
+
label: import_zod2.z.string().describe("A label that describes the action being performed"),
|
|
3084
3166
|
code: import_zod2.z.string().describe(
|
|
3085
3167
|
"JavaScript async function body. `ctx` is in scope. Must use `return` to produce output."
|
|
3086
3168
|
)
|
|
@@ -3090,6 +3172,7 @@ var builtInTools = {
|
|
|
3090
3172
|
var builtinToolNames = Object.fromEntries(
|
|
3091
3173
|
Object.entries(builtInTools).map(([name]) => [name, name])
|
|
3092
3174
|
);
|
|
3175
|
+
var SKILL_MD_SUFFIX = /\/?SKILL\.md$/;
|
|
3093
3176
|
function getTools(context) {
|
|
3094
3177
|
const tools = {
|
|
3095
3178
|
[builtinToolNames.Read]: (0, import_ai2.tool)({
|
|
@@ -3389,6 +3472,41 @@ function getTools(context) {
|
|
|
3389
3472
|
}
|
|
3390
3473
|
})
|
|
3391
3474
|
};
|
|
3475
|
+
if (context.session.skillsDir?.length) {
|
|
3476
|
+
tools[builtinToolNames.Skill] = (0, import_ai2.tool)({
|
|
3477
|
+
...builtInTools.Skill,
|
|
3478
|
+
execute: async ({ name }) => {
|
|
3479
|
+
const skills = context.skillsRef.current;
|
|
3480
|
+
const skill = skills.find(
|
|
3481
|
+
(s) => s.name.toLowerCase() === name.toLowerCase()
|
|
3482
|
+
);
|
|
3483
|
+
if (!skill) {
|
|
3484
|
+
throw new Error(
|
|
3485
|
+
`Skill not found: "${name}". Available: ${skills.map((s) => s.name).join(", ")}`
|
|
3486
|
+
);
|
|
3487
|
+
}
|
|
3488
|
+
const result = await context.sandbox.readFile({
|
|
3489
|
+
path: skill.skillMdPath
|
|
3490
|
+
});
|
|
3491
|
+
if (result instanceof Error) {
|
|
3492
|
+
throw result;
|
|
3493
|
+
}
|
|
3494
|
+
if (result === null) {
|
|
3495
|
+
throw new Error(`Skill file not found: ${skill.skillMdPath}`);
|
|
3496
|
+
}
|
|
3497
|
+
const raw = typeof result === "string" ? result : result.toString("utf-8");
|
|
3498
|
+
const endMarker = raw.indexOf("---", 3);
|
|
3499
|
+
const content = endMarker === -1 ? raw : raw.slice(endMarker + 3).trim();
|
|
3500
|
+
const skillDir = skill.skillMdPath.replace(SKILL_MD_SUFFIX, "");
|
|
3501
|
+
return {
|
|
3502
|
+
name: skill.name,
|
|
3503
|
+
description: skill.description,
|
|
3504
|
+
content,
|
|
3505
|
+
path: skillDir
|
|
3506
|
+
};
|
|
3507
|
+
}
|
|
3508
|
+
});
|
|
3509
|
+
}
|
|
3392
3510
|
if (context.apiToolsMetadata.length > 0) {
|
|
3393
3511
|
const apiTools = buildApiTools({
|
|
3394
3512
|
rpc: context.input.rpc,
|
|
@@ -3630,6 +3748,23 @@ function isSubToolPart(part) {
|
|
|
3630
3748
|
const p = part.part;
|
|
3631
3749
|
return typeof p?.toolCallId === "string" && p.toolCallId.startsWith("js_tc_");
|
|
3632
3750
|
}
|
|
3751
|
+
function isStreamingContent(part) {
|
|
3752
|
+
return typeof part === "object" && part !== null && "type" in part && (part.type === "text" || part.type === "reasoning");
|
|
3753
|
+
}
|
|
3754
|
+
function applyInterruptCutoff({
|
|
3755
|
+
parts,
|
|
3756
|
+
lastPart
|
|
3757
|
+
}) {
|
|
3758
|
+
return parts.filter((p) => p.index <= lastPart.index).map((p) => {
|
|
3759
|
+
if (p.index !== lastPart.index) {
|
|
3760
|
+
return p;
|
|
3761
|
+
}
|
|
3762
|
+
if (isStreamingContent(lastPart.part)) {
|
|
3763
|
+
return { ...p, part: lastPart.part };
|
|
3764
|
+
}
|
|
3765
|
+
return p;
|
|
3766
|
+
});
|
|
3767
|
+
}
|
|
3633
3768
|
function assembleUIMessages(opts) {
|
|
3634
3769
|
let filtered = opts.messages;
|
|
3635
3770
|
if (opts.until !== void 0) {
|
|
@@ -3647,8 +3782,14 @@ function assembleUIMessages(opts) {
|
|
|
3647
3782
|
partsByMessage.set(part.messageId, existing);
|
|
3648
3783
|
}
|
|
3649
3784
|
return filtered.map((m) => {
|
|
3650
|
-
|
|
3785
|
+
let messageParts = partsByMessage.get(m.id) ?? [];
|
|
3651
3786
|
messageParts.sort((a, b) => a.index - b.index);
|
|
3787
|
+
if (m.interruptedLastPart != null) {
|
|
3788
|
+
messageParts = applyInterruptCutoff({
|
|
3789
|
+
parts: messageParts,
|
|
3790
|
+
lastPart: m.interruptedLastPart
|
|
3791
|
+
});
|
|
3792
|
+
}
|
|
3652
3793
|
return {
|
|
3653
3794
|
id: m.id,
|
|
3654
3795
|
role: m.role,
|
|
@@ -3687,6 +3828,43 @@ function emitStatus({
|
|
|
3687
3828
|
rpc({ method: "hook.status", params: { status } }).catch(() => {
|
|
3688
3829
|
});
|
|
3689
3830
|
}
|
|
3831
|
+
var STATUS_THROTTLE_MS = 500;
|
|
3832
|
+
function createThrottledEmitStatus(rpc) {
|
|
3833
|
+
let timer = null;
|
|
3834
|
+
let pending = null;
|
|
3835
|
+
function throttled({
|
|
3836
|
+
writer,
|
|
3837
|
+
status
|
|
3838
|
+
}) {
|
|
3839
|
+
pending = { writer, status };
|
|
3840
|
+
if (timer !== null) {
|
|
3841
|
+
return;
|
|
3842
|
+
}
|
|
3843
|
+
flush();
|
|
3844
|
+
timer = setTimeout(() => {
|
|
3845
|
+
timer = null;
|
|
3846
|
+
if (pending) {
|
|
3847
|
+
flush();
|
|
3848
|
+
}
|
|
3849
|
+
}, STATUS_THROTTLE_MS);
|
|
3850
|
+
}
|
|
3851
|
+
function flush() {
|
|
3852
|
+
if (!pending) {
|
|
3853
|
+
return;
|
|
3854
|
+
}
|
|
3855
|
+
const { writer, status } = pending;
|
|
3856
|
+
pending = null;
|
|
3857
|
+
emitStatus({ writer, status, rpc });
|
|
3858
|
+
}
|
|
3859
|
+
throttled.dispose = () => {
|
|
3860
|
+
if (timer !== null) {
|
|
3861
|
+
clearTimeout(timer);
|
|
3862
|
+
timer = null;
|
|
3863
|
+
}
|
|
3864
|
+
flush();
|
|
3865
|
+
};
|
|
3866
|
+
return throttled;
|
|
3867
|
+
}
|
|
3690
3868
|
var BASE_SYSTEM_PROMPT = "You are an AI assistant with basic tools to interact with your environment. Explore and work freely.";
|
|
3691
3869
|
function joinPromptSections(...sections) {
|
|
3692
3870
|
return sections.filter((s) => s?.trim()).join("\n\n");
|
|
@@ -3715,14 +3893,13 @@ function buildSkillsContext(skills) {
|
|
|
3715
3893
|
if (skills.length === 0) {
|
|
3716
3894
|
return "";
|
|
3717
3895
|
}
|
|
3718
|
-
const skillLines = skills.map((s) => `- ${s.name}: ${s.description}
|
|
3719
|
-
Path: ${s.skillMdPath}`).join("\n");
|
|
3896
|
+
const skillLines = skills.map((s) => `- ${s.name}: ${s.description}`).join("\n");
|
|
3720
3897
|
return `## Available Skills
|
|
3721
3898
|
${skillLines}
|
|
3722
3899
|
|
|
3723
3900
|
${backgroundProcessPrompt}
|
|
3724
3901
|
|
|
3725
|
-
|
|
3902
|
+
Use the Skill tool to load a skill's full instructions before following it.`;
|
|
3726
3903
|
}
|
|
3727
3904
|
async function completeMessageStep({
|
|
3728
3905
|
assistantMessageId,
|
|
@@ -3754,7 +3931,7 @@ async function completeMessageStep({
|
|
|
3754
3931
|
}
|
|
3755
3932
|
await writable.close();
|
|
3756
3933
|
}
|
|
3757
|
-
var INTERRUPT_POLL_INTERVAL_MS =
|
|
3934
|
+
var INTERRUPT_POLL_INTERVAL_MS = 250;
|
|
3758
3935
|
function pollForInterrupt({
|
|
3759
3936
|
storage,
|
|
3760
3937
|
messageId,
|
|
@@ -3765,6 +3942,9 @@ function pollForInterrupt({
|
|
|
3765
3942
|
const firstCheck = new Promise((resolve) => {
|
|
3766
3943
|
resolveFirstCheck = resolve;
|
|
3767
3944
|
});
|
|
3945
|
+
const interruptedLastPartRef = {
|
|
3946
|
+
current: null
|
|
3947
|
+
};
|
|
3768
3948
|
const poll = async () => {
|
|
3769
3949
|
let isFirst = true;
|
|
3770
3950
|
while (!signal.aborted) {
|
|
@@ -3776,6 +3956,7 @@ function pollForInterrupt({
|
|
|
3776
3956
|
return;
|
|
3777
3957
|
}
|
|
3778
3958
|
if (message.interruptedAt !== null) {
|
|
3959
|
+
interruptedLastPartRef.current = message.interruptedLastPart;
|
|
3779
3960
|
abortController.abort();
|
|
3780
3961
|
if (isFirst) {
|
|
3781
3962
|
resolveFirstCheck();
|
|
@@ -3792,7 +3973,7 @@ function pollForInterrupt({
|
|
|
3792
3973
|
}
|
|
3793
3974
|
};
|
|
3794
3975
|
poll();
|
|
3795
|
-
return { firstCheck };
|
|
3976
|
+
return { firstCheck, interruptedLastPartRef };
|
|
3796
3977
|
}
|
|
3797
3978
|
async function streamTextStep({
|
|
3798
3979
|
assistantMessageId,
|
|
@@ -3800,16 +3981,18 @@ async function streamTextStep({
|
|
|
3800
3981
|
event,
|
|
3801
3982
|
writable,
|
|
3802
3983
|
lastPartIndex,
|
|
3803
|
-
stepIndexOffset
|
|
3984
|
+
stepIndexOffset,
|
|
3985
|
+
discoveredSkills
|
|
3804
3986
|
}) {
|
|
3805
3987
|
"use step";
|
|
3806
3988
|
const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_client(), client_exports));
|
|
3807
3989
|
const { getSandbox: getSandbox2 } = await Promise.resolve().then(() => (init_sandbox(), sandbox_exports));
|
|
3808
3990
|
const rpc = input.rpc;
|
|
3991
|
+
const throttledEmitStatus = createThrottledEmitStatus(rpc);
|
|
3809
3992
|
const storage = getStorage2({ config: input.storageConfig, rpc });
|
|
3810
3993
|
const abortController = new AbortController();
|
|
3811
3994
|
const pollController = new AbortController();
|
|
3812
|
-
const { firstCheck } = pollForInterrupt({
|
|
3995
|
+
const { firstCheck, interruptedLastPartRef } = pollForInterrupt({
|
|
3813
3996
|
storage,
|
|
3814
3997
|
messageId: assistantMessageId,
|
|
3815
3998
|
signal: pollController.signal,
|
|
@@ -3841,7 +4024,8 @@ async function streamTextStep({
|
|
|
3841
4024
|
const sandbox2 = getSandbox2({
|
|
3842
4025
|
sandboxRecord: sandboxRecord2,
|
|
3843
4026
|
storageConfig: input.storageConfig,
|
|
3844
|
-
storage
|
|
4027
|
+
storage,
|
|
4028
|
+
rpc
|
|
3845
4029
|
});
|
|
3846
4030
|
return { session: session2, sandbox: sandbox2, sandboxRecord: sandboxRecord2 };
|
|
3847
4031
|
}),
|
|
@@ -3856,7 +4040,8 @@ async function streamTextStep({
|
|
|
3856
4040
|
lastPartIndex,
|
|
3857
4041
|
usageSteps: [],
|
|
3858
4042
|
pendingApprovals: [],
|
|
3859
|
-
maxSteps: void 0
|
|
4043
|
+
maxSteps: void 0,
|
|
4044
|
+
discoveredSkills
|
|
3860
4045
|
};
|
|
3861
4046
|
}
|
|
3862
4047
|
if (messagesResult instanceof Error) {
|
|
@@ -3939,13 +4124,20 @@ async function streamTextStep({
|
|
|
3939
4124
|
const POLL_MS = 500;
|
|
3940
4125
|
const TIMEOUT_MS = 5 * 60 * 1e3;
|
|
3941
4126
|
const start2 = Date.now();
|
|
3942
|
-
while (Date.now() - start2 < TIMEOUT_MS) {
|
|
4127
|
+
while (Date.now() - start2 < TIMEOUT_MS && !abortController.signal.aborted) {
|
|
3943
4128
|
const parts = await storage.part.listBySession(input.sessionId);
|
|
3944
4129
|
if (!(parts instanceof Error)) {
|
|
3945
4130
|
const updated = parts.items.find(
|
|
3946
|
-
(p) => p.id === partId && "state" in p.part && p.part.state === "approval-responded"
|
|
4131
|
+
(p) => p.id === partId && "state" in p.part && (p.part.state === "approval-responded" || p.part.state === "output-denied")
|
|
3947
4132
|
);
|
|
3948
4133
|
if (updated) {
|
|
4134
|
+
const state = updated.part.state;
|
|
4135
|
+
if (state === "output-denied") {
|
|
4136
|
+
const reason = updated.part.approval?.reason;
|
|
4137
|
+
return {
|
|
4138
|
+
error: `Tool "${toolName}" denied: ${reason || "user denied"}`
|
|
4139
|
+
};
|
|
4140
|
+
}
|
|
3949
4141
|
const approval = updated.part.approval;
|
|
3950
4142
|
if (approval?.approved) {
|
|
3951
4143
|
try {
|
|
@@ -3977,7 +4169,12 @@ async function streamTextStep({
|
|
|
3977
4169
|
}
|
|
3978
4170
|
await new Promise((r) => setTimeout(r, POLL_MS));
|
|
3979
4171
|
}
|
|
3980
|
-
return {
|
|
4172
|
+
return {
|
|
4173
|
+
error: abortController.signal.aborted ? "interrupted" : "Approval timed out"
|
|
4174
|
+
};
|
|
4175
|
+
};
|
|
4176
|
+
const skillsRef = {
|
|
4177
|
+
current: discoveredSkills ?? []
|
|
3981
4178
|
};
|
|
3982
4179
|
const rawTools = getTools({
|
|
3983
4180
|
input,
|
|
@@ -3985,6 +4182,7 @@ async function streamTextStep({
|
|
|
3985
4182
|
sandbox,
|
|
3986
4183
|
session,
|
|
3987
4184
|
sandboxRecord,
|
|
4185
|
+
skillsRef,
|
|
3988
4186
|
apiToolsMetadata,
|
|
3989
4187
|
onSubToolCall
|
|
3990
4188
|
});
|
|
@@ -4019,14 +4217,12 @@ async function streamTextStep({
|
|
|
4019
4217
|
}
|
|
4020
4218
|
])
|
|
4021
4219
|
);
|
|
4022
|
-
let skillsRef = [];
|
|
4023
4220
|
const result = (0, import_ai3.streamText)({
|
|
4024
4221
|
// Placeholder to pass validation — prepareStep replaces messages entirely.
|
|
4025
4222
|
messages: [{ role: "user", content: "." }],
|
|
4026
4223
|
tools,
|
|
4027
4224
|
model: session.model,
|
|
4028
4225
|
abortSignal: abortController.signal,
|
|
4029
|
-
activeTools: session.activeTools ?? void 0,
|
|
4030
4226
|
stopWhen: (0, import_ai3.stepCountIs)(1),
|
|
4031
4227
|
temperature: session.generation?.temperature,
|
|
4032
4228
|
topK: session.generation?.topK,
|
|
@@ -4043,37 +4239,37 @@ async function streamTextStep({
|
|
|
4043
4239
|
},
|
|
4044
4240
|
prepareStep: async ({ model }) => {
|
|
4045
4241
|
if (lastPartIndex === 0) {
|
|
4046
|
-
|
|
4242
|
+
const isFirstAssistantMessage = !messagesResult.items.some(
|
|
4243
|
+
(m) => m.role === "assistant" && m.id !== assistantMessageId && m.startedAt !== null
|
|
4244
|
+
);
|
|
4245
|
+
if (isFirstAssistantMessage && sandbox._setupMeta) {
|
|
4047
4246
|
const meta = await sandbox._setupMeta;
|
|
4048
|
-
|
|
4247
|
+
throttledEmitStatus({
|
|
4049
4248
|
writer: streamWriterRef.current,
|
|
4050
|
-
status: meta.needsSetupRun ? { type: "sandbox-setup-cold" } : { type: "sandbox-setup" }
|
|
4051
|
-
rpc
|
|
4249
|
+
status: meta.needsSetupRun ? { type: "sandbox-setup-cold" } : { type: "sandbox-setup" }
|
|
4052
4250
|
});
|
|
4053
4251
|
}
|
|
4054
4252
|
if (sandbox._onReady) {
|
|
4055
4253
|
await sandbox._onReady;
|
|
4056
4254
|
}
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
|
|
4060
|
-
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
}
|
|
4067
|
-
skillsRef = skills;
|
|
4255
|
+
if (!discoveredSkills) {
|
|
4256
|
+
const skillsDirs = session.skillsDir?.length ? session.skillsDir : [];
|
|
4257
|
+
if (skillsDirs.length > 0) {
|
|
4258
|
+
skillsRef.current = await discoverSkillsInSandbox({
|
|
4259
|
+
sandbox,
|
|
4260
|
+
skillsDirs,
|
|
4261
|
+
debug: true
|
|
4262
|
+
});
|
|
4263
|
+
}
|
|
4264
|
+
}
|
|
4068
4265
|
}
|
|
4069
4266
|
const approvedParts = allParts.filter(
|
|
4070
4267
|
(p) => p.part && "state" in p.part && p.part.state === "approval-responded" && "approval" in p.part && p.part.approval?.approved === true
|
|
4071
4268
|
);
|
|
4072
4269
|
if (approvedParts.length > 0) {
|
|
4073
|
-
|
|
4270
|
+
throttledEmitStatus({
|
|
4074
4271
|
writer: streamWriterRef.current,
|
|
4075
|
-
status: { type: "processing-approvals" }
|
|
4076
|
-
rpc
|
|
4272
|
+
status: { type: "processing-approvals" }
|
|
4077
4273
|
});
|
|
4078
4274
|
const preExecMessages = await (0, import_ai3.convertToModelMessages)(
|
|
4079
4275
|
assembleUIMessages({
|
|
@@ -4127,12 +4323,11 @@ async function streamTextStep({
|
|
|
4127
4323
|
})
|
|
4128
4324
|
);
|
|
4129
4325
|
}
|
|
4130
|
-
|
|
4326
|
+
throttledEmitStatus({
|
|
4131
4327
|
writer: streamWriterRef.current,
|
|
4132
|
-
status: { type: "thinking" }
|
|
4133
|
-
rpc
|
|
4328
|
+
status: { type: "thinking" }
|
|
4134
4329
|
});
|
|
4135
|
-
const skillsContext = buildSkillsContext(skillsRef);
|
|
4330
|
+
const skillsContext = buildSkillsContext(skillsRef.current);
|
|
4136
4331
|
const systemHeader = joinPromptSections(
|
|
4137
4332
|
BASE_SYSTEM_PROMPT,
|
|
4138
4333
|
session.system
|
|
@@ -4160,9 +4355,16 @@ async function streamTextStep({
|
|
|
4160
4355
|
sessionId: input.sessionId,
|
|
4161
4356
|
messages: modelMessages
|
|
4162
4357
|
});
|
|
4358
|
+
let activeTools = session.activeTools ?? void 0;
|
|
4359
|
+
if (skillsRef.current.length === 0 && activeTools) {
|
|
4360
|
+
activeTools = activeTools.filter(
|
|
4361
|
+
(t) => t !== "Skill"
|
|
4362
|
+
);
|
|
4363
|
+
}
|
|
4163
4364
|
return {
|
|
4164
4365
|
messages: promptCaching.messages,
|
|
4165
|
-
providerOptions: promptCaching.providerOptions
|
|
4366
|
+
providerOptions: promptCaching.providerOptions,
|
|
4367
|
+
activeTools
|
|
4166
4368
|
};
|
|
4167
4369
|
},
|
|
4168
4370
|
onStepFinish: ({ usage }) => {
|
|
@@ -4203,10 +4405,9 @@ async function streamTextStep({
|
|
|
4203
4405
|
}
|
|
4204
4406
|
}
|
|
4205
4407
|
if (hasApprovals) {
|
|
4206
|
-
|
|
4408
|
+
throttledEmitStatus({
|
|
4207
4409
|
writer: streamWriterRef.current,
|
|
4208
|
-
status: { type: "needs-approval" }
|
|
4209
|
-
rpc
|
|
4410
|
+
status: { type: "needs-approval" }
|
|
4210
4411
|
});
|
|
4211
4412
|
}
|
|
4212
4413
|
}
|
|
@@ -4214,42 +4415,79 @@ async function streamTextStep({
|
|
|
4214
4415
|
);
|
|
4215
4416
|
}
|
|
4216
4417
|
});
|
|
4217
|
-
await stream.pipeTo(writable, {
|
|
4418
|
+
await stream.pipeTo(writable, {
|
|
4419
|
+
preventClose: true,
|
|
4420
|
+
preventAbort: true
|
|
4421
|
+
});
|
|
4218
4422
|
} catch (err) {
|
|
4219
4423
|
if (abortController.signal.aborted) {
|
|
4220
4424
|
wasAborted = true;
|
|
4221
4425
|
} else {
|
|
4222
|
-
console.error("[streamTextStep] stream error:", err);
|
|
4223
4426
|
throw err;
|
|
4224
4427
|
}
|
|
4225
4428
|
} finally {
|
|
4226
4429
|
pollController.abort();
|
|
4430
|
+
throttledEmitStatus.dispose();
|
|
4227
4431
|
}
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4432
|
+
if (abortController.signal.aborted) {
|
|
4433
|
+
wasAborted = true;
|
|
4434
|
+
}
|
|
4435
|
+
const lastPart = interruptedLastPartRef.current;
|
|
4436
|
+
if (wasAborted) {
|
|
4437
|
+
const terminalStates = /* @__PURE__ */ new Set([
|
|
4438
|
+
"output-available",
|
|
4439
|
+
"output-error",
|
|
4440
|
+
"output-denied",
|
|
4441
|
+
"done"
|
|
4442
|
+
]);
|
|
4443
|
+
for (const part of stepParts) {
|
|
4444
|
+
if ("type" in part && typeof part.type === "string" && part.type.startsWith("tool-") && "state" in part && !terminalStates.has(part.state)) {
|
|
4445
|
+
part.state = "output-error";
|
|
4446
|
+
part.errorText = "interrupted";
|
|
4239
4447
|
}
|
|
4240
|
-
return result2;
|
|
4241
|
-
})
|
|
4242
|
-
);
|
|
4243
|
-
if (setStartedPromise) {
|
|
4244
|
-
const setStartedResult = await setStartedPromise;
|
|
4245
|
-
if (setStartedResult instanceof Error) {
|
|
4246
|
-
throw setStartedResult;
|
|
4247
4448
|
}
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4449
|
+
}
|
|
4450
|
+
try {
|
|
4451
|
+
const basePartIndex = nextPartIndex;
|
|
4452
|
+
await Promise.all(
|
|
4453
|
+
stepParts.map(async (uiPart, i) => {
|
|
4454
|
+
const index = basePartIndex + i;
|
|
4455
|
+
if (lastPart != null && index > lastPart.index) {
|
|
4456
|
+
return;
|
|
4457
|
+
}
|
|
4458
|
+
const useClientPart = lastPart != null && index === lastPart.index;
|
|
4459
|
+
const content = useClientPart ? lastPart.part : uiPart;
|
|
4460
|
+
const result2 = await storage.part.set({
|
|
4461
|
+
id: `part_${(0, import_ulid2.ulid)()}`,
|
|
4462
|
+
index,
|
|
4463
|
+
messageId: assistantMessageId,
|
|
4464
|
+
sessionId: input.sessionId,
|
|
4465
|
+
part: content
|
|
4466
|
+
});
|
|
4467
|
+
if (result2 instanceof Error) {
|
|
4468
|
+
throw result2;
|
|
4469
|
+
}
|
|
4470
|
+
return result2;
|
|
4471
|
+
})
|
|
4472
|
+
);
|
|
4473
|
+
nextPartIndex = lastPart != null ? Math.min(basePartIndex + stepParts.length, lastPart.index + 1) : basePartIndex + stepParts.length;
|
|
4474
|
+
if (setStartedPromise) {
|
|
4475
|
+
const setStartedResult = await setStartedPromise;
|
|
4476
|
+
if (setStartedResult instanceof Error) {
|
|
4477
|
+
throw setStartedResult;
|
|
4478
|
+
}
|
|
4479
|
+
for (const m of setStartedResult ?? []) {
|
|
4480
|
+
if (m instanceof Error) {
|
|
4481
|
+
throw m;
|
|
4482
|
+
}
|
|
4251
4483
|
}
|
|
4252
4484
|
}
|
|
4485
|
+
} catch (err) {
|
|
4486
|
+
if (abortController.signal.aborted) {
|
|
4487
|
+
wasAborted = true;
|
|
4488
|
+
} else {
|
|
4489
|
+
throw err;
|
|
4490
|
+
}
|
|
4253
4491
|
}
|
|
4254
4492
|
const pendingApprovals = stepParts.filter(
|
|
4255
4493
|
(p) => "state" in p && p.state === "approval-requested" && "approval" in p && !!p.approval?.id
|
|
@@ -4257,13 +4495,14 @@ async function streamTextStep({
|
|
|
4257
4495
|
approvalId: p.approval.id,
|
|
4258
4496
|
toolName: "type" in p ? String(p.type).replace("tool-", "") : "unknown"
|
|
4259
4497
|
}));
|
|
4260
|
-
const finalFinishReason = wasAborted ? "stop" : await result.finishReason;
|
|
4498
|
+
const finalFinishReason = wasAborted || lastPart != null ? "stop" : await result.finishReason;
|
|
4261
4499
|
return {
|
|
4262
4500
|
finishReason: finalFinishReason,
|
|
4263
4501
|
lastPartIndex: nextPartIndex,
|
|
4264
4502
|
usageSteps,
|
|
4265
4503
|
pendingApprovals,
|
|
4266
|
-
maxSteps: session.generation?.maxSteps
|
|
4504
|
+
maxSteps: session.generation?.maxSteps,
|
|
4505
|
+
discoveredSkills: skillsRef.current
|
|
4267
4506
|
};
|
|
4268
4507
|
}
|
|
4269
4508
|
|
|
@@ -4278,7 +4517,10 @@ async function agentWorkflow({
|
|
|
4278
4517
|
const messageHook = agentMessageHook.create({ token: input.sessionId });
|
|
4279
4518
|
const iterator = messageHook[Symbol.asyncIterator]();
|
|
4280
4519
|
let pendingNext = iterator.next();
|
|
4281
|
-
|
|
4520
|
+
let discoveredSkills = null;
|
|
4521
|
+
await onMessage({ event, input, discoveredSkills }).then((result) => {
|
|
4522
|
+
discoveredSkills = result?.discoveredSkills ?? discoveredSkills;
|
|
4523
|
+
}).catch((e) => {
|
|
4282
4524
|
if (import_workflow3.FatalError.is(e)) {
|
|
4283
4525
|
console.error("Message processing failed permanently:", e.message);
|
|
4284
4526
|
return;
|
|
@@ -4291,7 +4533,9 @@ async function agentWorkflow({
|
|
|
4291
4533
|
console.error("Unexpected: message hook iterator done");
|
|
4292
4534
|
break;
|
|
4293
4535
|
}
|
|
4294
|
-
await onMessage({ event: result.value, input }).
|
|
4536
|
+
await onMessage({ event: result.value, input, discoveredSkills }).then((result2) => {
|
|
4537
|
+
discoveredSkills = result2?.discoveredSkills ?? discoveredSkills;
|
|
4538
|
+
}).catch((e) => {
|
|
4295
4539
|
if (import_workflow3.FatalError.is(e)) {
|
|
4296
4540
|
console.error("Message processing failed permanently:", e.message);
|
|
4297
4541
|
return;
|
|
@@ -4303,7 +4547,8 @@ async function agentWorkflow({
|
|
|
4303
4547
|
}
|
|
4304
4548
|
async function onMessage({
|
|
4305
4549
|
event,
|
|
4306
|
-
input
|
|
4550
|
+
input,
|
|
4551
|
+
discoveredSkills
|
|
4307
4552
|
}) {
|
|
4308
4553
|
const writable = (0, import_workflow3.getWritable)({ namespace: event.assistantMessageId });
|
|
4309
4554
|
let finishReason;
|
|
@@ -4317,11 +4562,13 @@ async function onMessage({
|
|
|
4317
4562
|
input,
|
|
4318
4563
|
event,
|
|
4319
4564
|
lastPartIndex,
|
|
4320
|
-
stepIndexOffset: usageSteps.length
|
|
4565
|
+
stepIndexOffset: usageSteps.length,
|
|
4566
|
+
discoveredSkills
|
|
4321
4567
|
});
|
|
4322
4568
|
finishReason = result.finishReason;
|
|
4323
4569
|
lastPartIndex = result.lastPartIndex;
|
|
4324
4570
|
usageSteps.push(...result.usageSteps);
|
|
4571
|
+
discoveredSkills = result.discoveredSkills;
|
|
4325
4572
|
if (result.maxSteps != null && usageSteps.length >= result.maxSteps) {
|
|
4326
4573
|
break;
|
|
4327
4574
|
}
|
|
@@ -4345,6 +4592,7 @@ async function onMessage({
|
|
|
4345
4592
|
writable,
|
|
4346
4593
|
usageSteps
|
|
4347
4594
|
});
|
|
4595
|
+
return { discoveredSkills };
|
|
4348
4596
|
}
|
|
4349
4597
|
// Annotate the CommonJS export names for ESM import in node:
|
|
4350
4598
|
0 && (module.exports = {
|
|
@@ -4352,4 +4600,4 @@ async function onMessage({
|
|
|
4352
4600
|
agentWorkflow,
|
|
4353
4601
|
approvalHook
|
|
4354
4602
|
});
|
|
4355
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9lcnJvcnMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvY2xpZW50LnRzIiwgIi4uL3NyYy91dGlscy9kZWJ1Zy50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwtc2RrLnRzIiwgIi4uL3NyYy9zdG9yYWdlL3JwYy50cyIsICIuLi9zcmMvc3RvcmFnZS9oYW5kbGVyLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2luZGV4LnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9saWZlY3ljbGUtd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2NsaWVudC50cyIsICIuLi9zcmMvc2FuZGJveC9pbmRleC50cyIsICIuLi9zcmMvYWdlbnQtd29ya2Zsb3cudHMiLCAiLi4vc3JjL2FnZW50LXdvcmtmbG93LXN0ZXBzLnRzIiwgIi4uL3NyYy9za2lsbHMvcGFyc2VyLnRzIiwgIi4uL3NyYy9za2lsbHMvZGlzY292ZXIudHMiLCAiLi4vc3JjL3Rvb2xzL2luZGV4LnRzIiwgIi4uL3NyYy90b29scy9qYXZhc2NyaXB0LnRzIiwgIi4uL3NyYy91dGlscy9wcm9tcHQtY2FjaGUudHMiLCAiLi4vc3JjL3V0aWxzL3VpLnRzIiwgIi4uL3NyYy91dGlscy91c2FnZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBCYXNoUmVzdWx0LCBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9VTlRJTCA9IDIwMDA7XG5cbi8qKlxuICogU2hlbGwgc2NyaXB0IHRoYXQgaGFuZGxlcyBhbGwgcHJvY2VzcyBleGVjdXRpb24gbG9naWMuXG4gKiBJbnN0YWxsZWQgdG8gfi8uYWdlbnQvYmluL3J1bi5zaCBkdXJpbmcgaW5pdCgpLlxuICovXG5jb25zdCBSVU5fU0NSSVBUID0gYCMhL2Jpbi9zaFxuIyBQcm9jZXNzIHJ1bm5lciBmb3IgQWdlbnQgU0RLXG4jIEFsbCBwYXJhbWV0ZXJzIHBhc3NlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGF2b2lkIGVzY2FwaW5nIGlzc3Vlc1xuIyBPdXRwdXQgaXMgYmFzZTY0IGVuY29kZWQgdG8gYXZvaWQgSlNPTiBlc2NhcGluZyBpc3N1ZXNcblxuQUdFTlRfRElSPVwiJEhPTUUvLmFnZW50XCJcbkNXRF9GSUxFPVwiJEFHRU5UX0RJUi9jd2QvJFNFU1NJT05fSURcIlxuXG4jIEdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChwZXItc2Vzc2lvbilcbmlmIFsgLWYgXCIkQ1dEX0ZJTEVcIiBdOyB0aGVuXG4gIENXRD0kKGNhdCBcIiRDV0RfRklMRVwiKVxuZWxzZVxuICBDV0Q9XCIkSE9NRVwiXG5maVxuXG4jIERlY29kZSBjb21tYW5kXG5DTUQ9JChlY2hvIFwiJENNRF9CQVNFNjRcIiB8IGJhc2U2NCAtZClcblxuIyBCYWNrZ3JvdW5kIG1vZGUgKHdhaXRVbnRpbCA9IDApXG5pZiBbIFwiJFdBSVRfVU5USUxcIiA9IFwiMFwiIF07IHRoZW5cbiAgY2QgXCIkQ1dEXCIgfHwgY2QgXCIkSE9NRVwiXG5cbiAgIyBHZW5lcmF0ZSBhIHNpbXBsZSBudW1lcmljIElEIGZvciBvdXRwdXQgZmlsZVxuICBPVVRQVVRfSUQ9XCIkKGRhdGUgKyVzKSQkXCJcbiAgT1VUUFVUX0ZJTEU9XCIkQUdFTlRfRElSL291dHB1dHMvJE9VVFBVVF9JRC5sb2dcIlxuXG4gICMgRG91YmxlLWZvcmsgdG8gZnVsbHkgZGV0YWNoIHRoZSBwcm9jZXNzXG4gIChcbiAgICAoXG4gICAgICBldmFsIFwiJENNRFwiXG4gICAgICBwd2QgPiBcIiRDV0RfRklMRVwiIDI+L2Rldi9udWxsXG4gICAgKSA+IFwiJE9VVFBVVF9GSUxFXCIgMj4mMSA8IC9kZXYvbnVsbCAmXG4gICAgZWNobyAkISA+IFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCJcbiAgKVxuXG4gICMgU21hbGwgZGVsYXkgdG8gZW5zdXJlIFBJRCBmaWxlIGlzIHdyaXR0ZW5cbiAgc2xlZXAgMC4wNVxuXG4gICMgUmVhZCBQSURcbiAgaWYgWyAtZiBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiIF07IHRoZW5cbiAgICBQSUQ9JChjYXQgXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIilcbiAgZWxzZVxuICAgIFBJRD0wXG4gIGZpXG5cbiAgIyBPdXRwdXQgSlNPTiByZXN1bHQgKG5vIG91dHB1dCBmb3IgYmFja2dyb3VuZCwgc28gbm8gZW5jb2RpbmcgbmVlZGVkKVxuICBwcmludGYgJ3tcInBpZFwiOiVkLFwib3V0cHV0QmFzZTY0XCI6XCJcIixcImV4aXRDb2RlXCI6LTEsXCJzdGF0dXNcIjpcInJ1bm5pbmdcIixcIm91dHB1dEZpbGVcIjpcIiVzXCIsXCJjd2RcIjpcIiVzXCJ9XFxcXG4nIFxcXFxcbiAgICBcIiRQSURcIiBcIiRPVVRQVVRfRklMRVwiIFwiJENXRFwiXG4gIGV4aXQgMFxuZmlcblxuIyBGb3JlZ3JvdW5kIG1vZGUgKHdhaXRVbnRpbCA+IDApIC0gcnVuIGRpcmVjdGx5IGFuZCBjYXB0dXJlIG91dHB1dFxuY2QgXCIkQ1dEXCIgfHwgY2QgXCIkSE9NRVwiXG5cbiMgUnVuIGNvbW1hbmQsIGNhcHR1cmUgb3V0cHV0IGFuZCBleGl0IGNvZGVcbk9VVFBVVD0kKGV2YWwgXCIkQ01EXCIgMj4mMSlcbkVYSVRfQ09ERT0kP1xuXG4jIFVwZGF0ZSBDV0QgYWZ0ZXIgY29tbWFuZFxuTkVXX0NXRD0kKHB3ZClcbmVjaG8gXCIkTkVXX0NXRFwiID4gXCIkQ1dEX0ZJTEVcIlxuXG4jIERldGVybWluZSBzdGF0dXNcbmlmIFsgJEVYSVRfQ09ERSAtZXEgMCBdOyB0aGVuXG4gIFNUQVRVUz1cImNvbXBsZXRlZFwiXG5lbHNlXG4gIFNUQVRVUz1cImZhaWxlZFwiXG5maVxuXG4jIEJhc2U2NCBlbmNvZGUgb3V0cHV0IHRvIGF2b2lkIEFMTCBlc2NhcGluZyBpc3N1ZXNcbk9VVFBVVF9CQVNFNjQ9JChwcmludGYgJyVzJyBcIiRPVVRQVVRcIiB8IGJhc2U2NCB8IHRyIC1kICdcXFxcbicpXG5cbiMgT3V0cHV0IEpTT04gcmVzdWx0IHdpdGggYmFzZTY0LWVuY29kZWQgb3V0cHV0XG5wcmludGYgJ3tcInBpZFwiOjAsXCJvdXRwdXRCYXNlNjRcIjpcIiVzXCIsXCJleGl0Q29kZVwiOiVkLFwic3RhdHVzXCI6XCIlc1wiLFwib3V0cHV0RmlsZVwiOlwiXCIsXCJjd2RcIjpcIiVzXCJ9XFxcXG4nIFxcXFxcbiAgXCIkT1VUUFVUX0JBU0U2NFwiIFwiJEVYSVRfQ09ERVwiIFwiJFNUQVRVU1wiIFwiJE5FV19DV0RcIlxuYDtcblxudHlwZSBSdW5PcHRpb25zID0ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXggbXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi5cbiAgICogLSAwOiBCYWNrZ3JvdW5kIG1vZGUgLSByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBQSURcbiAgICogLSA+MDogRm9yZWdyb3VuZCBtb2RlIC0gd2FpdCBmb3IgY29tcGxldGlvbiAoZGVmYXVsdDogMzAwMDApXG4gICAqL1xuICB3YWl0VW50aWw/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgbWFuYWdlciB0aGF0IHVzZXMgYSBzaW5nbGUgc2hlbGwgc2NyaXB0IHRvIGhhbmRsZSBhbGwgZXhlY3V0aW9uIGxvZ2ljLlxuICogUmVkdWNlcyByb3VuZC10cmlwcyB0byB0aGUgc2FuZGJveCBieSBkb2luZyBldmVyeXRoaW5nIGluIG9uZSBleGVjIGNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQcm9jZXNzTWFuYWdlciA9IChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNlc3Npb25JZCB9ID0gb3B0cztcbiAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3QgaW5pdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBta2RpciAtcCAkSE9NRS8uYWdlbnQvYmluICRIT01FLy5hZ2VudC9waWRzICRIT01FLy5hZ2VudC9vdXRwdXRzICRIT01FLy5hZ2VudC9jd2RcbmNhdCA+ICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoIDw8ICdTQ1JJUFRfRU9GJ1xuJHtSVU5fU0NSSVBUfVxuU0NSSVBUX0VPRlxuY2htb2QgK3ggJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2hgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0O1xuICAgIH1cbiAgICBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBydW4gPSBhc3luYyAob3B0czogUnVuT3B0aW9ucyk6IFByb21pc2U8QmFzaFJlc3VsdD4gPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcblxuICAgIGNvbnN0IHsgY29tbWFuZCwgd2FpdFVudGlsID0gREVGQVVMVF9XQUlUX1VOVElMIH0gPSBvcHRzO1xuICAgIGNvbnN0IGNtZEJhc2U2NCA9IEJ1ZmZlci5mcm9tKGNvbW1hbmQsIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBDTURfQkFTRTY0PVwiJHtjbWRCYXNlNjR9XCIgV0FJVF9VTlRJTD1cIiR7d2FpdFVudGlsfVwiIFNFU1NJT05fSUQ9XCIke3Nlc3Npb25JZH1cIiAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaGAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQudHJpbSgpKSBhcyB7XG4gICAgICBwaWQ6IG51bWJlcjtcbiAgICAgIG91dHB1dEJhc2U2NDogc3RyaW5nO1xuICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgIHN0YXR1czogXCJydW5uaW5nXCIgfCBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIG91dHB1dEZpbGU6IHN0cmluZztcbiAgICAgIGN3ZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyBEZWNvZGUgYmFzZTY0IG91dHB1dFxuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZC5vdXRwdXRCYXNlNjRcbiAgICAgID8gQnVmZmVyLmZyb20ocGFyc2VkLm91dHB1dEJhc2U2NCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgICAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpZDogcGFyc2VkLnBpZCxcbiAgICAgIG91dHB1dCxcbiAgICAgIGV4aXRDb2RlOiBwYXJzZWQuZXhpdENvZGUsXG4gICAgICBzdGF0dXM6IHBhcnNlZC5zdGF0dXMsXG4gICAgICBjd2Q6IHBhcnNlZC5jd2QsXG4gICAgICBvdXRwdXRGaWxlOiBwYXJzZWQub3V0cHV0RmlsZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGdldEN3ZCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYGNhdCAkSE9NRS8uYWdlbnQvY3dkLyR7c2Vzc2lvbklkfSAyPi9kZXYvbnVsbCB8fCBlY2hvIFwiJEhPTUVcImAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKSB8fCBwcm9jZXNzLmN3ZCgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaW5pdCxcbiAgICBydW4sXG4gICAgZ2V0Q3dkLFxuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgUHJvY2Vzc01hbmFnZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVQcm9jZXNzTWFuYWdlcj47XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbkVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgZmFpbGVkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2FuZGJveCAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94RXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgTWVzc2FnZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIk1lc3NhZ2VOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiTWVzc2FnZSAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuIiwgImltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7XG4gIE1lc3NhZ2VOb3RGb3VuZEVycm9yLFxuICBTYW5kYm94Tm90Rm91bmRFcnJvcixcbiAgU2Vzc2lvbk5vdEZvdW5kRXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWV0aG9kcyB9IGZyb20gXCIuL3JwY1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBQYXJ0LFxuICBTZXR1cFNuYXBzaG90LFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG50eXBlIFJwY1Jlc3BvbnNlPFQ+ID1cbiAgfCB7IHJlc3VsdDogVCB9XG4gIHwgeyBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IH07XG5cbmV4cG9ydCB0eXBlIFJwY0ZuID0gKHBhcmFtczoge1xuICBuYW1lPzogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGFyYW1zOiB1bmtub3duO1xufSkgPT4gUHJvbWlzZTxScGNSZXNwb25zZTx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlQ2xpZW50KHJwY0ZuOiBScGNGbiwgbmFtZT86IHN0cmluZyk6IFN0b3JhZ2Uge1xuICBhc3luYyBmdW5jdGlvbiBycGM8TSBleHRlbmRzIGtleW9mIFN0b3JhZ2VNZXRob2RzPihcbiAgICBtZXRob2Q6IE0sXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicGFyYW1zXCJdPlxuICApOiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjRm4oeyBuYW1lLCBtZXRob2QsIHBhcmFtcyB9KTtcblxuICAgIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiByZXN1bHQuZXJyb3IubWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicmVzdWx0XCJdPjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzZXNzaW9uLmdldFwiLCB7IGlkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbk5vdEZvdW5kRXJyb3IoeyBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24uc2V0XCIsIHNlc3Npb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZTogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2Vzc2lvbi5kZWxldGVcIiwgeyBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLmxpc3RcIiwge1xuICAgICAgICAgICAgdGFnczogb3B0cz8udGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzPy5vcmRlcixcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jICh7IHNlc3Npb25JZCwgdGFncyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnRhZy5zZXRcIiwgeyBzZXNzaW9uSWQsIHRhZ3MgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbWVzc2FnZToge1xuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLmxpc3RcIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJtZXNzYWdlLmdldFwiLCB7IGlkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZU5vdEZvdW5kRXJyb3IoeyBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcIm1lc3NhZ2Uuc2V0XCIsIG1lc3NhZ2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGxpc3RCeU1lc3NhZ2U6IGFzeW5jIChtZXNzYWdlSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIiwge1xuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PFBhcnQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3RCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PFBhcnQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHBhcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInBhcnQuc2V0XCIsIHBhcnQpKSBhcyBQYXJ0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZTogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwicGFydC5kZWxldGVcIiwgeyBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldFwiLCB7IGtleSB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGtleSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzYW5kYm94LnNldFwiLCByZWNvcmQpO1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2FuZGJveC5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzYW5kYm94SWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2FuZGJveC50YWcuc2V0XCIsIHsgc2FuZGJveElkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFjcXVpcmVMb2NrOiBhc3luYyAocmVjb3JkLCBsb2NrVGltZW91dE1zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzYW5kYm94LmFjcXVpcmVMb2NrXCIsIHtcbiAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgIGxvY2tUaW1lb3V0TXMsXG4gICAgICAgICAgfSkpIGFzIGltcG9ydChcIi4vdHlwZXNcIikuU2FuZGJveFJlY29yZCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogYXN5bmMgKGtleSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwic2V0dXAuZ2V0XCIsIHsga2V5IH0pKSBhcyBTZXR1cFNuYXBzaG90IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChzbmFwc2hvdCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNldHVwLnNldFwiLCBzbmFwc2hvdCk7XG4gICAgICAgICAgcmV0dXJuIHNuYXBzaG90O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFjcXVpcmVMb2NrOiBhc3luYyAoa2V5LCBsb2NrSWQsIGxvY2tUaW1lb3V0TXMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNldHVwLmFjcXVpcmVMb2NrXCIsIHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGxvY2tJZCxcbiAgICAgICAgICAgIGxvY2tUaW1lb3V0TXMsXG4gICAgICAgICAgfSkpIGFzIFNldHVwU25hcHNob3QgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbW1hbmQ6IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLmdldFwiLCB7IGlkIH0pKSBhcyBDb21tYW5kIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLnNldFwiLCBjb21tYW5kKSkgYXMgQ29tbWFuZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwiY29tbWFuZC5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGluY2x1ZGVGaW5pc2hlZDogb3B0cz8uaW5jbHVkZUZpbmlzaGVkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PENvbW1hbmQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSBcImRlZmF1bHRcIjtcbmV4cG9ydCBjb25zdCBMT0NBTF9TVE9SQUdFX1ZFUlNJT04gPSBcInYxXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKG9wdHM6IHtcbiAgY29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBycGM6IFJwY0ZuO1xufSk6IFN0b3JhZ2Uge1xuICBjb25zdCBuYW1lID0gb3B0cy5jb25maWcubmFtZSA/PyBERUZBVUxUX05BTUVTUEFDRTtcbiAgcmV0dXJuIGdldFN0b3JhZ2VDbGllbnQob3B0cy5ycGMsIG5hbWUpO1xufVxuIiwgImNvbnN0IGVuYWJsZWQgPVxuICBwcm9jZXNzLmVudi5BR0VOVF9ERUJVRyA9PT0gXCIxXCIgfHwgcHJvY2Vzcy5lbnYuQUdFTlRfREVCVUcgPT09IFwidHJ1ZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoLi4uYXJnczogdW5rbm93bltdKSB7XG4gIGlmIChlbmFibGVkKSB7XG4gICAgY29uc29sZS5sb2coLi4uYXJncyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgVXBsb2FkYWJsZUZpbGUgfSBmcm9tIFwiLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBNQVhfUkVUUklFUyA9IDI7XG5jb25zdCBSRVRSWV9CQVNFX01TID0gNTAwO1xuXG4vKipcbiAqIEV4ZWMgYSBjb21tYW5kIGFuZCBhc3NlcnQgZXhpdCBjb2RlIDAuIFJldHJpZXMgb24gdHJhbnNpZW50IGZhaWx1cmVzXG4gKiAoZXhpdCBjb2RlIDI1NSB3aXRoIGVtcHR5IHN0ZGVyciBcdTIwMTQgdHlwaWNhbGx5IGEgc2FuZGJveCBwcm9jZXNzIGtpbGxlZFxuICogYmVmb3JlIGl0IGNvdWxkIHByb2R1Y2Ugb3V0cHV0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY0NoZWNrZWQoXG4gIHNhbmRib3g6IFBpY2s8U2FuZGJveCwgXCJleGVjXCI+LFxuICBvcHRzOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJncz86IHN0cmluZ1tdIH0sXG4gIGVycm9yTGFiZWw6IHN0cmluZ1xuKTogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXhpdENvZGU6IG51bWJlciB9PiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyA7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMob3B0cyk7XG4gICAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgZXhlY1Jlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBpc1RyYW5zaWVudCA9IHJlc3VsdC5leGl0Q29kZSA9PT0gMjU1ICYmICFyZXN1bHQuc3RkZXJyLnRyaW0oKTtcbiAgICBpZiAoaXNUcmFuc2llbnQgJiYgYXR0ZW1wdCA8IE1BWF9SRVRSSUVTKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBSRVRSWV9CQVNFX01TICogKGF0dGVtcHQgKyAxKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7ZXJyb3JMYWJlbH0gd2l0aCBleGl0IGNvZGUgJHtyZXN1bHQuZXhpdENvZGV9OiAke3Jlc3VsdC5zdGRlcnJ9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgZmlsZXMgdG8gYSBzYW5kYm94IGF0IHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gcGF0aC5cbiAqIFNoZWxsIHNjcmlwdHMgKC5zaCBmaWxlcykgYXJlIGF1dG9tYXRpY2FsbHkgbWFkZSBleGVjdXRhYmxlLlxuICpcbiAqIEZvciBzbWFsbCBmaWxlcyAoPDEwMEtCIHRvdGFsKSwgdXNlcyBzaW5nbGUgZXhlYyB3aXRoIGhlcmVkb2MuXG4gKiBGb3IgbGFyZ2UgZmlsZXMsIHdyaXRlcyBiYXNlNjQgY2h1bmtzIHRoZW4gZGVjb2RlcyB0byBhdm9pZCBBUkdfTUFYIGxpbWl0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZXMob3B0czoge1xuICBzYW5kYm94OiBQaWNrPFNhbmRib3gsIFwiZXhlY1wiPjtcbiAgZmlsZXM6IFVwbG9hZGFibGVGaWxlW107XG4gIGRlc3RQYXRoOiBzdHJpbmc7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgZmlsZXMsIGRlc3RQYXRoIH0gPSBvcHRzO1xuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlUGF0aHMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucG9zaXguam9pbihkZXN0UGF0aCwgZmlsZS5wYXRoKSk7XG4gIGNvbnN0IHBhcmVudERpcnMgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoZmlsZVBhdGhzLm1hcCgocCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHApKSlcbiAgKTtcbiAgY29uc3Qgc2hlbGxTY3JpcHRzID0gZmlsZVBhdGhzLmZpbHRlcigocCkgPT4gcC5lbmRzV2l0aChcIi5zaFwiKSk7XG5cbiAgY29uc3QgbWtkaXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwibWtkaXJcIixcbiAgICBhcmdzOiBbXCItcFwiLCAuLi5wYXJlbnREaXJzXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgbWtkaXJSZXN1bHQ7XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGNvbnN0IENIVU5LX1NJWkUgPSA1MF8wMDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGZpbGUgPSBmaWxlc1tpXTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGZpbGVQYXRoc1tpXTtcbiAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gdG9CYXNlNjQoZmlsZS5jb250ZW50KTtcblxuICAgIGlmIChiYXNlNjRDb250ZW50Lmxlbmd0aCA8IENIVU5LX1NJWkUpIHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IGBFT0ZfJHtpfWA7XG4gICAgICBhd2FpdCBleGVjQ2hlY2tlZChcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBiYXNlNjQgLWQgPiAke3F1b3RlKGZ1bGxQYXRoKX0gPDwgJyR7bWFya2VyfSdcbiR7YmFzZTY0Q29udGVudH1cbiR7bWFya2VyfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3cml0ZUZpbGVzIGZhaWxlZFwiXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wQjY0ID0gYC90bXAvY2h1bmstJHtEYXRlLm5vdygpfS0ke2l9LmI2NGA7XG5cbiAgICAgIGNvbnN0IGNsZWFyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgIGFyZ3M6IFtcIi1jXCIsIGA+ICR7cXVvdGUodGVtcEI2NCl9YF0sXG4gICAgICB9KTtcbiAgICAgIGlmIChjbGVhclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGNsZWFyUmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgY2xlYXJSZXN1bHQucmVzdWx0O1xuXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgb2Zmc2V0IDwgYmFzZTY0Q29udGVudC5sZW5ndGg7XG4gICAgICAgIG9mZnNldCArPSBDSFVOS19TSVpFXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBiYXNlNjRDb250ZW50LnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgQ0hVTktfU0laRSk7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IGBDSFVOS18ke29mZnNldH1gO1xuICAgICAgICBhd2FpdCBleGVjQ2hlY2tlZChcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICAgIGBjYXQgPj4gJHtxdW90ZSh0ZW1wQjY0KX0gPDwgJyR7bWFya2VyfSdcbiR7Y2h1bmt9XG4ke21hcmtlcn1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwid3JpdGVGaWxlcyBjaHVuayBmYWlsZWRcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBleGVjQ2hlY2tlZChcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBiYXNlNjQgLWQgPCAke3F1b3RlKHRlbXBCNjQpfSA+ICR7cXVvdGUoZnVsbFBhdGgpfSAmJiBybSAtZiAke3F1b3RlKHRlbXBCNjQpfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3cml0ZUZpbGVzIGRlY29kZSBmYWlsZWRcIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hlbGxTY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjaG1vZFJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcImNobW9kXCIsXG4gICAgICBhcmdzOiBbXCIreFwiLCAuLi5zaGVsbFNjcmlwdHNdLFxuICAgIH0pO1xuICAgIGlmIChjaG1vZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBjaG1vZFJlc3VsdDtcbiAgICB9XG4gICAgYXdhaXQgY2htb2RSZXN1bHQucmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgfVxuICByZXR1cm4gY29udGVudC50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cblxuZnVuY3Rpb24gcXVvdGUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtzLnJlcGxhY2UoLycvZywgXCInXFxcXCcnXCIpfSdgO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyBTYW5kYm94RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFRhZ3NTY2hlbWEgfSBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFJlY29yZCwgU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuLi8uLi91dGlscy9kZWJ1Z1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94U2V0dXBNZXRhIH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBMb2dFbnRyeSwgT25SZXN0YXJ0LCBTYW5kYm94LCBTYW5kYm94U2V0dXAgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyaXRlRmlsZXMgfSBmcm9tIFwiLi4vd3JpdGUtZmlsZXNcIjtcblxuZXhwb3J0IGNvbnN0IGxvY2FsU2FuZGJveCA9IDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2UsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQgJiB7IGNvbmZpZzogeyB0eXBlOiBcImxvY2FsXCIgfSB9O1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xufSk6IFNhbmRib3g8VFRhZ3M+ICYge1xuICBfb25SZWFkeT86IFByb21pc2U8dm9pZD47XG4gIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xufSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IHNhbmRib3hSZWNvcmQuY29uZmlnO1xuICBjb25zdCBiYXNlUGF0aCA9IGNvbmZpZy5wYXRoID8/IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHByb2Nlc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBDaGlsZFByb2Nlc3M+KCk7XG5cbiAgY29uc3Qgc2FuZGJveDogU2FuZGJveDxUVGFncz4gPSB7XG4gICAgaWQ6IHNhbmRib3hSZWNvcmQuaWQsXG4gICAgY29uZmlnOiBzYW5kYm94UmVjb3JkLmNvbmZpZyxcbiAgICBleGVjOiAoeyBjb21tYW5kLCBhcmdzLCBzaWduYWwgfSkgPT4ge1xuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbW1hbmRJZCA9IGBjb21tYW5kXyR7dWxpZCgpfWA7XG5cbiAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICAgIGN3ZDogYmFzZVBhdGgsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwcm9jZXNzZXMuc2V0KGNvbW1hbmRJZCwgY2hpbGQpO1xuXG4gICAgICAgICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgICAgICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgICAgICAgY29uc3QgbG9nUXVldWU6IExvZ0VudHJ5W10gPSBbXTtcbiAgICAgICAgICBsZXQgbG9nUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgICAgICBzdGRvdXQgKz0gc3RyO1xuICAgICAgICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRvdXRcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgICAgICAgIHN0ZGVyciArPSBzdHI7XG4gICAgICAgICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPHtcbiAgICAgICAgICAgIHN0ZG91dDogc3RyaW5nO1xuICAgICAgICAgICAgc3RkZXJyOiBzdHJpbmc7XG4gICAgICAgICAgICBleGl0Q29kZTogbnVtYmVyO1xuICAgICAgICAgIH0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgIHByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IGNvZGUgPz8gMCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTxMb2dFbnRyeT4ge1xuICAgICAgICAgICAgd2hpbGUgKCFjbG9zZWQgfHwgbG9nUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGxvZ1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgbG9nUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbG9nUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgY29tbWFuZElkLCBsb2dzLCByZXN1bHQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZTogdW5rbm93bikgPT5cbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldERvbWFpbjogKHBvcnQpID0+IHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuICAgIH0sXG5cbiAgICBraWxsOiBhc3luYyAoeyBjb21tYW5kSWQsIHN0b3JhZ2UgfSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGQgPSBwcm9jZXNzZXMuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgICByZWFzb246IGBDb21tYW5kICR7Y29tbWFuZElkfSBub3QgZm91bmQgb3IgYWxyZWFkeSBmaW5pc2hlZGAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcblxuICAgICAgY29uc3QgY21kID0gYXdhaXQgc3RvcmFnZS5jb21tYW5kLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKGNtZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBjbWQubWVzc2FnZSwgY2F1c2U6IGNtZCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbWQgJiYgY21kLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5jb21tYW5kLnNldCh7XG4gICAgICAgICAgLi4uY21kLFxuICAgICAgICAgIHN0YXR1czogXCJraWxsZWRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZXN1bHQubWVzc2FnZSwgY2F1c2U6IHJlc3VsdCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWFkRmlsZTogYXN5bmMgKHsgcGF0aDogZmlsZVBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oYmFzZVBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICBcImNvZGVcIiBpbiBlICYmXG4gICAgICAgICAgKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZUZpbGVzOiAob3B0cykgPT4gd3JpdGVGaWxlcyh7IHNhbmRib3gsIC4uLm9wdHMgfSksXG5cbiAgICB1cGRhdGVOZXR3b3JrUG9saWN5OiAoKSA9PlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgICByZWFzb246IFwidXBkYXRlTmV0d29ya1BvbGljeSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgVmVyY2VsIHNhbmRib3hlc1wiLFxuICAgICAgICB9KVxuICAgICAgKSxcblxuICAgIHRhZzoge1xuICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChzYW5kYm94LmlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoc2FuZGJveFJlY29yZC50YWdzID8/IHt9KSBhcyBUVGFncztcbiAgICAgIH0sXG4gICAgICBnZXQ6IGFzeW5jIChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChzYW5kYm94LmlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkLnRhZ3M/LltrZXkgYXMgc3RyaW5nXSBhc1xuICAgICAgICAgIHwgVFRhZ3NbdHlwZW9mIGtleV1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5pZCxcbiAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldE1hbnk6IGFzeW5jICh0YWdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LmlkLFxuICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgcmVzdWx0OiBTYW5kYm94PFRUYWdzPiAmIHtcbiAgICBfb25SZWFkeT86IFByb21pc2U8dm9pZD47XG4gICAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG4gIH0gPSBzYW5kYm94O1xuXG4gIGlmIChzZXR1cCB8fCBvblJlc3RhcnQpIHtcbiAgICBsZXQgcmVzb2x2ZVNldHVwTWV0YSE6IChtZXRhOiBTYW5kYm94U2V0dXBNZXRhKSA9PiB2b2lkO1xuICAgIHJlc3VsdC5fc2V0dXBNZXRhID0gbmV3IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT4oKHIpID0+IHtcbiAgICAgIHJlc29sdmVTZXR1cE1ldGEgPSByO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0Ll9vblJlYWR5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBuZWVkc1NldHVwUnVuID0gISFzZXR1cDtcbiAgICAgIGlmIChzZXR1cCkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwLmtleSk7XG4gICAgICAgIGlmICghKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IpICYmIGV4aXN0aW5nKSB7XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNldHVwIGFscmVhZHkgY29tcGxldGUgZm9yIGtleSBcIiR7c2V0dXAua2V5fVwiLCBza2lwcGluZ2BcbiAgICAgICAgICApO1xuICAgICAgICAgIG5lZWRzU2V0dXBSdW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHNldHVwIG1ldGFkYXRhIGJlZm9yZSBydW5uaW5nIHNldHVwIHNvIHRoZSB3b3JrZmxvd1xuICAgICAgLy8gY2FuIGVtaXQgdGhlIGNvcnJlY3Qgc3RhdHVzIGluZGljYXRvciB3aGlsZSBzZXR1cCBydW5zLlxuICAgICAgcmVzb2x2ZVNldHVwTWV0YSh7XG4gICAgICAgIG5lZWRzU2V0dXBSdW4sXG4gICAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3Q6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChuZWVkc1NldHVwUnVuICYmIHNldHVwKSB7XG4gICAgICAgIGRlYnVnKGBbc2FuZGJveDpzZXR1cF0gcnVubmluZyBzZXR1cC5ydW4gKGxvY2FsLCBrZXk9XCIke3NldHVwLmtleX1cIilgKTtcbiAgICAgICAgYXdhaXQgc2V0dXAucnVuKHNhbmRib3gpO1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldHVwLnNldCh7XG4gICAgICAgICAga2V5OiBzZXR1cC5rZXksXG4gICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzZXR1cCBjb21wbGV0ZSwgc3RvcmVkIHJlY29yZCAoa2V5PVwiJHtzZXR1cC5rZXl9XCIpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG9uUmVzdGFydCkge1xuICAgICAgICBkZWJ1ZyhcIltzYW5kYm94OnNldHVwXSBydW5uaW5nIG9uUmVzdGFydCAobG9jYWwpXCIpO1xuICAgICAgICBhd2FpdCBvblJlc3RhcnQoc2FuZGJveCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgImV4cG9ydCB7IFNhbmRib3ggfSBmcm9tIFwiQHZlcmNlbC9zYW5kYm94XCI7XG4iLCAiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICBwb2xsSW50ZXJ2YWxNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzdG9wQWZ0ZXJJbmFjdGl2ZU1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNuYXBzaG90QmVmb3JlVGltZW91dE1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNuYXBzaG90SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgYXV0b1N0YXJ0OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IE5ldHdvcmtQb2xpY3lTY2hlbWEgPSB6XG4gIC51bmlvbihbXG4gICAgei5saXRlcmFsKFwiYWxsb3ctYWxsXCIpLFxuICAgIHoubGl0ZXJhbChcImRlbnktYWxsXCIpLFxuICAgIHoub2JqZWN0KHtcbiAgICAgIGFsbG93OiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBzdWJuZXRzOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgIGFsbG93OiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICAgICAgZGVueTogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgXSlcbiAgLm9wdGlvbmFsKCk7XG5cbmV4cG9ydCB0eXBlIE5ldHdvcmtQb2xpY3kgPSB6LmluZmVyPHR5cGVvZiBOZXR3b3JrUG9saWN5U2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IFNhbmRib3hDb25maWdTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwidmVyY2VsXCIpLFxuICAgIHJlc291cmNlczogei5vYmplY3QoeyB2Y3B1czogei5udW1iZXIoKSB9KS5vcHRpb25hbCgpLFxuICAgIHBvcnRzOiB6LmFycmF5KHoubnVtYmVyKCkpLm9wdGlvbmFsKCksXG4gICAgbGlmZWN5Y2xlOiBWZXJjZWxMaWZlY3ljbGVDb25maWdTY2hlbWEub3B0aW9uYWwoKSxcbiAgICBuZXR3b3JrUG9saWN5OiBOZXR3b3JrUG9saWN5U2NoZW1hLFxuICB9KSxcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcImxvY2FsXCIpLFxuICAgIHBhdGg6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgfSksXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJjdXN0b21cIiksXG4gICAgdXJsOiB6LnN0cmluZygpLFxuICAgIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIFNhbmRib3hDb25maWcgPSB6LmluZmVyPHR5cGVvZiBTYW5kYm94Q29uZmlnU2NoZW1hPjtcblxuY29uc3QgR2VuZXJhdGlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbWF4U3RlcHM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdGVtcGVyYXR1cmU6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9wSzogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3BQOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGZyZXF1ZW5jeVBlbmFsdHk6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgcHJlc2VuY2VQZW5hbHR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIG1heE91dHB1dFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTZXNzaW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLFxuICB1cGRhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHJ1bklkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGxhc3RNZXNzYWdlSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm51bGxhYmxlKCksXG4gIHN5c3RlbTogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBtb2RlbDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBzYW5kYm94SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2tpbGxzRGlyOiB6LmFycmF5KHouc3RyaW5nKCkpLm51bGxhYmxlKCksXG4gIGhvb2tUb2tlbjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3RpdmVUb29sczogei5hcnJheSh6LnN0cmluZygpKS5udWxsYWJsZSgpLFxuICBnZW5lcmF0aW9uOiBHZW5lcmF0aW9uU2NoZW1hLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU3RlcFVzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGVwSW5kZXg6IHoubnVtYmVyKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLFxuICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICB0b3RhbFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVSZWFkVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVdyaXRlVG9rZW5zOiB6Lm51bWJlcigpLFxuICByZWFzb25pbmdUb2tlbnM6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFVzYWdlU3VtbWFyeVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbW9kZWw6IHouc3RyaW5nKCksXG4gIGlucHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICBvdXRwdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIHRvdGFsVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVJlYWRUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlV3JpdGVUb2tlbnM6IHoubnVtYmVyKCksXG4gIHJlYXNvbmluZ1Rva2Vuczogei5udW1iZXIoKSxcbiAgc3RlcENvdW50OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBNZXNzYWdlVXNhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0ZXBzOiB6LmFycmF5KFN0ZXBVc2FnZVNjaGVtYSksXG4gIHN1bW1hcnk6IFVzYWdlU3VtbWFyeVNjaGVtYSxcbn0pO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVXNhZ2UgPSB6LmluZmVyPHR5cGVvZiBNZXNzYWdlVXNhZ2VTY2hlbWE+O1xuZXhwb3J0IHR5cGUgVXNhZ2VTdW1tYXJ5ID0gei5pbmZlcjx0eXBlb2YgVXNhZ2VTdW1tYXJ5U2NoZW1hPjtcbmV4cG9ydCB0eXBlIFN0ZXBVc2FnZSA9IHouaW5mZXI8dHlwZW9mIFN0ZXBVc2FnZVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBNZXNzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICByb2xlOiB6LmVudW0oW1widXNlclwiLCBcImFzc2lzdGFudFwiLCBcInN5c3RlbVwiXSksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGludGVycnVwdGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgdXNhZ2U6IE1lc3NhZ2VVc2FnZVNjaGVtYS5udWxsYWJsZSgpLFxufSk7XG5cbi8qKlxuICogVGhlIGBwYXJ0YCBmaWVsZCBjb3JyZXNwb25kcyB0byBgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXWAgZnJvbSB0aGUgYGFpYCBwYWNrYWdlLlxuICogV2UgdXNlIGB6LnVua25vd24oKWAgYmVjYXVzZSB0aGUgZXhhY3Qgc2hhcGUgdmFyaWVzIGJ5IHBhcnQgdHlwZSAodGV4dCwgdG9vbC1jYWxsLFxuICogdG9vbC1yZXN1bHQsIGV0Yy4pIGFuZCBtYXkgZXZvbHZlIHdpdGggdGhlIEFJIFNESy4gVGhlIFJQQyBsYXllciBqdXN0IHBhc3NlcyBpdCB0aHJvdWdoLlxuICovXG5leHBvcnQgY29uc3QgUGFydFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIG1lc3NhZ2VJZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICBpbmRleDogei5udW1iZXIoKSxcbiAgcGFydDogei51bmtub3duKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IENvbW1hbmRSZXN1bHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0ZG91dDogei5zdHJpbmcoKSxcbiAgc3RkZXJyOiB6LnN0cmluZygpLFxuICBleGl0Q29kZTogei5udW1iZXIoKSxcbiAgY29tcGxldGVkQXQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNhbmRib3hSZWNvcmRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjb25maWc6IFNhbmRib3hDb25maWdTY2hlbWEsXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgbGFzdEFjdGl2aXR5QXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0lkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBwcm92aWRlck1ldGFkYXRhOiB6XG4gICAgLmRpc2NyaW1pbmF0ZWRVbmlvbihcInByb3ZpZGVyXCIsIFtcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgcHJvdmlkZXI6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgIHNuYXBzaG90SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgIH0pLFxuICAgIF0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgQ29tbWFuZEJhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGNvbW1hbmQ6IHouc3RyaW5nKCksXG4gIGFyZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJzdGF0dXNcIiwgW1xuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoeyBzdGF0dXM6IHoubGl0ZXJhbChcInJ1bm5pbmdcIikgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJjb21wbGV0ZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImtpbGxlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEub3B0aW9uYWwoKSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJmYWlsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbl0pO1xuXG5mdW5jdGlvbiBMaXN0UmVzdWx0U2NoZW1hPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KGl0ZW1TY2hlbWE6IFQpIHtcbiAgcmV0dXJuIHoub2JqZWN0KHtcbiAgICBpdGVtczogei5hcnJheShpdGVtU2NoZW1hKSxcbiAgICBuZXh0Q3Vyc29yOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgU2V0dXBTbmFwc2hvdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAga2V5OiB6LnN0cmluZygpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgbGFzdFVzZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0F0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG59KTtcblxuY29uc3QgbWV0aG9kcyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNlc3Npb24uc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25TY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24ubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5saXN0QnlTYW5kYm94XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTZXNzaW9uU2NoZW1hKSxcbiAgfSxcbiAgXCJzZXNzaW9uLmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2Vzc2lvbi50YWcuc2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJtZXNzYWdlLnNldFwiOiB7XG4gICAgcGFyYW1zOiBNZXNzYWdlU2NoZW1hLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShNZXNzYWdlU2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0LnNldFwiOiB7XG4gICAgcGFyYW1zOiBQYXJ0U2NoZW1hLFxuICAgIHJlc3VsdDogUGFydFNjaGVtYSxcbiAgfSxcbiAgXCJwYXJ0LmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBzZXNzaW9uSWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5zZXRcIjoge1xuICAgIHBhcmFtczogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3gubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9hc2NcIixcbiAgICAgICAgICBcImxhc3RBY3Rpdml0eUF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNhbmRib3hSZWNvcmRTY2hlbWEpLFxuICB9LFxuICBcInNhbmRib3gudGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwiY29tbWFuZC5zZXRcIjoge1xuICAgIHBhcmFtczogQ29tbWFuZFNjaGVtYSxcbiAgICByZXN1bHQ6IENvbW1hbmRTY2hlbWEsXG4gIH0sXG4gIFwiY29tbWFuZC5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGluY2x1ZGVGaW5pc2hlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoQ29tbWFuZFNjaGVtYSksXG4gIH0sXG4gIFwic2V0dXAuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2V0dXBTbmFwc2hvdFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNldHVwLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXR1cFNuYXBzaG90U2NoZW1hLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2V0dXAuYWNxdWlyZUxvY2tcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAga2V5OiB6LnN0cmluZygpLFxuICAgICAgbG9ja0lkOiB6LnN0cmluZygpLFxuICAgICAgbG9ja1RpbWVvdXRNczogei5udW1iZXIoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzYW5kYm94LmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHJlY29yZDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgeyBtZXRob2RzIH07XG5leHBvcnQgdHlwZSBTdG9yYWdlTWV0aG9kcyA9IHR5cGVvZiBtZXRob2RzO1xuZXhwb3J0IHR5cGUgTWV0aG9kTmFtZSA9IGtleW9mIFN0b3JhZ2VNZXRob2RzO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfUlBDX01FVEhPRFMgPSBPYmplY3Qua2V5cyhtZXRob2RzKSBhcyBNZXRob2ROYW1lW107XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgdHlwZSBNZXRob2ROYW1lLCBtZXRob2RzLCB0eXBlIFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5cbmV4cG9ydCB0eXBlIEhhbmRsZXJzID0ge1xuICBbSyBpbiBNZXRob2ROYW1lXTogKFxuICAgIHBhcmFtczogei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInBhcmFtc1wiXT5cbiAgKSA9PiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1JlcXVlc3QgPSB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBScGNTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+ID0ge1xuICByZXN1bHQ6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBScGNFcnJvclJlc3BvbnNlID0ge1xuICBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVzcG9uc2U8VCA9IHVua25vd24+ID0gUnBjU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgUnBjRXJyb3JSZXNwb25zZTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN0b3JhZ2VScGMoXG4gIGJvZHk6IFJwY1JlcXVlc3QsXG4gIGhhbmRsZXJzOiBIYW5kbGVyc1xuKTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zIH0gPSBib2R5O1xuXG4gIGlmICghKG1ldGhvZCBpbiBtZXRob2RzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBjb2RlOiBcIk1FVEhPRF9OT1RfRk9VTkRcIiwgbWVzc2FnZTogYFVua25vd24gbWV0aG9kOiAke21ldGhvZH1gIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2QgYXMgTWV0aG9kTmFtZTtcbiAgY29uc3Qgc2NoZW1hID0gbWV0aG9kc1ttZXRob2ROYW1lXS5wYXJhbXM7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcblxuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9QQVJBTVNcIixcbiAgICAgICAgbWVzc2FnZTogcGFyc2VkLmVycm9yLmlzc3Vlc1xuICAgICAgICAgIC5tYXAoKGkpID0+IGAke2kucGF0aC5qb2luKFwiLlwiKX06ICR7aS5tZXNzYWdlfWApXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW21ldGhvZE5hbWVdIGFzIChcbiAgICAgIHBhcmFtczogdW5rbm93blxuICAgICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHBhcnNlZC5kYXRhKTtcbiAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVEVSTkFMX0VSUk9SXCIsXG4gICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwgImV4cG9ydCB7XG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgUnBjRm4sXG59IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBScGNFcnJvclJlc3BvbnNlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5leHBvcnQge1xuICB0eXBlIE1lc3NhZ2VVc2FnZSxcbiAgdHlwZSBNZXRob2ROYW1lLFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIFNUT1JBR0VfUlBDX01FVEhPRFMsXG4gIHR5cGUgU3RlcFVzYWdlLFxuICB0eXBlIFN0b3JhZ2VNZXRob2RzLFxuICB0eXBlIFVzYWdlU3VtbWFyeSxcbn0gZnJvbSBcIi4vcnBjXCI7XG5leHBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIE1lc3NhZ2UsXG4gIFBhcnQsXG4gIFJlc29sdmVkU3RvcmFnZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU2V0dXBTbmFwc2hvdCxcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbiAgVHlwZWRTZXNzaW9uLFxuICBUeXBlZFN0b3JhZ2UsXG59IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kU25hcHNob3RTdGVwKFxuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0XG4pOiBQcm9taXNlPEVycm9yIHwgTGlmZWN5Y2xlU3RlcFJlc3VsdD4ge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBTYW5kYm94OiBWZXJjZWxTYW5kYm94U0RLIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3ZlcmNlbC1zZGtcIik7XG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vc3RvcmFnZVwiKTtcbiAgaWYgKCFpbnB1dC5ycGMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSUEMgbm90IGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgcnBjOiBpbnB1dC5ycGMsXG4gIH0pO1xuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LmlkKTtcbiAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2FuZGJveElkID1cbiAgICByZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICA6IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHJlY29yZC5jb25maWc7XG4gIGlmIChjb25maWcudHlwZSAhPT0gXCJ2ZXJjZWxcIikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgcG9sbEludGVydmFsTXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3QgaWRsZVRpbWVvdXRNcyA9XG4gICAgY29uZmlnLmxpZmVjeWNsZT8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90QmVmb3JlVGltZW91dE1zID8/IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGxhc3RBY3Rpdml0eSA9IHJlY29yZC5sYXN0QWN0aXZpdHlBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBpZiAoc2hvdWxkU25hcHNob3REdWVUb0lkbGUgfHwgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJleGl0XCIsXG4gICAgICByZWFzb246IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID8gXCJpZGxlXCIgOiBcInRpbWVvdXRcIixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBcImNvbnRpbnVlXCIsIG5leHRQb2xsTXM6IHBvbGxJbnRlcnZhbE1zIH07XG59XG4iLCAiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjaGVja0FuZFNuYXBzaG90U3RlcCB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiO1xuXG5leHBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9O1xuXG5jb25zdCBERUZBVUxUX1BPTExfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FuZGJveExpZmVjeWNsZVdvcmtmbG93KHtcbiAgaW5wdXQsXG59OiB7XG4gIGlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgbGV0IG5leHRQb2xsTXMgPSBERUZBVUxUX1BPTExfTVM7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBhd2FpdCBzbGVlcChuZXh0UG9sbE1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrQW5kU25hcHNob3RTdGVwKGlucHV0KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciB8fCByZXN1bHQuYWN0aW9uID09PSBcImV4aXRcIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV4dFBvbGxNcyA9IHJlc3VsdC5uZXh0UG9sbE1zO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBTYW5kYm94IGFzIFZlcmNlbFNhbmRib3hTREsgfSBmcm9tIFwiQHZlcmNlbC9zYW5kYm94XCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgc3RhcnQgfSBmcm9tIFwid29ya2Zsb3cvYXBpXCI7XG5pbXBvcnQgeyBTYW5kYm94RXJyb3IsIFNhbmRib3hOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFJwY0ZuLCBTYW5kYm94UmVjb3JkLCBTdG9yYWdlLCBTdG9yYWdlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIExvZ0VudHJ5LFxuICBPblJlc3RhcnQsXG4gIFNhbmRib3gsXG4gIFNhbmRib3hMaWZlY3ljbGUsXG4gIFNhbmRib3hMaWZlY3ljbGVJbnB1dCxcbiAgU2FuZGJveFNldHVwLFxuICBTYW5kYm94U3RhdHVzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvd1wiO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxTYW5kYm94Q3JlYXRlT3B0aW9ucyA9IEV4dHJhY3Q8XG4gIFBhcmFtZXRlcnM8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuY3JlYXRlPlswXSxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiAuXG4gIHt9XG4+O1xuXG5leHBvcnQgY29uc3QgVkVSQ0VMX01BWF9USU1FT1VUX01TID0gNSAqIDYwICogNjAgKiAxMDAwOyAvLyA1IGhvdXJzXG5jb25zdCBMT0NLX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMgLSBpZiBsb2NrIG9sZGVyIHRoYW4gdGhpcywgY29uc2lkZXIgaXQgc3RhbGVcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9NUyA9IDIwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgZm9yIGluLWZsaWdodCBzYW5kYm94IGNyZWF0aW9uIHByb21pc2VzLlxuICogUHJldmVudHMgcGFyYWxsZWwgcmVxdWVzdHMgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MgZnJvbSBjcmVhdGluZyBkdXBsaWNhdGUgc2FuZGJveGVzLlxuICovXG5jb25zdCBjcmVhdGVQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4+KCk7XG5cbmNvbnN0IEFDVElWSVRZX1RIUk9UVExFX01TID0gMTBfMDAwO1xuY29uc3QgbGFzdEFjdGl2aXR5U2VudCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmNvbnN0IERFRkFVTFRfVkNQVVMgPSAyO1xuXG5mdW5jdGlvbiBpc1NhbmRib3hHb25lRXJyb3IoZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXJyb3JXaXRoUmVzcG9uc2UgPSBlIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH07XG4gIGNvbnN0IGVycm9yV2l0aENhdXNlID0gZSBhcyB7IGNhdXNlPzogeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSB9O1xuXG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3JXaXRoUmVzcG9uc2UucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgIGVycm9yV2l0aENhdXNlLmNhdXNlPy5yZXNwb25zZT8uc3RhdHVzO1xuXG4gIGlmIChzdGF0dXMgPT09IDQxMCB8fCBzdGF0dXMgPT09IDQyMikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gIGlmIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgY29tbWFuZCBkYXRhXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGxvZ3NcIilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJjZWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gIHN0b3JhZ2UsXG4gIHJwYyxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwidmVyY2VsXCIgfSB9O1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdzogYm9vbGVhbjtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjPzogUnBjRm47XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59ID0+IHtcbiAgY29uc3QgeyBpZCwgY29uZmlnIH0gPSBzYW5kYm94UmVjb3JkO1xuICBjb25zdCB2Y3B1cyA9IGNvbmZpZy5yZXNvdXJjZXM/LnZjcHVzID8/IERFRkFVTFRfVkNQVVM7XG4gIGNvbnN0IHBvcnRzID0gY29uZmlnLnBvcnRzO1xuICBjb25zdCBuZXR3b3JrUG9saWN5ID0gY29uZmlnLm5ldHdvcmtQb2xpY3k7XG4gIGNvbnN0IGluaXRpYWxWZXJjZWwgPVxuICAgIHNhbmRib3hSZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gc2FuZGJveFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICA6IG51bGw7XG5cbiAgdHlwZSBTYW5kYm94SW5zdGFuY2UgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuZ2V0Pj47XG4gIGxldCBzYW5kYm94UHJvbWlzZTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBTYW5kYm94SW5zdGFuY2U+IHwgbnVsbCA9IG51bGw7XG4gIGxldCByZWNvdmVyZWRGcm9tU3RhbGUgPSBmYWxzZTtcbiAgbGV0IGNyZWF0ZWRGcm9tU25hcHNob3QgPSBmYWxzZTtcbiAgbGV0IG5lZWRzU2V0dXBSdW4gPSBmYWxzZTtcbiAgY29uc3QgSE9NRV9ESVIgPSBcIi9ob21lL3ZlcmNlbC1zYW5kYm94XCI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcG9sbEZvclNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIExPQ0tfVElNRU9VVF9NUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBMT0NLX1BPTExfSU5URVJWQUxfTVMpKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZWNvcmQubWVzc2FnZSwgY2F1c2U6IHJlY29yZCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZlcmNlbFNhbmRib3hJZCA9XG4gICAgICAgIHJlY29yZD8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGlmICh2ZXJjZWxTYW5kYm94SWQpIHtcbiAgICAgICAgcmV0dXJuIHZlcmNlbFNhbmRib3hJZDtcbiAgICAgIH1cbiAgICAgIGlmICghcmVjb3JkPy5hY3F1aXJpbmdMb2NrQXQpIHtcbiAgICAgICAgY29uc3QgZmluYWxDaGVjayA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoZmluYWxDaGVjayBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgICAgcmVhc29uOiBmaW5hbENoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZTogZmluYWxDaGVjayxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5hbFZlcmNlbFNhbmRib3hJZCA9XG4gICAgICAgICAgZmluYWxDaGVjaz8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgICAgID8gZmluYWxDaGVjay5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAoZmluYWxWZXJjZWxTYW5kYm94SWQpIHtcbiAgICAgICAgICByZXR1cm4gZmluYWxWZXJjZWxTYW5kYm94SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgcmVhc29uOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBzYW5kYm94IGNyZWF0aW9uIGJ5IGFub3RoZXIgcHJvY2Vzc1wiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnRMaWZlY3ljbGVXb3JrZmxvdyhcbiAgICB2ZXJjZWxTYW5kYm94SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWVuYWJsZUxpZmVjeWNsZVdvcmtmbG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxpZmVjeWNsZUlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgPSB7XG4gICAgICBpZCxcbiAgICAgIHZlcmNlbFNhbmRib3hJZCxcbiAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICBycGMsXG4gICAgfTtcbiAgICBhd2FpdCBzdGFydChzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3csIFt7IGlucHV0OiBsaWZlY3ljbGVJbnB1dCB9XSkuY2F0Y2goXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlCbG9ja1N0YXRlbWVudHM6IGludGVudGlvbmFsbHkgaWdub3JlZCAtIHdvcmtmbG93IHN0YXJ0IGlzIGZpcmUtYW5kLWZvcmdldFxuICAgICAgKCkgPT4ge31cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChcbiAgICBzbmFwc2hvdElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICAgIHNvdXJjZTogeyB0eXBlOiBcInNuYXBzaG90XCIsIHNuYXBzaG90SWQgfSxcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJlc2hTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgZXhlYyBsb2dpYyBhZ2FpbnN0IGEgcmF3IFZlcmNlbCBTREsgaW5zdGFuY2UuXG4gICAqIFNoYXJlZCBiZXR3ZWVuIHRoZSBtYWluIHNhbmRib3ggd3JhcHBlciBhbmQgdGVtcG9yYXJ5IHNldHVwIHNhbmRib3hlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWNPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAge1xuICAgICAgY29tbWFuZCxcbiAgICAgIGFyZ3MsXG4gICAgICBzaWduYWwsXG4gICAgfTogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXTsgc2lnbmFsPzogQWJvcnRTaWduYWwgfVxuICApOiBQcm9taXNlPFxuICAgIHwgU2FuZGJveEVycm9yXG4gICAgfCB7XG4gICAgICAgIGNvbW1hbmRJZDogc3RyaW5nO1xuICAgICAgICBsb2dzOiAoKSA9PiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PjtcbiAgICAgICAgcmVzdWx0OiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+O1xuICAgICAgfVxuICA+IHtcbiAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBpbnN0YW5jZS5ydW5Db21tYW5kKHtcbiAgICAgICAgICBjd2Q6IEhPTUVfRElSLFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgY21kOiBjb21tYW5kLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICBjb25zdCBsb2dCdWZmZXI6IExvZ0VudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgcmVzb2x2ZTogbnVsbCBhcyAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICAgICAgIGNvbnN1bWVkOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb25zdW1lTG9ncyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbG9nIG9mIG91dHB1dC5sb2dzKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID1cbiAgICAgICAgICAgICAgICBsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiXG4gICAgICAgICAgICAgICAgICA/IHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBsb2cuZGF0YSB9XG4gICAgICAgICAgICAgICAgICA6IHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBsb2cuZGF0YSB9O1xuXG4gICAgICAgICAgICAgIGlmIChsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiKSB7XG4gICAgICAgICAgICAgICAgc3Rkb3V0ICs9IGxvZy5kYXRhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsb2cuZGF0YTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxvZ0J1ZmZlci5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBTYW5kYm94IG1heSBoYXZlIGJlZW4gc3RvcHBlZCAtIGxvZ3MgZW5kcG9pbnQgcmV0dXJucyA0MjJcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICghc3RhdGUuY29uc3VtZWQgfHwgaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHlpZWxkIGxvZ0J1ZmZlcltpbmRleCsrXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb25zdW1lTG9ncy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWQgPSBhd2FpdCBvdXRwdXQud2FpdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgIGV4aXRDb2RlOiBmaW5pc2hlZC5leGl0Q29kZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGlzU2FuZGJveEdvbmVFcnJvcihlKSkge1xuICAgICAgICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IDEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBjb21tYW5kSWQ6IG91dHB1dC5jbWRJZCwgbG9ncywgcmVzdWx0IH07XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEZpbGVPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAgeyBwYXRoIH06IHsgcGF0aDogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBCdWZmZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+IGluc3RhbmNlLnJlYWRGaWxlVG9CdWZmZXIoeyBwYXRoLCBjd2Q6IEhPTUVfRElSIH0pLFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlc09uSW5zdGFuY2UoXG4gICAgaW5zdGFuY2U6IFNhbmRib3hJbnN0YW5jZSxcbiAgICBvcHRzOiB7XG4gICAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdGl2ZUZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucG9zaXguam9pbihkZXN0UGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgICAgPyBmaWxlUGF0aFxuICAgICAgICA6IHBhdGgucG9zaXguam9pbihIT01FX0RJUiwgZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIHR5cGVvZiBmaWxlLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gQnVmZmVyLmZyb20oZmlsZS5jb250ZW50KVxuICAgICAgICAgICAgOiBmaWxlLmNvbnRlbnQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgaW5zdGFuY2Uud3JpdGVGaWxlcyhuYXRpdmVGaWxlcyk7XG5cbiAgICBjb25zdCBzaGVsbFNjcmlwdHMgPSBuYXRpdmVGaWxlcy5maWx0ZXIoKGYpID0+IGYucGF0aC5lbmRzV2l0aChcIi5zaFwiKSk7XG4gICAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaG1vZFJlc3VsdCA9IGF3YWl0IGV4ZWNPbkluc3RhbmNlKGluc3RhbmNlLCB7XG4gICAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzLm1hcCgoZikgPT4gZi5wYXRoKV0sXG4gICAgICB9KTtcbiAgICAgIGlmIChjaG1vZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGNobW9kUmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgY2htb2RSZXN1bHQucmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbWluaW1hbCBTYW5kYm94IHdyYXBwZXIgYXJvdW5kIGEgcmF3IFZlcmNlbCBTREsgaW5zdGFuY2UuXG4gICAqIFVzZWQgZm9yIHJ1bm5pbmcgc2V0dXAucnVuKCkgb24gYSB0ZW1wb3Jhcnkgc2FuZGJveCBmb3Igc25hcHNob3QgY3JlYXRpb24uXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVUZW1wU2FuZGJveChpbnN0YW5jZTogU2FuZGJveEluc3RhbmNlKTogU2FuZGJveCB7XG4gICAgY29uc3QgdGVtcFNhbmRib3g6IFNhbmRib3ggPSB7XG4gICAgICBpZDogYF9fc2V0dXBfdGVtcF8ke0RhdGUubm93KCl9YCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGV4ZWM6IChvcHRzKSA9PiBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICByZWFkRmlsZTogKG9wdHMpID0+IHJlYWRGaWxlT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICBnZXREb21haW46ICgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIm5vdCBhdmFpbGFibGUgZHVyaW5nIHNldHVwXCIgfSlcbiAgICAgICAgKSxcbiAgICAgIGtpbGw6ICgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIm5vdCBhdmFpbGFibGUgZHVyaW5nIHNldHVwXCIgfSlcbiAgICAgICAgKSxcbiAgICAgIHdyaXRlRmlsZXM6IChvcHRzKSA9PiB3cml0ZUZpbGVzT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICB1cGRhdGVOZXR3b3JrUG9saWN5OiAocG9saWN5KSA9PlxuICAgICAgICBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICAgIHRyeTogKCkgPT4gaW5zdGFuY2UudXBkYXRlTmV0d29ya1BvbGljeShwb2xpY3kpLFxuICAgICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgICAgfSksXG4gICAgICB0YWc6IHtcbiAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4gKHt9KSBhcyBUVGFncyxcbiAgICAgICAgZ2V0OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIHNldDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBzZXRNYW55OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBTYW5kYm94O1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIGZvciBhIHNldHVwIHNuYXBzaG90IHRvIGJlY29tZSBhdmFpbGFibGUuIFJldHVybnMgdGhlIHNuYXBzaG90SWRcbiAgICogaWYgb25lIGFwcGVhcnMgYmVmb3JlIHRoZSBsb2NrIHRpbWVzIG91dCwgb3IgbnVsbCBpZiBpdCBkb2Vzbid0LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gcG9sbEZvclNldHVwU25hcHNob3Qoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBMT0NLX1RJTUVPVVRfTVM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgTE9DS19QT0xMX0lOVEVSVkFMX01TKSk7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChrZXkpO1xuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHJlY29yZD8uc25hcHNob3RJZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnNuYXBzaG90SWQ7XG4gICAgICB9XG4gICAgICAvLyBMb2NrIHJlbGVhc2VkIGJ1dCBubyBzbmFwc2hvdCBcdTIwMTQgY3JlYXRpb24gZmFpbGVkXG4gICAgICBpZiAoIXJlY29yZD8uYWNxdWlyaW5nTG9ja0lkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYmFja2dyb3VuZCBzYW5kYm94LCBydW5zIHNldHVwLCBzbmFwc2hvdHMgaXQsIGFuZCBzdG9yZXMgdGhlXG4gICAqIHNuYXBzaG90IElELiBVc2VzIGF0b21pYyBsb2NraW5nIHRvIGVuc3VyZSBvbmx5IG9uZSBwcm9jZXNzIGNyZWF0ZXMgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZSAtIFNraXAgdGhlIFwic25hcHNob3QgYWxyZWFkeSBleGlzdHNcIiBlYXJseSBleGl0LiBVc2VkIHdoZW5cbiAgICogICB0aGUgY2FsbGVyIGtub3dzIHRoZSBleGlzdGluZyBzbmFwc2hvdCBpcyBzdGFsZS9leHBpcmVkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2V0dXBTbmFwc2hvdChvcHRzPzoge1xuICAgIGZvcmNlPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2V0dXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2V0dXBLZXkgPSBzZXR1cC5rZXk7XG5cbiAgICAvLyBDaGVjayBpZiBzbmFwc2hvdCBhbHJlYWR5IGV4aXN0cyAoZmFzdCBwYXRoIFx1MjAxNCBhdm9pZHMgbG9jayBhdHRlbXB0KVxuICAgIGlmICghb3B0cz8uZm9yY2UpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5nZXQoc2V0dXBLZXkpO1xuICAgICAgaWYgKCEoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikgJiYgZXhpc3Rpbmc/LnNuYXBzaG90SWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF0b21pY2FsbHkgYWNxdWlyZSBsb2NrIChoYW5kbGVzIGFjdGl2ZS1sb2NrIGRldGVjdGlvbiBpbnRlcm5hbGx5KVxuICAgIGRlYnVnKGBbc2FuZGJveDpzZXR1cF0gYWNxdWlyaW5nIGxvY2sgZm9yIHNldHVwIGtleSBcIiR7c2V0dXBLZXl9XCJgKTtcbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IGxvY2tlZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuYWNxdWlyZUxvY2soXG4gICAgICBzZXR1cEtleSxcbiAgICAgIGxvY2tJZCxcbiAgICAgIExPQ0tfVElNRU9VVF9NU1xuICAgICk7XG4gICAgaWYgKGxvY2tlZCBpbnN0YW5jZW9mIEVycm9yIHx8ICFsb2NrZWQpIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIGxvY2sgbm90IGFjcXVpcmVkIGZvciBrZXkgXCIke3NldHVwS2V5fVwiIChhbm90aGVyIHByb2Nlc3MgaG9sZHMgaXQpYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZS1jaGVjazogYW5vdGhlciB3b3JrZXIgbWF5IGhhdmUgY3JlYXRlZCB0aGUgc25hcHNob3QgYmV0d2VlbiBvdXJcbiAgICAvLyBwcmUtY2hlY2sgYW5kIGxvY2sgYWNxdWlzaXRpb24uIElmIHNvLCBza2lwIHVubGVzcyBmb3JjZSAoc3RhbGUgc25hcHNob3QpLlxuICAgIGlmICghb3B0cz8uZm9yY2UgJiYgbG9ja2VkLnNuYXBzaG90SWQpIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIGFmdGVyIGxvY2sgZm9yIGtleSBcIiR7c2V0dXBLZXl9XCIsIHNraXBwaW5nYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGVtcEluc3RhbmNlOiBBd2FpdGVkPFxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESy5jcmVhdGU+XG4gICAgPiB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3Jhcnkgc2FuZGJveCBmb3Igc25hcHNob3R0aW5nLlxuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gY3JlYXRpbmcgdGVtcCBzYW5kYm94IGZvciBzbmFwc2hvdCAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuICAgICAgdGVtcEluc3RhbmNlID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICBwb3J0cyxcbiAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcFNhbmRib3ggPSBjcmVhdGVUZW1wU2FuZGJveChcbiAgICAgICAgdGVtcEluc3RhbmNlIGFzIHVua25vd24gYXMgU2FuZGJveEluc3RhbmNlXG4gICAgICApO1xuICAgICAgYXdhaXQgc2V0dXAucnVuKHRlbXBTYW5kYm94KTtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNldHVwLnJ1biBjb21wbGV0ZSwgc25hcHNob3R0aW5nIChrZXk9XCIke3NldHVwS2V5fVwiKWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRlbXBJbnN0YW5jZS5zbmFwc2hvdCgpO1xuXG4gICAgICBhd2FpdCBzdG9yYWdlLnNldHVwLnNldCh7XG4gICAgICAgIGtleTogc2V0dXBLZXksXG4gICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgIGNyZWF0ZWRBdDogbG9ja2VkLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IHN0b3JlZDogJHtzbmFwc2hvdC5zbmFwc2hvdElkfSAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuXG4gICAgICAvLyBTdG9wIHRoZSB0ZW1wIHNhbmRib3ggXHUyMDE0IG5vIGxvbmdlciBuZWVkZWQgYWZ0ZXIgc25hcHNob3R0aW5nXG4gICAgICBhd2FpdCB0ZW1wSW5zdGFuY2Uuc3RvcCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBmYWlsZWQgdG8gY3JlYXRlIHNldHVwIHNuYXBzaG90IChrZXk9XCIke3NldHVwS2V5fVwiKTpgLFxuICAgICAgICBlXG4gICAgICApO1xuICAgICAgLy8gU3RvcCB0aGUgdGVtcCBzYW5kYm94IG9uIGZhaWx1cmVcbiAgICAgIGlmICh0ZW1wSW5zdGFuY2UpIHtcbiAgICAgICAgYXdhaXQgdGVtcEluc3RhbmNlLnN0b3AoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gdXAgbG9jayBvbiBmYWlsdXJlXG4gICAgICBhd2FpdCBzdG9yYWdlLnNldHVwXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGtleTogc2V0dXBLZXksXG4gICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGxvY2tlZC5jcmVhdGVkQXQsXG4gICAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgaWYgKGluaXRpYWxWZXJjZWw/LnNhbmRib3hJZCAmJiAhcmVjb3ZlcmVkRnJvbVN0YWxlKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgLy8gU2FuZGJveCBkb2Vzbid0IGV4aXN0IHlldCwgY29udGludWUgd2l0aCBjcmVhdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGV4aXN0aW5nLm1lc3NhZ2UsIGNhdXNlOiBleGlzdGluZyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9XG4gICAgICBleGlzdGluZyBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yID8gbnVsbCA6IGV4aXN0aW5nO1xuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nUmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nUmVjb3JkLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGV4aXN0aW5nVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ1ZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQWN0aXZlTG9jayA9XG4gICAgICBleGlzdGluZ1JlY29yZD8uYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgIERhdGUubm93KCkgLSBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgPCBMT0NLX1RJTUVPVVRfTVM7XG5cbiAgICBpZiAoaGFzQWN0aXZlTG9jaykge1xuICAgICAgcmV0dXJuIHBvbGxGb3JTYW5kYm94SWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbG9ja2VkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmFjcXVpcmVMb2NrKFxuICAgICAge1xuICAgICAgICBpZCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB0YWdzOiBleGlzdGluZ1JlY29yZD8udGFncyA/PyBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmdSZWNvcmQ/LmNyZWF0ZWRBdCA/PyBzYW5kYm94UmVjb3JkLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgICAgZXhpc3RpbmdSZWNvcmQ/Lmxhc3RBY3Rpdml0eUF0ID8/IHNhbmRib3hSZWNvcmQubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbG9ja0lkLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG5vdyxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOlxuICAgICAgICAgICAgZXhpc3RpbmdWZXJjZWw/LnNuYXBzaG90SWQgPz8gaW5pdGlhbFZlcmNlbD8uc25hcHNob3RJZCA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIExPQ0tfVElNRU9VVF9NU1xuICAgICk7XG5cbiAgICBpZiAobG9ja2VkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBsb2NrZWQubWVzc2FnZSwgY2F1c2U6IGxvY2tlZCB9KTtcbiAgICB9XG4gICAgaWYgKCFsb2NrZWQpIHtcbiAgICAgIHJldHVybiBwb2xsRm9yU2FuZGJveElkKCk7XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSB0aGUgbG9ja2VkIHJlY29yZCBmb3IgdXNlIGluIHRoZSByZWxlYXNlIGhlbHBlci5cbiAgICAvLyBUUyBjYW4ndCBuYXJyb3cgYGxvY2tlZGAgaW5zaWRlIG5lc3RlZCBmdW5jdGlvbnMsIHNvIHdlIGJpbmQgaXQgaGVyZS5cbiAgICBjb25zdCBsb2NrZWRSZWNvcmQgPSBsb2NrZWQ7XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBzYW5kYm94IGxvY2sgc28gb3RoZXIgd29ya2VycyBjYW4gcmV0cnkgcXVpY2tseVxuICAgIC8vIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgbG9jayB0aW1lb3V0LlxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VTYW5kYm94TG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveFxuICAgICAgICAuc2V0KHtcbiAgICAgICAgICAuLi5sb2NrZWRSZWNvcmQsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gUmUtY2hlY2sgYWZ0ZXIgbG9jazogYW5vdGhlciB3b3JrZXIgbWF5IGhhdmUgY3JlYXRlZCB0aGUgc2FuZGJveFxuICAgIC8vIGJldHdlZW4gb3VyIGluaXRpYWwgY2hlY2sgYW5kIGxvY2sgYWNxdWlzaXRpb24uXG4gICAgY29uc3QgbG9ja2VkVmVyY2VsID1cbiAgICAgIGxvY2tlZFJlY29yZC5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGxvY2tlZFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAobG9ja2VkVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIGF3YWl0IHJlbGVhc2VTYW5kYm94TG9jaygpO1xuICAgICAgcmV0dXJuIGxvY2tlZFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3RJZCA9XG4gICAgICBsb2NrZWRWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGluaXRpYWxWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90SWQ7XG4gICAgaWYgKHNuYXBzaG90SWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3Qoc25hcHNob3RJZCk7XG4gICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHNldHVwIHNuYXBzaG90XG4gICAgaWYgKHNldHVwKSB7XG4gICAgICBsZXQgZm9yY2VSZWNyZWF0ZVNuYXBzaG90ID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR1cFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwLmtleSk7XG4gICAgICBpZiAoIShzZXR1cFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSAmJiBzZXR1cFJlY29yZCkge1xuICAgICAgICBpZiAoc2V0dXBSZWNvcmQuc25hcHNob3RJZCkge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBmb3VuZCBzZXR1cCBzbmFwc2hvdCAke3NldHVwUmVjb3JkLnNuYXBzaG90SWR9IGZvciBrZXkgXCIke3NldHVwLmtleX1cImBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3QoXG4gICAgICAgICAgICBzZXR1cFJlY29yZC5zbmFwc2hvdElkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3QgPSB0cnVlO1xuICAgICAgICAgICAgLy8gVXBkYXRlIGxhc3RVc2VkQXQgKGZpcmUtYW5kLWZvcmdldClcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0dXBcbiAgICAgICAgICAgICAgLnNldCh7XG4gICAgICAgICAgICAgICAgLi4uc2V0dXBSZWNvcmQsXG4gICAgICAgICAgICAgICAgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTbmFwc2hvdCBpcyBzdGFsZS9leHBpcmVkIFx1MjAxNCBmb3JjZSBiYWNrZ3JvdW5kIHRvIG92ZXJ3cml0ZSBpdFxuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCAke3NldHVwUmVjb3JkLnNuYXBzaG90SWR9IGZhaWxlZCAoZXhwaXJlZD8pLCB3aWxsIHJlY3JlYXRlYFxuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yY2VSZWNyZWF0ZVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBzZXR1cFJlY29yZC5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgICAgICBzZXR1cFJlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgICAgICBEYXRlLm5vdygpIC0gc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0F0IDwgTE9DS19USU1FT1VUX01TXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEFub3RoZXIgcHJvY2VzcyBpcyBjcmVhdGluZyB0aGUgc2V0dXAgc25hcHNob3QgXHUyMDE0IHdhaXQgZm9yIGl0XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IGluIHByb2dyZXNzIGZvciBrZXkgXCIke3NldHVwLmtleX1cIiwgd2FpdGluZy4uLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90SWQgPSBhd2FpdCBwb2xsRm9yU2V0dXBTbmFwc2hvdChzZXR1cC5rZXkpO1xuICAgICAgICAgIGlmIChzbmFwc2hvdElkKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCByZWFkeTogJHtzbmFwc2hvdElkfSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChzbmFwc2hvdElkKTtcbiAgICAgICAgICAgIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUG9sbCBmYWlsZWQgb3Igc25hcHNob3QgY3JlYXRpb24gZmFpbGVkIFx1MjAxNCBmYWxsIHRocm91Z2ggdG8gY29sZCBwYXRoXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE5vIHNldHVwIHNuYXBzaG90IGF2YWlsYWJsZSBcdTIwMTQgY3JlYXRlIGZyZXNoIGFuZCBydW4gc2V0dXAgbGF0ZXIuXG4gICAgICAvLyBLaWNrIG9mZiBiYWNrZ3JvdW5kIHNuYXBzaG90IGltbWVkaWF0ZWx5IHNvIGl0IHJ1bnMgaW4gcGFyYWxsZWxcbiAgICAgIC8vIHdpdGggc2V0dXAucnVuIG9uIHRoZSBzZXNzaW9uIHNhbmRib3guXG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBubyBzbmFwc2hvdCBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHdpbGwgcnVuIHNldHVwIG9uIHRoaXMgc2FuZGJveGBcbiAgICAgICk7XG4gICAgICBuZWVkc1NldHVwUnVuID0gdHJ1ZTtcbiAgICAgIGNyZWF0ZVNldHVwU25hcHNob3QoeyBmb3JjZTogZm9yY2VSZWNyZWF0ZVNuYXBzaG90IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJbc2FuZGJveDpzZXR1cF0gZmFpbGVkIHRvIGNyZWF0ZSBiYWNrZ3JvdW5kIHNuYXBzaG90OlwiLFxuICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZyZXNoUmVzdWx0ID0gYXdhaXQgY3JlYXRlRnJlc2hTYW5kYm94KCk7XG4gICAgaWYgKGZyZXNoUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGF3YWl0IHJlbGVhc2VTYW5kYm94TG9jaygpO1xuICAgIH1cbiAgICByZXR1cm4gZnJlc2hSZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRPckNyZWF0ZVNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IGNyZWF0ZVByb21pc2VzLmdldChpZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgY3JlYXRlUHJvbWlzZXMuZGVsZXRlKGlkKTtcbiAgICB9KTtcbiAgICBjcmVhdGVQcm9taXNlcy5zZXQoaWQsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9HZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgY29uc3QgdmVyY2VsU2FuZGJveElkID0gYXdhaXQgZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICBpZiAodmVyY2VsU2FuZGJveElkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+XG4gICAgICAgIFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHZlcmNlbFNhbmRib3hJZCxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSksXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgaWYgKCFzYW5kYm94UHJvbWlzZSkge1xuICAgICAgc2FuZGJveFByb21pc2UgPSBkb0dldFNhbmRib3goKTtcbiAgICB9XG4gICAgcmV0dXJuIHNhbmRib3hQcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckZyb21TdGFsZVNhbmRib3goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc2FuZGJveFByb21pc2UgPSBudWxsO1xuICAgIHJlY292ZXJlZEZyb21TdGFsZSA9IHRydWU7XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yIHx8ICFleGlzdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoZXhpc3RpbmdWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0LFxuICAgICAgICBsYXN0QWN0aXZpdHlBdDogZXhpc3RpbmcubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90SWQ6IGV4aXN0aW5nVmVyY2VsLnNuYXBzaG90SWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVMYXN0QWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VudCA9IGxhc3RBY3Rpdml0eVNlbnQuZ2V0KGlkKTtcbiAgICBpZiAobGFzdFNlbnQgJiYgbm93IC0gbGFzdFNlbnQgPCBBQ1RJVklUWV9USFJPVFRMRV9NUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QWN0aXZpdHlTZW50LnNldChpZCwgbm93KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICBjb25maWc6IGV4aXN0aW5nLmNvbmZpZyxcbiAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCxcbiAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiBleGlzdGluZ1ZlcmNlbCA/PyB7XG4gICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbGlmZWN5Y2xlOiBTYW5kYm94TGlmZWN5Y2xlID0ge1xuICAgIHN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIHNuYXBzaG90OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRhZ3M6IGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgPyBudWxsIDogKGV4aXN0aW5nPy50YWdzID8/IG51bGwpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OlxuICAgICAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yID8gbnVsbCA6IChleGlzdGluZz8uY3JlYXRlZEF0ID8/IG51bGwpLFxuICAgICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IChleGlzdGluZz8ubGFzdEFjdGl2aXR5QXQgPz8gbnVsbCksXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHN0b3A6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC5zdG9wKCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgICAgaWQ6IGV4aXN0aW5nLmlkLFxuICAgICAgICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICAgICAgICB0YWdzOiBleGlzdGluZy50YWdzLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogZXhpc3RpbmcubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRTdGF0dXM6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIGdldENyZWF0ZWRBdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC5jcmVhdGVkQXQ7XG4gICAgfSxcblxuICAgIGdldFJlbWFpbmluZ1RpbWVvdXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3gudGltZW91dDtcbiAgICB9LFxuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvRXhlYyhvcHRzOiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlUHJvbWlzZSA9IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgYXdhaXQgdXBkYXRlUHJvbWlzZTtcbiAgICByZXR1cm4gZXhlY1Jlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ICYge1xuICAgIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbiAgfSA9IHtcbiAgICBpZCxcbiAgICBjb25maWcsXG4gICAgZXhlYzogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvRXhlYyhvcHRzKTtcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFNhbmRib3hFcnJvciAmJiBpc1NhbmRib3hHb25lRXJyb3IocmVzdWx0LmNhdXNlKSkge1xuICAgICAgICBhd2FpdCByZWNvdmVyRnJvbVN0YWxlU2FuZGJveCgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZG9FeGVjKG9wdHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IGFzeW5jIChwb3J0KSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guZG9tYWluKHBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlOiBjbWRTdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbWQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGNtZC5tZXNzYWdlLCBjYXVzZTogY21kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNtZCAmJiBjbWQuc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuc2V0KHtcbiAgICAgICAgICAuLi5jbWQsXG4gICAgICAgICAgc3RhdHVzOiBcImtpbGxlZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlc3VsdC5tZXNzYWdlLCBjYXVzZTogcmVzdWx0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZWFkRmlsZTogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlYWRGaWxlT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgfSxcblxuICAgIHdyaXRlRmlsZXM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlRmlsZXNPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKTtcbiAgICB9LFxuXG4gICAgbGlmZWN5Y2xlLFxuXG4gICAgdXBkYXRlTmV0d29ya1BvbGljeTogYXN5bmMgKHBvbGljeSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiAoKSA9PiBpbnN0YW5jZS51cGRhdGVOZXR3b3JrUG9saWN5KHBvbGljeSksXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkLnRhZ3M/LltrZXkgYXMgc3RyaW5nXSBhc1xuICAgICAgICAgIHwgVFRhZ3NbdHlwZW9mIGtleV1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBsZXQgb25SZWFkeVByb21pc2U6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgbGV0IHNldHVwTWV0YVByb21pc2U6IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT4gPSBQcm9taXNlLnJlc29sdmUoe1xuICAgIG5lZWRzU2V0dXBSdW46IGZhbHNlLFxuICAgIGNyZWF0ZWRGcm9tU25hcHNob3Q6IGZhbHNlLFxuICB9KTtcblxuICBpZiAoY29uZmlnLmxpZmVjeWNsZT8uYXV0b1N0YXJ0ICE9PSBmYWxzZSkge1xuICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG5cbiAgICAvLyBSZXNvbHZlIHNldHVwIG1ldGFkYXRhIGFzIHNvb24gYXMgdGhlIHNhbmRib3ggaW5zdGFuY2UgaXMgcmVhZHlcbiAgICAvLyAoYmVmb3JlIF9vblJlYWR5IHJ1bnMgc2V0dXApLiBUaGUgd29ya2Zsb3cgcmVhZHMgdGhpcyB0byBjaG9vc2UgdGhlIHN0YXR1cyBpbmRpY2F0b3IuXG4gICAgc2V0dXBNZXRhUHJvbWlzZSA9IHNhbmRib3hQcm9taXNlLnRoZW4oKCkgPT4gKHtcbiAgICAgIG5lZWRzU2V0dXBSdW4sXG4gICAgICBjcmVhdGVkRnJvbVNuYXBzaG90LFxuICAgIH0pKTtcblxuICAgIC8vIEFmdGVyIHNhbmRib3ggaW5zdGFuY2UgaXMgcmVhZHksIHJ1biBzZXR1cCBhbmQvb3Igb25SZXN0YXJ0LlxuICAgIC8vIHNhbmRib3hQcm9taXNlIGlzIGFscmVhZHkgcmVzb2x2ZWQgYnkgdGhlIHRpbWUgLnRoZW4oKSBydW5zLFxuICAgIC8vIHNvIHNldHVwLnJ1biAvIG9uUmVzdGFydCBjYWxsaW5nIHNhbmRib3guZXhlYygpIHdvbid0IGRlYWRsb2NrLlxuICAgIG9uUmVhZHlQcm9taXNlID0gc2FuZGJveFByb21pc2UudGhlbihhc3luYyAoaW5zdGFuY2UpID0+IHtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5lZWRzU2V0dXBSdW4gJiYgc2V0dXApIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBydW5uaW5nIHNldHVwLnJ1biBvbiBzZXNzaW9uIHNhbmRib3ggKGtleT1cIiR7c2V0dXAua2V5fVwiKWBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2V0dXAucnVuKHNhbmRib3gpO1xuICAgICAgICBkZWJ1ZyhcIltzYW5kYm94OnNldHVwXSBzZXR1cC5ydW4gY29tcGxldGUgb24gc2Vzc2lvbiBzYW5kYm94XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3JlYXRlZEZyb21TbmFwc2hvdCAmJiBvblJlc3RhcnQpIHtcbiAgICAgICAgZGVidWcoXCJbc2FuZGJveDpzZXR1cF0gcnVubmluZyBvblJlc3RhcnQgKGNyZWF0ZWQgZnJvbSBzbmFwc2hvdClcIik7XG4gICAgICAgIGF3YWl0IG9uUmVzdGFydChzYW5kYm94KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNhbmRib3guX29uUmVhZHkgPSBvblJlYWR5UHJvbWlzZTtcbiAgc2FuZGJveC5fc2V0dXBNZXRhID0gc2V0dXBNZXRhUHJvbWlzZTtcbiAgcmV0dXJuIHNhbmRib3g7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBScGNGbiwgU2FuZGJveFJlY29yZCwgU3RvcmFnZSwgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuLi91dGlscy9kZWJ1Z1wiO1xuaW1wb3J0IHsgbG9jYWxTYW5kYm94IH0gZnJvbSBcIi4vYmluZGluZ3MvbG9jYWxcIjtcbmltcG9ydCB7IHZlcmNlbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy92ZXJjZWxcIjtcbmltcG9ydCB0eXBlIHsgT25SZXN0YXJ0LCBTYW5kYm94LCBTYW5kYm94U2V0dXAgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IGhvdyB0aGUgc2FuZGJveCB3YXMgc2V0IHVwLlxuICogVXNlZCBieSB0aGUgd29ya2Zsb3cgdG8gZW1pdCB0aGUgY29ycmVjdCBzdGF0dXMgaW5kaWNhdG9yLlxuICogUmV0dXJuZWQgYXMgYSBwcm9taXNlIGJlY2F1c2UgdGhlIG1ldGFkYXRhIGlzIGRldGVybWluZWQgYXN5bmNocm9ub3VzbHlcbiAqIGR1cmluZyBzYW5kYm94IGNyZWF0aW9uLCBiZWZvcmUgX29uUmVhZHkgcnVucyBzZXR1cC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FuZGJveFNldHVwTWV0YSA9IHtcbiAgLyoqIFdoZXRoZXIgc2V0dXAucnVuKCkgbmVlZHMgdG8gZXhlY3V0ZSAoY29sZCBzdGFydCwgbm8gc25hcHNob3QpLiAqL1xuICBuZWVkc1NldHVwUnVuOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgc2FuZGJveCB3YXMgY3JlYXRlZCBmcm9tIGEgc25hcHNob3QuICovXG4gIGNyZWF0ZWRGcm9tU25hcHNob3Q6IGJvb2xlYW47XG59O1xuXG50eXBlIFNhbmRib3hXaXRoTWV0YTxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPiA9IFNhbmRib3g8VFRhZ3M+ICYge1xuICBfb25SZWFkeT86IFByb21pc2U8dm9pZD47XG4gIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xufTtcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgZm9yIHNhbmRib3ggaW5zdGFuY2VzIGtleWVkIGJ5IHNhbmRib3ggcmVjb3JkIElELlxuICpcbiAqIENhY2hlcyBhbGwgc2FuZGJveCBpbnN0YW5jZXMgc28gdGhhdCB0aGUgd29ya2Zsb3cgKHdoaWNoIGNhbGxzIGdldFNhbmRib3hcbiAqIHdpdGhvdXQgc2V0dXAvb25SZXN0YXJ0KSByZXVzZXMgdGhlIHNhbWUgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2Vzc2lvbigpLFxuICogaW5jbHVkaW5nIGl0cyBfb25SZWFkeSBwcm9taXNlIGFuZCBzZXR1cCBtZXRhZGF0YS5cbiAqL1xuY29uc3Qgc2FuZGJveENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFNhbmRib3hXaXRoTWV0YT4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBzdG9yYWdlLFxuICBycGMsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93ID0gdHJ1ZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjPzogUnBjRm47XG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93PzogYm9vbGVhbjtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+IHtcbiAgY29uc3QgY2FjaGVkID0gc2FuZGJveENhY2hlLmdldChzYW5kYm94UmVjb3JkLmlkKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGRlYnVnKFwiW2dldFNhbmRib3hdIGNhY2hlIGhpdCBmb3JcIiwgc2FuZGJveFJlY29yZC5pZCk7XG4gICAgcmV0dXJuIGNhY2hlZCBhcyBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+O1xuICB9XG5cbiAgY29uc3Qgc2J4ID0gY3JlYXRlU2FuZGJveDxUVGFncz4oe1xuICAgIHNhbmRib3hSZWNvcmQsXG4gICAgc3RvcmFnZUNvbmZpZyxcbiAgICBzdG9yYWdlLFxuICAgIHJwYyxcbiAgICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyxcbiAgICBzZXR1cCxcbiAgICBvblJlc3RhcnQsXG4gIH0pO1xuXG4gIHNhbmRib3hDYWNoZS5zZXQoc2FuZGJveFJlY29yZC5pZCwgc2J4IGFzIFNhbmRib3hXaXRoTWV0YSk7XG5cbiAgcmV0dXJuIHNieDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FuZGJveDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2VDb25maWcsXG4gIHN0b3JhZ2UsXG4gIHJwYyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3cgPSB0cnVlLFxuICBzZXR1cCxcbiAgb25SZXN0YXJ0LFxufToge1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBycGM/OiBScGNGbjtcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c/OiBib29sZWFuO1xuICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xufSk6IFNhbmRib3hXaXRoTWV0YTxUVGFncz4ge1xuICBsZXQgc2J4OiBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+O1xuXG4gIHN3aXRjaCAoc2FuZGJveFJlY29yZC5jb25maWcudHlwZSkge1xuICAgIGNhc2UgXCJsb2NhbFwiOlxuICAgICAgc2J4ID0gbG9jYWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH07XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIHNldHVwLFxuICAgICAgICBvblJlc3RhcnQsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ2ZXJjZWxcIjpcbiAgICAgIHNieCA9IHZlcmNlbFNhbmRib3g8VFRhZ3M+KHtcbiAgICAgICAgc2FuZGJveFJlY29yZDogc2FuZGJveFJlY29yZCBhcyBTYW5kYm94UmVjb3JkICYge1xuICAgICAgICAgIGNvbmZpZzogeyB0eXBlOiBcInZlcmNlbFwiIH07XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIHJwYzogcnBjISxcbiAgICAgICAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gICAgICAgIHNldHVwLFxuICAgICAgICBvblJlc3RhcnQsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjdXN0b21cIjpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkN1c3RvbSBzYW5kYm94ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHNhbmRib3hSZWNvcmQuY29uZmlnIHNhdGlzZmllcyBuZXZlcjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gc2FuZGJveCB0eXBlOiAke1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogLlxuICAgICAgICAgIChzYW5kYm94UmVjb3JkLmNvbmZpZyBhcyBhbnkpLnR5cGVcbiAgICAgICAgfWBcbiAgICAgICk7XG4gIH1cblxuICAvLyBEb24ndCBhd2FpdCBfb25SZWFkeSBoZXJlIFx1MjAxNCBsZXQgdGhlIHdvcmtmbG93IGF3YWl0IGl0IHNvIGl0IGNhbiBlbWl0XG4gIC8vIHN0YXR1cyBpbmRpY2F0b3JzIG92ZXIgdGhlIHN0cmVhbSB3aGlsZSBzZXR1cCBydW5zLlxuICAvLyBJbnN0ZWFkLCB3cmFwIHNhbmRib3ggbWV0aG9kcyBzbyBhbnkgb3BlcmF0aW9uIG9uIHRoZSBzYW5kYm94IGltcGxpY2l0bHlcbiAgLy8gd2FpdHMgZm9yIHNldHVwIHRvIGNvbXBsZXRlLiBXZSByZXR1cm4gYSBORVcgb2JqZWN0IHNvIHRoYXQgc2V0dXAucnVuKCksXG4gIC8vIHdoaWNoIGhvbGRzIHRoZSBvcmlnaW5hbCBgc2J4YCB2aWEgY2xvc3VyZSwgY2FsbHMgdW53cmFwcGVkIG1ldGhvZHMgYW5kXG4gIC8vIGF2b2lkcyBhIGRlYWRsb2NrLlxuICBpZiAoIXNieC5fb25SZWFkeSkge1xuICAgIHJldHVybiBzYng7XG4gIH1cblxuICBjb25zdCBvblJlYWR5ID0gc2J4Ll9vblJlYWR5O1xuICByZXR1cm4ge1xuICAgIC4uLnNieCxcbiAgICBleGVjOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYnguZXhlYyhvcHRzKTtcbiAgICB9LFxuICAgIGdldERvbWFpbjogYXN5bmMgKHBvcnQpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LmdldERvbWFpbihwb3J0KTtcbiAgICB9LFxuICAgIHJlYWRGaWxlOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYngucmVhZEZpbGUob3B0cyk7XG4gICAgfSxcbiAgICB3cml0ZUZpbGVzOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYngud3JpdGVGaWxlcyhvcHRzKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImV4cG9ydCB0eXBlIHsgU2FuZGJveFNldHVwTWV0YSB9IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHsgZ2V0U2FuZGJveCB9IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHR5cGUge1xuICBFeGVjUmVzdWx0LFxuICBMb2dFbnRyeSxcbiAgT25SZXN0YXJ0LFxuICBTYW5kYm94LFxuICBTYW5kYm94TGlmZWN5Y2xlLFxuICBTYW5kYm94TGlmZWN5Y2xlSW5wdXQsXG4gIFNhbmRib3hTZXR1cCxcbiAgU2FuZGJveFN0YXR1cyxcbiAgVGVybWluYWwsXG4gIFRlcm1pbmFsTWV0YWRhdGEsXG4gIFZlcmNlbFNhbmRib3hMaWZlY3ljbGVDb25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBGaW5pc2hSZWFzb24gfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGRlZmluZUhvb2ssIEZhdGFsRXJyb3IsIGdldFdyaXRhYmxlIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgeyBjb21wbGV0ZU1lc3NhZ2VTdGVwLCBzdHJlYW1UZXh0U3RlcCB9IGZyb20gXCIuL2FnZW50LXdvcmtmbG93LXN0ZXBzXCI7XG5pbXBvcnQgdHlwZSB7IFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlQ29uZmlnIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UgfSBmcm9tIFwiLi91dGlscy91c2FnZVwiO1xuXG5leHBvcnQgdHlwZSBBZ2VudElucHV0ID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59O1xuXG5leHBvcnQgdHlwZSBBZ2VudE1lc3NhZ2VJbnB1dCA9IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5leHBvcnQgdHlwZSBBcHByb3ZhbFJlc3BvbnNlID0ge1xuICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGFnZW50TWVzc2FnZUhvb2sgPSBkZWZpbmVIb29rPEFnZW50TWVzc2FnZUlucHV0PigpO1xuZXhwb3J0IGNvbnN0IGFwcHJvdmFsSG9vayA9IGRlZmluZUhvb2s8QXBwcm92YWxSZXNwb25zZT4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFnZW50V29ya2Zsb3coe1xuICBpbnB1dCxcbiAgZXZlbnQsXG59OiB7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgY29uc3QgbWVzc2FnZUhvb2sgPSBhZ2VudE1lc3NhZ2VIb29rLmNyZWF0ZSh7IHRva2VuOiBpbnB1dC5zZXNzaW9uSWQgfSk7XG4gIGNvbnN0IGl0ZXJhdG9yID0gbWVzc2FnZUhvb2tbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIGxldCBwZW5kaW5nTmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICBhd2FpdCBvbk1lc3NhZ2UoeyBldmVudCwgaW5wdXQgfSkuY2F0Y2goKGUpID0+IHtcbiAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIk1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQgcGVybWFuZW50bHk6XCIsIGUubWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH0pO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVuZGluZ05leHQ7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkOiBtZXNzYWdlIGhvb2sgaXRlcmF0b3IgZG9uZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IG9uTWVzc2FnZSh7IGV2ZW50OiByZXN1bHQudmFsdWUsIGlucHV0IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiTWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZCBwZXJtYW5lbnRseTpcIiwgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgICBwZW5kaW5nTmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbk1lc3NhZ2Uoe1xuICBldmVudCxcbiAgaW5wdXQsXG59OiB7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG59KSB7XG4gIGNvbnN0IHdyaXRhYmxlID0gZ2V0V3JpdGFibGUoeyBuYW1lc3BhY2U6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCB9KTtcblxuICBsZXQgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb24gfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0UGFydEluZGV4ID0gMDtcbiAgY29uc3QgdXNhZ2VTdGVwczogU3RlcFVzYWdlW10gPSBbXTtcblxuICB3aGlsZSAoZmluaXNoUmVhc29uICE9PSBcInN0b3BcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW1UZXh0U3RlcCh7XG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZDogZXZlbnQuYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICB3cml0YWJsZSxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgICBzdGVwSW5kZXhPZmZzZXQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICBmaW5pc2hSZWFzb24gPSByZXN1bHQuZmluaXNoUmVhc29uO1xuICAgICAgbGFzdFBhcnRJbmRleCA9IHJlc3VsdC5sYXN0UGFydEluZGV4O1xuICAgICAgdXNhZ2VTdGVwcy5wdXNoKC4uLnJlc3VsdC51c2FnZVN0ZXBzKTtcblxuICAgICAgaWYgKHJlc3VsdC5tYXhTdGVwcyAhPSBudWxsICYmIHVzYWdlU3RlcHMubGVuZ3RoID49IHJlc3VsdC5tYXhTdGVwcykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdG9vbHMgbmVlZCBhcHByb3ZhbCwgc3VzcGVuZCB3b3JrZmxvdyB1bnRpbCBhbGwgYXJlIHJlc29sdmVkXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHBlbmRpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBhcHByb3ZhbEhvb2suY3JlYXRlKHsgdG9rZW46IHBlbmRpbmcuYXBwcm92YWxJZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXIgPSBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIC8vIEFsbCBob29rcyByZXNvbHZlZCBcdTIwMTQgYXBwcm92YWwgcmVzcG9uc2VzIGFyZSBub3cgaW4gc3RvcmFnZS5cbiAgICAgICAgLy8gTG9vcCBjb250aW51ZXMgXHUyMTkyIG5leHQgc3RyZWFtVGV4dFN0ZXAgcmVhZHMgdXBkYXRlZCBwYXJ0cy5cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBjb21wbGV0ZU1lc3NhZ2VTdGVwKHtcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQ6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBpbnB1dCxcbiAgICB3cml0YWJsZSxcbiAgICB1c2FnZVN0ZXBzLFxuICB9KTtcbn1cbiIsICJpbXBvcnQge1xuICBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzLFxuICBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sXG4gIHR5cGUgRmluaXNoUmVhc29uLFxuICBzdGVwQ291bnRJcyxcbiAgc3RyZWFtVGV4dCxcbiAgdHlwZSBVSU1lc3NhZ2UsXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50SW5wdXQsIEFnZW50TWVzc2FnZUlucHV0IH0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRTdGF0dXMsIFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgZGlzY292ZXJTa2lsbHNJblNhbmRib3ggfSBmcm9tIFwiLi9za2lsbHMvZGlzY292ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBmZXRjaEFwaVRvb2xzTWV0YWRhdGEsIGdldFRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL3Rvb2xzL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0IH0gZnJvbSBcIi4vdXRpbHMvcHJvbXB0LWNhY2hlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi91dGlscy91aVwiO1xuaW1wb3J0IHsgY29tcHV0ZVVzYWdlU3VtbWFyeSwgdHlwZSBTdGVwVXNhZ2UgfSBmcm9tIFwiLi91dGlscy91c2FnZVwiO1xuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBzdGF0dXMgZW1pc3Npb24uIFdyaXRlcyBhIHRyYW5zaWVudCBgZGF0YS1zdGF0dXNgIGNodW5rXG4gKiB0byB0aGUgc3RyZWFtIGFuZCBjYWxscyB0aGUgYGhvb2suc3RhdHVzYCBSUEMuIE5laXRoZXIgYmxvY2tzIHRoZSBjYWxsZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgcnBjLFxufToge1xuICB3cml0ZXI6ICgoZXZlbnQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbDtcbiAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59KSB7XG4gIHdyaXRlcj8uKHsgdHlwZTogXCJkYXRhLXN0YXR1c1wiLCBkYXRhOiBzdGF0dXMsIHRyYW5zaWVudDogdHJ1ZSB9KTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5QmxvY2tTdGF0ZW1lbnRzOiBmaXJlLWFuZC1mb3JnZXRcbiAgcnBjKHsgbWV0aG9kOiBcImhvb2suc3RhdHVzXCIsIHBhcmFtczogeyBzdGF0dXMgfSB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmNvbnN0IEJBU0VfU1lTVEVNX1BST01QVCA9XG4gIFwiWW91IGFyZSBhbiBBSSBhc3Npc3RhbnQgd2l0aCBiYXNpYyB0b29scyB0byBpbnRlcmFjdCB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIEV4cGxvcmUgYW5kIHdvcmsgZnJlZWx5LlwiO1xuXG5mdW5jdGlvbiBqb2luUHJvbXB0U2VjdGlvbnMoXG4gIC4uLnNlY3Rpb25zOiAoc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbClbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLmZpbHRlcigocykgPT4gcz8udHJpbSgpKS5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG5jb25zdCBiYWNrZ3JvdW5kUHJvY2Vzc1Byb21wdCA9IGAjIyBCYWNrZ3JvdW5kIFByb2Nlc3Nlc1xuVGhlc2UgYmFja2dyb3VuZCBwcm9jZXNzIGluc3RydWN0aW9ucyBhcmUgZm9yIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBwcm9jZXNzZXMsIGRvIG5vdCBiZSB0byB2ZXJib3NlIHRvIHRoZSB1c2VyIGFib3V0IHRoZSByZXNwb25zZSBkZXRhaWxzIGxpa2UgXCJob3cgdG8gZGVidWcgdGhlIHByb2Nlc3Mgb3V0cHV0XCIgdGhlIHVzZXIgd2lsbCBoYXZlIGFuIFVJLlxuXG5Vc2UgXFxgd2FpdFVudGlsOiAwXFxgIGZvciBkZXYgc2VydmVycyB0aGF0IHNob3VsZCBydW4gaW5kZWZpbml0ZWx5LlxuSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGNoZWNrIHRoZSBvdXRwdXQgbG9nIGFmdGVyIHJ1bm5pbmcgcHJvY2Vzc2VzIGxpa2UgZGV2IHNlcnZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgc3RhcnRlZCBjb3JyZWN0bHkuXG5cblRvIHJ1biBhIGJhY2tncm91bmQgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcIm5wbSBydW4gZGV2XCIsIHdhaXRVbnRpbDogMCB9KVxuUmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIFxcYHBpZFxcYCBhbmQgXFxgb3V0cHV0RmlsZVxcYCBwYXRoLlxuXG5UbyBjaGVjayBhIHByb2Nlc3MncyBvdXRwdXQ6XG5CYXNoKHsgY29tbWFuZDogXCJ0YWlsIC0xMDAge291dHB1dEZpbGV9XCIgfSlcblxuVG8ga2lsbCBhIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgLy8gR3JhY2VmdWxcbkJhc2goeyBjb21tYW5kOiBcImtpbGwgLTkge3BpZH1cIiB9KSAgICAvLyBGb3JjZVxuXG5UbyBsaXN0IGFsbCBwcm9jZXNzZXM6XG5CYXNoKHsgY29tbWFuZDogXCJwcyBhdXggfCBncmVwIG5vZGVcIiB9KVxuYDtcblxuZnVuY3Rpb24gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsczogU2tpbGxTdW1tYXJ5W10pOiBzdHJpbmcge1xuICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxMaW5lcyA9IHNraWxsc1xuICAgIC5tYXAoKHMpID0+IGAtICR7cy5uYW1lfTogJHtzLmRlc2NyaXB0aW9ufVxcbiAgUGF0aDogJHtzLnNraWxsTWRQYXRofWApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgcmV0dXJuIGAjIyBBdmFpbGFibGUgU2tpbGxzXG4ke3NraWxsTGluZXN9XG5cbiR7YmFja2dyb3VuZFByb2Nlc3NQcm9tcHR9XG5cbllvdSBjYW4gdXNlIHRoZSBSZWFkIHRvb2wgdG8gcmVhZCBhbnkgc2tpbGwncyBTS0lMTC5tZCBmaWxlIHRvIGxlYXJuIG1vcmUgYWJvdXQgaXQuYDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICB3cml0YWJsZSxcbiAgdXNhZ2VTdGVwcyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBnZXRTdG9yYWdlIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvY2xpZW50XCIpO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjOiBpbnB1dC5ycGMgfSk7XG5cbiAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQoYXNzaXN0YW50TWVzc2FnZUlkKTtcbiAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2U7XG4gIH1cbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlICR7YXNzaXN0YW50TWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGNvbnN0IHVzYWdlID1cbiAgICB1c2FnZVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgID8ge1xuICAgICAgICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLFxuICAgICAgICAgIHN1bW1hcnk6IGNvbXB1dGVVc2FnZVN1bW1hcnkodXNhZ2VTdGVwcyksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2Uuc2V0KHtcbiAgICAuLi5tZXNzYWdlLFxuICAgIGNvbXBsZXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIHVzYWdlLFxuICB9KTtcbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0O1xuICB9XG5cbiAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbn1cblxuY29uc3QgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIHBvbGxGb3JJbnRlcnJ1cHQoe1xuICBzdG9yYWdlLFxuICBtZXNzYWdlSWQsXG4gIHNpZ25hbCxcbiAgYWJvcnRDb250cm9sbGVyLFxufToge1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59KTogeyBmaXJzdENoZWNrOiBQcm9taXNlPHZvaWQ+IH0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjayB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dFN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICBldmVudCxcbiAgd3JpdGFibGUsXG4gIGxhc3RQYXJ0SW5kZXgsXG4gIHN0ZXBJbmRleE9mZnNldCxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbn0pOiBQcm9taXNlPHtcbiAgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb247XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG4gIHBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXTtcbiAgbWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2NsaWVudFwiKTtcbiAgY29uc3QgeyBnZXRTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3NhbmRib3hcIik7XG5cbiAgY29uc3QgcnBjID0gaW5wdXQucnBjO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjIH0pO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgcG9sbENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgeyBmaXJzdENoZWNrIH0gPSBwb2xsRm9ySW50ZXJydXB0KHtcbiAgICBzdG9yYWdlLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIHNpZ25hbDogcG9sbENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGFib3J0Q29udHJvbGxlcixcbiAgfSk7XG5cbiAgY29uc3QgW1xuICAgICxcbiAgICBtZXNzYWdlc1Jlc3VsdCxcbiAgICBwYXJ0c1Jlc3VsdCxcbiAgICB7IHNlc3Npb24sIHNhbmRib3gsIHNhbmRib3hSZWNvcmQgfSxcbiAgICBhcGlUb29sc01ldGFkYXRhLFxuICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZpcnN0Q2hlY2ssXG4gICAgc3RvcmFnZS5tZXNzYWdlLmxpc3QoaW5wdXQuc2Vzc2lvbklkKSxcbiAgICBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpLFxuICAgIHN0b3JhZ2Uuc2Vzc2lvbi5nZXQoaW5wdXQuc2Vzc2lvbklkKS50aGVuKGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNlc3Npb247XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gc2Vzc2lvbi5zYW5kYm94SWRcbiAgICAgICAgPyBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNlc3Npb24uc2FuZGJveElkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNhbmRib3hSZWNvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgYFNhbmRib3ggbm90IGZvdW5kIGZvciBzZXNzaW9uICR7aW5wdXQuc2Vzc2lvbklkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbmRib3ggPSBnZXRTYW5kYm94KHtcbiAgICAgICAgc2FuZGJveFJlY29yZCxcbiAgICAgICAgc3RvcmFnZUNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBzZXNzaW9uLCBzYW5kYm94LCBzYW5kYm94UmVjb3JkIH07XG4gICAgfSksXG4gICAgZmV0Y2hBcGlUb29sc01ldGFkYXRhKHtcbiAgICAgIHJwYyxcbiAgICB9KSxcbiAgXSk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0O1xuICB9XG4gIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcGFydHNSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgaXRlcmF0aW9uLCBtYXJrIGFsbCBtZXNzYWdlcyBpbiB0aGlzIGJhdGNoIGFzIHN0YXJ0ZWQuXG4gICAqIFVzZXIgbWVzc2FnZXMgYXJlIGFsc28gbWFya2VkIGFzIGNvbXBsZXRlZCAodGhleSdyZSBkb25lKS5cbiAgICogVGhlIGFzc2lzdGFudCBtZXNzYWdlIGlzIG9ubHkgbWFya2VkIGFzIHN0YXJ0ZWQgKHN0cmVhbWluZyBpbiBwcm9ncmVzcykuXG4gICAqL1xuICBjb25zdCBzZXRTdGFydGVkUHJvbWlzZSA9XG4gICAgbGFzdFBhcnRJbmRleCA9PT0gMFxuICAgICAgPyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgcGVuZGluZ01lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKG0pID0+IG0uY3JlYXRlZEF0IDw9IGV2ZW50LmNyZWF0ZWRBdCAmJiBtLnN0YXJ0ZWRBdCA9PT0gbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIHBlbmRpbmdNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5tZXNzYWdlLnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIC8vIE11dGFibGUgcmVmIHNvIG9uU3ViVG9vbENhbGwgY2FuIHdyaXRlIHRvIHRoZSBzdHJlYW0gb25jZSBhdmFpbGFibGVcbiAgY29uc3Qgc3RyZWFtV3JpdGVyUmVmOiB7XG4gICAgY3VycmVudDogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICB9ID0geyBjdXJyZW50OiBudWxsIH07XG5cbiAgY29uc3Qgc3ViVG9vbFBhcnRJZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFNoYXJlZCBjb3VudGVyIGZvciBwYXJ0IGluZGljZXMgXHUyMDE0IHN1Yi10b29sIHBhcnRzIGluY3JlbWVudCB0aGlzIGR1cmluZ1xuICAvLyB0aGUgc3RyZWFtLCB0aGVuIHN0ZXBQYXJ0cyBjb250aW51ZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLlxuICBsZXQgbmV4dFBhcnRJbmRleCA9IGxhc3RQYXJ0SW5kZXg7XG5cbiAgY29uc3Qgb25TdWJUb29sQ2FsbDogT25TdWJUb29sQ2FsbCA9IGFzeW5jICh0b29sTmFtZSwgdG9vbElucHV0LCBleGVjdXRlKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIG5lZWRzIGFwcHJvdmFsIHZpYSBSUENcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMoe1xuICAgICAgbWV0aG9kOiBcInRvb2xzLm5lZWRzQXBwcm92YWxcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXMgfHwgcmVzLnJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gTm8gYXBwcm92YWwgbmVlZGVkIFx1MjAxNCBqdXN0IGV4ZWN1dGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcHJvdmFsIG5lZWRlZCBcdTIwMTQgc3VyZmFjZSB0byB1c2VyIHZpYSBzdHJlYW0gZXZlbnRzXG4gICAgY29uc3QgYXBwcm92YWxJZCA9IGBqc19hcHByb3ZhbF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBganNfdGNfJHt1bGlkKCl9YDtcbiAgICBjb25zdCBwYXJ0SWQgPSBgcGFydF8ke3VsaWQoKX1gO1xuICAgIHN1YlRvb2xQYXJ0SWRzLnB1c2gocGFydElkKTtcblxuICAgIC8vIFN0b3JlIGFwcHJvdmFsLXJlcXVlc3QgcGFydFxuICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgcGFydDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke3Rvb2xOYW1lfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlcXVlc3RlZFwiLFxuICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICBhcHByb3ZhbDogeyBpZDogYXBwcm92YWxJZCB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgfSk7XG5cbiAgICAvLyBXcml0ZSBzdHJlYW0gZXZlbnRzIGZvciB0aGUgVUlcbiAgICAvLyB0b29sLWlucHV0LXN0YXJ0IGlzIHJlcXVpcmVkIFx1MjAxNCB0aGUgQUkgU0RLIGNsaWVudCBjcmVhdGVzIHRoZSB0b29sIHBhcnRcbiAgICAvLyB3aGVuIGl0IHNlZXMgdGhpcyBldmVudC4gV2l0aG91dCBpdCwgc3Vic2VxdWVudCBldmVudHMgYXJlIGlnbm9yZWQuXG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICB9KTtcbiAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgfSk7XG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICAvLyBQb2xsIHN0b3JhZ2UgZm9yIGFwcHJvdmFsIHJlc3BvbnNlXG4gICAgY29uc3QgUE9MTF9NUyA9IDUwMDtcbiAgICBjb25zdCBUSU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgVElNRU9VVF9NUykge1xuICAgICAgY29uc3QgcGFydHMgPSBhd2FpdCBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpO1xuICAgICAgaWYgKCEocGFydHMgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHBhcnRzLml0ZW1zLmZpbmQoXG4gICAgICAgICAgKHApID0+XG4gICAgICAgICAgICBwLmlkID09PSBwYXJ0SWQgJiZcbiAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgICB1cGRhdGVkLnBhcnQgYXMge1xuICAgICAgICAgICAgICBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICAgIGlmIChhcHByb3ZhbD8uYXBwcm92ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogZXJyb3IsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZW5pZWRcbiAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHthcHByb3ZhbD8ucmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBlcnJvcjogXCJBcHByb3ZhbCB0aW1lZCBvdXRcIiB9O1xuICB9O1xuXG4gIGNvbnN0IHJhd1Rvb2xzID0gZ2V0VG9vbHMoe1xuICAgIGlucHV0LFxuICAgIGV2ZW50LFxuICAgIHNhbmRib3gsXG4gICAgc2Vzc2lvbixcbiAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQsXG4gICAgYXBpVG9vbHNNZXRhZGF0YSxcbiAgICBvblN1YlRvb2xDYWxsLFxuICB9KTtcblxuICBpZiAoIXNlc3Npb24ubW9kZWwpIHtcbiAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcIlNlc3Npb24gbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgfVxuXG4gIGNvbnN0IGFsbFBhcnRzID0gcGFydHNSZXN1bHQuaXRlbXM7XG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBpbnRlcm5hbFN0ZXBJbmRleCA9IDA7XG5cbiAgY29uc3QgdG9vbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmF3VG9vbHMpLm1hcCgoW25hbWUsIHRdKSA9PiBbXG4gICAgICBuYW1lLFxuICAgICAge1xuICAgICAgICAuLi50LFxuICAgICAgICBuZWVkc0FwcHJvdmFsOiBhc3luYyAoXG4gICAgICAgICAgdG9vbElucHV0OiB1bmtub3duLFxuICAgICAgICAgIG9wdHM6IHsgdG9vbENhbGxJZDogc3RyaW5nOyBtZXNzYWdlczogdW5rbm93bltdIH1cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcnBjKHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJ0b29scy5uZWVkc0FwcHJvdmFsXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IG9wdHMudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IG9wdHMubWVzc2FnZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcmVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB0b29scy5uZWVkc0FwcHJvdmFsIFJQQyBmYWlsZWQgZm9yICR7bmFtZX06ICR7cmVzLmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcy5yZXN1bHQgYXMgYm9vbGVhbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSlcbiAgKTtcblxuICBsZXQgc2tpbGxzUmVmOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHN0cmVhbVRleHQoe1xuICAgIC8vIFBsYWNlaG9sZGVyIHRvIHBhc3MgdmFsaWRhdGlvbiBcdTIwMTQgcHJlcGFyZVN0ZXAgcmVwbGFjZXMgbWVzc2FnZXMgZW50aXJlbHkuXG4gICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LCBjb250ZW50OiBcIi5cIiB9XSxcbiAgICB0b29scyxcbiAgICBtb2RlbDogc2Vzc2lvbi5tb2RlbCxcbiAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBhY3RpdmVUb29sczogc2Vzc2lvbi5hY3RpdmVUb29scyA/PyB1bmRlZmluZWQsXG4gICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDEpLFxuICAgIHRlbXBlcmF0dXJlOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRlbXBlcmF0dXJlLFxuICAgIHRvcEs6IHNlc3Npb24uZ2VuZXJhdGlvbj8udG9wSyxcbiAgICB0b3BQOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRvcFAsXG4gICAgZnJlcXVlbmN5UGVuYWx0eTogc2Vzc2lvbi5nZW5lcmF0aW9uPy5mcmVxdWVuY3lQZW5hbHR5LFxuICAgIHByZXNlbmNlUGVuYWx0eTogc2Vzc2lvbi5nZW5lcmF0aW9uPy5wcmVzZW5jZVBlbmFsdHksXG4gICAgbWF4T3V0cHV0VG9rZW5zOiBzZXNzaW9uLmdlbmVyYXRpb24/Lm1heE91dHB1dFRva2VucyxcbiAgICBoZWFkZXJzOiBzZXNzaW9uLmdlbmVyYXRpb24/LmhlYWRlcnMsXG4gICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHtcbiAgICAgIHNlc3Npb24sXG4gICAgICBzYW5kYm94LFxuICAgICAgc3RvcmFnZSxcbiAgICAgIGNvbnRleHQ6IGV2ZW50LmNvbnRleHQsXG4gICAgfSxcbiAgICBwcmVwYXJlU3RlcDogYXN5bmMgKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgLy8gT24gdGhlIGZpcnN0IHN0ZXAsIGVtaXQgc2FuZGJveCBzdGF0dXMsIGF3YWl0IHNldHVwLCBhbmQgbG9hZCBza2lsbHMuXG4gICAgICAvLyBzdHJlYW1Xcml0ZXJSZWYgaXMgc2V0IGJ5IHRoZSBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0gZXhlY3V0b3JcbiAgICAgIC8vIHdoaWNoIHJ1bnMgYmVmb3JlIHByZXBhcmVTdGVwIChhZnRlciBgc3RhcnRgIGlzIHdyaXR0ZW4pLlxuICAgICAgaWYgKGxhc3RQYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgaWYgKHNhbmRib3guX3NldHVwTWV0YSkge1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBzYW5kYm94Ll9zZXR1cE1ldGE7XG4gICAgICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgICAgc3RhdHVzOiBtZXRhLm5lZWRzU2V0dXBSdW5cbiAgICAgICAgICAgICAgPyB7IHR5cGU6IFwic2FuZGJveC1zZXR1cC1jb2xkXCIgfVxuICAgICAgICAgICAgICA6IHsgdHlwZTogXCJzYW5kYm94LXNldHVwXCIgfSxcbiAgICAgICAgICAgIHJwYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2FuZGJveC5fb25SZWFkeSkge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3guX29uUmVhZHk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0U3RhdHVzKHtcbiAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcImxvYWRpbmctc2tpbGxzXCIgfSxcbiAgICAgICAgICBycGMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBza2lsbHMgPSBhd2FpdCBkaXNjb3ZlclNraWxsc0luU2FuZGJveCh7XG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICBza2lsbHNEaXJzOiBzZXNzaW9uLnNraWxsc0RpciB8fCBbXSxcbiAgICAgICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNraWxsc1JlZiA9IHNraWxscztcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSBhcHByb3ZlZCB0b29scyBzbyB0aGUgbW9kZWwgc2VlcyBjb21wbGV0ZSB0b29sIGNhbGwgKyByZXN1bHRcbiAgICAgIC8vIHBhaXJzLiBUaGlzIHJ1bnMgb3V0c2lkZSB0aGUgbGFzdFBhcnRJbmRleCA9PT0gMCBnYXRlIGJlY2F1c2VcbiAgICAgIC8vIGFwcHJvdmFscyBhcnJpdmUgb24gc3Vic2VxdWVudCBtZXNzYWdlcyAobGFzdFBhcnRJbmRleCA+IDApLlxuICAgICAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgcC5wYXJ0ICYmXG4gICAgICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiICYmXG4gICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuIH0gfSkuYXBwcm92YWxcbiAgICAgICAgICAgID8uYXBwcm92ZWQgPT09IHRydWVcbiAgICAgICk7XG5cbiAgICAgIGlmIChhcHByb3ZlZFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJwcm9jZXNzaW5nLWFwcHJvdmFsc1wiIH0sXG4gICAgICAgICAgcnBjLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBCdWlsZCBjb250ZXh0IG1lc3NhZ2VzIGZvciB0b29sIGV4ZWN1dGUgKGluY29tcGxldGUgY2FsbHMgZmlsdGVyZWQgb3V0KS5cbiAgICAgICAgY29uc3QgcHJlRXhlY01lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgICBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLFxuICAgICAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICAgICAgdW50aWw6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIGluY2x1ZGVRdWV1ZWQ6IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHsgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYXBwcm92ZWRQYXJ0cy5tYXAoYXN5bmMgKGFwKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFwLnBhcnQudHlwZS5zdGFydHNXaXRoKFwidG9vbC1cIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFydCA9IGFwLnBhcnQgYXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgICAgICAgeyB0eXBlOiBgdG9vbC0ke3N0cmluZ31gIH1cbiAgICAgICAgICAgID47XG4gICAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcnQudHlwZS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB0b29sRGVmID0gcmF3VG9vbHNbdG9vbE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAodG9vbERlZj8uZXhlY3V0ZSAmJiBwYXJ0LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sT3V0cHV0ID0gYXdhaXQgdG9vbERlZi5leGVjdXRlKHBhcnQuaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcmVFeGVjTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGV2ZW50LmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1hdmFpbGFibGVcIjtcbiAgICAgICAgICAgICAgICBwYXJ0Lm91dHB1dCA9IHRvb2xPdXRwdXQ7XG4gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgb3V0cHV0OiB0b29sT3V0cHV0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgICAgICAgICBwYXJ0LmVycm9yVGV4dCA9XG4gICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBlcnJvclRleHQ6IHBhcnQuZXJyb3JUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoeyAuLi5hcCwgcGFydCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBlbWl0U3RhdHVzKHtcbiAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwidGhpbmtpbmdcIiB9LFxuICAgICAgICBycGMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2tpbGxzQ29udGV4dCA9IGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHNSZWYpO1xuICAgICAgY29uc3Qgc3lzdGVtSGVhZGVyID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICBCQVNFX1NZU1RFTV9QUk9NUFQsXG4gICAgICAgIHNlc3Npb24uc3lzdGVtXG4gICAgICApO1xuICAgICAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhza2lsbHNDb250ZXh0KTtcbiAgICAgIGNvbnN0IHN5c3RlbU1lc3NhZ2VzID0gW1xuICAgICAgICAuLi4oc3lzdGVtSGVhZGVyLnRyaW0oKVxuICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtSGVhZGVyIH1dXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihzeXN0ZW1Db250ZXh0LnRyaW0oKVxuICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtQ29udGV4dCB9XVxuICAgICAgICAgIDogW10pLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdWlNZXNzYWdlcyA9IGFzc2VtYmxlVUlNZXNzYWdlcyh7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICB1bnRpbDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vZGVsTWVzc2FnZXMgPSBbXG4gICAgICAgIC4uLnN5c3RlbU1lc3NhZ2VzLFxuICAgICAgICAuLi4oYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyh1aU1lc3NhZ2VzLCB7XG4gICAgICAgICAgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSxcbiAgICAgICAgfSkpLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgcHJvbXB0Q2FjaGluZyA9IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0KHtcbiAgICAgICAgbW9kZWw6IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogbW9kZWwubW9kZWxJZCxcbiAgICAgICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBtb2RlbE1lc3NhZ2VzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2VzOiBwcm9tcHRDYWNoaW5nLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb21wdENhY2hpbmcucHJvdmlkZXJPcHRpb25zLFxuICAgICAgfTtcbiAgICB9LFxuICAgIG9uU3RlcEZpbmlzaDogKHsgdXNhZ2UgfSkgPT4ge1xuICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgIHVzYWdlU3RlcHMucHVzaCh7XG4gICAgICAgICAgc3RlcEluZGV4OiBzdGVwSW5kZXhPZmZzZXQgKyBpbnRlcm5hbFN0ZXBJbmRleCxcbiAgICAgICAgICBtb2RlbDogc2Vzc2lvbi5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIHRvdGFsVG9rZW5zOiB1c2FnZS50b3RhbFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlUmVhZFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbkRldGFpbHM/LmNhY2hlUmVhZFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlV3JpdGVUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVdyaXRlVG9rZW5zID8/IDAsXG4gICAgICAgICAgcmVhc29uaW5nVG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbkRldGFpbHM/LnJlYXNvbmluZ1Rva2VucyA/PyAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGludGVybmFsU3RlcEluZGV4Kys7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcFBhcnRzOiBVSU1lc3NhZ2VbXCJwYXJ0c1wiXSA9IFtdO1xuICBsZXQgd2FzQWJvcnRlZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgIGV4ZWN1dGU6ICh7IHdyaXRlciB9KSA9PiB7XG4gICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50ID0gKGV2ZW50OiB1bmtub3duKSA9PlxuICAgICAgICAgIHdyaXRlci53cml0ZShldmVudCBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB3cml0ZXIud3JpdGU+WzBdKTtcblxuICAgICAgICAvLyBNZXJnZSB0aGUgc3RyZWFtVGV4dCBzdHJlYW0uIHByZXBhcmVTdGVwIGhhbmRsZXMgc2FuZGJveCBzZXR1cCxcbiAgICAgICAgLy8gc2tpbGxzIGxvYWRpbmcsIGFwcHJvdmFsIGV4ZWN1dGlvbiwgYW5kIHN0YXR1cyBlbWlzc2lvbiBiZWZvcmVcbiAgICAgICAgLy8gdGhlIG1vZGVsIHN0YXJ0cyBnZW5lcmF0aW5nLlxuICAgICAgICB3cml0ZXIubWVyZ2UoXG4gICAgICAgICAgcmVzdWx0LnRvVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgICAgICAgIGdlbmVyYXRlTWVzc2FnZUlkOiAoKSA9PiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICBvbkZpbmlzaDogKHsgbWVzc2FnZXMgfSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgaGFzQXBwcm92YWxzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBQYXJ0cy5wdXNoKC4uLm0ucGFydHMpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIG0ucGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RhdGVcIiBpbiBwICYmIHAuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNBcHByb3ZhbHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoYXNBcHByb3ZhbHMpIHtcbiAgICAgICAgICAgICAgICBlbWl0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgIHdyaXRlcjogc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJuZWVkcy1hcHByb3ZhbFwiIH0sXG4gICAgICAgICAgICAgICAgICBycGMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBzdHJlYW0ucGlwZVRvKHdyaXRhYmxlLCB7IHByZXZlbnRDbG9zZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgd2FzQWJvcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbc3RyZWFtVGV4dFN0ZXBdIHN0cmVhbSBlcnJvcjpcIiwgZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcG9sbENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHN0ZXBQYXJ0cy5tYXAoYXN5bmMgKHVpUGFydCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5wYXJ0LnNldCh7XG4gICAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgICBpbmRleDogbmV4dFBhcnRJbmRleCsrLFxuICAgICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIHBhcnQ6IHVpUGFydCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSlcbiAgKTtcblxuICBpZiAoc2V0U3RhcnRlZFByb21pc2UpIHtcbiAgICBjb25zdCBzZXRTdGFydGVkUmVzdWx0ID0gYXdhaXQgc2V0U3RhcnRlZFByb21pc2U7XG4gICAgaWYgKHNldFN0YXJ0ZWRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgc2V0U3RhcnRlZFJlc3VsdDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtIG9mIHNldFN0YXJ0ZWRSZXN1bHQgPz8gW10pIHtcbiAgICAgIGlmIChtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gc3RlcFBhcnRzXG4gICAgLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyB0eXBlb2YgcCAmIHsgYXBwcm92YWw6IHsgaWQ6IHN0cmluZyB9IH0gPT5cbiAgICAgICAgXCJzdGF0ZVwiIGluIHAgJiZcbiAgICAgICAgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiAmJlxuICAgICAgICBcImFwcHJvdmFsXCIgaW4gcCAmJlxuICAgICAgICAhIShwIGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWRcbiAgICApXG4gICAgLm1hcCgocCkgPT4gKHtcbiAgICAgIGFwcHJvdmFsSWQ6IHAuYXBwcm92YWwuaWQsXG4gICAgICB0b29sTmFtZTogXCJ0eXBlXCIgaW4gcCA/IFN0cmluZyhwLnR5cGUpLnJlcGxhY2UoXCJ0b29sLVwiLCBcIlwiKSA6IFwidW5rbm93blwiLFxuICAgIH0pKTtcblxuICBjb25zdCBmaW5hbEZpbmlzaFJlYXNvbiA9IHdhc0Fib3J0ZWRcbiAgICA/IChcInN0b3BcIiBhcyBGaW5pc2hSZWFzb24pXG4gICAgOiBhd2FpdCByZXN1bHQuZmluaXNoUmVhc29uO1xuXG4gIHJldHVybiB7XG4gICAgZmluaXNoUmVhc29uOiBmaW5hbEZpbmlzaFJlYXNvbixcbiAgICBsYXN0UGFydEluZGV4OiBuZXh0UGFydEluZGV4LFxuICAgIHVzYWdlU3RlcHMsXG4gICAgcGVuZGluZ0FwcHJvdmFscyxcbiAgICBtYXhTdGVwczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhTdGVwcyxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNraWxsc0RpciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUGFyc2VkIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZyb250bWF0dGVyID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlIGNvbnRlbnQuXG4gKiBGcm9udG1hdHRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgZGVsaW1pdGVkIGJ5IGAtLS1gIG1hcmtlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYG1hcmtkb3duXG4gKiAtLS1cbiAqIG5hbWU6IGNzdlxuICogZGVzY3JpcHRpb246IEFuYWx5emUgQ1NWIGRhdGFcbiAqIC0tLVxuICogIyBDU1YgU2tpbGxcbiAqIC4uLlxuICogYGBgXG4gKlxuICogQHJldHVybnMgUGFyc2VkIG5hbWUgYW5kIGRlc2NyaXB0aW9uLCBvciBudWxsIGlmIGZyb250bWF0dGVyIGlzIG1pc3NpbmcvaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKFxuICBjb250ZW50OiBzdHJpbmdcbik6IFNraWxsRnJvbnRtYXR0ZXIgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGNvbnRlbnQudHJpbSgpO1xuXG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBlbmRNYXJrZXJJbmRleCA9IHRyaW1tZWQuaW5kZXhPZihcIi0tLVwiLCAzKTtcbiAgaWYgKGVuZE1hcmtlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXJCbG9jayA9IHRyaW1tZWQuc2xpY2UoMywgZW5kTWFya2VySW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTaW1wbGVZYW1sKGZyb250bWF0dGVyQmxvY2spO1xuXG4gIGlmICghKHBhcnNlZC5uYW1lICYmIHBhcnNlZC5kZXNjcmlwdGlvbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogU3RyaW5nKHBhcnNlZC5uYW1lKSxcbiAgICBkZXNjcmlwdGlvbjogU3RyaW5nKHBhcnNlZC5kZXNjcmlwdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHNpbXBsZSBZQU1MIGtleS12YWx1ZSBwYWlycyAoc2luZ2xlLWxpbmUgdmFsdWVzIG9ubHkpLlxuICogVGhpcyBhdm9pZHMgYWRkaW5nIGEgZnVsbCBZQU1MIHBhcnNlciBkZXBlbmRlbmN5IGZvciBiYXNpYyBmcm9udG1hdHRlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaW1wbGVZYW1sKHlhbWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgeWFtbC5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb25JbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnNsaWNlKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzIGlmIHByZXNlbnRcbiAgICBpZiAoXG4gICAgICAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBza2lsbHNEaXIgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyPzogU2tpbGxzRGlyKTogc3RyaW5nW10ge1xuICBpZiAoIXNraWxsc0Rpcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShza2lsbHNEaXIpID8gc2tpbGxzRGlyIDogW3NraWxsc0Rpcl07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB7IHBhcnNlU2tpbGxGcm9udG1hdHRlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIERpc2NvdmVycyBza2lsbHMgZnJvbSBkaXJlY3RvcmllcyBpbnNpZGUgdGhlIHNhbmRib3ggYnkgZmluZGluZyBhbmQgcGFyc2luZyBTS0lMTC5tZCBmaWxlcy5cbiAqIFNjYW5zIGVhY2ggZGlyZWN0b3J5IGZvciBzdWJkaXJlY3RvcmllcyBjb250YWluaW5nIFNLSUxMLm1kLCBleHRyYWN0cyBmcm9udG1hdHRlciBtZXRhZGF0YSxcbiAqIGFuZCByZXR1cm5zIHN1bW1hcmllcyBmb3IgdXNlIGluIHRoZSBzeXN0ZW0gcHJvbXB0LlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIHNraWxsIHN1bW1hcmllcyAoZGVkdXBsaWNhdGVkIGJ5IG5hbWUsIGZpcnN0IG9jY3VycmVuY2Ugd2lucylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94KG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyczogc3RyaW5nW107XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlycywgZGVidWcgfSA9IG9wdHM7XG5cbiAgY29uc3Qgc3VtbWFyaWVzOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuICBjb25zdCBzZWVuTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHNraWxsc0RpciBvZiBza2lsbHNEaXJzKSB7XG4gICAgY29uc3QgZGlyU3VtbWFyaWVzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeSh7XG4gICAgICBzYW5kYm94LFxuICAgICAgc2tpbGxzRGlyLFxuICAgICAgZGVidWcsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgZGlyU3VtbWFyaWVzKSB7XG4gICAgICBpZiAoIXNlZW5OYW1lcy5oYXMoc3VtbWFyeS5uYW1lKSkge1xuICAgICAgICBzZWVuTmFtZXMuYWRkKHN1bW1hcnkubmFtZSk7XG4gICAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbHNEaXI6IHN0cmluZztcbiAgZGVidWc/OiBib29sZWFuO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0gPSBvcHRzO1xuICBjb25zdCBza2lsbFBhdGhzID0gYXdhaXQgZmluZFNraWxsRmlsZXMoeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0pO1xuXG4gIGlmIChza2lsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNraWxsTWRQYXRoIG9mIHNraWxsUGF0aHMpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgcGFyc2VTa2lsbEZpbGUoeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgZGVidWcgfSk7XG4gICAgaWYgKHN1bW1hcnkpIHtcbiAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRTa2lsbEZpbGVzKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9ID0gb3B0cztcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImZpbmRcIixcbiAgICBhcmdzOiBbc2tpbGxzRGlyLCBcIi1uYW1lXCIsIFwiU0tJTEwubWRcIiwgXCItdHlwZVwiLCBcImZcIl0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gRmFpbGVkIHRvIHNjYW4gc2tpbGxzIGRpcmVjdG9yeSBcIiR7c2tpbGxzRGlyfVwiOiAke2V4ZWNSZXN1bHQubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkaXNjb3Zlcl0gZmluZCByZXN1bHQ6IGV4aXRDb2RlPSR7ZXhpdENvZGV9LCBzdGRvdXQ9XCIke3N0ZG91dC50cmltKCl9XCIsIHN0ZGVycj1cIiR7c3RkZXJyLnRyaW0oKX1cImBcbiAgICApO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIFNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGluYWNjZXNzaWJsZTogJHtza2lsbHNEaXJ9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGF0aHMgPSBzdGRvdXRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLmZpbHRlcigocCkgPT4gcC5sZW5ndGggPiAwKTtcbiAgaWYgKGRlYnVnKSB7XG4gICAgY29uc29sZS5sb2coXCJbZGlzY292ZXJdIEZvdW5kIHNraWxsIHBhdGhzOlwiLCBwYXRocyk7XG4gIH1cbiAgcmV0dXJuIHBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVNraWxsRmlsZShvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsTWRQYXRoOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeSB8IG51bGw+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgZGVidWcgfSA9IG9wdHM7XG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwiY2F0XCIsXG4gICAgYXJnczogW3NraWxsTWRQYXRoXSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBGYWlsZWQgdG8gcmVhZCBza2lsbCBmaWxlIFwiJHtza2lsbE1kUGF0aH1cIjogJHtleGVjUmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKGBbZGlzY292ZXJdIENvdWxkIG5vdCByZWFkIHNraWxsIGZpbGU6ICR7c2tpbGxNZFBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTa2lsbEZyb250bWF0dGVyKHN0ZG91dCk7XG5cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gSW52YWxpZCBvciBtaXNzaW5nIGZyb250bWF0dGVyIGluOiAke3NraWxsTWRQYXRofWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYXJzZWQubmFtZSxcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VkLmRlc2NyaXB0aW9uLFxuICAgIHNraWxsTWRQYXRoLFxuICB9O1xufVxuIiwgImltcG9ydCB7IGpzb25TY2hlbWEsIHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRJbnB1dCwgQWdlbnRNZXNzYWdlSW5wdXQgfSBmcm9tIFwiLi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgUnBjUGF5bG9hZCwgUnBjUmVzdWx0IH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB7IERFRkFVTFRfV0FJVF9VTlRJTCB9IGZyb20gXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTZXNzaW9uLCBTdG9yYWdlIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGNyZWF0ZUphdmFTY3JpcHRUb29sLCB0eXBlIE9uU3ViVG9vbENhbGwgfSBmcm9tIFwiLi9qYXZhc2NyaXB0XCI7XG5cbmNvbnN0IEFHRU5UX1BST1RPQ09MX1ZFUlNJT04gPSBcInYxXCI7XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSB7XG4gICAgcmV0dXJuIGAke2J5dGVzfWA7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX1LYDtcbiAgfVxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX1NYDtcbiAgfVxuICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9R2A7XG59XG5cbnR5cGUgSW50ZXJuYWxUb29sQ29udGV4dCA9IHtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgYXBpVG9vbHNNZXRhZGF0YToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBpbnB1dFNjaGVtYT86IHVua25vd247XG4gIH1bXTtcbiAgb25TdWJUb29sQ2FsbD86IE9uU3ViVG9vbENhbGw7XG59O1xuXG5leHBvcnQgdHlwZSBUb29sQ29udGV4dDxUQ29udGV4dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgY29udGV4dDogVENvbnRleHQ7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbHRJblRvb2xzID0ge1xuICBSZWFkOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50cyB3aXRoIG1ldGFkYXRhLiBGb3IgZmlsZXMgb3ZlciAyMDAgbGluZXMsIGF1dG9tYXRpY2FsbHkgc2hvd3MgZmlyc3QgMTAwIGxpbmVzIHVubGVzcyBhIHNwZWNpZmljIGxpbmUgcmFuZ2UgaXMgcHJvdmlkZWQuIFVzZSBzdGFydExpbmUgYW5kIGVuZExpbmUgcGFyYW1ldGVycyB0byByZWFkIHNwZWNpZmljIHBvcnRpb25zIG9mIGxhcmdlIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIHN0YXJ0TGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3RhcnRpbmcgbGluZSBudW1iZXIgKDEtaW5kZXhlZCkuIElmIHByb3ZpZGVkIHdpdGggZW5kTGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICAgIGVuZExpbmU6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkVuZGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkLCBpbmNsdXNpdmUpLiBJZiBwcm92aWRlZCB3aXRoIHN0YXJ0TGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJGaWxlIGNvbnRlbnRcIiksXG4gICAgICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgICAgICB0b3RhbExpbmVzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmaWxlXCIpLFxuICAgICAgICBsaW5lc1Nob3duOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGxpbmVzIGluY2x1ZGVkIGluIHRoaXMgcmVzcG9uc2VcIiksXG4gICAgICAgIHN0YXJ0TGluZTogei5udW1iZXIoKS5kZXNjcmliZShcIkZpcnN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBlbmRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTGFzdCBsaW5lIG51bWJlciBzaG93biAoMS1pbmRleGVkKVwiKSxcbiAgICAgICAgaXNQYWdpbmF0ZWQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciB0aGlzIGlzIGEgcGFydGlhbCB2aWV3IG9mIHRoZSBmaWxlXCIpLFxuICAgICAgICBmaWxlU2l6ZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5kZXNjcmliZShcIkh1bWFuLXJlYWRhYmxlIGZpbGUgc2l6ZSAoZS5nLiwgJzIuNUsnLCAnMS4yTScpXCIpLFxuICAgICAgICBwYXRoOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgR3JlcDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBmb3IgcGF0dGVybnMgaW4gZmlsZXMgdXNpbmcgcmlwZ3JlcC4gVXNlIHRoaXMgdG8gZmluZCBjb2RlIHBhdHRlcm5zLCBmdW5jdGlvbiBkZWZpbml0aW9ucywgaW1wb3J0cywgZXRjLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJSZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgKHJpcGdyZXAgc3ludGF4KVwiKSxcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlBhdGggdG8gc2VhcmNoIGluIChkZWZhdWx0cyB0byB3b3Jrc3BhY2Ugcm9vdCkuIENhbiBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5LlwiXG4gICAgICAgICksXG4gICAgICBmaWxlVHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRmlsZSB0eXBlIHRvIGZpbHRlciBieSAoZS5nLiwgJ3RzJywgJ2pzJywgJ3B5JywgJ21kJykuIFVzZXMgcmlwZ3JlcCdzIGJ1aWx0LWluIHR5cGUgZmlsdGVycy5cIlxuICAgICAgICApLFxuICAgICAgZ2xvYjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciBmaWxlcyAoZS5nLiwgJyoudHN4JywgJ3NyYy8qKi8qLnRzJylcIlxuICAgICAgICApLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgIC5kZXNjcmliZShcIldoZXRoZXIgc2VhcmNoIGlzIGNhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiB0cnVlKVwiKSxcbiAgICAgIGNvbnRleHRMaW5lczogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gc2hvdyBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggbWF0Y2hcIlxuICAgICAgICApLFxuICAgICAgbWF4Q291bnQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gbnVtYmVyIG9mIG1hdGNoZXMgcGVyIGZpbGUgKHVzZWZ1bCBmb3IgbGltaXRpbmcgb3V0cHV0KVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc1dpdGhNYXRjaGVzOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk9ubHkgc2hvdyBmaWxlIHBhdGhzIHRoYXQgY29udGFpbiBtYXRjaGVzLCBub3QgdGhlIG1hdGNoaW5nIGxpbmVzIHRoZW1zZWx2ZXNcIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWF0Y2hlczogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU2VhcmNoIHJlc3VsdHMgd2l0aCBmaWxlIHBhdGhzLCBsaW5lIG51bWJlcnMsIGFuZCBtYXRjaGluZyBjb250ZW50XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgbWF0Y2hDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBtYXRjaGVzIGZvdW5kXCIpLFxuICAgICAgICBmaWxlQ291bnQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgZmlsZXMgY29udGFpbmluZyBtYXRjaGVzXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBzZWFyY2hlZFwiKSxcbiAgICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdHRlcm4gdGhhdCB3YXMgc2VhcmNoZWQgZm9yXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBMaXN0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVjdXJzaXZlbHkgbGlzdCBkaXJlY3RvcnkgY29udGVudHMuIFVzZSB0aGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvZGViYXNlIHN0cnVjdHVyZSwgZmluZCBmaWxlcywgb3IgZXhwbG9yZSBkaXJlY3Rvcmllcy4gQ29udHJvbCBkZXB0aCB0byBiYWxhbmNlIGRldGFpbCB2cy4gb3ZlcnZpZXcuIERlcHRoIDEgc2hvd3MgaW1tZWRpYXRlIGNoaWxkcmVuLCBkZXB0aCAyIGluY2x1ZGVzIHN1YmRpcmVjdG9yaWVzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlBhdGggdG8gbGlzdCAoZGVmYXVsdHMgdG8gd29ya3NwYWNlIHJvb3QpXCIpLFxuICAgICAgZGVwdGg6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gZGVwdGggdG8gdHJhdmVyc2UuIENob29zZSBiYXNlZCBvbiBjb250ZXh0OiAxLTIgZm9yIHF1aWNrIG92ZXJ2aWV3LCAzLTQgZm9yIGRldGFpbGVkIGV4cGxvcmF0aW9uLCA1KyBmb3IgY29tcHJlaGVuc2l2ZSBtYXBwaW5nXCJcbiAgICAgICAgKSxcbiAgICAgIGluY2x1ZGVIaWRkZW46IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSW5jbHVkZSBoaWRkZW4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICh0aG9zZSBzdGFydGluZyB3aXRoICcuJylcIlxuICAgICAgICApLFxuICAgICAgZmlsZXNPbmx5OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcIk9ubHkgc2hvdyBmaWxlcywgbm90IGRpcmVjdG9yaWVzXCIpLFxuICAgICAgcGF0dGVybjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciByZXN1bHRzIChlLmcuLCAnKi50cycsICcqdGVzdConKVwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxpc3Rpbmc6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkRpcmVjdG9yeSB0cmVlIGxpc3Rpbmcgc2hvd2luZyBwYXRocyByZWxhdGl2ZSB0byBzZWFyY2ggcm9vdFwiXG4gICAgICAgICksXG4gICAgICBzdW1tYXJ5OiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsSXRlbXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgaXRlbXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRmlsZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgZmlsZXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRGlyczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBkaXJlY3RvcmllcyBmb3VuZFwiKSxcbiAgICAgICAgc2VhcmNoUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdGhhdCB3YXMgbGlzdGVkXCIpLFxuICAgICAgICBkZXB0aDogelxuICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTWF4aW11bSBkZXB0aCB1c2VkIChpZiBzcGVjaWZpZWQpXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBXcml0ZTogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIldyaXRlIGNvbnRlbnQgdG8gYSBmaWxlLiBDcmVhdGVzIHBhcmVudCBkaXJlY3RvcmllcyBhdXRvbWF0aWNhbGx5LiBPdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDb250ZW50IHRvIHdyaXRlIHRvIHRoZSBmaWxlXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSB3cml0ZSBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgd3JpdHRlbiBmaWxlXCIpLFxuICAgICAgYnl0ZXNXcml0dGVuOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiB3cml0ZSBmYWlsZWRcIiksXG4gICAgfSksXG4gIH0pLFxuICBFZGl0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRWRpdCBhIGZpbGUgYnkgcmVwbGFjaW5nIGFuIGV4YWN0IHN0cmluZy4gRmFpbHMgaWYgb2xkX3N0cmluZyBpcyBub3QgZm91bmQgb3IgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyAobm90IHVuaXF1ZSkuIEZvciBtdWx0aXBsZSByZXBsYWNlbWVudHMsIGNhbGwgdGhpcyB0b29sIG11bHRpcGxlIHRpbWVzIHdpdGggdW5pcXVlIGNvbnRleHQuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgb2xkX3N0cmluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRXhhY3Qgc3RyaW5nIHRvIGZpbmQgYW5kIHJlcGxhY2UgKG11c3QgYmUgdW5pcXVlIGluIGZpbGUpXCIpLFxuICAgICAgbmV3X3N0cmluZzogei5zdHJpbmcoKS5kZXNjcmliZShcIlN0cmluZyB0byByZXBsYWNlIG9sZF9zdHJpbmcgd2l0aFwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN1Y2Nlc3M6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgZWRpdCBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZWRpdGVkIGZpbGVcIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiBlZGl0IGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEJhc2g6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFeGVjdXRlcyBhIGJhc2ggY29tbWFuZCBpbnNpZGUgdGhlIHdvcmtzcGFjZS4gQ1dEIHBlcnNpc3RzIGJldHdlZW4gY29tbWFuZHMgd2l0aGluIGEgc2Vzc2lvbi4gVXNlIHdhaXRVbnRpbDowIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NlcyAoZGV2IHNlcnZlcnMpLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb21tYW5kOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVGhlIHNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZVwiKSxcbiAgICAgIHdhaXRVbnRpbDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIGBNYXggbXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbiAoZGVmYXVsdDogJHtERUZBVUxUX1dBSVRfVU5USUx9KS4gVXNlIDAgdG8gcnVuIGluIGJhY2tncm91bmQgYW5kIHJldHVybiBpbW1lZGlhdGVseS5gXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwaWQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlN5c3RlbSBQSUQgKDAgZm9yIGZvcmVncm91bmQsID4wIGZvciBiYWNrZ3JvdW5kIC0gdXNlIHRvIGtpbGwpXCJcbiAgICAgICAgKSxcbiAgICAgIG91dHB1dDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQ29tbWFuZCBzdGRvdXQrc3RkZXJyIGNvbWJpbmVkIChlbXB0eSBmb3IgYmFja2dyb3VuZClcIiksXG4gICAgICBleGl0Q29kZTogei5udW1iZXIoKS5kZXNjcmliZShcIkV4aXQgY29kZSAoLTEgZm9yIGJhY2tncm91bmQvcnVubmluZylcIiksXG4gICAgICBzdGF0dXM6IHpcbiAgICAgICAgLmVudW0oW1wicnVubmluZ1wiLCBcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiXSlcbiAgICAgICAgLmRlc2NyaWJlKFwiUHJvY2VzcyBzdGF0dXNcIiksXG4gICAgICBjd2Q6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFmdGVyIGNvbW1hbmRcIiksXG4gICAgICBvdXRwdXRGaWxlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJQYXRoIHRvIG91dHB1dCBsb2cgKGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NlcylcIiksXG4gICAgfSksXG4gIH0pLFxuICBKYXZhU2NyaXB0OiB0b29sKHtcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29kZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSmF2YVNjcmlwdCBhc3luYyBmdW5jdGlvbiBib2R5LiBgY3R4YCBpcyBpbiBzY29wZS4gTXVzdCB1c2UgYHJldHVybmAgdG8gcHJvZHVjZSBvdXRwdXQuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgfSksXG59IHNhdGlzZmllcyBUb29sU2V0O1xuXG5leHBvcnQgdHlwZSBCdWlsdEluVG9vbE5hbWUgPSBrZXlvZiB0eXBlb2YgYnVpbHRJblRvb2xzO1xuZXhwb3J0IGNvbnN0IGJ1aWx0aW5Ub29sTmFtZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKGJ1aWx0SW5Ub29scykubWFwKChbbmFtZV0pID0+IFtuYW1lLCBuYW1lXSlcbikgYXMgeyBbSyBpbiBCdWlsdEluVG9vbE5hbWVdOiBLIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb29scyhjb250ZXh0OiBJbnRlcm5hbFRvb2xDb250ZXh0KSB7XG4gIGNvbnN0IHRvb2xzOiBUb29sU2V0ID0ge1xuICAgIFtidWlsdGluVG9vbE5hbWVzLlJlYWRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5SZWFkLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgc3RhcnRMaW5lLCBlbmRMaW5lIH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbUmVhZCBUb29sXVwiLCByZXN1bHQpO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogYEVycm9yOiBGaWxlIG5vdCBmb3VuZCAtICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IDAsXG4gICAgICAgICAgICAgIGxpbmVzU2hvd246IDAsXG4gICAgICAgICAgICAgIHN0YXJ0TGluZTogMCxcbiAgICAgICAgICAgICAgZW5kTGluZTogMCxcbiAgICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogXCIwXCIsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBmdWxsQ29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gQSB0cmFpbGluZyBuZXdsaW5lIHByb2R1Y2VzIGFuIGVtcHR5IGxhc3QgZWxlbWVudCBcdTIwMTQgcmVtb3ZlIGl0XG4gICAgICAgIC8vIHNvIGxpbmUgY291bnQgbWF0Y2hlcyBgd2MgLWxgIC8gYGF3ayAnRU5Ee3ByaW50IE5SfSdgIGJlaGF2aW9yLlxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lcy5hdCgtMSkgPT09IFwiXCIpIHtcbiAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbExpbmVzID0gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChmdWxsQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVTaXplID0gZm9ybWF0RmlsZVNpemUoZmlsZUJ5dGVzKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgcmFuZ2VcbiAgICAgICAgY29uc3QgUEFHRV9TSVpFID0gMTAwO1xuICAgICAgICBsZXQgYWN0dWFsU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IGFjdHVhbEVuZDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChzdGFydExpbmUgIT09IHVuZGVmaW5lZCAmJiBlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBlbmRMaW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSBzdGFydExpbmU7XG4gICAgICAgICAgYWN0dWFsRW5kID0gTWF0aC5taW4oc3RhcnRMaW5lICsgUEFHRV9TSVpFIC0gMSwgdG90YWxMaW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodG90YWxMaW5lcyA+IDIwMCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBQQUdFX1NJWkU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IHRvdGFsTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBsaW5lIHJhbmdlICgxLWluZGV4ZWQpXG4gICAgICAgIGNvbnN0IHNsaWNlZExpbmVzID0gbGluZXMuc2xpY2UoYWN0dWFsU3RhcnQgLSAxLCBhY3R1YWxFbmQpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gc2xpY2VkTGluZXMuam9pbihcIlxcblwiKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0b3RhbExpbmVzLFxuICAgICAgICAgICAgbGluZXNTaG93bjogTWF0aC5tYXgoMCwgYWN0dWFsRW5kIC0gYWN0dWFsU3RhcnQgKyAxKSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogYWN0dWFsU3RhcnQsXG4gICAgICAgICAgICBlbmRMaW5lOiBhY3R1YWxFbmQsXG4gICAgICAgICAgICBpc1BhZ2luYXRlZDogYWN0dWFsRW5kIDwgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGZpbGVTaXplLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5HcmVwXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuR3JlcCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7XG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICBnbG9iLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlLFxuICAgICAgICBjb250ZXh0TGluZXMsXG4gICAgICAgIG1heENvdW50LFxuICAgICAgICBmaWxlc1dpdGhNYXRjaGVzLFxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tbGluZS1udW1iZXJcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0taGVhZGluZ1wiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1jb2xvclwiLCBcIm5ldmVyXCIpO1xuXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVUeXBlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS10eXBlXCIsIGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1nbG9iXCIsIGdsb2IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLUNcIiwgU3RyaW5nKGNvbnRleHRMaW5lcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLW1heC1jb3VudFwiLCBTdHJpbmcobWF4Q291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1maWxlcy13aXRoLW1hdGNoZXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwicmdcIiwgYXJncyB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0dyZXAgVG9vbF1cIiwgcmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIgJiYgIXN0ZGVyci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwibm8gbWF0Y2hlc1wiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtHcmVwIFRvb2xdIFdhcm5pbmc6ICR7c3RkZXJyfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ1bmNhdGUgb3V0cHV0IHRvIHByZXZlbnQgXCJpbnB1dCB0b28gbG9uZ1wiIGVycm9ycyAoNTBrIGNoYXJzIFx1MjI0OCAxMi41ayB0b2tlbnMpXG4gICAgICAgIGNvbnN0IE1BWF9HUkVQX09VVFBVVF9DSEFSUyA9IDUwXzAwMDtcbiAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gc3Rkb3V0O1xuICAgICAgICBsZXQgd2FzVHJ1bmNhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChmaW5hbE91dHB1dC5sZW5ndGggPiBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMpIHtcbiAgICAgICAgICBmaW5hbE91dHB1dCA9XG4gICAgICAgICAgICBmaW5hbE91dHB1dC5zbGljZSgwLCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMpICtcbiAgICAgICAgICAgIFwiXFxuXFxuW091dHB1dCB0cnVuY2F0ZWQgLSB1c2UgbW9yZSBzcGVjaWZpYyBwYXR0ZXJuIG9yIHBhdGhdXCI7XG4gICAgICAgICAgd2FzVHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVzID0gZmluYWxPdXRwdXRcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLmZpbHRlcigobCkgPT4gbC5sZW5ndGggPiAwKTtcbiAgICAgICAgY29uc3QgZmlsZUNvdW50ID0gZmlsZXNXaXRoTWF0Y2hlc1xuICAgICAgICAgID8gbGluZXMubGVuZ3RoXG4gICAgICAgICAgOiBuZXcgU2V0KFxuICAgICAgICAgICAgICBsaW5lc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGwpID0+ICFsLnN0YXJ0c1dpdGgoXCIgXCIpICYmIGwuaW5jbHVkZXMoXCI6XCIpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGwpID0+IGwuc3BsaXQoXCI6XCIpWzBdKVxuICAgICAgICAgICAgKS5zaXplO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgbWF0Y2hDb3VudDogZmlsZXNXaXRoTWF0Y2hlc1xuICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgOiBsaW5lcy5maWx0ZXIoKGwpID0+IGwuaW5jbHVkZXMoXCI6XCIpKS5sZW5ndGgsXG4gICAgICAgICAgICBmaWxlQ291bnQsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgcGF0dGVybixcbiAgICAgICAgICAgIHdhc1RydW5jYXRlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hdGNoZXM6IGZpbmFsT3V0cHV0IHx8IFwiKG5vIG1hdGNoZXMgZm91bmQpXCIsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkxpc3RdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5MaXN0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgZGVwdGgsIGluY2x1ZGVIaWRkZW4sIGZpbGVzT25seSwgcGF0dGVybiB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdGggPSBwYXRoID8/IFwiLlwiO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5leGVjKHtcbiAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBzZXQgLWVcbiAgICAgICAgICAgIFNFQVJDSF9QQVRIPVwiJDFcIlxuICAgICAgICAgICAgREVQVEg9XCIkMlwiXG4gICAgICAgICAgICBJTkNMVURFX0hJRERFTj1cIiQzXCJcbiAgICAgICAgICAgIEZJTEVTX09OTFk9XCIkNFwiXG4gICAgICAgICAgICBQQVRURVJOPVwiJDVcIlxuXG4gICAgICAgICAgICAjIEJ1aWxkIGZpbmQgY29tbWFuZCBhcmd1bWVudHNcbiAgICAgICAgICAgIEZJTkRfQVJHUz1cIlwiXG4gICAgICAgICAgICBbIC1uIFwiJERFUFRIXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1tYXhkZXB0aCAkREVQVEhcIlxuICAgICAgICAgICAgWyBcIiRJTkNMVURFX0hJRERFTlwiICE9IFwidHJ1ZVwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG4gICAgICAgICAgICBbIFwiJEZJTEVTX09OTFlcIiA9IFwidHJ1ZVwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtdHlwZSBmXCJcbiAgICAgICAgICAgIFsgLW4gXCIkUEFUVEVSTlwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtbmFtZSAnJFBBVFRFUk4nXCJcblxuICAgICAgICAgICAgIyBHZXQgbGlzdGluZ1xuICAgICAgICAgICAgTElTVElORz0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRGSU5EX0FSR1NcIiAyPi9kZXYvbnVsbCB8IHNvcnQpXG5cbiAgICAgICAgICAgICMgR2V0IGNvdW50c1xuICAgICAgICAgICAgQ09VTlRfQVJHUz1cIlwiXG4gICAgICAgICAgICBbIC1uIFwiJERFUFRIXCIgXSAmJiBDT1VOVF9BUkdTPVwiJENPVU5UX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBDT1VOVF9BUkdTPVwiJENPVU5UX0FSR1MgISAtcGF0aCAnKi8uKidcIlxuXG4gICAgICAgICAgICBGSUxFX0NPVU5UPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJENPVU5UX0FSR1MgLXR5cGUgZlwiIDI+L2Rldi9udWxsIHwgd2MgLWwpXG4gICAgICAgICAgICBESVJfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBkXCIgMj4vZGV2L251bGwgfCB3YyAtbClcblxuICAgICAgICAgICAgIyBPdXRwdXQ6IGNvdW50cyBmaXJzdCwgdGhlbiBsaXN0aW5nXG4gICAgICAgICAgICBlY2hvIFwiJEZJTEVfQ09VTlR8JERJUl9DT1VOVFwiXG4gICAgICAgICAgICBlY2hvIFwifHx8TElTVElOR3x8fFwiXG4gICAgICAgICAgICBlY2hvIFwiJExJU1RJTkdcIiB8IHNlZCBcInN8XiRTRUFSQ0hfUEFUSHwufFwiXG4gICAgICAgICAgYCxcbiAgICAgICAgICAgIFwiLS1cIixcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aD8udG9TdHJpbmcoKSB8fCBcIlwiLFxuICAgICAgICAgICAgaW5jbHVkZUhpZGRlbiA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgZmlsZXNPbmx5ID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBwYXR0ZXJuIHx8IFwiXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltMaXN0IFRvb2xdXCIsIHJlc3VsdCk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcblxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbTGlzdCBUb29sXSBzdGRlcnI6ICR7c3RkZXJyfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2NvdW50c0xpbmUsIC4uLnJlc3RdID0gc3Rkb3V0LnNwbGl0KFwifHx8TElTVElOR3x8fFwiKTtcbiAgICAgICAgY29uc3QgbGlzdGluZyA9IHJlc3Quam9pbihcInx8fExJU1RJTkd8fHxcIikudHJpbSgpO1xuICAgICAgICBjb25zdCBbZmlsZUNvdW50U3RyLCBkaXJDb3VudFN0cl0gPSBjb3VudHNMaW5lLnRyaW0oKS5zcGxpdChcInxcIik7XG5cbiAgICAgICAgY29uc3QgdG90YWxGaWxlcyA9IE51bWJlci5wYXJzZUludChmaWxlQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCB0b3RhbERpcnMgPSBOdW1iZXIucGFyc2VJbnQoZGlyQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGxpc3Rpbmcuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxGaWxlcyxcbiAgICAgICAgICAgIHRvdGFsRGlycyxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxpc3RpbmcsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLldyaXRlXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuV3JpdGUsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aC5zbGljZSgxKSA6IHBhdGg7XG4gICAgICAgIGNvbnN0IGRpciA9IGZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKVxuICAgICAgICAgID8gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKVxuICAgICAgICAgIDogXCIuXCI7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGZpbGVQYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGRpciAhPT0gXCIuXCIpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJta2RpclwiLCBhcmdzOiBbXCItcFwiLCBkaXJdIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGNvbnRleHQuc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlTmFtZSwgY29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBkaXIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgYnl0ZXNXcml0dGVuOiBCdWZmZXIuYnl0ZUxlbmd0aChjb250ZW50LCBcInV0ZjhcIiksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IDAsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JNc2csXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5FZGl0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuRWRpdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIG9sZF9zdHJpbmcsIG5ld19zdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3gucmVhZEZpbGUoeyBwYXRoOiBmaWxlUGF0aCB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gY29udGVudC5zcGxpdChvbGRfc3RyaW5nKS5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmIChvY2N1cnJlbmNlcyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IFwib2xkX3N0cmluZyBub3QgZm91bmQgaW4gZmlsZVwiLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogYG9sZF9zdHJpbmcgYXBwZWFycyAke29jY3VycmVuY2VzfSB0aW1lcyBpbiBmaWxlIChtdXN0IGJlIHVuaXF1ZSkuIEluY2x1ZGUgbW9yZSBzdXJyb3VuZGluZyBjb250ZXh0IHRvIG1ha2UgdGhlIG1hdGNoIHVuaXF1ZS5gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKG9sZF9zdHJpbmcsIG5ld19zdHJpbmcpO1xuICAgICAgICBjb25zdCBkaXIgPSBmaWxlUGF0aC5pbmNsdWRlcyhcIi9cIilcbiAgICAgICAgICA/IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIilcbiAgICAgICAgICA6IFwiLlwiO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBmaWxlUGF0aDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNvbnRleHQuc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlTmFtZSwgY29udGVudDogbmV3Q29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBkaXIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiBlcnJvck1zZyB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkJhc2hdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5CYXNoLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVQcm9jZXNzTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NNYW5hZ2VyID0gY3JlYXRlUHJvY2Vzc01hbmFnZXIoe1xuICAgICAgICAgIHNhbmRib3g6IGNvbnRleHQuc2FuZGJveCxcbiAgICAgICAgICBzZXNzaW9uSWQ6IGNvbnRleHQuaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBwcm9jZXNzTWFuYWdlci5pbml0KCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NNYW5hZ2VyLnJ1bih7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG5cbiAgaWYgKGNvbnRleHQuYXBpVG9vbHNNZXRhZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgYXBpVG9vbHMgPSBidWlsZEFwaVRvb2xzKHtcbiAgICAgIHJwYzogY29udGV4dC5pbnB1dC5ycGMsXG4gICAgICBtZXRhZGF0YTogY29udGV4dC5hcGlUb29sc01ldGFkYXRhLFxuICAgICAgc2Vzc2lvbjogY29udGV4dC5zZXNzaW9uLFxuICAgICAgc2FuZGJveFJlY29yZDogY29udGV4dC5zYW5kYm94UmVjb3JkLFxuICAgICAgY29udGV4dDogY29udGV4dC5ldmVudC5jb250ZXh0LFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24odG9vbHMsIGFwaVRvb2xzKTtcbiAgfVxuXG4gIHRvb2xzW2J1aWx0aW5Ub29sTmFtZXMuSmF2YVNjcmlwdF0gPSBjcmVhdGVKYXZhU2NyaXB0VG9vbCh7XG4gICAgdG9vbHMsXG4gICAgc2Vzc2lvbjogY29udGV4dC5zZXNzaW9uLFxuICAgIHNhbmRib3g6IGNvbnRleHQuc2FuZGJveCxcbiAgICBvblN1YlRvb2xDYWxsOiBjb250ZXh0Lm9uU3ViVG9vbENhbGwsXG4gIH0pO1xuXG4gIHJldHVybiB0b29scztcbn1cblxudHlwZSBBcGlUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEFwaVRvb2xzTWV0YWRhdGEob3B0czoge1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0Pjtcbn0pOiBQcm9taXNlPEFwaVRvb2xNZXRhZGF0YVtdPiB7XG4gIGNvbnN0IHsgcnBjIH0gPSBvcHRzO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyh7IG1ldGhvZDogXCJ0b29scy5saXN0XCIsIHBhcmFtczoge30gfSk7XG5cbiAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW2FnZW50XSBGYWlsZWQgdG8gZmV0Y2ggdG9vbHM6XCIsIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIChyZXN1bHQucmVzdWx0IGFzIEFwaVRvb2xNZXRhZGF0YVtdKSA/PyBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXBpVG9vbHMob3B0czoge1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0PjtcbiAgbWV0YWRhdGE6IEFwaVRvb2xNZXRhZGF0YVtdO1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn0pOiBUb29sU2V0IHtcbiAgY29uc3QgeyBycGMsIG1ldGFkYXRhLCBzZXNzaW9uLCBzYW5kYm94UmVjb3JkLCBjb250ZXh0IH0gPSBvcHRzO1xuICBjb25zdCB0b29sczogVG9vbFNldCA9IHt9O1xuXG4gIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhZGF0YSkge1xuICAgIHRvb2xzW21ldGEubmFtZV0gPSB0b29sKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhLmRlc2NyaXB0aW9uID8/IGBDdXN0b20gdG9vbDogJHttZXRhLm5hbWV9YCxcbiAgICAgIGlucHV0U2NoZW1hOiBtZXRhLmlucHV0U2NoZW1hXG4gICAgICAgID8ganNvblNjaGVtYShtZXRhLmlucHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWE+WzBdKVxuICAgICAgICA6IHoub2JqZWN0KHt9KSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoe1xuICAgICAgICAgIG1ldGhvZDogXCJ0b29scy5leGVjdXRlXCIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBuYW1lOiBtZXRhLm5hbWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vbCBleGVjdXRpb24gZmFpbGVkOiAke3Jlc3VsdC5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0b29scztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBcGlVcmwob3B0czogeyBhcGk6IHN0cmluZyB8IHVuZGVmaW5lZCB9KTogc3RyaW5nIHtcbiAgbGV0IG9yaWdpbiA9IFwiXCI7XG4gIGxldCBwYXRoID0gYC8ud2VsbC1rbm93bi9hZ2VudC8ke0FHRU5UX1BST1RPQ09MX1ZFUlNJT059YDtcblxuICBpZiAob3B0cy5hcGkpIHtcbiAgICBpZiAob3B0cy5hcGkuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIHBhdGggPSBvcHRzLmFwaTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2VlIGlmIGl0J3MgZnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRzLmFwaSk7XG4gICAgICAgIG9yaWdpbiA9IHVybC5vcmlnaW47XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoO1xuICAgICAgICBpZiAoZnVsbFBhdGguc3RhcnRzV2l0aChcIi9cIikgJiYgZnVsbFBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgcGF0aCA9IGZ1bGxQYXRoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3JpZ2luKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIG9yaWdpbiA9IGBodHRwOi8vbG9jYWxob3N0OiR7XG4gICAgICAgIHByb2Nlc3MuZW52LlBPUlQgPz8gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfUE9SVCA/PyAzMDAwXG4gICAgICB9YDtcbiAgICB9XG4gICAgY29uc3QgdmVyY2VsVXJsID1cbiAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgPz8gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfVkVSQ0VMX1VSTDtcbiAgICBpZiAodmVyY2VsVXJsKSB7XG4gICAgICBvcmlnaW4gPSBgaHR0cHM6Ly8ke3ZlcmNlbFVybH1gO1xuICAgIH1cbiAgfVxuXG4gIGlmICghb3JpZ2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJbYWdlbnRdIENvdWxkbid0IGRldGVybWluZSBBUEkgb3JpZ2luIChubyBvcmlnaW4gZGV0ZWN0ZWQgaW4gYGFwaWAgb3B0aW9uIGFuZCBubyBWRVJDRUxfVVJMIHNldClcIlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYCR7b3JpZ2lufSR7cGF0aH1gO1xufVxuIiwgImltcG9ydCB7IHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb24gfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgYnVpbHRJblRvb2xzIH0gZnJvbSBcIi5cIjtcblxuZXhwb3J0IGNvbnN0IEpBVkFTQ1JJUFRfVE9PTF9OQU1FID0gXCJKYXZhU2NyaXB0XCI7XG5cbmV4cG9ydCB0eXBlIFN1YlRvb2xDYWxsUmVzdWx0ID0geyByZXN1bHQ/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgT25TdWJUb29sQ2FsbCA9IChcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgaW5wdXQ6IHVua25vd24sXG4gIGV4ZWN1dGU6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbikgPT4gUHJvbWlzZTxTdWJUb29sQ2FsbFJlc3VsdD47XG5cbmNvbnN0IFJFUVVFU1RfTUFSS0VSX1NUQVJUID0gXCJfX1RPT0xfUkVRVUVTVF9fXCI7XG5jb25zdCBSRVFVRVNUX01BUktFUl9FTkQgPSBcIl9fVE9PTF9SRVFVRVNUX0VORF9fXCI7XG5jb25zdCBFWEVDVVRJT05fVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogVGhlIHJ1bm5lciBzY3JpcHQgaXMgd3JpdHRlbiB0byB0aGUgc2FuZGJveCBhbmQgZXhlY3V0ZWQgdmlhIE5vZGUuanMuXG4gKiBJdCByZWFkcyB0aGUgbW9kZWwncyBjb2RlIGZyb20gY29kZS5qcywgc2V0cyB1cCBjdHgudG9vbHMgYXMgUlBDIHByb3hpZXNcbiAqIChyZXF1ZXN0cyBzZW50IHZpYSBzdGRlcnIgbWFya2VycywgcmVzcG9uc2VzIHBvbGxlZCBmcm9tIGZpbGVzKSwgZXhlY3V0ZXNcbiAqIHRoZSBjb2RlLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gc3Rkb3V0IGFzIEpTT04uXG4gKi9cbmNvbnN0IFJVTk5FUl9TQ1JJUFQgPSBgXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMsIHVubGlua1N5bmMsIG1rZGlyU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5jb25zdCBTQ1JJUFRfRElSID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgVE9PTF9DQUxMX1RJTUVPVVRfTVMgPSAzMDBfMDAwO1xuXG5sZXQgcmVxQ291bnRlciA9IDA7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxUb29sKG5hbWUsIGlucHV0KSB7XG4gIGNvbnN0IGlkID0gJ3JlcV8nICsgKCsrcmVxQ291bnRlcikgKyAnXycgKyBEYXRlLm5vdygpO1xuICBjb25zdCByZXNwb25zZUZpbGUgPSBqb2luKFNDUklQVF9ESVIsIGlkICsgJy5yZXNwb25zZS5qc29uJyk7XG5cbiAgY29uc3QgcmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHsgaWQsIHRvb2w6IG5hbWUsIGlucHV0IH0pO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnJHtSRVFVRVNUX01BUktFUl9TVEFSVH0nICsgcmVxdWVzdCArICcke1JFUVVFU1RfTUFSS0VSX0VORH0nICsgJ1xcXFxuJyk7XG5cbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICB3aGlsZSAoIWV4aXN0c1N5bmMocmVzcG9uc2VGaWxlKSkge1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiBUT09MX0NBTExfVElNRU9VVF9NUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb29sIGNhbGwgJyArIG5hbWUgKyAnIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNwb25zZScpO1xuICAgIH1cbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMzApKTtcbiAgfVxuXG4gIGxldCByYXc7XG4gIHRyeSB7XG4gICAgcmF3ID0gcmVhZEZpbGVTeW5jKHJlc3BvbnNlRmlsZSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgcmF3ID0gcmVhZEZpbGVTeW5jKHJlc3BvbnNlRmlsZSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyYXcpO1xuICB0cnkgeyB1bmxpbmtTeW5jKHJlc3BvbnNlRmlsZSk7IH0gY2F0Y2gge31cblxuICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG59XG5cbmNvbnN0IGNvZGUgPSByZWFkRmlsZVN5bmMoam9pbihTQ1JJUFRfRElSLCAnY29kZS5qcycpLCAndXRmOCcpO1xuY29uc3QgdG9vbE5hbWVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoam9pbihTQ1JJUFRfRElSLCAndG9vbHMuanNvbicpLCAndXRmOCcpKTtcblxuY29uc3QgY3R4ID0geyB0b29sczoge30gfTtcbmZvciAoY29uc3QgbmFtZSBvZiB0b29sTmFtZXMpIHtcbiAgY3R4LnRvb2xzW25hbWVdID0gKGlucHV0KSA9PiBjYWxsVG9vbChuYW1lLCBpbnB1dCk7XG59XG5cbmNvbnN0IGxvZ3MgPSBbXTtcbmNvbnN0IGN1c3RvbUNvbnNvbGUgPSB7XG4gIGxvZzogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaChhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbiAgZXJyb3I6ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1tlcnJvcl0gJyArIGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICB3YXJuOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKCdbd2Fybl0gJyArIGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxufTtcblxudHJ5IHtcbiAgY29uc3QgQXN5bmNGdW5jdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbigpIHt9KS5jb25zdHJ1Y3RvcjtcbiAgY29uc3QgZm4gPSBuZXcgQXN5bmNGdW5jdGlvbignY3R4JywgJ2NvbnNvbGUnLCBjb2RlKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oY3R4LCBjdXN0b21Db25zb2xlKTtcblxuICBjb25zdCBvdXRwdXQgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogcmVzdWx0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQgOiBudWxsIH07XG4gIGlmIChsb2dzLmxlbmd0aCA+IDApIG91dHB1dC5sb2dzID0gbG9ncztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7XG59IGNhdGNoIChlcnIpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlICsgJ1xcXFxuJyArIGVyci5zdGFjayA6IFN0cmluZyhlcnIpLFxuICB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufVxuYDtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHBsYWluIEpTT04gU2NoZW1hIGZyb20gd2hhdGV2ZXIgZm9ybWF0IHRoZSBBSSBTREsgdG9vbCB1c2VzXG4gKiAoWm9kIHNjaGVtYSwgQUkgU0RLIHdyYXBwZWQgc2NoZW1hLCBvciByYXcgSlNPTiBTY2hlbWEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEpzb25TY2hlbWEoXG4gIHNjaGVtYTogdW5rbm93blxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIFwiX2RlZlwiIGluIHNjaGVtYSAmJlxuICAgIHR5cGVvZiAoc2NoZW1hIGFzIHsgX2RlZjogdW5rbm93biB9KS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gei50b0pTT05TY2hlbWEoc2NoZW1hIGFzIHouWm9kVHlwZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICBpZiAoU3ltYm9sLmZvcihcInZlcmNlbC5haS5zY2hlbWFcIikgaW4gcyAmJiBcImpzb25TY2hlbWFcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBzIHx8IFwicHJvcGVydGllc1wiIGluIHMpIHtcbiAgICByZXR1cm4gcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvblNjaGVtYVRvVHMoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluZGVudCA9IDBcbik6IHN0cmluZyB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5lbnVtICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5lbnVtLm1hcCgodikgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmFueU9mICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgIHJldHVybiBzY2hlbWEuYW55T2ZcbiAgICAgIC5tYXAoKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBqc29uU2NoZW1hVG9UcyhzLCBpbmRlbnQpKVxuICAgICAgLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5vbmVPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLm9uZU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlIGFzIHN0cmluZztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBzY2hlbWEuaXRlbXNcbiAgICAgICAgPyBqc29uU2NoZW1hVG9UcyhzY2hlbWEuaXRlbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluZGVudClcbiAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIHJldHVybiBgQXJyYXk8JHtpdGVtc30+YDtcbiAgICB9XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hLnByb3BlcnRpZXMgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gbmV3IFNldCgoc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gICAgICBjb25zdCBwYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuICAgICAgY29uc3QgY2xvc2VQYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wiO1xuICAgICAgICByZXR1cm4gYCR7cGFkfSR7a2V5fSR7b3B0fTogJHtqc29uU2NoZW1hVG9Ucyh2YWx1ZSwgaW5kZW50ICsgMSl9YDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGB7XFxuJHtwcm9wcy5qb2luKFwiO1xcblwiKX07XFxuJHtjbG9zZVBhZH19YDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyh0b29sczogVG9vbFNldCk6IHN0cmluZyB7XG4gIGNvbnN0IHNpZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXModG9vbHMpKSB7XG4gICAgY29uc3QgcmF3ID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpbnB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5pbnB1dFNjaGVtYSA/PyByYXcucGFyYW1ldGVycyk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gZXh0cmFjdEpzb25TY2hlbWEocmF3Lm91dHB1dFNjaGVtYSk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dFNjaGVtYSA/IGpzb25TY2hlbWFUb1RzKGlucHV0U2NoZW1hLCAyKSA6IFwie31cIjtcbiAgICBjb25zdCBvdXRwdXRUeXBlID0gb3V0cHV0U2NoZW1hXG4gICAgICA/IGpzb25TY2hlbWFUb1RzKG91dHB1dFNjaGVtYSwgMilcbiAgICAgIDogXCJ1bmtub3duXCI7XG5cbiAgICBzaWdzLnB1c2goYCAgICAke25hbWV9KGlucHV0OiAke2lucHV0VHlwZX0pOiBQcm9taXNlPCR7b3V0cHV0VHlwZX0+YCk7XG4gIH1cblxuICByZXR1cm4gYHR5cGUgQ29udGV4dCA9IHtcXG4gIHRvb2xzOiB7XFxuJHtzaWdzLmpvaW4oXCI7XFxuXCIpfTtcXG4gIH1cXG59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUluU2FuZGJveCh7XG4gIGNvZGUsXG4gIHJwY0RpcixcbiAgYWJvcnRDb250cm9sbGVyLFxuICBzYW5kYm94LFxuICBhdmFpbGFibGVUb29scyxcbiAgb25TdWJUb29sQ2FsbCxcbn06IHtcbiAgY29kZTogc3RyaW5nO1xuICBycGNEaXI6IHN0cmluZztcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgcnBjRGlyXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBta2RpclJlc3VsdC5tZXNzYWdlIH07XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZmlsZXM6IFtcbiAgICAgIHsgcGF0aDogXCJydW5uZXIubWpzXCIsIGNvbnRlbnQ6IFJVTk5FUl9TQ1JJUFQgfSxcbiAgICAgIHsgcGF0aDogXCJjb2RlLmpzXCIsIGNvbnRlbnQ6IGNvZGUgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJ0b29scy5qc29uXCIsXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGF2YWlsYWJsZVRvb2xzKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgfSk7XG5cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0sIDEwKTtcbiAgY29uc3QgcGVybWlzc2lvbkZsYWcgPVxuICAgIG5vZGVNYWpvciA+PSAyMiA/IFwiLS1wZXJtaXNzaW9uXCIgOiBcIi0tZXhwZXJpbWVudGFsLXBlcm1pc3Npb25cIjtcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm5vZGVcIixcbiAgICBhcmdzOiBbXG4gICAgICBwZXJtaXNzaW9uRmxhZyxcbiAgICAgIGAtLWFsbG93LWZzLXJlYWQ9JHtycGNEaXJ9YCxcbiAgICAgIGAtLWFsbG93LWZzLXdyaXRlPSR7cnBjRGlyfWAsXG4gICAgICBgJHtycGNEaXJ9L3J1bm5lci5tanNgLFxuICAgIF0sXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuXG4gIGNvbnN0IGZhdGFsOiB7IGVycm9yOiBFcnJvciB8IG51bGwgfSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBjb25zdCBhYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBpZiAoIWZhdGFsLmVycm9yKSB7XG4gICAgICBmYXRhbC5lcnJvciA9IGVycm9yO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRvb2xSZXF1ZXN0ID0gYXN5bmMgKHJlcXVlc3RKc29uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgcGFyc2VkOiB7IGlkOiBzdHJpbmc7IHRvb2w6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfTtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXF1ZXN0SnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpZCwgdG9vbDogdG9vbE5hbWUsIGlucHV0IH0gPSBwYXJzZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGF2YWlsYWJsZVRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgIGlmICghdD8uZXhlY3V0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvb2wgJHt0b29sTmFtZX0gbm90IGZvdW5kIG9yIGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlYyA9IHQuZXhlY3V0ZS5iaW5kKHQpO1xuICAgICAgaWYgKG9uU3ViVG9vbENhbGwpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBvblN1YlRvb2xDYWxsKHRvb2xOYW1lLCBpbnB1dCwgKCkgPT5cbiAgICAgICAgICBleGVjKGlucHV0LCB7XG4gICAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7IHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzcG9uc2UgPSB7IGVycm9yOiBtc2cgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgZmlsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBgJHtpZH0ucmVzcG9uc2UuanNvbmAsXG4gICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB3cml0aW5nIHRoZSByZXNwb25zZSBmaWxlIGZhaWxzLCB0aGUgcnVubmVyIHdpbGwgcG9sbCBmb3JldmVyXG4gICAgICAgKiB3YWl0aW5nIGZvciBpdC4gQWJvcnQgdGhlIHJ1bm5lciBwcm9jZXNzIHNvIHdlIGRvbid0IGRlYWRsb2NrLlxuICAgICAgICovXG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBhYm9ydChuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSBSUEMgcmVzcG9uc2UgZm9yICR7dG9vbE5hbWV9OiAke21zZ31gKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvb2xDYWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBsZXQgc3RkZXJyQnVmZmVyID0gXCJcIjtcbiAgbGV0IG5vbk1hcmtlclN0ZGVyciA9IFwiXCI7XG5cbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGFib3J0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgSmF2YVNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7RVhFQ1VUSU9OX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApXG4gICAgKTtcbiAgfSwgRVhFQ1VUSU9OX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBleGVjUmVzdWx0LmxvZ3MoKSkge1xuICAgICAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZGVyclwiKSB7XG4gICAgICAgIHN0ZGVyckJ1ZmZlciArPSBlbnRyeS5kYXRhO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9TVEFSVCk7XG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlTWFya2VyID0gc3RkZXJyQnVmZmVyLnNsaWNlKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICBpZiAoYmVmb3JlTWFya2VyLnRyaW0oKSkge1xuICAgICAgICAgICAgbm9uTWFya2VyU3RkZXJyICs9IGJlZm9yZU1hcmtlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzdGFydElkeCArIFJFUVVFU1RfTUFSS0VSX1NUQVJULmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9FTkQsIGNvbnRlbnRTdGFydCk7XG4gICAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RKc29uID0gc3RkZXJyQnVmZmVyLnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSWR4KTtcbiAgICAgICAgICBzdGRlcnJCdWZmZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoZW5kSWR4ICsgUkVRVUVTVF9NQVJLRVJfRU5ELmxlbmd0aCk7XG5cbiAgICAgICAgICB0b29sQ2FsbFByb21pc2VzLnB1c2goaGFuZGxlVG9vbFJlcXVlc3QocmVxdWVzdEpzb24pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cblxuICBpZiAoc3RkZXJyQnVmZmVyLnRyaW0oKSkge1xuICAgIG5vbk1hcmtlclN0ZGVyciArPSBzdGRlcnJCdWZmZXI7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodG9vbENhbGxQcm9taXNlcyk7XG5cbiAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgZXhlY1Jlc3VsdC5yZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogZmF0YWwuZXJyb3IubWVzc2FnZSxcbiAgICAgIC4uLihub25NYXJrZXJTdGRlcnIgPyB7IHN0ZGVycjogbm9uTWFya2VyU3RkZXJyLnNsaWNlKDAsIDIwMDApIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgUnVubmVyIGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkuYCxcbiAgICAgIHN0ZGVycjogKG5vbk1hcmtlclN0ZGVyciArIHN0ZGVycikuc2xpY2UoMCwgMjAwMCksXG4gICAgICBzdGRvdXQ6IHN0ZG91dC5zbGljZSgwLCAxMDAwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKYXZhU2NyaXB0VG9vbChvcHRzOiB7XG4gIHRvb2xzOiBUb29sU2V0O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pIHtcbiAgY29uc3QgeyBzZXNzaW9uLCBzYW5kYm94LCBvblN1YlRvb2xDYWxsIH0gPSBvcHRzO1xuICBjb25zdCBhY3RpdmVTZXQgPSBzZXNzaW9uLmFjdGl2ZVRvb2xzID8gbmV3IFNldChzZXNzaW9uLmFjdGl2ZVRvb2xzKSA6IG51bGw7XG4gIGNvbnN0IGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMudG9vbHMpKSB7XG4gICAgaWYgKCFhY3RpdmVTZXQgfHwgYWN0aXZlU2V0LmhhcyhuYW1lKSkge1xuICAgICAgYXZhaWxhYmxlVG9vbHNbbmFtZV0gPSB0O1xuICAgIH1cbiAgfVxuICBjb25zdCBjb250ZXh0VHlwZSA9IGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcoYXZhaWxhYmxlVG9vbHMpO1xuXG4gIHJldHVybiB0b29sKHtcbiAgICAuLi5idWlsdEluVG9vbHMuSmF2YVNjcmlwdCxcbiAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGUgSmF2YVNjcmlwdCB0byBvcmNoZXN0cmF0ZSBtdWx0aXBsZSB0b29sIGNhbGxzIGluIGEgc2luZ2xlIHN0ZXAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcnVuIHNldmVyYWwgdG9vbHMgaW4gc2VxdWVuY2UsIHRyYW5zZm9ybSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgb3IgcGFyYWxsZWxpemUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucyB3aXRoIFByb21pc2UuYWxsLlxuXG5UaGUgY29kZSBydW5zIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIGJvZHkgd2l0aCBcXGBjdHhcXGAgaW4gc2NvcGU6XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbiR7Y29udGV4dFR5cGV9XG5cXGBcXGBcXGBcblxuRXhhbXBsZXM6XG4tIFNlcXVlbnRpYWw6IFxcYGNvbnN0IGZpbGUgPSBhd2FpdCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwicGFja2FnZS5qc29uXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKGZpbGUuY29udGVudCk7XFxgXG4tIFBhcmFsbGVsOiBcXGBjb25zdCBbYSwgYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImEudHNcIiB9KSwgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImIudHNcIiB9KV0pOyByZXR1cm4geyBhOiBhLmNvbnRlbnQsIGI6IGIuY29udGVudCB9O1xcYFxuLSBUcmFuc2Zvcm06IFxcYGNvbnN0IGdyZXAgPSBhd2FpdCBjdHgudG9vbHMuR3JlcCh7IHBhdHRlcm46IFwiVE9ET1wiIH0pOyByZXR1cm4gZ3JlcC5tYXRjaGVzLnNwbGl0KFwiXFxcXG5cIikubGVuZ3RoO1xcYFxuXG5SZXR1cm4gYSB2YWx1ZSB0byBwYXNzIHJlc3VsdHMgYmFjay4gVXNlIGNvbnNvbGUubG9nKCkgZm9yIGRlYnVnIG91dHB1dC5gLFxuICAgIGV4ZWN1dGU6ICh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgcnVuSWQgPSBgcnVuXyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgLnNsaWNlKDIsIDgpfWA7XG4gICAgICBjb25zdCBycGNEaXIgPSBgLmFnZW50L2pzLXJwYy8ke3J1bklkfWA7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHJldHVybiBleGVjdXRlSW5TYW5kYm94KHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgcnBjRGlyLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzLFxuICAgICAgICBvblN1YlRvb2xDYWxsLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUsIE1vZGVsTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuXG50eXBlIFByb3ZpZGVyT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEpTT05WYWx1ZT4+O1xuXG5jb25zdCBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUID0gNDtcblxuY29uc3QgQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMgPSBbXCJjbGF1ZGVcIiwgXCJhbnRocm9waWNcIl07XG5cbmNvbnN0IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TOiBQcm92aWRlck9wdGlvbnMgPSB7XG4gIGFudGhyb3BpYzoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIG9wZW5yb3V0ZXI6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBiZWRyb2NrOiB7XG4gICAgY2FjaGVQb2ludDogeyB0eXBlOiBcImRlZmF1bHRcIiB9LFxuICB9LFxuICBvcGVuYWlDb21wYXRpYmxlOiB7XG4gICAgY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGNvcGlsb3Q6IHtcbiAgICBjb3BpbG90X2NhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0R2F0ZXdheVByb3ZpZGVyKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2xhc2hJbmRleCA9IG1vZGVsLmluZGV4T2YoXCIvXCIpO1xuICBpZiAoc2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbW9kZWwuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXIge1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSAobWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9KVxuICAgICAgLnByb3ZpZGVyT3B0aW9ucztcbiAgICBpZiAocHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcbiAgICAgICAgaWYgKHBhcnRQcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2xhdWRlTGlrZU1vZGVsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbG93ZXIgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMuc29tZSgobSkgPT4gbG93ZXIuaW5jbHVkZXMobSkpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyT3B0aW9ucyhvcHRzOiB7XG4gIGN1cnJlbnQ6IFByb3ZpZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcGF0Y2g6IFByb3ZpZGVyT3B0aW9ucztcbn0pOiBQcm92aWRlck9wdGlvbnMge1xuICBjb25zdCBuZXh0OiBQcm92aWRlck9wdGlvbnMgPSB7IC4uLihvcHRzLmN1cnJlbnQgPz8ge30pIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMucGF0Y2gpKSB7XG4gICAgbmV4dFtrZXldID0geyAuLi4obmV4dFtrZXldID8/IHt9KSwgLi4udmFsdWUgfTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFwYXJ0IHx8IHR5cGVvZiBwYXJ0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQgJiYgKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlID09PSBcInRleHRcIikge1xuICAgIGNvbnN0IHRleHQgPSAocGFydCBhcyB7IHRleHQ/OiB1bmtub3duIH0pLnRleHQ7XG4gICAgaWYgKHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCkge1xuICAgIGNvbnN0IHR5cGUgPSAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwidGhpbmtpbmdcIiB8fCB0eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZTogTW9kZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC50cmltKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnNvbWUoKHBhcnQpID0+IGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0KSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KGNvbnRlbnQ6IHVua25vd25bXSk6IG51bWJlciB8IG51bGwge1xuICBmb3IgKGxldCBpID0gY29udGVudC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGlmIChpc0NhY2hlYWJsZUNsYXVkZVBhcnQoY29udGVudFtpXSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyW10ge1xuICBjb25zdCBzeXN0ZW1JbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBmaW5hbEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGggJiYgc3lzdGVtSW5kaWNlcy5sZW5ndGggPCAyOyBpICs9IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBzeXN0ZW1JbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiBmaW5hbEluZGljZXMubGVuZ3RoIDwgMjsgaSAtPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgZmluYWxJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZmluYWxJbmRpY2VzLnJldmVyc2UoKTtcblxuICByZXR1cm4gWy4uLnN5c3RlbUluZGljZXMsIC4uLmZpbmFsSW5kaWNlc107XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0OiBudW1iZXI7XG59KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBleGlzdGluZ0JyZWFrcG9pbnRzID0gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG9wdHMubWVzc2FnZXMpO1xuICBjb25zdCByZW1haW5pbmdCdWRnZXQgPSBNYXRoLm1heChcbiAgICAwLFxuICAgIG9wdHMubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0IC0gZXhpc3RpbmdCcmVha3BvaW50c1xuICApO1xuXG4gIGlmIChyZW1haW5pbmdCdWRnZXQgPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEluZGljZXMgPSBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhvcHRzLm1lc3NhZ2VzKS5zbGljZShcbiAgICAwLFxuICAgIHJlbWFpbmluZ0J1ZGdldFxuICApO1xuICBpZiAodGFyZ2V0SW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgPVxuICAgIG9wdHMucHJvdmlkZXJJZCA9PT0gXCJhbnRocm9waWNcIiB8fFxuICAgIEJvb2xlYW4ob3B0cy5wcm92aWRlcklkPy5pbmNsdWRlcyhcImJlZHJvY2tcIikpO1xuXG4gIGNvbnN0IG5leHRNZXNzYWdlcyA9IG9wdHMubWVzc2FnZXMuc2xpY2UoKTtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2VJbmRleCBvZiB0YXJnZXRJbmRpY2VzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuXG4gICAgY29uc3Qgc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgPVxuICAgICAgIXVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJlxuICAgICAgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0SW5kZXggPSBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgaWYgKHBhcnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJ0ID0gbWVzc2FnZS5jb250ZW50W3BhcnRJbmRleF07XG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgICAgICBuZXh0Q29udGVudFtwYXJ0SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4uKHBhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgICAgICAgIGN1cnJlbnQ6IHBhcnRQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0gYXMgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQpW251bWJlcl07XG5cbiAgICAgICAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb250ZW50OiBuZXh0Q29udGVudCxcbiAgICAgICAgICB9IGFzIE1vZGVsTWVzc2FnZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICBtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICBjdXJyZW50OiBtZXNzYWdlUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5leHRNZXNzYWdlcztcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Q2FjaGluZ1Jlc3VsdCA9IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdChvcHRzOiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIGFudGhyb3BpYz86IHsgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0PzogbnVtYmVyIH07XG4gIG9wZW5haT86IHsgc2V0UHJvbXB0Q2FjaGVLZXk/OiBib29sZWFuIH07XG59KTogUHJvbXB0Q2FjaGluZ1Jlc3VsdCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0R2F0ZXdheVByb3ZpZGVyKG9wdHMubW9kZWwpO1xuXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zID0ge307XG5cbiAgaWYgKFxuICAgIChwcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBwcm92aWRlciA9PT0gXCJhenVyZVwiKSAmJlxuICAgIG9wdHMub3BlbmFpPy5zZXRQcm9tcHRDYWNoZUtleSAhPT0gZmFsc2VcbiAgKSB7XG4gICAgcHJvdmlkZXJPcHRpb25zLm9wZW5haSA9IHsgcHJvbXB0Q2FjaGVLZXk6IG9wdHMuc2Vzc2lvbklkIH07XG4gIH1cblxuICBjb25zdCBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPVxuICAgIG9wdHMuYW50aHJvcGljPy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPz9cbiAgICBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUO1xuXG4gIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gaXNDbGF1ZGVMaWtlTW9kZWwob3B0cy5tb2RlbClcbiAgICA/IGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyh7XG4gICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlcklkOiBwcm92aWRlcixcbiAgICAgICAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0LFxuICAgICAgfSlcbiAgICA6IG9wdHMubWVzc2FnZXM7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlczogY2FjaGVkTWVzc2FnZXMsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG4vKiogU3ViLXRvb2wgcGFydHMgKGZyb20gSmF2YVNjcmlwdCBtZXRhLXRvb2wpIHVzZSB0aGlzIHRvb2xDYWxsSWQgcHJlZml4LiAqL1xuZnVuY3Rpb24gaXNTdWJUb29sUGFydChwYXJ0OiBQYXJ0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwYXJ0LnBhcnQgYXMgeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gIHJldHVybiB0eXBlb2YgcD8udG9vbENhbGxJZCA9PT0gXCJzdHJpbmdcIiAmJiBwLnRvb2xDYWxsSWQuc3RhcnRzV2l0aChcImpzX3RjX1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVUlNZXNzYWdlcyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlW107XG4gIHBhcnRzOiBQYXJ0W107XG4gIHVudGlsPzogbnVtYmVyO1xuICBpbmNsdWRlUXVldWVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZmlsdGVycyBvdXQgc3ViLXRvb2wgcGFydHMgc28gdGhlIExMTSBkb2Vzbid0IHNlZSB0aGVtLiAqL1xuICBleGNsdWRlU3ViVG9vbFBhcnRzPzogYm9vbGVhbjtcbn0pOiBVSU1lc3NhZ2VbXSB7XG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcnRzQnlNZXNzYWdlLmdldChwYXJ0Lm1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQocGFydC5tZXNzYWdlSWQsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJlZFxuICAgIC5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHBhcnRzQnlNZXNzYWdlLmdldChtLmlkKSA/PyBbXTtcbiAgICAgIG1lc3NhZ2VQYXJ0cy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbS5pZCxcbiAgICAgICAgcm9sZTogbS5yb2xlLFxuICAgICAgICBwYXJ0czogbWVzc2FnZVBhcnRzLm1hcCgocCkgPT4gcC5wYXJ0KSxcbiAgICAgIH0gc2F0aXNmaWVzIFVJTWVzc2FnZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG0pID0+IG0ucGFydHMubGVuZ3RoID4gMCk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UsIFVzYWdlU3VtbWFyeSB9IGZyb20gXCIuLi9zdG9yYWdlL3JwY1wiO1xuXG5leHBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH07XG5cbmZ1bmN0aW9uIHN1bShpdGVtczogU3RlcFVzYWdlW10sIGtleToga2V5b2YgU3RlcFVzYWdlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtW2tleV07XG4gICAgcmV0dXJuIGFjYyArICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApO1xuICB9LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVVc2FnZVN1bW1hcnkoc3RlcHM6IFN0ZXBVc2FnZVtdKTogVXNhZ2VTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogc3RlcHNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW0oc3RlcHMsIFwiaW5wdXRUb2tlbnNcIiksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW0oc3RlcHMsIFwib3V0cHV0VG9rZW5zXCIpLFxuICAgIHRvdGFsVG9rZW5zOiBzdW0oc3RlcHMsIFwidG90YWxUb2tlbnNcIiksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW0oc3RlcHMsIFwiY2FjaGVSZWFkVG9rZW5zXCIpLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bShzdGVwcywgXCJjYWNoZVdyaXRlVG9rZW5zXCIpLFxuICAgIHJlYXNvbmluZ1Rva2Vuczogc3VtKHN0ZXBzLCBcInJlYXNvbmluZ1Rva2Vuc1wiKSxcbiAgICBzdGVwQ291bnQ6IHN0ZXBzLmxlbmd0aCxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvblVzYWdlID0ge1xuICB0b3RhbDogVXNhZ2VTdW1tYXJ5ICYgeyBtZXNzYWdlQ291bnQ6IG51bWJlciB9O1xuICBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNlc3Npb25Vc2FnZShcbiAgbWVzc2FnZXM6IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzYWdlOiB7IHN0ZXBzOiBTdGVwVXNhZ2VbXTsgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5IH0gfCBudWxsO1xuICB9PlxuKTogU2Vzc2lvblVzYWdlIHtcbiAgY29uc3QgYnlNZXNzYWdlSWQ6IFJlY29yZDxzdHJpbmcsIFVzYWdlU3VtbWFyeSB8IG51bGw+ID0ge307XG4gIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgIGJ5TWVzc2FnZUlkW20uaWRdID0gbS51c2FnZT8uc3VtbWFyeSA/PyBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyaWVzID0gbWVzc2FnZXNcbiAgICAubWFwKChtKSA9PiBtLnVzYWdlPy5zdW1tYXJ5KVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIFVzYWdlU3VtbWFyeSA9PiBzICE9PSB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHRvdGFsID0ge1xuICAgIG1vZGVsOiBzdW1tYXJpZXNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuaW5wdXRUb2tlbnMsIDApLFxuICAgIG91dHB1dFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLm91dHB1dFRva2VucywgMCksXG4gICAgdG90YWxUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy50b3RhbFRva2VucywgMCksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVSZWFkVG9rZW5zLCAwKSxcbiAgICBjYWNoZVdyaXRlVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVXcml0ZVRva2VucywgMCksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMucmVhc29uaW5nVG9rZW5zLCAwKSxcbiAgICBzdGVwQ291bnQ6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5zdGVwQ291bnQsIDApLFxuICAgIG1lc3NhZ2VDb3VudDogc3VtbWFyaWVzLmxlbmd0aCxcbiAgfTtcblxuICByZXR1cm4geyB0b3RhbCwgYnlNZXNzYWdlSWQgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUVhLG9CQU1QLFlBMkZPO0FBbkdiO0FBQUE7QUFBQTtBQUVPLElBQU0scUJBQXFCO0FBTWxDLElBQU0sYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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SDsiLAogICJuYW1lcyI6IFsib3B0cyIsICJwYXRoIiwgImVycm9yZSIsICJyZXN1bHQiLCAic3RvcmFnZSIsICJzYW5kYm94UmVjb3JkIiwgImltcG9ydF96b2QiLCAiVmVyY2VsU2FuZGJveFNESyIsICJnZXRTdG9yYWdlIiwgInBhdGgiLCAiaW1wb3J0X3NhbmRib3giLCAiZXJyb3JlIiwgImdldFRlc3RDcmVkZW50aWFscyIsICJzYW5kYm94IiwgIlZlcmNlbFNhbmRib3hTREsiLCAic25hcHNob3RJZCIsICJnZXRTYW5kYm94IiwgInNhbmRib3hSZWNvcmQiLCAiaW5pdF9jbGllbnQiLCAiaW5pdF9jbGllbnQiLCAiaW1wb3J0X3dvcmtmbG93IiwgImltcG9ydF9haSIsICJpbXBvcnRfdWxpZCIsICJpbXBvcnRfd29ya2Zsb3ciLCAiZGVidWciLCAiaW1wb3J0X2FpIiwgImltcG9ydF96b2QiLCAicGF0aCIsICJjcmVhdGVQcm9jZXNzTWFuYWdlciIsICJnZXRTdG9yYWdlIiwgImdldFNhbmRib3giLCAic2Vzc2lvbiIsICJzYW5kYm94UmVjb3JkIiwgInNhbmRib3giLCAicmVzdWx0IiwgInN0YXJ0IiwgImV2ZW50Il0KfQo=
|
|
4603
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9lcnJvcnMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvY2xpZW50LnRzIiwgIi4uL3NyYy91dGlscy9kZWJ1Zy50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwtc2RrLnRzIiwgIi4uL3NyYy9zdG9yYWdlL3JwYy50cyIsICIuLi9zcmMvc3RvcmFnZS9oYW5kbGVyLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2luZGV4LnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9saWZlY3ljbGUtd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2NsaWVudC50cyIsICIuLi9zcmMvc2FuZGJveC9pbmRleC50cyIsICIuLi9zcmMvYWdlbnQtd29ya2Zsb3cudHMiLCAiLi4vc3JjL2FnZW50LXdvcmtmbG93LXN0ZXBzLnRzIiwgIi4uL3NyYy9za2lsbHMvcGFyc2VyLnRzIiwgIi4uL3NyYy9za2lsbHMvZGlzY292ZXIudHMiLCAiLi4vc3JjL3Rvb2xzL2luZGV4LnRzIiwgIi4uL3NyYy90b29scy9qYXZhc2NyaXB0LnRzIiwgIi4uL3NyYy91dGlscy9wcm9tcHQtY2FjaGUudHMiLCAiLi4vc3JjL3V0aWxzL3VpLnRzIiwgIi4uL3NyYy91dGlscy91c2FnZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBCYXNoUmVzdWx0LCBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9VTlRJTCA9IDIwMDA7XG5cbi8qKlxuICogU2hlbGwgc2NyaXB0IHRoYXQgaGFuZGxlcyBhbGwgcHJvY2VzcyBleGVjdXRpb24gbG9naWMuXG4gKiBJbnN0YWxsZWQgdG8gfi8uYWdlbnQvYmluL3J1bi5zaCBkdXJpbmcgaW5pdCgpLlxuICovXG5jb25zdCBSVU5fU0NSSVBUID0gYCMhL2Jpbi9zaFxuIyBQcm9jZXNzIHJ1bm5lciBmb3IgQWdlbnQgU0RLXG4jIEFsbCBwYXJhbWV0ZXJzIHBhc3NlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGF2b2lkIGVzY2FwaW5nIGlzc3Vlc1xuIyBPdXRwdXQgaXMgYmFzZTY0IGVuY29kZWQgdG8gYXZvaWQgSlNPTiBlc2NhcGluZyBpc3N1ZXNcblxuQUdFTlRfRElSPVwiJEhPTUUvLmFnZW50XCJcbkNXRF9GSUxFPVwiJEFHRU5UX0RJUi9jd2QvJFNFU1NJT05fSURcIlxuXG4jIEdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChwZXItc2Vzc2lvbilcbmlmIFsgLWYgXCIkQ1dEX0ZJTEVcIiBdOyB0aGVuXG4gIENXRD0kKGNhdCBcIiRDV0RfRklMRVwiKVxuZWxzZVxuICBDV0Q9XCIkSE9NRVwiXG5maVxuXG4jIERlY29kZSBjb21tYW5kXG5DTUQ9JChlY2hvIFwiJENNRF9CQVNFNjRcIiB8IGJhc2U2NCAtZClcblxuIyBCYWNrZ3JvdW5kIG1vZGUgKHdhaXRVbnRpbCA9IDApXG5pZiBbIFwiJFdBSVRfVU5USUxcIiA9IFwiMFwiIF07IHRoZW5cbiAgY2QgXCIkQ1dEXCIgfHwgY2QgXCIkSE9NRVwiXG5cbiAgIyBHZW5lcmF0ZSBhIHNpbXBsZSBudW1lcmljIElEIGZvciBvdXRwdXQgZmlsZVxuICBPVVRQVVRfSUQ9XCIkKGRhdGUgKyVzKSQkXCJcbiAgT1VUUFVUX0ZJTEU9XCIkQUdFTlRfRElSL291dHB1dHMvJE9VVFBVVF9JRC5sb2dcIlxuXG4gICMgRG91YmxlLWZvcmsgdG8gZnVsbHkgZGV0YWNoIHRoZSBwcm9jZXNzXG4gIChcbiAgICAoXG4gICAgICBldmFsIFwiJENNRFwiXG4gICAgICBwd2QgPiBcIiRDV0RfRklMRVwiIDI+L2Rldi9udWxsXG4gICAgKSA+IFwiJE9VVFBVVF9GSUxFXCIgMj4mMSA8IC9kZXYvbnVsbCAmXG4gICAgZWNobyAkISA+IFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCJcbiAgKVxuXG4gICMgU21hbGwgZGVsYXkgdG8gZW5zdXJlIFBJRCBmaWxlIGlzIHdyaXR0ZW5cbiAgc2xlZXAgMC4wNVxuXG4gICMgUmVhZCBQSURcbiAgaWYgWyAtZiBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiIF07IHRoZW5cbiAgICBQSUQ9JChjYXQgXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIilcbiAgZWxzZVxuICAgIFBJRD0wXG4gIGZpXG5cbiAgIyBPdXRwdXQgSlNPTiByZXN1bHQgKG5vIG91dHB1dCBmb3IgYmFja2dyb3VuZCwgc28gbm8gZW5jb2RpbmcgbmVlZGVkKVxuICBwcmludGYgJ3tcInBpZFwiOiVkLFwib3V0cHV0QmFzZTY0XCI6XCJcIixcImV4aXRDb2RlXCI6LTEsXCJzdGF0dXNcIjpcInJ1bm5pbmdcIixcIm91dHB1dEZpbGVcIjpcIiVzXCIsXCJjd2RcIjpcIiVzXCJ9XFxcXG4nIFxcXFxcbiAgICBcIiRQSURcIiBcIiRPVVRQVVRfRklMRVwiIFwiJENXRFwiXG4gIGV4aXQgMFxuZmlcblxuIyBGb3JlZ3JvdW5kIG1vZGUgKHdhaXRVbnRpbCA+IDApIC0gcnVuIGRpcmVjdGx5IGFuZCBjYXB0dXJlIG91dHB1dFxuY2QgXCIkQ1dEXCIgfHwgY2QgXCIkSE9NRVwiXG5cbiMgUnVuIGNvbW1hbmQsIGNhcHR1cmUgb3V0cHV0IGFuZCBleGl0IGNvZGVcbk9VVFBVVD0kKGV2YWwgXCIkQ01EXCIgMj4mMSlcbkVYSVRfQ09ERT0kP1xuXG4jIFVwZGF0ZSBDV0QgYWZ0ZXIgY29tbWFuZFxuTkVXX0NXRD0kKHB3ZClcbmVjaG8gXCIkTkVXX0NXRFwiID4gXCIkQ1dEX0ZJTEVcIlxuXG4jIERldGVybWluZSBzdGF0dXNcbmlmIFsgJEVYSVRfQ09ERSAtZXEgMCBdOyB0aGVuXG4gIFNUQVRVUz1cImNvbXBsZXRlZFwiXG5lbHNlXG4gIFNUQVRVUz1cImZhaWxlZFwiXG5maVxuXG4jIEJhc2U2NCBlbmNvZGUgb3V0cHV0IHRvIGF2b2lkIEFMTCBlc2NhcGluZyBpc3N1ZXNcbk9VVFBVVF9CQVNFNjQ9JChwcmludGYgJyVzJyBcIiRPVVRQVVRcIiB8IGJhc2U2NCB8IHRyIC1kICdcXFxcbicpXG5cbiMgT3V0cHV0IEpTT04gcmVzdWx0IHdpdGggYmFzZTY0LWVuY29kZWQgb3V0cHV0XG5wcmludGYgJ3tcInBpZFwiOjAsXCJvdXRwdXRCYXNlNjRcIjpcIiVzXCIsXCJleGl0Q29kZVwiOiVkLFwic3RhdHVzXCI6XCIlc1wiLFwib3V0cHV0RmlsZVwiOlwiXCIsXCJjd2RcIjpcIiVzXCJ9XFxcXG4nIFxcXFxcbiAgXCIkT1VUUFVUX0JBU0U2NFwiIFwiJEVYSVRfQ09ERVwiIFwiJFNUQVRVU1wiIFwiJE5FV19DV0RcIlxuYDtcblxudHlwZSBSdW5PcHRpb25zID0ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXggbXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi5cbiAgICogLSAwOiBCYWNrZ3JvdW5kIG1vZGUgLSByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBQSURcbiAgICogLSA+MDogRm9yZWdyb3VuZCBtb2RlIC0gd2FpdCBmb3IgY29tcGxldGlvbiAoZGVmYXVsdDogMzAwMDApXG4gICAqL1xuICB3YWl0VW50aWw/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgbWFuYWdlciB0aGF0IHVzZXMgYSBzaW5nbGUgc2hlbGwgc2NyaXB0IHRvIGhhbmRsZSBhbGwgZXhlY3V0aW9uIGxvZ2ljLlxuICogUmVkdWNlcyByb3VuZC10cmlwcyB0byB0aGUgc2FuZGJveCBieSBkb2luZyBldmVyeXRoaW5nIGluIG9uZSBleGVjIGNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQcm9jZXNzTWFuYWdlciA9IChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNlc3Npb25JZCB9ID0gb3B0cztcbiAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3QgaW5pdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBta2RpciAtcCAkSE9NRS8uYWdlbnQvYmluICRIT01FLy5hZ2VudC9waWRzICRIT01FLy5hZ2VudC9vdXRwdXRzICRIT01FLy5hZ2VudC9jd2RcbmNhdCA+ICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoIDw8ICdTQ1JJUFRfRU9GJ1xuJHtSVU5fU0NSSVBUfVxuU0NSSVBUX0VPRlxuY2htb2QgK3ggJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2hgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0O1xuICAgIH1cbiAgICBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBydW4gPSBhc3luYyAob3B0czogUnVuT3B0aW9ucyk6IFByb21pc2U8QmFzaFJlc3VsdD4gPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcblxuICAgIGNvbnN0IHsgY29tbWFuZCwgd2FpdFVudGlsID0gREVGQVVMVF9XQUlUX1VOVElMIH0gPSBvcHRzO1xuICAgIGNvbnN0IGNtZEJhc2U2NCA9IEJ1ZmZlci5mcm9tKGNvbW1hbmQsIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBDTURfQkFTRTY0PVwiJHtjbWRCYXNlNjR9XCIgV0FJVF9VTlRJTD1cIiR7d2FpdFVudGlsfVwiIFNFU1NJT05fSUQ9XCIke3Nlc3Npb25JZH1cIiAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaGAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQudHJpbSgpKSBhcyB7XG4gICAgICBwaWQ6IG51bWJlcjtcbiAgICAgIG91dHB1dEJhc2U2NDogc3RyaW5nO1xuICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgIHN0YXR1czogXCJydW5uaW5nXCIgfCBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIG91dHB1dEZpbGU6IHN0cmluZztcbiAgICAgIGN3ZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyBEZWNvZGUgYmFzZTY0IG91dHB1dFxuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZC5vdXRwdXRCYXNlNjRcbiAgICAgID8gQnVmZmVyLmZyb20ocGFyc2VkLm91dHB1dEJhc2U2NCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgICAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpZDogcGFyc2VkLnBpZCxcbiAgICAgIG91dHB1dCxcbiAgICAgIGV4aXRDb2RlOiBwYXJzZWQuZXhpdENvZGUsXG4gICAgICBzdGF0dXM6IHBhcnNlZC5zdGF0dXMsXG4gICAgICBjd2Q6IHBhcnNlZC5jd2QsXG4gICAgICBvdXRwdXRGaWxlOiBwYXJzZWQub3V0cHV0RmlsZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGdldEN3ZCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYGNhdCAkSE9NRS8uYWdlbnQvY3dkLyR7c2Vzc2lvbklkfSAyPi9kZXYvbnVsbCB8fCBlY2hvIFwiJEhPTUVcImAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKSB8fCBwcm9jZXNzLmN3ZCgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaW5pdCxcbiAgICBydW4sXG4gICAgZ2V0Q3dkLFxuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgUHJvY2Vzc01hbmFnZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVQcm9jZXNzTWFuYWdlcj47XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbkVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgZmFpbGVkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2FuZGJveCAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VDb25mbGljdEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBNZXNzYWdlTm90Rm91bmRFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxuICBTdG9yYWdlQ29uZmxpY3RFcnJvcixcbiAgU3RvcmFnZUVycm9yLFxufSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIFBhcnQsXG4gIFNldHVwU25hcHNob3QsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbnR5cGUgUnBjUmVzcG9uc2U8VD4gPVxuICB8IHsgcmVzdWx0OiBUIH1cbiAgfCB7IGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0gfTtcblxuZXhwb3J0IHR5cGUgUnBjRm4gPSAocGFyYW1zOiB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59KSA9PiBQcm9taXNlPFJwY1Jlc3BvbnNlPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VDbGllbnQocnBjRm46IFJwY0ZuLCBuYW1lPzogc3RyaW5nKTogU3RvcmFnZSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHJwYzxNIGV4dGVuZHMga2V5b2YgU3RvcmFnZU1ldGhvZHM+KFxuICAgIG1ldGhvZDogTSxcbiAgICBwYXJhbXM6IHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJwYXJhbXNcIl0+XG4gICk6IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT4+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGNGbih7IG5hbWUsIG1ldGhvZCwgcGFyYW1zIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IuY29kZSA9PT0gXCJDT05GTElDVFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlQ29uZmxpY3RFcnJvcih7IHJlYXNvbjogcmVzdWx0LmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHtcbiAgICAgICAgcmVhc29uOiBgWyR7cmVzdWx0LmVycm9yLmNvZGV9XSAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicmVzdWx0XCJdPjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzZXNzaW9uLmdldFwiLCB7IGlkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbk5vdEZvdW5kRXJyb3IoeyBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24uc2V0XCIsIHNlc3Npb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi51cGRhdGVcIiwgb3B0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VDb25mbGljdEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZTogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2Vzc2lvbi5kZWxldGVcIiwgeyBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLmxpc3RcIiwge1xuICAgICAgICAgICAgdGFnczogb3B0cz8udGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzPy5vcmRlcixcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3RCeVNhbmRib3g6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiLCB7XG4gICAgICAgICAgICBzYW5kYm94SWQ6IG9wdHMuc2FuZGJveElkLFxuICAgICAgICAgICAgdGFnczogb3B0cy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHMub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHMuY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2Vzc2lvbklkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24udGFnLnNldFwiLCB7IHNlc3Npb25JZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBsaXN0OiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcIm1lc3NhZ2UubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcIm1lc3NhZ2UuZ2V0XCIsIHsgaWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlTm90Rm91bmRFcnJvcih7IGlkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5zZXRcIiwgbWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgcGFydDoge1xuICAgICAgbGlzdEJ5TWVzc2FnZTogYXN5bmMgKG1lc3NhZ2VJZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInBhcnQubGlzdEJ5TWVzc2FnZVwiLCB7XG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIExpc3RSZXN1bHQ8UGFydD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInBhcnQubGlzdEJ5U2Vzc2lvblwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIExpc3RSZXN1bHQ8UGFydD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAocGFydCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwicGFydC5zZXRcIiwgcGFydCkpIGFzIFBhcnQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVsZXRlOiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJwYXJ0LmRlbGV0ZVwiLCB7IGlkIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogYXN5bmMgKGtleSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNhbmRib3guZ2V0XCIsIHsga2V5IH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveE5vdEZvdW5kRXJyb3IoeyBpZDoga2V5IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldEJ5U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNhbmRib3guZ2V0QnlTZXNzaW9uXCIsIHsgc2Vzc2lvbklkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveE5vdEZvdW5kRXJyb3IoeyBpZDogc2Vzc2lvbklkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNhbmRib3guc2V0XCIsIHJlY29yZCk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gudXBkYXRlXCIsIG9wdHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gubGlzdFwiLCB7XG4gICAgICAgICAgICB0YWdzOiBvcHRzPy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHM/Lm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2FuZGJveElkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gudGFnLnNldFwiLCB7IHNhbmRib3hJZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY3F1aXJlTG9jazogYXN5bmMgKHJlY29yZCwgbG9ja1RpbWVvdXRNcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwic2FuZGJveC5hY3F1aXJlTG9ja1wiLCB7XG4gICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICBsb2NrVGltZW91dE1zLFxuICAgICAgICAgIH0pKSBhcyBpbXBvcnQoXCIuL3R5cGVzXCIpLlNhbmRib3hSZWNvcmQgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHNldHVwOiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNldHVwLmdldFwiLCB7IGtleSB9KSkgYXMgU2V0dXBTbmFwc2hvdCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc25hcHNob3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzZXR1cC5zZXRcIiwgc25hcHNob3QpO1xuICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhY3F1aXJlTG9jazogYXN5bmMgKGtleSwgbG9ja0lkLCBsb2NrVGltZW91dE1zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzZXR1cC5hY3F1aXJlTG9ja1wiLCB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICBsb2NrVGltZW91dE1zLFxuICAgICAgICAgIH0pKSBhcyBTZXR1cFNuYXBzaG90IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5nZXRcIiwgeyBpZCB9KSkgYXMgQ29tbWFuZCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5zZXRcIiwgY29tbWFuZCkpIGFzIENvbW1hbmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcImNvbW1hbmQubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBpbmNsdWRlRmluaXNoZWQ6IG9wdHM/LmluY2x1ZGVGaW5pc2hlZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxDb21tYW5kPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gXCJkZWZhdWx0XCI7XG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRV9WRVJTSU9OID0gXCJ2MVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZShvcHRzOiB7XG4gIGNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiBScGNGbjtcbn0pOiBTdG9yYWdlIHtcbiAgY29uc3QgbmFtZSA9IG9wdHMuY29uZmlnLm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gIHJldHVybiBnZXRTdG9yYWdlQ2xpZW50KG9wdHMucnBjLCBuYW1lKTtcbn1cbiIsICJjb25zdCBlbmFibGVkID1cbiAgcHJvY2Vzcy5lbnYuQUdFTlRfREVCVUcgPT09IFwiMVwiIHx8IHByb2Nlc3MuZW52LkFHRU5UX0RFQlVHID09PSBcInRydWVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICBpZiAoZW5hYmxlZCkge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFVwbG9hZGFibGVGaWxlIH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgTUFYX1JFVFJJRVMgPSAyO1xuY29uc3QgUkVUUllfQkFTRV9NUyA9IDUwMDtcblxuLyoqXG4gKiBFeGVjIGEgY29tbWFuZCBhbmQgYXNzZXJ0IGV4aXQgY29kZSAwLiBSZXRyaWVzIG9uIHRyYW5zaWVudCBmYWlsdXJlc1xuICogKGV4aXQgY29kZSAyNTUgd2l0aCBlbXB0eSBzdGRlcnIgXHUyMDE0IHR5cGljYWxseSBhIHNhbmRib3ggcHJvY2VzcyBraWxsZWRcbiAqIGJlZm9yZSBpdCBjb3VsZCBwcm9kdWNlIG91dHB1dCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNDaGVja2VkKFxuICBzYW5kYm94OiBQaWNrPFNhbmRib3gsIFwiZXhlY1wiPixcbiAgb3B0czogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXSB9LFxuICBlcnJvckxhYmVsOiBzdHJpbmdcbik6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXIgfT4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKG9wdHMpO1xuICAgIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGV4ZWNSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSByZXN1bHQuZXhpdENvZGUgPT09IDI1NSAmJiAhcmVzdWx0LnN0ZGVyci50cmltKCk7XG4gICAgaWYgKGlzVHJhbnNpZW50ICYmIGF0dGVtcHQgPCBNQVhfUkVUUklFUykge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgUkVUUllfQkFTRV9NUyAqIChhdHRlbXB0ICsgMSkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2Vycm9yTGFiZWx9IHdpdGggZXhpdCBjb2RlICR7cmVzdWx0LmV4aXRDb2RlfTogJHtyZXN1bHQuc3RkZXJyfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGZpbGVzIHRvIGEgc2FuZGJveCBhdCB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIHBhdGguXG4gKiBTaGVsbCBzY3JpcHRzICguc2ggZmlsZXMpIGFyZSBhdXRvbWF0aWNhbGx5IG1hZGUgZXhlY3V0YWJsZS5cbiAqXG4gKiBGb3Igc21hbGwgZmlsZXMgKDwxMDBLQiB0b3RhbCksIHVzZXMgc2luZ2xlIGV4ZWMgd2l0aCBoZXJlZG9jLlxuICogRm9yIGxhcmdlIGZpbGVzLCB3cml0ZXMgYmFzZTY0IGNodW5rcyB0aGVuIGRlY29kZXMgdG8gYXZvaWQgQVJHX01BWCBsaW1pdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVzKG9wdHM6IHtcbiAgc2FuZGJveDogUGljazxTYW5kYm94LCBcImV4ZWNcIj47XG4gIGZpbGVzOiBVcGxvYWRhYmxlRmlsZVtdO1xuICBkZXN0UGF0aDogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNhbmRib3gsIGZpbGVzLCBkZXN0UGF0aCB9ID0gb3B0cztcblxuICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhdGhzID0gZmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnBvc2l4LmpvaW4oZGVzdFBhdGgsIGZpbGUucGF0aCkpO1xuICBjb25zdCBwYXJlbnREaXJzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KGZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucG9zaXguZGlybmFtZShwKSkpXG4gICk7XG4gIGNvbnN0IHNoZWxsU2NyaXB0cyA9IGZpbGVQYXRocy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoXCIuc2hcIikpO1xuXG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgLi4ucGFyZW50RGlyc10sXG4gIH0pO1xuICBpZiAobWtkaXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1rZGlyUmVzdWx0O1xuICB9XG4gIGF3YWl0IG1rZGlyUmVzdWx0LnJlc3VsdDtcblxuICBjb25zdCBDSFVOS19TSVpFID0gNTBfMDAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG4gICAgY29uc3QgZnVsbFBhdGggPSBmaWxlUGF0aHNbaV07XG4gICAgY29uc3QgYmFzZTY0Q29udGVudCA9IHRvQmFzZTY0KGZpbGUuY29udGVudCk7XG5cbiAgICBpZiAoYmFzZTY0Q29udGVudC5sZW5ndGggPCBDSFVOS19TSVpFKSB7XG4gICAgICBjb25zdCBtYXJrZXIgPSBgRU9GXyR7aX1gO1xuICAgICAgYXdhaXQgZXhlY0NoZWNrZWQoXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBgYmFzZTY0IC1kID4gJHtxdW90ZShmdWxsUGF0aCl9IDw8ICcke21hcmtlcn0nXG4ke2Jhc2U2NENvbnRlbnR9XG4ke21hcmtlcn1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFwid3JpdGVGaWxlcyBmYWlsZWRcIlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcEI2NCA9IGAvdG1wL2NodW5rLSR7RGF0ZS5ub3coKX0tJHtpfS5iNjRgO1xuXG4gICAgICBjb25zdCBjbGVhclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICBhcmdzOiBbXCItY1wiLCBgPiAke3F1b3RlKHRlbXBCNjQpfWBdLFxuICAgICAgfSk7XG4gICAgICBpZiAoY2xlYXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBjbGVhclJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNsZWFyUmVzdWx0LnJlc3VsdDtcblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIG9mZnNldCA8IGJhc2U2NENvbnRlbnQubGVuZ3RoO1xuICAgICAgICBvZmZzZXQgKz0gQ0hVTktfU0laRVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gYmFzZTY0Q29udGVudC5zbGljZShvZmZzZXQsIG9mZnNldCArIENIVU5LX1NJWkUpO1xuICAgICAgICBjb25zdCBtYXJrZXIgPSBgQ0hVTktfJHtvZmZzZXR9YDtcbiAgICAgICAgYXdhaXQgZXhlY0NoZWNrZWQoXG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgICBgY2F0ID4+ICR7cXVvdGUodGVtcEI2NCl9IDw8ICcke21hcmtlcn0nXG4ke2NodW5rfVxuJHttYXJrZXJ9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIndyaXRlRmlsZXMgY2h1bmsgZmFpbGVkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZXhlY0NoZWNrZWQoXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBgYmFzZTY0IC1kIDwgJHtxdW90ZSh0ZW1wQjY0KX0gPiAke3F1b3RlKGZ1bGxQYXRoKX0gJiYgcm0gLWYgJHtxdW90ZSh0ZW1wQjY0KX1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFwid3JpdGVGaWxlcyBkZWNvZGUgZmFpbGVkXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2htb2RSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJjaG1vZFwiLFxuICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzXSxcbiAgICB9KTtcbiAgICBpZiAoY2htb2RSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgY2htb2RSZXN1bHQ7XG4gICAgfVxuICAgIGF3YWl0IGNobW9kUmVzdWx0LnJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7cy5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGVidWdcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFNldHVwTWV0YSB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgTG9nRW50cnksIE9uUmVzdGFydCwgU2FuZGJveCwgU2FuZGJveFNldHVwIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cml0ZUZpbGVzIH0gZnJvbSBcIi4uL3dyaXRlLWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBsb2NhbFNhbmRib3ggPSA8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlLFxuICBzZXR1cCxcbiAgb25SZXN0YXJ0LFxufToge1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkICYgeyBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH0gfTtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94PFRUYWdzPiAmIHtcbiAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbn0gPT4ge1xuICBjb25zdCBjb25maWcgPSBzYW5kYm94UmVjb3JkLmNvbmZpZztcbiAgY29uc3QgYmFzZVBhdGggPSBjb25maWcucGF0aCA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBwcm9jZXNzZXMgPSBuZXcgTWFwPHN0cmluZywgQ2hpbGRQcm9jZXNzPigpO1xuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ID0ge1xuICAgIGlkOiBzYW5kYm94UmVjb3JkLmlkLFxuICAgIGNvbmZpZzogc2FuZGJveFJlY29yZC5jb25maWcsXG4gICAgZXhlYzogKHsgY29tbWFuZCwgYXJncywgc2lnbmFsIH0pID0+IHtcbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kSWQgPSBgY29tbWFuZF8ke3VsaWQoKX1gO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgICBjd2Q6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHJvY2Vzc2VzLnNldChjb21tYW5kSWQsIGNoaWxkKTtcblxuICAgICAgICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGxvZ1F1ZXVlOiBMb2dFbnRyeVtdID0gW107XG4gICAgICAgICAgbGV0IGxvZ1Jlc29sdmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgICAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgICAgICBzdGRlcnIgKz0gc3RyO1xuICAgICAgICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUHJvbWlzZTx7XG4gICAgICAgICAgICBzdGRvdXQ6IHN0cmluZztcbiAgICAgICAgICAgIHN0ZGVycjogc3RyaW5nO1xuICAgICAgICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgICAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICAgIHdoaWxlICghY2xvc2VkIHx8IGxvZ1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsb2dRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGNvbW1hbmRJZCwgbG9ncywgcmVzdWx0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGU6IHVua25vd24pID0+XG4gICAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gcHJvY2Vzc2VzLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgcmVhc29uOiBgQ29tbWFuZCAke2NvbW1hbmRJZH0gbm90IGZvdW5kIG9yIGFscmVhZHkgZmluaXNoZWRgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG5cbiAgICAgIGNvbnN0IGNtZCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmIChjbWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogY21kLm1lc3NhZ2UsIGNhdXNlOiBjbWQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY21kICYmIGNtZC5zdGF0dXMgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5zZXQoe1xuICAgICAgICAgIC4uLmNtZCxcbiAgICAgICAgICBzdGF0dXM6IFwia2lsbGVkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVzdWx0Lm1lc3NhZ2UsIGNhdXNlOiByZXN1bHQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVhZEZpbGU6IGFzeW5jICh7IHBhdGg6IGZpbGVQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlUGF0aCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgXCJjb2RlXCIgaW4gZSAmJlxuICAgICAgICAgIChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVGaWxlczogKG9wdHMpID0+IHdyaXRlRmlsZXMoeyBzYW5kYm94LCAuLi5vcHRzIH0pLFxuXG4gICAgdXBkYXRlTmV0d29ya1BvbGljeTogKCkgPT5cbiAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgcmVhc29uOiBcInVwZGF0ZU5ldHdvcmtQb2xpY3kgaXMgb25seSBhdmFpbGFibGUgZm9yIFZlcmNlbCBzYW5kYm94ZXNcIixcbiAgICAgICAgfSlcbiAgICAgICksXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2FuZGJveC5pZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHNhbmRib3hSZWNvcmQudGFncyA/PyB7fSkgYXMgVFRhZ3M7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2FuZGJveC5pZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZC50YWdzPy5ba2V5IGFzIHN0cmluZ10gYXNcbiAgICAgICAgICB8IFRUYWdzW3R5cGVvZiBrZXldXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5pZCxcbiAgICAgICAgICB0YWdzOiB0YWdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHJlc3VsdDogU2FuZGJveDxUVGFncz4gJiB7XG4gICAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICAgIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xuICB9ID0gc2FuZGJveDtcblxuICBpZiAoc2V0dXAgfHwgb25SZXN0YXJ0KSB7XG4gICAgbGV0IHJlc29sdmVTZXR1cE1ldGEhOiAobWV0YTogU2FuZGJveFNldHVwTWV0YSkgPT4gdm9pZDtcbiAgICByZXN1bHQuX3NldHVwTWV0YSA9IG5ldyBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+KChyKSA9PiB7XG4gICAgICByZXNvbHZlU2V0dXBNZXRhID0gcjtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5fb25SZWFkeSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgbmVlZHNTZXR1cFJ1biA9ICEhc2V0dXA7XG4gICAgICBpZiAoc2V0dXApIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cC5rZXkpO1xuICAgICAgICBpZiAoIShleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yKSAmJiBleGlzdGluZykge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzZXR1cCBhbHJlYWR5IGNvbXBsZXRlIGZvciBrZXkgXCIke3NldHVwLmtleX1cIiwgc2tpcHBpbmdgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZWVkc1NldHVwUnVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSBzZXR1cCBtZXRhZGF0YSBiZWZvcmUgcnVubmluZyBzZXR1cCBzbyB0aGUgd29ya2Zsb3dcbiAgICAgIC8vIGNhbiBlbWl0IHRoZSBjb3JyZWN0IHN0YXR1cyBpbmRpY2F0b3Igd2hpbGUgc2V0dXAgcnVucy5cbiAgICAgIHJlc29sdmVTZXR1cE1ldGEoe1xuICAgICAgICBuZWVkc1NldHVwUnVuLFxuICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobmVlZHNTZXR1cFJ1biAmJiBzZXR1cCkge1xuICAgICAgICBkZWJ1ZyhgW3NhbmRib3g6c2V0dXBdIHJ1bm5pbmcgc2V0dXAucnVuIChsb2NhbCwga2V5PVwiJHtzZXR1cC5rZXl9XCIpYCk7XG4gICAgICAgIGF3YWl0IHNldHVwLnJ1bihzYW5kYm94KTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXR1cC5zZXQoe1xuICAgICAgICAgIGtleTogc2V0dXAua2V5LFxuICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgIGxhc3RVc2VkQXQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc2V0dXAgY29tcGxldGUsIHN0b3JlZCByZWNvcmQgKGtleT1cIiR7c2V0dXAua2V5fVwiKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChvblJlc3RhcnQpIHtcbiAgICAgICAgZGVidWcoXCJbc2FuZGJveDpzZXR1cF0gcnVubmluZyBvblJlc3RhcnQgKGxvY2FsKVwiKTtcbiAgICAgICAgYXdhaXQgb25SZXN0YXJ0KHNhbmRib3gpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICJleHBvcnQgeyBTYW5kYm94IH0gZnJvbSBcIkB2ZXJjZWwvc2FuZGJveFwiO1xuIiwgImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgcG9sbEludGVydmFsTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc3RvcEFmdGVySW5hY3RpdmVNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF1dG9TdGFydDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBOZXR3b3JrUG9saWN5U2NoZW1hID0gelxuICAudW5pb24oW1xuICAgIHoubGl0ZXJhbChcImFsbG93LWFsbFwiKSxcbiAgICB6LmxpdGVyYWwoXCJkZW55LWFsbFwiKSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICBhbGxvdzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgc3VibmV0czogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBhbGxvdzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGRlbnk6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgfSksXG4gIF0pXG4gIC5vcHRpb25hbCgpO1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrUG9saWN5ID0gei5pbmZlcjx0eXBlb2YgTmV0d29ya1BvbGljeVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94Q29uZmlnU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICByZXNvdXJjZXM6IHoub2JqZWN0KHsgdmNwdXM6IHoubnVtYmVyKCkgfSkub3B0aW9uYWwoKSxcbiAgICBwb3J0czogei5hcnJheSh6Lm51bWJlcigpKS5vcHRpb25hbCgpLFxuICAgIGxpZmVjeWNsZTogVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgbmV0d29ya1BvbGljeTogTmV0d29ya1BvbGljeVNjaGVtYSxcbiAgfSksXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJsb2NhbFwiKSxcbiAgICBwYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwiY3VzdG9tXCIpLFxuICAgIHVybDogei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTYW5kYm94Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgU2FuZGJveENvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IEdlbmVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1heFN0ZXBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRlbXBlcmF0dXJlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcEs6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9wUDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBmcmVxdWVuY3lQZW5hbHR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHByZXNlbmNlUGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBtYXhPdXRwdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2Vzc2lvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgdXBkYXRlZEF0OiB6Lm51bWJlcigpLFxuICBydW5JZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBsYXN0TWVzc2FnZUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBzeXN0ZW06IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNraWxsc0Rpcjogei5hcnJheSh6LnN0cmluZygpKS5udWxsYWJsZSgpLFxuICBob29rVG9rZW46IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWN0aXZlVG9vbHM6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFN0ZXBVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcEluZGV4OiB6Lm51bWJlcigpLFxuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1vZGVsOiB6LnN0cmluZygpLFxuICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICB0b3RhbFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVSZWFkVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVdyaXRlVG9rZW5zOiB6Lm51bWJlcigpLFxuICByZWFzb25pbmdUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN0ZXBDb3VudDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVVzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGVwczogei5hcnJheShTdGVwVXNhZ2VTY2hlbWEpLFxuICBzdW1tYXJ5OiBVc2FnZVN1bW1hcnlTY2hlbWEsXG59KTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVVzYWdlID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZVVzYWdlU2NoZW1hPjtcbmV4cG9ydCB0eXBlIFVzYWdlU3VtbWFyeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlU3VtbWFyeVNjaGVtYT47XG5leHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB6LmluZmVyPHR5cGVvZiBTdGVwVXNhZ2VTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgSW50ZXJydXB0ZWRMYXN0UGFydFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBNZXNzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICByb2xlOiB6LmVudW0oW1widXNlclwiLCBcImFzc2lzdGFudFwiLCBcInN5c3RlbVwiXSksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGludGVycnVwdGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgaW50ZXJydXB0ZWRMYXN0UGFydDogSW50ZXJydXB0ZWRMYXN0UGFydFNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHVzYWdlOiBNZXNzYWdlVXNhZ2VTY2hlbWEubnVsbGFibGUoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBgcGFydGAgZmllbGQgY29ycmVzcG9uZHMgdG8gYFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl1gIGZyb20gdGhlIGBhaWAgcGFja2FnZS5cbiAqIFdlIHVzZSBgei51bmtub3duKClgIGJlY2F1c2UgdGhlIGV4YWN0IHNoYXBlIHZhcmllcyBieSBwYXJ0IHR5cGUgKHRleHQsIHRvb2wtY2FsbCxcbiAqIHRvb2wtcmVzdWx0LCBldGMuKSBhbmQgbWF5IGV2b2x2ZSB3aXRoIHRoZSBBSSBTREsuIFRoZSBSUEMgbGF5ZXIganVzdCBwYXNzZXMgaXQgdGhyb3VnaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kUmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGRvdXQ6IHouc3RyaW5nKCksXG4gIHN0ZGVycjogei5zdHJpbmcoKSxcbiAgZXhpdENvZGU6IHoubnVtYmVyKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94UmVjb3JkU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgY29uZmlnOiBTYW5kYm94Q29uZmlnU2NoZW1hLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGxhc3RBY3Rpdml0eUF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgcHJvdmlkZXJNZXRhZGF0YTogelxuICAgIC5kaXNjcmltaW5hdGVkVW5pb24oXCJwcm92aWRlclwiLCBbXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHByb3ZpZGVyOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICB9KSxcbiAgICBdKVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IFNlc3Npb25VcGRhdGVTY2hlbWEgPSBTZXNzaW9uU2NoZW1hLm9taXQoe1xuICBpZDogdHJ1ZSxcbiAgZ2VuZXJhdGlvbjogdHJ1ZSxcbn0pXG4gIC5wYXJ0aWFsKClcbiAgLmV4dGVuZCh7XG4gICAgaWQ6IFNlc3Npb25TY2hlbWEuc2hhcGUuaWQsXG4gICAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgU2FuZGJveFVwZGF0ZVNjaGVtYSA9IFNhbmRib3hSZWNvcmRTY2hlbWEub21pdCh7IGlkOiB0cnVlIH0pXG4gIC5wYXJ0aWFsKClcbiAgLmV4dGVuZCh7XG4gICAgaWQ6IFNhbmRib3hSZWNvcmRTY2hlbWEuc2hhcGUuaWQsXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQ29tbWFuZEJhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGNvbW1hbmQ6IHouc3RyaW5nKCksXG4gIGFyZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJzdGF0dXNcIiwgW1xuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoeyBzdGF0dXM6IHoubGl0ZXJhbChcInJ1bm5pbmdcIikgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJjb21wbGV0ZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImtpbGxlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEub3B0aW9uYWwoKSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJmYWlsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbl0pO1xuXG5mdW5jdGlvbiBMaXN0UmVzdWx0U2NoZW1hPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KGl0ZW1TY2hlbWE6IFQpIHtcbiAgcmV0dXJuIHoub2JqZWN0KHtcbiAgICBpdGVtczogei5hcnJheShpdGVtU2NoZW1hKSxcbiAgICBuZXh0Q3Vyc29yOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgU2V0dXBTbmFwc2hvdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAga2V5OiB6LnN0cmluZygpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgbGFzdFVzZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0F0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG59KTtcblxuY29uc3QgbWV0aG9kcyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNlc3Npb24uc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25TY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24udXBkYXRlXCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25VcGRhdGVTY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24ubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5saXN0QnlTYW5kYm94XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTZXNzaW9uU2NoZW1hKSxcbiAgfSxcbiAgXCJzZXNzaW9uLmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2Vzc2lvbi50YWcuc2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJtZXNzYWdlLnNldFwiOiB7XG4gICAgcGFyYW1zOiBNZXNzYWdlU2NoZW1hLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShNZXNzYWdlU2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0LnNldFwiOiB7XG4gICAgcGFyYW1zOiBQYXJ0U2NoZW1hLFxuICAgIHJlc3VsdDogUGFydFNjaGVtYSxcbiAgfSxcbiAgXCJwYXJ0LmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBzZXNzaW9uSWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5zZXRcIjoge1xuICAgIHBhcmFtczogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3gudXBkYXRlXCI6IHtcbiAgICBwYXJhbXM6IFNhbmRib3hVcGRhdGVTY2hlbWEsXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcInNhbmRib3gubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9hc2NcIixcbiAgICAgICAgICBcImxhc3RBY3Rpdml0eUF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNhbmRib3hSZWNvcmRTY2hlbWEpLFxuICB9LFxuICBcInNhbmRib3gudGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwiY29tbWFuZC5zZXRcIjoge1xuICAgIHBhcmFtczogQ29tbWFuZFNjaGVtYSxcbiAgICByZXN1bHQ6IENvbW1hbmRTY2hlbWEsXG4gIH0sXG4gIFwiY29tbWFuZC5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGluY2x1ZGVGaW5pc2hlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoQ29tbWFuZFNjaGVtYSksXG4gIH0sXG4gIFwic2V0dXAuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2V0dXBTbmFwc2hvdFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNldHVwLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXR1cFNuYXBzaG90U2NoZW1hLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2V0dXAuYWNxdWlyZUxvY2tcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAga2V5OiB6LnN0cmluZygpLFxuICAgICAgbG9ja0lkOiB6LnN0cmluZygpLFxuICAgICAgbG9ja1RpbWVvdXRNczogei5udW1iZXIoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzYW5kYm94LmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHJlY29yZDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgeyBtZXRob2RzIH07XG5leHBvcnQgdHlwZSBTdG9yYWdlTWV0aG9kcyA9IHR5cGVvZiBtZXRob2RzO1xuZXhwb3J0IHR5cGUgTWV0aG9kTmFtZSA9IGtleW9mIFN0b3JhZ2VNZXRob2RzO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfUlBDX01FVEhPRFMgPSBPYmplY3Qua2V5cyhtZXRob2RzKSBhcyBNZXRob2ROYW1lW107XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgU3RvcmFnZUNvbmZsaWN0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyB0eXBlIE1ldGhvZE5hbWUsIG1ldGhvZHMsIHR5cGUgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcblxuZXhwb3J0IHR5cGUgSGFuZGxlcnMgPSB7XG4gIFtLIGluIE1ldGhvZE5hbWVdOiAoXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW0tdW1wicGFyYW1zXCJdPlxuICApID0+IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInJlc3VsdFwiXT4+O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVxdWVzdCA9IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZTxUID0gdW5rbm93bj4gPSB7XG4gIHJlc3VsdDogVDtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY0Vycm9yUmVzcG9uc2UgPSB7XG4gIGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBScGNSZXNwb25zZTxUID0gdW5rbm93bj4gPSBScGNTdWNjZXNzUmVzcG9uc2U8VD4gfCBScGNFcnJvclJlc3BvbnNlO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RvcmFnZVJwYyhcbiAgYm9keTogUnBjUmVxdWVzdCxcbiAgaGFuZGxlcnM6IEhhbmRsZXJzXG4pOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMgfSA9IGJvZHk7XG5cbiAgaWYgKCEobWV0aG9kIGluIG1ldGhvZHMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6IFwiTUVUSE9EX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgVW5rbm93biBtZXRob2Q6ICR7bWV0aG9kfWAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZCBhcyBNZXRob2ROYW1lO1xuICBjb25zdCBzY2hlbWEgPSBtZXRob2RzW21ldGhvZE5hbWVdLnBhcmFtcztcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShwYXJhbXMpO1xuXG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlZBTElEX1BBUkFNU1wiLFxuICAgICAgICBtZXNzYWdlOiBwYXJzZWQuZXJyb3IuaXNzdWVzXG4gICAgICAgICAgLm1hcCgoaSkgPT4gYCR7aS5wYXRoLmpvaW4oXCIuXCIpfTogJHtpLm1lc3NhZ2V9YClcbiAgICAgICAgICAuam9pbihcIiwgXCIpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbbWV0aG9kTmFtZV0gYXMgKFxuICAgICAgcGFyYW1zOiB1bmtub3duXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocGFyc2VkLmRhdGEpO1xuICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgaXNDb25mbGljdCA9XG4gICAgICBlIGluc3RhbmNlb2YgU3RvcmFnZUNvbmZsaWN0RXJyb3IgfHxcbiAgICAgIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSBcIlN0b3JhZ2VDb25mbGljdEVycm9yXCIpO1xuXG4gICAgaWYgKGlzQ29uZmxpY3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgY29kZTogXCJDT05GTElDVFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVEVSTkFMX0VSUk9SXCIsXG4gICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwgImV4cG9ydCB7XG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgUnBjRm4sXG59IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBScGNFcnJvclJlc3BvbnNlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5leHBvcnQge1xuICB0eXBlIE1lc3NhZ2VVc2FnZSxcbiAgdHlwZSBNZXRob2ROYW1lLFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIFNUT1JBR0VfUlBDX01FVEhPRFMsXG4gIHR5cGUgU3RlcFVzYWdlLFxuICB0eXBlIFN0b3JhZ2VNZXRob2RzLFxuICB0eXBlIFVzYWdlU3VtbWFyeSxcbn0gZnJvbSBcIi4vcnBjXCI7XG5leHBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIE1lc3NhZ2UsXG4gIFBhcnQsXG4gIFJlc29sdmVkU3RvcmFnZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU2V0dXBTbmFwc2hvdCxcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbiAgVHlwZWRTZXNzaW9uLFxuICBUeXBlZFN0b3JhZ2UsXG59IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kU25hcHNob3RTdGVwKFxuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0XG4pOiBQcm9taXNlPEVycm9yIHwgTGlmZWN5Y2xlU3RlcFJlc3VsdD4ge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBTYW5kYm94OiBWZXJjZWxTYW5kYm94U0RLIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3ZlcmNlbC1zZGtcIik7XG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vc3RvcmFnZVwiKTtcbiAgaWYgKCFpbnB1dC5ycGMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSUEMgbm90IGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgcnBjOiBpbnB1dC5ycGMsXG4gIH0pO1xuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LmlkKTtcbiAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2FuZGJveElkID1cbiAgICByZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICA6IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHJlY29yZC5jb25maWc7XG4gIGlmIChjb25maWcudHlwZSAhPT0gXCJ2ZXJjZWxcIikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgcG9sbEludGVydmFsTXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3QgaWRsZVRpbWVvdXRNcyA9XG4gICAgY29uZmlnLmxpZmVjeWNsZT8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90QmVmb3JlVGltZW91dE1zID8/IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGxhc3RBY3Rpdml0eSA9IHJlY29yZC5sYXN0QWN0aXZpdHlBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBpZiAoc2hvdWxkU25hcHNob3REdWVUb0lkbGUgfHwgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3gudXBkYXRlKHtcbiAgICAgICAgaWQ6IHJlY29yZC5pZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKFN0cmluZyhlKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiLFxuICAgICAgcmVhc29uOiBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA/IFwiaWRsZVwiIDogXCJ0aW1lb3V0XCIsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIiwgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY2hlY2tBbmRTbmFwc2hvdFN0ZXAgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGxldCBuZXh0UG9sbE1zID0gREVGQVVMVF9QT0xMX01TO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgfHwgcmVzdWx0LmFjdGlvbiA9PT0gXCJleGl0XCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgU2FuZGJveCBhcyBWZXJjZWxTYW5kYm94U0RLIH0gZnJvbSBcIkB2ZXJjZWwvc2FuZGJveFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yLCBTYW5kYm94Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUge1xuICBScGNGbixcbiAgU2FuZGJveFJlY29yZCxcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbn0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIExvZ0VudHJ5LFxuICBPblJlc3RhcnQsXG4gIFNhbmRib3gsXG4gIFNhbmRib3hMaWZlY3ljbGUsXG4gIFNhbmRib3hMaWZlY3ljbGVJbnB1dCxcbiAgU2FuZGJveFNldHVwLFxuICBTYW5kYm94U3RhdHVzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvd1wiO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxTYW5kYm94Q3JlYXRlT3B0aW9ucyA9IEV4dHJhY3Q8XG4gIFBhcmFtZXRlcnM8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuY3JlYXRlPlswXSxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiAuXG4gIHt9XG4+O1xuXG5leHBvcnQgY29uc3QgVkVSQ0VMX01BWF9USU1FT1VUX01TID0gNSAqIDYwICogNjAgKiAxMDAwOyAvLyA1IGhvdXJzXG5jb25zdCBMT0NLX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMgLSBpZiBsb2NrIG9sZGVyIHRoYW4gdGhpcywgY29uc2lkZXIgaXQgc3RhbGVcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9NUyA9IDIwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgZm9yIGluLWZsaWdodCBzYW5kYm94IGNyZWF0aW9uIHByb21pc2VzLlxuICogUHJldmVudHMgcGFyYWxsZWwgcmVxdWVzdHMgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MgZnJvbSBjcmVhdGluZyBkdXBsaWNhdGUgc2FuZGJveGVzLlxuICovXG5jb25zdCBjcmVhdGVQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4+KCk7XG5cbmNvbnN0IEFDVElWSVRZX1RIUk9UVExFX01TID0gMTBfMDAwO1xuY29uc3QgbGFzdEFjdGl2aXR5U2VudCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmNvbnN0IERFRkFVTFRfVkNQVVMgPSAyO1xuXG5mdW5jdGlvbiBpc1NhbmRib3hHb25lRXJyb3IoZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXJyb3JXaXRoUmVzcG9uc2UgPSBlIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH07XG4gIGNvbnN0IGVycm9yV2l0aENhdXNlID0gZSBhcyB7IGNhdXNlPzogeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSB9O1xuXG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3JXaXRoUmVzcG9uc2UucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgIGVycm9yV2l0aENhdXNlLmNhdXNlPy5yZXNwb25zZT8uc3RhdHVzO1xuXG4gIGlmIChzdGF0dXMgPT09IDQxMCB8fCBzdGF0dXMgPT09IDQyMikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gIGlmIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgY29tbWFuZCBkYXRhXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGxvZ3NcIilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJjZWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gIHN0b3JhZ2UsXG4gIHJwYyxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwidmVyY2VsXCIgfSB9O1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdzogYm9vbGVhbjtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjOiBScGNGbjtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94PFRUYWdzPiAmIHtcbiAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbn0gPT4ge1xuICBjb25zdCB7IGlkLCBjb25maWcgfSA9IHNhbmRib3hSZWNvcmQ7XG4gIGNvbnN0IHZjcHVzID0gY29uZmlnLnJlc291cmNlcz8udmNwdXMgPz8gREVGQVVMVF9WQ1BVUztcbiAgY29uc3QgcG9ydHMgPSBjb25maWcucG9ydHM7XG4gIGNvbnN0IG5ldHdvcmtQb2xpY3kgPSBjb25maWcubmV0d29ya1BvbGljeTtcbiAgY29uc3QgaW5pdGlhbFZlcmNlbCA9XG4gICAgc2FuZGJveFJlY29yZC5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgPyBzYW5kYm94UmVjb3JkLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgIDogbnVsbDtcblxuICB0eXBlIFNhbmRib3hJbnN0YW5jZSA9IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESy5nZXQ+PjtcbiAgbGV0IHNhbmRib3hQcm9taXNlOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHJlY292ZXJlZEZyb21TdGFsZSA9IGZhbHNlO1xuICBsZXQgY3JlYXRlZEZyb21TbmFwc2hvdCA9IGZhbHNlO1xuICBsZXQgbmVlZHNTZXR1cFJ1biA9IGZhbHNlO1xuICBjb25zdCBIT01FX0RJUiA9IFwiL2hvbWUvdmVyY2VsLXNhbmRib3hcIjtcblxuICBhc3luYyBmdW5jdGlvbiBwb2xsRm9yU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTE9DS19USU1FT1VUX01TO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIExPQ0tfUE9MTF9JTlRFUlZBTF9NUykpO1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICBpZiAocmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlY29yZC5tZXNzYWdlLCBjYXVzZTogcmVjb3JkIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmVyY2VsU2FuZGJveElkID1cbiAgICAgICAgcmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKHZlcmNlbFNhbmRib3hJZCkge1xuICAgICAgICByZXR1cm4gdmVyY2VsU2FuZGJveElkO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWNvcmQ/LmFjcXVpcmluZ0xvY2tBdCkge1xuICAgICAgICBjb25zdCBmaW5hbENoZWNrID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChmaW5hbENoZWNrIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgICByZWFzb246IGZpbmFsQ2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgIGNhdXNlOiBmaW5hbENoZWNrLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmFsVmVyY2VsU2FuZGJveElkID1cbiAgICAgICAgICBmaW5hbENoZWNrPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICAgICAgPyBmaW5hbENoZWNrLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChmaW5hbFZlcmNlbFNhbmRib3hJZCkge1xuICAgICAgICAgIHJldHVybiBmaW5hbFZlcmNlbFNhbmRib3hJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICByZWFzb246IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNhbmRib3ggY3JlYXRpb24gYnkgYW5vdGhlciBwcm9jZXNzXCIsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdGFydExpZmVjeWNsZVdvcmtmbG93KFxuICAgIHZlcmNlbFNhbmRib3hJZDogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGlmZWN5Y2xlSW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dCA9IHtcbiAgICAgIGlkLFxuICAgICAgdmVyY2VsU2FuZGJveElkLFxuICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIHJwYyxcbiAgICB9O1xuICAgIGF3YWl0IHN0YXJ0KHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdywgW3sgaW5wdXQ6IGxpZmVjeWNsZUlucHV0IH1dKS5jYXRjaChcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FbXB0eUJsb2NrU3RhdGVtZW50czogaW50ZW50aW9uYWxseSBpZ25vcmVkIC0gd29ya2Zsb3cgc3RhcnQgaXMgZmlyZS1hbmQtZm9yZ2V0XG4gICAgICAoKSA9PiB7fVxuICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KFxuICAgIHNuYXBzaG90SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAgICAgc291cmNlOiB7IHR5cGU6IFwic25hcHNob3RcIiwgc25hcHNob3RJZCB9LFxuICAgICAgICAgIHJlc291cmNlczogeyB2Y3B1cyB9LFxuICAgICAgICAgIHRpbWVvdXQ6IFZFUkNFTF9NQVhfVElNRU9VVF9NUyxcbiAgICAgICAgICBwb3J0cyxcbiAgICAgICAgICBuZXR3b3JrUG9saWN5LFxuICAgICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHRhZ3M6IHNhbmRib3hSZWNvcmQudGFncyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogbm93LFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guc2FuZGJveElkLFxuICAgICAgICAgICAgc25hcHNob3RJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgc3RhcnRMaWZlY3ljbGVXb3JrZmxvdyhzYW5kYm94LnNhbmRib3hJZCk7XG4gICAgICAgIHJldHVybiBzYW5kYm94LnNhbmRib3hJZDtcbiAgICAgIH0sXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVGcmVzaFNhbmRib3goKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICAgIHJlc291cmNlczogeyB2Y3B1cyB9LFxuICAgICAgICAgIHRpbWVvdXQ6IFZFUkNFTF9NQVhfVElNRU9VVF9NUyxcbiAgICAgICAgICBwb3J0cyxcbiAgICAgICAgICBuZXR3b3JrUG9saWN5LFxuICAgICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHRhZ3M6IHNhbmRib3hSZWNvcmQudGFncyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogbm93LFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guc2FuZGJveElkLFxuICAgICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgc3RhcnRMaWZlY3ljbGVXb3JrZmxvdyhzYW5kYm94LnNhbmRib3hJZCk7XG4gICAgICAgIHJldHVybiBzYW5kYm94LnNhbmRib3hJZDtcbiAgICAgIH0sXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29yZSBleGVjIGxvZ2ljIGFnYWluc3QgYSByYXcgVmVyY2VsIFNESyBpbnN0YW5jZS5cbiAgICogU2hhcmVkIGJldHdlZW4gdGhlIG1haW4gc2FuZGJveCB3cmFwcGVyIGFuZCB0ZW1wb3Jhcnkgc2V0dXAgc2FuZGJveGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gZXhlY09uSW5zdGFuY2UoXG4gICAgaW5zdGFuY2U6IFNhbmRib3hJbnN0YW5jZSxcbiAgICB7XG4gICAgICBjb21tYW5kLFxuICAgICAgYXJncyxcbiAgICAgIHNpZ25hbCxcbiAgICB9OiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJncz86IHN0cmluZ1tdOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9XG4gICk6IFByb21pc2U8XG4gICAgfCBTYW5kYm94RXJyb3JcbiAgICB8IHtcbiAgICAgICAgY29tbWFuZElkOiBzdHJpbmc7XG4gICAgICAgIGxvZ3M6ICgpID0+IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+O1xuICAgICAgICByZXN1bHQ6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXIgfT47XG4gICAgICB9XG4gID4ge1xuICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGluc3RhbmNlLnJ1bkNvbW1hbmQoe1xuICAgICAgICAgIGN3ZDogSE9NRV9ESVIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBjbWQ6IGNvbW1hbmQsXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICAgICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGxvZ0J1ZmZlcjogTG9nRW50cnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICByZXNvbHZlOiBudWxsIGFzICgoKSA9PiB2b2lkKSB8IG51bGwsXG4gICAgICAgICAgY29uc3VtZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbnN1bWVMb2dzID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsb2cgb2Ygb3V0cHV0LmxvZ3MoKSkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeTogTG9nRW50cnkgPVxuICAgICAgICAgICAgICAgIGxvZy5zdHJlYW0gPT09IFwic3Rkb3V0XCJcbiAgICAgICAgICAgICAgICAgID8geyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IGxvZy5kYXRhIH1cbiAgICAgICAgICAgICAgICAgIDogeyBzdHJlYW06IFwic3RkZXJyXCIsIGRhdGE6IGxvZy5kYXRhIH07XG5cbiAgICAgICAgICAgICAgaWYgKGxvZy5zdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgICAgICAgICAgICBzdGRvdXQgKz0gbG9nLmRhdGE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RkZXJyICs9IGxvZy5kYXRhO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbG9nQnVmZmVyLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFNhbmRib3ggbWF5IGhhdmUgYmVlbiBzdG9wcGVkIC0gbG9ncyBlbmRwb2ludCByZXR1cm5zIDQyMlxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5jb25zdW1lZCA9IHRydWU7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTxMb2dFbnRyeT4ge1xuICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKCFzdGF0ZS5jb25zdW1lZCB8fCBpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgeWllbGQgbG9nQnVmZmVyW2luZGV4KytdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN1bWVMb2dzLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaW5pc2hlZCA9IGF3YWl0IG91dHB1dC53YWl0KCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgICAgZXhpdENvZGU6IGZpbmlzaGVkLmV4aXRDb2RlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoaXNTYW5kYm94R29uZUVycm9yKGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7IGNvbW1hbmRJZDogb3V0cHV0LmNtZElkLCBsb2dzLCByZXN1bHQgfTtcbiAgICAgIH0sXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkRmlsZU9uSW5zdGFuY2UoXG4gICAgaW5zdGFuY2U6IFNhbmRib3hJbnN0YW5jZSxcbiAgICB7IHBhdGggfTogeyBwYXRoOiBzdHJpbmcgfVxuICApOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IEJ1ZmZlciB8IG51bGw+IHtcbiAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogKCkgPT4gaW5zdGFuY2UucmVhZEZpbGVUb0J1ZmZlcih7IHBhdGgsIGN3ZDogSE9NRV9ESVIgfSksXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVzT25JbnN0YW5jZShcbiAgICBpbnN0YW5jZTogU2FuZGJveEluc3RhbmNlLFxuICAgIG9wdHM6IHtcbiAgICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIHwgQnVmZmVyIH1bXTtcbiAgICAgIGRlc3RQYXRoOiBzdHJpbmc7XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZpbGVzLCBkZXN0UGF0aCB9ID0gb3B0cztcbiAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmF0aXZlRmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5wb3NpeC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgICA/IGZpbGVQYXRoXG4gICAgICAgIDogcGF0aC5wb3NpeC5qb2luKEhPTUVfRElSLCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIGNvbnRlbnQ6XG4gICAgICAgICAgdHlwZW9mIGZpbGUuY29udGVudCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBCdWZmZXIuZnJvbShmaWxlLmNvbnRlbnQpXG4gICAgICAgICAgICA6IGZpbGUuY29udGVudCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCBpbnN0YW5jZS53cml0ZUZpbGVzKG5hdGl2ZUZpbGVzKTtcblxuICAgIGNvbnN0IHNoZWxsU2NyaXB0cyA9IG5hdGl2ZUZpbGVzLmZpbHRlcigoZikgPT4gZi5wYXRoLmVuZHNXaXRoKFwiLnNoXCIpKTtcbiAgICBpZiAoc2hlbGxTY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNobW9kUmVzdWx0ID0gYXdhaXQgZXhlY09uSW5zdGFuY2UoaW5zdGFuY2UsIHtcbiAgICAgICAgY29tbWFuZDogXCJjaG1vZFwiLFxuICAgICAgICBhcmdzOiBbXCIreFwiLCAuLi5zaGVsbFNjcmlwdHMubWFwKChmKSA9PiBmLnBhdGgpXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGNobW9kUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgY2htb2RSZXN1bHQ7XG4gICAgICB9XG4gICAgICBhd2FpdCBjaG1vZFJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBtaW5pbWFsIFNhbmRib3ggd3JhcHBlciBhcm91bmQgYSByYXcgVmVyY2VsIFNESyBpbnN0YW5jZS5cbiAgICogVXNlZCBmb3IgcnVubmluZyBzZXR1cC5ydW4oKSBvbiBhIHRlbXBvcmFyeSBzYW5kYm94IGZvciBzbmFwc2hvdCBjcmVhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVRlbXBTYW5kYm94KGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UpOiBTYW5kYm94IHtcbiAgICBjb25zdCB0ZW1wU2FuZGJveDogU2FuZGJveCA9IHtcbiAgICAgIGlkOiBgX19zZXR1cF90ZW1wXyR7RGF0ZS5ub3coKX1gLFxuICAgICAgY29uZmlnLFxuICAgICAgZXhlYzogKG9wdHMpID0+IGV4ZWNPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKSxcbiAgICAgIHJlYWRGaWxlOiAob3B0cykgPT4gcmVhZEZpbGVPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKSxcbiAgICAgIGdldERvbWFpbjogKCkgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFwibm90IGF2YWlsYWJsZSBkdXJpbmcgc2V0dXBcIiB9KVxuICAgICAgICApLFxuICAgICAga2lsbDogKCkgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFwibm90IGF2YWlsYWJsZSBkdXJpbmcgc2V0dXBcIiB9KVxuICAgICAgICApLFxuICAgICAgd3JpdGVGaWxlczogKG9wdHMpID0+IHdyaXRlRmlsZXNPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKSxcbiAgICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IChwb2xpY3kpID0+XG4gICAgICAgIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgICAgdHJ5OiAoKSA9PiBpbnN0YW5jZS51cGRhdGVOZXR3b3JrUG9saWN5KHBvbGljeSksXG4gICAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgICB9KSxcbiAgICAgIHRhZzoge1xuICAgICAgICBsaXN0OiBhc3luYyAoKSA9PiAoe30pIGFzIFRUYWdzLFxuICAgICAgICBnZXQ6IGFzeW5jICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgc2V0OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIHNldE1hbnk6IGFzeW5jICgpID0+IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gdGVtcFNhbmRib3g7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgZm9yIGEgc2V0dXAgc25hcHNob3QgdG8gYmVjb21lIGF2YWlsYWJsZS4gUmV0dXJucyB0aGUgc25hcHNob3RJZFxuICAgKiBpZiBvbmUgYXBwZWFycyBiZWZvcmUgdGhlIGxvY2sgdGltZXMgb3V0LCBvciBudWxsIGlmIGl0IGRvZXNuJ3QuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBwb2xsRm9yU2V0dXBTbmFwc2hvdChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIExPQ0tfVElNRU9VVF9NUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBMT0NLX1BPTExfSU5URVJWQUxfTVMpKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KGtleSk7XG4gICAgICBpZiAocmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocmVjb3JkPy5zbmFwc2hvdElkKSB7XG4gICAgICAgIHJldHVybiByZWNvcmQuc25hcHNob3RJZDtcbiAgICAgIH1cbiAgICAgIC8vIExvY2sgcmVsZWFzZWQgYnV0IG5vIHNuYXBzaG90IFx1MjAxNCBjcmVhdGlvbiBmYWlsZWRcbiAgICAgIGlmICghcmVjb3JkPy5hY3F1aXJpbmdMb2NrSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBiYWNrZ3JvdW5kIHNhbmRib3gsIHJ1bnMgc2V0dXAsIHNuYXBzaG90cyBpdCwgYW5kIHN0b3JlcyB0aGVcbiAgICogc25hcHNob3QgSUQuIFVzZXMgYXRvbWljIGxvY2tpbmcgdG8gZW5zdXJlIG9ubHkgb25lIHByb2Nlc3MgY3JlYXRlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlIC0gU2tpcCB0aGUgXCJzbmFwc2hvdCBhbHJlYWR5IGV4aXN0c1wiIGVhcmx5IGV4aXQuIFVzZWQgd2hlblxuICAgKiAgIHRoZSBjYWxsZXIga25vd3MgdGhlIGV4aXN0aW5nIHNuYXBzaG90IGlzIHN0YWxlL2V4cGlyZWQuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXR1cFNuYXBzaG90KG9wdHM/OiB7XG4gICAgZm9yY2U/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzZXR1cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZXR1cEtleSA9IHNldHVwLmtleTtcblxuICAgIC8vIENoZWNrIGlmIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIChmYXN0IHBhdGggXHUyMDE0IGF2b2lkcyBsb2NrIGF0dGVtcHQpXG4gICAgaWYgKCFvcHRzPy5mb3JjZSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cEtleSk7XG4gICAgICBpZiAoIShleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yKSAmJiBleGlzdGluZz8uc25hcHNob3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXRvbWljYWxseSBhY3F1aXJlIGxvY2sgKGhhbmRsZXMgYWN0aXZlLWxvY2sgZGV0ZWN0aW9uIGludGVybmFsbHkpXG4gICAgZGVidWcoYFtzYW5kYm94OnNldHVwXSBhY3F1aXJpbmcgbG9jayBmb3Igc2V0dXAga2V5IFwiJHtzZXR1cEtleX1cImApO1xuICAgIGNvbnN0IGxvY2tJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgY29uc3QgbG9ja2VkID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5hY3F1aXJlTG9jayhcbiAgICAgIHNldHVwS2V5LFxuICAgICAgbG9ja0lkLFxuICAgICAgTE9DS19USU1FT1VUX01TXG4gICAgKTtcbiAgICBpZiAobG9ja2VkIGluc3RhbmNlb2YgRXJyb3IgfHwgIWxvY2tlZCkge1xuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gbG9jayBub3QgYWNxdWlyZWQgZm9yIGtleSBcIiR7c2V0dXBLZXl9XCIgKGFub3RoZXIgcHJvY2VzcyBob2xkcyBpdClgXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlLWNoZWNrOiBhbm90aGVyIHdvcmtlciBtYXkgaGF2ZSBjcmVhdGVkIHRoZSBzbmFwc2hvdCBiZXR3ZWVuIG91clxuICAgIC8vIHByZS1jaGVjayBhbmQgbG9jayBhY3F1aXNpdGlvbi4gSWYgc28sIHNraXAgdW5sZXNzIGZvcmNlIChzdGFsZSBzbmFwc2hvdCkuXG4gICAgaWYgKCFvcHRzPy5mb3JjZSAmJiBsb2NrZWQuc25hcHNob3RJZCkge1xuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc25hcHNob3QgYWxyZWFkeSBleGlzdHMgYWZ0ZXIgbG9jayBmb3Iga2V5IFwiJHtzZXR1cEtleX1cIiwgc2tpcHBpbmdgXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB0ZW1wSW5zdGFuY2U6IEF3YWl0ZWQ8XG4gICAgICBSZXR1cm5UeXBlPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZT5cbiAgICA+IHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBzYW5kYm94IGZvciBzbmFwc2hvdHRpbmcuXG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBjcmVhdGluZyB0ZW1wIHNhbmRib3ggZm9yIHNuYXBzaG90IChrZXk9XCIke3NldHVwS2V5fVwiKWBcbiAgICAgICk7XG4gICAgICB0ZW1wSW5zdGFuY2UgPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAgIHJlc291cmNlczogeyB2Y3B1cyB9LFxuICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgIHBvcnRzLFxuICAgICAgICBuZXR3b3JrUG9saWN5LFxuICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wU2FuZGJveCA9IGNyZWF0ZVRlbXBTYW5kYm94KFxuICAgICAgICB0ZW1wSW5zdGFuY2UgYXMgdW5rbm93biBhcyBTYW5kYm94SW5zdGFuY2VcbiAgICAgICk7XG4gICAgICBhd2FpdCBzZXR1cC5ydW4odGVtcFNhbmRib3gpO1xuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc2V0dXAucnVuIGNvbXBsZXRlLCBzbmFwc2hvdHRpbmcgKGtleT1cIiR7c2V0dXBLZXl9XCIpYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGVtcEluc3RhbmNlLnNuYXBzaG90KCk7XG5cbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0dXAuc2V0KHtcbiAgICAgICAga2V5OiBzZXR1cEtleSxcbiAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgY3JlYXRlZEF0OiBsb2NrZWQuY3JlYXRlZEF0LFxuICAgICAgICBsYXN0VXNlZEF0OiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc25hcHNob3Qgc3RvcmVkOiAke3NuYXBzaG90LnNuYXBzaG90SWR9IChrZXk9XCIke3NldHVwS2V5fVwiKWBcbiAgICAgICk7XG5cbiAgICAgIC8vIFN0b3AgdGhlIHRlbXAgc2FuZGJveCBcdTIwMTQgbm8gbG9uZ2VyIG5lZWRlZCBhZnRlciBzbmFwc2hvdHRpbmdcbiAgICAgIGF3YWl0IHRlbXBJbnN0YW5jZS5zdG9wKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIGZhaWxlZCB0byBjcmVhdGUgc2V0dXAgc25hcHNob3QgKGtleT1cIiR7c2V0dXBLZXl9XCIpOmAsXG4gICAgICAgIGVcbiAgICAgICk7XG4gICAgICAvLyBTdG9wIHRoZSB0ZW1wIHNhbmRib3ggb24gZmFpbHVyZVxuICAgICAgaWYgKHRlbXBJbnN0YW5jZSkge1xuICAgICAgICBhd2FpdCB0ZW1wSW5zdGFuY2Uuc3RvcCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiB1cCBsb2NrIG9uIGZhaWx1cmVcbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0dXBcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAga2V5OiBzZXR1cEtleSxcbiAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbG9ja2VkLmNyZWF0ZWRBdCxcbiAgICAgICAgICBsYXN0VXNlZEF0OiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBpZiAoaW5pdGlhbFZlcmNlbD8uc2FuZGJveElkICYmICFyZWNvdmVyZWRGcm9tU3RhbGUpIHtcbiAgICAgIHJldHVybiBpbml0aWFsVmVyY2VsLnNhbmRib3hJZDtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvcikge1xuICAgICAgICAvLyBTYW5kYm94IGRvZXNuJ3QgZXhpc3QgeWV0LCBjb250aW51ZSB3aXRoIGNyZWF0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogZXhpc3RpbmcubWVzc2FnZSwgY2F1c2U6IGV4aXN0aW5nIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID1cbiAgICAgIGV4aXN0aW5nIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IgPyBudWxsIDogZXhpc3Rpbmc7XG4gICAgY29uc3QgZXhpc3RpbmdWZXJjZWwgPVxuICAgICAgZXhpc3RpbmdSZWNvcmQ/LnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmdSZWNvcmQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoZXhpc3RpbmdWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nVmVyY2VsLnNhbmRib3hJZDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNBY3RpdmVMb2NrID1cbiAgICAgIGV4aXN0aW5nUmVjb3JkPy5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgIGV4aXN0aW5nUmVjb3JkLmFjcXVpcmluZ0xvY2tBdCAmJlxuICAgICAgRGF0ZS5ub3coKSAtIGV4aXN0aW5nUmVjb3JkLmFjcXVpcmluZ0xvY2tBdCA8IExPQ0tfVElNRU9VVF9NUztcblxuICAgIGlmIChoYXNBY3RpdmVMb2NrKSB7XG4gICAgICByZXR1cm4gcG9sbEZvclNhbmRib3hJZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2tJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsb2NrZWQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guYWNxdWlyZUxvY2soXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHRhZ3M6IGV4aXN0aW5nUmVjb3JkPy50YWdzID8/IHNhbmRib3hSZWNvcmQudGFncyxcbiAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZ1JlY29yZD8uY3JlYXRlZEF0ID8/IHNhbmRib3hSZWNvcmQuY3JlYXRlZEF0LFxuICAgICAgICBsYXN0QWN0aXZpdHlBdDpcbiAgICAgICAgICBleGlzdGluZ1JlY29yZD8ubGFzdEFjdGl2aXR5QXQgPz8gc2FuZGJveFJlY29yZC5sYXN0QWN0aXZpdHlBdCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBsb2NrSWQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbm93LFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90SWQ6XG4gICAgICAgICAgICBleGlzdGluZ1ZlcmNlbD8uc25hcHNob3RJZCA/PyBpbml0aWFsVmVyY2VsPy5zbmFwc2hvdElkID8/IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgTE9DS19USU1FT1VUX01TXG4gICAgKTtcblxuICAgIGlmIChsb2NrZWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGxvY2tlZC5tZXNzYWdlLCBjYXVzZTogbG9ja2VkIH0pO1xuICAgIH1cbiAgICBpZiAoIWxvY2tlZCkge1xuICAgICAgcmV0dXJuIHBvbGxGb3JTYW5kYm94SWQoKTtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIHRoZSBsb2NrZWQgcmVjb3JkIGZvciB1c2UgaW4gdGhlIHJlbGVhc2UgaGVscGVyLlxuICAgIC8vIFRTIGNhbid0IG5hcnJvdyBgbG9ja2VkYCBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9ucywgc28gd2UgYmluZCBpdCBoZXJlLlxuICAgIGNvbnN0IGxvY2tlZFJlY29yZCA9IGxvY2tlZDtcblxuICAgIC8vIFJlbGVhc2UgdGhlIHNhbmRib3ggbG9jayBzbyBvdGhlciB3b3JrZXJzIGNhbiByZXRyeSBxdWlja2x5XG4gICAgLy8gaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBsb2NrIHRpbWVvdXQuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZVNhbmRib3hMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94XG4gICAgICAgIC51cGRhdGUoe1xuICAgICAgICAgIGlkOiBsb2NrZWRSZWNvcmQuaWQsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gUmUtY2hlY2sgYWZ0ZXIgbG9jazogYW5vdGhlciB3b3JrZXIgbWF5IGhhdmUgY3JlYXRlZCB0aGUgc2FuZGJveFxuICAgIC8vIGJldHdlZW4gb3VyIGluaXRpYWwgY2hlY2sgYW5kIGxvY2sgYWNxdWlzaXRpb24uXG4gICAgY29uc3QgbG9ja2VkVmVyY2VsID1cbiAgICAgIGxvY2tlZFJlY29yZC5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGxvY2tlZFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAobG9ja2VkVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIGF3YWl0IHJlbGVhc2VTYW5kYm94TG9jaygpO1xuICAgICAgcmV0dXJuIGxvY2tlZFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3RJZCA9XG4gICAgICBsb2NrZWRWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGluaXRpYWxWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90SWQ7XG4gICAgaWYgKHNuYXBzaG90SWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3Qoc25hcHNob3RJZCk7XG4gICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHNldHVwIHNuYXBzaG90XG4gICAgaWYgKHNldHVwKSB7XG4gICAgICBsZXQgZm9yY2VSZWNyZWF0ZVNuYXBzaG90ID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR1cFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwLmtleSk7XG4gICAgICBpZiAoIShzZXR1cFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSAmJiBzZXR1cFJlY29yZCkge1xuICAgICAgICBpZiAoc2V0dXBSZWNvcmQuc25hcHNob3RJZCkge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBmb3VuZCBzZXR1cCBzbmFwc2hvdCAke3NldHVwUmVjb3JkLnNuYXBzaG90SWR9IGZvciBrZXkgXCIke3NldHVwLmtleX1cImBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3QoXG4gICAgICAgICAgICBzZXR1cFJlY29yZC5zbmFwc2hvdElkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3QgPSB0cnVlO1xuICAgICAgICAgICAgLy8gVXBkYXRlIGxhc3RVc2VkQXQgKGZpcmUtYW5kLWZvcmdldClcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0dXBcbiAgICAgICAgICAgICAgLnNldCh7XG4gICAgICAgICAgICAgICAgLi4uc2V0dXBSZWNvcmQsXG4gICAgICAgICAgICAgICAgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTbmFwc2hvdCBpcyBzdGFsZS9leHBpcmVkIFx1MjAxNCBmb3JjZSBiYWNrZ3JvdW5kIHRvIG92ZXJ3cml0ZSBpdFxuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCAke3NldHVwUmVjb3JkLnNuYXBzaG90SWR9IGZhaWxlZCAoZXhwaXJlZD8pLCB3aWxsIHJlY3JlYXRlYFxuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yY2VSZWNyZWF0ZVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBzZXR1cFJlY29yZC5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgICAgICBzZXR1cFJlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgICAgICBEYXRlLm5vdygpIC0gc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0F0IDwgTE9DS19USU1FT1VUX01TXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEFub3RoZXIgcHJvY2VzcyBpcyBjcmVhdGluZyB0aGUgc2V0dXAgc25hcHNob3QgXHUyMDE0IHdhaXQgZm9yIGl0XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IGluIHByb2dyZXNzIGZvciBrZXkgXCIke3NldHVwLmtleX1cIiwgd2FpdGluZy4uLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90SWQgPSBhd2FpdCBwb2xsRm9yU2V0dXBTbmFwc2hvdChzZXR1cC5rZXkpO1xuICAgICAgICAgIGlmIChzbmFwc2hvdElkKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCByZWFkeTogJHtzbmFwc2hvdElkfSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChzbmFwc2hvdElkKTtcbiAgICAgICAgICAgIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUG9sbCBmYWlsZWQgb3Igc25hcHNob3QgY3JlYXRpb24gZmFpbGVkIFx1MjAxNCBmYWxsIHRocm91Z2ggdG8gY29sZCBwYXRoXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE5vIHNldHVwIHNuYXBzaG90IGF2YWlsYWJsZSBcdTIwMTQgY3JlYXRlIGZyZXNoIGFuZCBydW4gc2V0dXAgbGF0ZXIuXG4gICAgICAvLyBLaWNrIG9mZiBiYWNrZ3JvdW5kIHNuYXBzaG90IGltbWVkaWF0ZWx5IHNvIGl0IHJ1bnMgaW4gcGFyYWxsZWxcbiAgICAgIC8vIHdpdGggc2V0dXAucnVuIG9uIHRoZSBzZXNzaW9uIHNhbmRib3guXG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBubyBzbmFwc2hvdCBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHdpbGwgcnVuIHNldHVwIG9uIHRoaXMgc2FuZGJveGBcbiAgICAgICk7XG4gICAgICBuZWVkc1NldHVwUnVuID0gdHJ1ZTtcbiAgICAgIGNyZWF0ZVNldHVwU25hcHNob3QoeyBmb3JjZTogZm9yY2VSZWNyZWF0ZVNuYXBzaG90IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJbc2FuZGJveDpzZXR1cF0gZmFpbGVkIHRvIGNyZWF0ZSBiYWNrZ3JvdW5kIHNuYXBzaG90OlwiLFxuICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZyZXNoUmVzdWx0ID0gYXdhaXQgY3JlYXRlRnJlc2hTYW5kYm94KCk7XG4gICAgaWYgKGZyZXNoUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGF3YWl0IHJlbGVhc2VTYW5kYm94TG9jaygpO1xuICAgIH1cbiAgICByZXR1cm4gZnJlc2hSZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRPckNyZWF0ZVNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IGNyZWF0ZVByb21pc2VzLmdldChpZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgY3JlYXRlUHJvbWlzZXMuZGVsZXRlKGlkKTtcbiAgICB9KTtcbiAgICBjcmVhdGVQcm9taXNlcy5zZXQoaWQsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9HZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgY29uc3QgdmVyY2VsU2FuZGJveElkID0gYXdhaXQgZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICBpZiAodmVyY2VsU2FuZGJveElkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+XG4gICAgICAgIFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHZlcmNlbFNhbmRib3hJZCxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSksXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgaWYgKCFzYW5kYm94UHJvbWlzZSkge1xuICAgICAgc2FuZGJveFByb21pc2UgPSBkb0dldFNhbmRib3goKTtcbiAgICB9XG4gICAgcmV0dXJuIHNhbmRib3hQcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckZyb21TdGFsZVNhbmRib3goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc2FuZGJveFByb21pc2UgPSBudWxsO1xuICAgIHJlY292ZXJlZEZyb21TdGFsZSA9IHRydWU7XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yIHx8ICFleGlzdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoZXhpc3RpbmdWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnVwZGF0ZSh7XG4gICAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDogZXhpc3RpbmdWZXJjZWwuc25hcHNob3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxhc3RBY3Rpdml0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGxhc3RTZW50ID0gbGFzdEFjdGl2aXR5U2VudC5nZXQoaWQpO1xuICAgIGlmIChsYXN0U2VudCAmJiBub3cgLSBsYXN0U2VudCA8IEFDVElWSVRZX1RIUk9UVExFX01TKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBY3Rpdml0eVNlbnQuc2V0KGlkLCBub3cpO1xuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdWZXJjZWwgPVxuICAgICAgZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgPyBleGlzdGluZy5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcbiAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3gudXBkYXRlKHtcbiAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiBleGlzdGluZ1ZlcmNlbCA/PyB7XG4gICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbGlmZWN5Y2xlOiBTYW5kYm94TGlmZWN5Y2xlID0ge1xuICAgIHN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIHNuYXBzaG90OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHN0b3A6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC5zdG9wKCk7XG4gICAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnVwZGF0ZSh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldFN0YXR1czogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC5zdGF0dXMgYXMgU2FuZGJveFN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0Q3JlYXRlZEF0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzYW5kYm94LmNyZWF0ZWRBdDtcbiAgICB9LFxuXG4gICAgZ2V0UmVtYWluaW5nVGltZW91dDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC50aW1lb3V0O1xuICAgIH0sXG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9FeGVjKG9wdHM6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgYXJncz86IHN0cmluZ1tdO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVQcm9taXNlID0gdXBkYXRlTGFzdEFjdGl2aXR5KCk7XG4gICAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IGV4ZWNPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKTtcbiAgICBhd2FpdCB1cGRhdGVQcm9taXNlO1xuICAgIHJldHVybiBleGVjUmVzdWx0O1xuICB9XG5cbiAgY29uc3Qgc2FuZGJveDogU2FuZGJveDxUVGFncz4gJiB7XG4gICAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICAgIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xuICB9ID0ge1xuICAgIGlkLFxuICAgIGNvbmZpZyxcbiAgICBleGVjOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZG9FeGVjKG9wdHMpO1xuXG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgU2FuZGJveEVycm9yICYmIGlzU2FuZGJveEdvbmVFcnJvcihyZXN1bHQuY2F1c2UpKSB7XG4gICAgICAgIGF3YWl0IHJlY292ZXJGcm9tU3RhbGVTYW5kYm94KCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBkb0V4ZWMob3B0cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldERvbWFpbjogYXN5bmMgKHBvcnQpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2FuZGJveC5kb21haW4ocG9ydCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBraWxsOiBhc3luYyAoeyBjb21tYW5kSWQsIHN0b3JhZ2U6IGNtZFN0b3JhZ2UgfSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNtZCA9IGF3YWl0IGNtZFN0b3JhZ2UuY29tbWFuZC5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmIChjbWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogY21kLm1lc3NhZ2UsIGNhdXNlOiBjbWQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY21kICYmIGNtZC5zdGF0dXMgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNtZFN0b3JhZ2UuY29tbWFuZC5zZXQoe1xuICAgICAgICAgIC4uLmNtZCxcbiAgICAgICAgICBzdGF0dXM6IFwia2lsbGVkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVzdWx0Lm1lc3NhZ2UsIGNhdXNlOiByZXN1bHQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHJlYWRGaWxlOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVhZEZpbGVPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaWxlczogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JpdGVGaWxlc09uSW5zdGFuY2UoaW5zdGFuY2UsIG9wdHMpO1xuICAgIH0sXG5cbiAgICBsaWZlY3ljbGUsXG5cbiAgICB1cGRhdGVOZXR3b3JrUG9saWN5OiBhc3luYyAocG9saWN5KSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6ICgpID0+IGluc3RhbmNlLnVwZGF0ZU5ldHdvcmtQb2xpY3kocG9saWN5KSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHRhZzoge1xuICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHNhbmRib3hSZWNvcmQudGFncyA/PyB7fSkgYXMgVFRhZ3M7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQudGFncz8uW2tleSBhcyBzdHJpbmddIGFzXG4gICAgICAgICAgfCBUVGFnc1t0eXBlb2Yga2V5XVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBpZCxcbiAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldE1hbnk6IGFzeW5jICh0YWdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBpZCxcbiAgICAgICAgICB0YWdzOiB0YWdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGxldCBvblJlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBsZXQgc2V0dXBNZXRhUHJvbWlzZTogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPiA9IFByb21pc2UucmVzb2x2ZSh7XG4gICAgbmVlZHNTZXR1cFJ1bjogZmFsc2UsXG4gICAgY3JlYXRlZEZyb21TbmFwc2hvdDogZmFsc2UsXG4gIH0pO1xuXG4gIGlmIChjb25maWcubGlmZWN5Y2xlPy5hdXRvU3RhcnQgIT09IGZhbHNlKSB7XG4gICAgc2FuZGJveFByb21pc2UgPSBkb0dldFNhbmRib3goKTtcblxuICAgIC8vIFJlc29sdmUgc2V0dXAgbWV0YWRhdGEgYXMgc29vbiBhcyB0aGUgc2FuZGJveCBpbnN0YW5jZSBpcyByZWFkeVxuICAgIC8vIChiZWZvcmUgX29uUmVhZHkgcnVucyBzZXR1cCkuIFRoZSB3b3JrZmxvdyByZWFkcyB0aGlzIHRvIGNob29zZSB0aGUgc3RhdHVzIGluZGljYXRvci5cbiAgICBzZXR1cE1ldGFQcm9taXNlID0gc2FuZGJveFByb21pc2UudGhlbigoKSA9PiAoe1xuICAgICAgbmVlZHNTZXR1cFJ1bixcbiAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3QsXG4gICAgfSkpO1xuXG4gICAgLy8gQWZ0ZXIgc2FuZGJveCBpbnN0YW5jZSBpcyByZWFkeSwgcnVuIHNldHVwIGFuZC9vciBvblJlc3RhcnQuXG4gICAgLy8gc2FuZGJveFByb21pc2UgaXMgYWxyZWFkeSByZXNvbHZlZCBieSB0aGUgdGltZSAudGhlbigpIHJ1bnMsXG4gICAgLy8gc28gc2V0dXAucnVuIC8gb25SZXN0YXJ0IGNhbGxpbmcgc2FuZGJveC5leGVjKCkgd29uJ3QgZGVhZGxvY2suXG4gICAgb25SZWFkeVByb21pc2UgPSBzYW5kYm94UHJvbWlzZS50aGVuKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZHNTZXR1cFJ1biAmJiBzZXR1cCkge1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHJ1bm5pbmcgc2V0dXAucnVuIG9uIHNlc3Npb24gc2FuZGJveCAoa2V5PVwiJHtzZXR1cC5rZXl9XCIpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzZXR1cC5ydW4oc2FuZGJveCk7XG4gICAgICAgIGRlYnVnKFwiW3NhbmRib3g6c2V0dXBdIHNldHVwLnJ1biBjb21wbGV0ZSBvbiBzZXNzaW9uIHNhbmRib3hcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjcmVhdGVkRnJvbVNuYXBzaG90ICYmIG9uUmVzdGFydCkge1xuICAgICAgICBkZWJ1ZyhcIltzYW5kYm94OnNldHVwXSBydW5uaW5nIG9uUmVzdGFydCAoY3JlYXRlZCBmcm9tIHNuYXBzaG90KVwiKTtcbiAgICAgICAgYXdhaXQgb25SZXN0YXJ0KHNhbmRib3gpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2FuZGJveC5fb25SZWFkeSA9IG9uUmVhZHlQcm9taXNlO1xuICBzYW5kYm94Ll9zZXR1cE1ldGEgPSBzZXR1cE1ldGFQcm9taXNlO1xuICByZXR1cm4gc2FuZGJveDtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFJwY0ZuLCBTYW5kYm94UmVjb3JkLCBTdG9yYWdlLCBTdG9yYWdlQ29uZmlnIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgeyBsb2NhbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy9sb2NhbFwiO1xuaW1wb3J0IHsgdmVyY2VsU2FuZGJveCB9IGZyb20gXCIuL2JpbmRpbmdzL3ZlcmNlbFwiO1xuaW1wb3J0IHR5cGUgeyBPblJlc3RhcnQsIFNhbmRib3gsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgaG93IHRoZSBzYW5kYm94IHdhcyBzZXQgdXAuXG4gKiBVc2VkIGJ5IHRoZSB3b3JrZmxvdyB0byBlbWl0IHRoZSBjb3JyZWN0IHN0YXR1cyBpbmRpY2F0b3IuXG4gKiBSZXR1cm5lZCBhcyBhIHByb21pc2UgYmVjYXVzZSB0aGUgbWV0YWRhdGEgaXMgZGV0ZXJtaW5lZCBhc3luY2hyb25vdXNseVxuICogZHVyaW5nIHNhbmRib3ggY3JlYXRpb24sIGJlZm9yZSBfb25SZWFkeSBydW5zIHNldHVwLlxuICovXG5leHBvcnQgdHlwZSBTYW5kYm94U2V0dXBNZXRhID0ge1xuICAvKiogV2hldGhlciBzZXR1cC5ydW4oKSBuZWVkcyB0byBleGVjdXRlIChjb2xkIHN0YXJ0LCBubyBzbmFwc2hvdCkuICovXG4gIG5lZWRzU2V0dXBSdW46IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBzYW5kYm94IHdhcyBjcmVhdGVkIGZyb20gYSBzbmFwc2hvdC4gKi9cbiAgY3JlYXRlZEZyb21TbmFwc2hvdDogYm9vbGVhbjtcbn07XG5cbnR5cGUgU2FuZGJveFdpdGhNZXRhPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+ID0gU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59O1xuXG4vKipcbiAqIE1vZHVsZS1sZXZlbCBjYWNoZSBmb3Igc2FuZGJveCBpbnN0YW5jZXMga2V5ZWQgYnkgc2FuZGJveCByZWNvcmQgSUQuXG4gKlxuICogQ2FjaGVzIGFsbCBzYW5kYm94IGluc3RhbmNlcyBzbyB0aGF0IHRoZSB3b3JrZmxvdyAod2hpY2ggY2FsbHMgZ2V0U2FuZGJveFxuICogd2l0aG91dCBzZXR1cC9vblJlc3RhcnQpIHJldXNlcyB0aGUgc2FtZSBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXNzaW9uKCksXG4gKiBpbmNsdWRpbmcgaXRzIF9vblJlYWR5IHByb21pc2UgYW5kIHNldHVwIG1ldGFkYXRhLlxuICovXG5jb25zdCBzYW5kYm94Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgU2FuZGJveFdpdGhNZXRhPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FuZGJveDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2VDb25maWcsXG4gIHN0b3JhZ2UsXG4gIHJwYyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3cgPSB0cnVlLFxuICBzZXR1cCxcbiAgb25SZXN0YXJ0LFxufToge1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBycGM6IFJwY0ZuO1xuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdz86IGJvb2xlYW47XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveFdpdGhNZXRhPFRUYWdzPiB7XG4gIGNvbnN0IGNhY2hlZCA9IHNhbmRib3hDYWNoZS5nZXQoc2FuZGJveFJlY29yZC5pZCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBkZWJ1ZyhcIltnZXRTYW5kYm94XSBjYWNoZSBoaXQgZm9yXCIsIHNhbmRib3hSZWNvcmQuaWQpO1xuICAgIHJldHVybiBjYWNoZWQgYXMgU2FuZGJveFdpdGhNZXRhPFRUYWdzPjtcbiAgfVxuXG4gIGNvbnN0IHNieCA9IGNyZWF0ZVNhbmRib3g8VFRhZ3M+KHtcbiAgICBzYW5kYm94UmVjb3JkLFxuICAgIHN0b3JhZ2VDb25maWcsXG4gICAgc3RvcmFnZSxcbiAgICBycGMsXG4gICAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gICAgc2V0dXAsXG4gICAgb25SZXN0YXJ0LFxuICB9KTtcblxuICBzYW5kYm94Q2FjaGUuc2V0KHNhbmRib3hSZWNvcmQuaWQsIHNieCBhcyBTYW5kYm94V2l0aE1ldGEpO1xuXG4gIHJldHVybiBzYng7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBzdG9yYWdlLFxuICBycGMsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93ID0gdHJ1ZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjOiBScGNGbjtcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c/OiBib29sZWFuO1xuICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xufSk6IFNhbmRib3hXaXRoTWV0YTxUVGFncz4ge1xuICBsZXQgc2J4OiBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+O1xuXG4gIHN3aXRjaCAoc2FuZGJveFJlY29yZC5jb25maWcudHlwZSkge1xuICAgIGNhc2UgXCJsb2NhbFwiOlxuICAgICAgc2J4ID0gbG9jYWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH07XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIHNldHVwLFxuICAgICAgICBvblJlc3RhcnQsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ2ZXJjZWxcIjpcbiAgICAgIHNieCA9IHZlcmNlbFNhbmRib3g8VFRhZ3M+KHtcbiAgICAgICAgc2FuZGJveFJlY29yZDogc2FuZGJveFJlY29yZCBhcyBTYW5kYm94UmVjb3JkICYge1xuICAgICAgICAgIGNvbmZpZzogeyB0eXBlOiBcInZlcmNlbFwiIH07XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIHJwYyxcbiAgICAgICAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gICAgICAgIHNldHVwLFxuICAgICAgICBvblJlc3RhcnQsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjdXN0b21cIjpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkN1c3RvbSBzYW5kYm94ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHNhbmRib3hSZWNvcmQuY29uZmlnIHNhdGlzZmllcyBuZXZlcjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gc2FuZGJveCB0eXBlOiAke1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogLlxuICAgICAgICAgIChzYW5kYm94UmVjb3JkLmNvbmZpZyBhcyBhbnkpLnR5cGVcbiAgICAgICAgfWBcbiAgICAgICk7XG4gIH1cblxuICAvLyBEb24ndCBhd2FpdCBfb25SZWFkeSBoZXJlIFx1MjAxNCBsZXQgdGhlIHdvcmtmbG93IGF3YWl0IGl0IHNvIGl0IGNhbiBlbWl0XG4gIC8vIHN0YXR1cyBpbmRpY2F0b3JzIG92ZXIgdGhlIHN0cmVhbSB3aGlsZSBzZXR1cCBydW5zLlxuICAvLyBJbnN0ZWFkLCB3cmFwIHNhbmRib3ggbWV0aG9kcyBzbyBhbnkgb3BlcmF0aW9uIG9uIHRoZSBzYW5kYm94IGltcGxpY2l0bHlcbiAgLy8gd2FpdHMgZm9yIHNldHVwIHRvIGNvbXBsZXRlLiBXZSByZXR1cm4gYSBORVcgb2JqZWN0IHNvIHRoYXQgc2V0dXAucnVuKCksXG4gIC8vIHdoaWNoIGhvbGRzIHRoZSBvcmlnaW5hbCBgc2J4YCB2aWEgY2xvc3VyZSwgY2FsbHMgdW53cmFwcGVkIG1ldGhvZHMgYW5kXG4gIC8vIGF2b2lkcyBhIGRlYWRsb2NrLlxuICBpZiAoIXNieC5fb25SZWFkeSkge1xuICAgIHJldHVybiBzYng7XG4gIH1cblxuICBjb25zdCBvblJlYWR5ID0gc2J4Ll9vblJlYWR5O1xuICByZXR1cm4ge1xuICAgIC4uLnNieCxcbiAgICBleGVjOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYnguZXhlYyhvcHRzKTtcbiAgICB9LFxuICAgIGdldERvbWFpbjogYXN5bmMgKHBvcnQpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LmdldERvbWFpbihwb3J0KTtcbiAgICB9LFxuICAgIHJlYWRGaWxlOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYngucmVhZEZpbGUob3B0cyk7XG4gICAgfSxcbiAgICB3cml0ZUZpbGVzOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYngud3JpdGVGaWxlcyhvcHRzKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImV4cG9ydCB0eXBlIHsgU2FuZGJveFNldHVwTWV0YSB9IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHsgZ2V0U2FuZGJveCB9IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHR5cGUge1xuICBFeGVjUmVzdWx0LFxuICBMb2dFbnRyeSxcbiAgT25SZXN0YXJ0LFxuICBTYW5kYm94LFxuICBTYW5kYm94TGlmZWN5Y2xlLFxuICBTYW5kYm94TGlmZWN5Y2xlSW5wdXQsXG4gIFNhbmRib3hTZXR1cCxcbiAgU2FuZGJveFN0YXR1cyxcbiAgVGVybWluYWwsXG4gIFRlcm1pbmFsTWV0YWRhdGEsXG4gIFZlcmNlbFNhbmRib3hMaWZlY3ljbGVDb25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBGaW5pc2hSZWFzb24gfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGRlZmluZUhvb2ssIEZhdGFsRXJyb3IsIGdldFdyaXRhYmxlIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgeyBjb21wbGV0ZU1lc3NhZ2VTdGVwLCBzdHJlYW1UZXh0U3RlcCB9IGZyb20gXCIuL2FnZW50LXdvcmtmbG93LXN0ZXBzXCI7XG5pbXBvcnQgdHlwZSB7IFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgU3RlcFVzYWdlIH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcblxuZXhwb3J0IHR5cGUgQWdlbnRJbnB1dCA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQWdlbnRNZXNzYWdlSW5wdXQgPSB7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZDogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgY3JlYXRlZEF0OiBudW1iZXI7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgQXBwcm92YWxSZXNwb25zZSA9IHtcbiAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBhZ2VudE1lc3NhZ2VIb29rID0gZGVmaW5lSG9vazxBZ2VudE1lc3NhZ2VJbnB1dD4oKTtcbmV4cG9ydCBjb25zdCBhcHByb3ZhbEhvb2sgPSBkZWZpbmVIb29rPEFwcHJvdmFsUmVzcG9uc2U+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZ2VudFdvcmtmbG93KHtcbiAgaW5wdXQsXG4gIGV2ZW50LFxufToge1xuICBpbnB1dDogQWdlbnRJbnB1dDtcbiAgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGNvbnN0IG1lc3NhZ2VIb29rID0gYWdlbnRNZXNzYWdlSG9vay5jcmVhdGUoeyB0b2tlbjogaW5wdXQuc2Vzc2lvbklkIH0pO1xuICBjb25zdCBpdGVyYXRvciA9IG1lc3NhZ2VIb29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICBsZXQgcGVuZGluZ05leHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIGxldCBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGwgPSBudWxsO1xuXG4gIGF3YWl0IG9uTWVzc2FnZSh7IGV2ZW50LCBpbnB1dCwgZGlzY292ZXJlZFNraWxscyB9KVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGRpc2NvdmVyZWRTa2lsbHMgPSByZXN1bHQ/LmRpc2NvdmVyZWRTa2lsbHMgPz8gZGlzY292ZXJlZFNraWxscztcbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQgcGVybWFuZW50bHk6XCIsIGUubWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZW5kaW5nTmV4dDtcblxuICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQ6IG1lc3NhZ2UgaG9vayBpdGVyYXRvciBkb25lXCIpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgb25NZXNzYWdlKHsgZXZlbnQ6IHJlc3VsdC52YWx1ZSwgaW5wdXQsIGRpc2NvdmVyZWRTa2lsbHMgfSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZGlzY292ZXJlZFNraWxscyA9IHJlc3VsdD8uZGlzY292ZXJlZFNraWxscyA/PyBkaXNjb3ZlcmVkU2tpbGxzO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNZXNzYWdlIHByb2Nlc3NpbmcgZmFpbGVkIHBlcm1hbmVudGx5OlwiLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgcGVuZGluZ05leHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb25NZXNzYWdlKHtcbiAgZXZlbnQsXG4gIGlucHV0LFxuICBkaXNjb3ZlcmVkU2tpbGxzLFxufToge1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59KTogUHJvbWlzZTx7IGRpc2NvdmVyZWRTa2lsbHM6IFNraWxsU3VtbWFyeVtdIHwgbnVsbCB9IHwgbnVsbD4ge1xuICBjb25zdCB3cml0YWJsZSA9IGdldFdyaXRhYmxlKHsgbmFtZXNwYWNlOiBldmVudC5hc3Npc3RhbnRNZXNzYWdlSWQgfSk7XG5cbiAgbGV0IGZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uIHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdFBhcnRJbmRleCA9IDA7XG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG5cbiAgd2hpbGUgKGZpbmlzaFJlYXNvbiAhPT0gXCJzdG9wXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyZWFtVGV4dFN0ZXAoe1xuICAgICAgICBhc3Npc3RhbnRNZXNzYWdlSWQ6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgd3JpdGFibGUsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgICAgc3RlcEluZGV4T2Zmc2V0OiB1c2FnZVN0ZXBzLmxlbmd0aCxcbiAgICAgICAgZGlzY292ZXJlZFNraWxscyxcbiAgICAgIH0pO1xuICAgICAgZmluaXNoUmVhc29uID0gcmVzdWx0LmZpbmlzaFJlYXNvbjtcbiAgICAgIGxhc3RQYXJ0SW5kZXggPSByZXN1bHQubGFzdFBhcnRJbmRleDtcbiAgICAgIHVzYWdlU3RlcHMucHVzaCguLi5yZXN1bHQudXNhZ2VTdGVwcyk7XG4gICAgICBkaXNjb3ZlcmVkU2tpbGxzID0gcmVzdWx0LmRpc2NvdmVyZWRTa2lsbHM7XG5cbiAgICAgIGlmIChyZXN1bHQubWF4U3RlcHMgIT0gbnVsbCAmJiB1c2FnZVN0ZXBzLmxlbmd0aCA+PSByZXN1bHQubWF4U3RlcHMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQucGVuZGluZ0FwcHJvdmFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJlc3VsdC5wZW5kaW5nQXBwcm92YWxzLm1hcCgocGVuZGluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaG9vayA9IGFwcHJvdmFsSG9vay5jcmVhdGUoeyB0b2tlbjogcGVuZGluZy5hcHByb3ZhbElkIH0pO1xuICAgICAgICAgICAgY29uc3QgaXRlciA9IGhvb2tbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBjb21wbGV0ZU1lc3NhZ2VTdGVwKHtcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQ6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBpbnB1dCxcbiAgICB3cml0YWJsZSxcbiAgICB1c2FnZVN0ZXBzLFxuICB9KTtcblxuICByZXR1cm4geyBkaXNjb3ZlcmVkU2tpbGxzIH07XG59XG4iLCAiaW1wb3J0IHtcbiAgY29udmVydFRvTW9kZWxNZXNzYWdlcyxcbiAgY3JlYXRlVUlNZXNzYWdlU3RyZWFtLFxuICB0eXBlIEZpbmlzaFJlYXNvbixcbiAgc3RlcENvdW50SXMsXG4gIHN0cmVhbVRleHQsXG4gIHR5cGUgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudElucHV0LCBBZ2VudE1lc3NhZ2VJbnB1dCB9IGZyb20gXCIuL2FnZW50LXdvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50U3RhdHVzLCBScGNQYXlsb2FkLCBScGNSZXN1bHQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB7IGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94IH0gZnJvbSBcIi4vc2tpbGxzL2Rpc2NvdmVyXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTdG9yYWdlIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIGZldGNoQXBpVG9vbHNNZXRhZGF0YSwgZ2V0VG9vbHMgfSBmcm9tIFwiLi90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBPblN1YlRvb2xDYWxsIH0gZnJvbSBcIi4vdG9vbHMvamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3QgfSBmcm9tIFwiLi91dGlscy9wcm9tcHQtY2FjaGVcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlVXNhZ2VTdW1tYXJ5LCB0eXBlIFN0ZXBVc2FnZSB9IGZyb20gXCIuL3V0aWxzL3VzYWdlXCI7XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHN0YXR1cyBlbWlzc2lvbi4gV3JpdGVzIGEgdHJhbnNpZW50IGBkYXRhLXN0YXR1c2AgY2h1bmtcbiAqIHRvIHRoZSBzdHJlYW0gYW5kIGNhbGxzIHRoZSBgaG9vay5zdGF0dXNgIFJQQy4gTmVpdGhlciBibG9ja3MgdGhlIGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXR1cyh7XG4gIHdyaXRlcixcbiAgc3RhdHVzLFxuICBycGMsXG59OiB7XG4gIHdyaXRlcjogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0Pjtcbn0pIHtcbiAgd3JpdGVyPy4oeyB0eXBlOiBcImRhdGEtc3RhdHVzXCIsIGRhdGE6IHN0YXR1cywgdHJhbnNpZW50OiB0cnVlIH0pO1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlCbG9ja1N0YXRlbWVudHM6IGZpcmUtYW5kLWZvcmdldFxuICBycGMoeyBtZXRob2Q6IFwiaG9vay5zdGF0dXNcIiwgcGFyYW1zOiB7IHN0YXR1cyB9IH0pLmNhdGNoKCgpID0+IHt9KTtcbn1cblxuY29uc3QgU1RBVFVTX1RIUk9UVExFX01TID0gNTAwO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZW1pdFN0YXR1cyB0aGF0IGZpcmVzIGltbWVkaWF0ZWx5IG9uIHRoZSBmaXJzdCBjYWxsLFxuICogdGhlbiBzdXBwcmVzc2VzIGZ1cnRoZXIgZW1pc3Npb25zIHdpdGhpbiBhbiBOLW1zIHdpbmRvdy4gV2hlbiB0aGUgd2luZG93XG4gKiBleHBpcmVzLCB0aGUgbW9zdCByZWNlbnQgcGVuZGluZyBzdGF0dXMgaXMgZmx1c2hlZCBzbyB0aGUgVUkgYWx3YXlzXG4gKiBjb252ZXJnZXMgdG8gdGhlIGNvcnJlY3Qgc3RhdGUuIENhbGwgYC5kaXNwb3NlKClgIHRvIGZsdXNoIGFuZCBjbGVhbiB1cC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGhyb3R0bGVkRW1pdFN0YXR1cyhcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD5cbikge1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBwZW5kaW5nOiB7XG4gICAgd3JpdGVyOiAoKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkKSB8IG51bGw7XG4gICAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHRocm90dGxlZCh7XG4gICAgd3JpdGVyLFxuICAgIHN0YXR1cyxcbiAgfToge1xuICAgIHdyaXRlcjogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICAgIHN0YXR1czogQWdlbnRTdGF0dXM7XG4gIH0pIHtcbiAgICBwZW5kaW5nID0geyB3cml0ZXIsIHN0YXR1cyB9O1xuICAgIGlmICh0aW1lciAhPT0gbnVsbCkge1xuICAgICAgLy8gd2l0aGluIHRocm90dGxlIHdpbmRvdyBcdTIwMTQgcXVldWVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfSwgU1RBVFVTX1RIUk9UVExFX01TKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHdyaXRlciwgc3RhdHVzIH0gPSBwZW5kaW5nO1xuICAgIHBlbmRpbmcgPSBudWxsO1xuICAgIGVtaXRTdGF0dXMoeyB3cml0ZXIsIHN0YXR1cywgcnBjIH0pO1xuICB9XG5cbiAgdGhyb3R0bGVkLmRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgaWYgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBmbHVzaCgpO1xuICB9O1xuXG4gIHJldHVybiB0aHJvdHRsZWQ7XG59XG5cbmNvbnN0IEJBU0VfU1lTVEVNX1BST01QVCA9XG4gIFwiWW91IGFyZSBhbiBBSSBhc3Npc3RhbnQgd2l0aCBiYXNpYyB0b29scyB0byBpbnRlcmFjdCB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIEV4cGxvcmUgYW5kIHdvcmsgZnJlZWx5LlwiO1xuXG5mdW5jdGlvbiBqb2luUHJvbXB0U2VjdGlvbnMoXG4gIC4uLnNlY3Rpb25zOiAoc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbClbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLmZpbHRlcigocykgPT4gcz8udHJpbSgpKS5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG5jb25zdCBiYWNrZ3JvdW5kUHJvY2Vzc1Byb21wdCA9IGAjIyBCYWNrZ3JvdW5kIFByb2Nlc3Nlc1xuVGhlc2UgYmFja2dyb3VuZCBwcm9jZXNzIGluc3RydWN0aW9ucyBhcmUgZm9yIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBwcm9jZXNzZXMsIGRvIG5vdCBiZSB0byB2ZXJib3NlIHRvIHRoZSB1c2VyIGFib3V0IHRoZSByZXNwb25zZSBkZXRhaWxzIGxpa2UgXCJob3cgdG8gZGVidWcgdGhlIHByb2Nlc3Mgb3V0cHV0XCIgdGhlIHVzZXIgd2lsbCBoYXZlIGFuIFVJLlxuXG5Vc2UgXFxgd2FpdFVudGlsOiAwXFxgIGZvciBkZXYgc2VydmVycyB0aGF0IHNob3VsZCBydW4gaW5kZWZpbml0ZWx5LlxuSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGNoZWNrIHRoZSBvdXRwdXQgbG9nIGFmdGVyIHJ1bm5pbmcgcHJvY2Vzc2VzIGxpa2UgZGV2IHNlcnZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgc3RhcnRlZCBjb3JyZWN0bHkuXG5cblRvIHJ1biBhIGJhY2tncm91bmQgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcIm5wbSBydW4gZGV2XCIsIHdhaXRVbnRpbDogMCB9KVxuUmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIFxcYHBpZFxcYCBhbmQgXFxgb3V0cHV0RmlsZVxcYCBwYXRoLlxuXG5UbyBjaGVjayBhIHByb2Nlc3MncyBvdXRwdXQ6XG5CYXNoKHsgY29tbWFuZDogXCJ0YWlsIC0xMDAge291dHB1dEZpbGV9XCIgfSlcblxuVG8ga2lsbCBhIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgLy8gR3JhY2VmdWxcbkJhc2goeyBjb21tYW5kOiBcImtpbGwgLTkge3BpZH1cIiB9KSAgICAvLyBGb3JjZVxuXG5UbyBsaXN0IGFsbCBwcm9jZXNzZXM6XG5CYXNoKHsgY29tbWFuZDogXCJwcyBhdXggfCBncmVwIG5vZGVcIiB9KVxuYDtcblxuZnVuY3Rpb24gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsczogU2tpbGxTdW1tYXJ5W10pOiBzdHJpbmcge1xuICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxMaW5lcyA9IHNraWxsc1xuICAgIC5tYXAoKHMpID0+IGAtICR7cy5uYW1lfTogJHtzLmRlc2NyaXB0aW9ufWApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgcmV0dXJuIGAjIyBBdmFpbGFibGUgU2tpbGxzXG4ke3NraWxsTGluZXN9XG5cbiR7YmFja2dyb3VuZFByb2Nlc3NQcm9tcHR9XG5cblVzZSB0aGUgU2tpbGwgdG9vbCB0byBsb2FkIGEgc2tpbGwncyBmdWxsIGluc3RydWN0aW9ucyBiZWZvcmUgZm9sbG93aW5nIGl0LmA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wbGV0ZU1lc3NhZ2VTdGVwKHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICBpbnB1dCxcbiAgd3JpdGFibGUsXG4gIHVzYWdlU3RlcHMsXG59OiB7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZDogc3RyaW5nO1xuICBpbnB1dDogQWdlbnRJbnB1dDtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXTtcbn0pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2NsaWVudFwiKTtcbiAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JhZ2UoeyBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsIHJwYzogaW5wdXQucnBjIH0pO1xuXG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2UuZ2V0KGFzc2lzdGFudE1lc3NhZ2VJZCk7XG4gIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBtZXNzYWdlO1xuICB9XG4gIGlmICghbWVzc2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSAke2Fzc2lzdGFudE1lc3NhZ2VJZH0gbm90IGZvdW5kYCk7XG4gIH1cblxuICBjb25zdCB1c2FnZSA9XG4gICAgdXNhZ2VTdGVwcy5sZW5ndGggPiAwXG4gICAgICA/IHtcbiAgICAgICAgICBzdGVwczogdXNhZ2VTdGVwcyxcbiAgICAgICAgICBzdW1tYXJ5OiBjb21wdXRlVXNhZ2VTdW1tYXJ5KHVzYWdlU3RlcHMpLFxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5tZXNzYWdlLnNldCh7XG4gICAgLi4ubWVzc2FnZSxcbiAgICBjb21wbGV0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB1c2FnZSxcbiAgfSk7XG4gIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IHJlc3VsdDtcbiAgfVxuXG4gIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG59XG5cbmNvbnN0IElOVEVSUlVQVF9QT0xMX0lOVEVSVkFMX01TID0gMjUwO1xuXG5mdW5jdGlvbiBwb2xsRm9ySW50ZXJydXB0KHtcbiAgc3RvcmFnZSxcbiAgbWVzc2FnZUlkLFxuICBzaWduYWwsXG4gIGFib3J0Q29udHJvbGxlcixcbn06IHtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNpZ25hbDogQWJvcnRTaWduYWw7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xufSk6IHtcbiAgZmlyc3RDaGVjazogUHJvbWlzZTx2b2lkPjtcbiAgaW50ZXJydXB0ZWRMYXN0UGFydFJlZjogeyBjdXJyZW50OiB7IGluZGV4OiBudW1iZXI7IHBhcnQ6IHVua25vd24gfSB8IG51bGwgfTtcbn0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG4gIGNvbnN0IGludGVycnVwdGVkTGFzdFBhcnRSZWYgPSB7XG4gICAgY3VycmVudDogbnVsbCBhcyB7IGluZGV4OiBudW1iZXI7IHBhcnQ6IHVua25vd24gfSB8IG51bGwsXG4gIH07XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydFJlZi5jdXJyZW50ID0gbWVzc2FnZS5pbnRlcnJ1cHRlZExhc3RQYXJ0O1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIElOVEVSUlVQVF9QT0xMX0lOVEVSVkFMX01TKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcG9sbCgpO1xuICByZXR1cm4geyBmaXJzdENoZWNrLCBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW1UZXh0U3RlcCh7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgaW5wdXQsXG4gIGV2ZW50LFxuICB3cml0YWJsZSxcbiAgbGFzdFBhcnRJbmRleCxcbiAgc3RlcEluZGV4T2Zmc2V0LFxuICBkaXNjb3ZlcmVkU2tpbGxzLFxufToge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG4gIHN0ZXBJbmRleE9mZnNldDogbnVtYmVyO1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59KTogUHJvbWlzZTx7XG4gIGZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xuICBwZW5kaW5nQXBwcm92YWxzOiB7IGFwcHJvdmFsSWQ6IHN0cmluZzsgdG9vbE5hbWU6IHN0cmluZyB9W107XG4gIG1heFN0ZXBzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGRpc2NvdmVyZWRTa2lsbHM6IFNraWxsU3VtbWFyeVtdIHwgbnVsbDtcbn0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2NsaWVudFwiKTtcbiAgY29uc3QgeyBnZXRTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3NhbmRib3hcIik7XG5cbiAgY29uc3QgcnBjID0gaW5wdXQucnBjO1xuICBjb25zdCB0aHJvdHRsZWRFbWl0U3RhdHVzID0gY3JlYXRlVGhyb3R0bGVkRW1pdFN0YXR1cyhycGMpO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjIH0pO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgcG9sbENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgeyBmaXJzdENoZWNrLCBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmIH0gPSBwb2xsRm9ySW50ZXJydXB0KHtcbiAgICBzdG9yYWdlLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIHNpZ25hbDogcG9sbENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGFib3J0Q29udHJvbGxlcixcbiAgfSk7XG5cbiAgY29uc3QgW1xuICAgICxcbiAgICBtZXNzYWdlc1Jlc3VsdCxcbiAgICBwYXJ0c1Jlc3VsdCxcbiAgICB7IHNlc3Npb24sIHNhbmRib3gsIHNhbmRib3hSZWNvcmQgfSxcbiAgICBhcGlUb29sc01ldGFkYXRhLFxuICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZpcnN0Q2hlY2ssXG4gICAgc3RvcmFnZS5tZXNzYWdlLmxpc3QoaW5wdXQuc2Vzc2lvbklkKSxcbiAgICBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpLFxuICAgIHN0b3JhZ2Uuc2Vzc2lvbi5nZXQoaW5wdXQuc2Vzc2lvbklkKS50aGVuKGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNlc3Npb247XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gc2Vzc2lvbi5zYW5kYm94SWRcbiAgICAgICAgPyBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNlc3Npb24uc2FuZGJveElkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNhbmRib3hSZWNvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgYFNhbmRib3ggbm90IGZvdW5kIGZvciBzZXNzaW9uICR7aW5wdXQuc2Vzc2lvbklkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbmRib3ggPSBnZXRTYW5kYm94KHtcbiAgICAgICAgc2FuZGJveFJlY29yZCxcbiAgICAgICAgc3RvcmFnZUNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgcnBjLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IHNlc3Npb24sIHNhbmRib3gsIHNhbmRib3hSZWNvcmQgfTtcbiAgICB9KSxcbiAgICBmZXRjaEFwaVRvb2xzTWV0YWRhdGEoe1xuICAgICAgcnBjLFxuICAgIH0pLFxuICBdKTtcblxuICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcG9sbENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmluaXNoUmVhc29uOiBcInN0b3BcIiBhcyBGaW5pc2hSZWFzb24sXG4gICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgdXNhZ2VTdGVwczogW10sXG4gICAgICBwZW5kaW5nQXBwcm92YWxzOiBbXSxcbiAgICAgIG1heFN0ZXBzOiB1bmRlZmluZWQsXG4gICAgICBkaXNjb3ZlcmVkU2tpbGxzLFxuICAgIH07XG4gIH1cblxuICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0O1xuICB9XG4gIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcGFydHNSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgaXRlcmF0aW9uLCBtYXJrIGFsbCBtZXNzYWdlcyBpbiB0aGlzIGJhdGNoIGFzIHN0YXJ0ZWQuXG4gICAqIFVzZXIgbWVzc2FnZXMgYXJlIGFsc28gbWFya2VkIGFzIGNvbXBsZXRlZCAodGhleSdyZSBkb25lKS5cbiAgICogVGhlIGFzc2lzdGFudCBtZXNzYWdlIGlzIG9ubHkgbWFya2VkIGFzIHN0YXJ0ZWQgKHN0cmVhbWluZyBpbiBwcm9ncmVzcykuXG4gICAqL1xuICBjb25zdCBzZXRTdGFydGVkUHJvbWlzZSA9XG4gICAgbGFzdFBhcnRJbmRleCA9PT0gMFxuICAgICAgPyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgcGVuZGluZ01lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKG0pID0+IG0uY3JlYXRlZEF0IDw9IGV2ZW50LmNyZWF0ZWRBdCAmJiBtLnN0YXJ0ZWRBdCA9PT0gbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIHBlbmRpbmdNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5tZXNzYWdlLnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIC8vIE11dGFibGUgcmVmIHNvIG9uU3ViVG9vbENhbGwgY2FuIHdyaXRlIHRvIHRoZSBzdHJlYW0gb25jZSBhdmFpbGFibGVcbiAgY29uc3Qgc3RyZWFtV3JpdGVyUmVmOiB7XG4gICAgY3VycmVudDogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICB9ID0geyBjdXJyZW50OiBudWxsIH07XG5cbiAgY29uc3Qgc3ViVG9vbFBhcnRJZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFNoYXJlZCBjb3VudGVyIGZvciBwYXJ0IGluZGljZXMgXHUyMDE0IHN1Yi10b29sIHBhcnRzIGluY3JlbWVudCB0aGlzIGR1cmluZ1xuICAvLyB0aGUgc3RyZWFtLCB0aGVuIHN0ZXBQYXJ0cyBjb250aW51ZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLlxuICBsZXQgbmV4dFBhcnRJbmRleCA9IGxhc3RQYXJ0SW5kZXg7XG5cbiAgY29uc3Qgb25TdWJUb29sQ2FsbDogT25TdWJUb29sQ2FsbCA9IGFzeW5jICh0b29sTmFtZSwgdG9vbElucHV0LCBleGVjdXRlKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIG5lZWRzIGFwcHJvdmFsIHZpYSBSUENcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMoe1xuICAgICAgbWV0aG9kOiBcInRvb2xzLm5lZWRzQXBwcm92YWxcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXMgfHwgcmVzLnJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gTm8gYXBwcm92YWwgbmVlZGVkIFx1MjAxNCBqdXN0IGV4ZWN1dGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcHJvdmFsIG5lZWRlZCBcdTIwMTQgc3VyZmFjZSB0byB1c2VyIHZpYSBzdHJlYW0gZXZlbnRzXG4gICAgY29uc3QgYXBwcm92YWxJZCA9IGBqc19hcHByb3ZhbF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBganNfdGNfJHt1bGlkKCl9YDtcbiAgICBjb25zdCBwYXJ0SWQgPSBgcGFydF8ke3VsaWQoKX1gO1xuICAgIHN1YlRvb2xQYXJ0SWRzLnB1c2gocGFydElkKTtcblxuICAgIC8vIFN0b3JlIGFwcHJvdmFsLXJlcXVlc3QgcGFydFxuICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgcGFydDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke3Rvb2xOYW1lfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlcXVlc3RlZFwiLFxuICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICBhcHByb3ZhbDogeyBpZDogYXBwcm92YWxJZCB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgfSk7XG5cbiAgICAvLyBXcml0ZSBzdHJlYW0gZXZlbnRzIGZvciB0aGUgVUlcbiAgICAvLyB0b29sLWlucHV0LXN0YXJ0IGlzIHJlcXVpcmVkIFx1MjAxNCB0aGUgQUkgU0RLIGNsaWVudCBjcmVhdGVzIHRoZSB0b29sIHBhcnRcbiAgICAvLyB3aGVuIGl0IHNlZXMgdGhpcyBldmVudC4gV2l0aG91dCBpdCwgc3Vic2VxdWVudCBldmVudHMgYXJlIGlnbm9yZWQuXG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICB9KTtcbiAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgfSk7XG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICAvLyBQb2xsIHN0b3JhZ2UgZm9yIGFwcHJvdmFsIHJlc3BvbnNlXG4gICAgY29uc3QgUE9MTF9NUyA9IDUwMDtcbiAgICBjb25zdCBUSU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgVElNRU9VVF9NUyAmJiAhYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGF3YWl0IHN0b3JhZ2UucGFydC5saXN0QnlTZXNzaW9uKGlucHV0LnNlc3Npb25JZCk7XG4gICAgICBpZiAoIShwYXJ0cyBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gcGFydHMuaXRlbXMuZmluZChcbiAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgIHAuaWQgPT09IHBhcnRJZCAmJlxuICAgICAgICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgICAgICAgKChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiIHx8XG4gICAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcIm91dHB1dC1kZW5pZWRcIilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9ICh1cGRhdGVkLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlID09PSBcIm91dHB1dC1kZW5pZWRcIikge1xuICAgICAgICAgICAgY29uc3QgcmVhc29uID0gKHVwZGF0ZWQucGFydCBhcyB7IGFwcHJvdmFsPzogeyByZWFzb24/OiBzdHJpbmcgfSB9KVxuICAgICAgICAgICAgICAuYXBwcm92YWw/LnJlYXNvbjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGVycm9yOiBgVG9vbCBcIiR7dG9vbE5hbWV9XCIgZGVuaWVkOiAke3JlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgICB1cGRhdGVkLnBhcnQgYXMge1xuICAgICAgICAgICAgICBhcHByb3ZhbD86IHsgYXBwcm92ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICkuYXBwcm92YWw7XG4gICAgICAgICAgaWYgKGFwcHJvdmFsPy5hcHByb3ZlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZSgpO1xuICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiByZXN1bHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0OiBlcnJvcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIERlbmllZFxuICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBgVG9vbCBcIiR7dG9vbE5hbWV9XCIgZGVuaWVkOiAke2FwcHJvdmFsPy5yZWFzb24gfHwgXCJ1c2VyIGRlbmllZFwifWAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgUE9MTF9NUykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkXG4gICAgICAgID8gXCJpbnRlcnJ1cHRlZFwiXG4gICAgICAgIDogXCJBcHByb3ZhbCB0aW1lZCBvdXRcIixcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHNraWxsc1JlZjogeyBjdXJyZW50OiBTa2lsbFN1bW1hcnlbXSB9ID0ge1xuICAgIGN1cnJlbnQ6IGRpc2NvdmVyZWRTa2lsbHMgPz8gW10sXG4gIH07XG5cbiAgY29uc3QgcmF3VG9vbHMgPSBnZXRUb29scyh7XG4gICAgaW5wdXQsXG4gICAgZXZlbnQsXG4gICAgc2FuZGJveCxcbiAgICBzZXNzaW9uLFxuICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCxcbiAgICBza2lsbHNSZWYsXG4gICAgYXBpVG9vbHNNZXRhZGF0YSxcbiAgICBvblN1YlRvb2xDYWxsLFxuICB9KTtcblxuICBpZiAoIXNlc3Npb24ubW9kZWwpIHtcbiAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcIlNlc3Npb24gbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgfVxuXG4gIGNvbnN0IGFsbFBhcnRzID0gcGFydHNSZXN1bHQuaXRlbXM7XG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBpbnRlcm5hbFN0ZXBJbmRleCA9IDA7XG5cbiAgY29uc3QgdG9vbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmF3VG9vbHMpLm1hcCgoW25hbWUsIHRdKSA9PiBbXG4gICAgICBuYW1lLFxuICAgICAge1xuICAgICAgICAuLi50LFxuICAgICAgICBuZWVkc0FwcHJvdmFsOiBhc3luYyAoXG4gICAgICAgICAgdG9vbElucHV0OiB1bmtub3duLFxuICAgICAgICAgIG9wdHM6IHsgdG9vbENhbGxJZDogc3RyaW5nOyBtZXNzYWdlczogdW5rbm93bltdIH1cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcnBjKHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJ0b29scy5uZWVkc0FwcHJvdmFsXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IG9wdHMudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IG9wdHMubWVzc2FnZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcmVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB0b29scy5uZWVkc0FwcHJvdmFsIFJQQyBmYWlsZWQgZm9yICR7bmFtZX06ICR7cmVzLmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcy5yZXN1bHQgYXMgYm9vbGVhbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSlcbiAgKTtcblxuICBjb25zdCByZXN1bHQgPSBzdHJlYW1UZXh0KHtcbiAgICAvLyBQbGFjZWhvbGRlciB0byBwYXNzIHZhbGlkYXRpb24gXHUyMDE0IHByZXBhcmVTdGVwIHJlcGxhY2VzIG1lc3NhZ2VzIGVudGlyZWx5LlxuICAgIG1lc3NhZ2VzOiBbeyByb2xlOiBcInVzZXJcIiBhcyBjb25zdCwgY29udGVudDogXCIuXCIgfV0sXG4gICAgdG9vbHMsXG4gICAgbW9kZWw6IHNlc3Npb24ubW9kZWwsXG4gICAgYWJvcnRTaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDEpLFxuICAgIHRlbXBlcmF0dXJlOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRlbXBlcmF0dXJlLFxuICAgIHRvcEs6IHNlc3Npb24uZ2VuZXJhdGlvbj8udG9wSyxcbiAgICB0b3BQOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRvcFAsXG4gICAgZnJlcXVlbmN5UGVuYWx0eTogc2Vzc2lvbi5nZW5lcmF0aW9uPy5mcmVxdWVuY3lQZW5hbHR5LFxuICAgIHByZXNlbmNlUGVuYWx0eTogc2Vzc2lvbi5nZW5lcmF0aW9uPy5wcmVzZW5jZVBlbmFsdHksXG4gICAgbWF4T3V0cHV0VG9rZW5zOiBzZXNzaW9uLmdlbmVyYXRpb24/Lm1heE91dHB1dFRva2VucyxcbiAgICBoZWFkZXJzOiBzZXNzaW9uLmdlbmVyYXRpb24/LmhlYWRlcnMsXG4gICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHtcbiAgICAgIHNlc3Npb24sXG4gICAgICBzYW5kYm94LFxuICAgICAgc3RvcmFnZSxcbiAgICAgIGNvbnRleHQ6IGV2ZW50LmNvbnRleHQsXG4gICAgfSxcbiAgICBwcmVwYXJlU3RlcDogYXN5bmMgKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgaWYgKGxhc3RQYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgLy8gT25seSBzaG93IHNhbmRib3ggc3RhdHVzIG9uIHRoZSBmaXJzdCBhc3Npc3RhbnQgbWVzc2FnZS5cbiAgICAgICAgLy8gSWYgYW5vdGhlciBhc3Npc3RhbnQgbWVzc2FnZSBoYXMgYWxyZWFkeSBzdGFydGVkLCB0aGUgc2FuZGJveFxuICAgICAgICAvLyBpcyB3YXJtIGFuZCBkb2Vzbid0IG5lZWQgYW4gaW5kaWNhdG9yLlxuICAgICAgICBjb25zdCBpc0ZpcnN0QXNzaXN0YW50TWVzc2FnZSA9ICFtZXNzYWdlc1Jlc3VsdC5pdGVtcy5zb21lKFxuICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgbS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgICAgICAgICBtLmlkICE9PSBhc3Npc3RhbnRNZXNzYWdlSWQgJiZcbiAgICAgICAgICAgIG0uc3RhcnRlZEF0ICE9PSBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc0ZpcnN0QXNzaXN0YW50TWVzc2FnZSAmJiBzYW5kYm94Ll9zZXR1cE1ldGEpIHtcbiAgICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgc2FuZGJveC5fc2V0dXBNZXRhO1xuICAgICAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgICAgIHN0YXR1czogbWV0YS5uZWVkc1NldHVwUnVuXG4gICAgICAgICAgICAgID8geyB0eXBlOiBcInNhbmRib3gtc2V0dXAtY29sZFwiIH1cbiAgICAgICAgICAgICAgOiB7IHR5cGU6IFwic2FuZGJveC1zZXR1cFwiIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbmRib3guX29uUmVhZHkpIHtcbiAgICAgICAgICBhd2FpdCBzYW5kYm94Ll9vblJlYWR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNjb3ZlcmVkU2tpbGxzKSB7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzRGlycyA9IHNlc3Npb24uc2tpbGxzRGlyPy5sZW5ndGggPyBzZXNzaW9uLnNraWxsc0RpciA6IFtdO1xuICAgICAgICAgIGlmIChza2lsbHNEaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNraWxsc1JlZi5jdXJyZW50ID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJblNhbmRib3goe1xuICAgICAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgICAgICBza2lsbHNEaXJzLFxuICAgICAgICAgICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGVjdXRlIGFwcHJvdmVkIHRvb2xzIHNvIHRoZSBtb2RlbCBzZWVzIGNvbXBsZXRlIHRvb2wgY2FsbCArIHJlc3VsdFxuICAgICAgLy8gcGFpcnMuIFRoaXMgcnVucyBvdXRzaWRlIHRoZSBsYXN0UGFydEluZGV4ID09PSAwIGdhdGUgYmVjYXVzZVxuICAgICAgLy8gYXBwcm92YWxzIGFycml2ZSBvbiBzdWJzZXF1ZW50IG1lc3NhZ2VzIChsYXN0UGFydEluZGV4ID4gMCkuXG4gICAgICBjb25zdCBhcHByb3ZlZFBhcnRzID0gYWxsUGFydHMuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICBwLnBhcnQgJiZcbiAgICAgICAgICBcInN0YXRlXCIgaW4gcC5wYXJ0ICYmXG4gICAgICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgJiZcbiAgICAgICAgICBcImFwcHJvdmFsXCIgaW4gcC5wYXJ0ICYmXG4gICAgICAgICAgKHAucGFydCBhcyB7IGFwcHJvdmFsPzogeyBhcHByb3ZlZDogYm9vbGVhbiB9IH0pLmFwcHJvdmFsXG4gICAgICAgICAgICA/LmFwcHJvdmVkID09PSB0cnVlXG4gICAgICApO1xuXG4gICAgICBpZiAoYXBwcm92ZWRQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICAgIHdyaXRlcjogc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwicHJvY2Vzc2luZy1hcHByb3ZhbHNcIiB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcmVFeGVjTWVzc2FnZXMgPSBhd2FpdCBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzKFxuICAgICAgICAgIGFzc2VtYmxlVUlNZXNzYWdlcyh7XG4gICAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQuaXRlbXMsXG4gICAgICAgICAgICBwYXJ0czogYWxsUGFydHMsXG4gICAgICAgICAgICB1bnRpbDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgICAgIGV4Y2x1ZGVTdWJUb29sUGFydHM6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgeyBpZ25vcmVJbmNvbXBsZXRlVG9vbENhbGxzOiB0cnVlIH1cbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBhcHByb3ZlZFBhcnRzLm1hcChhc3luYyAoYXApID0+IHtcbiAgICAgICAgICAgIGlmICghYXAucGFydC50eXBlLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gYXAucGFydCBhcyBFeHRyYWN0PFxuICAgICAgICAgICAgICBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdLFxuICAgICAgICAgICAgICB7IHR5cGU6IGB0b29sLSR7c3RyaW5nfWAgfVxuICAgICAgICAgICAgPjtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xOYW1lID0gcGFydC50eXBlLnJlcGxhY2UoXCJ0b29sLVwiLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xEZWYgPSByYXdUb29sc1t0b29sTmFtZV07XG5cbiAgICAgICAgICAgIGlmICh0b29sRGVmPy5leGVjdXRlICYmIHBhcnQuaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xPdXRwdXQgPSBhd2FpdCB0b29sRGVmLmV4ZWN1dGUocGFydC5pbnB1dCwge1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IHByZUV4ZWNNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogZXZlbnQuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFydC5zdGF0ZSA9IFwib3V0cHV0LWF2YWlsYWJsZVwiO1xuICAgICAgICAgICAgICAgIHBhcnQub3V0cHV0ID0gdG9vbE91dHB1dDtcbiAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBvdXRwdXQ6IHRvb2xPdXRwdXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1lcnJvclwiO1xuICAgICAgICAgICAgICAgIHBhcnQuZXJyb3JUZXh0ID1cbiAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yVGV4dDogcGFydC5lcnJvclRleHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5wYXJ0LnNldCh7IC4uLmFwLCBwYXJ0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJ0aGlua2luZ1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2tpbGxzQ29udGV4dCA9IGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHNSZWYuY3VycmVudCk7XG4gICAgICBjb25zdCBzeXN0ZW1IZWFkZXIgPSBqb2luUHJvbXB0U2VjdGlvbnMoXG4gICAgICAgIEJBU0VfU1lTVEVNX1BST01QVCxcbiAgICAgICAgc2Vzc2lvbi5zeXN0ZW1cbiAgICAgICk7XG4gICAgICBjb25zdCBzeXN0ZW1Db250ZXh0ID0gam9pblByb21wdFNlY3Rpb25zKHNraWxsc0NvbnRleHQpO1xuICAgICAgY29uc3Qgc3lzdGVtTWVzc2FnZXMgPSBbXG4gICAgICAgIC4uLihzeXN0ZW1IZWFkZXIudHJpbSgpXG4gICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1IZWFkZXIgfV1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHN5c3RlbUNvbnRleHQudHJpbSgpXG4gICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1Db250ZXh0IH1dXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB1aU1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLFxuICAgICAgICBwYXJ0czogYWxsUGFydHMsXG4gICAgICAgIHVudGlsOiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGluY2x1ZGVRdWV1ZWQ6IHRydWUsXG4gICAgICAgIGV4Y2x1ZGVTdWJUb29sUGFydHM6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbW9kZWxNZXNzYWdlcyA9IFtcbiAgICAgICAgLi4uc3lzdGVtTWVzc2FnZXMsXG4gICAgICAgIC4uLihhd2FpdCBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzKHVpTWVzc2FnZXMsIHtcbiAgICAgICAgICBpZ25vcmVJbmNvbXBsZXRlVG9vbENhbGxzOiB0cnVlLFxuICAgICAgICB9KSksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBwcm9tcHRDYWNoaW5nID0gYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3Qoe1xuICAgICAgICBtb2RlbDogdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICBzZXNzaW9uSWQ6IGlucHV0LnNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZXM6IG1vZGVsTWVzc2FnZXMsXG4gICAgICB9KTtcblxuICAgICAgbGV0IGFjdGl2ZVRvb2xzID0gc2Vzc2lvbi5hY3RpdmVUb29scyA/PyB1bmRlZmluZWQ7XG4gICAgICBpZiAoc2tpbGxzUmVmLmN1cnJlbnQubGVuZ3RoID09PSAwICYmIGFjdGl2ZVRvb2xzKSB7XG4gICAgICAgIGFjdGl2ZVRvb2xzID0gYWN0aXZlVG9vbHMuZmlsdGVyKFxuICAgICAgICAgICh0KSA9PiB0ICE9PSAoXCJTa2lsbFwiIHNhdGlzZmllcyBCdWlsdEluVG9vbE5hbWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2VzOiBwcm9tcHRDYWNoaW5nLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb21wdENhY2hpbmcucHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBhY3RpdmVUb29scyxcbiAgICAgIH07XG4gICAgfSxcbiAgICBvblN0ZXBGaW5pc2g6ICh7IHVzYWdlIH0pID0+IHtcbiAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICB1c2FnZVN0ZXBzLnB1c2goe1xuICAgICAgICAgIHN0ZXBJbmRleDogc3RlcEluZGV4T2Zmc2V0ICsgaW50ZXJuYWxTdGVwSW5kZXgsXG4gICAgICAgICAgbW9kZWw6IHNlc3Npb24ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICB0b3RhbFRva2VuczogdXNhZ2UudG90YWxUb2tlbnMgPz8gMCxcbiAgICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVJlYWRUb2tlbnMgPz8gMCxcbiAgICAgICAgICBjYWNoZVdyaXRlVG9rZW5zOiB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVXcml0ZVRva2VucyA/PyAwLFxuICAgICAgICAgIHJlYXNvbmluZ1Rva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzPy5yZWFzb25pbmdUb2tlbnMgPz8gMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpbnRlcm5hbFN0ZXBJbmRleCsrO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHN0ZXBQYXJ0czogVUlNZXNzYWdlW1wicGFydHNcIl0gPSBbXTtcbiAgbGV0IHdhc0Fib3J0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gICAgICBleGVjdXRlOiAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCA9IChldmVudDogdW5rbm93bikgPT5cbiAgICAgICAgICB3cml0ZXIud3JpdGUoZXZlbnQgYXMgUGFyYW1ldGVyczx0eXBlb2Ygd3JpdGVyLndyaXRlPlswXSk7XG5cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHN0cmVhbVRleHQgc3RyZWFtLiBwcmVwYXJlU3RlcCBoYW5kbGVzIHNhbmRib3ggc2V0dXAsXG4gICAgICAgIC8vIHNraWxscyBsb2FkaW5nLCBhcHByb3ZhbCBleGVjdXRpb24sIGFuZCBzdGF0dXMgZW1pc3Npb24gYmVmb3JlXG4gICAgICAgIC8vIHRoZSBtb2RlbCBzdGFydHMgZ2VuZXJhdGluZy5cbiAgICAgICAgd3JpdGVyLm1lcmdlKFxuICAgICAgICAgIHJlc3VsdC50b1VJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICBnZW5lcmF0ZU1lc3NhZ2VJZDogKCkgPT4gYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgb25GaW5pc2g6ICh7IG1lc3NhZ2VzIH0pID0+IHtcbiAgICAgICAgICAgICAgbGV0IGhhc0FwcHJvdmFscyA9IGZhbHNlO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobS5yb2xlID09PSBcImFzc2lzdGFudFwiKSB7XG4gICAgICAgICAgICAgICAgICBzdGVwUGFydHMucHVzaCguLi5tLnBhcnRzKTtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBtLnBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcInN0YXRlXCIgaW4gcCAmJiBwLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGFzQXBwcm92YWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaGFzQXBwcm92YWxzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3R0bGVkRW1pdFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwibmVlZHMtYXBwcm92YWxcIiB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgc3RyZWFtLnBpcGVUbyh3cml0YWJsZSwge1xuICAgICAgcHJldmVudENsb3NlOiB0cnVlLFxuICAgICAgcHJldmVudEFib3J0OiB0cnVlLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRocm90dGxlZEVtaXRTdGF0dXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHdhc0Fib3J0ZWQgPSB0cnVlO1xuICB9XG5cbiAgY29uc3QgbGFzdFBhcnQgPSBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmLmN1cnJlbnQ7XG5cbiAgaWYgKHdhc0Fib3J0ZWQpIHtcbiAgICBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IG5ldyBTZXQoW1xuICAgICAgXCJvdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICBcIm91dHB1dC1lcnJvclwiLFxuICAgICAgXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICBcImRvbmVcIixcbiAgICBdKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2Ygc3RlcFBhcnRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwidHlwZVwiIGluIHBhcnQgJiZcbiAgICAgICAgdHlwZW9mIHBhcnQudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICBwYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpICYmXG4gICAgICAgIFwic3RhdGVcIiBpbiBwYXJ0ICYmXG4gICAgICAgICF0ZXJtaW5hbFN0YXRlcy5oYXMocGFydC5zdGF0ZSBhcyBzdHJpbmcpXG4gICAgICApIHtcbiAgICAgICAgKHBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgKHBhcnQgYXMgeyBlcnJvclRleHQ/OiBzdHJpbmcgfSkuZXJyb3JUZXh0ID0gXCJpbnRlcnJ1cHRlZFwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYmFzZVBhcnRJbmRleCA9IG5leHRQYXJ0SW5kZXg7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdGVwUGFydHMubWFwKGFzeW5jICh1aVBhcnQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBiYXNlUGFydEluZGV4ICsgaTtcbiAgICAgICAgaWYgKGxhc3RQYXJ0ICE9IG51bGwgJiYgaW5kZXggPiBsYXN0UGFydC5pbmRleCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VDbGllbnRQYXJ0ID0gbGFzdFBhcnQgIT0gbnVsbCAmJiBpbmRleCA9PT0gbGFzdFBhcnQuaW5kZXg7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB1c2VDbGllbnRQYXJ0ID8gbGFzdFBhcnQucGFydCA6IHVpUGFydDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5wYXJ0LnNldCh7XG4gICAgICAgICAgaWQ6IGBwYXJ0XyR7dWxpZCgpfWAsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgICAgcGFydDogY29udGVudCBhcyAodHlwZW9mIHN0ZXBQYXJ0cylbbnVtYmVyXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICApO1xuICAgIG5leHRQYXJ0SW5kZXggPVxuICAgICAgbGFzdFBhcnQgIT0gbnVsbFxuICAgICAgICA/IE1hdGgubWluKGJhc2VQYXJ0SW5kZXggKyBzdGVwUGFydHMubGVuZ3RoLCBsYXN0UGFydC5pbmRleCArIDEpXG4gICAgICAgIDogYmFzZVBhcnRJbmRleCArIHN0ZXBQYXJ0cy5sZW5ndGg7XG5cbiAgICBpZiAoc2V0U3RhcnRlZFByb21pc2UpIHtcbiAgICAgIGNvbnN0IHNldFN0YXJ0ZWRSZXN1bHQgPSBhd2FpdCBzZXRTdGFydGVkUHJvbWlzZTtcbiAgICAgIGlmIChzZXRTdGFydGVkUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgc2V0U3RhcnRlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbSBvZiBzZXRTdGFydGVkUmVzdWx0ID8/IFtdKSB7XG4gICAgICAgIGlmIChtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmdBcHByb3ZhbHMgPSBzdGVwUGFydHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHApOiBwIGlzIHR5cGVvZiBwICYgeyBhcHByb3ZhbDogeyBpZDogc3RyaW5nIH0gfSA9PlxuICAgICAgICBcInN0YXRlXCIgaW4gcCAmJlxuICAgICAgICBwLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICAgIFwiYXBwcm92YWxcIiBpbiBwICYmXG4gICAgICAgICEhKHAgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsPy5pZFxuICAgIClcbiAgICAubWFwKChwKSA9PiAoe1xuICAgICAgYXBwcm92YWxJZDogcC5hcHByb3ZhbC5pZCxcbiAgICAgIHRvb2xOYW1lOiBcInR5cGVcIiBpbiBwID8gU3RyaW5nKHAudHlwZSkucmVwbGFjZShcInRvb2wtXCIsIFwiXCIpIDogXCJ1bmtub3duXCIsXG4gICAgfSkpO1xuXG4gIGNvbnN0IGZpbmFsRmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb24gPVxuICAgIHdhc0Fib3J0ZWQgfHwgbGFzdFBhcnQgIT0gbnVsbFxuICAgICAgPyAoXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uKVxuICAgICAgOiBhd2FpdCByZXN1bHQuZmluaXNoUmVhc29uO1xuXG4gIHJldHVybiB7XG4gICAgZmluaXNoUmVhc29uOiBmaW5hbEZpbmlzaFJlYXNvbixcbiAgICBsYXN0UGFydEluZGV4OiBuZXh0UGFydEluZGV4LFxuICAgIHVzYWdlU3RlcHMsXG4gICAgcGVuZGluZ0FwcHJvdmFscyxcbiAgICBtYXhTdGVwczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhTdGVwcyxcbiAgICBkaXNjb3ZlcmVkU2tpbGxzOiBza2lsbHNSZWYuY3VycmVudCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNraWxsc0RpciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUGFyc2VkIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZyb250bWF0dGVyID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlIGNvbnRlbnQuXG4gKiBGcm9udG1hdHRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgZGVsaW1pdGVkIGJ5IGAtLS1gIG1hcmtlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYG1hcmtkb3duXG4gKiAtLS1cbiAqIG5hbWU6IGNzdlxuICogZGVzY3JpcHRpb246IEFuYWx5emUgQ1NWIGRhdGFcbiAqIC0tLVxuICogIyBDU1YgU2tpbGxcbiAqIC4uLlxuICogYGBgXG4gKlxuICogQHJldHVybnMgUGFyc2VkIG5hbWUgYW5kIGRlc2NyaXB0aW9uLCBvciBudWxsIGlmIGZyb250bWF0dGVyIGlzIG1pc3NpbmcvaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKFxuICBjb250ZW50OiBzdHJpbmdcbik6IFNraWxsRnJvbnRtYXR0ZXIgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGNvbnRlbnQudHJpbSgpO1xuXG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBlbmRNYXJrZXJJbmRleCA9IHRyaW1tZWQuaW5kZXhPZihcIi0tLVwiLCAzKTtcbiAgaWYgKGVuZE1hcmtlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXJCbG9jayA9IHRyaW1tZWQuc2xpY2UoMywgZW5kTWFya2VySW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTaW1wbGVZYW1sKGZyb250bWF0dGVyQmxvY2spO1xuXG4gIGlmICghKHBhcnNlZC5uYW1lICYmIHBhcnNlZC5kZXNjcmlwdGlvbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogU3RyaW5nKHBhcnNlZC5uYW1lKSxcbiAgICBkZXNjcmlwdGlvbjogU3RyaW5nKHBhcnNlZC5kZXNjcmlwdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHNpbXBsZSBZQU1MIGtleS12YWx1ZSBwYWlycyAoc2luZ2xlLWxpbmUgdmFsdWVzIG9ubHkpLlxuICogVGhpcyBhdm9pZHMgYWRkaW5nIGEgZnVsbCBZQU1MIHBhcnNlciBkZXBlbmRlbmN5IGZvciBiYXNpYyBmcm9udG1hdHRlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaW1wbGVZYW1sKHlhbWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgeWFtbC5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb25JbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnNsaWNlKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzIGlmIHByZXNlbnRcbiAgICBpZiAoXG4gICAgICAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBza2lsbHNEaXIgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyPzogU2tpbGxzRGlyKTogc3RyaW5nW10ge1xuICBpZiAoIXNraWxsc0Rpcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShza2lsbHNEaXIpID8gc2tpbGxzRGlyIDogW3NraWxsc0Rpcl07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB7IHBhcnNlU2tpbGxGcm9udG1hdHRlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIERpc2NvdmVycyBza2lsbHMgZnJvbSBkaXJlY3RvcmllcyBpbnNpZGUgdGhlIHNhbmRib3ggYnkgZmluZGluZyBhbmQgcGFyc2luZyBTS0lMTC5tZCBmaWxlcy5cbiAqIFNjYW5zIGVhY2ggZGlyZWN0b3J5IGZvciBzdWJkaXJlY3RvcmllcyBjb250YWluaW5nIFNLSUxMLm1kLCBleHRyYWN0cyBmcm9udG1hdHRlciBtZXRhZGF0YSxcbiAqIGFuZCByZXR1cm5zIHN1bW1hcmllcyBmb3IgdXNlIGluIHRoZSBzeXN0ZW0gcHJvbXB0LlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIHNraWxsIHN1bW1hcmllcyAoZGVkdXBsaWNhdGVkIGJ5IG5hbWUsIGZpcnN0IG9jY3VycmVuY2Ugd2lucylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94KG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyczogc3RyaW5nW107XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlycywgZGVidWcgfSA9IG9wdHM7XG5cbiAgY29uc3Qgc3VtbWFyaWVzOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuICBjb25zdCBzZWVuTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHNraWxsc0RpciBvZiBza2lsbHNEaXJzKSB7XG4gICAgY29uc3QgZGlyU3VtbWFyaWVzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeSh7XG4gICAgICBzYW5kYm94LFxuICAgICAgc2tpbGxzRGlyLFxuICAgICAgZGVidWcsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgZGlyU3VtbWFyaWVzKSB7XG4gICAgICBpZiAoIXNlZW5OYW1lcy5oYXMoc3VtbWFyeS5uYW1lKSkge1xuICAgICAgICBzZWVuTmFtZXMuYWRkKHN1bW1hcnkubmFtZSk7XG4gICAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbHNEaXI6IHN0cmluZztcbiAgZGVidWc/OiBib29sZWFuO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0gPSBvcHRzO1xuICBjb25zdCBza2lsbFBhdGhzID0gYXdhaXQgZmluZFNraWxsRmlsZXMoeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0pO1xuXG4gIGlmIChza2lsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNraWxsTWRQYXRoIG9mIHNraWxsUGF0aHMpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgcGFyc2VTa2lsbEZpbGUoeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgZGVidWcgfSk7XG4gICAgaWYgKHN1bW1hcnkpIHtcbiAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRTa2lsbEZpbGVzKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9ID0gb3B0cztcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImZpbmRcIixcbiAgICBhcmdzOiBbc2tpbGxzRGlyLCBcIi1uYW1lXCIsIFwiU0tJTEwubWRcIiwgXCItdHlwZVwiLCBcImZcIl0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gRmFpbGVkIHRvIHNjYW4gc2tpbGxzIGRpcmVjdG9yeSBcIiR7c2tpbGxzRGlyfVwiOiAke2V4ZWNSZXN1bHQubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkaXNjb3Zlcl0gZmluZCByZXN1bHQ6IGV4aXRDb2RlPSR7ZXhpdENvZGV9LCBzdGRvdXQ9XCIke3N0ZG91dC50cmltKCl9XCIsIHN0ZGVycj1cIiR7c3RkZXJyLnRyaW0oKX1cImBcbiAgICApO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIFNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGluYWNjZXNzaWJsZTogJHtza2lsbHNEaXJ9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGF0aHMgPSBzdGRvdXRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLmZpbHRlcigocCkgPT4gcC5sZW5ndGggPiAwKTtcbiAgaWYgKGRlYnVnKSB7XG4gICAgY29uc29sZS5sb2coXCJbZGlzY292ZXJdIEZvdW5kIHNraWxsIHBhdGhzOlwiLCBwYXRocyk7XG4gIH1cbiAgcmV0dXJuIHBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVNraWxsRmlsZShvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsTWRQYXRoOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeSB8IG51bGw+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgZGVidWcgfSA9IG9wdHM7XG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwiY2F0XCIsXG4gICAgYXJnczogW3NraWxsTWRQYXRoXSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBGYWlsZWQgdG8gcmVhZCBza2lsbCBmaWxlIFwiJHtza2lsbE1kUGF0aH1cIjogJHtleGVjUmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKGBbZGlzY292ZXJdIENvdWxkIG5vdCByZWFkIHNraWxsIGZpbGU6ICR7c2tpbGxNZFBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTa2lsbEZyb250bWF0dGVyKHN0ZG91dCk7XG5cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gSW52YWxpZCBvciBtaXNzaW5nIGZyb250bWF0dGVyIGluOiAke3NraWxsTWRQYXRofWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYXJzZWQubmFtZSxcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VkLmRlc2NyaXB0aW9uLFxuICAgIHNraWxsTWRQYXRoLFxuICB9O1xufVxuIiwgImltcG9ydCB7IGpzb25TY2hlbWEsIHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRJbnB1dCwgQWdlbnRNZXNzYWdlSW5wdXQgfSBmcm9tIFwiLi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgUnBjUGF5bG9hZCwgUnBjUmVzdWx0IH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB7IERFRkFVTFRfV0FJVF9VTlRJTCB9IGZyb20gXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFNlc3Npb24sIFN0b3JhZ2UgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgY3JlYXRlSmF2YVNjcmlwdFRvb2wsIHR5cGUgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL2phdmFzY3JpcHRcIjtcblxuY29uc3QgQUdFTlRfUFJPVE9DT0xfVkVSU0lPTiA9IFwidjFcIjtcblxuZnVuY3Rpb24gZm9ybWF0RmlsZVNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChieXRlcyA8IDEwMjQpIHtcbiAgICByZXR1cm4gYCR7Ynl0ZXN9YDtcbiAgfVxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkge1xuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDEpfUtgO1xuICB9XG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0ICogMTAyNCkge1xuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfU1gO1xuICB9XG4gIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX1HYDtcbn1cblxudHlwZSBJbnRlcm5hbFRvb2xDb250ZXh0ID0ge1xuICBpbnB1dDogQWdlbnRJbnB1dDtcbiAgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0O1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICAvKiogUmVmIHBvcHVsYXRlZCBpbiBwcmVwYXJlU3RlcCB3aGVuIHNraWxsc0RpciBpcyBzZXQ7IFNraWxsIHRvb2wgcmVhZHMgZnJvbSAuY3VycmVudCBhdCBleGVjdXRlIHRpbWUgKi9cbiAgc2tpbGxzUmVmOiB7IGN1cnJlbnQ6IFNraWxsU3VtbWFyeVtdIH07XG4gIGFwaVRvb2xzTWV0YWRhdGE6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgaW5wdXRTY2hlbWE/OiB1bmtub3duO1xuICB9W107XG4gIG9uU3ViVG9vbENhbGw/OiBPblN1YlRvb2xDYWxsO1xufTtcblxuZXhwb3J0IHR5cGUgVG9vbENvbnRleHQ8VENvbnRleHQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIGNvbnRleHQ6IFRDb250ZXh0O1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWx0SW5Ub29scyA9IHtcbiAgUmVhZDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlJlYWRzIGEgZmlsZSBhbmQgcmV0dXJucyBpdHMgY29udGVudHMgd2l0aCBtZXRhZGF0YS4gRm9yIGZpbGVzIG92ZXIgMjAwIGxpbmVzLCBhdXRvbWF0aWNhbGx5IHNob3dzIGZpcnN0IDEwMCBsaW5lcyB1bmxlc3MgYSBzcGVjaWZpYyBsaW5lIHJhbmdlIGlzIHByb3ZpZGVkLiBVc2Ugc3RhcnRMaW5lIGFuZCBlbmRMaW5lIHBhcmFtZXRlcnMgdG8gcmVhZCBzcGVjaWZpYyBwb3J0aW9ucyBvZiBsYXJnZSBmaWxlcy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIHN0YXJ0TGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3RhcnRpbmcgbGluZSBudW1iZXIgKDEtaW5kZXhlZCkuIElmIHByb3ZpZGVkIHdpdGggZW5kTGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICAgIGVuZExpbmU6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkVuZGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkLCBpbmNsdXNpdmUpLiBJZiBwcm92aWRlZCB3aXRoIHN0YXJ0TGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJGaWxlIGNvbnRlbnRcIiksXG4gICAgICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgICAgICB0b3RhbExpbmVzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmaWxlXCIpLFxuICAgICAgICBsaW5lc1Nob3duOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGxpbmVzIGluY2x1ZGVkIGluIHRoaXMgcmVzcG9uc2VcIiksXG4gICAgICAgIHN0YXJ0TGluZTogei5udW1iZXIoKS5kZXNjcmliZShcIkZpcnN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBlbmRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTGFzdCBsaW5lIG51bWJlciBzaG93biAoMS1pbmRleGVkKVwiKSxcbiAgICAgICAgaXNQYWdpbmF0ZWQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciB0aGlzIGlzIGEgcGFydGlhbCB2aWV3IG9mIHRoZSBmaWxlXCIpLFxuICAgICAgICBmaWxlU2l6ZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5kZXNjcmliZShcIkh1bWFuLXJlYWRhYmxlIGZpbGUgc2l6ZSAoZS5nLiwgJzIuNUsnLCAnMS4yTScpXCIpLFxuICAgICAgICBwYXRoOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgR3JlcDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBmb3IgcGF0dGVybnMgaW4gZmlsZXMgdXNpbmcgcmlwZ3JlcC4gVXNlIHRoaXMgdG8gZmluZCBjb2RlIHBhdHRlcm5zLCBmdW5jdGlvbiBkZWZpbml0aW9ucywgaW1wb3J0cywgZXRjLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdHRlcm46IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlJlZ2V4IHBhdHRlcm4gdG8gc2VhcmNoIGZvciAocmlwZ3JlcCBzeW50YXgpXCIpLFxuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiUGF0aCB0byBzZWFyY2ggaW4gKGRlZmF1bHRzIHRvIHdvcmtzcGFjZSByb290KS4gQ2FuIGJlIGEgZmlsZSBvciBkaXJlY3RvcnkuXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVUeXBlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJGaWxlIHR5cGUgdG8gZmlsdGVyIGJ5IChlLmcuLCAndHMnLCAnanMnLCAncHknLCAnbWQnKS4gVXNlcyByaXBncmVwJ3MgYnVpbHQtaW4gdHlwZSBmaWx0ZXJzLlwiXG4gICAgICAgICksXG4gICAgICBnbG9iOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIGZpbGVzIChlLmcuLCAnKi50c3gnLCAnc3JjLyoqLyoudHMnKVwiXG4gICAgICAgICksXG4gICAgICBjYXNlU2Vuc2l0aXZlOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciBzZWFyY2ggaXMgY2FzZS1zZW5zaXRpdmUgKGRlZmF1bHQ6IHRydWUpXCIpLFxuICAgICAgY29udGV4dExpbmVzOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJOdW1iZXIgb2YgY29udGV4dCBsaW5lcyB0byBzaG93IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBtYXRjaFwiXG4gICAgICAgICksXG4gICAgICBtYXhDb3VudDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBudW1iZXIgb2YgbWF0Y2hlcyBwZXIgZmlsZSAodXNlZnVsIGZvciBsaW1pdGluZyBvdXRwdXQpXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVzV2l0aE1hdGNoZXM6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiT25seSBzaG93IGZpbGUgcGF0aHMgdGhhdCBjb250YWluIG1hdGNoZXMsIG5vdCB0aGUgbWF0Y2hpbmcgbGluZXMgdGhlbXNlbHZlc1wiXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBtYXRjaGVzOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTZWFyY2ggcmVzdWx0cyB3aXRoIGZpbGUgcGF0aHMsIGxpbmUgbnVtYmVycywgYW5kIG1hdGNoaW5nIGNvbnRlbnRcIlxuICAgICAgICApLFxuICAgICAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgICAgICBtYXRjaENvdW50OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIG1hdGNoZXMgZm91bmRcIiksXG4gICAgICAgIGZpbGVDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBmaWxlcyBjb250YWluaW5nIG1hdGNoZXNcIiksXG4gICAgICAgIHNlYXJjaFBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRoYXQgd2FzIHNlYXJjaGVkXCIpLFxuICAgICAgICBwYXR0ZXJuOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0dGVybiB0aGF0IHdhcyBzZWFyY2hlZCBmb3JcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIExpc3Q6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWN1cnNpdmVseSBsaXN0IGRpcmVjdG9yeSBjb250ZW50cy4gVXNlIHRoaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29kZWJhc2Ugc3RydWN0dXJlLCBmaW5kIGZpbGVzLCBvciBleHBsb3JlIGRpcmVjdG9yaWVzLiBDb250cm9sIGRlcHRoIHRvIGJhbGFuY2UgZGV0YWlsIHZzLiBvdmVydmlldy4gRGVwdGggMSBzaG93cyBpbW1lZGlhdGUgY2hpbGRyZW4sIGRlcHRoIDIgaW5jbHVkZXMgc3ViZGlyZWN0b3JpZXMsIGV0Yy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJQYXRoIHRvIGxpc3QgKGRlZmF1bHRzIHRvIHdvcmtzcGFjZSByb290KVwiKSxcbiAgICAgIGRlcHRoOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJNYXhpbXVtIGRlcHRoIHRvIHRyYXZlcnNlLiBDaG9vc2UgYmFzZWQgb24gY29udGV4dDogMS0yIGZvciBxdWljayBvdmVydmlldywgMy00IGZvciBkZXRhaWxlZCBleHBsb3JhdGlvbiwgNSsgZm9yIGNvbXByZWhlbnNpdmUgbWFwcGluZ1wiXG4gICAgICAgICksXG4gICAgICBpbmNsdWRlSGlkZGVuOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkluY2x1ZGUgaGlkZGVuIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAnLicpXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVzT25seTogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXCJPbmx5IHNob3cgZmlsZXMsIG5vdCBkaXJlY3Rvcmllc1wiKSxcbiAgICAgIHBhdHRlcm46IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIkdsb2IgcGF0dGVybiB0byBmaWx0ZXIgcmVzdWx0cyAoZS5nLiwgJyoudHMnLCAnKnRlc3QqJylcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsaXN0aW5nOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJEaXJlY3RvcnkgdHJlZSBsaXN0aW5nIHNob3dpbmcgcGF0aHMgcmVsYXRpdmUgdG8gc2VhcmNoIHJvb3RcIlxuICAgICAgICApLFxuICAgICAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgICAgICB0b3RhbEl0ZW1zOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGl0ZW1zIGZvdW5kXCIpLFxuICAgICAgICB0b3RhbEZpbGVzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGZpbGVzIGZvdW5kXCIpLFxuICAgICAgICB0b3RhbERpcnM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgZGlyZWN0b3JpZXMgZm91bmRcIiksXG4gICAgICAgIHNlYXJjaFBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRoYXQgd2FzIGxpc3RlZFwiKSxcbiAgICAgICAgZGVwdGg6IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcIk1heGltdW0gZGVwdGggdXNlZCAoaWYgc3BlY2lmaWVkKVwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgV3JpdGU6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJXcml0ZSBjb250ZW50IHRvIGEgZmlsZS4gQ3JlYXRlcyBwYXJlbnQgZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseS4gT3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDb250ZW50IHRvIHdyaXRlIHRvIHRoZSBmaWxlXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSB3cml0ZSBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgd3JpdHRlbiBmaWxlXCIpLFxuICAgICAgYnl0ZXNXcml0dGVuOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiB3cml0ZSBmYWlsZWRcIiksXG4gICAgfSksXG4gIH0pLFxuICBFZGl0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRWRpdCBhIGZpbGUgYnkgcmVwbGFjaW5nIGFuIGV4YWN0IHN0cmluZy4gRmFpbHMgaWYgb2xkX3N0cmluZyBpcyBub3QgZm91bmQgb3IgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyAobm90IHVuaXF1ZSkuIEZvciBtdWx0aXBsZSByZXBsYWNlbWVudHMsIGNhbGwgdGhpcyB0b29sIG11bHRpcGxlIHRpbWVzIHdpdGggdW5pcXVlIGNvbnRleHQuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya3NwYWNlIHJvb3RcIiksXG4gICAgICBvbGRfc3RyaW5nOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJFeGFjdCBzdHJpbmcgdG8gZmluZCBhbmQgcmVwbGFjZSAobXVzdCBiZSB1bmlxdWUgaW4gZmlsZSlcIiksXG4gICAgICBuZXdfc3RyaW5nOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU3RyaW5nIHRvIHJlcGxhY2Ugb2xkX3N0cmluZyB3aXRoXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSBlZGl0IHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBlZGl0ZWQgZmlsZVwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIGVkaXQgZmFpbGVkXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgQmFzaDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV4ZWN1dGVzIGEgYmFzaCBjb21tYW5kIGluc2lkZSB0aGUgd29ya3NwYWNlLiBDV0QgcGVyc2lzdHMgYmV0d2VlbiBjb21tYW5kcyB3aXRoaW4gYSBzZXNzaW9uLiBVc2Ugd2FpdFVudGlsOjAgZm9yIGJhY2tncm91bmQgcHJvY2Vzc2VzIChkZXYgc2VydmVycykuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgY29tbWFuZDogei5zdHJpbmcoKS5kZXNjcmliZShcIlRoZSBzaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGVcIiksXG4gICAgICB3YWl0VW50aWw6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBgTWF4IG1zIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24gKGRlZmF1bHQ6ICR7REVGQVVMVF9XQUlUX1VOVElMfSkuIFVzZSAwIHRvIHJ1biBpbiBiYWNrZ3JvdW5kIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuYFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcGlkOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTeXN0ZW0gUElEICgwIGZvciBmb3JlZ3JvdW5kLCA+MCBmb3IgYmFja2dyb3VuZCAtIHVzZSB0byBraWxsKVwiXG4gICAgICAgICksXG4gICAgICBvdXRwdXQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkNvbW1hbmQgc3Rkb3V0K3N0ZGVyciBjb21iaW5lZCAoZW1wdHkgZm9yIGJhY2tncm91bmQpXCIpLFxuICAgICAgZXhpdENvZGU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJFeGl0IGNvZGUgKC0xIGZvciBiYWNrZ3JvdW5kL3J1bm5pbmcpXCIpLFxuICAgICAgc3RhdHVzOiB6XG4gICAgICAgIC5lbnVtKFtcInJ1bm5pbmdcIiwgXCJjb21wbGV0ZWRcIiwgXCJmYWlsZWRcIl0pXG4gICAgICAgIC5kZXNjcmliZShcIlByb2Nlc3Mgc3RhdHVzXCIpLFxuICAgICAgY3dkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhZnRlciBjb21tYW5kXCIpLFxuICAgICAgb3V0cHV0RmlsZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byBvdXRwdXQgbG9nIChmb3IgYmFja2dyb3VuZCBwcm9jZXNzZXMpXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgU2tpbGw6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJMb2FkIGEgc2tpbGwncyBmdWxsIGluc3RydWN0aW9ucyBieSBuYW1lLiBDYWxsIHRoaXMgYmVmb3JlIGZvbGxvd2luZyBhIHNraWxsLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTa2lsbCBuYW1lIGZyb20gdGhlIEF2YWlsYWJsZSBTa2lsbHMgbGlzdFwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKSxcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJGdWxsIFNLSUxMLm1kIGNvbnRlbnRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgc2tpbGwgZGlyZWN0b3J5IGluIHRoZSBzYW5kYm94XCIpLFxuICAgIH0pLFxuICB9KSxcbiAgSmF2YVNjcmlwdDogdG9vbCh7XG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgY29kZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSmF2YVNjcmlwdCBhc3luYyBmdW5jdGlvbiBib2R5LiBgY3R4YCBpcyBpbiBzY29wZS4gTXVzdCB1c2UgYHJldHVybmAgdG8gcHJvZHVjZSBvdXRwdXQuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgfSksXG59IHNhdGlzZmllcyBUb29sU2V0O1xuXG5leHBvcnQgdHlwZSBCdWlsdEluVG9vbE5hbWUgPSBrZXlvZiB0eXBlb2YgYnVpbHRJblRvb2xzO1xuZXhwb3J0IGNvbnN0IGJ1aWx0aW5Ub29sTmFtZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKGJ1aWx0SW5Ub29scykubWFwKChbbmFtZV0pID0+IFtuYW1lLCBuYW1lXSlcbikgYXMgeyBbSyBpbiBCdWlsdEluVG9vbE5hbWVdOiBLIH07XG5cbmNvbnN0IFNLSUxMX01EX1NVRkZJWCA9IC9cXC8/U0tJTExcXC5tZCQvO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbHMoY29udGV4dDogSW50ZXJuYWxUb29sQ29udGV4dCkge1xuICBjb25zdCB0b29sczogVG9vbFNldCA9IHtcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5SZWFkXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuUmVhZCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIHN0YXJ0TGluZSwgZW5kTGluZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3gucmVhZEZpbGUoeyBwYXRoOiBmaWxlUGF0aCB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW1JlYWQgVG9vbF1cIiwgcmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBFcnJvcjogRmlsZSBub3QgZm91bmQgLSAke2ZpbGVQYXRofWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICB0b3RhbExpbmVzOiAwLFxuICAgICAgICAgICAgICBsaW5lc1Nob3duOiAwLFxuICAgICAgICAgICAgICBzdGFydExpbmU6IDAsXG4gICAgICAgICAgICAgIGVuZExpbmU6IDAsXG4gICAgICAgICAgICAgIGlzUGFnaW5hdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IFwiMFwiLFxuICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZ1bGxDb250ZW50ID0gcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZnVsbENvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIC8vIEEgdHJhaWxpbmcgbmV3bGluZSBwcm9kdWNlcyBhbiBlbXB0eSBsYXN0IGVsZW1lbnQgXHUyMDE0IHJlbW92ZSBpdFxuICAgICAgICAvLyBzbyBsaW5lIGNvdW50IG1hdGNoZXMgYHdjIC1sYCAvIGBhd2sgJ0VORHtwcmludCBOUn0nYCBiZWhhdmlvci5cbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXMuYXQoLTEpID09PSBcIlwiKSB7XG4gICAgICAgICAgbGluZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxMaW5lcyA9IGxpbmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZmlsZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoZnVsbENvbnRlbnQpO1xuICAgICAgICBjb25zdCBmaWxlU2l6ZSA9IGZvcm1hdEZpbGVTaXplKGZpbGVCeXRlcyk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHJhbmdlXG4gICAgICAgIGNvbnN0IFBBR0VfU0laRSA9IDEwMDtcbiAgICAgICAgbGV0IGFjdHVhbFN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGxldCBhY3R1YWxFbmQ6IG51bWJlcjtcblxuICAgICAgICBpZiAoc3RhcnRMaW5lICE9PSB1bmRlZmluZWQgJiYgZW5kTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSBzdGFydExpbmU7XG4gICAgICAgICAgYWN0dWFsRW5kID0gZW5kTGluZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGFydExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gc3RhcnRMaW5lO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IE1hdGgubWluKHN0YXJ0TGluZSArIFBBR0VfU0laRSAtIDEsIHRvdGFsTGluZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBlbmRMaW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHRvdGFsTGluZXMgPiAyMDApIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gUEFHRV9TSVpFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSB0b3RhbExpbmVzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbGluZSByYW5nZSAoMS1pbmRleGVkKVxuICAgICAgICBjb25zdCBzbGljZWRMaW5lcyA9IGxpbmVzLnNsaWNlKGFjdHVhbFN0YXJ0IC0gMSwgYWN0dWFsRW5kKTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHNsaWNlZExpbmVzLmpvaW4oXCJcXG5cIik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGxpbmVzU2hvd246IE1hdGgubWF4KDAsIGFjdHVhbEVuZCAtIGFjdHVhbFN0YXJ0ICsgMSksXG4gICAgICAgICAgICBzdGFydExpbmU6IGFjdHVhbFN0YXJ0LFxuICAgICAgICAgICAgZW5kTGluZTogYWN0dWFsRW5kLFxuICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGFjdHVhbEVuZCA8IHRvdGFsTGluZXMsXG4gICAgICAgICAgICBmaWxlU2l6ZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuR3JlcF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkdyZXAsXG4gICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBwYXRoLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgZ2xvYixcbiAgICAgICAgY2FzZVNlbnNpdGl2ZSxcbiAgICAgICAgY29udGV4dExpbmVzLFxuICAgICAgICBtYXhDb3VudCxcbiAgICAgICAgZmlsZXNXaXRoTWF0Y2hlcyxcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGF0aCA9IHBhdGggPz8gXCIuXCI7XG5cbiAgICAgICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBhcmdzLnB1c2goXCItLWxpbmUtbnVtYmVyXCIpO1xuICAgICAgICBhcmdzLnB1c2goXCItLWhlYWRpbmdcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0tY29sb3JcIiwgXCJuZXZlclwiKTtcblxuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItaVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlVHlwZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tdHlwZVwiLCBmaWxlVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYikge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tZ2xvYlwiLCBnbG9iKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1DXCIsIFN0cmluZyhjb250ZXh0TGluZXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1tYXgtY291bnRcIiwgU3RyaW5nKG1heENvdW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNXaXRoTWF0Y2hlcykge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tZmlsZXMtd2l0aC1tYXRjaGVzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5wdXNoKFwiLS1cIiwgcGF0dGVybiwgc2VhcmNoUGF0aCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoeyBjb21tYW5kOiBcInJnXCIsIGFyZ3MgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltHcmVwIFRvb2xdXCIsIHJlc3VsdCk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcblxuICAgICAgICBpZiAoc3RkZXJyICYmICFzdGRlcnIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcIm5vIG1hdGNoZXNcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbR3JlcCBUb29sXSBXYXJuaW5nOiAke3N0ZGVycn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRydW5jYXRlIG91dHB1dCB0byBwcmV2ZW50IFwiaW5wdXQgdG9vIGxvbmdcIiBlcnJvcnMgKDUwayBjaGFycyBcdTIyNDggMTIuNWsgdG9rZW5zKVxuICAgICAgICBjb25zdCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMgPSA1MF8wMDA7XG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHN0ZG91dDtcbiAgICAgICAgbGV0IHdhc1RydW5jYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZmluYWxPdXRwdXQubGVuZ3RoID4gTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSB7XG4gICAgICAgICAgZmluYWxPdXRwdXQgPVxuICAgICAgICAgICAgZmluYWxPdXRwdXQuc2xpY2UoMCwgTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSArXG4gICAgICAgICAgICBcIlxcblxcbltPdXRwdXQgdHJ1bmNhdGVkIC0gdXNlIG1vcmUgc3BlY2lmaWMgcGF0dGVybiBvciBwYXRoXVwiO1xuICAgICAgICAgIHdhc1RydW5jYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IGZpbmFsT3V0cHV0XG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICA/IGxpbmVzLmxlbmd0aFxuICAgICAgICAgIDogbmV3IFNldChcbiAgICAgICAgICAgICAgbGluZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsKSA9PiAhbC5zdGFydHNXaXRoKFwiIFwiKSAmJiBsLmluY2x1ZGVzKFwiOlwiKSlcbiAgICAgICAgICAgICAgICAubWFwKChsKSA9PiBsLnNwbGl0KFwiOlwiKVswXSlcbiAgICAgICAgICAgICkuc2l6ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1hdGNoQ291bnQ6IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogbGluZXMuZmlsdGVyKChsKSA9PiBsLmluY2x1ZGVzKFwiOlwiKSkubGVuZ3RoLFxuICAgICAgICAgICAgZmlsZUNvdW50LFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICB3YXNUcnVuY2F0ZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXRjaGVzOiBmaW5hbE91dHB1dCB8fCBcIihubyBtYXRjaGVzIGZvdW5kKVwiLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5MaXN0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuTGlzdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGRlcHRoLCBpbmNsdWRlSGlkZGVuLCBmaWxlc09ubHksIHBhdHRlcm4gfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3guZXhlYyh7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgc2V0IC1lXG4gICAgICAgICAgICBTRUFSQ0hfUEFUSD1cIiQxXCJcbiAgICAgICAgICAgIERFUFRIPVwiJDJcIlxuICAgICAgICAgICAgSU5DTFVERV9ISURERU49XCIkM1wiXG4gICAgICAgICAgICBGSUxFU19PTkxZPVwiJDRcIlxuICAgICAgICAgICAgUEFUVEVSTj1cIiQ1XCJcblxuICAgICAgICAgICAgIyBCdWlsZCBmaW5kIGNvbW1hbmQgYXJndW1lbnRzXG4gICAgICAgICAgICBGSU5EX0FSR1M9XCJcIlxuICAgICAgICAgICAgWyAtbiBcIiRERVBUSFwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgISAtcGF0aCAnKi8uKidcIlxuICAgICAgICAgICAgWyBcIiRGSUxFU19PTkxZXCIgPSBcInRydWVcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLXR5cGUgZlwiXG4gICAgICAgICAgICBbIC1uIFwiJFBBVFRFUk5cIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW5hbWUgJyRQQVRURVJOJ1wiXG5cbiAgICAgICAgICAgICMgR2V0IGxpc3RpbmdcbiAgICAgICAgICAgIExJU1RJTkc9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkRklORF9BUkdTXCIgMj4vZGV2L251bGwgfCBzb3J0KVxuXG4gICAgICAgICAgICAjIEdldCBjb3VudHNcbiAgICAgICAgICAgIENPVU5UX0FSR1M9XCJcIlxuICAgICAgICAgICAgWyAtbiBcIiRERVBUSFwiIF0gJiYgQ09VTlRfQVJHUz1cIiRDT1VOVF9BUkdTIC1tYXhkZXB0aCAkREVQVEhcIlxuICAgICAgICAgICAgWyBcIiRJTkNMVURFX0hJRERFTlwiICE9IFwidHJ1ZVwiIF0gJiYgQ09VTlRfQVJHUz1cIiRDT1VOVF9BUkdTICEgLXBhdGggJyovLionXCJcblxuICAgICAgICAgICAgRklMRV9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGZcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuICAgICAgICAgICAgRElSX0NPVU5UPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJENPVU5UX0FSR1MgLXR5cGUgZFwiIDI+L2Rldi9udWxsIHwgd2MgLWwpXG5cbiAgICAgICAgICAgICMgT3V0cHV0OiBjb3VudHMgZmlyc3QsIHRoZW4gbGlzdGluZ1xuICAgICAgICAgICAgZWNobyBcIiRGSUxFX0NPVU5UfCRESVJfQ09VTlRcIlxuICAgICAgICAgICAgZWNobyBcInx8fExJU1RJTkd8fHxcIlxuICAgICAgICAgICAgZWNobyBcIiRMSVNUSU5HXCIgfCBzZWQgXCJzfF4kU0VBUkNIX1BBVEh8LnxcIlxuICAgICAgICAgIGAsXG4gICAgICAgICAgICBcIi0tXCIsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgZGVwdGg/LnRvU3RyaW5nKCkgfHwgXCJcIixcbiAgICAgICAgICAgIGluY2x1ZGVIaWRkZW4gPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIGZpbGVzT25seSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgcGF0dGVybiB8fCBcIlwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbTGlzdCBUb29sXVwiLCByZXN1bHQpO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW0xpc3QgVG9vbF0gc3RkZXJyOiAke3N0ZGVycn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtjb3VudHNMaW5lLCAuLi5yZXN0XSA9IHN0ZG91dC5zcGxpdChcInx8fExJU1RJTkd8fHxcIik7XG4gICAgICAgIGNvbnN0IGxpc3RpbmcgPSByZXN0LmpvaW4oXCJ8fHxMSVNUSU5HfHx8XCIpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgW2ZpbGVDb3VudFN0ciwgZGlyQ291bnRTdHJdID0gY291bnRzTGluZS50cmltKCkuc3BsaXQoXCJ8XCIpO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsRmlsZXMgPSBOdW1iZXIucGFyc2VJbnQoZmlsZUNvdW50U3RyLCAxMCkgfHwgMDtcbiAgICAgICAgY29uc3QgdG90YWxEaXJzID0gTnVtYmVyLnBhcnNlSW50KGRpckNvdW50U3RyLCAxMCkgfHwgMDtcbiAgICAgICAgY29uc3QgbGluZXMgPSBsaXN0aW5nLnNwbGl0KFwiXFxuXCIpLmZpbHRlcigobCkgPT4gbC5sZW5ndGggPiAwKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IGxpbmVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsRmlsZXMsXG4gICAgICAgICAgICB0b3RhbERpcnMsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsaXN0aW5nLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5Xcml0ZV06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLldyaXRlLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgY29udGVudCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoO1xuICAgICAgICBjb25zdCBkaXIgPSBmaWxlUGF0aC5pbmNsdWRlcyhcIi9cIilcbiAgICAgICAgICA/IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIilcbiAgICAgICAgICA6IFwiLlwiO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBmaWxlUGF0aDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChkaXIgIT09IFwiLlwiKSB7XG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LnNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwibWtkaXJcIiwgYXJnczogW1wiLXBcIiwgZGlyXSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBjb250ZXh0LnNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgICAgICBmaWxlczogW3sgcGF0aDogZmlsZU5hbWUsIGNvbnRlbnQgfV0sXG4gICAgICAgICAgICBkZXN0UGF0aDogZGlyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgXCJ1dGY4XCIpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgYnl0ZXNXcml0dGVuOiAwLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTXNnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuRWRpdF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkVkaXQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBvbGRfc3RyaW5nLCBuZXdfc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aC5zbGljZSgxKSA6IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHBhdGg6IGZpbGVQYXRoLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQob2xkX3N0cmluZykubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcIm9sZF9zdHJpbmcgbm90IGZvdW5kIGluIGZpbGVcIixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID4gMSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBvbGRfc3RyaW5nIGFwcGVhcnMgJHtvY2N1cnJlbmNlc30gdGltZXMgaW4gZmlsZSAobXVzdCBiZSB1bmlxdWUpLiBJbmNsdWRlIG1vcmUgc3Vycm91bmRpbmcgY29udGV4dCB0byBtYWtlIHRoZSBtYXRjaCB1bmlxdWUuYCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShvbGRfc3RyaW5nLCBuZXdfc3RyaW5nKTtcbiAgICAgICAgY29uc3QgZGlyID0gZmlsZVBhdGguaW5jbHVkZXMoXCIvXCIpXG4gICAgICAgICAgPyBmaWxlUGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpXG4gICAgICAgICAgOiBcIi5cIjtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdChcIi9cIikucG9wKCkgfHwgZmlsZVBhdGg7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjb250ZXh0LnNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgICAgICBmaWxlczogW3sgcGF0aDogZmlsZU5hbWUsIGNvbnRlbnQ6IG5ld0NvbnRlbnQgfV0sXG4gICAgICAgICAgICBkZXN0UGF0aDogZGlyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgcGF0aDogZmlsZVBhdGggfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHBhdGg6IGZpbGVQYXRoLCBlcnJvcjogZXJyb3JNc2cgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5CYXNoXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuQmFzaCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY3JlYXRlUHJvY2Vzc01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgICBcIi4uL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBwcm9jZXNzTWFuYWdlciA9IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyKHtcbiAgICAgICAgICBzYW5kYm94OiBjb250ZXh0LnNhbmRib3gsXG4gICAgICAgICAgc2Vzc2lvbklkOiBjb250ZXh0LmlucHV0LnNlc3Npb25JZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgcHJvY2Vzc01hbmFnZXIuaW5pdCgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzTWFuYWdlci5ydW4oeyBjb21tYW5kLCB3YWl0VW50aWwgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xuXG4gIGlmIChjb250ZXh0LnNlc3Npb24uc2tpbGxzRGlyPy5sZW5ndGgpIHtcbiAgICB0b29sc1tidWlsdGluVG9vbE5hbWVzLlNraWxsXSA9IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlNraWxsLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNraWxscyA9IGNvbnRleHQuc2tpbGxzUmVmLmN1cnJlbnQ7XG4gICAgICAgIGNvbnN0IHNraWxsID0gc2tpbGxzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTa2lsbCBub3QgZm91bmQ6IFwiJHtuYW1lfVwiLiBBdmFpbGFibGU6ICR7c2tpbGxzLm1hcCgocykgPT4gcy5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LnJlYWRGaWxlKHtcbiAgICAgICAgICBwYXRoOiBza2lsbC5za2lsbE1kUGF0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTa2lsbCBmaWxlIG5vdCBmb3VuZDogJHtza2lsbC5za2lsbE1kUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXcgPVxuICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIgPyByZXN1bHQgOiByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgZW5kTWFya2VyID0gcmF3LmluZGV4T2YoXCItLS1cIiwgMyk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgICAgIGVuZE1hcmtlciA9PT0gLTEgPyByYXcgOiByYXcuc2xpY2UoZW5kTWFya2VyICsgMykudHJpbSgpO1xuICAgICAgICBjb25zdCBza2lsbERpciA9IHNraWxsLnNraWxsTWRQYXRoLnJlcGxhY2UoU0tJTExfTURfU1VGRklYLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBza2lsbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIHBhdGg6IHNraWxsRGlyLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LmFwaVRvb2xzTWV0YWRhdGEubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGFwaVRvb2xzID0gYnVpbGRBcGlUb29scyh7XG4gICAgICBycGM6IGNvbnRleHQuaW5wdXQucnBjLFxuICAgICAgbWV0YWRhdGE6IGNvbnRleHQuYXBpVG9vbHNNZXRhZGF0YSxcbiAgICAgIHNlc3Npb246IGNvbnRleHQuc2Vzc2lvbixcbiAgICAgIHNhbmRib3hSZWNvcmQ6IGNvbnRleHQuc2FuZGJveFJlY29yZCxcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQuZXZlbnQuY29udGV4dCxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHRvb2xzLCBhcGlUb29scyk7XG4gIH1cblxuICB0b29sc1tidWlsdGluVG9vbE5hbWVzLkphdmFTY3JpcHRdID0gY3JlYXRlSmF2YVNjcmlwdFRvb2woe1xuICAgIHRvb2xzLFxuICAgIHNlc3Npb246IGNvbnRleHQuc2Vzc2lvbixcbiAgICBzYW5kYm94OiBjb250ZXh0LnNhbmRib3gsXG4gICAgb25TdWJUb29sQ2FsbDogY29udGV4dC5vblN1YlRvb2xDYWxsLFxuICB9KTtcblxuICByZXR1cm4gdG9vbHM7XG59XG5cbnR5cGUgQXBpVG9vbE1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpbnB1dFNjaGVtYT86IHVua25vd247XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcGlUb29sc01ldGFkYXRhKG9wdHM6IHtcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59KTogUHJvbWlzZTxBcGlUb29sTWV0YWRhdGFbXT4ge1xuICBjb25zdCB7IHJwYyB9ID0gb3B0cztcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoeyBtZXRob2Q6IFwidG9vbHMubGlzdFwiLCBwYXJhbXM6IHt9IH0pO1xuXG4gIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgY29uc29sZS5lcnJvcihcIlthZ2VudF0gRmFpbGVkIHRvIGZldGNoIHRvb2xzOlwiLCByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiAocmVzdWx0LnJlc3VsdCBhcyBBcGlUb29sTWV0YWRhdGFbXSkgPz8gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFwaVRvb2xzKG9wdHM6IHtcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG4gIG1ldGFkYXRhOiBBcGlUb29sTWV0YWRhdGFbXTtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59KTogVG9vbFNldCB7XG4gIGNvbnN0IHsgcnBjLCBtZXRhZGF0YSwgc2Vzc2lvbiwgc2FuZGJveFJlY29yZCwgY29udGV4dCB9ID0gb3B0cztcbiAgY29uc3QgdG9vbHM6IFRvb2xTZXQgPSB7fTtcblxuICBmb3IgKGNvbnN0IG1ldGEgb2YgbWV0YWRhdGEpIHtcbiAgICB0b29sc1ttZXRhLm5hbWVdID0gdG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogbWV0YS5kZXNjcmlwdGlvbiA/PyBgQ3VzdG9tIHRvb2w6ICR7bWV0YS5uYW1lfWAsXG4gICAgICBpbnB1dFNjaGVtYTogbWV0YS5pbnB1dFNjaGVtYVxuICAgICAgICA/IGpzb25TY2hlbWEobWV0YS5pbnB1dFNjaGVtYSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBqc29uU2NoZW1hPlswXSlcbiAgICAgICAgOiB6Lm9iamVjdCh7fSksXG4gICAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKHtcbiAgICAgICAgICBtZXRob2Q6IFwidG9vbHMuZXhlY3V0ZVwiLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbmFtZTogbWV0YS5uYW1lLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgc2FuZGJveFJlY29yZCxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvb2wgZXhlY3V0aW9uIGZhaWxlZDogJHtyZXN1bHQuZXJyb3I/Lm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdG9vbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXBpVXJsKG9wdHM6IHsgYXBpOiBzdHJpbmcgfCB1bmRlZmluZWQgfSk6IHN0cmluZyB7XG4gIGxldCBvcmlnaW4gPSBcIlwiO1xuICBsZXQgcGF0aCA9IGAvLndlbGwta25vd24vYWdlbnQvJHtBR0VOVF9QUk9UT0NPTF9WRVJTSU9OfWA7XG5cbiAgaWYgKG9wdHMuYXBpKSB7XG4gICAgaWYgKG9wdHMuYXBpLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBwYXRoID0gb3B0cy5hcGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNlZSBpZiBpdCdzIGZ1bGxcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0cy5hcGkpO1xuICAgICAgICBvcmlnaW4gPSB1cmwub3JpZ2luO1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaDtcbiAgICAgICAgaWYgKGZ1bGxQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIGZ1bGxQYXRoICE9PSBcIi9cIikge1xuICAgICAgICAgIHBhdGggPSBmdWxsUGF0aDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIW9yaWdpbikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICBvcmlnaW4gPSBgaHR0cDovL2xvY2FsaG9zdDoke1xuICAgICAgICBwcm9jZXNzLmVudi5QT1JUID8/IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1BPUlQgPz8gMzAwMFxuICAgICAgfWA7XG4gICAgfVxuICAgIGNvbnN0IHZlcmNlbFVybCA9XG4gICAgICBwcm9jZXNzLmVudi5WRVJDRUxfVVJMID8/IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1ZFUkNFTF9VUkw7XG4gICAgaWYgKHZlcmNlbFVybCkge1xuICAgICAgb3JpZ2luID0gYGh0dHBzOi8vJHt2ZXJjZWxVcmx9YDtcbiAgICB9XG4gIH1cblxuICBpZiAoIW9yaWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiW2FnZW50XSBDb3VsZG4ndCBkZXRlcm1pbmUgQVBJIG9yaWdpbiAobm8gb3JpZ2luIGRldGVjdGVkIGluIGBhcGlgIG9wdGlvbiBhbmQgbm8gVkVSQ0VMX1VSTCBzZXQpXCJcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGAke29yaWdpbn0ke3BhdGh9YDtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIFRvb2xTZXQsIHRvb2wgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi4vc2FuZGJveFwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGJ1aWx0SW5Ub29scyB9IGZyb20gXCIuXCI7XG5cbmV4cG9ydCBjb25zdCBKQVZBU0NSSVBUX1RPT0xfTkFNRSA9IFwiSmF2YVNjcmlwdFwiO1xuXG5leHBvcnQgdHlwZSBTdWJUb29sQ2FsbFJlc3VsdCA9IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIE9uU3ViVG9vbENhbGwgPSAoXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGlucHV0OiB1bmtub3duLFxuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPHVua25vd24+XG4pID0+IFByb21pc2U8U3ViVG9vbENhbGxSZXN1bHQ+O1xuXG5jb25zdCBSRVFVRVNUX01BUktFUl9TVEFSVCA9IFwiX19UT09MX1JFUVVFU1RfX1wiO1xuY29uc3QgUkVRVUVTVF9NQVJLRVJfRU5EID0gXCJfX1RPT0xfUkVRVUVTVF9FTkRfX1wiO1xuY29uc3QgRVhFQ1VUSU9OX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIFRoZSBydW5uZXIgc2NyaXB0IGlzIHdyaXR0ZW4gdG8gdGhlIHNhbmRib3ggYW5kIGV4ZWN1dGVkIHZpYSBOb2RlLmpzLlxuICogSXQgcmVhZHMgdGhlIG1vZGVsJ3MgY29kZSBmcm9tIGNvZGUuanMsIHNldHMgdXAgY3R4LnRvb2xzIGFzIFJQQyBwcm94aWVzXG4gKiAocmVxdWVzdHMgc2VudCB2aWEgc3RkZXJyIG1hcmtlcnMsIHJlc3BvbnNlcyBwb2xsZWQgZnJvbSBmaWxlcyksIGV4ZWN1dGVzXG4gKiB0aGUgY29kZSwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHN0ZG91dCBhcyBKU09OLlxuICovXG5jb25zdCBSVU5ORVJfU0NSSVBUID0gYFxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jLCB1bmxpbmtTeW5jLCBta2RpclN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuY29uc3QgU0NSSVBUX0RJUiA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbmNvbnN0IFRPT0xfQ0FMTF9USU1FT1VUX01TID0gMzAwXzAwMDtcblxubGV0IHJlcUNvdW50ZXIgPSAwO1xuXG5hc3luYyBmdW5jdGlvbiBjYWxsVG9vbChuYW1lLCBpbnB1dCkge1xuICBjb25zdCBpZCA9ICdyZXFfJyArICgrK3JlcUNvdW50ZXIpICsgJ18nICsgRGF0ZS5ub3coKTtcbiAgY29uc3QgcmVzcG9uc2VGaWxlID0gam9pbihTQ1JJUFRfRElSLCBpZCArICcucmVzcG9uc2UuanNvbicpO1xuXG4gIGNvbnN0IHJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeSh7IGlkLCB0b29sOiBuYW1lLCBpbnB1dCB9KTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyR7UkVRVUVTVF9NQVJLRVJfU1RBUlR9JyArIHJlcXVlc3QgKyAnJHtSRVFVRVNUX01BUktFUl9FTkR9JyArICdcXFxcbicpO1xuXG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgd2hpbGUgKCFleGlzdHNTeW5jKHJlc3BvbnNlRmlsZSkpIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gVE9PTF9DQUxMX1RJTUVPVVRfTVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG9vbCBjYWxsICcgKyBuYW1lICsgJyB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UnKTtcbiAgICB9XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDMwKSk7XG4gIH1cblxuICBsZXQgcmF3O1xuICB0cnkge1xuICAgIHJhdyA9IHJlYWRGaWxlU3luYyhyZXNwb25zZUZpbGUsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgIHJhdyA9IHJlYWRGaWxlU3luYyhyZXNwb25zZUZpbGUsICd1dGY4Jyk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UocmF3KTtcbiAgdHJ5IHsgdW5saW5rU3luYyhyZXNwb25zZUZpbGUpOyB9IGNhdGNoIHt9XG5cbiAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UucmVzdWx0O1xufVxuXG5jb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKGpvaW4oU0NSSVBUX0RJUiwgJ2NvZGUuanMnKSwgJ3V0ZjgnKTtcbmNvbnN0IHRvb2xOYW1lcyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpvaW4oU0NSSVBUX0RJUiwgJ3Rvb2xzLmpzb24nKSwgJ3V0ZjgnKSk7XG5cbmNvbnN0IGN0eCA9IHsgdG9vbHM6IHt9IH07XG5mb3IgKGNvbnN0IG5hbWUgb2YgdG9vbE5hbWVzKSB7XG4gIGN0eC50b29sc1tuYW1lXSA9IChpbnB1dCkgPT4gY2FsbFRvb2wobmFtZSwgaW5wdXQpO1xufVxuXG5jb25zdCBsb2dzID0gW107XG5jb25zdCBjdXN0b21Db25zb2xlID0ge1xuICBsb2c6ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIGVycm9yOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKCdbZXJyb3JdICcgKyBhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbiAgd2FybjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW3dhcm5dICcgKyBhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbn07XG5cbnRyeSB7XG4gIGNvbnN0IEFzeW5jRnVuY3Rpb24gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYXN5bmMgZnVuY3Rpb24oKSB7fSkuY29uc3RydWN0b3I7XG4gIGNvbnN0IGZuID0gbmV3IEFzeW5jRnVuY3Rpb24oJ2N0eCcsICdjb25zb2xlJywgY29kZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGN0eCwgY3VzdG9tQ29uc29sZSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0geyBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHJlc3VsdCAhPT0gdW5kZWZpbmVkID8gcmVzdWx0IDogbnVsbCB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufSBjYXRjaCAoZXJyKSB7XG4gIGNvbnN0IG91dHB1dCA9IHtcbiAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufVxuYDtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHBsYWluIEpTT04gU2NoZW1hIGZyb20gd2hhdGV2ZXIgZm9ybWF0IHRoZSBBSSBTREsgdG9vbCB1c2VzXG4gKiAoWm9kIHNjaGVtYSwgQUkgU0RLIHdyYXBwZWQgc2NoZW1hLCBvciByYXcgSlNPTiBTY2hlbWEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEpzb25TY2hlbWEoXG4gIHNjaGVtYTogdW5rbm93blxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIFwiX2RlZlwiIGluIHNjaGVtYSAmJlxuICAgIHR5cGVvZiAoc2NoZW1hIGFzIHsgX2RlZjogdW5rbm93biB9KS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gei50b0pTT05TY2hlbWEoc2NoZW1hIGFzIHouWm9kVHlwZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICBpZiAoU3ltYm9sLmZvcihcInZlcmNlbC5haS5zY2hlbWFcIikgaW4gcyAmJiBcImpzb25TY2hlbWFcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBzIHx8IFwicHJvcGVydGllc1wiIGluIHMpIHtcbiAgICByZXR1cm4gcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvblNjaGVtYVRvVHMoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluZGVudCA9IDBcbik6IHN0cmluZyB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5lbnVtICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5lbnVtLm1hcCgodikgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmFueU9mICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgIHJldHVybiBzY2hlbWEuYW55T2ZcbiAgICAgIC5tYXAoKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBqc29uU2NoZW1hVG9UcyhzLCBpbmRlbnQpKVxuICAgICAgLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5vbmVPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLm9uZU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlIGFzIHN0cmluZztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBzY2hlbWEuaXRlbXNcbiAgICAgICAgPyBqc29uU2NoZW1hVG9UcyhzY2hlbWEuaXRlbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluZGVudClcbiAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIHJldHVybiBgQXJyYXk8JHtpdGVtc30+YDtcbiAgICB9XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hLnByb3BlcnRpZXMgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gbmV3IFNldCgoc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gICAgICBjb25zdCBwYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuICAgICAgY29uc3QgY2xvc2VQYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wiO1xuICAgICAgICByZXR1cm4gYCR7cGFkfSR7a2V5fSR7b3B0fTogJHtqc29uU2NoZW1hVG9Ucyh2YWx1ZSwgaW5kZW50ICsgMSl9YDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGB7XFxuJHtwcm9wcy5qb2luKFwiO1xcblwiKX07XFxuJHtjbG9zZVBhZH19YDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyh0b29sczogVG9vbFNldCk6IHN0cmluZyB7XG4gIGNvbnN0IHNpZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXModG9vbHMpKSB7XG4gICAgY29uc3QgcmF3ID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpbnB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5pbnB1dFNjaGVtYSA/PyByYXcucGFyYW1ldGVycyk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gZXh0cmFjdEpzb25TY2hlbWEocmF3Lm91dHB1dFNjaGVtYSk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dFNjaGVtYSA/IGpzb25TY2hlbWFUb1RzKGlucHV0U2NoZW1hLCAyKSA6IFwie31cIjtcbiAgICBjb25zdCBvdXRwdXRUeXBlID0gb3V0cHV0U2NoZW1hXG4gICAgICA/IGpzb25TY2hlbWFUb1RzKG91dHB1dFNjaGVtYSwgMilcbiAgICAgIDogXCJ1bmtub3duXCI7XG5cbiAgICBzaWdzLnB1c2goYCAgICAke25hbWV9KGlucHV0OiAke2lucHV0VHlwZX0pOiBQcm9taXNlPCR7b3V0cHV0VHlwZX0+YCk7XG4gIH1cblxuICByZXR1cm4gYHR5cGUgQ29udGV4dCA9IHtcXG4gIHRvb2xzOiB7XFxuJHtzaWdzLmpvaW4oXCI7XFxuXCIpfTtcXG4gIH1cXG59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUluU2FuZGJveCh7XG4gIGNvZGUsXG4gIHJwY0RpcixcbiAgYWJvcnRDb250cm9sbGVyLFxuICBzYW5kYm94LFxuICBhdmFpbGFibGVUb29scyxcbiAgb25TdWJUb29sQ2FsbCxcbn06IHtcbiAgY29kZTogc3RyaW5nO1xuICBycGNEaXI6IHN0cmluZztcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgcnBjRGlyXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBta2RpclJlc3VsdC5tZXNzYWdlIH07XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZmlsZXM6IFtcbiAgICAgIHsgcGF0aDogXCJydW5uZXIubWpzXCIsIGNvbnRlbnQ6IFJVTk5FUl9TQ1JJUFQgfSxcbiAgICAgIHsgcGF0aDogXCJjb2RlLmpzXCIsIGNvbnRlbnQ6IGNvZGUgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJ0b29scy5qc29uXCIsXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGF2YWlsYWJsZVRvb2xzKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgfSk7XG5cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0sIDEwKTtcbiAgY29uc3QgcGVybWlzc2lvbkZsYWcgPVxuICAgIG5vZGVNYWpvciA+PSAyMiA/IFwiLS1wZXJtaXNzaW9uXCIgOiBcIi0tZXhwZXJpbWVudGFsLXBlcm1pc3Npb25cIjtcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm5vZGVcIixcbiAgICBhcmdzOiBbXG4gICAgICBwZXJtaXNzaW9uRmxhZyxcbiAgICAgIGAtLWFsbG93LWZzLXJlYWQ9JHtycGNEaXJ9YCxcbiAgICAgIGAtLWFsbG93LWZzLXdyaXRlPSR7cnBjRGlyfWAsXG4gICAgICBgJHtycGNEaXJ9L3J1bm5lci5tanNgLFxuICAgIF0sXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuXG4gIGNvbnN0IGZhdGFsOiB7IGVycm9yOiBFcnJvciB8IG51bGwgfSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBjb25zdCBhYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBpZiAoIWZhdGFsLmVycm9yKSB7XG4gICAgICBmYXRhbC5lcnJvciA9IGVycm9yO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRvb2xSZXF1ZXN0ID0gYXN5bmMgKHJlcXVlc3RKc29uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgcGFyc2VkOiB7IGlkOiBzdHJpbmc7IHRvb2w6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfTtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXF1ZXN0SnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpZCwgdG9vbDogdG9vbE5hbWUsIGlucHV0IH0gPSBwYXJzZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGF2YWlsYWJsZVRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgIGlmICghdD8uZXhlY3V0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvb2wgJHt0b29sTmFtZX0gbm90IGZvdW5kIG9yIGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlYyA9IHQuZXhlY3V0ZS5iaW5kKHQpO1xuICAgICAgaWYgKG9uU3ViVG9vbENhbGwpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBvblN1YlRvb2xDYWxsKHRvb2xOYW1lLCBpbnB1dCwgKCkgPT5cbiAgICAgICAgICBleGVjKGlucHV0LCB7XG4gICAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7IHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzcG9uc2UgPSB7IGVycm9yOiBtc2cgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgZmlsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBgJHtpZH0ucmVzcG9uc2UuanNvbmAsXG4gICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB3cml0aW5nIHRoZSByZXNwb25zZSBmaWxlIGZhaWxzLCB0aGUgcnVubmVyIHdpbGwgcG9sbCBmb3JldmVyXG4gICAgICAgKiB3YWl0aW5nIGZvciBpdC4gQWJvcnQgdGhlIHJ1bm5lciBwcm9jZXNzIHNvIHdlIGRvbid0IGRlYWRsb2NrLlxuICAgICAgICovXG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBhYm9ydChuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSBSUEMgcmVzcG9uc2UgZm9yICR7dG9vbE5hbWV9OiAke21zZ31gKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvb2xDYWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBsZXQgc3RkZXJyQnVmZmVyID0gXCJcIjtcbiAgbGV0IG5vbk1hcmtlclN0ZGVyciA9IFwiXCI7XG5cbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGFib3J0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgSmF2YVNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7RVhFQ1VUSU9OX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApXG4gICAgKTtcbiAgfSwgRVhFQ1VUSU9OX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBleGVjUmVzdWx0LmxvZ3MoKSkge1xuICAgICAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZGVyclwiKSB7XG4gICAgICAgIHN0ZGVyckJ1ZmZlciArPSBlbnRyeS5kYXRhO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9TVEFSVCk7XG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlTWFya2VyID0gc3RkZXJyQnVmZmVyLnNsaWNlKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICBpZiAoYmVmb3JlTWFya2VyLnRyaW0oKSkge1xuICAgICAgICAgICAgbm9uTWFya2VyU3RkZXJyICs9IGJlZm9yZU1hcmtlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzdGFydElkeCArIFJFUVVFU1RfTUFSS0VSX1NUQVJULmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9FTkQsIGNvbnRlbnRTdGFydCk7XG4gICAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RKc29uID0gc3RkZXJyQnVmZmVyLnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSWR4KTtcbiAgICAgICAgICBzdGRlcnJCdWZmZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoZW5kSWR4ICsgUkVRVUVTVF9NQVJLRVJfRU5ELmxlbmd0aCk7XG5cbiAgICAgICAgICB0b29sQ2FsbFByb21pc2VzLnB1c2goaGFuZGxlVG9vbFJlcXVlc3QocmVxdWVzdEpzb24pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cblxuICBpZiAoc3RkZXJyQnVmZmVyLnRyaW0oKSkge1xuICAgIG5vbk1hcmtlclN0ZGVyciArPSBzdGRlcnJCdWZmZXI7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodG9vbENhbGxQcm9taXNlcyk7XG5cbiAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgZXhlY1Jlc3VsdC5yZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogZmF0YWwuZXJyb3IubWVzc2FnZSxcbiAgICAgIC4uLihub25NYXJrZXJTdGRlcnIgPyB7IHN0ZGVycjogbm9uTWFya2VyU3RkZXJyLnNsaWNlKDAsIDIwMDApIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgUnVubmVyIGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkuYCxcbiAgICAgIHN0ZGVycjogKG5vbk1hcmtlclN0ZGVyciArIHN0ZGVycikuc2xpY2UoMCwgMjAwMCksXG4gICAgICBzdGRvdXQ6IHN0ZG91dC5zbGljZSgwLCAxMDAwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKYXZhU2NyaXB0VG9vbChvcHRzOiB7XG4gIHRvb2xzOiBUb29sU2V0O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pIHtcbiAgY29uc3QgeyBzZXNzaW9uLCBzYW5kYm94LCBvblN1YlRvb2xDYWxsIH0gPSBvcHRzO1xuICBjb25zdCBhY3RpdmVTZXQgPSBzZXNzaW9uLmFjdGl2ZVRvb2xzID8gbmV3IFNldChzZXNzaW9uLmFjdGl2ZVRvb2xzKSA6IG51bGw7XG4gIGNvbnN0IGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMudG9vbHMpKSB7XG4gICAgaWYgKCFhY3RpdmVTZXQgfHwgYWN0aXZlU2V0LmhhcyhuYW1lKSkge1xuICAgICAgYXZhaWxhYmxlVG9vbHNbbmFtZV0gPSB0O1xuICAgIH1cbiAgfVxuICBjb25zdCBjb250ZXh0VHlwZSA9IGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcoYXZhaWxhYmxlVG9vbHMpO1xuXG4gIHJldHVybiB0b29sKHtcbiAgICAuLi5idWlsdEluVG9vbHMuSmF2YVNjcmlwdCxcbiAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGUgSmF2YVNjcmlwdCB0byBvcmNoZXN0cmF0ZSBtdWx0aXBsZSB0b29sIGNhbGxzIGluIGEgc2luZ2xlIHN0ZXAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcnVuIHNldmVyYWwgdG9vbHMgaW4gc2VxdWVuY2UsIHRyYW5zZm9ybSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgb3IgcGFyYWxsZWxpemUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucyB3aXRoIFByb21pc2UuYWxsLlxuXG5UaGUgY29kZSBydW5zIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIGJvZHkgd2l0aCBcXGBjdHhcXGAgaW4gc2NvcGU6XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbiR7Y29udGV4dFR5cGV9XG5cXGBcXGBcXGBcblxuRXhhbXBsZXM6XG4tIFNlcXVlbnRpYWw6IFxcYGNvbnN0IGZpbGUgPSBhd2FpdCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwicGFja2FnZS5qc29uXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKGZpbGUuY29udGVudCk7XFxgXG4tIFBhcmFsbGVsOiBcXGBjb25zdCBbYSwgYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImEudHNcIiB9KSwgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImIudHNcIiB9KV0pOyByZXR1cm4geyBhOiBhLmNvbnRlbnQsIGI6IGIuY29udGVudCB9O1xcYFxuLSBUcmFuc2Zvcm06IFxcYGNvbnN0IGdyZXAgPSBhd2FpdCBjdHgudG9vbHMuR3JlcCh7IHBhdHRlcm46IFwiVE9ET1wiIH0pOyByZXR1cm4gZ3JlcC5tYXRjaGVzLnNwbGl0KFwiXFxcXG5cIikubGVuZ3RoO1xcYFxuXG5SZXR1cm4gYSB2YWx1ZSB0byBwYXNzIHJlc3VsdHMgYmFjay4gVXNlIGNvbnNvbGUubG9nKCkgZm9yIGRlYnVnIG91dHB1dC5gLFxuICAgIGV4ZWN1dGU6ICh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgcnVuSWQgPSBgcnVuXyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgLnNsaWNlKDIsIDgpfWA7XG4gICAgICBjb25zdCBycGNEaXIgPSBgLmFnZW50L2pzLXJwYy8ke3J1bklkfWA7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHJldHVybiBleGVjdXRlSW5TYW5kYm94KHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgcnBjRGlyLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzLFxuICAgICAgICBvblN1YlRvb2xDYWxsLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUsIE1vZGVsTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuXG50eXBlIFByb3ZpZGVyT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEpTT05WYWx1ZT4+O1xuXG5jb25zdCBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUID0gNDtcblxuY29uc3QgQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMgPSBbXCJjbGF1ZGVcIiwgXCJhbnRocm9waWNcIl07XG5cbmNvbnN0IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TOiBQcm92aWRlck9wdGlvbnMgPSB7XG4gIGFudGhyb3BpYzoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIG9wZW5yb3V0ZXI6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBiZWRyb2NrOiB7XG4gICAgY2FjaGVQb2ludDogeyB0eXBlOiBcImRlZmF1bHRcIiB9LFxuICB9LFxuICBvcGVuYWlDb21wYXRpYmxlOiB7XG4gICAgY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGNvcGlsb3Q6IHtcbiAgICBjb3BpbG90X2NhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0R2F0ZXdheVByb3ZpZGVyKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2xhc2hJbmRleCA9IG1vZGVsLmluZGV4T2YoXCIvXCIpO1xuICBpZiAoc2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbW9kZWwuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXIge1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSAobWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9KVxuICAgICAgLnByb3ZpZGVyT3B0aW9ucztcbiAgICBpZiAocHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcbiAgICAgICAgaWYgKHBhcnRQcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2xhdWRlTGlrZU1vZGVsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbG93ZXIgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMuc29tZSgobSkgPT4gbG93ZXIuaW5jbHVkZXMobSkpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyT3B0aW9ucyhvcHRzOiB7XG4gIGN1cnJlbnQ6IFByb3ZpZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcGF0Y2g6IFByb3ZpZGVyT3B0aW9ucztcbn0pOiBQcm92aWRlck9wdGlvbnMge1xuICBjb25zdCBuZXh0OiBQcm92aWRlck9wdGlvbnMgPSB7IC4uLihvcHRzLmN1cnJlbnQgPz8ge30pIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMucGF0Y2gpKSB7XG4gICAgbmV4dFtrZXldID0geyAuLi4obmV4dFtrZXldID8/IHt9KSwgLi4udmFsdWUgfTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFwYXJ0IHx8IHR5cGVvZiBwYXJ0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQgJiYgKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlID09PSBcInRleHRcIikge1xuICAgIGNvbnN0IHRleHQgPSAocGFydCBhcyB7IHRleHQ/OiB1bmtub3duIH0pLnRleHQ7XG4gICAgaWYgKHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCkge1xuICAgIGNvbnN0IHR5cGUgPSAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwidGhpbmtpbmdcIiB8fCB0eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZTogTW9kZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC50cmltKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnNvbWUoKHBhcnQpID0+IGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0KSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KGNvbnRlbnQ6IHVua25vd25bXSk6IG51bWJlciB8IG51bGwge1xuICBmb3IgKGxldCBpID0gY29udGVudC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGlmIChpc0NhY2hlYWJsZUNsYXVkZVBhcnQoY29udGVudFtpXSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyW10ge1xuICBjb25zdCBzeXN0ZW1JbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBmaW5hbEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGggJiYgc3lzdGVtSW5kaWNlcy5sZW5ndGggPCAyOyBpICs9IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBzeXN0ZW1JbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiBmaW5hbEluZGljZXMubGVuZ3RoIDwgMjsgaSAtPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgZmluYWxJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZmluYWxJbmRpY2VzLnJldmVyc2UoKTtcblxuICByZXR1cm4gWy4uLnN5c3RlbUluZGljZXMsIC4uLmZpbmFsSW5kaWNlc107XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0OiBudW1iZXI7XG59KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBleGlzdGluZ0JyZWFrcG9pbnRzID0gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG9wdHMubWVzc2FnZXMpO1xuICBjb25zdCByZW1haW5pbmdCdWRnZXQgPSBNYXRoLm1heChcbiAgICAwLFxuICAgIG9wdHMubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0IC0gZXhpc3RpbmdCcmVha3BvaW50c1xuICApO1xuXG4gIGlmIChyZW1haW5pbmdCdWRnZXQgPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEluZGljZXMgPSBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhvcHRzLm1lc3NhZ2VzKS5zbGljZShcbiAgICAwLFxuICAgIHJlbWFpbmluZ0J1ZGdldFxuICApO1xuICBpZiAodGFyZ2V0SW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgPVxuICAgIG9wdHMucHJvdmlkZXJJZCA9PT0gXCJhbnRocm9waWNcIiB8fFxuICAgIEJvb2xlYW4ob3B0cy5wcm92aWRlcklkPy5pbmNsdWRlcyhcImJlZHJvY2tcIikpO1xuXG4gIGNvbnN0IG5leHRNZXNzYWdlcyA9IG9wdHMubWVzc2FnZXMuc2xpY2UoKTtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2VJbmRleCBvZiB0YXJnZXRJbmRpY2VzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuXG4gICAgY29uc3Qgc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgPVxuICAgICAgIXVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJlxuICAgICAgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0SW5kZXggPSBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgaWYgKHBhcnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJ0ID0gbWVzc2FnZS5jb250ZW50W3BhcnRJbmRleF07XG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgICAgICBuZXh0Q29udGVudFtwYXJ0SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4uKHBhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgICAgICAgIGN1cnJlbnQ6IHBhcnRQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0gYXMgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQpW251bWJlcl07XG5cbiAgICAgICAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb250ZW50OiBuZXh0Q29udGVudCxcbiAgICAgICAgICB9IGFzIE1vZGVsTWVzc2FnZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICBtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICBjdXJyZW50OiBtZXNzYWdlUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5leHRNZXNzYWdlcztcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Q2FjaGluZ1Jlc3VsdCA9IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdChvcHRzOiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIGFudGhyb3BpYz86IHsgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0PzogbnVtYmVyIH07XG4gIG9wZW5haT86IHsgc2V0UHJvbXB0Q2FjaGVLZXk/OiBib29sZWFuIH07XG59KTogUHJvbXB0Q2FjaGluZ1Jlc3VsdCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0R2F0ZXdheVByb3ZpZGVyKG9wdHMubW9kZWwpO1xuXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zID0ge307XG5cbiAgaWYgKFxuICAgIChwcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBwcm92aWRlciA9PT0gXCJhenVyZVwiKSAmJlxuICAgIG9wdHMub3BlbmFpPy5zZXRQcm9tcHRDYWNoZUtleSAhPT0gZmFsc2VcbiAgKSB7XG4gICAgcHJvdmlkZXJPcHRpb25zLm9wZW5haSA9IHsgcHJvbXB0Q2FjaGVLZXk6IG9wdHMuc2Vzc2lvbklkIH07XG4gIH1cblxuICBjb25zdCBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPVxuICAgIG9wdHMuYW50aHJvcGljPy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPz9cbiAgICBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUO1xuXG4gIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gaXNDbGF1ZGVMaWtlTW9kZWwob3B0cy5tb2RlbClcbiAgICA/IGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyh7XG4gICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlcklkOiBwcm92aWRlcixcbiAgICAgICAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0LFxuICAgICAgfSlcbiAgICA6IG9wdHMubWVzc2FnZXM7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlczogY2FjaGVkTWVzc2FnZXMsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgUmVhc29uaW5nVUlQYXJ0LCBUZXh0VUlQYXJ0LCBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbi8qKiBTdWItdG9vbCBwYXJ0cyAoZnJvbSBKYXZhU2NyaXB0IG1ldGEtdG9vbCkgdXNlIHRoaXMgdG9vbENhbGxJZCBwcmVmaXguICovXG5mdW5jdGlvbiBpc1N1YlRvb2xQYXJ0KHBhcnQ6IFBhcnQpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBhcnQucGFydCBhcyB7IHRvb2xDYWxsSWQ/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIHR5cGVvZiBwPy50b29sQ2FsbElkID09PSBcInN0cmluZ1wiICYmIHAudG9vbENhbGxJZC5zdGFydHNXaXRoKFwianNfdGNfXCIpO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbWluZ0NvbnRlbnQoXG4gIHBhcnQ6IHVua25vd25cbik6IHBhcnQgaXMgVGV4dFVJUGFydCB8IFJlYXNvbmluZ1VJUGFydCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBwYXJ0ICE9PSBudWxsICYmXG4gICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiIHx8IHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmdcIilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SW50ZXJydXB0Q3V0b2ZmKHtcbiAgcGFydHMsXG4gIGxhc3RQYXJ0LFxufToge1xuICBwYXJ0czogUGFydFtdO1xuICBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH07XG59KTogUGFydFtdIHtcbiAgcmV0dXJuIHBhcnRzXG4gICAgLmZpbHRlcigocCkgPT4gcC5pbmRleCA8PSBsYXN0UGFydC5pbmRleClcbiAgICAubWFwKChwKSA9PiB7XG4gICAgICBpZiAocC5pbmRleCAhPT0gbGFzdFBhcnQuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIE9ubHkgcmVwbGFjZSBjb250ZW50IGZvciBzdHJlYW1pbmcgcGFydHMgKHRleHQsIHJlYXNvbmluZykgd2hlcmUgdGhlXG4gICAgICAgKiBjbGllbnQncyB0cnVuY2F0ZWQgdmVyc2lvbiBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHNlcnZlcidzIGZ1bGxcbiAgICAgICAqIHZlcnNpb24uIEZvciBzdGF0ZWZ1bCBwYXJ0cyAodG9vbHMpLCB0aGUgc2VydmVyJ3MgdmVyc2lvbiBpc1xuICAgICAgICogYXV0aG9yaXRhdGl2ZSBcdTIwMTQgaXQgbWF5IGhhdmUgZXZvbHZlZCAoZS5nLiBhcHByb3ZhbC1yZXF1ZXN0ZWQgXHUyMTkyXG4gICAgICAgKiBvdXRwdXQtZGVuaWVkKSBhZnRlciB0aGUgY2xpZW50IHNuYXBzaG90IHdhcyB0YWtlbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzU3RyZWFtaW5nQ29udGVudChsYXN0UGFydC5wYXJ0KSkge1xuICAgICAgICByZXR1cm4geyAuLi5wLCBwYXJ0OiBsYXN0UGFydC5wYXJ0IH0gYXMgUGFydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVSU1lc3NhZ2VzKG9wdHM6IHtcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcbiAgcGFydHM6IFBhcnRbXTtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGluY2x1ZGVRdWV1ZWQ/OiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCBmaWx0ZXJzIG91dCBzdWItdG9vbCBwYXJ0cyBzbyB0aGUgTExNIGRvZXNuJ3Qgc2VlIHRoZW0uICovXG4gIGV4Y2x1ZGVTdWJUb29sUGFydHM/OiBib29sZWFuO1xufSk6IFVJTWVzc2FnZVtdIHtcbiAgbGV0IGZpbHRlcmVkID0gb3B0cy5tZXNzYWdlcztcblxuICBpZiAob3B0cy51bnRpbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdW50aWwgPSBvcHRzLnVudGlsO1xuICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChtKSA9PiBtLmNyZWF0ZWRBdCA8PSB1bnRpbCk7XG4gIH1cblxuICBpZiAoIW9wdHMuaW5jbHVkZVF1ZXVlZCkge1xuICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChtKSA9PiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbCk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IG9wdHMuZXhjbHVkZVN1YlRvb2xQYXJ0c1xuICAgID8gb3B0cy5wYXJ0cy5maWx0ZXIoKHApID0+ICFpc1N1YlRvb2xQYXJ0KHApKVxuICAgIDogb3B0cy5wYXJ0cztcblxuICBjb25zdCBwYXJ0c0J5TWVzc2FnZSA9IG5ldyBNYXA8c3RyaW5nLCBQYXJ0W10+KCk7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcGFydHNCeU1lc3NhZ2UuZ2V0KHBhcnQubWVzc2FnZUlkKSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKHBhcnQpO1xuICAgIHBhcnRzQnlNZXNzYWdlLnNldChwYXJ0Lm1lc3NhZ2VJZCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIGZpbHRlcmVkXG4gICAgLm1hcCgobSkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2VQYXJ0cyA9IHBhcnRzQnlNZXNzYWdlLmdldChtLmlkKSA/PyBbXTtcbiAgICAgIG1lc3NhZ2VQYXJ0cy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG5cbiAgICAgIGlmIChtLmludGVycnVwdGVkTGFzdFBhcnQgIT0gbnVsbCkge1xuICAgICAgICBtZXNzYWdlUGFydHMgPSBhcHBseUludGVycnVwdEN1dG9mZih7XG4gICAgICAgICAgcGFydHM6IG1lc3NhZ2VQYXJ0cyxcbiAgICAgICAgICBsYXN0UGFydDogbS5pbnRlcnJ1cHRlZExhc3RQYXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IG0uaWQsXG4gICAgICAgIHJvbGU6IG0ucm9sZSxcbiAgICAgICAgcGFydHM6IG1lc3NhZ2VQYXJ0cy5tYXAoKHApID0+IHAucGFydCksXG4gICAgICB9IHNhdGlzZmllcyBVSU1lc3NhZ2U7XG4gICAgfSlcbiAgICAuZmlsdGVyKChtKSA9PiBtLnBhcnRzLmxlbmd0aCA+IDApO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU3RlcFVzYWdlLCBVc2FnZVN1bW1hcnkgfSBmcm9tIFwiLi4vc3RvcmFnZS9ycGNcIjtcblxuZXhwb3J0IHR5cGUgeyBTdGVwVXNhZ2UsIFVzYWdlU3VtbWFyeSB9O1xuXG5mdW5jdGlvbiBzdW0oaXRlbXM6IFN0ZXBVc2FnZVtdLCBrZXk6IGtleW9mIFN0ZXBVc2FnZSk6IG51bWJlciB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gaXRlbVtrZXldO1xuICAgIHJldHVybiBhY2MgKyAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gdmFsdWUgOiAwKTtcbiAgfSwgMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVXNhZ2VTdW1tYXJ5KHN0ZXBzOiBTdGVwVXNhZ2VbXSk6IFVzYWdlU3VtbWFyeSB7XG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHN0ZXBzWzBdPy5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICBpbnB1dFRva2Vuczogc3VtKHN0ZXBzLCBcImlucHV0VG9rZW5zXCIpLFxuICAgIG91dHB1dFRva2Vuczogc3VtKHN0ZXBzLCBcIm91dHB1dFRva2Vuc1wiKSxcbiAgICB0b3RhbFRva2Vuczogc3VtKHN0ZXBzLCBcInRvdGFsVG9rZW5zXCIpLFxuICAgIGNhY2hlUmVhZFRva2Vuczogc3VtKHN0ZXBzLCBcImNhY2hlUmVhZFRva2Vuc1wiKSxcbiAgICBjYWNoZVdyaXRlVG9rZW5zOiBzdW0oc3RlcHMsIFwiY2FjaGVXcml0ZVRva2Vuc1wiKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IHN1bShzdGVwcywgXCJyZWFzb25pbmdUb2tlbnNcIiksXG4gICAgc3RlcENvdW50OiBzdGVwcy5sZW5ndGgsXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFNlc3Npb25Vc2FnZSA9IHtcbiAgdG90YWw6IFVzYWdlU3VtbWFyeSAmIHsgbWVzc2FnZUNvdW50OiBudW1iZXIgfTtcbiAgYnlNZXNzYWdlSWQ6IFJlY29yZDxzdHJpbmcsIFVzYWdlU3VtbWFyeSB8IG51bGw+O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTZXNzaW9uVXNhZ2UoXG4gIG1lc3NhZ2VzOiBBcnJheTx7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1c2FnZTogeyBzdGVwczogU3RlcFVzYWdlW107IHN1bW1hcnk6IFVzYWdlU3VtbWFyeSB9IHwgbnVsbDtcbiAgfT5cbik6IFNlc3Npb25Vc2FnZSB7XG4gIGNvbnN0IGJ5TWVzc2FnZUlkOiBSZWNvcmQ8c3RyaW5nLCBVc2FnZVN1bW1hcnkgfCBudWxsPiA9IHt9O1xuICBmb3IgKGNvbnN0IG0gb2YgbWVzc2FnZXMpIHtcbiAgICBieU1lc3NhZ2VJZFttLmlkXSA9IG0udXNhZ2U/LnN1bW1hcnkgPz8gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllcyA9IG1lc3NhZ2VzXG4gICAgLm1hcCgobSkgPT4gbS51c2FnZT8uc3VtbWFyeSlcbiAgICAuZmlsdGVyKChzKTogcyBpcyBVc2FnZVN1bW1hcnkgPT4gcyAhPT0gdW5kZWZpbmVkKTtcblxuICBjb25zdCB0b3RhbCA9IHtcbiAgICBtb2RlbDogc3VtbWFyaWVzWzBdPy5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICBpbnB1dFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLmlucHV0VG9rZW5zLCAwKSxcbiAgICBvdXRwdXRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5vdXRwdXRUb2tlbnMsIDApLFxuICAgIHRvdGFsVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMudG90YWxUb2tlbnMsIDApLFxuICAgIGNhY2hlUmVhZFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLmNhY2hlUmVhZFRva2VucywgMCksXG4gICAgY2FjaGVXcml0ZVRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLmNhY2hlV3JpdGVUb2tlbnMsIDApLFxuICAgIHJlYXNvbmluZ1Rva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnJlYXNvbmluZ1Rva2VucywgMCksXG4gICAgc3RlcENvdW50OiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuc3RlcENvdW50LCAwKSxcbiAgICBtZXNzYWdlQ291bnQ6IHN1bW1hcmllcy5sZW5ndGgsXG4gIH07XG5cbiAgcmV0dXJuIHsgdG90YWwsIGJ5TWVzc2FnZUlkIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFYSxvQkFNUCxZQTJGTztBQW5HYjtBQUFBO0FBQUE7QUFFTyxJQUFNLHFCQUFxQjtBQU1sQyxJQUFNLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEyRlosSUFBTSx1QkFBdUIsQ0FBQyxTQUcvQjtBQUNKLFlBQU0sRUFBRSxTQUFTLFVBQVUsSUFBSTtBQUMvQixVQUFJLGNBQWM7QUFF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YUFBMEIsQ0FBQztBQUVqQyxTQUFPLGlCQUFpQixRQUFRO0FBQzlCLFFBQUk7QUFDRixZQUFNLFNBQVMsTUFBTSxlQUFlO0FBQUEsUUFDbEMsb0JBQW9CLE1BQU07QUFBQSxRQUMxQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsaUJBQWlCLFdBQVc7QUFBQSxRQUM1QjtBQUFBLE1BQ0YsQ0FBQztBQUNELHFCQUFlLE9BQU87QUFDdEIsc0JBQWdCLE9BQU87QUFDdkIsaUJBQVcsS0FBSyxHQUFHLE9BQU8sVUFBVTtBQUNwQyx5QkFBbUIsT0FBTztBQUUxQixVQUFJLE9BQU8sWUFBWSxRQUFRLFdBQVcsVUFBVSxPQUFPLFVBQVU7QUFDbkU7QUFBQSxNQUNGO0FBRUEsVUFBSSxPQUFPLGlCQUFpQixTQUFTLEdBQUc7QUFDdEMsY0FBTSxRQUFRO0FBQUEsVUFDWixPQUFPLGlCQUFpQixJQUFJLENBQUMsWUFBWTtBQUN2QyxrQkFBTSxPQUFPLGFBQWEsT0FBTyxFQUFFLE9BQU8sUUFBUSxXQUFXLENBQUM7QUFDOUQsa0JBQU0sT0FBTyxLQUFLLE9BQU8sYUFBYSxFQUFFO0FBQ3hDLG1CQUFPLEtBQUssS0FBSztBQUFBLFVBQ25CLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0YsU0FBUyxLQUFLO0FBQ1osY0FBUSxNQUFNLEdBQUc7QUFDakIsWUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBRUEsUUFBTSxvQkFBb0I7QUFBQSxJQUN4QixvQkFBb0IsTUFBTTtBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPLEVBQUUsaUJBQWlCO0FBQzVCOyIsCiAgIm5hbWVzIjogWyJvcHRzIiwgInBhdGgiLCAiZXJyb3JlIiwgInJlc3VsdCIsICJzdG9yYWdlIiwgInNhbmRib3hSZWNvcmQiLCAiaW1wb3J0X3pvZCIsICJWZXJjZWxTYW5kYm94U0RLIiwgImdldFN0b3JhZ2UiLCAicGF0aCIsICJpbXBvcnRfc2FuZGJveCIsICJlcnJvcmUiLCAiZ2V0VGVzdENyZWRlbnRpYWxzIiwgInNhbmRib3giLCAiVmVyY2VsU2FuZGJveFNESyIsICJzbmFwc2hvdElkIiwgImdldFNhbmRib3giLCAic2FuZGJveFJlY29yZCIsICJpbml0X2NsaWVudCIsICJpbml0X2NsaWVudCIsICJpbXBvcnRfd29ya2Zsb3ciLCAiaW1wb3J0X2FpIiwgImltcG9ydF91bGlkIiwgImltcG9ydF93b3JrZmxvdyIsICJkZWJ1ZyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3pvZCIsICJwYXRoIiwgImNyZWF0ZVByb2Nlc3NNYW5hZ2VyIiwgImdldFN0b3JhZ2UiLCAiZ2V0U2FuZGJveCIsICJzZXNzaW9uIiwgInNhbmRib3hSZWNvcmQiLCAic2FuZGJveCIsICJyZXN1bHQiLCAic3RhcnQiLCAiZXZlbnQiLCAicmVzdWx0Il0KfQo=
|