@pathscale/rsbuild-plugin-ui-css-purge 0.9.10 → 0.9.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,1607 @@
1
+ // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ function __accessProp(key) {
8
+ return this[key];
9
+ }
10
+ var __toESMCache_node;
11
+ var __toESMCache_esm;
12
+ var __toESM = (mod, isNodeMode, target) => {
13
+ var canCache = mod != null && typeof mod === "object";
14
+ if (canCache) {
15
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
+ var cached = cache.get(mod);
17
+ if (cached)
18
+ return cached;
19
+ }
20
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
21
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
+ for (let key of __getOwnPropNames(mod))
23
+ if (!__hasOwnProp.call(to, key))
24
+ __defProp(to, key, {
25
+ get: __accessProp.bind(mod, key),
26
+ enumerable: true
27
+ });
28
+ if (canCache)
29
+ cache.set(mod, to);
30
+ return to;
31
+ };
32
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
33
+ var __require = import.meta.require;
34
+
35
+ // node_modules/detect-libc/lib/process.js
36
+ var require_process = __commonJS((exports, module) => {
37
+ var isLinux = () => process.platform === "linux";
38
+ var report = null;
39
+ var getReport = () => {
40
+ if (!report) {
41
+ if (isLinux() && process.report) {
42
+ const orig = process.report.excludeNetwork;
43
+ process.report.excludeNetwork = true;
44
+ report = process.report.getReport();
45
+ process.report.excludeNetwork = orig;
46
+ } else {
47
+ report = {};
48
+ }
49
+ }
50
+ return report;
51
+ };
52
+ module.exports = { isLinux, getReport };
53
+ });
54
+
55
+ // node_modules/detect-libc/lib/filesystem.js
56
+ var require_filesystem = __commonJS((exports, module) => {
57
+ var fs = __require("fs");
58
+ var LDD_PATH = "/usr/bin/ldd";
59
+ var SELF_PATH = "/proc/self/exe";
60
+ var MAX_LENGTH = 2048;
61
+ var readFileSync = (path) => {
62
+ const fd = fs.openSync(path, "r");
63
+ const buffer = Buffer.alloc(MAX_LENGTH);
64
+ const bytesRead = fs.readSync(fd, buffer, 0, MAX_LENGTH, 0);
65
+ fs.close(fd, () => {});
66
+ return buffer.subarray(0, bytesRead);
67
+ };
68
+ var readFile = (path) => new Promise((resolve, reject) => {
69
+ fs.open(path, "r", (err, fd) => {
70
+ if (err) {
71
+ reject(err);
72
+ } else {
73
+ const buffer = Buffer.alloc(MAX_LENGTH);
74
+ fs.read(fd, buffer, 0, MAX_LENGTH, 0, (_, bytesRead) => {
75
+ resolve(buffer.subarray(0, bytesRead));
76
+ fs.close(fd, () => {});
77
+ });
78
+ }
79
+ });
80
+ });
81
+ module.exports = {
82
+ LDD_PATH,
83
+ SELF_PATH,
84
+ readFileSync,
85
+ readFile
86
+ };
87
+ });
88
+
89
+ // node_modules/detect-libc/lib/elf.js
90
+ var require_elf = __commonJS((exports, module) => {
91
+ var interpreterPath = (elf) => {
92
+ if (elf.length < 64) {
93
+ return null;
94
+ }
95
+ if (elf.readUInt32BE(0) !== 2135247942) {
96
+ return null;
97
+ }
98
+ if (elf.readUInt8(4) !== 2) {
99
+ return null;
100
+ }
101
+ if (elf.readUInt8(5) !== 1) {
102
+ return null;
103
+ }
104
+ const offset = elf.readUInt32LE(32);
105
+ const size = elf.readUInt16LE(54);
106
+ const count = elf.readUInt16LE(56);
107
+ for (let i = 0;i < count; i++) {
108
+ const headerOffset = offset + i * size;
109
+ const type = elf.readUInt32LE(headerOffset);
110
+ if (type === 3) {
111
+ const fileOffset = elf.readUInt32LE(headerOffset + 8);
112
+ const fileSize = elf.readUInt32LE(headerOffset + 32);
113
+ return elf.subarray(fileOffset, fileOffset + fileSize).toString().replace(/\0.*$/g, "");
114
+ }
115
+ }
116
+ return null;
117
+ };
118
+ module.exports = {
119
+ interpreterPath
120
+ };
121
+ });
122
+
123
+ // node_modules/detect-libc/lib/detect-libc.js
124
+ var require_detect_libc = __commonJS((exports, module) => {
125
+ var childProcess = __require("child_process");
126
+ var { isLinux, getReport } = require_process();
127
+ var { LDD_PATH, SELF_PATH, readFile, readFileSync } = require_filesystem();
128
+ var { interpreterPath } = require_elf();
129
+ var cachedFamilyInterpreter;
130
+ var cachedFamilyFilesystem;
131
+ var cachedVersionFilesystem;
132
+ var command = "getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true";
133
+ var commandOut = "";
134
+ var safeCommand = () => {
135
+ if (!commandOut) {
136
+ return new Promise((resolve) => {
137
+ childProcess.exec(command, (err, out) => {
138
+ commandOut = err ? " " : out;
139
+ resolve(commandOut);
140
+ });
141
+ });
142
+ }
143
+ return commandOut;
144
+ };
145
+ var safeCommandSync = () => {
146
+ if (!commandOut) {
147
+ try {
148
+ commandOut = childProcess.execSync(command, { encoding: "utf8" });
149
+ } catch (_err) {
150
+ commandOut = " ";
151
+ }
152
+ }
153
+ return commandOut;
154
+ };
155
+ var GLIBC = "glibc";
156
+ var RE_GLIBC_VERSION = /LIBC[a-z0-9 \-).]*?(\d+\.\d+)/i;
157
+ var MUSL = "musl";
158
+ var isFileMusl = (f) => f.includes("libc.musl-") || f.includes("ld-musl-");
159
+ var familyFromReport = () => {
160
+ const report = getReport();
161
+ if (report.header && report.header.glibcVersionRuntime) {
162
+ return GLIBC;
163
+ }
164
+ if (Array.isArray(report.sharedObjects)) {
165
+ if (report.sharedObjects.some(isFileMusl)) {
166
+ return MUSL;
167
+ }
168
+ }
169
+ return null;
170
+ };
171
+ var familyFromCommand = (out) => {
172
+ const [getconf, ldd1] = out.split(/[\r\n]+/);
173
+ if (getconf && getconf.includes(GLIBC)) {
174
+ return GLIBC;
175
+ }
176
+ if (ldd1 && ldd1.includes(MUSL)) {
177
+ return MUSL;
178
+ }
179
+ return null;
180
+ };
181
+ var familyFromInterpreterPath = (path) => {
182
+ if (path) {
183
+ if (path.includes("/ld-musl-")) {
184
+ return MUSL;
185
+ } else if (path.includes("/ld-linux-")) {
186
+ return GLIBC;
187
+ }
188
+ }
189
+ return null;
190
+ };
191
+ var getFamilyFromLddContent = (content) => {
192
+ content = content.toString();
193
+ if (content.includes("musl")) {
194
+ return MUSL;
195
+ }
196
+ if (content.includes("GNU C Library")) {
197
+ return GLIBC;
198
+ }
199
+ return null;
200
+ };
201
+ var familyFromFilesystem = async () => {
202
+ if (cachedFamilyFilesystem !== undefined) {
203
+ return cachedFamilyFilesystem;
204
+ }
205
+ cachedFamilyFilesystem = null;
206
+ try {
207
+ const lddContent = await readFile(LDD_PATH);
208
+ cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
209
+ } catch (e) {}
210
+ return cachedFamilyFilesystem;
211
+ };
212
+ var familyFromFilesystemSync = () => {
213
+ if (cachedFamilyFilesystem !== undefined) {
214
+ return cachedFamilyFilesystem;
215
+ }
216
+ cachedFamilyFilesystem = null;
217
+ try {
218
+ const lddContent = readFileSync(LDD_PATH);
219
+ cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
220
+ } catch (e) {}
221
+ return cachedFamilyFilesystem;
222
+ };
223
+ var familyFromInterpreter = async () => {
224
+ if (cachedFamilyInterpreter !== undefined) {
225
+ return cachedFamilyInterpreter;
226
+ }
227
+ cachedFamilyInterpreter = null;
228
+ try {
229
+ const selfContent = await readFile(SELF_PATH);
230
+ const path = interpreterPath(selfContent);
231
+ cachedFamilyInterpreter = familyFromInterpreterPath(path);
232
+ } catch (e) {}
233
+ return cachedFamilyInterpreter;
234
+ };
235
+ var familyFromInterpreterSync = () => {
236
+ if (cachedFamilyInterpreter !== undefined) {
237
+ return cachedFamilyInterpreter;
238
+ }
239
+ cachedFamilyInterpreter = null;
240
+ try {
241
+ const selfContent = readFileSync(SELF_PATH);
242
+ const path = interpreterPath(selfContent);
243
+ cachedFamilyInterpreter = familyFromInterpreterPath(path);
244
+ } catch (e) {}
245
+ return cachedFamilyInterpreter;
246
+ };
247
+ var family = async () => {
248
+ let family2 = null;
249
+ if (isLinux()) {
250
+ family2 = await familyFromInterpreter();
251
+ if (!family2) {
252
+ family2 = await familyFromFilesystem();
253
+ if (!family2) {
254
+ family2 = familyFromReport();
255
+ }
256
+ if (!family2) {
257
+ const out = await safeCommand();
258
+ family2 = familyFromCommand(out);
259
+ }
260
+ }
261
+ }
262
+ return family2;
263
+ };
264
+ var familySync = () => {
265
+ let family2 = null;
266
+ if (isLinux()) {
267
+ family2 = familyFromInterpreterSync();
268
+ if (!family2) {
269
+ family2 = familyFromFilesystemSync();
270
+ if (!family2) {
271
+ family2 = familyFromReport();
272
+ }
273
+ if (!family2) {
274
+ const out = safeCommandSync();
275
+ family2 = familyFromCommand(out);
276
+ }
277
+ }
278
+ }
279
+ return family2;
280
+ };
281
+ var isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;
282
+ var isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;
283
+ var versionFromFilesystem = async () => {
284
+ if (cachedVersionFilesystem !== undefined) {
285
+ return cachedVersionFilesystem;
286
+ }
287
+ cachedVersionFilesystem = null;
288
+ try {
289
+ const lddContent = await readFile(LDD_PATH);
290
+ const versionMatch = lddContent.match(RE_GLIBC_VERSION);
291
+ if (versionMatch) {
292
+ cachedVersionFilesystem = versionMatch[1];
293
+ }
294
+ } catch (e) {}
295
+ return cachedVersionFilesystem;
296
+ };
297
+ var versionFromFilesystemSync = () => {
298
+ if (cachedVersionFilesystem !== undefined) {
299
+ return cachedVersionFilesystem;
300
+ }
301
+ cachedVersionFilesystem = null;
302
+ try {
303
+ const lddContent = readFileSync(LDD_PATH);
304
+ const versionMatch = lddContent.match(RE_GLIBC_VERSION);
305
+ if (versionMatch) {
306
+ cachedVersionFilesystem = versionMatch[1];
307
+ }
308
+ } catch (e) {}
309
+ return cachedVersionFilesystem;
310
+ };
311
+ var versionFromReport = () => {
312
+ const report = getReport();
313
+ if (report.header && report.header.glibcVersionRuntime) {
314
+ return report.header.glibcVersionRuntime;
315
+ }
316
+ return null;
317
+ };
318
+ var versionSuffix = (s) => s.trim().split(/\s+/)[1];
319
+ var versionFromCommand = (out) => {
320
+ const [getconf, ldd1, ldd2] = out.split(/[\r\n]+/);
321
+ if (getconf && getconf.includes(GLIBC)) {
322
+ return versionSuffix(getconf);
323
+ }
324
+ if (ldd1 && ldd2 && ldd1.includes(MUSL)) {
325
+ return versionSuffix(ldd2);
326
+ }
327
+ return null;
328
+ };
329
+ var version = async () => {
330
+ let version2 = null;
331
+ if (isLinux()) {
332
+ version2 = await versionFromFilesystem();
333
+ if (!version2) {
334
+ version2 = versionFromReport();
335
+ }
336
+ if (!version2) {
337
+ const out = await safeCommand();
338
+ version2 = versionFromCommand(out);
339
+ }
340
+ }
341
+ return version2;
342
+ };
343
+ var versionSync = () => {
344
+ let version2 = null;
345
+ if (isLinux()) {
346
+ version2 = versionFromFilesystemSync();
347
+ if (!version2) {
348
+ version2 = versionFromReport();
349
+ }
350
+ if (!version2) {
351
+ const out = safeCommandSync();
352
+ version2 = versionFromCommand(out);
353
+ }
354
+ }
355
+ return version2;
356
+ };
357
+ module.exports = {
358
+ GLIBC,
359
+ MUSL,
360
+ family,
361
+ familySync,
362
+ isNonGlibcLinux,
363
+ isNonGlibcLinuxSync,
364
+ version,
365
+ versionSync
366
+ };
367
+ });
368
+
369
+ // node_modules/lightningcss/node/browserslistToTargets.js
370
+ var require_browserslistToTargets = __commonJS((exports, module) => {
371
+ var BROWSER_MAPPING = {
372
+ and_chr: "chrome",
373
+ and_ff: "firefox",
374
+ ie_mob: "ie",
375
+ op_mob: "opera",
376
+ and_qq: null,
377
+ and_uc: null,
378
+ baidu: null,
379
+ bb: null,
380
+ kaios: null,
381
+ op_mini: null
382
+ };
383
+ function browserslistToTargets(browserslist) {
384
+ let targets = {};
385
+ for (let browser of browserslist) {
386
+ let [name, v] = browser.split(" ");
387
+ if (BROWSER_MAPPING[name] === null) {
388
+ continue;
389
+ }
390
+ let version = parseVersion(v);
391
+ if (version == null) {
392
+ continue;
393
+ }
394
+ if (targets[name] == null || version < targets[name]) {
395
+ targets[name] = version;
396
+ }
397
+ }
398
+ return targets;
399
+ }
400
+ function parseVersion(version) {
401
+ let [major, minor = 0, patch = 0] = version.split("-")[0].split(".").map((v) => parseInt(v, 10));
402
+ if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
403
+ return null;
404
+ }
405
+ return major << 16 | minor << 8 | patch;
406
+ }
407
+ module.exports = browserslistToTargets;
408
+ });
409
+
410
+ // node_modules/lightningcss/node/composeVisitors.js
411
+ var require_composeVisitors = __commonJS((exports, module) => {
412
+ function composeVisitors(visitors) {
413
+ if (visitors.length === 1) {
414
+ return visitors[0];
415
+ }
416
+ if (visitors.some((v) => typeof v === "function")) {
417
+ return (opts) => {
418
+ let v = visitors.map((v2) => typeof v2 === "function" ? v2(opts) : v2);
419
+ return composeVisitors(v);
420
+ };
421
+ }
422
+ let res = {};
423
+ composeSimpleVisitors(res, visitors, "StyleSheet");
424
+ composeSimpleVisitors(res, visitors, "StyleSheetExit");
425
+ composeObjectVisitors(res, visitors, "Rule", ruleVisitor, wrapCustomAndUnknownAtRule);
426
+ composeObjectVisitors(res, visitors, "RuleExit", ruleVisitor, wrapCustomAndUnknownAtRule);
427
+ composeObjectVisitors(res, visitors, "Declaration", declarationVisitor, wrapCustomProperty);
428
+ composeObjectVisitors(res, visitors, "DeclarationExit", declarationVisitor, wrapCustomProperty);
429
+ composeSimpleVisitors(res, visitors, "Url");
430
+ composeSimpleVisitors(res, visitors, "Color");
431
+ composeSimpleVisitors(res, visitors, "Image");
432
+ composeSimpleVisitors(res, visitors, "ImageExit");
433
+ composeSimpleVisitors(res, visitors, "Length");
434
+ composeSimpleVisitors(res, visitors, "Angle");
435
+ composeSimpleVisitors(res, visitors, "Ratio");
436
+ composeSimpleVisitors(res, visitors, "Resolution");
437
+ composeSimpleVisitors(res, visitors, "Time");
438
+ composeSimpleVisitors(res, visitors, "CustomIdent");
439
+ composeSimpleVisitors(res, visitors, "DashedIdent");
440
+ composeArrayFunctions(res, visitors, "MediaQuery");
441
+ composeArrayFunctions(res, visitors, "MediaQueryExit");
442
+ composeSimpleVisitors(res, visitors, "SupportsCondition");
443
+ composeSimpleVisitors(res, visitors, "SupportsConditionExit");
444
+ composeArrayFunctions(res, visitors, "Selector");
445
+ composeTokenVisitors(res, visitors, "Token", "token", false);
446
+ composeTokenVisitors(res, visitors, "Function", "function", false);
447
+ composeTokenVisitors(res, visitors, "FunctionExit", "function", true);
448
+ composeTokenVisitors(res, visitors, "Variable", "var", false);
449
+ composeTokenVisitors(res, visitors, "VariableExit", "var", true);
450
+ composeTokenVisitors(res, visitors, "EnvironmentVariable", "env", false);
451
+ composeTokenVisitors(res, visitors, "EnvironmentVariableExit", "env", true);
452
+ return res;
453
+ }
454
+ module.exports = composeVisitors;
455
+ function wrapCustomAndUnknownAtRule(k, f) {
456
+ if (k === "unknown") {
457
+ return (value) => f({ type: "unknown", value });
458
+ }
459
+ if (k === "custom") {
460
+ return (value) => f({ type: "custom", value });
461
+ }
462
+ return f;
463
+ }
464
+ function wrapCustomProperty(k, f) {
465
+ return k === "custom" ? (value) => f({ property: "custom", value }) : f;
466
+ }
467
+ function ruleVisitor(f, item) {
468
+ if (typeof f === "object") {
469
+ if (item.type === "unknown") {
470
+ let v = f.unknown;
471
+ if (typeof v === "object") {
472
+ v = v[item.value.name];
473
+ }
474
+ return v?.(item.value);
475
+ }
476
+ if (item.type === "custom") {
477
+ let v = f.custom;
478
+ if (typeof v === "object") {
479
+ v = v[item.value.name];
480
+ }
481
+ return v?.(item.value);
482
+ }
483
+ return f[item.type]?.(item);
484
+ }
485
+ return f?.(item);
486
+ }
487
+ function declarationVisitor(f, item) {
488
+ if (typeof f === "object") {
489
+ let name = item.property;
490
+ if (item.property === "unparsed") {
491
+ name = item.value.propertyId.property;
492
+ } else if (item.property === "custom") {
493
+ let v = f.custom;
494
+ if (typeof v === "object") {
495
+ v = v[item.value.name];
496
+ }
497
+ return v?.(item.value);
498
+ }
499
+ return f[name]?.(item);
500
+ }
501
+ return f?.(item);
502
+ }
503
+ function extractObjectsOrFunctions(visitors, key) {
504
+ let values = [];
505
+ let hasFunction = false;
506
+ let allKeys = new Set;
507
+ for (let visitor of visitors) {
508
+ let v = visitor[key];
509
+ if (v) {
510
+ if (typeof v === "function") {
511
+ hasFunction = true;
512
+ } else {
513
+ for (let key2 in v) {
514
+ allKeys.add(key2);
515
+ }
516
+ }
517
+ values.push(v);
518
+ }
519
+ }
520
+ return [values, hasFunction, allKeys];
521
+ }
522
+ function composeObjectVisitors(res, visitors, key, apply, wrapKey) {
523
+ let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);
524
+ if (values.length === 0) {
525
+ return;
526
+ }
527
+ if (values.length === 1) {
528
+ res[key] = values[0];
529
+ return;
530
+ }
531
+ let f = createArrayVisitor(visitors, (visitor, item) => apply(visitor[key], item));
532
+ if (hasFunction) {
533
+ res[key] = f;
534
+ } else {
535
+ let v = {};
536
+ for (let k of allKeys) {
537
+ v[k] = wrapKey(k, f);
538
+ }
539
+ res[key] = v;
540
+ }
541
+ }
542
+ function composeTokenVisitors(res, visitors, key, type, isExit) {
543
+ let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);
544
+ if (values.length === 0) {
545
+ return;
546
+ }
547
+ if (values.length === 1) {
548
+ res[key] = values[0];
549
+ return;
550
+ }
551
+ let f = createTokenVisitor(visitors, type, isExit);
552
+ if (hasFunction) {
553
+ res[key] = f;
554
+ } else {
555
+ let v = {};
556
+ for (let key2 of allKeys) {
557
+ v[key2] = f;
558
+ }
559
+ res[key] = v;
560
+ }
561
+ }
562
+ function createTokenVisitor(visitors, type, isExit) {
563
+ let v = createArrayVisitor(visitors, (visitor, item) => {
564
+ let f;
565
+ switch (item.type) {
566
+ case "token":
567
+ f = visitor.Token;
568
+ if (typeof f === "object") {
569
+ f = f[item.value.type];
570
+ }
571
+ break;
572
+ case "function":
573
+ f = isExit ? visitor.FunctionExit : visitor.Function;
574
+ if (typeof f === "object") {
575
+ f = f[item.value.name];
576
+ }
577
+ break;
578
+ case "var":
579
+ f = isExit ? visitor.VariableExit : visitor.Variable;
580
+ break;
581
+ case "env":
582
+ f = isExit ? visitor.EnvironmentVariableExit : visitor.EnvironmentVariable;
583
+ if (typeof f === "object") {
584
+ let name;
585
+ switch (item.value.name.type) {
586
+ case "ua":
587
+ case "unknown":
588
+ name = item.value.name.value;
589
+ break;
590
+ case "custom":
591
+ name = item.value.name.ident;
592
+ break;
593
+ }
594
+ f = f[name];
595
+ }
596
+ break;
597
+ case "color":
598
+ f = visitor.Color;
599
+ break;
600
+ case "url":
601
+ f = visitor.Url;
602
+ break;
603
+ case "length":
604
+ f = visitor.Length;
605
+ break;
606
+ case "angle":
607
+ f = visitor.Angle;
608
+ break;
609
+ case "time":
610
+ f = visitor.Time;
611
+ break;
612
+ case "resolution":
613
+ f = visitor.Resolution;
614
+ break;
615
+ case "dashed-ident":
616
+ f = visitor.DashedIdent;
617
+ break;
618
+ }
619
+ if (!f) {
620
+ return;
621
+ }
622
+ let res = f(item.value);
623
+ switch (item.type) {
624
+ case "color":
625
+ case "url":
626
+ case "length":
627
+ case "angle":
628
+ case "time":
629
+ case "resolution":
630
+ case "dashed-ident":
631
+ if (Array.isArray(res)) {
632
+ res = res.map((value) => ({ type: item.type, value }));
633
+ } else if (res) {
634
+ res = { type: item.type, value: res };
635
+ }
636
+ break;
637
+ }
638
+ return res;
639
+ });
640
+ return (value) => v({ type, value });
641
+ }
642
+ function extractFunctions(visitors, key) {
643
+ let functions = [];
644
+ for (let visitor of visitors) {
645
+ let f = visitor[key];
646
+ if (f) {
647
+ functions.push(f);
648
+ }
649
+ }
650
+ return functions;
651
+ }
652
+ function composeSimpleVisitors(res, visitors, key) {
653
+ let functions = extractFunctions(visitors, key);
654
+ if (functions.length === 0) {
655
+ return;
656
+ }
657
+ if (functions.length === 1) {
658
+ res[key] = functions[0];
659
+ return;
660
+ }
661
+ res[key] = (arg) => {
662
+ let mutated = false;
663
+ for (let f of functions) {
664
+ let res2 = f(arg);
665
+ if (res2) {
666
+ arg = res2;
667
+ mutated = true;
668
+ }
669
+ }
670
+ return mutated ? arg : undefined;
671
+ };
672
+ }
673
+ function composeArrayFunctions(res, visitors, key) {
674
+ let functions = extractFunctions(visitors, key);
675
+ if (functions.length === 0) {
676
+ return;
677
+ }
678
+ if (functions.length === 1) {
679
+ res[key] = functions[0];
680
+ return;
681
+ }
682
+ res[key] = createArrayVisitor(functions, (f, item) => f(item));
683
+ }
684
+ function createArrayVisitor(visitors, apply) {
685
+ let seen = new Bitset(visitors.length);
686
+ return (arg) => {
687
+ let arr = [arg];
688
+ let mutated = false;
689
+ seen.clear();
690
+ for (let i = 0;i < arr.length; i++) {
691
+ for (let v = 0;v < visitors.length && i < arr.length; ) {
692
+ if (seen.get(v)) {
693
+ v++;
694
+ continue;
695
+ }
696
+ let item = arr[i];
697
+ let visitor = visitors[v];
698
+ let res = apply(visitor, item);
699
+ if (Array.isArray(res)) {
700
+ if (res.length === 0) {
701
+ arr.splice(i, 1);
702
+ } else if (res.length === 1) {
703
+ arr[i] = res[0];
704
+ } else {
705
+ arr.splice(i, 1, ...res);
706
+ }
707
+ mutated = true;
708
+ seen.set(v);
709
+ v = 0;
710
+ } else if (res) {
711
+ arr[i] = res;
712
+ mutated = true;
713
+ seen.set(v);
714
+ v = 0;
715
+ } else {
716
+ v++;
717
+ }
718
+ }
719
+ }
720
+ if (!mutated) {
721
+ return;
722
+ }
723
+ return arr.length === 1 ? arr[0] : arr;
724
+ };
725
+ }
726
+
727
+ class Bitset {
728
+ constructor(maxBits = 32) {
729
+ this.bits = 0;
730
+ this.more = maxBits > 32 ? new Uint32Array(Math.ceil((maxBits - 32) / 32)) : null;
731
+ }
732
+ get(bit) {
733
+ if (bit >= 32 && this.more) {
734
+ let i = Math.floor((bit - 32) / 32);
735
+ let b = bit % 32;
736
+ return Boolean(this.more[i] & 1 << b);
737
+ } else {
738
+ return Boolean(this.bits & 1 << bit);
739
+ }
740
+ }
741
+ set(bit) {
742
+ if (bit >= 32 && this.more) {
743
+ let i = Math.floor((bit - 32) / 32);
744
+ let b = bit % 32;
745
+ this.more[i] |= 1 << b;
746
+ } else {
747
+ this.bits |= 1 << bit;
748
+ }
749
+ }
750
+ clear() {
751
+ this.bits = 0;
752
+ if (this.more) {
753
+ this.more.fill(0);
754
+ }
755
+ }
756
+ }
757
+ });
758
+
759
+ // node_modules/lightningcss/node/flags.js
760
+ var require_flags = __commonJS((exports) => {
761
+ exports.Features = {
762
+ Nesting: 1,
763
+ NotSelectorList: 2,
764
+ DirSelector: 4,
765
+ LangSelectorList: 8,
766
+ IsSelector: 16,
767
+ TextDecorationThicknessPercent: 32,
768
+ MediaIntervalSyntax: 64,
769
+ MediaRangeSyntax: 128,
770
+ CustomMediaQueries: 256,
771
+ ClampFunction: 512,
772
+ ColorFunction: 1024,
773
+ OklabColors: 2048,
774
+ LabColors: 4096,
775
+ P3Colors: 8192,
776
+ HexAlphaColors: 16384,
777
+ SpaceSeparatedColorNotation: 32768,
778
+ FontFamilySystemUi: 65536,
779
+ DoublePositionGradients: 131072,
780
+ VendorPrefixes: 262144,
781
+ LogicalProperties: 524288,
782
+ LightDark: 1048576,
783
+ Selectors: 31,
784
+ MediaQueries: 448,
785
+ Colors: 1113088
786
+ };
787
+ });
788
+
789
+ // node_modules/lightningcss/node/index.js
790
+ var require_node = __commonJS((exports, module) => {
791
+ var parts = [process.platform, process.arch];
792
+ if (process.platform === "linux") {
793
+ const { MUSL, familySync } = require_detect_libc();
794
+ const family = familySync();
795
+ if (family === MUSL) {
796
+ parts.push("musl");
797
+ } else if (process.arch === "arm") {
798
+ parts.push("gnueabihf");
799
+ } else {
800
+ parts.push("gnu");
801
+ }
802
+ } else if (process.platform === "win32") {
803
+ parts.push("msvc");
804
+ }
805
+ var native;
806
+ try {
807
+ native = __require(`lightningcss-${parts.join("-")}`);
808
+ } catch (err) {
809
+ native = __require(`../lightningcss.${parts.join("-")}.node`);
810
+ }
811
+ exports.transform = wrap(native.transform);
812
+ exports.transformStyleAttribute = wrap(native.transformStyleAttribute);
813
+ exports.bundle = wrap(native.bundle);
814
+ exports.bundleAsync = wrap(native.bundleAsync);
815
+ exports.browserslistToTargets = require_browserslistToTargets();
816
+ exports.composeVisitors = require_composeVisitors();
817
+ exports.Features = require_flags().Features;
818
+ function wrap(call) {
819
+ return (options) => {
820
+ if (typeof options.visitor === "function") {
821
+ let deps = [];
822
+ options.visitor = options.visitor({
823
+ addDependency(dep) {
824
+ deps.push(dep);
825
+ }
826
+ });
827
+ let result = call(options);
828
+ if (result instanceof Promise) {
829
+ result = result.then((res) => {
830
+ if (deps.length) {
831
+ res.dependencies ??= [];
832
+ res.dependencies.push(...deps);
833
+ }
834
+ return res;
835
+ });
836
+ } else if (deps.length) {
837
+ result.dependencies ??= [];
838
+ result.dependencies.push(...deps);
839
+ }
840
+ return result;
841
+ } else {
842
+ return call(options);
843
+ }
844
+ };
845
+ }
846
+ });
847
+
848
+ // src/postbuild-purge.ts
849
+ var {Glob: Glob2 } = globalThis.Bun;
850
+
851
+ // node_modules/lightningcss/node/index.mjs
852
+ var import__ = __toESM(require_node(), 1);
853
+ var { transform, transformStyleAttribute, bundle, bundleAsync, browserslistToTargets, composeVisitors, Features } = import__.default;
854
+
855
+ // src/postbuild-purge.ts
856
+ import postcss from "postcss";
857
+
858
+ // src/scan-consumer.ts
859
+ import swc from "@swc/core";
860
+ var {Glob } = globalThis.Bun;
861
+ function walkAST(node, visitor) {
862
+ if (!isRecord(node))
863
+ return;
864
+ visitor(node);
865
+ for (const key of Object.keys(node)) {
866
+ if (key === "span")
867
+ continue;
868
+ const val = node[key];
869
+ if (Array.isArray(val)) {
870
+ for (const item of val)
871
+ walkAST(item, visitor);
872
+ } else if (val && typeof val === "object") {
873
+ walkAST(val, visitor);
874
+ }
875
+ }
876
+ }
877
+ function kebabToPascal(s) {
878
+ return s.split("-").filter(Boolean).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
879
+ }
880
+ function componentFromDeepImport(source) {
881
+ const match = source.match(/^@pathscale\/ui\/components\/([^/]+)/);
882
+ if (!match)
883
+ return null;
884
+ return kebabToPascal(match[1]);
885
+ }
886
+ function isUiImport(source) {
887
+ return Boolean(source?.startsWith("@pathscale/ui"));
888
+ }
889
+ function isRecord(v) {
890
+ return v !== null && typeof v === "object" && !Array.isArray(v);
891
+ }
892
+ function getString(value, key) {
893
+ if (!isRecord(value))
894
+ return;
895
+ const prop = value[key];
896
+ return typeof prop === "string" ? prop : undefined;
897
+ }
898
+ function getBoolean(value, key) {
899
+ if (!isRecord(value))
900
+ return false;
901
+ return value[key] === true;
902
+ }
903
+ function getPathString(value, ...keys) {
904
+ let current = value;
905
+ for (const key of keys) {
906
+ if (!isRecord(current))
907
+ return;
908
+ current = current[key];
909
+ }
910
+ return typeof current === "string" ? current : undefined;
911
+ }
912
+ function getArray(value, key) {
913
+ if (!isRecord(value))
914
+ return [];
915
+ const prop = value[key];
916
+ return Array.isArray(prop) ? prop : [];
917
+ }
918
+ function joinPath(base, rel) {
919
+ return `${base.replace(/\/+$/, "")}/${rel.replace(/^\/+/, "")}`;
920
+ }
921
+ function canonicalImportedName(spec, source) {
922
+ const importedName = getPathString(spec, "imported", "value") ?? getPathString(spec, "local", "value") ?? null;
923
+ const deep = (c, t) => {
924
+ if (t !== "ImportSpecifier")
925
+ return c;
926
+ if (!importedName)
927
+ return null;
928
+ if (importedName === c)
929
+ return c;
930
+ return `${c}.${importedName}`;
931
+ };
932
+ const type = getString(spec, "type");
933
+ if (getBoolean(spec, "isTypeOnly"))
934
+ return null;
935
+ const deepComponent = componentFromDeepImport(source);
936
+ if (deepComponent)
937
+ return deep(deepComponent, type);
938
+ if (source === "@pathscale/ui" && type === "ImportSpecifier")
939
+ return importedName;
940
+ return null;
941
+ }
942
+ function conservativeUsage(component, source) {
943
+ return {
944
+ component,
945
+ props: new Map,
946
+ booleanProps: new Set,
947
+ hasSpread: true,
948
+ source
949
+ };
950
+ }
951
+ function extractUIBindings(ast) {
952
+ const bindings = {
953
+ components: new Map,
954
+ namespaces: new Map,
955
+ conservativeUsages: []
956
+ };
957
+ for (const node of getArray(ast, "body")) {
958
+ const nodeType = getString(node, "type");
959
+ if (nodeType === "ImportDeclaration") {
960
+ const source = getPathString(node, "source", "value");
961
+ if (!isUiImport(source))
962
+ continue;
963
+ for (const spec of getArray(node, "specifiers")) {
964
+ const specType = getString(spec, "type");
965
+ if (specType === "ImportSpecifier") {
966
+ const local = getPathString(spec, "local", "value");
967
+ const canonical = canonicalImportedName(spec, source);
968
+ if (local && canonical)
969
+ bindings.components.set(local, canonical);
970
+ } else if (specType === "ImportDefaultSpecifier") {
971
+ const local = getPathString(spec, "local", "value");
972
+ const canonical = componentFromDeepImport(source) ?? local;
973
+ if (local && canonical)
974
+ bindings.components.set(local, canonical);
975
+ } else if (specType === "ImportNamespaceSpecifier") {
976
+ const local = getPathString(spec, "local", "value");
977
+ if (local)
978
+ bindings.namespaces.set(local, componentFromDeepImport(source));
979
+ }
980
+ }
981
+ }
982
+ if (nodeType === "ExportNamedDeclaration" && isUiImport(getPathString(node, "source", "value"))) {
983
+ const source = getPathString(node, "source", "value");
984
+ if (!source)
985
+ continue;
986
+ const deepComponent = componentFromDeepImport(source);
987
+ for (const spec of getArray(node, "specifiers")) {
988
+ const exported = getPathString(spec, "orig", "value") ?? getPathString(spec, "local", "value") ?? getPathString(spec, "exported", "value") ?? deepComponent;
989
+ const canonical = deepComponent ?? exported;
990
+ if (canonical)
991
+ bindings.conservativeUsages.push(conservativeUsage(canonical, source));
992
+ }
993
+ }
994
+ if (nodeType === "ExportAllDeclaration" && isUiImport(getPathString(node, "source", "value"))) {
995
+ const source = getPathString(node, "source", "value");
996
+ if (!source)
997
+ continue;
998
+ const deepComponent = componentFromDeepImport(source);
999
+ if (deepComponent) {
1000
+ bindings.conservativeUsages.push(conservativeUsage(deepComponent, source));
1001
+ }
1002
+ }
1003
+ }
1004
+ return bindings;
1005
+ }
1006
+ function extractUIImports(ast) {
1007
+ return extractUIBindings(ast).components;
1008
+ }
1009
+ function jsxNameParts(name) {
1010
+ if (!name)
1011
+ return [];
1012
+ const type = getString(name, "type");
1013
+ const value = getString(name, "value");
1014
+ if ((type === "Identifier" || type === "JSXIdentifier") && value)
1015
+ return [value];
1016
+ if (type === "JSXMemberExpression") {
1017
+ return [
1018
+ ...jsxNameParts(isRecord(name) ? name.object : undefined),
1019
+ ...jsxNameParts(isRecord(name) ? name.property : undefined)
1020
+ ];
1021
+ }
1022
+ return [];
1023
+ }
1024
+ function canonicalComponentFromJsx(parts, bindings) {
1025
+ if (parts.length === 0)
1026
+ return null;
1027
+ const [root, ...members] = parts;
1028
+ const namespaceComponent = bindings.namespaces.get(root);
1029
+ if (bindings.namespaces.has(root)) {
1030
+ if (namespaceComponent) {
1031
+ const lower2 = members.map((m) => m.toLowerCase());
1032
+ return [namespaceComponent, ...lower2].join(".");
1033
+ }
1034
+ return members.join(".") || null;
1035
+ }
1036
+ const rootComponent = bindings.components.get(root);
1037
+ if (!rootComponent)
1038
+ return null;
1039
+ const lower = members.map((m) => m.toLowerCase());
1040
+ return [rootComponent, ...lower].join(".");
1041
+ }
1042
+ function extractJSXUsages(ast, uiComponents) {
1043
+ const bindings = {
1044
+ components: uiComponents,
1045
+ namespaces: extractUIBindings(ast).namespaces,
1046
+ conservativeUsages: []
1047
+ };
1048
+ const usages = [];
1049
+ walkAST(ast, (node) => {
1050
+ if (getString(node, "type") !== "JSXOpeningElement")
1051
+ return;
1052
+ const component = canonicalComponentFromJsx(jsxNameParts(node.name), bindings);
1053
+ if (!component)
1054
+ return;
1055
+ const usage = {
1056
+ component,
1057
+ props: new Map,
1058
+ booleanProps: new Set,
1059
+ hasSpread: false
1060
+ };
1061
+ for (const attr of getArray(node, "attributes")) {
1062
+ const attrType = getString(attr, "type");
1063
+ if (attrType === "SpreadElement" || attrType === "JSXSpreadAttribute") {
1064
+ usage.hasSpread = true;
1065
+ continue;
1066
+ }
1067
+ if (attrType !== "JSXAttribute")
1068
+ continue;
1069
+ const propName = getPathString(attr, "name", "value");
1070
+ if (!propName)
1071
+ continue;
1072
+ const attrValue = isRecord(attr) ? attr.value : undefined;
1073
+ const attrValueType = getString(attrValue, "type");
1074
+ if (!attrValue) {
1075
+ usage.booleanProps.add(propName);
1076
+ } else if (attrValueType === "StringLiteral") {
1077
+ usage.props.set(propName, getString(attrValue, "value") ?? "");
1078
+ } else {
1079
+ usage.props.set(propName, "DYNAMIC");
1080
+ }
1081
+ }
1082
+ usages.push(usage);
1083
+ });
1084
+ return usages;
1085
+ }
1086
+ function manifestComponents(manifest) {
1087
+ if (isPurgeDatabaseV2(manifest)) {
1088
+ return manifest.components;
1089
+ }
1090
+ return manifest;
1091
+ }
1092
+ function isPurgeDatabaseV2(manifest) {
1093
+ return manifest.version === 2 && isRecord(manifest.components);
1094
+ }
1095
+ function buildSafelists(allUsages, manifest) {
1096
+ const classSafelist = new Set;
1097
+ const attrSafelist = new Set;
1098
+ const usedComponents = new Set;
1099
+ const dynamicComponents = new Set;
1100
+ const componentUsages = new Map;
1101
+ const components = manifestComponents(manifest);
1102
+ for (const usage of expandDependencyUsages(allUsages, components)) {
1103
+ const existing = componentUsages.get(usage.component) ?? [];
1104
+ existing.push(usage);
1105
+ componentUsages.set(usage.component, existing);
1106
+ usedComponents.add(usage.component);
1107
+ if (usage.hasSpread || [...usage.props.values()].includes("DYNAMIC")) {
1108
+ dynamicComponents.add(usage.component);
1109
+ }
1110
+ }
1111
+ for (const [entryName, entry] of Object.entries(components)) {
1112
+ const matchingUsages = findMatchingUsages(entryName, componentUsages);
1113
+ if (matchingUsages.length === 0)
1114
+ continue;
1115
+ usedComponents.add(entryName);
1116
+ for (const cls of entry.classes.always) {
1117
+ classSafelist.add(cls);
1118
+ }
1119
+ for (const [propOrSlot, value] of Object.entries(entry.classes.byProp)) {
1120
+ if (Array.isArray(value)) {
1121
+ if (isPropUsed(propOrSlot, matchingUsages)) {
1122
+ for (const cls of value)
1123
+ classSafelist.add(cls);
1124
+ }
1125
+ } else {
1126
+ const usedValues = getUsedEnumValues(propOrSlot, matchingUsages);
1127
+ if (usedValues === "ALL") {
1128
+ for (const classes of Object.values(value)) {
1129
+ for (const cls of classes)
1130
+ classSafelist.add(cls);
1131
+ }
1132
+ } else {
1133
+ for (const val of usedValues) {
1134
+ if (value[val]) {
1135
+ for (const cls of value[val])
1136
+ classSafelist.add(cls);
1137
+ }
1138
+ }
1139
+ }
1140
+ }
1141
+ }
1142
+ if (entry.attrs) {
1143
+ for (const [propName, attrMap] of Object.entries(entry.attrs)) {
1144
+ if (isPropUsed(propName, matchingUsages)) {
1145
+ for (const [attr, val] of Object.entries(attrMap)) {
1146
+ attrSafelist.add(`[${attr}="${val}"]`);
1147
+ }
1148
+ }
1149
+ }
1150
+ }
1151
+ }
1152
+ return { classSafelist, attrSafelist, usedComponents, dynamicComponents };
1153
+ }
1154
+ function expandDependencyUsages(allUsages, manifest) {
1155
+ const result = [...allUsages];
1156
+ const queue = [...allUsages.map((usage) => rootComponent(usage.component))];
1157
+ const seen = new Set(queue);
1158
+ while (queue.length > 0) {
1159
+ const root = queue.pop();
1160
+ if (!root)
1161
+ continue;
1162
+ const deps = depsForRoot(root, manifest);
1163
+ for (const dep of deps) {
1164
+ if (seen.has(dep))
1165
+ continue;
1166
+ seen.add(dep);
1167
+ queue.push(dep);
1168
+ result.push(conservativeUsage(dep, "manifest-dependency"));
1169
+ }
1170
+ }
1171
+ return result;
1172
+ }
1173
+ function depsForRoot(root, manifest) {
1174
+ const deps = new Set;
1175
+ for (const [key, entry] of Object.entries(manifest)) {
1176
+ if (rootComponent(key) !== root)
1177
+ continue;
1178
+ for (const dep of entry.deps ?? [])
1179
+ deps.add(dep);
1180
+ }
1181
+ return [...deps];
1182
+ }
1183
+ function rootComponent(component) {
1184
+ return component.split(".")[0];
1185
+ }
1186
+ function findMatchingUsages(entryName, usageMap) {
1187
+ const direct = usageMap.get(entryName) ?? [];
1188
+ const results = [...direct];
1189
+ const entryRoot = rootComponent(entryName);
1190
+ for (const [usageName, usages] of usageMap) {
1191
+ if (usageName === entryName)
1192
+ continue;
1193
+ if (entryName.includes(".") && usageName === entryRoot) {
1194
+ results.push(...usages);
1195
+ }
1196
+ }
1197
+ return results;
1198
+ }
1199
+ function isPropUsed(propName, usages) {
1200
+ for (const usage of usages) {
1201
+ if (usage.hasSpread)
1202
+ return true;
1203
+ if (usage.booleanProps.has(propName))
1204
+ return true;
1205
+ if (usage.props.has(propName))
1206
+ return true;
1207
+ }
1208
+ return false;
1209
+ }
1210
+ function getUsedEnumValues(slotName, usages) {
1211
+ const values = new Set;
1212
+ for (const usage of usages) {
1213
+ if (usage.hasSpread)
1214
+ return "ALL";
1215
+ const val = usage.props.get(slotName);
1216
+ if (val === "DYNAMIC")
1217
+ return "ALL";
1218
+ if (val !== undefined)
1219
+ values.add(val);
1220
+ if (usage.booleanProps.has(slotName))
1221
+ return "ALL";
1222
+ }
1223
+ return values;
1224
+ }
1225
+ async function scanConsumerSource(srcDir) {
1226
+ const allUsages = [];
1227
+ const glob = new Glob("**/*.{tsx,ts,jsx,js}");
1228
+ for await (const relPath of glob.scan({ cwd: srcDir })) {
1229
+ if (relPath.includes("node_modules"))
1230
+ continue;
1231
+ const fullPath = joinPath(srcDir, relPath);
1232
+ const code = await Bun.file(fullPath).text();
1233
+ if (!code.includes("@pathscale/ui"))
1234
+ continue;
1235
+ const isTsx = /\.[tj]sx$/.test(relPath);
1236
+ const ast = await swc.parse(code, { syntax: "typescript", tsx: isTsx });
1237
+ const bindings = extractUIBindings(ast);
1238
+ if (bindings.components.size === 0 && bindings.namespaces.size === 0 && bindings.conservativeUsages.length === 0) {
1239
+ continue;
1240
+ }
1241
+ allUsages.push(...bindings.conservativeUsages);
1242
+ const jsxUsages = extractJSXUsages(ast, bindings.components);
1243
+ allUsages.push(...jsxUsages);
1244
+ for (const component of bindings.components.values()) {
1245
+ if (jsxUsages.some((usage) => usage.component === component || usage.component.startsWith(`${component}.`))) {
1246
+ continue;
1247
+ }
1248
+ allUsages.push(conservativeUsage(component, "import-without-direct-jsx"));
1249
+ }
1250
+ }
1251
+ return allUsages;
1252
+ }
1253
+ if (false) {}
1254
+
1255
+ // src/postbuild-purge.ts
1256
+ function parseArgs(argv) {
1257
+ const args = argv.slice(2);
1258
+ let distDir = "./dist";
1259
+ let srcDir = "./src";
1260
+ let manifestPath = "";
1261
+ for (let i = 0;i < args.length; i++) {
1262
+ if (args[i] === "--dist" && args[i + 1])
1263
+ distDir = args[++i];
1264
+ else if (args[i] === "--src" && args[i + 1])
1265
+ srcDir = args[++i];
1266
+ else if (args[i] === "--manifest" && args[i + 1])
1267
+ manifestPath = args[++i];
1268
+ }
1269
+ if (!manifestPath) {
1270
+ console.error("Usage: bunx @pathscale/rsbuild-plugin-ui-css-purge --manifest <path> [--dist <path>] [--src <path>]");
1271
+ process.exit(1);
1272
+ }
1273
+ return { distDir, srcDir, manifestPath };
1274
+ }
1275
+ function normalizePurgeDatabase(manifest) {
1276
+ const rawComponents = "version" in manifest && manifest.version === 2 ? manifest.components : manifest;
1277
+ const components = {};
1278
+ for (const [key, record] of Object.entries(rawComponents)) {
1279
+ const maybeV2 = record;
1280
+ const [fallbackComponent, fallbackPart] = splitComponentKey(key);
1281
+ components[key] = {
1282
+ ...record,
1283
+ key: maybeV2.key ?? key,
1284
+ component: maybeV2.component ?? fallbackComponent,
1285
+ part: maybeV2.part ?? fallbackPart,
1286
+ selectors: maybeV2.selectors ?? [],
1287
+ attributeSelectors: maybeV2.attributeSelectors ?? [],
1288
+ cssVars: {
1289
+ declared: maybeV2.cssVars?.declared ?? [],
1290
+ referenced: maybeV2.cssVars?.referenced ?? []
1291
+ },
1292
+ keyframes: {
1293
+ declared: maybeV2.keyframes?.declared ?? [],
1294
+ referenced: maybeV2.keyframes?.referenced ?? []
1295
+ }
1296
+ };
1297
+ }
1298
+ return { version: 2, components };
1299
+ }
1300
+ function splitComponentKey(key) {
1301
+ const [component, ...part] = key.split(".");
1302
+ return [component, part.length > 0 ? part.join(".") : undefined];
1303
+ }
1304
+ function rootComponent2(key) {
1305
+ return key.split(".")[0];
1306
+ }
1307
+ function collectClassesFromEntry(entry) {
1308
+ const result = [...entry.classes.always];
1309
+ for (const value of Object.values(entry.classes.byProp)) {
1310
+ if (Array.isArray(value)) {
1311
+ result.push(...value);
1312
+ } else {
1313
+ for (const classes of Object.values(value)) {
1314
+ result.push(...classes);
1315
+ }
1316
+ }
1317
+ }
1318
+ return [...new Set(result)];
1319
+ }
1320
+ function buildClassOwners(database) {
1321
+ const owners = new Map;
1322
+ for (const [key, entry] of Object.entries(database.components)) {
1323
+ for (const cls of collectClassesFromEntry(entry)) {
1324
+ const existing = owners.get(cls) ?? new Set;
1325
+ existing.add(key);
1326
+ owners.set(cls, existing);
1327
+ }
1328
+ }
1329
+ return owners;
1330
+ }
1331
+ function isRecordUsed(recordKey, safelists) {
1332
+ return safelists.usedComponents.has(recordKey) || safelists.usedComponents.has(rootComponent2(recordKey));
1333
+ }
1334
+ function isClassAllowed(cls, owners, safelists) {
1335
+ const classOwners = owners.get(cls);
1336
+ if (!classOwners)
1337
+ return true;
1338
+ for (const owner of classOwners) {
1339
+ if (isRecordUsed(owner, safelists) && safelists.classSafelist.has(cls)) {
1340
+ return true;
1341
+ }
1342
+ }
1343
+ return false;
1344
+ }
1345
+ function emptySelectorReport() {
1346
+ return {
1347
+ selectorsKeptKnown: 0,
1348
+ selectorsKeptUnknown: 0,
1349
+ selectorsRemoved: 0,
1350
+ selectorsRemovedUnusedComponent: 0,
1351
+ selectorsRemovedUnusedVariant: 0,
1352
+ attrSelectorsSeen: 0,
1353
+ keyframesRemoved: 0,
1354
+ fontFacesRemoved: 0
1355
+ };
1356
+ }
1357
+ function unescapeCss(s) {
1358
+ return s.replace(/\\(.)/g, "$1");
1359
+ }
1360
+ function extractClassesFromSelector(selector) {
1361
+ const matches = selector.matchAll(/\.([a-zA-Z_-](?:[a-zA-Z0-9_-]|\\[^\s.#:[>+~,)]*)*)/g);
1362
+ return [...matches].map((m) => unescapeCss(m[1]));
1363
+ }
1364
+ function extractAttrsFromSelector(selector) {
1365
+ const matches = selector.matchAll(/\[(data-[a-zA-Z0-9_-]+|aria-[a-zA-Z0-9_-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\]]+)))?\]/g);
1366
+ return [...matches].map((m) => {
1367
+ const value = m[2] ?? m[3] ?? m[4];
1368
+ return value === undefined ? `[${m[1]}]` : `[${m[1]}="${value.trim()}"]`;
1369
+ });
1370
+ }
1371
+ function selectorDecision(selector, owners, safelists) {
1372
+ const attrs = extractAttrsFromSelector(selector);
1373
+ if (attrs.some((attr) => safelists.attrSafelist.has(attr))) {
1374
+ return "keep-known";
1375
+ }
1376
+ const classes = extractClassesFromSelector(selector);
1377
+ if (classes.length === 0)
1378
+ return "keep-unknown";
1379
+ const hasUnknownClass = classes.some((cls) => !owners.has(cls));
1380
+ if (hasUnknownClass)
1381
+ return "keep-unknown";
1382
+ const hasUsedOwner = classes.some((cls) => {
1383
+ const classOwners = owners.get(cls);
1384
+ return [...classOwners ?? []].some((owner) => isRecordUsed(owner, safelists));
1385
+ });
1386
+ if (!hasUsedOwner)
1387
+ return "remove-unused-component";
1388
+ if (classes.every((cls) => isClassAllowed(cls, owners, safelists))) {
1389
+ return "keep-known";
1390
+ }
1391
+ return "remove-unused-variant";
1392
+ }
1393
+ function purgeCssWithDatabase(css, manifest, safelists) {
1394
+ const database = normalizePurgeDatabase(manifest);
1395
+ const classOwners = buildClassOwners(database);
1396
+ const report = emptySelectorReport();
1397
+ const root = postcss.parse(css);
1398
+ root.walkRules((rule) => {
1399
+ const selectors = rule.selectors;
1400
+ const kept = [];
1401
+ for (const selector of selectors) {
1402
+ report.attrSelectorsSeen += extractAttrsFromSelector(selector).length;
1403
+ const decision = selectorDecision(selector, classOwners, safelists);
1404
+ if (decision === "keep-known") {
1405
+ report.selectorsKeptKnown++;
1406
+ kept.push(selector);
1407
+ } else if (decision === "keep-unknown") {
1408
+ report.selectorsKeptUnknown++;
1409
+ kept.push(selector);
1410
+ } else {
1411
+ report.selectorsRemoved++;
1412
+ if (decision === "remove-unused-component") {
1413
+ report.selectorsRemovedUnusedComponent++;
1414
+ } else {
1415
+ report.selectorsRemovedUnusedVariant++;
1416
+ }
1417
+ }
1418
+ }
1419
+ if (kept.length === 0) {
1420
+ rule.remove();
1421
+ } else if (kept.length < selectors.length) {
1422
+ rule.selectors = kept;
1423
+ }
1424
+ });
1425
+ removeUnusedKeyframes(root, report);
1426
+ removeUnusedFontFaces(root, report);
1427
+ removeEmptyAtRules(root);
1428
+ return { css: root.toString(), report };
1429
+ }
1430
+ function removeUnusedKeyframes(root, report) {
1431
+ const usedKeyframes = new Set;
1432
+ root.walkDecls(/^animation(-name)?$/, (decl) => {
1433
+ for (const part of decl.value.split(",")) {
1434
+ const name = part.trim().split(/\s+/)[0];
1435
+ if (name && !["none", "initial", "inherit", "unset"].includes(name)) {
1436
+ usedKeyframes.add(name);
1437
+ }
1438
+ }
1439
+ });
1440
+ root.walkAtRules("keyframes", (atRule) => {
1441
+ if (!usedKeyframes.has(atRule.params.trim())) {
1442
+ atRule.remove();
1443
+ report.keyframesRemoved++;
1444
+ }
1445
+ });
1446
+ }
1447
+ function removeUnusedFontFaces(root, report) {
1448
+ const usedFonts = new Set;
1449
+ root.walkDecls(/^font(-family)?$/, (decl) => {
1450
+ for (const part of decl.value.split(",")) {
1451
+ const name = part.trim().replace(/^["']|["']$/g, "");
1452
+ if (name)
1453
+ usedFonts.add(name);
1454
+ }
1455
+ });
1456
+ root.walkAtRules("font-face", (atRule) => {
1457
+ let family = "";
1458
+ atRule.walkDecls("font-family", (decl) => {
1459
+ family = decl.value.trim().replace(/^["']|["']$/g, "");
1460
+ });
1461
+ if (family && !usedFonts.has(family)) {
1462
+ atRule.remove();
1463
+ report.fontFacesRemoved++;
1464
+ }
1465
+ });
1466
+ }
1467
+ function removeEmptyAtRules(root) {
1468
+ let cleaned = true;
1469
+ while (cleaned) {
1470
+ cleaned = false;
1471
+ root.walkAtRules((atRule) => {
1472
+ if (atRule.nodes && atRule.nodes.length === 0) {
1473
+ atRule.remove();
1474
+ cleaned = true;
1475
+ }
1476
+ });
1477
+ }
1478
+ }
1479
+ async function collectRuntimeCssVarRefs(distDir) {
1480
+ const refs = new Set;
1481
+ const glob = new Glob2("**/*.{js,mjs,cjs}");
1482
+ for await (const relPath of glob.scan({ cwd: distDir })) {
1483
+ const fullPath = `${distDir}/${relPath}`;
1484
+ const code = await Bun.file(fullPath).text();
1485
+ for (const match of code.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g)) {
1486
+ refs.add(match[1]);
1487
+ }
1488
+ }
1489
+ return refs;
1490
+ }
1491
+ function cleanUnusedVarsWithReport(css, externallyReferencedVars) {
1492
+ let changed = true;
1493
+ let result = css;
1494
+ let removed = 0;
1495
+ while (changed) {
1496
+ changed = false;
1497
+ const root = postcss.parse(result);
1498
+ const declared = new Map;
1499
+ root.walkDecls(/^--/, (decl) => {
1500
+ const entries = declared.get(decl.prop) ?? [];
1501
+ entries.push({ rule: decl.parent, prop: decl.prop });
1502
+ declared.set(decl.prop, entries);
1503
+ });
1504
+ const referenced = new Set(externallyReferencedVars);
1505
+ root.walkDecls((decl) => {
1506
+ for (const ref of decl.value.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g)) {
1507
+ referenced.add(ref[1]);
1508
+ }
1509
+ });
1510
+ for (const [varName, entries] of declared) {
1511
+ if (!referenced.has(varName)) {
1512
+ for (const entry of entries) {
1513
+ entry.rule.walkDecls(entry.prop, (decl) => {
1514
+ decl.remove();
1515
+ changed = true;
1516
+ removed++;
1517
+ });
1518
+ }
1519
+ }
1520
+ }
1521
+ root.walkRules((rule) => {
1522
+ if (rule.nodes && rule.nodes.length === 0)
1523
+ rule.remove();
1524
+ });
1525
+ removeEmptyAtRules(root);
1526
+ result = root.toString();
1527
+ }
1528
+ return { css: result, removed };
1529
+ }
1530
+ function cleanUnusedVars(css, externallyReferencedVars) {
1531
+ return cleanUnusedVarsWithReport(css, externallyReferencedVars).css;
1532
+ }
1533
+ function minify(css) {
1534
+ const { code } = transform({
1535
+ filename: "purged.css",
1536
+ code: Buffer.from(css),
1537
+ minify: true,
1538
+ errorRecovery: true
1539
+ });
1540
+ return code.toString();
1541
+ }
1542
+ async function main() {
1543
+ const { distDir, srcDir, manifestPath } = parseArgs(process.argv);
1544
+ const manifest = JSON.parse(await Bun.file(manifestPath).text());
1545
+ const database = normalizePurgeDatabase(manifest);
1546
+ const roots = new Set(Object.keys(database.components).map(rootComponent2));
1547
+ console.log(`[css-purge] Database loaded: ${Object.keys(database.components).length} records (${roots.size} components)`);
1548
+ const usages = await scanConsumerSource(srcDir);
1549
+ const safelists = buildSafelists(usages, manifest);
1550
+ const usedRoots = new Set([...safelists.usedComponents].map(rootComponent2));
1551
+ const removedRoots = [...roots].filter((root) => !usedRoots.has(root));
1552
+ console.log(`[css-purge] Components detected: ${usedRoots.size} used, ${removedRoots.length} removable`);
1553
+ if (usedRoots.size > 0) {
1554
+ console.log(`[css-purge] used: ${[...usedRoots].sort().join(", ")}`);
1555
+ }
1556
+ if (removedRoots.length > 0) {
1557
+ console.log(`[css-purge] removable: ${removedRoots.sort().join(", ")}`);
1558
+ }
1559
+ console.log(`[css-purge] Safelist facts: ${safelists.classSafelist.size} classes, ${safelists.attrSafelist.size} attr selectors`);
1560
+ const runtimeCssVarRefs = await collectRuntimeCssVarRefs(distDir);
1561
+ if (runtimeCssVarRefs.size > 0) {
1562
+ console.log(`[css-purge] Runtime CSS vars referenced from JS: ${runtimeCssVarRefs.size}`);
1563
+ }
1564
+ const glob = new Glob2("**/*.css");
1565
+ let totalBefore = 0;
1566
+ let totalAfter = 0;
1567
+ for await (const relPath of glob.scan({ cwd: distDir })) {
1568
+ const fullPath = `${distDir}/${relPath}`;
1569
+ const originalCss = await Bun.file(fullPath).text();
1570
+ const originalSize = Buffer.byteLength(originalCss, "utf-8");
1571
+ totalBefore += originalSize;
1572
+ console.log(`[css-purge] Processing ${relPath} (${(originalSize / 1024).toFixed(1)} KB)`);
1573
+ const purged = purgeCssWithDatabase(originalCss, database, safelists);
1574
+ let purgedCss = purged.css;
1575
+ const afterSelectors = Buffer.byteLength(purgedCss, "utf-8");
1576
+ console.log(`[css-purge] selectors: ${(originalSize / 1024).toFixed(1)} -> ${(afterSelectors / 1024).toFixed(1)} KB (${purged.report.selectorsRemoved} removed, ${purged.report.selectorsKeptUnknown} kept unknown)`);
1577
+ console.log(`[css-purge] attrs seen: ${purged.report.attrSelectorsSeen}; keyframes removed: ${purged.report.keyframesRemoved}`);
1578
+ const vars = cleanUnusedVarsWithReport(purgedCss, runtimeCssVarRefs);
1579
+ purgedCss = vars.css;
1580
+ const afterVars = Buffer.byteLength(purgedCss, "utf-8");
1581
+ console.log(`[css-purge] vars: ${(afterSelectors / 1024).toFixed(1)} -> ${(afterVars / 1024).toFixed(1)} KB (${vars.removed} removed)`);
1582
+ purgedCss = minify(purgedCss);
1583
+ const finalSize = Buffer.byteLength(purgedCss, "utf-8");
1584
+ totalAfter += finalSize;
1585
+ console.log(`[css-purge] minify: -> ${(finalSize / 1024).toFixed(1)} KB`);
1586
+ console.log(`[css-purge] final: ${(originalSize / 1024).toFixed(1)} -> ${(finalSize / 1024).toFixed(1)} KB (${((1 - finalSize / originalSize) * 100).toFixed(1)}% reduction)`);
1587
+ await Bun.write(fullPath, purgedCss);
1588
+ }
1589
+ console.log(`
1590
+ [css-purge] Total: ${(totalBefore / 1024).toFixed(1)} -> ${(totalAfter / 1024).toFixed(1)} KB (${((1 - totalAfter / totalBefore) * 100).toFixed(1)}% reduction)`);
1591
+ }
1592
+ if (import.meta.main) {
1593
+ main();
1594
+ }
1595
+ export {
1596
+ scanConsumerSource,
1597
+ purgeCssWithDatabase,
1598
+ normalizePurgeDatabase,
1599
+ extractUIImports,
1600
+ extractJSXUsages,
1601
+ cleanUnusedVarsWithReport,
1602
+ cleanUnusedVars,
1603
+ buildSafelists
1604
+ };
1605
+
1606
+ //# debugId=441893F077364FE664756E2164756E21
1607
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXG5vZGVfbW9kdWxlc1xcZGV0ZWN0LWxpYmNcXGxpYlxccHJvY2Vzcy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkZXRlY3QtbGliY1xcbGliXFxmaWxlc3lzdGVtLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRldGVjdC1saWJjXFxsaWJcXGVsZi5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkZXRlY3QtbGliY1xcbGliXFxkZXRlY3QtbGliYy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxsaWdodG5pbmdjc3NcXG5vZGVcXGJyb3dzZXJzbGlzdFRvVGFyZ2V0cy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxsaWdodG5pbmdjc3NcXG5vZGVcXGNvbXBvc2VWaXNpdG9ycy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxsaWdodG5pbmdjc3NcXG5vZGVcXGZsYWdzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGxpZ2h0bmluZ2Nzc1xcbm9kZVxcaW5kZXguanMiLCAiLi5cXHNyY1xccG9zdGJ1aWxkLXB1cmdlLnRzIiwgIi4uXFxub2RlX21vZHVsZXNcXGxpZ2h0bmluZ2Nzc1xcbm9kZVxcaW5kZXgubWpzIiwgIi4uXFxzcmNcXHNjYW4tY29uc3VtZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLy8gQ29weXJpZ2h0IDIwMTcgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpc0xpbnV4ID0gKCkgPT4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JztcblxubGV0IHJlcG9ydCA9IG51bGw7XG5jb25zdCBnZXRSZXBvcnQgPSAoKSA9PiB7XG4gIGlmICghcmVwb3J0KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoaXNMaW51eCgpICYmIHByb2Nlc3MucmVwb3J0KSB7XG4gICAgICBjb25zdCBvcmlnID0gcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcms7XG4gICAgICBwcm9jZXNzLnJlcG9ydC5leGNsdWRlTmV0d29yayA9IHRydWU7XG4gICAgICByZXBvcnQgPSBwcm9jZXNzLnJlcG9ydC5nZXRSZXBvcnQoKTtcbiAgICAgIHByb2Nlc3MucmVwb3J0LmV4Y2x1ZGVOZXR3b3JrID0gb3JpZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwb3J0ID0ge307XG4gICAgfVxuICB9XG4gIHJldHVybiByZXBvcnQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgaXNMaW51eCwgZ2V0UmVwb3J0IH07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDE3IExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBMRERfUEFUSCA9ICcvdXNyL2Jpbi9sZGQnO1xuY29uc3QgU0VMRl9QQVRIID0gJy9wcm9jL3NlbGYvZXhlJztcbmNvbnN0IE1BWF9MRU5HVEggPSAyMDQ4O1xuXG4vKipcbiAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIHN5bmNocm9ub3VzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IHJlYWRGaWxlU3luYyA9IChwYXRoKSA9PiB7XG4gIGNvbnN0IGZkID0gZnMub3BlblN5bmMocGF0aCwgJ3InKTtcbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKE1BWF9MRU5HVEgpO1xuICBjb25zdCBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmZCwgYnVmZmVyLCAwLCBNQVhfTEVOR1RILCAwKTtcbiAgZnMuY2xvc2UoZmQsICgpID0+IHt9KTtcbiAgcmV0dXJuIGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpO1xufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBjb250ZW50IG9mIGEgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fVxuICovXG5jb25zdCByZWFkRmlsZSA9IChwYXRoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIGZzLm9wZW4ocGF0aCwgJ3InLCAoZXJyLCBmZCkgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoTUFYX0xFTkdUSCk7XG4gICAgICBmcy5yZWFkKGZkLCBidWZmZXIsIDAsIE1BWF9MRU5HVEgsIDAsIChfLCBieXRlc1JlYWQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICAgIGZzLmNsb3NlKGZkLCAoKSA9PiB7fSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBMRERfUEFUSCxcbiAgU0VMRl9QQVRILFxuICByZWFkRmlsZVN5bmMsXG4gIHJlYWRGaWxlXG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGludGVycHJldGVyUGF0aCA9IChlbGYpID0+IHtcbiAgaWYgKGVsZi5sZW5ndGggPCA2NCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChlbGYucmVhZFVJbnQzMkJFKDApICE9PSAweDdGNDU0QzQ2KSB7XG4gICAgLy8gVW5leHBlY3RlZCBtYWdpYyBieXRlc1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChlbGYucmVhZFVJbnQ4KDQpICE9PSAyKSB7XG4gICAgLy8gTm90IGEgNjQtYml0IEVMRlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChlbGYucmVhZFVJbnQ4KDUpICE9PSAxKSB7XG4gICAgLy8gTm90IGxpdHRsZS1lbmRpYW5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBlbGYucmVhZFVJbnQzMkxFKDMyKTtcbiAgY29uc3Qgc2l6ZSA9IGVsZi5yZWFkVUludDE2TEUoNTQpO1xuICBjb25zdCBjb3VudCA9IGVsZi5yZWFkVUludDE2TEUoNTYpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBjb25zdCBoZWFkZXJPZmZzZXQgPSBvZmZzZXQgKyAoaSAqIHNpemUpO1xuICAgIGNvbnN0IHR5cGUgPSBlbGYucmVhZFVJbnQzMkxFKGhlYWRlck9mZnNldCk7XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIGNvbnN0IGZpbGVPZmZzZXQgPSBlbGYucmVhZFVJbnQzMkxFKGhlYWRlck9mZnNldCArIDgpO1xuICAgICAgY29uc3QgZmlsZVNpemUgPSBlbGYucmVhZFVJbnQzMkxFKGhlYWRlck9mZnNldCArIDMyKTtcbiAgICAgIHJldHVybiBlbGYuc3ViYXJyYXkoZmlsZU9mZnNldCwgZmlsZU9mZnNldCArIGZpbGVTaXplKS50b1N0cmluZygpLnJlcGxhY2UoL1xcMC4qJC9nLCAnJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGludGVycHJldGVyUGF0aFxufTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTcgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCB7IGlzTGludXgsIGdldFJlcG9ydCB9ID0gcmVxdWlyZSgnLi9wcm9jZXNzJyk7XG5jb25zdCB7IExERF9QQVRILCBTRUxGX1BBVEgsIHJlYWRGaWxlLCByZWFkRmlsZVN5bmMgfSA9IHJlcXVpcmUoJy4vZmlsZXN5c3RlbScpO1xuY29uc3QgeyBpbnRlcnByZXRlclBhdGggfSA9IHJlcXVpcmUoJy4vZWxmJyk7XG5cbmxldCBjYWNoZWRGYW1pbHlJbnRlcnByZXRlcjtcbmxldCBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtO1xubGV0IGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xuXG5jb25zdCBjb21tYW5kID0gJ2dldGNvbmYgR05VX0xJQkNfVkVSU0lPTiAyPiYxIHx8IHRydWU7IGxkZCAtLXZlcnNpb24gMj4mMSB8fCB0cnVlJztcbmxldCBjb21tYW5kT3V0ID0gJyc7XG5cbmNvbnN0IHNhZmVDb21tYW5kID0gKCkgPT4ge1xuICBpZiAoIWNvbW1hbmRPdXQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNoaWxkUHJvY2Vzcy5leGVjKGNvbW1hbmQsIChlcnIsIG91dCkgPT4ge1xuICAgICAgICBjb21tYW5kT3V0ID0gZXJyID8gJyAnIDogb3V0O1xuICAgICAgICByZXNvbHZlKGNvbW1hbmRPdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRPdXQ7XG59O1xuXG5jb25zdCBzYWZlQ29tbWFuZFN5bmMgPSAoKSA9PiB7XG4gIGlmICghY29tbWFuZE91dCkge1xuICAgIHRyeSB7XG4gICAgICBjb21tYW5kT3V0ID0gY2hpbGRQcm9jZXNzLmV4ZWNTeW5jKGNvbW1hbmQsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICBjb21tYW5kT3V0ID0gJyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29tbWFuZE91dDtcbn07XG5cbi8qKlxuICogQSBTdHJpbmcgY29uc3RhbnQgY29udGFpbmluZyB0aGUgdmFsdWUgYGdsaWJjYC5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IEdMSUJDID0gJ2dsaWJjJztcblxuLyoqXG4gKiBBIFJlZ2V4cCBjb25zdGFudCB0byBnZXQgdGhlIEdMSUJDIFZlcnNpb24uXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBSRV9HTElCQ19WRVJTSU9OID0gL0xJQkNbYS16MC05IFxcLSkuXSo/KFxcZCtcXC5cXGQrKS9pO1xuXG4vKipcbiAqIEEgU3RyaW5nIGNvbnN0YW50IGNvbnRhaW5pbmcgdGhlIHZhbHVlIGBtdXNsYC5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IE1VU0wgPSAnbXVzbCc7XG5cbmNvbnN0IGlzRmlsZU11c2wgPSAoZikgPT4gZi5pbmNsdWRlcygnbGliYy5tdXNsLScpIHx8IGYuaW5jbHVkZXMoJ2xkLW11c2wtJyk7XG5cbmNvbnN0IGZhbWlseUZyb21SZXBvcnQgPSAoKSA9PiB7XG4gIGNvbnN0IHJlcG9ydCA9IGdldFJlcG9ydCgpO1xuICBpZiAocmVwb3J0LmhlYWRlciAmJiByZXBvcnQuaGVhZGVyLmdsaWJjVmVyc2lvblJ1bnRpbWUpIHtcbiAgICByZXR1cm4gR0xJQkM7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkocmVwb3J0LnNoYXJlZE9iamVjdHMpKSB7XG4gICAgaWYgKHJlcG9ydC5zaGFyZWRPYmplY3RzLnNvbWUoaXNGaWxlTXVzbCkpIHtcbiAgICAgIHJldHVybiBNVVNMO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21Db21tYW5kID0gKG91dCkgPT4ge1xuICBjb25zdCBbZ2V0Y29uZiwgbGRkMV0gPSBvdXQuc3BsaXQoL1tcXHJcXG5dKy8pO1xuICBpZiAoZ2V0Y29uZiAmJiBnZXRjb25mLmluY2x1ZGVzKEdMSUJDKSkge1xuICAgIHJldHVybiBHTElCQztcbiAgfVxuICBpZiAobGRkMSAmJiBsZGQxLmluY2x1ZGVzKE1VU0wpKSB7XG4gICAgcmV0dXJuIE1VU0w7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBmYW1pbHlGcm9tSW50ZXJwcmV0ZXJQYXRoID0gKHBhdGgpID0+IHtcbiAgaWYgKHBhdGgpIHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnL2xkLW11c2wtJykpIHtcbiAgICAgIHJldHVybiBNVVNMO1xuICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcygnL2xkLWxpbnV4LScpKSB7XG4gICAgICByZXR1cm4gR0xJQkM7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZ2V0RmFtaWx5RnJvbUxkZENvbnRlbnQgPSAoY29udGVudCkgPT4ge1xuICBjb250ZW50ID0gY29udGVudC50b1N0cmluZygpO1xuICBpZiAoY29udGVudC5pbmNsdWRlcygnbXVzbCcpKSB7XG4gICAgcmV0dXJuIE1VU0w7XG4gIH1cbiAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ0dOVSBDIExpYnJhcnknKSkge1xuICAgIHJldHVybiBHTElCQztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21GaWxlc3lzdGVtID0gYXN5bmMgKCkgPT4ge1xuICBpZiAoY2FjaGVkRmFtaWx5RmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG4gIH1cbiAgY2FjaGVkRmFtaWx5RmlsZXN5c3RlbSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgbGRkQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlKExERF9QQVRIKTtcbiAgICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gZ2V0RmFtaWx5RnJvbUxkZENvbnRlbnQobGRkQ29udGVudCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUZpbGVzeXN0ZW1TeW5jID0gKCkgPT4ge1xuICBpZiAoY2FjaGVkRmFtaWx5RmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG4gIH1cbiAgY2FjaGVkRmFtaWx5RmlsZXN5c3RlbSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgbGRkQ29udGVudCA9IHJlYWRGaWxlU3luYyhMRERfUEFUSCk7XG4gICAgY2FjaGVkRmFtaWx5RmlsZXN5c3RlbSA9IGdldEZhbWlseUZyb21MZGRDb250ZW50KGxkZENvbnRlbnQpO1xuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21JbnRlcnByZXRlciA9IGFzeW5jICgpID0+IHtcbiAgaWYgKGNhY2hlZEZhbWlseUludGVycHJldGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG4gIH1cbiAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHNlbGZDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoU0VMRl9QQVRIKTtcbiAgICBjb25zdCBwYXRoID0gaW50ZXJwcmV0ZXJQYXRoKHNlbGZDb250ZW50KTtcbiAgICBjYWNoZWRGYW1pbHlJbnRlcnByZXRlciA9IGZhbWlseUZyb21JbnRlcnByZXRlclBhdGgocGF0aCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRGYW1pbHlJbnRlcnByZXRlcjtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21JbnRlcnByZXRlclN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlJbnRlcnByZXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZEZhbWlseUludGVycHJldGVyO1xuICB9XG4gIGNhY2hlZEZhbWlseUludGVycHJldGVyID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZWxmQ29udGVudCA9IHJlYWRGaWxlU3luYyhTRUxGX1BBVEgpO1xuICAgIGNvbnN0IHBhdGggPSBpbnRlcnByZXRlclBhdGgoc2VsZkNvbnRlbnQpO1xuICAgIGNhY2hlZEZhbWlseUludGVycHJldGVyID0gZmFtaWx5RnJvbUludGVycHJldGVyUGF0aChwYXRoKTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUludGVycHJldGVyO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyB3aXRoIHRoZSBsaWJjIGZhbWlseSB3aGVuIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBgbnVsbGAgb3RoZXJ3aXNlLlxuICogQHJldHVybnMge1Byb21pc2U8P3N0cmluZz59XG4gKi9cbmNvbnN0IGZhbWlseSA9IGFzeW5jICgpID0+IHtcbiAgbGV0IGZhbWlseSA9IG51bGw7XG4gIGlmIChpc0xpbnV4KCkpIHtcbiAgICBmYW1pbHkgPSBhd2FpdCBmYW1pbHlGcm9tSW50ZXJwcmV0ZXIoKTtcbiAgICBpZiAoIWZhbWlseSkge1xuICAgICAgZmFtaWx5ID0gYXdhaXQgZmFtaWx5RnJvbUZpbGVzeXN0ZW0oKTtcbiAgICAgIGlmICghZmFtaWx5KSB7XG4gICAgICAgIGZhbWlseSA9IGZhbWlseUZyb21SZXBvcnQoKTtcbiAgICAgIH1cbiAgICAgIGlmICghZmFtaWx5KSB7XG4gICAgICAgIGNvbnN0IG91dCA9IGF3YWl0IHNhZmVDb21tYW5kKCk7XG4gICAgICAgIGZhbWlseSA9IGZhbWlseUZyb21Db21tYW5kKG91dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYW1pbHk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGxpYmMgZmFtaWx5IHdoZW4gaXQgY2FuIGJlIGRldGVybWluZWQsIGBudWxsYCBvdGhlcndpc2UuXG4gKiBAcmV0dXJucyB7P3N0cmluZ31cbiAqL1xuY29uc3QgZmFtaWx5U3luYyA9ICgpID0+IHtcbiAgbGV0IGZhbWlseSA9IG51bGw7XG4gIGlmIChpc0xpbnV4KCkpIHtcbiAgICBmYW1pbHkgPSBmYW1pbHlGcm9tSW50ZXJwcmV0ZXJTeW5jKCk7XG4gICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgIGZhbWlseSA9IGZhbWlseUZyb21GaWxlc3lzdGVtU3luYygpO1xuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbVJlcG9ydCgpO1xuICAgICAgfVxuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gc2FmZUNvbW1hbmRTeW5jKCk7XG4gICAgICAgIGZhbWlseSA9IGZhbWlseUZyb21Db21tYW5kKG91dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYW1pbHk7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIGB0cnVlYCBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIGlzIExpbnV4IGFuZCB0aGUgbGliYyBmYW1pbHkgaXMgbm90IGBnbGliY2AuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuY29uc3QgaXNOb25HbGliY0xpbnV4ID0gYXN5bmMgKCkgPT4gaXNMaW51eCgpICYmIGF3YWl0IGZhbWlseSgpICE9PSBHTElCQztcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIGlzIExpbnV4IGFuZCB0aGUgbGliYyBmYW1pbHkgaXMgbm90IGBnbGliY2AuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNOb25HbGliY0xpbnV4U3luYyA9ICgpID0+IGlzTGludXgoKSAmJiBmYW1pbHlTeW5jKCkgIT09IEdMSUJDO1xuXG5jb25zdCB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xuICB9XG4gIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoTEREX1BBVEgpO1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IGxkZENvbnRlbnQubWF0Y2goUkVfR0xJQkNfVkVSU0lPTik7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW0gPSB2ZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG59O1xuXG5jb25zdCB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW1TeW5jID0gKCkgPT4ge1xuICBpZiAoY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgbGRkQ29udGVudCA9IHJlYWRGaWxlU3luYyhMRERfUEFUSCk7XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gbGRkQ29udGVudC5tYXRjaChSRV9HTElCQ19WRVJTSU9OKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbTtcbn07XG5cbmNvbnN0IHZlcnNpb25Gcm9tUmVwb3J0ID0gKCkgPT4ge1xuICBjb25zdCByZXBvcnQgPSBnZXRSZXBvcnQoKTtcbiAgaWYgKHJlcG9ydC5oZWFkZXIgJiYgcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lKSB7XG4gICAgcmV0dXJuIHJlcG9ydC5oZWFkZXIuZ2xpYmNWZXJzaW9uUnVudGltZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IHZlcnNpb25TdWZmaXggPSAocykgPT4gcy50cmltKCkuc3BsaXQoL1xccysvKVsxXTtcblxuY29uc3QgdmVyc2lvbkZyb21Db21tYW5kID0gKG91dCkgPT4ge1xuICBjb25zdCBbZ2V0Y29uZiwgbGRkMSwgbGRkMl0gPSBvdXQuc3BsaXQoL1tcXHJcXG5dKy8pO1xuICBpZiAoZ2V0Y29uZiAmJiBnZXRjb25mLmluY2x1ZGVzKEdMSUJDKSkge1xuICAgIHJldHVybiB2ZXJzaW9uU3VmZml4KGdldGNvbmYpO1xuICB9XG4gIGlmIChsZGQxICYmIGxkZDIgJiYgbGRkMS5pbmNsdWRlcyhNVVNMKSkge1xuICAgIHJldHVybiB2ZXJzaW9uU3VmZml4KGxkZDIpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyB3aXRoIHRoZSBsaWJjIHZlcnNpb24gd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPD9zdHJpbmc+fVxuICovXG5jb25zdCB2ZXJzaW9uID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgdmVyc2lvbiA9IG51bGw7XG4gIGlmIChpc0xpbnV4KCkpIHtcbiAgICB2ZXJzaW9uID0gYXdhaXQgdmVyc2lvbkZyb21GaWxlc3lzdGVtKCk7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbkZyb21SZXBvcnQoKTtcbiAgICB9XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICBjb25zdCBvdXQgPSBhd2FpdCBzYWZlQ29tbWFuZCgpO1xuICAgICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tQ29tbWFuZChvdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGliYyB2ZXJzaW9uIHdoZW4gaXQgY2FuIGJlIGRldGVybWluZWQsIGBudWxsYCBvdGhlcndpc2UuXG4gKiBAcmV0dXJucyB7P3N0cmluZ31cbiAqL1xuY29uc3QgdmVyc2lvblN5bmMgPSAoKSA9PiB7XG4gIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW1TeW5jKCk7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbkZyb21SZXBvcnQoKTtcbiAgICB9XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICBjb25zdCBvdXQgPSBzYWZlQ29tbWFuZFN5bmMoKTtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbUNvbW1hbmQob3V0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlcnNpb247XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR0xJQkMsXG4gIE1VU0wsXG4gIGZhbWlseSxcbiAgZmFtaWx5U3luYyxcbiAgaXNOb25HbGliY0xpbnV4LFxuICBpc05vbkdsaWJjTGludXhTeW5jLFxuICB2ZXJzaW9uLFxuICB2ZXJzaW9uU3luY1xufTtcbiIsCiAgICAiY29uc3QgQlJPV1NFUl9NQVBQSU5HID0ge1xuICBhbmRfY2hyOiAnY2hyb21lJyxcbiAgYW5kX2ZmOiAnZmlyZWZveCcsXG4gIGllX21vYjogJ2llJyxcbiAgb3BfbW9iOiAnb3BlcmEnLFxuICBhbmRfcXE6IG51bGwsXG4gIGFuZF91YzogbnVsbCxcbiAgYmFpZHU6IG51bGwsXG4gIGJiOiBudWxsLFxuICBrYWlvczogbnVsbCxcbiAgb3BfbWluaTogbnVsbCxcbn07XG5cbmZ1bmN0aW9uIGJyb3dzZXJzbGlzdFRvVGFyZ2V0cyhicm93c2Vyc2xpc3QpIHtcbiAgbGV0IHRhcmdldHMgPSB7fTtcbiAgZm9yIChsZXQgYnJvd3NlciBvZiBicm93c2Vyc2xpc3QpIHtcbiAgICBsZXQgW25hbWUsIHZdID0gYnJvd3Nlci5zcGxpdCgnICcpO1xuICAgIGlmIChCUk9XU0VSX01BUFBJTkdbbmFtZV0gPT09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCB2ZXJzaW9uID0gcGFyc2VWZXJzaW9uKHYpO1xuICAgIGlmICh2ZXJzaW9uID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXRzW25hbWVdID09IG51bGwgfHwgdmVyc2lvbiA8IHRhcmdldHNbbmFtZV0pIHtcbiAgICAgIHRhcmdldHNbbmFtZV0gPSB2ZXJzaW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVZlcnNpb24odmVyc2lvbikge1xuICBsZXQgW21ham9yLCBtaW5vciA9IDAsIHBhdGNoID0gMF0gPSB2ZXJzaW9uXG4gICAgLnNwbGl0KCctJylbMF1cbiAgICAuc3BsaXQoJy4nKVxuICAgIC5tYXAodiA9PiBwYXJzZUludCh2LCAxMCkpO1xuXG4gIGlmIChpc05hTihtYWpvcikgfHwgaXNOYU4obWlub3IpIHx8IGlzTmFOKHBhdGNoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIChtYWpvciA8PCAxNikgfCAobWlub3IgPDwgOCkgfCBwYXRjaDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBicm93c2Vyc2xpc3RUb1RhcmdldHM7XG4iLAogICAgIi8vIEB0cy1jaGVja1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4vaW5kZXgnKS5WaXNpdG9yfSBWaXNpdG9yICovXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLlZpc2l0b3JGdW5jdGlvbn0gVmlzaXRvckZ1bmN0aW9uICovXG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgdmlzaXRvciBvYmplY3RzIGludG8gYSBzaW5nbGUgb25lLlxuICogQHBhcmFtIHsoVmlzaXRvciB8IFZpc2l0b3JGdW5jdGlvbilbXX0gdmlzaXRvcnMgXG4gKiBAcmV0dXJuIHtWaXNpdG9yIHwgVmlzaXRvckZ1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjb21wb3NlVmlzaXRvcnModmlzaXRvcnMpIHtcbiAgaWYgKHZpc2l0b3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB2aXNpdG9yc1swXTtcbiAgfVxuICBcbiAgaWYgKHZpc2l0b3JzLnNvbWUodiA9PiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICByZXR1cm4gKG9wdHMpID0+IHtcbiAgICAgIGxldCB2ID0gdmlzaXRvcnMubWFwKHYgPT4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgPyB2KG9wdHMpIDogdik7XG4gICAgICByZXR1cm4gY29tcG9zZVZpc2l0b3JzKHYpO1xuICAgIH07XG4gIH1cblxuICAvKiogQHR5cGUgVmlzaXRvciAqL1xuICBsZXQgcmVzID0ge307XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3R5bGVTaGVldCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1N0eWxlU2hlZXRFeGl0Jyk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnUnVsZScsIHJ1bGVWaXNpdG9yLCB3cmFwQ3VzdG9tQW5kVW5rbm93bkF0UnVsZSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnUnVsZUV4aXQnLCBydWxlVmlzaXRvciwgd3JhcEN1c3RvbUFuZFVua25vd25BdFJ1bGUpO1xuICBjb21wb3NlT2JqZWN0VmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0RlY2xhcmF0aW9uJywgZGVjbGFyYXRpb25WaXNpdG9yLCB3cmFwQ3VzdG9tUHJvcGVydHkpO1xuICBjb21wb3NlT2JqZWN0VmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0RlY2xhcmF0aW9uRXhpdCcsIGRlY2xhcmF0aW9uVmlzaXRvciwgd3JhcEN1c3RvbVByb3BlcnR5KTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdVcmwnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdDb2xvcicpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0ltYWdlJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnSW1hZ2VFeGl0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnTGVuZ3RoJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnQW5nbGUnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSYXRpbycpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1Jlc29sdXRpb24nKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdUaW1lJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnQ3VzdG9tSWRlbnQnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdEYXNoZWRJZGVudCcpO1xuICBjb21wb3NlQXJyYXlGdW5jdGlvbnMocmVzLCB2aXNpdG9ycywgJ01lZGlhUXVlcnknKTtcbiAgY29tcG9zZUFycmF5RnVuY3Rpb25zKHJlcywgdmlzaXRvcnMsICdNZWRpYVF1ZXJ5RXhpdCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1N1cHBvcnRzQ29uZGl0aW9uJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3VwcG9ydHNDb25kaXRpb25FeGl0Jyk7XG4gIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCAnU2VsZWN0b3InKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1Rva2VuJywgJ3Rva2VuJywgZmFsc2UpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRnVuY3Rpb24nLCAnZnVuY3Rpb24nLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdGdW5jdGlvbkV4aXQnLCAnZnVuY3Rpb24nLCB0cnVlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1ZhcmlhYmxlJywgJ3ZhcicsIGZhbHNlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1ZhcmlhYmxlRXhpdCcsICd2YXInLCB0cnVlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Vudmlyb25tZW50VmFyaWFibGUnLCAnZW52JywgZmFsc2UpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRW52aXJvbm1lbnRWYXJpYWJsZUV4aXQnLCAnZW52JywgdHJ1ZSk7XG4gIHJldHVybiByZXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9zZVZpc2l0b3JzO1xuXG5mdW5jdGlvbiB3cmFwQ3VzdG9tQW5kVW5rbm93bkF0UnVsZShrLCBmKSB7XG4gIGlmIChrID09PSAndW5rbm93bicpIHtcbiAgICByZXR1cm4gKHZhbHVlID0+IGYoeyB0eXBlOiAndW5rbm93bicsIHZhbHVlIH0pKTtcbiAgfVxuICBpZiAoayA9PT0gJ2N1c3RvbScpIHtcbiAgICByZXR1cm4gKHZhbHVlID0+IGYoeyB0eXBlOiAnY3VzdG9tJywgdmFsdWUgfSkpO1xuICB9XG4gIHJldHVybiBmO1xufVxuXG5mdW5jdGlvbiB3cmFwQ3VzdG9tUHJvcGVydHkoaywgZikge1xuICByZXR1cm4gayA9PT0gJ2N1c3RvbScgPyAodmFsdWUgPT4gZih7IHByb3BlcnR5OiAnY3VzdG9tJywgdmFsdWUgfSkpIDogZjtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLlZpc2l0b3JbJ1J1bGUnXX0gZiBcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2FzdCcpLlJ1bGV9IGl0ZW0gXG4gKi9cbmZ1bmN0aW9uIHJ1bGVWaXNpdG9yKGYsIGl0ZW0pIHtcbiAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChpdGVtLnR5cGUgPT09ICd1bmtub3duJykge1xuICAgICAgbGV0IHYgPSBmLnVua25vd247XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHYgPSB2W2l0ZW0udmFsdWUubmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdj8uKGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXRlbS50eXBlID09PSAnY3VzdG9tJykge1xuICAgICAgbGV0IHYgPSBmLmN1c3RvbTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmW2l0ZW0udHlwZV0/LihpdGVtKTtcbiAgfVxuICByZXR1cm4gZj8uKGl0ZW0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvclsnRGVjbGFyYXRpb24nXX0gZiBcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2FzdCcpLkRlY2xhcmF0aW9ufSBpdGVtIFxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvblZpc2l0b3IoZiwgaXRlbSkge1xuICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IG5hbWUgPSBpdGVtLnByb3BlcnR5O1xuICAgIGlmIChpdGVtLnByb3BlcnR5ID09PSAndW5wYXJzZWQnKSB7XG4gICAgICBuYW1lID0gaXRlbS52YWx1ZS5wcm9wZXJ0eUlkLnByb3BlcnR5O1xuICAgIH0gZWxzZSBpZiAoaXRlbS5wcm9wZXJ0eSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGxldCB2ID0gZi5jdXN0b207XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHYgPSB2W2l0ZW0udmFsdWUubmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdj8uKGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZltuYW1lXT8uKGl0ZW0pO1xuICB9XG4gIHJldHVybiBmPy4oaXRlbSk7XG59XG5cbi8qKlxuICogXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFxuICogQHJldHVybnMge1thbnlbXSwgYm9vbGVhbiwgU2V0PHN0cmluZz5dfVxuICovXG5mdW5jdGlvbiBleHRyYWN0T2JqZWN0c09yRnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IHZhbHVlcyA9IFtdO1xuICBsZXQgaGFzRnVuY3Rpb24gPSBmYWxzZTtcbiAgbGV0IGFsbEtleXMgPSBuZXcgU2V0KCk7XG4gIGZvciAobGV0IHZpc2l0b3Igb2YgdmlzaXRvcnMpIHtcbiAgICBsZXQgdiA9IHZpc2l0b3Jba2V5XTtcbiAgICBpZiAodikge1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGhhc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiB2KSB7XG4gICAgICAgICAgYWxsS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFsdWVzLnB1c2godik7XG4gICAgfVxuICB9XG4gIHJldHVybiBbdmFsdWVzLCBoYXNGdW5jdGlvbiwgYWxsS2V5c107XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHtrZXlvZiBWaXNpdG9yfSBLXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlc1xuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsodmlzaXRvcjogVmlzaXRvcltLXSwgaXRlbTogYW55KSA9PiBhbnkgfCBhbnlbXSB8IHZvaWR9IGFwcGx5IFxuICogQHBhcmFtIHsoazogc3RyaW5nLCBmOiBhbnkpID0+IGFueX0gd3JhcEtleSBcbiAqL1xuZnVuY3Rpb24gY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsIGtleSwgYXBwbHksIHdyYXBLZXkpIHtcbiAgbGV0IFt2YWx1ZXMsIGhhc0Z1bmN0aW9uLCBhbGxLZXlzXSA9IGV4dHJhY3RPYmplY3RzT3JGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IHZhbHVlc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgZiA9IGNyZWF0ZUFycmF5VmlzaXRvcih2aXNpdG9ycywgKHZpc2l0b3IsIGl0ZW0pID0+IGFwcGx5KHZpc2l0b3Jba2V5XSwgaXRlbSkpO1xuICBpZiAoaGFzRnVuY3Rpb24pIHtcbiAgICByZXNba2V5XSA9IGY7XG4gIH0gZWxzZSB7XG4gICAgLyoqIEB0eXBlIHthbnl9ICovXG4gICAgbGV0IHYgPSB7fTtcbiAgICBmb3IgKGxldCBrIG9mIGFsbEtleXMpIHtcbiAgICAgIHZba10gPSB3cmFwS2V5KGssIGYpO1xuICAgIH1cbiAgICByZXNba2V5XSA9IHY7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWVbJ3R5cGUnXX0gdHlwZSBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFeGl0IFxuICovXG5mdW5jdGlvbiBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCBrZXksIHR5cGUsIGlzRXhpdCkge1xuICBsZXQgW3ZhbHVlcywgaGFzRnVuY3Rpb24sIGFsbEtleXNdID0gZXh0cmFjdE9iamVjdHNPckZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJlc1trZXldID0gdmFsdWVzWzBdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBmID0gY3JlYXRlVG9rZW5WaXNpdG9yKHZpc2l0b3JzLCB0eXBlLCBpc0V4aXQpO1xuICBpZiAoaGFzRnVuY3Rpb24pIHtcbiAgICByZXNba2V5XSA9IGY7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHYgPSB7fTtcbiAgICBmb3IgKGxldCBrZXkgb2YgYWxsS2V5cykge1xuICAgICAgdltrZXldID0gZjtcbiAgICB9XG4gICAgcmVzW2tleV0gPSB2O1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuVG9rZW5PclZhbHVlWyd0eXBlJ119IHR5cGUgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuVmlzaXRvcih2aXNpdG9ycywgdHlwZSwgaXNFeGl0KSB7XG4gIGxldCB2ID0gY3JlYXRlQXJyYXlWaXNpdG9yKHZpc2l0b3JzLCAodmlzaXRvciwgLyoqIEB0eXBlIHtpbXBvcnQoJy4vYXN0JykuVG9rZW5PclZhbHVlfSAqLyBpdGVtKSA9PiB7XG4gICAgbGV0IGY7XG4gICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Rva2VuJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuVG9rZW47XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmID0gZltpdGVtLnZhbHVlLnR5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICBmID0gaXNFeGl0ID8gdmlzaXRvci5GdW5jdGlvbkV4aXQgOiB2aXNpdG9yLkZ1bmN0aW9uO1xuICAgICAgICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZiA9IGZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Zhcic6XG4gICAgICAgIGYgPSBpc0V4aXQgPyB2aXNpdG9yLlZhcmlhYmxlRXhpdCA6IHZpc2l0b3IuVmFyaWFibGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW52JzpcbiAgICAgICAgZiA9IGlzRXhpdCA/IHZpc2l0b3IuRW52aXJvbm1lbnRWYXJpYWJsZUV4aXQgOiB2aXNpdG9yLkVudmlyb25tZW50VmFyaWFibGU7XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBsZXQgbmFtZTtcbiAgICAgICAgICBzd2l0Y2ggKGl0ZW0udmFsdWUubmFtZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICd1YSc6XG4gICAgICAgICAgICBjYXNlICd1bmtub3duJzpcbiAgICAgICAgICAgICAgbmFtZSA9IGl0ZW0udmFsdWUubmFtZS52YWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjdXN0b20nOlxuICAgICAgICAgICAgICBuYW1lID0gaXRlbS52YWx1ZS5uYW1lLmlkZW50O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZiA9IGZbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2xvcic6XG4gICAgICAgIGYgPSB2aXNpdG9yLkNvbG9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VybCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLlVybDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZW5ndGgnOlxuICAgICAgICBmID0gdmlzaXRvci5MZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5nbGUnOlxuICAgICAgICBmID0gdmlzaXRvci5BbmdsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuVGltZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXNvbHV0aW9uJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuUmVzb2x1dGlvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXNoZWQtaWRlbnQnOlxuICAgICAgICBmID0gdmlzaXRvci5EYXNoZWRJZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlcyA9IGYoaXRlbS52YWx1ZSk7XG4gICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgIGNhc2UgJ3VybCc6XG4gICAgICBjYXNlICdsZW5ndGgnOlxuICAgICAgY2FzZSAnYW5nbGUnOlxuICAgICAgY2FzZSAndGltZSc6XG4gICAgICBjYXNlICdyZXNvbHV0aW9uJzpcbiAgICAgIGNhc2UgJ2Rhc2hlZC1pZGVudCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgICAgICByZXMgPSByZXMubWFwKHZhbHVlID0+ICh7IHR5cGU6IGl0ZW0udHlwZSwgdmFsdWUgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzKSB7XG4gICAgICAgICAgcmVzID0geyB0eXBlOiBpdGVtLnR5cGUsIHZhbHVlOiByZXMgfTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9KTtcblxuICByZXR1cm4gdmFsdWUgPT4gdih7IHR5cGUsIHZhbHVlIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSkge1xuICBsZXQgZnVuY3Rpb25zID0gW107XG4gIGZvciAobGV0IHZpc2l0b3Igb2YgdmlzaXRvcnMpIHtcbiAgICBsZXQgZiA9IHZpc2l0b3Jba2V5XTtcbiAgICBpZiAoZikge1xuICAgICAgZnVuY3Rpb25zLnB1c2goZik7XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbnM7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yfSByZXMgXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFxuICovXG5mdW5jdGlvbiBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywga2V5KSB7XG4gIGxldCBmdW5jdGlvbnMgPSBleHRyYWN0RnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpO1xuICBpZiAoZnVuY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzW2tleV0gPSBmdW5jdGlvbnNbMF07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVzW2tleV0gPSBhcmcgPT4ge1xuICAgIGxldCBtdXRhdGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgZiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIGxldCByZXMgPSBmKGFyZyk7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGFyZyA9IHJlcztcbiAgICAgICAgbXV0YXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG11dGF0ZWQgPyBhcmcgOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yfSByZXMgXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFxuICovXG5mdW5jdGlvbiBjb21wb3NlQXJyYXlGdW5jdGlvbnMocmVzLCB2aXNpdG9ycywga2V5KSB7XG4gIGxldCBmdW5jdGlvbnMgPSBleHRyYWN0RnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpO1xuICBpZiAoZnVuY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzW2tleV0gPSBmdW5jdGlvbnNbMF07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVzW2tleV0gPSBjcmVhdGVBcnJheVZpc2l0b3IoZnVuY3Rpb25zLCAoZiwgaXRlbSkgPT4gZihpdGVtKSk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1RbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0geyh2aXNpdG9yOiBULCBpdGVtOiBWKSA9PiBWIHwgVltdIHwgdm9pZH0gYXBwbHkgXG4gKiBAcmV0dXJucyB7KGl0ZW06IFYpID0+IFYgfCBWW10gfCB2b2lkfVxuICovXG5mdW5jdGlvbiBjcmVhdGVBcnJheVZpc2l0b3IodmlzaXRvcnMsIGFwcGx5KSB7XG4gIGxldCBzZWVuID0gbmV3IEJpdHNldCh2aXNpdG9ycy5sZW5ndGgpO1xuICByZXR1cm4gYXJnID0+IHtcbiAgICBsZXQgYXJyID0gW2FyZ107XG4gICAgbGV0IG11dGF0ZWQgPSBmYWxzZTtcbiAgICBzZWVuLmNsZWFyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIEZvciBlYWNoIHZhbHVlLCBjYWxsIGFsbCB2aXNpdG9ycy4gSWYgYSB2aXNpdG9yIHJldHVybnMgYSBuZXcgdmFsdWUsXG4gICAgICAvLyB3ZSBzdGFydCBvdmVyLCBidXQgc2tpcCB0aGUgdmlzaXRvciB0aGF0IGdlbmVyYXRlZCB0aGUgdmFsdWUgb3Igc2F3XG4gICAgICAvLyBpdCBiZWZvcmUgKHRvIGF2b2lkIGN5Y2xlcykuIFRoaXMgd2F5LCB2aXNpdG9ycyBjYW4gYmUgY29tcG9zZWQgaW4gYW55IG9yZGVyLiBcbiAgICAgIGZvciAobGV0IHYgPSAwOyB2IDwgdmlzaXRvcnMubGVuZ3RoICYmIGkgPCBhcnIubGVuZ3RoOykge1xuICAgICAgICBpZiAoc2Vlbi5nZXQodikpIHtcbiAgICAgICAgICB2Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXRlbSA9IGFycltpXTtcbiAgICAgICAgbGV0IHZpc2l0b3IgPSB2aXNpdG9yc1t2XTtcbiAgICAgICAgbGV0IHJlcyA9IGFwcGx5KHZpc2l0b3IsIGl0ZW0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICAgICAgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSByZXNbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSwgLi4ucmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbXV0YXRlZCA9IHRydWU7XG4gICAgICAgICAgc2Vlbi5zZXQodik7XG4gICAgICAgICAgdiA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzKSB7XG4gICAgICAgICAgYXJyW2ldID0gcmVzO1xuICAgICAgICAgIG11dGF0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNlZW4uc2V0KHYpO1xuICAgICAgICAgIHYgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHYrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbXV0YXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBhcnIubGVuZ3RoID09PSAxID8gYXJyWzBdIDogYXJyO1xuICB9O1xufVxuXG5jbGFzcyBCaXRzZXQge1xuICBjb25zdHJ1Y3RvcihtYXhCaXRzID0gMzIpIHtcbiAgICB0aGlzLmJpdHMgPSAwO1xuICAgIHRoaXMubW9yZSA9IG1heEJpdHMgPiAzMiA/IG5ldyBVaW50MzJBcnJheShNYXRoLmNlaWwoKG1heEJpdHMgLSAzMikgLyAzMikpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gYml0ICovXG4gIGdldChiaXQpIHtcbiAgICBpZiAoYml0ID49IDMyICYmIHRoaXMubW9yZSkge1xuICAgICAgbGV0IGkgPSBNYXRoLmZsb29yKChiaXQgLSAzMikgLyAzMik7XG4gICAgICBsZXQgYiA9IGJpdCAlIDMyO1xuICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5tb3JlW2ldICYgKDEgPDwgYikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmJpdHMgJiAoMSA8PCBiaXQpKTtcbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtudW1iZXJ9IGJpdCAqL1xuICBzZXQoYml0KSB7XG4gICAgaWYgKGJpdCA+PSAzMiAmJiB0aGlzLm1vcmUpIHtcbiAgICAgIGxldCBpID0gTWF0aC5mbG9vcigoYml0IC0gMzIpIC8gMzIpO1xuICAgICAgbGV0IGIgPSBiaXQgJSAzMjtcbiAgICAgIHRoaXMubW9yZVtpXSB8PSAxIDw8IGI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYml0cyB8PSAxIDw8IGJpdDtcbiAgICB9XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLmJpdHMgPSAwO1xuICAgIGlmICh0aGlzLm1vcmUpIHtcbiAgICAgIHRoaXMubW9yZS5maWxsKDApO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICIvLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBidWlsZC1wcmVmaXhlcy5qcy4gRE8gTk9UIEVESVQhXG5cbmV4cG9ydHMuRmVhdHVyZXMgPSB7XG4gIE5lc3Rpbmc6IDEsXG4gIE5vdFNlbGVjdG9yTGlzdDogMixcbiAgRGlyU2VsZWN0b3I6IDQsXG4gIExhbmdTZWxlY3Rvckxpc3Q6IDgsXG4gIElzU2VsZWN0b3I6IDE2LFxuICBUZXh0RGVjb3JhdGlvblRoaWNrbmVzc1BlcmNlbnQ6IDMyLFxuICBNZWRpYUludGVydmFsU3ludGF4OiA2NCxcbiAgTWVkaWFSYW5nZVN5bnRheDogMTI4LFxuICBDdXN0b21NZWRpYVF1ZXJpZXM6IDI1NixcbiAgQ2xhbXBGdW5jdGlvbjogNTEyLFxuICBDb2xvckZ1bmN0aW9uOiAxMDI0LFxuICBPa2xhYkNvbG9yczogMjA0OCxcbiAgTGFiQ29sb3JzOiA0MDk2LFxuICBQM0NvbG9yczogODE5MixcbiAgSGV4QWxwaGFDb2xvcnM6IDE2Mzg0LFxuICBTcGFjZVNlcGFyYXRlZENvbG9yTm90YXRpb246IDMyNzY4LFxuICBGb250RmFtaWx5U3lzdGVtVWk6IDY1NTM2LFxuICBEb3VibGVQb3NpdGlvbkdyYWRpZW50czogMTMxMDcyLFxuICBWZW5kb3JQcmVmaXhlczogMjYyMTQ0LFxuICBMb2dpY2FsUHJvcGVydGllczogNTI0Mjg4LFxuICBMaWdodERhcms6IDEwNDg1NzYsXG4gIFNlbGVjdG9yczogMzEsXG4gIE1lZGlhUXVlcmllczogNDQ4LFxuICBDb2xvcnM6IDExMTMwODgsXG59O1xuIiwKICAgICJsZXQgcGFydHMgPSBbcHJvY2Vzcy5wbGF0Zm9ybSwgcHJvY2Vzcy5hcmNoXTtcbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gIGNvbnN0IHsgTVVTTCwgZmFtaWx5U3luYyB9ID0gcmVxdWlyZSgnZGV0ZWN0LWxpYmMnKTtcbiAgY29uc3QgZmFtaWx5ID0gZmFtaWx5U3luYygpO1xuICBpZiAoZmFtaWx5ID09PSBNVVNMKSB7XG4gICAgcGFydHMucHVzaCgnbXVzbCcpO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICBwYXJ0cy5wdXNoKCdnbnVlYWJpaGYnKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0cy5wdXNoKCdnbnUnKTtcbiAgfVxufSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gIHBhcnRzLnB1c2goJ21zdmMnKTtcbn1cblxubGV0IG5hdGl2ZTtcbnRyeSB7XG4gIG5hdGl2ZSA9IHJlcXVpcmUoYGxpZ2h0bmluZ2Nzcy0ke3BhcnRzLmpvaW4oJy0nKX1gKTtcbn0gY2F0Y2ggKGVycikge1xuICBuYXRpdmUgPSByZXF1aXJlKGAuLi9saWdodG5pbmdjc3MuJHtwYXJ0cy5qb2luKCctJyl9Lm5vZGVgKTtcbn1cblxubW9kdWxlLmV4cG9ydHMudHJhbnNmb3JtID0gd3JhcChuYXRpdmUudHJhbnNmb3JtKTtcbm1vZHVsZS5leHBvcnRzLnRyYW5zZm9ybVN0eWxlQXR0cmlidXRlID0gd3JhcChuYXRpdmUudHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUpO1xubW9kdWxlLmV4cG9ydHMuYnVuZGxlID0gd3JhcChuYXRpdmUuYnVuZGxlKTtcbm1vZHVsZS5leHBvcnRzLmJ1bmRsZUFzeW5jID0gd3JhcChuYXRpdmUuYnVuZGxlQXN5bmMpO1xubW9kdWxlLmV4cG9ydHMuYnJvd3NlcnNsaXN0VG9UYXJnZXRzID0gcmVxdWlyZSgnLi9icm93c2Vyc2xpc3RUb1RhcmdldHMnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2VWaXNpdG9ycyA9IHJlcXVpcmUoJy4vY29tcG9zZVZpc2l0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cy5GZWF0dXJlcyA9IHJlcXVpcmUoJy4vZmxhZ3MnKS5GZWF0dXJlcztcblxuZnVuY3Rpb24gd3JhcChjYWxsKSB7XG4gIHJldHVybiAob3B0aW9ucykgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy52aXNpdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsZXQgZGVwcyA9IFtdO1xuICAgICAgb3B0aW9ucy52aXNpdG9yID0gb3B0aW9ucy52aXNpdG9yKHtcbiAgICAgICAgYWRkRGVwZW5kZW5jeShkZXApIHtcbiAgICAgICAgICBkZXBzLnB1c2goZGVwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCByZXN1bHQgPSBjYWxsKG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRoZW4ocmVzID0+IHtcbiAgICAgICAgICBpZiAoZGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlcy5kZXBlbmRlbmNpZXMgPz89IFtdO1xuICAgICAgICAgICAgcmVzLmRlcGVuZGVuY2llcy5wdXNoKC4uLmRlcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcyA/Pz0gW107XG4gICAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMucHVzaCguLi5kZXBzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjYWxsKG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcbn1cbiIsCiAgICAiIyEvdXNyL2Jpbi9lbnYgYnVuXG4vKipcbiAqIFBvc3RidWlsZCBDU1MgcHVyZ2Ug4oCUIHN0YW5kYWxvbmUgQnVuIHNjcmlwdC5cbiAqXG4gKiBSdW5zIGFmdGVyIHJzYnVpbGQgYnVpbGQsIHB1cmdlcyBDU1MgZmlsZXMgaW4gZGlzdC8gdXNpbmcgYSBkYXRhYmFzZS1maXJzdFxuICogY29tcG9uZW50IG1hbmlmZXN0IGFuZCBjb25zdW1lciBKU1ggdXNhZ2UgYW5hbHlzaXMuXG4gKlxuICogQ29uc2VydmF0aXZlIHJ1bGVzOlxuICogICAtIHNlbGVjdG9ycyBvd25lZCBvbmx5IGJ5IHVudXNlZCBrbm93biBjb21wb25lbnRzIGNhbiBiZSByZW1vdmVkXG4gKiAgIC0gc2VsZWN0b3JzIG93bmVkIGJ5IHVzZWQgY29tcG9uZW50cyBidXQgdW51c2VkIGtub3duIHByb3AgdmFyaWFudHMgY2FuIGJlIHJlbW92ZWRcbiAqICAgLSBzZWxlY3RvcnMgd2l0aCB1bmtub3duIG93bmVyc2hpcCBhcmUga2VwdFxuICogICAtIGRhdGEvYXJpYSBydW50aW1lIHN0YXRlIGlzIGtlcHQgd2hlbiB0aGUgb3duaW5nIGNvbXBvbmVudCBzZWxlY3RvciBpcyBrZXB0XG4gKiAgIC0gdmFycy9rZXlmcmFtZXMgYXJlIHJlbW92ZWQgb25seSBhZnRlciBzZWxlY3RvciBwdXJnZSBwcm92ZXMgdGhlbSB1bnJlZmVyZW5jZWRcbiAqL1xuXG5pbXBvcnQgeyBHbG9iIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHsgdHJhbnNmb3JtIH0gZnJvbSBcImxpZ2h0bmluZ2Nzc1wiO1xuaW1wb3J0IHR5cGUgeyBBdFJ1bGUsIFJ1bGUgfSBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHBvc3Rjc3MgZnJvbSBcInBvc3Rjc3NcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29tcG9uZW50UHVyZ2VSZWNvcmQsXG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0LFxuXHRQdXJnZU1hbmlmZXN0LFxuXHRTYWZlbGlzdHMsXG59IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcbmltcG9ydCB7IGJ1aWxkU2FmZWxpc3RzLCBzY2FuQ29uc3VtZXJTb3VyY2UgfSBmcm9tIFwiLi9zY2FuLWNvbnN1bWVyXCI7XG5cbi8vIOKUgOKUgCBDTEkgYXJncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKToge1xuXHRkaXN0RGlyOiBzdHJpbmc7XG5cdHNyY0Rpcjogc3RyaW5nO1xuXHRtYW5pZmVzdFBhdGg6IHN0cmluZztcbn0ge1xuXHRjb25zdCBhcmdzID0gYXJndi5zbGljZSgyKTtcblx0bGV0IGRpc3REaXIgPSBcIi4vZGlzdFwiO1xuXHRsZXQgc3JjRGlyID0gXCIuL3NyY1wiO1xuXHRsZXQgbWFuaWZlc3RQYXRoID0gXCJcIjtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoYXJnc1tpXSA9PT0gXCItLWRpc3RcIiAmJiBhcmdzW2kgKyAxXSkgZGlzdERpciA9IGFyZ3NbKytpXTtcblx0XHRlbHNlIGlmIChhcmdzW2ldID09PSBcIi0tc3JjXCIgJiYgYXJnc1tpICsgMV0pIHNyY0RpciA9IGFyZ3NbKytpXTtcblx0XHRlbHNlIGlmIChhcmdzW2ldID09PSBcIi0tbWFuaWZlc3RcIiAmJiBhcmdzW2kgKyAxXSkgbWFuaWZlc3RQYXRoID0gYXJnc1srK2ldO1xuXHR9XG5cblx0aWYgKCFtYW5pZmVzdFBhdGgpIHtcblx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XCJVc2FnZTogYnVueCBAcGF0aHNjYWxlL3JzYnVpbGQtcGx1Z2luLXVpLWNzcy1wdXJnZSAtLW1hbmlmZXN0IDxwYXRoPiBbLS1kaXN0IDxwYXRoPl0gWy0tc3JjIDxwYXRoPl1cIixcblx0XHQpO1xuXHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0fVxuXG5cdHJldHVybiB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH07XG59XG5cbi8vIOKUgOKUgCBEYXRhYmFzZSBub3JtYWxpemF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgTm9ybWFsaXplZENvbXBvbmVudFJlY29yZCBleHRlbmRzIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0IHtcblx0a2V5OiBzdHJpbmc7XG5cdGNvbXBvbmVudDogc3RyaW5nO1xuXHRwYXJ0Pzogc3RyaW5nO1xuXHRzZWxlY3RvcnM6IHN0cmluZ1tdO1xuXHRhdHRyaWJ1dGVTZWxlY3RvcnM6IHN0cmluZ1tdO1xuXHRjc3NWYXJzOiB7XG5cdFx0ZGVjbGFyZWQ6IHN0cmluZ1tdO1xuXHRcdHJlZmVyZW5jZWQ6IHN0cmluZ1tdO1xuXHR9O1xuXHRrZXlmcmFtZXM6IHtcblx0XHRkZWNsYXJlZDogc3RyaW5nW107XG5cdFx0cmVmZXJlbmNlZDogc3RyaW5nW107XG5cdH07XG59XG5cbmludGVyZmFjZSBOb3JtYWxpemVkUHVyZ2VEYXRhYmFzZSB7XG5cdHZlcnNpb246IDI7XG5cdGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIE5vcm1hbGl6ZWRDb21wb25lbnRSZWNvcmQ+O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQdXJnZURhdGFiYXNlKFxuXHRtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCxcbik6IE5vcm1hbGl6ZWRQdXJnZURhdGFiYXNlIHtcblx0Y29uc3QgcmF3Q29tcG9uZW50cyA9XG5cdFx0XCJ2ZXJzaW9uXCIgaW4gbWFuaWZlc3QgJiYgbWFuaWZlc3QudmVyc2lvbiA9PT0gMlxuXHRcdFx0PyBtYW5pZmVzdC5jb21wb25lbnRzXG5cdFx0XHQ6IG1hbmlmZXN0O1xuXHRjb25zdCBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBOb3JtYWxpemVkQ29tcG9uZW50UmVjb3JkPiA9IHt9O1xuXG5cdGZvciAoY29uc3QgW2tleSwgcmVjb3JkXSBvZiBPYmplY3QuZW50cmllcyhyYXdDb21wb25lbnRzKSkge1xuXHRcdGNvbnN0IG1heWJlVjIgPSByZWNvcmQgYXMgQ29tcG9uZW50UHVyZ2VSZWNvcmQ7XG5cdFx0Y29uc3QgW2ZhbGxiYWNrQ29tcG9uZW50LCBmYWxsYmFja1BhcnRdID0gc3BsaXRDb21wb25lbnRLZXkoa2V5KTtcblx0XHRjb21wb25lbnRzW2tleV0gPSB7XG5cdFx0XHQuLi5yZWNvcmQsXG5cdFx0XHRrZXk6IG1heWJlVjIua2V5ID8/IGtleSxcblx0XHRcdGNvbXBvbmVudDogbWF5YmVWMi5jb21wb25lbnQgPz8gZmFsbGJhY2tDb21wb25lbnQsXG5cdFx0XHRwYXJ0OiBtYXliZVYyLnBhcnQgPz8gZmFsbGJhY2tQYXJ0LFxuXHRcdFx0c2VsZWN0b3JzOiBtYXliZVYyLnNlbGVjdG9ycyA/PyBbXSxcblx0XHRcdGF0dHJpYnV0ZVNlbGVjdG9yczogbWF5YmVWMi5hdHRyaWJ1dGVTZWxlY3RvcnMgPz8gW10sXG5cdFx0XHRjc3NWYXJzOiB7XG5cdFx0XHRcdGRlY2xhcmVkOiBtYXliZVYyLmNzc1ZhcnM/LmRlY2xhcmVkID8/IFtdLFxuXHRcdFx0XHRyZWZlcmVuY2VkOiBtYXliZVYyLmNzc1ZhcnM/LnJlZmVyZW5jZWQgPz8gW10sXG5cdFx0XHR9LFxuXHRcdFx0a2V5ZnJhbWVzOiB7XG5cdFx0XHRcdGRlY2xhcmVkOiBtYXliZVYyLmtleWZyYW1lcz8uZGVjbGFyZWQgPz8gW10sXG5cdFx0XHRcdHJlZmVyZW5jZWQ6IG1heWJlVjIua2V5ZnJhbWVzPy5yZWZlcmVuY2VkID8/IFtdLFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIHsgdmVyc2lvbjogMiwgY29tcG9uZW50cyB9O1xufVxuXG5mdW5jdGlvbiBzcGxpdENvbXBvbmVudEtleShrZXk6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0ge1xuXHRjb25zdCBbY29tcG9uZW50LCAuLi5wYXJ0XSA9IGtleS5zcGxpdChcIi5cIik7XG5cdHJldHVybiBbY29tcG9uZW50LCBwYXJ0Lmxlbmd0aCA+IDAgPyBwYXJ0LmpvaW4oXCIuXCIpIDogdW5kZWZpbmVkXTtcbn1cblxuZnVuY3Rpb24gcm9vdENvbXBvbmVudChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBrZXkuc3BsaXQoXCIuXCIpWzBdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q2xhc3Nlc0Zyb21FbnRyeShlbnRyeTogTGVnYWN5Q29tcG9uZW50TWFuaWZlc3QpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHJlc3VsdCA9IFsuLi5lbnRyeS5jbGFzc2VzLmFsd2F5c107XG5cdGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhlbnRyeS5jbGFzc2VzLmJ5UHJvcCkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHJlc3VsdC5wdXNoKC4uLnZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChjb25zdCBjbGFzc2VzIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKC4uLmNsYXNzZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gWy4uLm5ldyBTZXQocmVzdWx0KV07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xhc3NPd25lcnMoXG5cdGRhdGFiYXNlOiBOb3JtYWxpemVkUHVyZ2VEYXRhYmFzZSxcbik6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiB7XG5cdGNvbnN0IG93bmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblx0Zm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YWJhc2UuY29tcG9uZW50cykpIHtcblx0XHRmb3IgKGNvbnN0IGNscyBvZiBjb2xsZWN0Q2xhc3Nlc0Zyb21FbnRyeShlbnRyeSkpIHtcblx0XHRcdGNvbnN0IGV4aXN0aW5nID0gb3duZXJzLmdldChjbHMpID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdFx0ZXhpc3RpbmcuYWRkKGtleSk7XG5cdFx0XHRvd25lcnMuc2V0KGNscywgZXhpc3RpbmcpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3duZXJzO1xufVxuXG5mdW5jdGlvbiBpc1JlY29yZFVzZWQocmVjb3JkS2V5OiBzdHJpbmcsIHNhZmVsaXN0czogU2FmZWxpc3RzKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0c2FmZWxpc3RzLnVzZWRDb21wb25lbnRzLmhhcyhyZWNvcmRLZXkpIHx8XG5cdFx0c2FmZWxpc3RzLnVzZWRDb21wb25lbnRzLmhhcyhyb290Q29tcG9uZW50KHJlY29yZEtleSkpXG5cdCk7XG59XG5cbmZ1bmN0aW9uIGlzQ2xhc3NBbGxvd2VkKFxuXHRjbHM6IHN0cmluZyxcblx0b3duZXJzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sXG5cdHNhZmVsaXN0czogU2FmZWxpc3RzLFxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGNsYXNzT3duZXJzID0gb3duZXJzLmdldChjbHMpO1xuXHRpZiAoIWNsYXNzT3duZXJzKSByZXR1cm4gdHJ1ZTtcblx0Zm9yIChjb25zdCBvd25lciBvZiBjbGFzc093bmVycykge1xuXHRcdGlmIChpc1JlY29yZFVzZWQob3duZXIsIHNhZmVsaXN0cykgJiYgc2FmZWxpc3RzLmNsYXNzU2FmZWxpc3QuaGFzKGNscykpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIOKUgOKUgCBTZWxlY3RvciBwdXJnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFNlbGVjdG9yUHVyZ2VSZXBvcnQge1xuXHRzZWxlY3RvcnNLZXB0S25vd246IG51bWJlcjtcblx0c2VsZWN0b3JzS2VwdFVua25vd246IG51bWJlcjtcblx0c2VsZWN0b3JzUmVtb3ZlZDogbnVtYmVyO1xuXHRzZWxlY3RvcnNSZW1vdmVkVW51c2VkQ29tcG9uZW50OiBudW1iZXI7XG5cdHNlbGVjdG9yc1JlbW92ZWRVbnVzZWRWYXJpYW50OiBudW1iZXI7XG5cdGF0dHJTZWxlY3RvcnNTZWVuOiBudW1iZXI7XG5cdGtleWZyYW1lc1JlbW92ZWQ6IG51bWJlcjtcblx0Zm9udEZhY2VzUmVtb3ZlZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUHVyZ2VSZXN1bHQge1xuXHRjc3M6IHN0cmluZztcblx0cmVwb3J0OiBTZWxlY3RvclB1cmdlUmVwb3J0O1xufVxuXG5mdW5jdGlvbiBlbXB0eVNlbGVjdG9yUmVwb3J0KCk6IFNlbGVjdG9yUHVyZ2VSZXBvcnQge1xuXHRyZXR1cm4ge1xuXHRcdHNlbGVjdG9yc0tlcHRLbm93bjogMCxcblx0XHRzZWxlY3RvcnNLZXB0VW5rbm93bjogMCxcblx0XHRzZWxlY3RvcnNSZW1vdmVkOiAwLFxuXHRcdHNlbGVjdG9yc1JlbW92ZWRVbnVzZWRDb21wb25lbnQ6IDAsXG5cdFx0c2VsZWN0b3JzUmVtb3ZlZFVudXNlZFZhcmlhbnQ6IDAsXG5cdFx0YXR0clNlbGVjdG9yc1NlZW46IDAsXG5cdFx0a2V5ZnJhbWVzUmVtb3ZlZDogMCxcblx0XHRmb250RmFjZXNSZW1vdmVkOiAwLFxuXHR9O1xufVxuXG4vKiogVW5lc2NhcGUgQ1NTIGlkZW50aWZpZXJzOiBgaWNvbi1cXFttZGktLWNvZ1xcXWAgLT4gYGljb24tW21kaS0tY29nXWAgKi9cbmZ1bmN0aW9uIHVuZXNjYXBlQ3NzKHM6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBzLnJlcGxhY2UoL1xcXFwoLikvZywgXCIkMVwiKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzZXNGcm9tU2VsZWN0b3Ioc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgbWF0Y2hlcyA9IHNlbGVjdG9yLm1hdGNoQWxsKFxuXHRcdC9cXC4oW2EtekEtWl8tXSg/OlthLXpBLVowLTlfLV18XFxcXFteXFxzLiM6Wz4rfiwpXSopKikvZyxcblx0KTtcblx0cmV0dXJuIFsuLi5tYXRjaGVzXS5tYXAoKG0pID0+IHVuZXNjYXBlQ3NzKG1bMV0pKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEF0dHJzRnJvbVNlbGVjdG9yKHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IG1hdGNoZXMgPSBzZWxlY3Rvci5tYXRjaEFsbChcblx0XHQvXFxbKGRhdGEtW2EtekEtWjAtOV8tXSt8YXJpYS1bYS16QS1aMC05Xy1dKykoPzo9KD86XCIoW15cIl0qKVwifCcoW14nXSopJ3woW15cXF1dKykpKT9cXF0vZyxcblx0KTtcblx0cmV0dXJuIFsuLi5tYXRjaGVzXS5tYXAoKG0pID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IG1bMl0gPz8gbVszXSA/PyBtWzRdO1xuXHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gYFske21bMV19XWAgOiBgWyR7bVsxXX09XCIke3ZhbHVlLnRyaW0oKX1cIl1gO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0b3JEZWNpc2lvbihcblx0c2VsZWN0b3I6IHN0cmluZyxcblx0b3duZXJzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sXG5cdHNhZmVsaXN0czogU2FmZWxpc3RzLFxuKTpcblx0fCBcImtlZXAta25vd25cIlxuXHR8IFwia2VlcC11bmtub3duXCJcblx0fCBcInJlbW92ZS11bnVzZWQtY29tcG9uZW50XCJcblx0fCBcInJlbW92ZS11bnVzZWQtdmFyaWFudFwiIHtcblx0Y29uc3QgYXR0cnMgPSBleHRyYWN0QXR0cnNGcm9tU2VsZWN0b3Ioc2VsZWN0b3IpO1xuXHRpZiAoYXR0cnMuc29tZSgoYXR0cikgPT4gc2FmZWxpc3RzLmF0dHJTYWZlbGlzdC5oYXMoYXR0cikpKSB7XG5cdFx0cmV0dXJuIFwia2VlcC1rbm93blwiO1xuXHR9XG5cblx0Y29uc3QgY2xhc3NlcyA9IGV4dHJhY3RDbGFzc2VzRnJvbVNlbGVjdG9yKHNlbGVjdG9yKTtcblx0aWYgKGNsYXNzZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJrZWVwLXVua25vd25cIjtcblxuXHRjb25zdCBoYXNVbmtub3duQ2xhc3MgPSBjbGFzc2VzLnNvbWUoKGNscykgPT4gIW93bmVycy5oYXMoY2xzKSk7XG5cdGlmIChoYXNVbmtub3duQ2xhc3MpIHJldHVybiBcImtlZXAtdW5rbm93blwiO1xuXG5cdGNvbnN0IGhhc1VzZWRPd25lciA9IGNsYXNzZXMuc29tZSgoY2xzKSA9PiB7XG5cdFx0Y29uc3QgY2xhc3NPd25lcnMgPSBvd25lcnMuZ2V0KGNscyk7XG5cdFx0cmV0dXJuIFsuLi4oY2xhc3NPd25lcnMgPz8gW10pXS5zb21lKChvd25lcikgPT5cblx0XHRcdGlzUmVjb3JkVXNlZChvd25lciwgc2FmZWxpc3RzKSxcblx0XHQpO1xuXHR9KTtcblxuXHRpZiAoIWhhc1VzZWRPd25lcikgcmV0dXJuIFwicmVtb3ZlLXVudXNlZC1jb21wb25lbnRcIjtcblxuXHRpZiAoY2xhc3Nlcy5ldmVyeSgoY2xzKSA9PiBpc0NsYXNzQWxsb3dlZChjbHMsIG93bmVycywgc2FmZWxpc3RzKSkpIHtcblx0XHRyZXR1cm4gXCJrZWVwLWtub3duXCI7XG5cdH1cblxuXHRyZXR1cm4gXCJyZW1vdmUtdW51c2VkLXZhcmlhbnRcIjtcbn1cblxuZnVuY3Rpb24gcHVyZ2VDc3NXaXRoRGF0YWJhc2UoXG5cdGNzczogc3RyaW5nLFxuXHRtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCB8IE5vcm1hbGl6ZWRQdXJnZURhdGFiYXNlLFxuXHRzYWZlbGlzdHM6IFNhZmVsaXN0cyxcbik6IFB1cmdlUmVzdWx0IHtcblx0Y29uc3QgZGF0YWJhc2UgPSBub3JtYWxpemVQdXJnZURhdGFiYXNlKG1hbmlmZXN0IGFzIFB1cmdlTWFuaWZlc3QpO1xuXHRjb25zdCBjbGFzc093bmVycyA9IGJ1aWxkQ2xhc3NPd25lcnMoZGF0YWJhc2UpO1xuXHRjb25zdCByZXBvcnQgPSBlbXB0eVNlbGVjdG9yUmVwb3J0KCk7XG5cdGNvbnN0IHJvb3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cblx0cm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcblx0XHRjb25zdCBzZWxlY3RvcnMgPSBydWxlLnNlbGVjdG9ycztcblx0XHRjb25zdCBrZXB0OiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBzZWxlY3RvciBvZiBzZWxlY3RvcnMpIHtcblx0XHRcdHJlcG9ydC5hdHRyU2VsZWN0b3JzU2VlbiArPSBleHRyYWN0QXR0cnNGcm9tU2VsZWN0b3Ioc2VsZWN0b3IpLmxlbmd0aDtcblx0XHRcdGNvbnN0IGRlY2lzaW9uID0gc2VsZWN0b3JEZWNpc2lvbihzZWxlY3RvciwgY2xhc3NPd25lcnMsIHNhZmVsaXN0cyk7XG5cdFx0XHRpZiAoZGVjaXNpb24gPT09IFwia2VlcC1rbm93blwiKSB7XG5cdFx0XHRcdHJlcG9ydC5zZWxlY3RvcnNLZXB0S25vd24rKztcblx0XHRcdFx0a2VwdC5wdXNoKHNlbGVjdG9yKTtcblx0XHRcdH0gZWxzZSBpZiAoZGVjaXNpb24gPT09IFwia2VlcC11bmtub3duXCIpIHtcblx0XHRcdFx0cmVwb3J0LnNlbGVjdG9yc0tlcHRVbmtub3duKys7XG5cdFx0XHRcdGtlcHQucHVzaChzZWxlY3Rvcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXBvcnQuc2VsZWN0b3JzUmVtb3ZlZCsrO1xuXHRcdFx0XHRpZiAoZGVjaXNpb24gPT09IFwicmVtb3ZlLXVudXNlZC1jb21wb25lbnRcIikge1xuXHRcdFx0XHRcdHJlcG9ydC5zZWxlY3RvcnNSZW1vdmVkVW51c2VkQ29tcG9uZW50Kys7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVwb3J0LnNlbGVjdG9yc1JlbW92ZWRVbnVzZWRWYXJpYW50Kys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoa2VwdC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJ1bGUucmVtb3ZlKCk7XG5cdFx0fSBlbHNlIGlmIChrZXB0Lmxlbmd0aCA8IHNlbGVjdG9ycy5sZW5ndGgpIHtcblx0XHRcdHJ1bGUuc2VsZWN0b3JzID0ga2VwdDtcblx0XHR9XG5cdH0pO1xuXG5cdHJlbW92ZVVudXNlZEtleWZyYW1lcyhyb290LCByZXBvcnQpO1xuXHRyZW1vdmVVbnVzZWRGb250RmFjZXMocm9vdCwgcmVwb3J0KTtcblx0cmVtb3ZlRW1wdHlBdFJ1bGVzKHJvb3QpO1xuXG5cdHJldHVybiB7IGNzczogcm9vdC50b1N0cmluZygpLCByZXBvcnQgfTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW51c2VkS2V5ZnJhbWVzKFxuXHRyb290OiBwb3N0Y3NzLlJvb3QsXG5cdHJlcG9ydDogU2VsZWN0b3JQdXJnZVJlcG9ydCxcbikge1xuXHRjb25zdCB1c2VkS2V5ZnJhbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdHJvb3Qud2Fsa0RlY2xzKC9eYW5pbWF0aW9uKC1uYW1lKT8kLywgKGRlY2wpID0+IHtcblx0XHRmb3IgKGNvbnN0IHBhcnQgb2YgZGVjbC52YWx1ZS5zcGxpdChcIixcIikpIHtcblx0XHRcdGNvbnN0IG5hbWUgPSBwYXJ0LnRyaW0oKS5zcGxpdCgvXFxzKy8pWzBdO1xuXHRcdFx0aWYgKG5hbWUgJiYgIVtcIm5vbmVcIiwgXCJpbml0aWFsXCIsIFwiaW5oZXJpdFwiLCBcInVuc2V0XCJdLmluY2x1ZGVzKG5hbWUpKSB7XG5cdFx0XHRcdHVzZWRLZXlmcmFtZXMuYWRkKG5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cm9vdC53YWxrQXRSdWxlcyhcImtleWZyYW1lc1wiLCAoYXRSdWxlKSA9PiB7XG5cdFx0aWYgKCF1c2VkS2V5ZnJhbWVzLmhhcyhhdFJ1bGUucGFyYW1zLnRyaW0oKSkpIHtcblx0XHRcdGF0UnVsZS5yZW1vdmUoKTtcblx0XHRcdHJlcG9ydC5rZXlmcmFtZXNSZW1vdmVkKys7XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW51c2VkRm9udEZhY2VzKFxuXHRyb290OiBwb3N0Y3NzLlJvb3QsXG5cdHJlcG9ydDogU2VsZWN0b3JQdXJnZVJlcG9ydCxcbikge1xuXHRjb25zdCB1c2VkRm9udHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cm9vdC53YWxrRGVjbHMoL15mb250KC1mYW1pbHkpPyQvLCAoZGVjbCkgPT4ge1xuXHRcdGZvciAoY29uc3QgcGFydCBvZiBkZWNsLnZhbHVlLnNwbGl0KFwiLFwiKSkge1xuXHRcdFx0Y29uc3QgbmFtZSA9IHBhcnQudHJpbSgpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG5cdFx0XHRpZiAobmFtZSkgdXNlZEZvbnRzLmFkZChuYW1lKTtcblx0XHR9XG5cdH0pO1xuXG5cdHJvb3Qud2Fsa0F0UnVsZXMoXCJmb250LWZhY2VcIiwgKGF0UnVsZSkgPT4ge1xuXHRcdGxldCBmYW1pbHkgPSBcIlwiO1xuXHRcdGF0UnVsZS53YWxrRGVjbHMoXCJmb250LWZhbWlseVwiLCAoZGVjbCkgPT4ge1xuXHRcdFx0ZmFtaWx5ID0gZGVjbC52YWx1ZS50cmltKCkucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCBcIlwiKTtcblx0XHR9KTtcblx0XHRpZiAoZmFtaWx5ICYmICF1c2VkRm9udHMuaGFzKGZhbWlseSkpIHtcblx0XHRcdGF0UnVsZS5yZW1vdmUoKTtcblx0XHRcdHJlcG9ydC5mb250RmFjZXNSZW1vdmVkKys7XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlBdFJ1bGVzKHJvb3Q6IHBvc3Rjc3MuUm9vdCkge1xuXHRsZXQgY2xlYW5lZCA9IHRydWU7XG5cdHdoaWxlIChjbGVhbmVkKSB7XG5cdFx0Y2xlYW5lZCA9IGZhbHNlO1xuXHRcdHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuXHRcdFx0aWYgKGF0UnVsZS5ub2RlcyAmJiBhdFJ1bGUubm9kZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGF0UnVsZS5yZW1vdmUoKTtcblx0XHRcdFx0Y2xlYW5lZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuLy8g4pSA4pSAIFJ1bnRpbWUgQ1NTIHZhcmlhYmxlIHJlZmVyZW5jZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RSdW50aW1lQ3NzVmFyUmVmcyhkaXN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG5cdGNvbnN0IHJlZnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi57anMsbWpzLGNqc31cIik7XG5cblx0Zm9yIGF3YWl0IChjb25zdCByZWxQYXRoIG9mIGdsb2Iuc2Nhbih7IGN3ZDogZGlzdERpciB9KSkge1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlzdERpcn0vJHtyZWxQYXRofWA7XG5cdFx0Y29uc3QgY29kZSA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG5cdFx0Zm9yIChjb25zdCBtYXRjaCBvZiBjb2RlLm1hdGNoQWxsKC92YXJcXChcXHMqKC0tW2EtekEtWjAtOV8tXSspL2cpKSB7XG5cdFx0XHRyZWZzLmFkZChtYXRjaFsxXSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlZnM7XG59XG5cbi8vIOKUgOKUgCBVbnVzZWQgQ1NTIHZhcmlhYmxlIGNsZWFudXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBWYXJDbGVhbnVwUmVzdWx0IHtcblx0Y3NzOiBzdHJpbmc7XG5cdHJlbW92ZWQ6IG51bWJlcjtcbn1cblxuLy8gVE9ETzogcG90ZW50aWFsbHkgcmVkdWNlIHBhcnNpbmcgYW1vdW50XG5mdW5jdGlvbiBjbGVhblVudXNlZFZhcnNXaXRoUmVwb3J0KFxuXHRjc3M6IHN0cmluZyxcblx0ZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzOiBTZXQ8c3RyaW5nPixcbik6IFZhckNsZWFudXBSZXN1bHQge1xuXHRsZXQgY2hhbmdlZCA9IHRydWU7XG5cdGxldCByZXN1bHQgPSBjc3M7XG5cdGxldCByZW1vdmVkID0gMDtcblxuXHR3aGlsZSAoY2hhbmdlZCkge1xuXHRcdGNoYW5nZWQgPSBmYWxzZTtcblx0XHRjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShyZXN1bHQpO1xuXG5cdFx0Y29uc3QgZGVjbGFyZWQgPSBuZXcgTWFwPHN0cmluZywgeyBydWxlOiBSdWxlIHwgQXRSdWxlOyBwcm9wOiBzdHJpbmcgfVtdPigpO1xuXHRcdHJvb3Qud2Fsa0RlY2xzKC9eLS0vLCAoZGVjbCkgPT4ge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGRlY2xhcmVkLmdldChkZWNsLnByb3ApID8/IFtdO1xuXHRcdFx0ZW50cmllcy5wdXNoKHsgcnVsZTogZGVjbC5wYXJlbnQgYXMgUnVsZSwgcHJvcDogZGVjbC5wcm9wIH0pO1xuXHRcdFx0ZGVjbGFyZWQuc2V0KGRlY2wucHJvcCwgZW50cmllcyk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KGV4dGVybmFsbHlSZWZlcmVuY2VkVmFycyk7XG5cdFx0cm9vdC53YWxrRGVjbHMoKGRlY2wpID0+IHtcblx0XHRcdGZvciAoY29uc3QgcmVmIG9mIGRlY2wudmFsdWUubWF0Y2hBbGwoL3ZhclxcKFxccyooLS1bYS16QS1aMC05Xy1dKykvZykpIHtcblx0XHRcdFx0cmVmZXJlbmNlZC5hZGQocmVmWzFdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGZvciAoY29uc3QgW3Zhck5hbWUsIGVudHJpZXNdIG9mIGRlY2xhcmVkKSB7XG5cdFx0XHRpZiAoIXJlZmVyZW5jZWQuaGFzKHZhck5hbWUpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0XHRcdGVudHJ5LnJ1bGUud2Fsa0RlY2xzKGVudHJ5LnByb3AsIChkZWNsKSA9PiB7XG5cdFx0XHRcdFx0XHRkZWNsLnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRyZW1vdmVkKys7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuXHRcdFx0aWYgKHJ1bGUubm9kZXMgJiYgcnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHJ1bGUucmVtb3ZlKCk7XG5cdFx0fSk7XG5cdFx0cmVtb3ZlRW1wdHlBdFJ1bGVzKHJvb3QpO1xuXG5cdFx0cmVzdWx0ID0gcm9vdC50b1N0cmluZygpO1xuXHR9XG5cblx0cmV0dXJuIHsgY3NzOiByZXN1bHQsIHJlbW92ZWQgfTtcbn1cblxuZnVuY3Rpb24gY2xlYW5VbnVzZWRWYXJzKFxuXHRjc3M6IHN0cmluZyxcblx0ZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzOiBTZXQ8c3RyaW5nPixcbik6IHN0cmluZyB7XG5cdHJldHVybiBjbGVhblVudXNlZFZhcnNXaXRoUmVwb3J0KGNzcywgZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzKS5jc3M7XG59XG5cbi8vIOKUgOKUgCBNaW5pZmljYXRpb246IExpZ2h0bmluZyBDU1Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIG1pbmlmeShjc3M6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHsgY29kZSB9ID0gdHJhbnNmb3JtKHtcblx0XHRmaWxlbmFtZTogXCJwdXJnZWQuY3NzXCIsXG5cdFx0Y29kZTogQnVmZmVyLmZyb20oY3NzKSxcblx0XHRtaW5pZnk6IHRydWUsXG5cdFx0ZXJyb3JSZWNvdmVyeTogdHJ1ZSxcblx0fSk7XG5cdHJldHVybiBjb2RlLnRvU3RyaW5nKCk7XG59XG5cbi8vIOKUgOKUgCBNYWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRjb25zdCB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH0gPSBwYXJzZUFyZ3MocHJvY2Vzcy5hcmd2KTtcblxuXHRjb25zdCBtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCA9IEpTT04ucGFyc2UoXG5cdFx0YXdhaXQgQnVuLmZpbGUobWFuaWZlc3RQYXRoKS50ZXh0KCksXG5cdCk7XG5cdGNvbnN0IGRhdGFiYXNlID0gbm9ybWFsaXplUHVyZ2VEYXRhYmFzZShtYW5pZmVzdCk7XG5cdGNvbnN0IHJvb3RzID0gbmV3IFNldChPYmplY3Qua2V5cyhkYXRhYmFzZS5jb21wb25lbnRzKS5tYXAocm9vdENvbXBvbmVudCkpO1xuXHRjb25zb2xlLmxvZyhcblx0XHRgW2Nzcy1wdXJnZV0gRGF0YWJhc2UgbG9hZGVkOiAke09iamVjdC5rZXlzKGRhdGFiYXNlLmNvbXBvbmVudHMpLmxlbmd0aH0gcmVjb3JkcyAoJHtyb290cy5zaXplfSBjb21wb25lbnRzKWAsXG5cdCk7XG5cblx0Y29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcik7XG5cdGNvbnN0IHNhZmVsaXN0cyA9IGJ1aWxkU2FmZWxpc3RzKHVzYWdlcywgbWFuaWZlc3QpO1xuXHRjb25zdCB1c2VkUm9vdHMgPSBuZXcgU2V0KFsuLi5zYWZlbGlzdHMudXNlZENvbXBvbmVudHNdLm1hcChyb290Q29tcG9uZW50KSk7XG5cdGNvbnN0IHJlbW92ZWRSb290cyA9IFsuLi5yb290c10uZmlsdGVyKChyb290KSA9PiAhdXNlZFJvb3RzLmhhcyhyb290KSk7XG5cblx0Y29uc29sZS5sb2coXG5cdFx0YFtjc3MtcHVyZ2VdIENvbXBvbmVudHMgZGV0ZWN0ZWQ6ICR7dXNlZFJvb3RzLnNpemV9IHVzZWQsICR7cmVtb3ZlZFJvb3RzLmxlbmd0aH0gcmVtb3ZhYmxlYCxcblx0KTtcblx0aWYgKHVzZWRSb290cy5zaXplID4gMCkge1xuXHRcdGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIHVzZWQ6ICR7Wy4uLnVzZWRSb290c10uc29ydCgpLmpvaW4oXCIsIFwiKX1gKTtcblx0fVxuXHRpZiAocmVtb3ZlZFJvb3RzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICByZW1vdmFibGU6ICR7cmVtb3ZlZFJvb3RzLnNvcnQoKS5qb2luKFwiLCBcIil9YCk7XG5cdH1cblx0Y29uc29sZS5sb2coXG5cdFx0YFtjc3MtcHVyZ2VdIFNhZmVsaXN0IGZhY3RzOiAke3NhZmVsaXN0cy5jbGFzc1NhZmVsaXN0LnNpemV9IGNsYXNzZXMsICR7c2FmZWxpc3RzLmF0dHJTYWZlbGlzdC5zaXplfSBhdHRyIHNlbGVjdG9yc2AsXG5cdCk7XG5cblx0Y29uc3QgcnVudGltZUNzc1ZhclJlZnMgPSBhd2FpdCBjb2xsZWN0UnVudGltZUNzc1ZhclJlZnMoZGlzdERpcik7XG5cdGlmIChydW50aW1lQ3NzVmFyUmVmcy5zaXplID4gMCkge1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtjc3MtcHVyZ2VdIFJ1bnRpbWUgQ1NTIHZhcnMgcmVmZXJlbmNlZCBmcm9tIEpTOiAke3J1bnRpbWVDc3NWYXJSZWZzLnNpemV9YCxcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi5jc3NcIik7XG5cdGxldCB0b3RhbEJlZm9yZSA9IDA7XG5cdGxldCB0b3RhbEFmdGVyID0gMDtcblxuXHRmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBkaXN0RGlyIH0pKSB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtkaXN0RGlyfS8ke3JlbFBhdGh9YDtcblx0XHRjb25zdCBvcmlnaW5hbENzcyA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgob3JpZ2luYWxDc3MsIFwidXRmLThcIik7XG5cdFx0dG90YWxCZWZvcmUgKz0gb3JpZ2luYWxTaXplO1xuXG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gUHJvY2Vzc2luZyAke3JlbFBhdGh9ICgkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQilgLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwdXJnZWQgPSBwdXJnZUNzc1dpdGhEYXRhYmFzZShvcmlnaW5hbENzcywgZGF0YWJhc2UsIHNhZmVsaXN0cyk7XG5cdFx0bGV0IHB1cmdlZENzcyA9IHB1cmdlZC5jc3M7XG5cdFx0Y29uc3QgYWZ0ZXJTZWxlY3RvcnMgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gICBzZWxlY3RvcnM6ICR7KG9yaWdpbmFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IC0+ICR7KGFmdGVyU2VsZWN0b3JzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7cHVyZ2VkLnJlcG9ydC5zZWxlY3RvcnNSZW1vdmVkfSByZW1vdmVkLCAke3B1cmdlZC5yZXBvcnQuc2VsZWN0b3JzS2VwdFVua25vd259IGtlcHQgdW5rbm93bilgLFxuXHRcdCk7XG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gICBhdHRycyBzZWVuOiAke3B1cmdlZC5yZXBvcnQuYXR0clNlbGVjdG9yc1NlZW59OyBrZXlmcmFtZXMgcmVtb3ZlZDogJHtwdXJnZWQucmVwb3J0LmtleWZyYW1lc1JlbW92ZWR9YCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdmFycyA9IGNsZWFuVW51c2VkVmFyc1dpdGhSZXBvcnQocHVyZ2VkQ3NzLCBydW50aW1lQ3NzVmFyUmVmcyk7XG5cdFx0cHVyZ2VkQ3NzID0gdmFycy5jc3M7XG5cdFx0Y29uc3QgYWZ0ZXJWYXJzID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtjc3MtcHVyZ2VdICAgdmFyczogJHsoYWZ0ZXJTZWxlY3RvcnMgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyhhZnRlclZhcnMgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHt2YXJzLnJlbW92ZWR9IHJlbW92ZWQpYCxcblx0XHQpO1xuXG5cdFx0cHVyZ2VkQ3NzID0gbWluaWZ5KHB1cmdlZENzcyk7XG5cdFx0Y29uc3QgZmluYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuXHRcdHRvdGFsQWZ0ZXIgKz0gZmluYWxTaXplO1xuXHRcdGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIG1pbmlmeTogLT4gJHsoZmluYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGBbY3NzLXB1cmdlXSAgIGZpbmFsOiAkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyhmaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHsoKDEgLSBmaW5hbFNpemUgLyBvcmlnaW5hbFNpemUpICogMTAwKS50b0ZpeGVkKDEpfSUgcmVkdWN0aW9uKWAsXG5cdFx0KTtcblxuXHRcdGF3YWl0IEJ1bi53cml0ZShmdWxsUGF0aCwgcHVyZ2VkQ3NzKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFxuXHRcdGBcXG5bY3NzLXB1cmdlXSBUb3RhbDogJHsodG90YWxCZWZvcmUgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyh0b3RhbEFmdGVyIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7KCgxIC0gdG90YWxBZnRlciAvIHRvdGFsQmVmb3JlKSAqIDEwMCkudG9GaXhlZCgxKX0lIHJlZHVjdGlvbilgLFxuXHQpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuXHRtYWluKCk7XG59XG5cbmV4cG9ydCB7XG5cdGNsZWFuVW51c2VkVmFycyxcblx0Y2xlYW5VbnVzZWRWYXJzV2l0aFJlcG9ydCxcblx0bm9ybWFsaXplUHVyZ2VEYXRhYmFzZSxcblx0cHVyZ2VDc3NXaXRoRGF0YWJhc2UsXG59O1xuZXhwb3J0IHR5cGUge1xuXHROb3JtYWxpemVkUHVyZ2VEYXRhYmFzZSxcblx0UHVyZ2VSZXN1bHQsXG5cdFNlbGVjdG9yUHVyZ2VSZXBvcnQsXG5cdFZhckNsZWFudXBSZXN1bHQsXG59O1xuIiwKICAgICJpbXBvcnQgaW5kZXggZnJvbSAnLi9pbmRleC5qcyc7XG5cbmNvbnN0IHsgdHJhbnNmb3JtLCB0cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSwgYnVuZGxlLCBidW5kbGVBc3luYywgYnJvd3NlcnNsaXN0VG9UYXJnZXRzLCBjb21wb3NlVmlzaXRvcnMsIEZlYXR1cmVzIH0gPSBpbmRleDtcbmV4cG9ydCB7IHRyYW5zZm9ybSwgdHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUsIGJ1bmRsZSwgYnVuZGxlQXN5bmMsIGJyb3dzZXJzbGlzdFRvVGFyZ2V0cywgY29tcG9zZVZpc2l0b3JzLCBGZWF0dXJlcyB9O1xuIiwKICAgICIvKipcbiAqIENvbnN1bWVyLXNpZGUgSlNYIHNjYW5uZXIuXG4gKlxuICogV2Fsa3MgYSBjb25zdW1lciBzb3VyY2UgdHJlZSwgcmVzb2x2ZXMgQHBhdGhzY2FsZS91aSBpbXBvcnRzIHdpdGggU1dDLCBhbmRcbiAqIHJlY29yZHMgY2Fub25pY2FsIGNvbXBvbmVudC9wYXJ0IHVzYWdlIHBsdXMgcHJvcCBmYWN0cyBmb3IgZGF0YWJhc2UtZmlyc3QgQ1NTXG4gKiBwdXJnZSBkZWNpc2lvbnMuXG4gKlxuICogVXNhZ2U6ICBidW4gcnVuIHNyYy9zY2FuLWNvbnN1bWVyLnRzIDxjb25zdW1lci1zcmMtZGlyPiA8cHVyZ2UtbWFuaWZlc3QuanNvbj5cbiAqL1xuXG5pbXBvcnQgc3djIGZyb20gXCJAc3djL2NvcmVcIjtcbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0IHtcblx0Y2xhc3Nlczoge1xuXHRcdGFsd2F5czogc3RyaW5nW107XG5cdFx0YnlQcm9wOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj47XG5cdH07XG5cdGF0dHJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cdGRlcHM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbXBvbmVudFB1cmdlUmVjb3JkIGV4dGVuZHMgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Qge1xuXHRrZXk/OiBzdHJpbmc7XG5cdGNvbXBvbmVudD86IHN0cmluZztcblx0cGFydD86IHN0cmluZztcblx0c2VsZWN0b3JzPzogc3RyaW5nW107XG5cdGF0dHJpYnV0ZVNlbGVjdG9ycz86IHN0cmluZ1tdO1xuXHRjc3NWYXJzPzoge1xuXHRcdGRlY2xhcmVkPzogc3RyaW5nW107XG5cdFx0cmVmZXJlbmNlZD86IHN0cmluZ1tdO1xuXHR9O1xuXHRrZXlmcmFtZXM/OiB7XG5cdFx0ZGVjbGFyZWQ/OiBzdHJpbmdbXTtcblx0XHRyZWZlcmVuY2VkPzogc3RyaW5nW107XG5cdH07XG59XG5cbmludGVyZmFjZSBQdXJnZURhdGFiYXNlVjIge1xuXHR2ZXJzaW9uOiAyO1xuXHRjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRQdXJnZVJlY29yZD47XG5cdHNoYXJlZD86IHtcblx0XHRzZWxlY3RvcnM/OiB1bmtub3duW107XG5cdFx0Y3NzVmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGtleWZyYW1lcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHR9O1xufVxuXG50eXBlIFB1cmdlTWFuaWZlc3QgPSBSZWNvcmQ8c3RyaW5nLCBMZWdhY3lDb21wb25lbnRNYW5pZmVzdD4gfCBQdXJnZURhdGFiYXNlVjI7XG5cbi8qKiBXaGF0IHdlIGNvbGxlY3QgcGVyIGNvbXBvbmVudCB1c2FnZSBmcm9tIEpTWCAqL1xuaW50ZXJmYWNlIFByb3BVc2FnZSB7XG5cdGNvbXBvbmVudDogc3RyaW5nO1xuXHRwcm9wczogTWFwPHN0cmluZywgc3RyaW5nIHwgXCJEWU5BTUlDXCI+O1xuXHRib29sZWFuUHJvcHM6IFNldDxzdHJpbmc+O1xuXHRoYXNTcHJlYWQ6IGJvb2xlYW47XG5cdHNvdXJjZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEltcG9ydEJpbmRpbmdzIHtcblx0Y29tcG9uZW50czogTWFwPHN0cmluZywgc3RyaW5nPjtcblx0bmFtZXNwYWNlczogTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG5cdGNvbnNlcnZhdGl2ZVVzYWdlczogUHJvcFVzYWdlW107XG59XG5cbmludGVyZmFjZSBTYWZlbGlzdHMge1xuXHRjbGFzc1NhZmVsaXN0OiBTZXQ8c3RyaW5nPjtcblx0YXR0clNhZmVsaXN0OiBTZXQ8c3RyaW5nPjtcblx0dXNlZENvbXBvbmVudHM6IFNldDxzdHJpbmc+O1xuXHRkeW5hbWljQ29tcG9uZW50czogU2V0PHN0cmluZz47XG59XG5cbnR5cGUgQXN0Tm9kZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLyDilIDilIAgQVNUIHdhbGtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gd2Fsa0FTVChub2RlOiB1bmtub3duLCB2aXNpdG9yOiAobm9kZTogQXN0Tm9kZSkgPT4gdm9pZCkge1xuXHRpZiAoIWlzUmVjb3JkKG5vZGUpKSByZXR1cm47XG5cdHZpc2l0b3Iobm9kZSk7XG5cdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG5cdFx0aWYgKGtleSA9PT0gXCJzcGFuXCIpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbCA9IG5vZGVba2V5XTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrQVNUKGl0ZW0sIHZpc2l0b3IpO1xuXHRcdH0gZWxzZSBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdHdhbGtBU1QodmFsLCB2aXNpdG9yKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24ga2ViYWJUb1Bhc2NhbChzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc1xuXHRcdC5zcGxpdChcIi1cIilcblx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0Lm1hcCgocCkgPT4gcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSkpXG5cdFx0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eQHBhdGhzY2FsZVxcL3VpXFwvY29tcG9uZW50c1xcLyhbXi9dKykvKTtcblx0aWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBrZWJhYlRvUGFzY2FsKG1hdGNoWzFdKTtcbn1cblxuZnVuY3Rpb24gaXNVaUltcG9ydChzb3VyY2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHNvdXJjZSBpcyBzdHJpbmcge1xuXHRyZXR1cm4gQm9vbGVhbihzb3VyY2U/LnN0YXJ0c1dpdGgoXCJAcGF0aHNjYWxlL3VpXCIpKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCBwcm9wID0gdmFsdWVba2V5XTtcblx0cmV0dXJuIHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiID8gcHJvcCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Qm9vbGVhbih2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHZhbHVlW2tleV0gPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldFBhdGhTdHJpbmcodmFsdWU6IHVua25vd24sIC4uLmtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGN1cnJlbnQgPSB2YWx1ZTtcblx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXHRcdGlmICghaXNSZWNvcmQoY3VycmVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y3VycmVudCA9IGN1cnJlbnRba2V5XTtcblx0fVxuXHRyZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRBcnJheSh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB1bmtub3duW10ge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFtdO1xuXHRjb25zdCBwcm9wID0gdmFsdWVba2V5XTtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcCkgPyBwcm9wIDogW107XG59XG5cbmZ1bmN0aW9uIGpvaW5QYXRoKGJhc2U6IHN0cmluZywgcmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gYCR7YmFzZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS8ke3JlbC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWA7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbEltcG9ydGVkTmFtZShzcGVjOiB1bmtub3duLCBzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCBpbXBvcnRlZE5hbWUgPVxuXHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJpbXBvcnRlZFwiLCBcInZhbHVlXCIpID8/XG5cdFx0Z2V0UGF0aFN0cmluZyhzcGVjLCBcImxvY2FsXCIsIFwidmFsdWVcIikgPz9cblx0XHRudWxsO1xuXG5cdGNvbnN0IGRlZXAgPSAoYzogc3RyaW5nLCB0Pzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG5cdFx0aWYgKHQgIT09IFwiSW1wb3J0U3BlY2lmaWVyXCIpIHJldHVybiBjO1xuXHRcdGlmICghaW1wb3J0ZWROYW1lKSByZXR1cm4gbnVsbDtcblx0XHRpZiAoaW1wb3J0ZWROYW1lID09PSBjKSByZXR1cm4gYztcblx0XHRyZXR1cm4gYCR7Y30uJHtpbXBvcnRlZE5hbWV9YDtcblx0fTtcblxuXHRjb25zdCB0eXBlID0gZ2V0U3RyaW5nKHNwZWMsIFwidHlwZVwiKTtcblx0aWYgKGdldEJvb2xlYW4oc3BlYywgXCJpc1R5cGVPbmx5XCIpKSByZXR1cm4gbnVsbDtcblx0Y29uc3QgZGVlcENvbXBvbmVudCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSk7XG5cdGlmIChkZWVwQ29tcG9uZW50KSByZXR1cm4gZGVlcChkZWVwQ29tcG9uZW50LCB0eXBlKTtcblxuXHRpZiAoc291cmNlID09PSBcIkBwYXRoc2NhbGUvdWlcIiAmJiB0eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKVxuXHRcdHJldHVybiBpbXBvcnRlZE5hbWU7XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbnNlcnZhdGl2ZVVzYWdlKGNvbXBvbmVudDogc3RyaW5nLCBzb3VyY2U6IHN0cmluZyk6IFByb3BVc2FnZSB7XG5cdHJldHVybiB7XG5cdFx0Y29tcG9uZW50LFxuXHRcdHByb3BzOiBuZXcgTWFwKCksXG5cdFx0Ym9vbGVhblByb3BzOiBuZXcgU2V0KCksXG5cdFx0aGFzU3ByZWFkOiB0cnVlLFxuXHRcdHNvdXJjZSxcblx0fTtcbn1cblxuLyoqIEV4dHJhY3QgQHBhdGhzY2FsZS91aSBiaW5kaW5ncyBmcm9tIGEgcGFyc2VkIG1vZHVsZS4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RVSUJpbmRpbmdzKGFzdDogdW5rbm93bik6IEltcG9ydEJpbmRpbmdzIHtcblx0Y29uc3QgYmluZGluZ3M6IEltcG9ydEJpbmRpbmdzID0ge1xuXHRcdGNvbXBvbmVudHM6IG5ldyBNYXAoKSxcblx0XHRuYW1lc3BhY2VzOiBuZXcgTWFwKCksXG5cdFx0Y29uc2VydmF0aXZlVXNhZ2VzOiBbXSxcblx0fTtcblxuXHRmb3IgKGNvbnN0IG5vZGUgb2YgZ2V0QXJyYXkoYXN0LCBcImJvZHlcIikpIHtcblx0XHRjb25zdCBub2RlVHlwZSA9IGdldFN0cmluZyhub2RlLCBcInR5cGVcIik7XG5cdFx0aWYgKG5vZGVUeXBlID09PSBcIkltcG9ydERlY2xhcmF0aW9uXCIpIHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IGdldFBhdGhTdHJpbmcobm9kZSwgXCJzb3VyY2VcIiwgXCJ2YWx1ZVwiKTtcblx0XHRcdGlmICghaXNVaUltcG9ydChzb3VyY2UpKSBjb250aW51ZTtcblxuXHRcdFx0Zm9yIChjb25zdCBzcGVjIG9mIGdldEFycmF5KG5vZGUsIFwic3BlY2lmaWVyc1wiKSkge1xuXHRcdFx0XHRjb25zdCBzcGVjVHlwZSA9IGdldFN0cmluZyhzcGVjLCBcInR5cGVcIik7XG5cdFx0XHRcdGlmIChzcGVjVHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIikge1xuXHRcdFx0XHRcdGNvbnN0IGxvY2FsID0gZ2V0UGF0aFN0cmluZyhzcGVjLCBcImxvY2FsXCIsIFwidmFsdWVcIik7XG5cdFx0XHRcdFx0Y29uc3QgY2Fub25pY2FsID0gY2Fub25pY2FsSW1wb3J0ZWROYW1lKHNwZWMsIHNvdXJjZSk7XG5cdFx0XHRcdFx0aWYgKGxvY2FsICYmIGNhbm9uaWNhbCkgYmluZGluZ3MuY29tcG9uZW50cy5zZXQobG9jYWwsIGNhbm9uaWNhbCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc3BlY1R5cGUgPT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgbG9jYWwgPSBnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRjb25zdCBjYW5vbmljYWwgPSBjb21wb25lbnRGcm9tRGVlcEltcG9ydChzb3VyY2UpID8/IGxvY2FsO1xuXHRcdFx0XHRcdGlmIChsb2NhbCAmJiBjYW5vbmljYWwpIGJpbmRpbmdzLmNvbXBvbmVudHMuc2V0KGxvY2FsLCBjYW5vbmljYWwpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNwZWNUeXBlID09PSBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgbG9jYWwgPSBnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRpZiAobG9jYWwpXG5cdFx0XHRcdFx0XHRiaW5kaW5ncy5uYW1lc3BhY2VzLnNldChsb2NhbCwgY29tcG9uZW50RnJvbURlZXBJbXBvcnQoc291cmNlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRub2RlVHlwZSA9PT0gXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIgJiZcblx0XHRcdGlzVWlJbXBvcnQoZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFzb3VyY2UpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZGVlcENvbXBvbmVudCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSk7XG5cdFx0XHRmb3IgKGNvbnN0IHNwZWMgb2YgZ2V0QXJyYXkobm9kZSwgXCJzcGVjaWZpZXJzXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGV4cG9ydGVkID1cblx0XHRcdFx0XHRnZXRQYXRoU3RyaW5nKHNwZWMsIFwib3JpZ1wiLCBcInZhbHVlXCIpID8/XG5cdFx0XHRcdFx0Z2V0UGF0aFN0cmluZyhzcGVjLCBcImxvY2FsXCIsIFwidmFsdWVcIikgPz9cblx0XHRcdFx0XHRnZXRQYXRoU3RyaW5nKHNwZWMsIFwiZXhwb3J0ZWRcIiwgXCJ2YWx1ZVwiKSA/P1xuXHRcdFx0XHRcdGRlZXBDb21wb25lbnQ7XG5cdFx0XHRcdGNvbnN0IGNhbm9uaWNhbCA9IGRlZXBDb21wb25lbnQgPz8gZXhwb3J0ZWQ7XG5cdFx0XHRcdGlmIChjYW5vbmljYWwpXG5cdFx0XHRcdFx0YmluZGluZ3MuY29uc2VydmF0aXZlVXNhZ2VzLnB1c2goXG5cdFx0XHRcdFx0XHRjb25zZXJ2YXRpdmVVc2FnZShjYW5vbmljYWwsIHNvdXJjZSksXG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRub2RlVHlwZSA9PT0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiICYmXG5cdFx0XHRpc1VpSW1wb3J0KGdldFBhdGhTdHJpbmcobm9kZSwgXCJzb3VyY2VcIiwgXCJ2YWx1ZVwiKSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IGdldFBhdGhTdHJpbmcobm9kZSwgXCJzb3VyY2VcIiwgXCJ2YWx1ZVwiKTtcblx0XHRcdGlmICghc291cmNlKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGRlZXBDb21wb25lbnQgPSBjb21wb25lbnRGcm9tRGVlcEltcG9ydChzb3VyY2UpO1xuXHRcdFx0aWYgKGRlZXBDb21wb25lbnQpIHtcblx0XHRcdFx0YmluZGluZ3MuY29uc2VydmF0aXZlVXNhZ2VzLnB1c2goXG5cdFx0XHRcdFx0Y29uc2VydmF0aXZlVXNhZ2UoZGVlcENvbXBvbmVudCwgc291cmNlKSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYmluZGluZ3M7XG59XG5cbi8qKiBCYWNrLWNvbXBhdGlibGUgaW1wb3J0IGV4dHJhY3Rpb24gQVBJOiBsb2NhbCBiaW5kaW5nIC0+IGNhbm9uaWNhbCBjb21wb25lbnQuICovXG5mdW5jdGlvbiBleHRyYWN0VUlJbXBvcnRzKGFzdDogdW5rbm93bik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuXHRyZXR1cm4gZXh0cmFjdFVJQmluZGluZ3MoYXN0KS5jb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBqc3hOYW1lUGFydHMobmFtZTogdW5rbm93bik6IHN0cmluZ1tdIHtcblx0aWYgKCFuYW1lKSByZXR1cm4gW107XG5cdGNvbnN0IHR5cGUgPSBnZXRTdHJpbmcobmFtZSwgXCJ0eXBlXCIpO1xuXHRjb25zdCB2YWx1ZSA9IGdldFN0cmluZyhuYW1lLCBcInZhbHVlXCIpO1xuXHRpZiAoKHR5cGUgPT09IFwiSWRlbnRpZmllclwiIHx8IHR5cGUgPT09IFwiSlNYSWRlbnRpZmllclwiKSAmJiB2YWx1ZSlcblx0XHRyZXR1cm4gW3ZhbHVlXTtcblx0aWYgKHR5cGUgPT09IFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdC4uLmpzeE5hbWVQYXJ0cyhpc1JlY29yZChuYW1lKSA/IG5hbWUub2JqZWN0IDogdW5kZWZpbmVkKSxcblx0XHRcdC4uLmpzeE5hbWVQYXJ0cyhpc1JlY29yZChuYW1lKSA/IG5hbWUucHJvcGVydHkgOiB1bmRlZmluZWQpLFxuXHRcdF07XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxDb21wb25lbnRGcm9tSnN4KFxuXHRwYXJ0czogc3RyaW5nW10sXG5cdGJpbmRpbmdzOiBJbXBvcnRCaW5kaW5ncyxcbik6IHN0cmluZyB8IG51bGwge1xuXHRpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblx0Y29uc3QgW3Jvb3QsIC4uLm1lbWJlcnNdID0gcGFydHM7XG5cblx0Y29uc3QgbmFtZXNwYWNlQ29tcG9uZW50ID0gYmluZGluZ3MubmFtZXNwYWNlcy5nZXQocm9vdCk7XG5cdGlmIChiaW5kaW5ncy5uYW1lc3BhY2VzLmhhcyhyb290KSkge1xuXHRcdGlmIChuYW1lc3BhY2VDb21wb25lbnQpIHtcblx0XHRcdGNvbnN0IGxvd2VyID0gbWVtYmVycy5tYXAoKG0pID0+IG0udG9Mb3dlckNhc2UoKSk7XG5cdFx0XHRyZXR1cm4gW25hbWVzcGFjZUNvbXBvbmVudCwgLi4ubG93ZXJdLmpvaW4oXCIuXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtYmVycy5qb2luKFwiLlwiKSB8fCBudWxsO1xuXHR9XG5cblx0Y29uc3Qgcm9vdENvbXBvbmVudCA9IGJpbmRpbmdzLmNvbXBvbmVudHMuZ2V0KHJvb3QpO1xuXHRpZiAoIXJvb3RDb21wb25lbnQpIHJldHVybiBudWxsO1xuXG5cdGNvbnN0IGxvd2VyID0gbWVtYmVycy5tYXAoKG0pID0+IG0udG9Mb3dlckNhc2UoKSk7XG5cdHJldHVybiBbcm9vdENvbXBvbmVudCwgLi4ubG93ZXJdLmpvaW4oXCIuXCIpO1xufVxuXG4vKiogRXh0cmFjdCBKU1ggdXNhZ2VzIG9mIFVJIGNvbXBvbmVudHMuICovXG5mdW5jdGlvbiBleHRyYWN0SlNYVXNhZ2VzKFxuXHRhc3Q6IHVua25vd24sXG5cdHVpQ29tcG9uZW50czogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IFByb3BVc2FnZVtdIHtcblx0Y29uc3QgYmluZGluZ3M6IEltcG9ydEJpbmRpbmdzID0ge1xuXHRcdGNvbXBvbmVudHM6IHVpQ29tcG9uZW50cyxcblx0XHRuYW1lc3BhY2VzOiBleHRyYWN0VUlCaW5kaW5ncyhhc3QpLm5hbWVzcGFjZXMsXG5cdFx0Y29uc2VydmF0aXZlVXNhZ2VzOiBbXSxcblx0fTtcblx0Y29uc3QgdXNhZ2VzOiBQcm9wVXNhZ2VbXSA9IFtdO1xuXG5cdHdhbGtBU1QoYXN0LCAobm9kZSkgPT4ge1xuXHRcdGlmIChnZXRTdHJpbmcobm9kZSwgXCJ0eXBlXCIpICE9PSBcIkpTWE9wZW5pbmdFbGVtZW50XCIpIHJldHVybjtcblxuXHRcdGNvbnN0IGNvbXBvbmVudCA9IGNhbm9uaWNhbENvbXBvbmVudEZyb21Kc3goXG5cdFx0XHRqc3hOYW1lUGFydHMobm9kZS5uYW1lKSxcblx0XHRcdGJpbmRpbmdzLFxuXHRcdCk7XG5cdFx0aWYgKCFjb21wb25lbnQpIHJldHVybjtcblxuXHRcdGNvbnN0IHVzYWdlOiBQcm9wVXNhZ2UgPSB7XG5cdFx0XHRjb21wb25lbnQsXG5cdFx0XHRwcm9wczogbmV3IE1hcCgpLFxuXHRcdFx0Ym9vbGVhblByb3BzOiBuZXcgU2V0KCksXG5cdFx0XHRoYXNTcHJlYWQ6IGZhbHNlLFxuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IGF0dHIgb2YgZ2V0QXJyYXkobm9kZSwgXCJhdHRyaWJ1dGVzXCIpKSB7XG5cdFx0XHRjb25zdCBhdHRyVHlwZSA9IGdldFN0cmluZyhhdHRyLCBcInR5cGVcIik7XG5cdFx0XHRpZiAoYXR0clR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8IGF0dHJUeXBlID09PSBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSB7XG5cdFx0XHRcdHVzYWdlLmhhc1NwcmVhZCA9IHRydWU7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGF0dHJUeXBlICE9PSBcIkpTWEF0dHJpYnV0ZVwiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgcHJvcE5hbWUgPSBnZXRQYXRoU3RyaW5nKGF0dHIsIFwibmFtZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFwcm9wTmFtZSkgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGF0dHJWYWx1ZSA9IGlzUmVjb3JkKGF0dHIpID8gYXR0ci52YWx1ZSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGF0dHJWYWx1ZVR5cGUgPSBnZXRTdHJpbmcoYXR0clZhbHVlLCBcInR5cGVcIik7XG5cdFx0XHRpZiAoIWF0dHJWYWx1ZSkge1xuXHRcdFx0XHR1c2FnZS5ib29sZWFuUHJvcHMuYWRkKHByb3BOYW1lKTtcblx0XHRcdH0gZWxzZSBpZiAoYXR0clZhbHVlVHlwZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcblx0XHRcdFx0dXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBnZXRTdHJpbmcoYXR0clZhbHVlLCBcInZhbHVlXCIpID8/IFwiXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBcIkRZTkFNSUNcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dXNhZ2VzLnB1c2godXNhZ2UpO1xuXHR9KTtcblxuXHRyZXR1cm4gdXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFuaWZlc3QgY29tcGF0aWJpbGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gbWFuaWZlc3RDb21wb25lbnRzKFxuXHRtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCxcbik6IFJlY29yZDxzdHJpbmcsIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0PiB7XG5cdGlmIChpc1B1cmdlRGF0YWJhc2VWMihtYW5pZmVzdCkpIHtcblx0XHRyZXR1cm4gbWFuaWZlc3QuY29tcG9uZW50cztcblx0fVxuXHRyZXR1cm4gbWFuaWZlc3QgYXMgUmVjb3JkPHN0cmluZywgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Q+O1xufVxuXG5mdW5jdGlvbiBpc1B1cmdlRGF0YWJhc2VWMihcblx0bWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QsXG4pOiBtYW5pZmVzdCBpcyBQdXJnZURhdGFiYXNlVjIge1xuXHRyZXR1cm4gKFxuXHRcdChtYW5pZmVzdCBhcyBQdXJnZURhdGFiYXNlVjIpLnZlcnNpb24gPT09IDIgJiZcblx0XHRpc1JlY29yZCgobWFuaWZlc3QgYXMgUHVyZ2VEYXRhYmFzZVYyKS5jb21wb25lbnRzKVxuXHQpO1xufVxuXG4vLyDilIDilIAgU2FmZWxpc3QgYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYnVpbGRTYWZlbGlzdHMoXG5cdGFsbFVzYWdlczogUHJvcFVzYWdlW10sXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0LFxuKTogU2FmZWxpc3RzIHtcblx0Y29uc3QgY2xhc3NTYWZlbGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRjb25zdCBhdHRyU2FmZWxpc3QgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgdXNlZENvbXBvbmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgZHluYW1pY0NvbXBvbmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgY29tcG9uZW50VXNhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPigpO1xuXHRjb25zdCBjb21wb25lbnRzID0gbWFuaWZlc3RDb21wb25lbnRzKG1hbmlmZXN0KTtcblxuXHRmb3IgKGNvbnN0IHVzYWdlIG9mIGV4cGFuZERlcGVuZGVuY3lVc2FnZXMoYWxsVXNhZ2VzLCBjb21wb25lbnRzKSkge1xuXHRcdGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50VXNhZ2VzLmdldCh1c2FnZS5jb21wb25lbnQpID8/IFtdO1xuXHRcdGV4aXN0aW5nLnB1c2godXNhZ2UpO1xuXHRcdGNvbXBvbmVudFVzYWdlcy5zZXQodXNhZ2UuY29tcG9uZW50LCBleGlzdGluZyk7XG5cdFx0dXNlZENvbXBvbmVudHMuYWRkKHVzYWdlLmNvbXBvbmVudCk7XG5cdFx0aWYgKHVzYWdlLmhhc1NwcmVhZCB8fCBbLi4udXNhZ2UucHJvcHMudmFsdWVzKCldLmluY2x1ZGVzKFwiRFlOQU1JQ1wiKSkge1xuXHRcdFx0ZHluYW1pY0NvbXBvbmVudHMuYWRkKHVzYWdlLmNvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChjb25zdCBbZW50cnlOYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcblx0XHRjb25zdCBtYXRjaGluZ1VzYWdlcyA9IGZpbmRNYXRjaGluZ1VzYWdlcyhlbnRyeU5hbWUsIGNvbXBvbmVudFVzYWdlcyk7XG5cdFx0aWYgKG1hdGNoaW5nVXNhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cblx0XHR1c2VkQ29tcG9uZW50cy5hZGQoZW50cnlOYW1lKTtcblxuXHRcdGZvciAoY29uc3QgY2xzIG9mIGVudHJ5LmNsYXNzZXMuYWx3YXlzKSB7XG5cdFx0XHRjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgW3Byb3BPclNsb3QsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyeS5jbGFzc2VzLmJ5UHJvcCkpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoaXNQcm9wVXNlZChwcm9wT3JTbG90LCBtYXRjaGluZ1VzYWdlcykpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNscyBvZiB2YWx1ZSkgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdXNlZFZhbHVlcyA9IGdldFVzZWRFbnVtVmFsdWVzKHByb3BPclNsb3QsIG1hdGNoaW5nVXNhZ2VzKTtcblx0XHRcdFx0aWYgKHVzZWRWYWx1ZXMgPT09IFwiQUxMXCIpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY2xzIG9mIGNsYXNzZXMpIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdmFsIG9mIHVzZWRWYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZVt2YWxdKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY2xzIG9mIHZhbHVlW3ZhbF0pIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGVudHJ5LmF0dHJzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtwcm9wTmFtZSwgYXR0ck1hcF0gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkuYXR0cnMpKSB7XG5cdFx0XHRcdGlmIChpc1Byb3BVc2VkKHByb3BOYW1lLCBtYXRjaGluZ1VzYWdlcykpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IFthdHRyLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJNYXApKSB7XG5cdFx0XHRcdFx0XHRhdHRyU2FmZWxpc3QuYWRkKGBbJHthdHRyfT1cIiR7dmFsfVwiXWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IGNsYXNzU2FmZWxpc3QsIGF0dHJTYWZlbGlzdCwgdXNlZENvbXBvbmVudHMsIGR5bmFtaWNDb21wb25lbnRzIH07XG59XG5cbmZ1bmN0aW9uIGV4cGFuZERlcGVuZGVuY3lVc2FnZXMoXG5cdGFsbFVzYWdlczogUHJvcFVzYWdlW10sXG5cdG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBMZWdhY3lDb21wb25lbnRNYW5pZmVzdD4sXG4pOiBQcm9wVXNhZ2VbXSB7XG5cdGNvbnN0IHJlc3VsdCA9IFsuLi5hbGxVc2FnZXNdO1xuXHRjb25zdCBxdWV1ZSA9IFsuLi5hbGxVc2FnZXMubWFwKCh1c2FnZSkgPT4gcm9vdENvbXBvbmVudCh1c2FnZS5jb21wb25lbnQpKV07XG5cdGNvbnN0IHNlZW4gPSBuZXcgU2V0KHF1ZXVlKTtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHJvb3QgPSBxdWV1ZS5wb3AoKTtcblx0XHRpZiAoIXJvb3QpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IGRlcHMgPSBkZXBzRm9yUm9vdChyb290LCBtYW5pZmVzdCk7XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuXHRcdFx0aWYgKHNlZW4uaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0c2Vlbi5hZGQoZGVwKTtcblx0XHRcdHF1ZXVlLnB1c2goZGVwKTtcblx0XHRcdHJlc3VsdC5wdXNoKGNvbnNlcnZhdGl2ZVVzYWdlKGRlcCwgXCJtYW5pZmVzdC1kZXBlbmRlbmN5XCIpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBkZXBzRm9yUm9vdChcblx0cm9vdDogc3RyaW5nLFxuXHRtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Q+LFxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBkZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0KSkge1xuXHRcdGlmIChyb290Q29tcG9uZW50KGtleSkgIT09IHJvb3QpIGNvbnRpbnVlO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIGVudHJ5LmRlcHMgPz8gW10pIGRlcHMuYWRkKGRlcCk7XG5cdH1cblx0cmV0dXJuIFsuLi5kZXBzXTtcbn1cblxuZnVuY3Rpb24gcm9vdENvbXBvbmVudChjb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBjb21wb25lbnQuc3BsaXQoXCIuXCIpWzBdO1xufVxuXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdVc2FnZXMoXG5cdGVudHJ5TmFtZTogc3RyaW5nLFxuXHR1c2FnZU1hcDogTWFwPHN0cmluZywgUHJvcFVzYWdlW10+LFxuKTogUHJvcFVzYWdlW10ge1xuXHRjb25zdCBkaXJlY3QgPSB1c2FnZU1hcC5nZXQoZW50cnlOYW1lKSA/PyBbXTtcblx0Y29uc3QgcmVzdWx0cyA9IFsuLi5kaXJlY3RdO1xuXHRjb25zdCBlbnRyeVJvb3QgPSByb290Q29tcG9uZW50KGVudHJ5TmFtZSk7XG5cblx0Zm9yIChjb25zdCBbdXNhZ2VOYW1lLCB1c2FnZXNdIG9mIHVzYWdlTWFwKSB7XG5cdFx0aWYgKHVzYWdlTmFtZSA9PT0gZW50cnlOYW1lKSBjb250aW51ZTtcblx0XHRpZiAoZW50cnlOYW1lLmluY2x1ZGVzKFwiLlwiKSAmJiB1c2FnZU5hbWUgPT09IGVudHJ5Um9vdCkge1xuXHRcdFx0cmVzdWx0cy5wdXNoKC4uLnVzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGlzUHJvcFVzZWQocHJvcE5hbWU6IHN0cmluZywgdXNhZ2VzOiBQcm9wVXNhZ2VbXSk6IGJvb2xlYW4ge1xuXHRmb3IgKGNvbnN0IHVzYWdlIG9mIHVzYWdlcykge1xuXHRcdGlmICh1c2FnZS5oYXNTcHJlYWQpIHJldHVybiB0cnVlO1xuXHRcdGlmICh1c2FnZS5ib29sZWFuUHJvcHMuaGFzKHByb3BOYW1lKSkgcmV0dXJuIHRydWU7XG5cdFx0aWYgKHVzYWdlLnByb3BzLmhhcyhwcm9wTmFtZSkpIHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlZEVudW1WYWx1ZXMoXG5cdHNsb3ROYW1lOiBzdHJpbmcsXG5cdHVzYWdlczogUHJvcFVzYWdlW10sXG4pOiBTZXQ8c3RyaW5nPiB8IFwiQUxMXCIge1xuXHRjb25zdCB2YWx1ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Zm9yIChjb25zdCB1c2FnZSBvZiB1c2FnZXMpIHtcblx0XHRpZiAodXNhZ2UuaGFzU3ByZWFkKSByZXR1cm4gXCJBTExcIjtcblx0XHRjb25zdCB2YWwgPSB1c2FnZS5wcm9wcy5nZXQoc2xvdE5hbWUpO1xuXHRcdGlmICh2YWwgPT09IFwiRFlOQU1JQ1wiKSByZXR1cm4gXCJBTExcIjtcblx0XHRpZiAodmFsICE9PSB1bmRlZmluZWQpIHZhbHVlcy5hZGQodmFsKTtcblx0XHRpZiAodXNhZ2UuYm9vbGVhblByb3BzLmhhcyhzbG90TmFtZSkpIHJldHVybiBcIkFMTFwiO1xuXHR9XG5cdHJldHVybiB2YWx1ZXM7XG59XG5cbi8vIOKUgOKUgCBDb25zdW1lciBzb3VyY2Ugc2Nhbm5pbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmFzeW5jIGZ1bmN0aW9uIHNjYW5Db25zdW1lclNvdXJjZShzcmNEaXI6IHN0cmluZyk6IFByb21pc2U8UHJvcFVzYWdlW10+IHtcblx0Y29uc3QgYWxsVXNhZ2VzOiBQcm9wVXNhZ2VbXSA9IFtdO1xuXHRjb25zdCBnbG9iID0gbmV3IEdsb2IoXCIqKi8qLnt0c3gsdHMsanN4LGpzfVwiKTtcblxuXHRmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBzcmNEaXIgfSkpIHtcblx0XHRpZiAocmVsUGF0aC5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKSkgY29udGludWU7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luUGF0aChzcmNEaXIsIHJlbFBhdGgpO1xuXHRcdGNvbnN0IGNvZGUgPSBhd2FpdCBCdW4uZmlsZShmdWxsUGF0aCkudGV4dCgpO1xuXHRcdGlmICghY29kZS5pbmNsdWRlcyhcIkBwYXRoc2NhbGUvdWlcIikpIGNvbnRpbnVlO1xuXG5cdFx0Y29uc3QgaXNUc3ggPSAvXFwuW3RqXXN4JC8udGVzdChyZWxQYXRoKTtcblx0XHRjb25zdCBhc3QgPSBhd2FpdCBzd2MucGFyc2UoY29kZSwgeyBzeW50YXg6IFwidHlwZXNjcmlwdFwiLCB0c3g6IGlzVHN4IH0pO1xuXHRcdGNvbnN0IGJpbmRpbmdzID0gZXh0cmFjdFVJQmluZGluZ3MoYXN0KTtcblx0XHRpZiAoXG5cdFx0XHRiaW5kaW5ncy5jb21wb25lbnRzLnNpemUgPT09IDAgJiZcblx0XHRcdGJpbmRpbmdzLm5hbWVzcGFjZXMuc2l6ZSA9PT0gMCAmJlxuXHRcdFx0YmluZGluZ3MuY29uc2VydmF0aXZlVXNhZ2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0YWxsVXNhZ2VzLnB1c2goLi4uYmluZGluZ3MuY29uc2VydmF0aXZlVXNhZ2VzKTtcblx0XHRjb25zdCBqc3hVc2FnZXMgPSBleHRyYWN0SlNYVXNhZ2VzKGFzdCwgYmluZGluZ3MuY29tcG9uZW50cyk7XG5cdFx0YWxsVXNhZ2VzLnB1c2goLi4uanN4VXNhZ2VzKTtcblx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBiaW5kaW5ncy5jb21wb25lbnRzLnZhbHVlcygpKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGpzeFVzYWdlcy5zb21lKFxuXHRcdFx0XHRcdCh1c2FnZSkgPT5cblx0XHRcdFx0XHRcdHVzYWdlLmNvbXBvbmVudCA9PT0gY29tcG9uZW50IHx8XG5cdFx0XHRcdFx0XHR1c2FnZS5jb21wb25lbnQuc3RhcnRzV2l0aChgJHtjb21wb25lbnR9LmApLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRhbGxVc2FnZXMucHVzaChjb25zZXJ2YXRpdmVVc2FnZShjb21wb25lbnQsIFwiaW1wb3J0LXdpdGhvdXQtZGlyZWN0LWpzeFwiKSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGFsbFVzYWdlcztcbn1cblxuLy8g4pSA4pSAIE1haW4gKHN0YW5kYWxvbmUgQ0xJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcblx0Y29uc3QgW3NyY0RpciwgbWFuaWZlc3RQYXRoXSA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcblx0aWYgKCFzcmNEaXIgfHwgIW1hbmlmZXN0UGF0aCkge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcIlVzYWdlOiBidW4gcnVuIHNyYy9zY2FuLWNvbnN1bWVyLnRzIDxjb25zdW1lci1zcmMtZGlyPiA8cHVyZ2UtbWFuaWZlc3QuanNvbj5cIixcblx0XHQpO1xuXHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0fVxuXG5cdGNvbnN0IG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0ID0gSlNPTi5wYXJzZShcblx0XHRhd2FpdCBCdW4uZmlsZShtYW5pZmVzdFBhdGgpLnRleHQoKSxcblx0KTtcblx0Y29uc3QgcmVzb2x2ZWRTcmMgPSBzcmNEaXI7XG5cdGNvbnN0IG1hbmlmZXN0U2l6ZSA9IE9iamVjdC5rZXlzKG1hbmlmZXN0Q29tcG9uZW50cyhtYW5pZmVzdCkpLmxlbmd0aDtcblx0Y29uc29sZS5sb2coYFNjYW5uaW5nICR7cmVzb2x2ZWRTcmN9IGZvciBAcGF0aHNjYWxlL3VpIGNvbXBvbmVudCB1c2FnZS4uLmApO1xuXHRjb25zb2xlLmxvZyhgTWFuaWZlc3Q6ICR7bWFuaWZlc3RTaXplfSBlbnRyaWVzXFxuYCk7XG5cblx0Y29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHJlc29sdmVkU3JjKTtcblx0Y29uc3QgeyBjbGFzc1NhZmVsaXN0LCBhdHRyU2FmZWxpc3QsIHVzZWRDb21wb25lbnRzIH0gPSBidWlsZFNhZmVsaXN0cyhcblx0XHR1c2FnZXMsXG5cdFx0bWFuaWZlc3QsXG5cdCk7XG5cblx0Y29uc29sZS5sb2coXCI9PT0gQ29tcG9uZW50cyBEZXRlY3RlZCA9PT1cIik7XG5cdGZvciAoY29uc3QgY29tcG9uZW50IG9mIFsuLi51c2VkQ29tcG9uZW50c10uc29ydCgpKSB7XG5cdFx0Y29uc29sZS5sb2coYCAgJHtjb21wb25lbnR9YCk7XG5cdH1cblxuXHRjb25zb2xlLmxvZyhcIlxcbj09PSBDbGFzcyBTYWZlbGlzdCA9PT1cIik7XG5cdGZvciAoY29uc3QgY2xzIG9mIFsuLi5jbGFzc1NhZmVsaXN0XS5zb3J0KCkpIHtcblx0XHRjb25zb2xlLmxvZyhgICAke2Nsc31gKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFwiXFxuPT09IEF0dHJpYnV0ZSBTYWZlbGlzdCA9PT1cIik7XG5cdGZvciAoY29uc3QgYXR0ciBvZiBbLi4uYXR0clNhZmVsaXN0XS5zb3J0KCkpIHtcblx0XHRjb25zb2xlLmxvZyhgICAke2F0dHJ9YCk7XG5cdH1cblxuXHRjb25zb2xlLmxvZyhcblx0XHRgXFxuVG90YWw6ICR7dXNlZENvbXBvbmVudHMuc2l6ZX0gY29tcG9uZW50cywgJHtjbGFzc1NhZmVsaXN0LnNpemV9IGNsYXNzZXMsICR7YXR0clNhZmVsaXN0LnNpemV9IGF0dHJpYnV0ZSBzZWxlY3RvcnNgLFxuXHQpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuXHRtYWluKCk7XG59XG5cbmV4cG9ydCB7XG5cdGJ1aWxkU2FmZWxpc3RzLFxuXHRleHRyYWN0SlNYVXNhZ2VzLFxuXHRleHRyYWN0VUlJbXBvcnRzLFxuXHRzY2FuQ29uc3VtZXJTb3VyY2UsXG59O1xuZXhwb3J0IHR5cGUge1xuXHRMZWdhY3lDb21wb25lbnRNYW5pZmVzdCBhcyBDb21wb25lbnRNYW5pZmVzdCxcblx0Q29tcG9uZW50UHVyZ2VSZWNvcmQsXG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0LFxuXHRQcm9wVXNhZ2UsXG5cdFB1cmdlRGF0YWJhc2VWMixcblx0UHVyZ2VNYW5pZmVzdCxcblx0U2FmZWxpc3RzLFxufTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUtBLElBQU0sVUFBVSxNQUFNLFFBQVEsYUFBYTtBQUFBLEVBRTNDLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBTSxZQUFZLE1BQU07QUFBQSxJQUN0QixJQUFJLENBQUMsUUFBUTtBQUFBLE1BRVgsSUFBSSxRQUFRLEtBQUssUUFBUSxRQUFRO0FBQUEsUUFDL0IsTUFBTSxPQUFPLFFBQVEsT0FBTztBQUFBLFFBQzVCLFFBQVEsT0FBTyxpQkFBaUI7QUFBQSxRQUNoQyxTQUFTLFFBQVEsT0FBTyxVQUFVO0FBQUEsUUFDbEMsUUFBUSxPQUFPLGlCQUFpQjtBQUFBLE1BQ2xDLEVBQU87QUFBQSxRQUNMLFNBQVMsQ0FBQztBQUFBO0FBQUEsSUFFZDtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxPQUFPLFVBQVUsRUFBRSxTQUFTLFVBQVU7QUFBQTs7OztFQ2xCdEMsSUFBTTtBQUFBLEVBRU4sSUFBTSxXQUFXO0FBQUEs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RCxNQUFNLGVBQWUsT0FBTyxXQUFXLGFBQWEsT0FBTztBQUFBLElBQzNELGVBQWU7QUFBQSxJQUVmLFFBQVEsSUFDUCwwQkFBMEIsYUFBYSxlQUFlLE1BQU0sUUFBUSxDQUFDLE9BQ3RFO0FBQUEsSUFFQSxNQUFNLFNBQVMscUJBQXFCLGFBQWEsVUFBVSxTQUFTO0FBQUEsSUFDcEUsSUFBSSxZQUFZLE9BQU87QUFBQSxJQUN2QixNQUFNLGlCQUFpQixPQUFPLFdBQVcsV0FBVyxPQUFPO0FBQUEsSUFDM0QsUUFBUSxJQUNQLDZCQUE2QixlQUFlLE1BQU0sUUFBUSxDQUFDLFNBQVMsaUJBQWlCLE1BQU0sUUFBUSxDQUFDLFNBQVMsT0FBTyxPQUFPLDZCQUE2QixPQUFPLE9BQU8sb0NBQ3ZLO0FBQUEsSUFDQSxRQUFRLElBQ1AsNkJBQTZCLE9BQU8sT0FBTyx5Q0FBeUMsT0FBTyxPQUFPLGtCQUNuRztBQUFBLElBRUEsTUFBTSxPQUFPLDBCQUEwQixXQUFXLGlCQUFpQjtBQUFBLElBQ25FLFlBQVksS0FBSztBQUFBLElBQ2pCLE1BQU0sWUFBWSxPQUFPLFdBQVcsV0FBVyxPQUFPO0FBQUEsSUFDdEQsUUFBUSxJQUNQLHdCQUF3QixpQkFBaUIsTUFBTSxRQUFRLENBQUMsU0FBUyxZQUFZLE1BQU0sUUFBUSxDQUFDLFNBQVMsS0FBSyxrQkFDM0c7QUFBQSxJQUVBLFlBQVksT0FBTyxTQUFTO0FBQUEsSUFDNUIsTUFBTSxZQUFZLE9BQU8sV0FBVyxXQUFXLE9BQU87QUFBQSxJQUN0RCxjQUFjO0FBQUEsSUFDZCxRQUFRLElBQUksNkJBQTZCLFlBQVksTUFBTSxRQUFRLENBQUMsTUFBTTtBQUFBLElBQzFFLFFBQVEsSUFDUCx5QkFBeUIsZUFBZSxNQUFNLFFBQVEsQ0FBQyxTQUFTLFlBQVksTUFBTSxRQUFRLENBQUMsV0FBVyxJQUFJLFlBQVksZ0JBQWdCLEtBQUssUUFBUSxDQUFDLGVBQ3JKO0FBQUEsSUFFQSxNQUFNLElBQUksTUFBTSxVQUFVLFNBQVM7QUFBQSxFQUNwQztBQUFBLEVBRUEsUUFBUSxJQUNQO0FBQUEsc0JBQXlCLGNBQWMsTUFBTSxRQUFRLENBQUMsU0FBUyxhQUFhLE1BQU0sUUFBUSxDQUFDLFdBQVcsSUFBSSxhQUFhLGVBQWUsS0FBSyxRQUFRLENBQUMsZUFDcko7QUFBQTtBQUdELElBQUksa0JBQWtCO0FBQUEsRUFDckIsS0FBSztBQUNOOyIsCiAgImRlYnVnSWQiOiAiNDQxODkzRjA3NzM2NEZFNjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=