@milkio/stargate 1.0.22 → 1.1.1
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/index.js +144 -55
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,7 +1,44 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
3
|
+
|
|
1
4
|
// packages/milkio-stargate/index.ts
|
|
2
5
|
async function createStargate(stargateOptions) {
|
|
3
6
|
const $fetch = stargateOptions.fetch ?? fetch;
|
|
4
7
|
const $abort = stargateOptions.abort ?? AbortController;
|
|
8
|
+
let nodeHttpRequest = null;
|
|
9
|
+
let nodeHttpAgent = null;
|
|
10
|
+
try {
|
|
11
|
+
if (typeof process !== "undefined" && typeof Bun === "undefined") {
|
|
12
|
+
const http = await import("node:http");
|
|
13
|
+
nodeHttpRequest = http.request;
|
|
14
|
+
nodeHttpAgent = new http.Agent({ keepAlive: true, maxSockets: 100 });
|
|
15
|
+
}
|
|
16
|
+
} catch {}
|
|
17
|
+
const nativeHttpPost = nodeHttpRequest ? (url, headers, body) => {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const parsedUrl = new URL(url);
|
|
20
|
+
const options = {
|
|
21
|
+
hostname: parsedUrl.hostname,
|
|
22
|
+
port: parsedUrl.port || 80,
|
|
23
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: { ...headers, "Content-Length": Buffer.byteLength(body) },
|
|
26
|
+
agent: nodeHttpAgent
|
|
27
|
+
};
|
|
28
|
+
const req = nodeHttpRequest(options, (res) => {
|
|
29
|
+
let data = "";
|
|
30
|
+
res.on("data", (chunk) => {
|
|
31
|
+
data += chunk;
|
|
32
|
+
});
|
|
33
|
+
res.on("end", () => {
|
|
34
|
+
resolve(data);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
req.on("error", reject);
|
|
38
|
+
req.write(body);
|
|
39
|
+
req.end();
|
|
40
|
+
});
|
|
41
|
+
} : null;
|
|
5
42
|
const handleError = async (error, key, handler) => {
|
|
6
43
|
if (key in error) {
|
|
7
44
|
const handled = await handler(error[key]);
|
|
@@ -46,14 +83,17 @@ async function createStargate(stargateOptions) {
|
|
|
46
83
|
};
|
|
47
84
|
const eventManager = __initEventManager();
|
|
48
85
|
const bootstrap = async () => {
|
|
49
|
-
let
|
|
50
|
-
if (typeof
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
return
|
|
86
|
+
let baseUrl = stargateOptions.baseUrl;
|
|
87
|
+
if (typeof baseUrl === "function")
|
|
88
|
+
baseUrl = await baseUrl();
|
|
89
|
+
if (baseUrl.endsWith("/"))
|
|
90
|
+
baseUrl = baseUrl.slice(0, -1);
|
|
91
|
+
return baseUrl;
|
|
55
92
|
};
|
|
56
|
-
const
|
|
93
|
+
const baseUrlPromise = bootstrap();
|
|
94
|
+
let resolvedBaseUrl = null;
|
|
95
|
+
let cachedUrlPath = null;
|
|
96
|
+
let cachedUrl = null;
|
|
57
97
|
const stargate = {
|
|
58
98
|
...eventManager,
|
|
59
99
|
options: stargateOptions,
|
|
@@ -62,20 +102,29 @@ async function createStargate(stargateOptions) {
|
|
|
62
102
|
options.headers = {};
|
|
63
103
|
let url;
|
|
64
104
|
if (options.baseUrl) {
|
|
65
|
-
let
|
|
66
|
-
if (typeof
|
|
67
|
-
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
url =
|
|
105
|
+
let baseUrl = options.baseUrl;
|
|
106
|
+
if (typeof baseUrl === "function")
|
|
107
|
+
baseUrl = await baseUrl();
|
|
108
|
+
if (baseUrl.endsWith("/"))
|
|
109
|
+
baseUrl = baseUrl.slice(0, -1);
|
|
110
|
+
url = baseUrl + path;
|
|
71
111
|
} else {
|
|
72
|
-
|
|
112
|
+
if (!resolvedBaseUrl)
|
|
113
|
+
resolvedBaseUrl = await baseUrlPromise;
|
|
114
|
+
if (path === cachedUrlPath && cachedUrl !== null) {
|
|
115
|
+
url = cachedUrl;
|
|
116
|
+
} else {
|
|
117
|
+
url = resolvedBaseUrl + path;
|
|
118
|
+
cachedUrlPath = path;
|
|
119
|
+
cachedUrl = url;
|
|
120
|
+
}
|
|
73
121
|
}
|
|
74
122
|
if (!path.endsWith("~")) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
123
|
+
const h = options.headers;
|
|
124
|
+
if (h.Accept === undefined)
|
|
125
|
+
h.Accept = "application/json";
|
|
126
|
+
if (h["Content-Type"] === undefined)
|
|
127
|
+
h["Content-Type"] = "application/json";
|
|
79
128
|
const cacheStrategy = options.cacheStrategy ?? "off";
|
|
80
129
|
let retryCount = 0;
|
|
81
130
|
if (options.retryStrategy === true || options.retryStrategy === 2) {
|
|
@@ -83,6 +132,33 @@ async function createStargate(stargateOptions) {
|
|
|
83
132
|
} else if (typeof options.retryStrategy === "number" && options.retryStrategy > 0) {
|
|
84
133
|
retryCount = options.retryStrategy;
|
|
85
134
|
}
|
|
135
|
+
if (cacheStrategy === "off" && retryCount === 0) {
|
|
136
|
+
try {
|
|
137
|
+
await eventManager.emit("milkio:executeBefore", { path, options });
|
|
138
|
+
const body2 = JSON.stringify(options.params) ?? "";
|
|
139
|
+
await eventManager.emit("milkio:fetchBefore", { path, options, body: body2 });
|
|
140
|
+
let text;
|
|
141
|
+
if (nativeHttpPost) {
|
|
142
|
+
text = await nativeHttpPost(url, options.headers, body2);
|
|
143
|
+
} else {
|
|
144
|
+
const response = await $fetch(url, { method: "POST", body: body2, headers: options.headers });
|
|
145
|
+
text = await response.text();
|
|
146
|
+
}
|
|
147
|
+
const parsed = reviveJSONParse(JSON.parse(text));
|
|
148
|
+
if (parsed.success !== true) {
|
|
149
|
+
const err = {};
|
|
150
|
+
err[parsed.code] = parsed.reject ?? null;
|
|
151
|
+
return [err, null, { executeId: parsed.executeId }];
|
|
152
|
+
}
|
|
153
|
+
return [null, parsed.data, { executeId: parsed.executeId }];
|
|
154
|
+
} catch (error2) {
|
|
155
|
+
if (error2?.[0]?.REQUEST_TIMEOUT) {
|
|
156
|
+
return [error2, null, { executeId: "" }];
|
|
157
|
+
}
|
|
158
|
+
const errorPined = { REQUEST_FAIL: error2 };
|
|
159
|
+
return [errorPined, null, { executeId: "unknown" }];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
86
162
|
const cacheThrottleMs = options.cacheThrottleMs ?? 0;
|
|
87
163
|
const cacheKey = generateCacheKey(path, options.params);
|
|
88
164
|
let cacheStorage = stargateOptions.cacheStorage;
|
|
@@ -103,25 +179,14 @@ async function createStargate(stargateOptions) {
|
|
|
103
179
|
return [null, cached.data, { executeId: "cached" }];
|
|
104
180
|
}
|
|
105
181
|
}
|
|
182
|
+
await eventManager.emit("milkio:executeBefore", { path, options });
|
|
183
|
+
const body = JSON.stringify(options.params) ?? "";
|
|
184
|
+
await eventManager.emit("milkio:fetchBefore", { path, options, body });
|
|
106
185
|
const executeRequest = async (isRetry) => {
|
|
107
186
|
try {
|
|
108
|
-
await
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
const response = await new Promise(async (resolve, reject) => {
|
|
112
|
-
const timeout = options?.timeout ?? stargateOptions?.timeout ?? 6000;
|
|
113
|
-
const timer = setTimeout(() => {
|
|
114
|
-
reject([{ REQUEST_TIMEOUT: { timeout, message: `Execute timeout after ${timeout}ms.` } }, null]);
|
|
115
|
-
}, timeout);
|
|
116
|
-
try {
|
|
117
|
-
const value = await (await $fetch(url, { method: "POST", body, headers: options.headers })).text();
|
|
118
|
-
clearTimeout(timer);
|
|
119
|
-
resolve(value);
|
|
120
|
-
} catch (error2) {
|
|
121
|
-
reject(error2);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
const parsed = reviveJSONParse(JSON.parse(response));
|
|
187
|
+
const response = await $fetch(url, { method: "POST", body, headers: options.headers });
|
|
188
|
+
const text = await response.text();
|
|
189
|
+
const parsed = JSON.parse(text);
|
|
125
190
|
return { result: { value: parsed }, error: null, isNetworkError: false };
|
|
126
191
|
} catch (error2) {
|
|
127
192
|
const isNetworkError2 = !error2?.[0]?.REQUEST_TIMEOUT;
|
|
@@ -221,7 +286,7 @@ async function createStargate(stargateOptions) {
|
|
|
221
286
|
});
|
|
222
287
|
const contentType = response.headers.get("Content-Type");
|
|
223
288
|
if (!contentType?.startsWith("text/event-stream")) {
|
|
224
|
-
throw new Error(`Expected content-type to be
|
|
289
|
+
throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`);
|
|
225
290
|
}
|
|
226
291
|
await getBytes(response.body, getLines(getMessages(onmessage)));
|
|
227
292
|
await iterator.return();
|
|
@@ -297,7 +362,7 @@ async function createStargate(stargateOptions) {
|
|
|
297
362
|
}
|
|
298
363
|
},
|
|
299
364
|
__cookbook: {
|
|
300
|
-
subscribe: async (
|
|
365
|
+
subscribe: async (baseUrl) => {
|
|
301
366
|
const headers = {
|
|
302
367
|
"Content-Type": "application/json",
|
|
303
368
|
Accept: "text/event-stream"
|
|
@@ -325,7 +390,7 @@ async function createStargate(stargateOptions) {
|
|
|
325
390
|
iterator.return();
|
|
326
391
|
});
|
|
327
392
|
try {
|
|
328
|
-
const response = await $fetch(`${
|
|
393
|
+
const response = await $fetch(`${baseUrl}/$subscribe`, {
|
|
329
394
|
method: "POST",
|
|
330
395
|
headers,
|
|
331
396
|
body,
|
|
@@ -333,7 +398,7 @@ async function createStargate(stargateOptions) {
|
|
|
333
398
|
});
|
|
334
399
|
const contentType = response.headers.get("Content-Type");
|
|
335
400
|
if (!contentType?.startsWith("text/event-stream")) {
|
|
336
|
-
throw new Error(`Expected content-type to be
|
|
401
|
+
throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`);
|
|
337
402
|
}
|
|
338
403
|
await getBytes(response.body, getLines(getMessages(onmessage)));
|
|
339
404
|
await iterator.return();
|
|
@@ -390,7 +455,7 @@ async function createStargate(stargateOptions) {
|
|
|
390
455
|
},
|
|
391
456
|
async ping(options) {
|
|
392
457
|
return await new Promise(async (resolve) => {
|
|
393
|
-
const url = `${await
|
|
458
|
+
const url = `${await baseUrlPromise}/generate_204`;
|
|
394
459
|
const timeout = stargateOptions?.timeout ?? options?.timeout ?? 6000;
|
|
395
460
|
const startsTime = Date.now();
|
|
396
461
|
const timer = setTimeout(() => {
|
|
@@ -417,23 +482,47 @@ async function createStargate(stargateOptions) {
|
|
|
417
482
|
}
|
|
418
483
|
var isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
|
|
419
484
|
function reviveJSONParse(json) {
|
|
420
|
-
if (json
|
|
421
|
-
|
|
485
|
+
if (json === null || json === undefined)
|
|
486
|
+
return json;
|
|
487
|
+
const type = typeof json;
|
|
488
|
+
if (type === "object") {
|
|
489
|
+
if (json instanceof Date)
|
|
422
490
|
return json;
|
|
423
|
-
}
|
|
424
491
|
if (Array.isArray(json)) {
|
|
425
|
-
|
|
492
|
+
const len = json.length;
|
|
493
|
+
for (let i = 0;i < len; i++) {
|
|
494
|
+
const result = reviveJSONParse(json[i]);
|
|
495
|
+
if (result !== json[i])
|
|
496
|
+
json[i] = result;
|
|
497
|
+
}
|
|
498
|
+
return json;
|
|
499
|
+
}
|
|
500
|
+
const keys = Object.keys(json);
|
|
501
|
+
const obj = json;
|
|
502
|
+
for (let i = 0;i < keys.length; i++) {
|
|
503
|
+
const key = keys[i];
|
|
504
|
+
const value = obj[key];
|
|
505
|
+
const result = reviveJSONParse(value);
|
|
506
|
+
if (result !== value)
|
|
507
|
+
obj[key] = result;
|
|
426
508
|
}
|
|
427
|
-
return
|
|
428
|
-
acc[key] = reviveJSONParse(value);
|
|
429
|
-
return acc;
|
|
430
|
-
}, {});
|
|
509
|
+
return json;
|
|
431
510
|
}
|
|
432
|
-
if (
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
511
|
+
if (type === "string") {
|
|
512
|
+
const str = json;
|
|
513
|
+
const len = str.length;
|
|
514
|
+
if (len >= 20 && len <= 32 && str.charCodeAt(0) >= 48 && str.charCodeAt(0) <= 57 && str.indexOf("T") !== -1) {
|
|
515
|
+
const match = str.match(isoDatePattern);
|
|
516
|
+
if (match !== null) {
|
|
517
|
+
if (match[2]) {
|
|
518
|
+
const colonPos = match[2].charCodeAt(3) === 58 ? match[1].length + 3 : -1;
|
|
519
|
+
if (colonPos >= 0) {
|
|
520
|
+
return new Date(str.substring(0, colonPos) + str.substring(colonPos + 1));
|
|
521
|
+
}
|
|
522
|
+
return new Date(str);
|
|
523
|
+
}
|
|
524
|
+
return new Date(match[1] + "Z");
|
|
525
|
+
}
|
|
437
526
|
}
|
|
438
527
|
}
|
|
439
528
|
return json;
|
|
@@ -659,5 +748,5 @@ export {
|
|
|
659
748
|
createDefaultCacheStorage
|
|
660
749
|
};
|
|
661
750
|
|
|
662
|
-
//# debugId=
|
|
663
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICBiYXNlVXJsOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgYWJvcnQ/OiB0eXBlb2YgQWJvcnRDb250cm9sbGVyO1xuICBjYWNoZVN0b3JhZ2U/OiBDYWNoZVN0b3JhZ2U7XG4gIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgZ2V0OiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8eyBkYXRhOiBhbnk7IHRpbWVzdGFtcDogbnVtYmVyIH0gfCBudWxsPjtcbiAgc2V0OiAoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IHR5cGUgRXhlY3V0ZU9wdGlvbnM8VCBleHRlbmRzIGFueT4gPSB7XG4gIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgY2FjaGVTdHJhdGVneT86IENhY2hlU3RyYXRlZ3k7XG4gIGNhY2hlVGhyb3R0bGVNcz86IG51bWJlcjtcbiAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICByZXRyeVN0cmF0ZWd5PzogUmV0cnlTdHJhdGVneTtcbn07XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVSZXN1bHRzT3B0aW9uID0geyBleGVjdXRlSWQ6IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBQaW5nID1cbiAgfCBbXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Q6IGZhbHNlO1xuICAgICAgICBkZWxheTogbnVtYmVyO1xuICAgICAgICBlcnJvcjogYW55O1xuICAgICAgfSxcbiAgICAgIG51bGwsXG4gICAgXVxuICB8IFtcbiAgICAgIG51bGwsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Q6IHRydWU7XG4gICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgIHNlcnZlclRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gIGNvbnN0ICRmZXRjaCA9IHN0YXJnYXRlT3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgY29uc3QgJGFib3J0ID0gc3RhcmdhdGVPcHRpb25zLmFib3J0ID8/IEFib3J0Q29udHJvbGxlcjtcblxuICB0eXBlIFN0YXJnYXRlRXZlbnRzID0ge1xuICAgICdtaWxraW86ZXhlY3V0ZUJlZm9yZSc6IHsgcGF0aDogc3RyaW5nOyBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9uczxhbnk+LCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PiB9O1xuICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICdtaWxraW86ZXhlY3V0ZUVycm9yJzoge1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47XG4gICAgICBlcnJvcjogUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT47XG4gICAgICBoYW5kbGVFcnJvcjogPEsgZXh0ZW5kcyBrZXlvZiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPj4oZXJyb3I6IGFueSwga2V5OiBLLCBoYW5kbGVyOiAoZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ11bS10+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgIGlmIChrZXkgaW4gZXJyb3IpIHtcbiAgICAgIGNvbnN0IGhhbmRsZWQgPSBhd2FpdCBoYW5kbGVyKGVycm9yW2tleV0pO1xuICAgICAgaWYgKGhhbmRsZWQpIGRlbGV0ZSBlcnJvcltrZXldO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgaW5kZXhlZCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8KGV2ZW50OiBhbnkpID0+IHZvaWQ+PigpO1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaW5kZXhlZC5zZXQoa2V5IGFzIHN0cmluZywgbmV3IFNldCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgIHNldC5hZGQoaGFuZGxlcik7XG4gICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKCFzZXQpIHJldHVybjtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgfSxcbiAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZXZlbnRNYW5hZ2VyO1xuICB9O1xuXG4gIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gIGNvbnN0IGJvb3RzdHJhcCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgYmFzZVVybCA9IHN0YXJnYXRlT3B0aW9ucy5iYXNlVXJsO1xuICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG5cbiAgICByZXR1cm4gYmFzZVVybDtcbiAgfTtcblxuICBjb25zdCBiYXNlVXJsOiBQcm9taXNlPHN0cmluZz4gPSBib290c3RyYXAoKTtcblxuICBjb25zdCBzdGFyZ2F0ZSA9IHtcbiAgICAuLi5ldmVudE1hbmFnZXIsXG4gICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgIGFzeW5jIGV4ZWN1dGU8UGF0aCBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXT4oXG4gICAgICBwYXRoOiBQYXRoLFxuICAgICAgb3B0aW9uczogTWl4aW48XG4gICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgfVxuICAgICAgPixcbiAgICApOiBQcm9taXNlPFxuICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddLCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgOiAvLyBzdHJlYW1cbiAgICAgICAgICAgIFtQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPiwgbnVsbCwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dIHwgW251bGwsIEFzeW5jR2VuZXJhdG9yPFtQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddPl0sIHVuZGVmaW5lZD4sIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXVxuICAgID4ge1xuICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICBsZXQgYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSAnZnVuY3Rpb24nKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgIHVybCA9IGJhc2VVcmwgKyAocGF0aCBhcyBzdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gKGF3YWl0IGJhc2VVcmwpICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgLy8gYWN0aW9uXG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgY29uc3QgY2FjaGVTdHJhdGVneSA9IG9wdGlvbnMuY2FjaGVTdHJhdGVneSA/PyAnb2ZmJztcbiAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSB0cnVlIHx8IG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gMikge1xuICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09ICdudW1iZXInICYmIG9wdGlvbnMucmV0cnlTdHJhdGVneSA+IDApIHtcbiAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlVGhyb3R0bGVNcyA9IG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID8/IDA7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZ2VuZXJhdGVDYWNoZUtleShwYXRoIGFzIHN0cmluZywgb3B0aW9ucy5wYXJhbXMpO1xuXG4gICAgICAgIGxldCBjYWNoZVN0b3JhZ2UgPSBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVTdG9yYWdlO1xuICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgIWNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgIGNhY2hlU3RvcmFnZSA9IGF3YWl0IGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2UoeyBlbmNyeXB0aW9uOiBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVFbmNyeXB0aW9uIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSAmJiBvcHRpb25zLm9uQ2FjaGVIaXQpIHtcbiAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uQ2FjaGVIaXQoY2FjaGVkLmRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIC8vIGlnbm9yZSBvbkNhY2hlSGl0IGVycm9yc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ID09PSAndGhyb3R0bGUnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC50aW1lc3RhbXAgPCBjYWNoZVRocm90dGxlTXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgY2FjaGVkLmRhdGEsIHsgZXhlY3V0ZUlkOiAnY2FjaGVkJyB9XSBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlcXVlc3QgPSBhc3luYyAoaXNSZXRyeTogYm9vbGVhbik6IFByb21pc2U8eyByZXN1bHQ6IHsgdmFsdWU6IFJlY29yZDxhbnksIGFueT4gfSB8IG51bGw7IGVycm9yOiBhbnk7IGlzTmV0d29ya0Vycm9yOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/PyBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCAoYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzcG9uc2UpKTtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogeyB2YWx1ZTogcGFyc2VkIH0sIGVycm9yOiBudWxsLCBpc05ldHdvcmtFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zdCBpc05ldHdvcmtFcnJvciA9ICFlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQ7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG51bGwsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgeyByZXN1bHQsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoZmFsc2UpO1xuXG4gICAgICAgIGZvciAobGV0IHJldHJ5SW5kZXggPSAwOyByZXRyeUluZGV4IDwgcmV0cnlDb3VudCAmJiBlcnJvciAmJiBpc05ldHdvcmtFcnJvcjsgcmV0cnlJbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHJldHJ5SW5kZXggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmV0cnlSZXN1bHQgPSBhd2FpdCBleGVjdXRlUmVxdWVzdCh0cnVlKTtcbiAgICAgICAgICByZXN1bHQgPSByZXRyeVJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgZXJyb3IgPSByZXRyeVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpc05ldHdvcmtFcnJvciA9IHJldHJ5UmVzdWx0LmlzTmV0d29ya0Vycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgaXNOZXR3b3JrRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XG4gICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCEudmFsdWUuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgZXJyW3Jlc3VsdCEudmFsdWUuY29kZV0gPSByZXN1bHQhLnZhbHVlLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgYXdhaXQgY2FjaGVTdG9yYWdlLnNldChjYWNoZUtleSwgcmVzdWx0IS52YWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0IS52YWx1ZS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgIG9wdGlvbnMuY2FjaGVTdHJhdGVneSA9ICdvZmYnO1xuICAgICAgICBvcHRpb25zLm9uQ2FjaGVIaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAndGV4dC9ldmVudC1zdHJlYW0nO1xuICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuICAgICAgICBsZXQgc3RyZWFtUmVzdWx0OiBhbnk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcblxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0sIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5kYXRhLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSkpO1xuICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfRkFJTDogZXJyb3IgfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICBzdGFjayEuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcblxuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMhLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyEuaGVhZGVycyxcbiAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7IFJFUVVFU1RfRkFJTDogZXJyIH07XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/ICcnLFxuICAgICAgICAgICAgICAgIGZhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGNvZGU6ICdORVRXT1JLX0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdOZXR3b3JrIEVycm9yJyxcbiAgICAgICAgICAgICAgICAgIGZyb21DbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBlcnIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2luZGV4LCBzdGFja10gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrLmRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc3RyZWFtUmVzdWx0RmV0Y2hlZC5wcm9taXNlO1xuICAgICAgICAgIHJldHVybiBbbnVsbCwgaXRlcmF0b3IsIHsgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBfX2Nvb2tib29rOiB7XG4gICAgICBzdWJzY3JpYmU6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIEFjY2VwdDogJ3RleHQvZXZlbnQtc3RyZWFtJyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcykgPz8gJyc7XG4gICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuXG4gICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2goYCR7YmFzZVVybH0vJHN1YnNjcmliZWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAkeyd0ZXh0L2V2ZW50LXN0cmVhbSd9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXN5bmMgcGluZyhvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pOiBQcm9taXNlPFBpbmc+IHtcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8UGluZz4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7YXdhaXQgYmFzZVVybH0vZ2VuZXJhdGVfMjA0YDtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgIGNvbnN0IHN0YXJ0c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0gfSwgbnVsbF0pO1xuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdIRUFEJyB9KTtcbiAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfRkFJTDogeyByZXNwb25zZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6ICdTdGF0dXMgY29kZSBub3QgMjA0JyB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoW251bGwsIHsgY29ubmVjdDogdHJ1ZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgc2VydmVyVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIS5zdWJzdHJpbmcoMTcpKSB9XSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmV0dXJuIFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvciB9LCBudWxsXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAkdHlwZXM6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHtcbiAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkO1xuICAgICAgZXJyb3I6IEdlbmVyYXRlZFsncmVqZWN0Q29kZSddO1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXV06IEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncGFyYW1zJ107XG4gICAgICB9O1xuICAgICAgcmVzdWx0czoge1xuICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11dOiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ/CfpZsnXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXVxuICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+O1xuICAgICAgfTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBzdGFyZ2F0ZTtcbn1cblxuY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gIGlmIChqc29uICE9PSBudWxsICYmIHR5cGVvZiBqc29uID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSB8fCAodHlwZW9mIChqc29uIGFzIGFueSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKGpzb24gYXMgYW55KS50b0lTT1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24pLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY1trZXkgYXMga2V5b2YgVF0gPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBUKTtcbiAgfVxuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRlU3RyaW5nID0gbWF0Y2hbMl0gPyBgJHttYXRjaFsxXX0ke21hdGNoWzJdLnJlcGxhY2UoJzonLCAnJyl9YCA6IGAke21hdGNoWzFdfVpgO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKG5vcm1hbGl6ZWREYXRlU3RyaW5nKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVTdHJlYW1PcHRpb25zIHtcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2NoZW1hRXh0ZW5kIHtcbiAgYXBpVmFsaWRhdG9yOiB7XG4gICAgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgICB2YWxpZGF0ZTogUmVjb3JkPGFueSwgYW55PjtcbiAgfTtcbiAgYXBpTWV0aG9kc1NjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgYXBpTWV0aG9kc1R5cGVTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gIGFwaVRlc3RzU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBGYWlsQ29kZUV4dGVuZCA9IFJlY29yZDxhbnksICguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiBhbnk+O1xuXG5leHBvcnQgdHlwZSBCb290c3RyYXBNaWRkbGV3YXJlID0gKGRhdGE6IHsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyBwYXJhbXM6IGFueTsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHJlc3VsdDogeyB2YWx1ZTogYW55IH07IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZU9wdGlvbnMge1xuICBib290c3RyYXA/OiBCb290c3RyYXBNaWRkbGV3YXJlO1xuICBiZWZvcmVFeGVjdXRlPzogQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmU7XG4gIGFmdGVyRXhlY3V0ZT86IEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RvcmFnZSB7XG4gIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVJlc3VsdFN1Y2Nlc3M8UmVzdWx0PiB7XG4gIGV4ZWN1dGVJZDogc3RyaW5nO1xuICBzdWNjZXNzOiB0cnVlO1xuICBkYXRhOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRvckdlbmVyaWM8VD4gPSBUIGV4dGVuZHMgQXN5bmNHZW5lcmF0b3I8aW5mZXIgST4gPyBJIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEZsYXR0ZW5LZXlzPFQsIFByZWZpeCBleHRlbmRzIHN0cmluZyA9ICcnPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFJlYWRhYmxlU3RyZWFtIGludG8gYSBjYWxsYmFjayBwYXR0ZXJuLlxuICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgUmVhZGFibGVTdHJlYW0uXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gIC8vIEB0cy1pZ25vcmVcbiAgd2hpbGUgKCEocmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKSkuZG9uZSkge1xuICAgIG9uQ2h1bmsocmVzdWx0LnZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBhcmJpdGFyeSBieXRlIGNodW5rcyBpbnRvIEV2ZW50U291cmNlIGxpbmUgYnVmZmVycy5cbiAqIEVhY2ggbGluZSBzaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBcImZpZWxkOiB2YWx1ZVwiIGFuZCBlbmRzIHdpdGggXFxyLCBcXG4sIG9yIFxcclxcbi5cbiAqIEBwYXJhbSBvbkxpbmUgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbmV3IEV2ZW50U291cmNlIGxpbmUuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZXMob25MaW5lOiAobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikgPT4gdm9pZCkge1xuICBsZXQgYnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICBsZXQgcG9zaXRpb246IG51bWJlcjsgLy8gY3VycmVudCByZWFkIHBvc2l0aW9uXG4gIGxldCBmaWVsZExlbmd0aDogbnVtYmVyOyAvLyBsZW5ndGggb2YgdGhlIGBmaWVsZGAgcG9ydGlvbiBvZiB0aGUgbGluZVxuICBsZXQgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rOlxuICByZXR1cm4gZnVuY3Rpb24gb25DaHVuayhhcnI6IFVpbnQ4QXJyYXkpIHtcbiAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZmZlciA9IGFycjtcbiAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlJ3JlIHN0aWxsIHBhcnNpbmcgdGhlIG9sZCBsaW5lLiBBcHBlbmQgdGhlIG5ldyBieXRlcyBpbnRvIGJ1ZmZlcjpcbiAgICAgIGJ1ZmZlciA9IGNvbmNhdChidWZmZXIsIGFycik7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmTGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgICBsZXQgbGluZVN0YXJ0ID0gMDsgLy8gaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQgbGluZSBzdGFydHNcbiAgICB3aGlsZSAocG9zaXRpb24gPCBidWZMZW5ndGgpIHtcbiAgICAgIGlmIChkaXNjYXJkVHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICAgIGlmIChidWZmZXJbcG9zaXRpb25dID09PSAxMCkge1xuICAgICAgICAgIGxpbmVTdGFydCA9ICsrcG9zaXRpb247IC8vIHNraXAgdG8gbmV4dCBjaGFyXG4gICAgICAgIH1cblxuICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yd2FyZCB0aWxsIHRoZSBlbmQgb2YgbGluZTpcbiAgICAgIGxldCBsaW5lRW5kID0gLTE7IC8vIGluZGV4IG9mIHRoZSBcXHIgb3IgXFxuIGNoYXJcbiAgICAgIGZvciAoOyBwb3NpdGlvbiA8IGJ1Zkxlbmd0aCAmJiBsaW5lRW5kID09PSAtMTsgKytwb3NpdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGJ1ZmZlcltwb3NpdGlvbl0pIHtcbiAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgaWYgKGZpZWxkTGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAvLyBmaXJzdCBjb2xvbiBpbiBsaW5lXG4gICAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gcG9zaXRpb24gLSBsaW5lU3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIGxpbmVFbmQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmVFbmQgPT09IC0xKSB7XG4gICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJ1dCB0aGUgbGluZSBoYXNuJ3QgZW5kZWQuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGFyciBhbmQgdGhlbiBjb250aW51ZSBwYXJzaW5nOlxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gd2UndmUgcmVhY2hlZCB0aGUgbGluZSBlbmQsIHNlbmQgaXQgb3V0OlxuICAgICAgb25MaW5lKGJ1ZmZlci5zdWJhcnJheShsaW5lU3RhcnQsIGxpbmVFbmQpLCBmaWVsZExlbmd0aCk7XG4gICAgICBsaW5lU3RhcnQgPSBwb3NpdGlvbjsgLy8gd2UncmUgbm93IG9uIHRoZSBuZXh0IGxpbmVcbiAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKGxpbmVTdGFydCA9PT0gYnVmTGVuZ3RoKSB7XG4gICAgICBidWZmZXIgPSB1bmRlZmluZWQ7IC8vIHdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgaXRcbiAgICB9IGVsc2UgaWYgKGxpbmVTdGFydCAhPT0gMCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHZpZXcgaW50byBidWZmZXIgYmVnaW5uaW5nIGF0IGxpbmVTdGFydCBzbyB3ZSBkb24ndFxuICAgICAgLy8gbmVlZCB0byBjb3B5IG92ZXIgdGhlIHByZXZpb3VzIGxpbmVzIHdoZW4gd2UgZ2V0IHRoZSBuZXcgYXJyOlxuICAgICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCk7XG4gICAgICBwb3NpdGlvbiAtPSBsaW5lU3RhcnQ7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBsaW5lIGJ1ZmZlcnMgaW50byBFdmVudFNvdXJjZU1lc3NhZ2VzLlxuICogQHBhcmFtIG9uSWQgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYGlkYCBmaWVsZC5cbiAqIEBwYXJhbSBvblJldHJ5IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGByZXRyeWAgZmllbGQuXG4gKiBAcGFyYW0gb25NZXNzYWdlIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VzKG9uTWVzc2FnZT86IChtc2c6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4gdm9pZCkge1xuICBsZXQgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlcjpcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uTGluZShsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBlbXB0eSBsaW5lIGRlbm90ZXMgZW5kIG9mIG1lc3NhZ2UuIFRyaWdnZXIgdGhlIGNhbGxiYWNrIGFuZCBzdGFydCBhIG5ldyBtZXNzYWdlOlxuICAgICAgb25NZXNzYWdlPy4obWVzc2FnZSk7XG4gICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICAgIH0gZWxzZSBpZiAoZmllbGRMZW5ndGggPiAwKSB7XG4gICAgICAvLyBleGNsdWRlIGNvbW1lbnRzIGFuZCBsaW5lcyB3aXRoIG5vIHZhbHVlc1xuICAgICAgLy8gbGluZSBpcyBvZiBmb3JtYXQgXCI8ZmllbGQ+Ojx2YWx1ZT5cIiBvciBcIjxmaWVsZD46IDx2YWx1ZT5cIlxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjZXZlbnQtc3RyZWFtLWludGVycHJldGF0aW9uXG4gICAgICBjb25zdCBmaWVsZCA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkoMCwgZmllbGRMZW5ndGgpKTtcbiAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gZmllbGRMZW5ndGggKyAobGluZVtmaWVsZExlbmd0aCArIDFdID09PSAzMiA/IDIgOiAxKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSh2YWx1ZU9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgIC8vIGlmIHRoaXMgbWVzc2FnZSBhbHJlYWR5IGhhcyBkYXRhLCBhcHBlbmQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgb2xkLlxuICAgICAgICAgIC8vIG90aGVyd2lzZSwganVzdCBzZXQgdG8gdGhlIG5ldyB2YWx1ZTpcbiAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBtZXNzYWdlLmRhdGEgPyBgJHttZXNzYWdlLmRhdGF9XFxuJHt2YWx1ZX1gIDogdmFsdWU7IC8vIG90aGVyd2lzZSxcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbmNhdChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KSB7XG4gIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGEubGVuZ3RoICsgYi5sZW5ndGgpO1xuICByZXMuc2V0KGEpO1xuICByZXMuc2V0KGIsIGEubGVuZ3RoKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gbmV3TWVzc2FnZSgpOiBFdmVudFNvdXJjZU1lc3NhZ2Uge1xuICByZXR1cm4ge1xuICAgIGRhdGE6ICcnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUID0gYW55PigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVzb2x2ZSddO1xuICBsZXQgcmVqZWN0OiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVqZWN0J107XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICByZXNvbHZlID0gcmVzO1xuICAgIHJlamVjdCA9IHJlajtcbiAgfSk7XG4gIHJldHVybiB7IHByb21pc2UsIHJlc29sdmU6IHJlc29sdmUhLCByZWplY3Q6IHJlamVjdCEgfTtcbn1cblxuY29uc3QgREJfTkFNRSA9ICdTdGFyZ2F0ZSc7XG5jb25zdCBTVE9SRV9OQU1FID0gJ2NhY2hlcyc7XG5sZXQgZGJJbnN0YW5jZTogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkRCKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgaWYgKGRiSW5zdGFuY2UpIHJldHVybiBkYkluc3RhbmNlO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIDEpO1xuICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIGRiSW5zdGFuY2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgIHJlc29sdmUoZGJJbnN0YW5jZSk7XG4gICAgfTtcbiAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgY29uc3QgZGIgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkge1xuICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2Uob3B0aW9ucz86IHsgZW5jcnlwdGlvbj86IGJvb2xlYW47IGVuY3J5cHRpb25LZXk/OiBzdHJpbmcgfSk6IFByb21pc2U8Q2FjaGVTdG9yYWdlPiB7XG4gIGF3YWl0IG9wZW5EQigpO1xuXG4gIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgY291bnRlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgIGNvbnN0IGtleVN0cmluZyA9IG9wdGlvbnMuZW5jcnlwdGlvbktleSA/PyBEQl9OQU1FO1xuICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXlTdHJpbmcpLmZvckVhY2goKGJ5dGUsIGkpID0+IHtcbiAgICAgIGlmIChpIDwgMTYpIGNvdW50ZXJbaV0gPSBieXRlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IGtleURhdGEgPSBlbmNvZGVyLmVuY29kZShrZXlTdHJpbmcpO1xuICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleURhdGEsIHsgbmFtZTogJ1BCS0RGMicgfSwgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xuXG4gICAgZW5jcnlwdGlvbktleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgc2FsdDogZW5jb2Rlci5lbmNvZGUoJ21pbGtpby1zdGFyZ2F0ZS1jYWNoZScpLFxuICAgICAgICBpdGVyYXRpb25zOiAxMDAwMDAsXG4gICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgIH0sXG4gICAgICBpbXBvcnRlZEtleSxcbiAgICAgIHsgbmFtZTogJ0FFUy1DVFInLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBlbmNyeXB0RGF0YSA9IGFzeW5jIChkYXRhOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHJldHVybiBkYXRhO1xuXG4gICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBkYXRhQnl0ZXMgPSBlbmNvZGVyLmVuY29kZShqc29uU3RyaW5nKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEFycmF5QnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgIGxlbmd0aDogNjQsXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICBkYXRhQnl0ZXMsXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmNyeXB0ZWRBcnJheUJ1ZmZlcik7XG4gIH07XG5cbiAgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoZW5jcnlwdGVkRGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICBpZiAoIWVuY3J5cHRpb25LZXkgfHwgIWVuY3J5cHRlZERhdGEpIHJldHVybiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlbmNyeXB0ZWREYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IChlbmNyeXB0ZWREYXRhLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcikgOiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQnl0ZXMgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QganNvblN0cmluZyA9IGRlY29kZXIuZGVjb2RlKGRlY3J5cHRlZEJ5dGVzKTtcbiAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoanNvblN0cmluZykpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24gJiYgKHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgcmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkRGF0YSA9IGF3YWl0IGRlY3J5cHREYXRhKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHJlc29sdmUoeyBkYXRhOiBkZWNyeXB0ZWREYXRhLCB0aW1lc3RhbXA6IHJlc3VsdC50aW1lc3RhbXAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQgPz8gbnVsbCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EQigpO1xuICAgICAgbGV0IGRhdGFUb1N0b3JlOiBhbnkgPSBkYXRhO1xuXG4gICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICBkYXRhVG9TdG9yZSA9IGF3YWl0IGVuY3J5cHREYXRhKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dCh7IGRhdGE6IGRhdGFUb1N0b3JlLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSwga2V5KTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2FjaGVLZXkocGF0aDogc3RyaW5nLCBwYXJhbXM6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtwYXRofToke0pTT04uc3RyaW5naWZ5KHBhcmFtcyA/PyB7fSl9YDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFrREEsZUFBc0IsY0FBdUUsQ0FBQyxpQkFBd0M7QUFBQSxFQUNwSSxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQWF4QyxNQUFNLGNBQW1CLE9BQU8sT0FBWSxLQUFhLFlBQXdEO0FBQUEsSUFDL0csSUFB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
|
|
751
|
+
//# debugId=678F542D2DB2E79B64756E2164756E21
|
|
752
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIGNvbnN0ICRhYm9ydCA9IHN0YXJnYXRlT3B0aW9ucy5hYm9ydCA/PyBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAvLyBEZXRlY3QgaWYgd2UgY2FuIHVzZSBOb2RlLmpzIGh0dHAgbW9kdWxlIGZvciBuYXRpdmUgSFRUUCB0cmFuc3BvcnRcbiAgICAvLyBPbmx5IHVzZSBpbiBwdXJlIE5vZGUuanMgZW52aXJvbm1lbnQgKG5vdCBCdW4sIG5vdCBEZW5vLCBub3Qgc2VydmVybGVzcylcbiAgICBsZXQgbm9kZUh0dHBSZXF1ZXN0OiBhbnkgPSBudWxsO1xuICAgIGxldCBub2RlSHR0cEFnZW50OiBhbnkgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEJ1biBhbHNvIHN1cHBvcnRzIG5vZGU6aHR0cCwgYnV0IGl0cyBmZXRjaCBpcyBhbHJlYWR5IG9wdGltaXplZFxuICAgICAgICAvLyBPbmx5IHVzZSBuYXRpdmUgaHR0cCB3aGVuIHJ1bm5pbmcgaW4gcHVyZSBOb2RlLmpzXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChCdW4gYXMgYW55KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0dHAgPSBhd2FpdCBpbXBvcnQoJ25vZGU6aHR0cCcpO1xuICAgICAgICAgICAgbm9kZUh0dHBSZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICAgICAgICAgICAgbm9kZUh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KHsga2VlcEFsaXZlOiB0cnVlLCBtYXhTb2NrZXRzOiAxMDAgfSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGluIE5vZGUuanMgZW52aXJvbm1lbnQgKERlbm8sIGJyb3dzZXIsIHNlcnZlcmxlc3MsIGV0Yy4pXG4gICAgfVxuXG4gICAgLy8gTmF0aXZlIEhUVFAgUE9TVCB1c2luZyBOb2RlLmpzIGh0dHAgbW9kdWxlIChieXBhc3NlcyB1bmRpY2kgb3ZlcmhlYWQpXG4gICAgLy8gRmFsbHMgYmFjayB0byBmZXRjaCBpbiBub24tTm9kZS5qcyBlbnZpcm9ubWVudHNcbiAgICBjb25zdCBuYXRpdmVIdHRwUG9zdCA9IG5vZGVIdHRwUmVxdWVzdFxuICAgICAgICA/ICh1cmw6IHN0cmluZywgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgYm9keTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0IHx8IDgwLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAuLi5oZWFkZXJzLCAnQ29udGVudC1MZW5ndGgnOiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5KSB9LFxuICAgICAgICAgICAgICAgICAgICBhZ2VudDogbm9kZUh0dHBBZ2VudCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IG5vZGVIdHRwUmVxdWVzdChvcHRpb25zLCAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rOiBhbnkpID0+IHsgZGF0YSArPSBjaHVuazsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5vbignZW5kJywgKCkgPT4geyByZXNvbHZlKGRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICByZXEud3JpdGUoYm9keSk7XG4gICAgICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgdHlwZSBTdGFyZ2F0ZUV2ZW50cyA9IHtcbiAgICAgICAgJ21pbGtpbzpleGVjdXRlQmVmb3JlJzogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+IH07XG4gICAgICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVFcnJvcic6IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+O1xuICAgICAgICAgICAgZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+O1xuICAgICAgICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4+KGVycm9yOiBhbnksIGtleTogSywgaGFuZGxlcjogKGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddW0tdPikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pID0+IFByb21pc2U8dm9pZD47XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gYXdhaXQgaGFuZGxlcihlcnJvcltrZXldKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVkKSBkZWxldGUgZXJyb3Jba2V5XTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgICBjb25zdCBib290c3RyYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoJy8nKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXNlVXJsUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gYm9vdHN0cmFwKCk7XG4gICAgLy8gQ2FjaGUgcmVzb2x2ZWQgYmFzZVVybCB0byBhdm9pZCBhd2FpdCBvdmVyaGVhZCBvbiByZXBlYXRlZCBjYWxsc1xuICAgIGxldCByZXNvbHZlZEJhc2VVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIFVSTCBmb3IgbGFzdCBwYXRoIHRvIGF2b2lkIHN0cmluZyBjb25jYXRlbmF0aW9uIHBlciByZXF1ZXN0XG4gICAgbGV0IGNhY2hlZFVybFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjYWNoZWRVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgICAgIC4uLmV2ZW50TWFuYWdlcixcbiAgICAgICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgICAgICBhc3luYyBleGVjdXRlPFBhdGggZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ10+KFxuICAgICAgICAgICAgcGF0aDogUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPFxuICAgICAgICAgICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+LFxuICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgID4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAvLyBDYWNoZSBVUkwgZm9yIHJlcGVhdGVkIHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb25cbiAgICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gY2FjaGVkVXJsUGF0aCAmJiBjYWNoZWRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gY2FjaGVkVXJsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc29sdmVkQmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZFVybFBhdGggPSBwYXRoIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsID0gdXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBoZWFkZXJzIG9ubHkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGguQWNjZXB0ID09PSB1bmRlZmluZWQpIGguQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICAgICAgICAgIGlmIChoWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlU3RyYXRlZ3kgPSBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPz8gJ29mZic7XG4gICAgICAgICAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IHRydWUgfHwgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogbm8gY2FjaGUsIG5vIHJldHJ5XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICdvZmYnICYmIHJldHJ5Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSHR0cFBvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgTm9kZS5qcyBuYXRpdmUgaHR0cCBtb2R1bGUgZm9yIFBPU1QgKGJ5cGFzc2VzIHVuZGljaSBvdmVyaGVhZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgbmF0aXZlSHR0cFBvc3QodXJsLCBvcHRpb25zLmhlYWRlcnMsIGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJbcGFyc2VkLmNvZGVdID0gcGFyc2VkLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcGFyc2VkLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcGFyc2VkLmRhdGEsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6ICcnIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQaW5lZCA9IHsgUkVRVUVTVF9GQUlMOiBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVUaHJvdHRsZU1zID0gb3B0aW9ucy5jYWNoZVRocm90dGxlTXMgPz8gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGdlbmVyYXRlQ2FjaGVLZXkocGF0aCBhcyBzdHJpbmcsIG9wdGlvbnMucGFyYW1zKTtcblxuICAgICAgICAgICAgICAgIGxldCBjYWNoZVN0b3JhZ2UgPSBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVTdG9yYWdlO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiAhY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlU3RvcmFnZSA9IGF3YWl0IGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2UoeyBlbmNyeXB0aW9uOiBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVFbmNyeXB0aW9uIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgb3B0aW9ucy5vbkNhY2hlSGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25DYWNoZUhpdChjYWNoZWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb25DYWNoZUhpdCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ID09PSAndGhyb3R0bGUnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLnRpbWVzdGFtcCA8IGNhY2hlVGhyb3R0bGVNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBjYWNoZWQuZGF0YSwgeyBleGVjdXRlSWQ6ICdjYWNoZWQnIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVJlcXVlc3QgPSBhc3luYyAoaXNSZXRyeTogYm9vbGVhbik6IFByb21pc2U8eyByZXN1bHQ6IHsgdmFsdWU6IFJlY29yZDxhbnksIGFueT4gfSB8IG51bGw7IGVycm9yOiBhbnk7IGlzTmV0d29ya0Vycm9yOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdmFsdWU6IHBhcnNlZCB9LCBlcnJvcjogbnVsbCwgaXNOZXR3b3JrRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTmV0d29ya0Vycm9yID0gIWVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogbnVsbCwgZXJyb3IsIGlzTmV0d29ya0Vycm9yIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IHsgcmVzdWx0LCBlcnJvciwgaXNOZXR3b3JrRXJyb3IgfSA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5SW5kZXggPSAwOyByZXRyeUluZGV4IDwgcmV0cnlDb3VudCAmJiBlcnJvciAmJiBpc05ldHdvcmtFcnJvcjsgcmV0cnlJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeUluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXN1bHQgPSBhd2FpdCBleGVjdXRlUmVxdWVzdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmV0cnlSZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHJldHJ5UmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBpc05ldHdvcmtFcnJvciA9IHJldHJ5UmVzdWx0LmlzTmV0d29ya0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlICYmIGlzTmV0d29ya0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQaW5lZCA9IHsgUkVRVUVTVF9GQUlMOiBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3JQaW5lZCwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IS52YWx1ZS5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGVycltyZXN1bHQhLnZhbHVlLmNvZGVdID0gcmVzdWx0IS52YWx1ZS5yZWplY3QgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yOiBlcnIgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWNoZVN0b3JhZ2Uuc2V0KGNhY2hlS2V5LCByZXN1bHQhLnZhbHVlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0IS52YWx1ZS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPSAnb2ZmJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ2FjaGVIaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZVRocm90dGxlTXMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID0gJ3RleHQvZXZlbnQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XG4gICAgICAgICAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3JJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbVJlc3VsdDogYW55O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfRkFJTDogZXJyb3IgfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgY3VyUmVxdWVzdENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgJGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyEucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyEuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0geyBSRVFVRVNUX0ZBSUw6IGVyciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnTkVUV09SS19FUlJPUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTmV0d29yayBFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQ2xpZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2luZGV4LCBzdGFja10gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5kb25lKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbVJlc3VsdEZldGNoZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBpdGVyYXRvciwgeyBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdC5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBfX2Nvb2tib29rOiB7XG4gICAgICAgICAgICBzdWJzY3JpYmU6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICBBY2NlcHQ6ICd0ZXh0L2V2ZW50LXN0cmVhbScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiAocmVhc29uOiBhbnkpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgY3VyUmVxdWVzdENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgJGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKGAke2Jhc2VVcmx9LyRzdWJzY3JpYmVgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHBpbmcob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KTogUHJvbWlzZTxQaW5nPiB7XG4gICAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFBpbmc+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7YXdhaXQgYmFzZVVybFByb21pc2V9L2dlbmVyYXRlXzIwNGA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9GQUlMOiB7IHJlc3BvbnNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogJ1N0YXR1cyBjb2RlIG5vdCAyMDQnIH0gfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtudWxsLCB7IGNvbm5lY3Q6IHRydWUsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIHNlcnZlclRpbWVzdGFtcDogTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSEuc3Vic3RyaW5nKDE3KSkgfV0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yIH0sIG51bGxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAkdHlwZXM6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkO1xuICAgICAgICAgICAgZXJyb3I6IEdlbmVyYXRlZFsncmVqZWN0Q29kZSddO1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddXTogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddXTogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICAgICAgPyAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddXG4gICAgICAgICAgICAgICAgOiAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHN0YXJnYXRlO1xufVxuXG5jb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcbiAgICBpZiAoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSB1bmRlZmluZWQpIHJldHVybiBqc29uO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvbjtcbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGpzb24ubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldml2ZUpTT05QYXJzZShqc29uW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBqc29uW2ldKSBqc29uW2ldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24gYXMgb2JqZWN0KTtcbiAgICAgICAgY29uc3Qgb2JqID0ganNvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldml2ZUpTT05QYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB2YWx1ZSkgb2JqW2tleV0gPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBzdHIgPSBqc29uIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgICAgICAvLyBRdWljayByZWplY3Q6IElTTyBkYXRlIHN0cmluZ3MgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQgYW5kIGNvbnRhaW4gJ1QnXG4gICAgICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPj0gMjAgJiYgbGVuIDw9IDMyICYmIHN0ci5jaGFyQ29kZUF0KDApID49IDB4MzAgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPD0gMHgzOSAmJiBzdHIuaW5kZXhPZignVCcpICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHIubWF0Y2goaXNvRGF0ZVBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uUG9zID0gbWF0Y2hbMl0uY2hhckNvZGVBdCgzKSA9PT0gNTggPyBtYXRjaFsxXS5sZW5ndGggKyAzIDogLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc3RyLnN1YnN0cmluZygwLCBjb2xvblBvcykgKyBzdHIuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSkpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc3RyKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFsxXSArICdaJykgYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVTdHJlYW1PcHRpb25zIHtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNjaGVtYUV4dGVuZCB7XG4gICAgYXBpVmFsaWRhdG9yOiB7XG4gICAgICAgIGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gICAgICAgIHZhbGlkYXRlOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIH07XG4gICAgYXBpTWV0aG9kc1NjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgICBhcGlNZXRob2RzVHlwZVNjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgICBhcGlUZXN0c1NjaGVtYTogUmVjb3JkPGFueSwgYW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgRmFpbENvZGVFeHRlbmQgPSBSZWNvcmQ8YW55LCAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55PjtcblxuZXhwb3J0IHR5cGUgQm9vdHN0cmFwTWlkZGxld2FyZSA9IChkYXRhOiB7IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcGFyYW1zOiBhbnk7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyByZXN1bHQ6IHsgdmFsdWU6IGFueSB9OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmVPcHRpb25zIHtcbiAgICBib290c3RyYXA/OiBCb290c3RyYXBNaWRkbGV3YXJlO1xuICAgIGJlZm9yZUV4ZWN1dGU/OiBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZTtcbiAgICBhZnRlckV4ZWN1dGU/OiBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFN0b3JhZ2Uge1xuICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVSZXN1bHRTdWNjZXNzPFJlc3VsdD4ge1xuICAgIGV4ZWN1dGVJZDogc3RyaW5nO1xuICAgIHN1Y2Nlc3M6IHRydWU7XG4gICAgZGF0YTogUmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JHZW5lcmljPFQ+ID0gVCBleHRlbmRzIEFzeW5jR2VuZXJhdG9yPGluZmVyIEk+ID8gSSA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuS2V5czxULCBQcmVmaXggZXh0ZW5kcyBzdHJpbmcgPSAnJz4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gICAgZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUmVhZGFibGVTdHJlYW0gaW50byBhIGNhbGxiYWNrIHBhdHRlcm4uXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBSZWFkYWJsZVN0cmVhbS5cbiAqIEBwYXJhbSBvbkNodW5rIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBieXRlIGNodW5rIGluIHRoZSBzdHJlYW0uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBzdHJlYW0gY2xvc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Qnl0ZXMoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Piwgb25DaHVuazogKGFycjogVWludDhBcnJheSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdoaWxlICghKHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCkpLmRvbmUpIHtcbiAgICAgICAgb25DaHVuayhyZXN1bHQudmFsdWUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgYXJiaXRhcnkgYnl0ZSBjaHVua3MgaW50byBFdmVudFNvdXJjZSBsaW5lIGJ1ZmZlcnMuXG4gKiBFYWNoIGxpbmUgc2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgXCJmaWVsZDogdmFsdWVcIiBhbmQgZW5kcyB3aXRoIFxcciwgXFxuLCBvciBcXHJcXG4uXG4gKiBAcGFyYW0gb25MaW5lIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBFdmVudFNvdXJjZSBsaW5lLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVzKG9uTGluZTogKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICBsZXQgYnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIGxldCBwb3NpdGlvbjogbnVtYmVyOyAvLyBjdXJyZW50IHJlYWQgcG9zaXRpb25cbiAgICBsZXQgZmllbGRMZW5ndGg6IG51bWJlcjsgLy8gbGVuZ3RoIG9mIHRoZSBgZmllbGRgIHBvcnRpb24gb2YgdGhlIGxpbmVcbiAgICBsZXQgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGJ5dGUgY2h1bms6XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uQ2h1bmsoYXJyOiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYXJyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdlJ3JlIHN0aWxsIHBhcnNpbmcgdGhlIG9sZCBsaW5lLiBBcHBlbmQgdGhlIG5ldyBieXRlcyBpbnRvIGJ1ZmZlcjpcbiAgICAgICAgICAgIGJ1ZmZlciA9IGNvbmNhdChidWZmZXIsIGFycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZMZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gMDsgLy8gaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQgbGluZSBzdGFydHNcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVmTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZGlzY2FyZFRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXJbcG9zaXRpb25dID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnQgPSArK3Bvc2l0aW9uOyAvLyBza2lwIHRvIG5leHQgY2hhclxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3RhcnQgbG9va2luZyBmb3J3YXJkIHRpbGwgdGhlIGVuZCBvZiBsaW5lOlxuICAgICAgICAgICAgbGV0IGxpbmVFbmQgPSAtMTsgLy8gaW5kZXggb2YgdGhlIFxcciBvciBcXG4gY2hhclxuICAgICAgICAgICAgZm9yICg7IHBvc2l0aW9uIDwgYnVmTGVuZ3RoICYmIGxpbmVFbmQgPT09IC0xOyArK3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zaXRpb25dKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRMZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY29sb24gaW4gbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gcG9zaXRpb24gLSBsaW5lU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZUVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBidXQgdGhlIGxpbmUgaGFzbid0IGVuZGVkLlxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGFyciBhbmQgdGhlbiBjb250aW51ZSBwYXJzaW5nOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSd2ZSByZWFjaGVkIHRoZSBsaW5lIGVuZCwgc2VuZCBpdCBvdXQ6XG4gICAgICAgICAgICBvbkxpbmUoYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCwgbGluZUVuZCksIGZpZWxkTGVuZ3RoKTtcbiAgICAgICAgICAgIGxpbmVTdGFydCA9IHBvc2l0aW9uOyAvLyB3ZSdyZSBub3cgb24gdGhlIG5leHQgbGluZVxuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lU3RhcnQgPT09IGJ1Zkxlbmd0aCkge1xuICAgICAgICAgICAgYnVmZmVyID0gdW5kZWZpbmVkOyAvLyB3ZSd2ZSBmaW5pc2hlZCByZWFkaW5nIGl0XG4gICAgICAgIH0gZWxzZSBpZiAobGluZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdmlldyBpbnRvIGJ1ZmZlciBiZWdpbm5pbmcgYXQgbGluZVN0YXJ0IHNvIHdlIGRvbid0XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgcHJldmlvdXMgbGluZXMgd2hlbiB3ZSBnZXQgdGhlIG5ldyBhcnI6XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0KTtcbiAgICAgICAgICAgIHBvc2l0aW9uIC09IGxpbmVTdGFydDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogUGFyc2VzIGxpbmUgYnVmZmVycyBpbnRvIEV2ZW50U291cmNlTWVzc2FnZXMuXG4gKiBAcGFyYW0gb25JZCBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgaWRgIGZpZWxkLlxuICogQHBhcmFtIG9uUmV0cnkgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYHJldHJ5YCBmaWVsZC5cbiAqIEBwYXJhbSBvbk1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbWVzc2FnZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZXMob25NZXNzYWdlPzogKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyOlxuICAgIHJldHVybiBmdW5jdGlvbiBvbkxpbmUobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmUgZGVub3RlcyBlbmQgb2YgbWVzc2FnZS4gVHJpZ2dlciB0aGUgY2FsbGJhY2sgYW5kIHN0YXJ0IGEgbmV3IG1lc3NhZ2U6XG4gICAgICAgICAgICBvbk1lc3NhZ2U/LihtZXNzYWdlKTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGNvbW1lbnRzIGFuZCBsaW5lcyB3aXRoIG5vIHZhbHVlc1xuICAgICAgICAgICAgLy8gbGluZSBpcyBvZiBmb3JtYXQgXCI8ZmllbGQ+Ojx2YWx1ZT5cIiBvciBcIjxmaWVsZD46IDx2YWx1ZT5cIlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjZXZlbnQtc3RyZWFtLWludGVycHJldGF0aW9uXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkoMCwgZmllbGRMZW5ndGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gZmllbGRMZW5ndGggKyAobGluZVtmaWVsZExlbmd0aCArIDFdID09PSAzMiA/IDIgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSh2YWx1ZU9mZnNldCkpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgbWVzc2FnZSBhbHJlYWR5IGhhcyBkYXRhLCBhcHBlbmQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgb2xkLlxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3Qgc2V0IHRvIHRoZSBuZXcgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IG1lc3NhZ2UuZGF0YSA/IGAke21lc3NhZ2UuZGF0YX1cXG4ke3ZhbHVlfWAgOiB2YWx1ZTsgLy8gb3RoZXJ3aXNlLFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNvbmNhdChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGggKyBiLmxlbmd0aCk7XG4gICAgcmVzLnNldChhKTtcbiAgICByZXMuc2V0KGIsIGEubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBuZXdNZXNzYWdlKCk6IEV2ZW50U291cmNlTWVzc2FnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogJycsXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXNvbHZlcnM8VCA9IGFueT4oKTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVzb2x2ZSddO1xuICAgIGxldCByZWplY3Q6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+WydyZWplY3QnXTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgIHJlamVjdCA9IHJlajtcbiAgICB9KTtcbiAgICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXNvbHZlISwgcmVqZWN0OiByZWplY3QhIH07XG59XG5cbmNvbnN0IERCX05BTUUgPSAnU3RhcmdhdGUnO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdjYWNoZXMnO1xubGV0IGRiSW5zdGFuY2U6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5EQigpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKGRiSW5zdGFuY2UpIHJldHVybiBkYkluc3RhbmNlO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIDEpO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgZGJJbnN0YW5jZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShkYkluc3RhbmNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkVfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2Uob3B0aW9ucz86IHsgZW5jcnlwdGlvbj86IGJvb2xlYW47IGVuY3J5cHRpb25LZXk/OiBzdHJpbmcgfSk6IFByb21pc2U8Q2FjaGVTdG9yYWdlPiB7XG4gICAgYXdhaXQgb3BlbkRCKCk7XG5cbiAgICBsZXQgZW5jcnlwdGlvbktleTogQ3J5cHRvS2V5IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY291bnRlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IGtleVN0cmluZyA9IG9wdGlvbnMuZW5jcnlwdGlvbktleSA/PyBEQl9OQU1FO1xuICAgICAgICBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5U3RyaW5nKS5mb3JFYWNoKChieXRlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA8IDE2KSBjb3VudGVyW2ldID0gYnl0ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBrZXlEYXRhID0gZW5jb2Rlci5lbmNvZGUoa2V5U3RyaW5nKTtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5RGF0YSwgeyBuYW1lOiAnUEJLREYyJyB9LCBmYWxzZSwgWydkZXJpdmVLZXknXSk7XG5cbiAgICAgICAgZW5jcnlwdGlvbktleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQQktERjInLFxuICAgICAgICAgICAgICAgIHNhbHQ6IGVuY29kZXIuZW5jb2RlKCdtaWxraW8tc3RhcmdhdGUtY2FjaGUnKSxcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25zOiAxMDAwMDAsXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltcG9ydGVkS2V5LFxuICAgICAgICAgICAgeyBuYW1lOiAnQUVTLUNUUicsIGxlbmd0aDogMjU2IH0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdERhdGEgPSBhc3luYyAoZGF0YTogYW55KTogUHJvbWlzZTxVaW50OEFycmF5PiA9PiB7XG4gICAgICAgIGlmICghZW5jcnlwdGlvbktleSkgcmV0dXJuIGRhdGE7XG5cbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGFCeXRlcyA9IGVuY29kZXIuZW5jb2RlKGpzb25TdHJpbmcpO1xuXG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZEFycmF5QnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgICAgICAgICBjb3VudGVyOiBjb3VudGVyLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICAgICAgICBkYXRhQnl0ZXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEFycmF5QnVmZmVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoZW5jcnlwdGVkRGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5IHx8ICFlbmNyeXB0ZWREYXRhKSByZXR1cm4gZW5jcnlwdGVkRGF0YTtcblxuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGVuY3J5cHRlZERhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gKGVuY3J5cHRlZERhdGEuYnVmZmVyIGFzIEFycmF5QnVmZmVyKSA6IGVuY3J5cHRlZERhdGE7XG5cbiAgICAgICAgY29uc3QgZGVjcnlwdGVkQnl0ZXMgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DVFInLFxuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IGRlY29kZXIuZGVjb2RlKGRlY3J5cHRlZEJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGpzb25TdHJpbmcpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbiAmJiAocmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCByZXN1bHQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWREYXRhID0gYXdhaXQgZGVjcnlwdERhdGEocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGE6IGRlY3J5cHRlZERhdGEsIHRpbWVzdGFtcDogcmVzdWx0LnRpbWVzdGFtcCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0ID8/IG51bGwpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICAgICAgICBsZXQgZGF0YVRvU3RvcmU6IGFueSA9IGRhdGE7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgZGF0YVRvU3RvcmUgPSBhd2FpdCBlbmNyeXB0RGF0YShkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoeyBkYXRhOiBkYXRhVG9TdG9yZSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0sIGtleSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDYWNoZUtleShwYXRoOiBzdHJpbmcsIHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cGF0aH06JHtKU09OLnN0cmluZ2lmeShwYXJhbXMgPz8ge30pfWA7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBa0RBLGVBQXNCLGNBQXVFLENBQUMsaUJBQXdDO0FBQUEsRUFDbEksTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFDeEMsTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFJeEMsSUFBSSxrQkFBdUI7QUFBQSxFQUMzQixJQUFJLGdCQUFxQjtBQUFBLEVBQ3pCLElBQUk7QUFBQSxJQUdBLElBQUksT0FBTyxZQUFZLGVBQWUsT0FBUSxRQUFnQixhQUFhO0FBQUEsTUFDdkUsTUFBTSxPQUFPLE1BQWE7QUFBQSxNQUMxQixrQkFBa0IsS0FBSztBQUFBLE1BQ3ZCLGdCQUFnQixJQUFJLEtBQUssTUFBTSxFQUFFLFdBQVcsTUFBTSxZQUFZLElBQUksQ0FBQztBQUFBLElBQ3ZFO0FBQUEsSUFDRixNQUFNO0FBQUEsRUFNUixNQUFNLGlCQUFpQixrQkFDakIsQ0FBQyxLQUFhLFNBQWlDLFNBQWtDO0FBQUEsSUFDL0UsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUNwQyxNQUFNLFlBQVksSUFBSSxJQUFJLEdBQUc7QUFBQSxNQUM3QixNQUFNLFVBQVU7QUFBQSxRQUNaLFVBQVUsVUFBVTtBQUFBLFFBQ3BCLE1BQU0sVUFBVSxRQUFRO0FBQUEsUUFDeEIsTUFBTSxV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QUFVO0FBQUEsUUFDekQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxHQUFHO0FBQUEsUUFDN0IsUUFBUSxVQUFVLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQSxRQUM1QyxRQUFRLFlBQVksWUFBWTtBQUFBLFVBQzVCLE1BQU0sU0FBUyxRQUFRO0FBQUEsVUFDdkIsSUFBSSxDQUFDLFFBQVE7QUFBQSxZQUNULFFBQVEsSUFBSTtBQUFBLFlBQ1o7QUFBQSxVQUNKO0FBQUEsVUFFQSxJQUFJLFNBQVMsZUFBZSxPQUFPLGdCQUFnQixlQUFlLE9BQU8sZ0JBQWdCLGFBQWE7QUFBQSxZQUNsRyxNQUFNLGdCQUFnQixNQUFNLFlBQVksT0FBTyxJQUFJO0FBQUEsWUFDbkQsUUFBUSxFQUFFLE1BQU0sZUFBZSxXQUFXLE9BQU8sVUFBVSxDQUFDO0FBQUEsWUFDNUQ7QUFBQSxVQUNKO0FBQUEsVUFFQSxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsT0FFN0I7QUFBQTtBQUFBLFNBRUMsSUFBRyxDQUFDLEtBQWEsTUFBMEI7QUFBQSxNQUM3QyxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxjQUFtQjtBQUFBLE1BRXZCLElBQUksU0FBUyxZQUFZO0FBQUEsUUFDckIsY0FBYyxNQUFNLFlBQVksSUFBSTtBQUFBLE1BQ3hDO0FBQUEsTUFFQSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFFBQ3BDLE1BQU0sY0FBYyxHQUFHLFlBQVksWUFBWSxXQUFXO0FBQUEsUUFDMUQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxFQUFFLE1BQU0sYUFBYSxXQUFXLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRztBQUFBLFFBQzNFLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDNUMsUUFBUSxZQUFZLE1BQU0sUUFBUTtBQUFBLE9BQ3JDO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFHSixTQUFTLGdCQUFnQixDQUFDLE1BQWMsUUFBcUI7QUFBQSxFQUN6RCxPQUFPLEdBQUcsUUFBUSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQUM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjY3OEY1NDJEMkRCMkU3OUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|