wxt 0.0.2 → 0.1.1-alpha1

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/cli.cjs CHANGED
@@ -27,7 +27,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  var import_cac = __toESM(require("cac"), 1);
28
28
 
29
29
  // package.json
30
- var version = "0.0.2";
30
+ var version = "0.1.1-alpha1";
31
31
 
32
32
  // src/core/utils/getInternalConfig.ts
33
33
  var import_node_path3 = __toESM(require("path"), 1);
@@ -40,24 +40,26 @@ var import_jiti = __toESM(require("jiti"), 1);
40
40
  var import_babel = __toESM(require("jiti/dist/babel"), 1);
41
41
  var import_path = require("path");
42
42
  var import_unimport = require("unimport");
43
+ var import_fs_extra = __toESM(require("fs-extra"), 1);
43
44
  async function importTsFile(root, path5) {
44
- const clientImports = await (0, import_unimport.scanExports)(
45
+ const unimport2 = (0, import_unimport.createUnimport)({});
46
+ await unimport2.scanImportsFromFile(
45
47
  (0, import_path.resolve)(root, "node_modules/wxt/dist/client.js")
46
48
  );
49
+ const text = await import_fs_extra.default.readFile(path5, "utf-8");
50
+ const res = await unimport2.injectImports(text, path5);
51
+ const transformedText = res.code;
47
52
  const jiti = (0, import_jiti.default)(__filename, {
48
53
  cache: false,
49
54
  esmResolve: true,
50
55
  interopDefault: true,
56
+ alias: {
57
+ "webextension-polyfill": "wxt"
58
+ },
51
59
  transform(opts) {
60
+ if (opts.filename === path5)
61
+ opts.source = transformedText;
52
62
  opts.source = opts.source.replace(/^import ['"].*\.css['"];?$/gm, "");
53
- opts.source = opts.source.replace(
54
- /^import\s+.*\s+from ['"]webextension-polyfill['"];?$/gm,
55
- ""
56
- );
57
- if (opts.filename === path5) {
58
- const imports = clientImports.map((i) => `import { ${i.name} } from "${i.from}";`).join("\n") + "\n";
59
- opts.source = imports + opts.source;
60
- }
61
63
  return (0, import_babel.default)(opts);
62
64
  }
63
65
  });
@@ -240,7 +242,7 @@ function download(config) {
240
242
 
241
243
  // src/core/vite-plugins/multipageMove.ts
242
244
  var import_node_path2 = require("path");
243
- var import_fs_extra = __toESM(require("fs-extra"), 1);
245
+ var import_fs_extra2 = __toESM(require("fs-extra"), 1);
244
246
  function multipageMove(entrypoints, config) {
245
247
  return {
246
248
  name: "wxt:multipage-move",
@@ -267,8 +269,8 @@ function multipageMove(entrypoints, config) {
267
269
  }
268
270
  const oldAbsPath = (0, import_node_path2.resolve)(config.outDir, oldBundlePath);
269
271
  const newAbsPath = (0, import_node_path2.resolve)(config.outDir, newBundlePath);
270
- await (0, import_fs_extra.ensureDir)((0, import_node_path2.dirname)(newAbsPath));
271
- await import_fs_extra.default.move(oldAbsPath, newAbsPath, { overwrite: true });
272
+ await (0, import_fs_extra2.ensureDir)((0, import_node_path2.dirname)(newAbsPath));
273
+ await import_fs_extra2.default.move(oldAbsPath, newAbsPath, { overwrite: true });
272
274
  const renamedChunk = {
273
275
  ...bundle[oldBundlePath],
274
276
  fileName: newBundlePath
@@ -318,7 +320,7 @@ function unimport(config) {
318
320
  }
319
321
 
320
322
  // src/core/vite-plugins/virtualEntrypoint.ts
321
- var import_fs_extra2 = __toESM(require("fs-extra"), 1);
323
+ var import_fs_extra3 = __toESM(require("fs-extra"), 1);
322
324
  var import_path3 = require("path");
323
325
  function virtualEntrypoin(type, config) {
324
326
  const virtualId = `virtual:wxt-${type}?`;
@@ -336,7 +338,7 @@ function virtualEntrypoin(type, config) {
336
338
  if (!id.startsWith(resolvedVirtualId))
337
339
  return;
338
340
  const inputPath = id.replace(resolvedVirtualId, "");
339
- const template = await import_fs_extra2.default.readFile(
341
+ const template = await import_fs_extra3.default.readFile(
340
342
  (0, import_path3.resolve)(
341
343
  config.root,
342
344
  `node_modules/wxt/dist/virtual-modules/${type}-entrypoint.js`
@@ -349,20 +351,20 @@ function virtualEntrypoin(type, config) {
349
351
  }
350
352
 
351
353
  // src/core/utils/createFsCache.ts
352
- var import_fs_extra3 = __toESM(require("fs-extra"), 1);
354
+ var import_fs_extra4 = __toESM(require("fs-extra"), 1);
353
355
  var import_path4 = require("path");
354
356
  function createFsCache(wxtDir) {
355
357
  const getPath = (key) => (0, import_path4.resolve)(wxtDir, "cache", encodeURIComponent(key));
356
358
  return {
357
359
  async set(key, value) {
358
360
  const path5 = getPath(key);
359
- await (0, import_fs_extra3.ensureDir)((0, import_path4.dirname)(path5));
360
- await import_fs_extra3.default.writeFile(path5, value, "utf-8");
361
+ await (0, import_fs_extra4.ensureDir)((0, import_path4.dirname)(path5));
362
+ await import_fs_extra4.default.writeFile(path5, value, "utf-8");
361
363
  },
362
364
  async get(key) {
363
365
  const path5 = getPath(key);
364
366
  try {
365
- return await import_fs_extra3.default.readFile(path5, "utf-8");
367
+ return await import_fs_extra4.default.readFile(path5, "utf-8");
366
368
  } catch {
367
369
  return void 0;
368
370
  }
@@ -501,15 +503,246 @@ async function getInternalConfig(config, command) {
501
503
  return finalConfig;
502
504
  }
503
505
 
506
+ // src/index.ts
507
+ var import_picocolors3 = __toESM(require("picocolors"), 1);
508
+ var vite6 = __toESM(require("vite"), 1);
509
+
510
+ // src/core/utils/arrays.ts
511
+ function every(array, predicate) {
512
+ for (let i = 0; i < array.length; i++)
513
+ if (!predicate(array[i], i))
514
+ return false;
515
+ return true;
516
+ }
517
+
518
+ // src/core/utils/detectDevChanges.ts
519
+ function detectDevChanges(changedFiles, currentOutput) {
520
+ if (currentOutput == null)
521
+ return { type: "no-change" };
522
+ const changedSteps = new Set(
523
+ changedFiles.flatMap(
524
+ (changedFile) => findEffectedSteps(changedFile, currentOutput)
525
+ )
526
+ );
527
+ if (changedSteps.size === 0)
528
+ return { type: "no-change" };
529
+ const unchangedOutput = {
530
+ manifest: currentOutput.manifest,
531
+ steps: [],
532
+ publicAssets: []
533
+ };
534
+ const changedOutput = {
535
+ manifest: currentOutput.manifest,
536
+ steps: [],
537
+ publicAssets: []
538
+ };
539
+ for (const step of currentOutput.steps) {
540
+ if (changedSteps.has(step)) {
541
+ changedOutput.steps.push(step);
542
+ } else {
543
+ unchangedOutput.steps.push(step);
544
+ }
545
+ }
546
+ for (const asset of currentOutput.publicAssets) {
547
+ if (changedSteps.has(asset)) {
548
+ changedOutput.publicAssets.push(asset);
549
+ } else {
550
+ unchangedOutput.publicAssets.push(asset);
551
+ }
552
+ }
553
+ const isOnlyHtmlChanges = changedFiles.length > 0 && every(changedFiles, ([_, file]) => file.endsWith(".html"));
554
+ if (isOnlyHtmlChanges) {
555
+ return {
556
+ type: "html-reload",
557
+ cachedOutput: unchangedOutput,
558
+ rebuildGroups: changedOutput.steps.map((step) => step.entrypoints)
559
+ };
560
+ }
561
+ const isOnlyContentScripts = changedOutput.steps.length > 0 && every(
562
+ changedOutput.steps.flatMap((step) => step.entrypoints),
563
+ (entry) => entry.type === "content-script"
564
+ );
565
+ if (isOnlyContentScripts) {
566
+ return {
567
+ type: "content-script-reload",
568
+ cachedOutput: unchangedOutput,
569
+ changedSteps: changedOutput.steps,
570
+ rebuildGroups: changedOutput.steps.map((step) => step.entrypoints)
571
+ };
572
+ }
573
+ return {
574
+ type: "extension-reload",
575
+ cachedOutput: unchangedOutput,
576
+ rebuildGroups: changedOutput.steps.map((step) => step.entrypoints)
577
+ };
578
+ }
579
+ function findEffectedSteps(changedFile, currentOutput) {
580
+ const changes = [];
581
+ const changedPath = changedFile[1];
582
+ const isChunkEffected = (chunk) => (
583
+ // If it's an HTML file with the same path, is is effected because HTML files need to be pre-rendered
584
+ // TODO: use bundle path to support `<name>/index.html`?
585
+ chunk.type === "asset" && changedPath.endsWith(chunk.fileName) || // If it's a chunk that depends on the changed file, it is effected
586
+ chunk.type === "chunk" && chunk.moduleIds.includes(changedPath)
587
+ );
588
+ for (const step of currentOutput.steps) {
589
+ const effectedChunk = step.chunks.find((chunk) => isChunkEffected(chunk));
590
+ if (effectedChunk)
591
+ changes.push(step);
592
+ }
593
+ const effectedAsset = currentOutput.publicAssets.find(
594
+ (chunk) => isChunkEffected(chunk)
595
+ );
596
+ if (effectedAsset)
597
+ changes.push(effectedAsset);
598
+ return changes;
599
+ }
600
+
601
+ // src/index.ts
602
+ var import_async_mutex = require("async-mutex");
603
+ var import_consola3 = require("consola");
604
+ var import_node_path4 = require("path");
605
+
606
+ // src/core/build/buildEntrypoints.ts
607
+ var vite3 = __toESM(require("vite"), 1);
608
+
609
+ // src/core/utils/removeEmptyDirs.ts
610
+ var import_fs_extra5 = __toESM(require("fs-extra"), 1);
611
+ var import_path5 = __toESM(require("path"), 1);
612
+ async function removeEmptyDirs(dir) {
613
+ const files = await import_fs_extra5.default.readdir(dir);
614
+ for (const file of files) {
615
+ const filePath = import_path5.default.join(dir, file);
616
+ const stats = await import_fs_extra5.default.stat(filePath);
617
+ if (stats.isDirectory()) {
618
+ await removeEmptyDirs(filePath);
619
+ }
620
+ }
621
+ try {
622
+ await import_fs_extra5.default.rmdir(dir);
623
+ } catch {
624
+ }
625
+ }
626
+
627
+ // src/core/build/buildEntrypoints.ts
628
+ var import_fast_glob = __toESM(require("fast-glob"), 1);
629
+ var import_fs_extra6 = __toESM(require("fs-extra"), 1);
630
+ var import_path6 = require("path");
631
+ async function buildEntrypoints(groups, config) {
632
+ const steps = [];
633
+ for (const group of groups) {
634
+ const step = Array.isArray(group) ? await buildMultipleEntrypoints(group, config) : await buildSingleEntrypoint(group, config);
635
+ steps.push(step);
636
+ }
637
+ const publicAssets = await copyPublicDirectory(config);
638
+ await removeEmptyDirs(config.outDir);
639
+ return { publicAssets, steps };
640
+ }
641
+ async function buildSingleEntrypoint(entrypoint, config) {
642
+ const isVirtual = ["background", "content-script"].includes(entrypoint.type);
643
+ const entry = isVirtual ? `virtual:wxt-${entrypoint.type}?${entrypoint.inputPath}` : entrypoint.inputPath;
644
+ const libMode = {
645
+ build: {
646
+ lib: {
647
+ entry,
648
+ formats: ["iife"],
649
+ name: entrypoint.name,
650
+ fileName: entrypoint.name
651
+ },
652
+ rollupOptions: {
653
+ output: {
654
+ // There's only a single output for this build, so we use the desired bundle path for the
655
+ // entry output (like "content-scripts/overlay.js")
656
+ entryFileNames: getEntrypointBundlePath(
657
+ entrypoint,
658
+ config.outDir,
659
+ ".js"
660
+ ),
661
+ // Output content script CSS to assets/ with a hash to prevent conflicts. Defaults to
662
+ // "[name].[ext]" in lib mode, which usually results in "style.css". That means multiple
663
+ // content scripts with styles would overwrite each other if it weren't changed below.
664
+ assetFileNames: `assets/${entrypoint.name}.[ext]`
665
+ }
666
+ }
667
+ }
668
+ };
669
+ const entryConfig = vite3.mergeConfig(
670
+ libMode,
671
+ config.vite
672
+ );
673
+ const result = await vite3.build(entryConfig);
674
+ return {
675
+ entrypoints: entrypoint,
676
+ chunks: getBuildOutputChunks(result)
677
+ };
678
+ }
679
+ async function buildMultipleEntrypoints(entrypoints, config) {
680
+ const multiPage = {
681
+ plugins: [multipageMove(entrypoints, config)],
682
+ build: {
683
+ rollupOptions: {
684
+ input: entrypoints.reduce((input, entry) => {
685
+ input[entry.name] = entry.inputPath;
686
+ return input;
687
+ }, {}),
688
+ output: {
689
+ // Include a hash to prevent conflicts
690
+ chunkFileNames: "chunks/[name]-[hash].js",
691
+ // Include a hash to prevent conflicts
692
+ entryFileNames: "chunks/[name]-[hash].js",
693
+ // We can't control the "name", so we need a hash to prevent conflicts
694
+ assetFileNames: "assets/[name]-[hash].[ext]"
695
+ }
696
+ }
697
+ }
698
+ };
699
+ const entryConfig = vite3.mergeConfig(
700
+ multiPage,
701
+ config.vite
702
+ );
703
+ const result = await vite3.build(entryConfig);
704
+ return {
705
+ entrypoints,
706
+ chunks: getBuildOutputChunks(result)
707
+ };
708
+ }
709
+ function getBuildOutputChunks(result) {
710
+ if ("on" in result)
711
+ throw Error("wxt does not support vite watch mode.");
712
+ if (Array.isArray(result))
713
+ return result.flatMap(({ output }) => output);
714
+ return result.output;
715
+ }
716
+ async function copyPublicDirectory(config) {
717
+ const publicAssets = [];
718
+ if (!await import_fs_extra6.default.exists(config.publicDir))
719
+ return publicAssets;
720
+ const files = await (0, import_fast_glob.default)("**/*", { cwd: config.publicDir });
721
+ for (const file of files) {
722
+ const srcPath = (0, import_path6.resolve)(config.publicDir, file);
723
+ const outPath = (0, import_path6.resolve)(config.outDir, file);
724
+ await import_fs_extra6.default.ensureDir((0, import_path6.dirname)(outPath));
725
+ await import_fs_extra6.default.copyFile(srcPath, outPath);
726
+ publicAssets.push({
727
+ type: "asset",
728
+ fileName: file,
729
+ name: file,
730
+ needsCodeReference: false,
731
+ source: await import_fs_extra6.default.readFile(srcPath)
732
+ });
733
+ }
734
+ return publicAssets;
735
+ }
736
+
504
737
  // src/core/build/findEntrypoints.ts
505
- var import_path5 = require("path");
506
- var import_fs_extra4 = __toESM(require("fs-extra"), 1);
738
+ var import_path7 = require("path");
739
+ var import_fs_extra7 = __toESM(require("fs-extra"), 1);
507
740
  var import_picomatch = __toESM(require("picomatch"), 1);
508
741
  var import_linkedom2 = require("linkedom");
509
742
  var import_json5 = __toESM(require("json5"), 1);
510
- var import_fast_glob = __toESM(require("fast-glob"), 1);
743
+ var import_fast_glob2 = __toESM(require("fast-glob"), 1);
511
744
  async function findEntrypoints(config) {
512
- const relativePaths = await (0, import_fast_glob.default)("**/*", {
745
+ const relativePaths = await (0, import_fast_glob2.default)("**/*", {
513
746
  cwd: config.entrypointsDir
514
747
  });
515
748
  relativePaths.sort();
@@ -518,7 +751,7 @@ async function findEntrypoints(config) {
518
751
  const entrypoints = [];
519
752
  await Promise.all(
520
753
  relativePaths.map(async (relativePath) => {
521
- const path5 = (0, import_path5.resolve)(config.entrypointsDir, relativePath);
754
+ const path5 = (0, import_path7.resolve)(config.entrypointsDir, relativePath);
522
755
  const matchingGlob = pathGlobs.find(
523
756
  (glob3) => import_picomatch.default.isMatch(relativePath, glob3)
524
757
  );
@@ -565,8 +798,8 @@ ${JSON.stringify(
565
798
  if (withSameName) {
566
799
  throw Error(
567
800
  `Multiple entrypoints with the name "${entrypoint.name}" detected, but only one is allowed: ${[
568
- (0, import_path5.relative)(config.root, withSameName.inputPath),
569
- (0, import_path5.relative)(config.root, entrypoint.inputPath)
801
+ (0, import_path7.relative)(config.root, withSameName.inputPath),
802
+ (0, import_path7.relative)(config.root, entrypoint.inputPath)
570
803
  ].join(", ")}`
571
804
  );
572
805
  }
@@ -578,7 +811,7 @@ ${JSON.stringify(
578
811
  }
579
812
  async function getPopupEntrypoint(config, path5) {
580
813
  const options = {};
581
- const content = await import_fs_extra4.default.readFile(path5, "utf-8");
814
+ const content = await import_fs_extra7.default.readFile(path5, "utf-8");
582
815
  const { document } = (0, import_linkedom2.parseHTML)(content);
583
816
  const title = document.querySelector("title");
584
817
  if (title != null)
@@ -608,7 +841,7 @@ async function getPopupEntrypoint(config, path5) {
608
841
  }
609
842
  async function getOptionsEntrypoint(config, path5) {
610
843
  const options = {};
611
- const content = await import_fs_extra4.default.readFile(path5, "utf-8");
844
+ const content = await import_fs_extra7.default.readFile(path5, "utf-8");
612
845
  const { document } = (0, import_linkedom2.parseHTML)(content);
613
846
  const openInTabContent = document.querySelector("meta[name='manifest.open_in_tab']")?.getAttribute("content");
614
847
  if (openInTabContent) {
@@ -655,7 +888,7 @@ async function getContentScriptEntrypoint(config, name, path5) {
655
888
  type: "content-script",
656
889
  name: getEntrypointName(config.entrypointsDir, path5),
657
890
  inputPath: path5,
658
- outputDir: (0, import_path5.resolve)(config.outDir, "content-scripts"),
891
+ outputDir: (0, import_path7.resolve)(config.outDir, "content-scripts"),
659
892
  options
660
893
  };
661
894
  }
@@ -690,140 +923,112 @@ var PATH_GLOB_TO_TYPE_MAP = {
690
923
  "*/*": "ignored"
691
924
  };
692
925
 
693
- // src/core/build/buildEntrypoints.ts
694
- var vite3 = __toESM(require("vite"), 1);
695
-
696
- // src/core/utils/removeEmptyDirs.ts
697
- var import_fs_extra5 = __toESM(require("fs-extra"), 1);
698
- var import_path6 = __toESM(require("path"), 1);
699
- async function removeEmptyDirs(dir) {
700
- const files = await import_fs_extra5.default.readdir(dir);
701
- for (const file of files) {
702
- const filePath = import_path6.default.join(dir, file);
703
- const stats = await import_fs_extra5.default.stat(filePath);
704
- if (stats.isDirectory()) {
705
- await removeEmptyDirs(filePath);
706
- }
707
- }
708
- try {
709
- await import_fs_extra5.default.rmdir(dir);
710
- } catch {
711
- }
926
+ // src/core/build/generateTypesDir.ts
927
+ var import_unimport3 = require("unimport");
928
+ var import_fs_extra8 = __toESM(require("fs-extra"), 1);
929
+ var import_path8 = require("path");
930
+ async function generateTypesDir(entrypoints, config) {
931
+ await import_fs_extra8.default.ensureDir(config.typesDir);
932
+ const references = [];
933
+ references.push(await writeImportsDeclarationFile(config));
934
+ references.push(await writePathsDeclarationFile(entrypoints, config));
935
+ references.push(await writeGlobalsDeclarationFile(config));
936
+ const mainReference = await writeMainDeclarationFile(references, config);
937
+ await writeTsConfigFile(mainReference, config);
712
938
  }
713
-
714
- // src/core/build/buildEntrypoints.ts
715
- var import_fast_glob2 = __toESM(require("fast-glob"), 1);
716
- var import_fs_extra6 = __toESM(require("fs-extra"), 1);
717
- var import_path7 = require("path");
718
- async function buildEntrypoints(groups, config) {
719
- const steps = [];
720
- for (const group of groups) {
721
- const step = Array.isArray(group) ? await buildMultipleEntrypoints(group, config) : await buildSingleEntrypoint(group, config);
722
- steps.push(step);
723
- }
724
- const publicAssets = await copyPublicDirectory(config);
725
- await removeEmptyDirs(config.outDir);
726
- return { publicAssets, steps };
939
+ async function writeImportsDeclarationFile(config) {
940
+ const filePath = (0, import_path8.resolve)(config.typesDir, "imports.d.ts");
941
+ const unimport2 = (0, import_unimport3.createUnimport)(getUnimportOptions(config));
942
+ await unimport2.scanImportsFromDir(void 0, { cwd: config.srcDir });
943
+ await import_fs_extra8.default.writeFile(
944
+ filePath,
945
+ ["// Generated by wxt", await unimport2.generateTypeDeclarations()].join(
946
+ "\n"
947
+ ) + "\n"
948
+ );
949
+ return filePath;
727
950
  }
728
- async function buildSingleEntrypoint(entrypoint, config) {
729
- const isVirtual = ["background", "content-script"].includes(entrypoint.type);
730
- const entry = isVirtual ? `virtual:wxt-${entrypoint.type}?${entrypoint.inputPath}` : entrypoint.inputPath;
731
- const libMode = {
732
- build: {
733
- lib: {
734
- entry,
735
- formats: ["iife"],
736
- name: entrypoint.name,
737
- fileName: entrypoint.name
738
- },
739
- rollupOptions: {
740
- output: {
741
- // There's only a single output for this build, so we use the desired bundle path for the
742
- // entry output (like "content-scripts/overlay.js")
743
- entryFileNames: getEntrypointBundlePath(
744
- entrypoint,
745
- config.outDir,
746
- ".js"
747
- ),
748
- // Output content script CSS to assets/ with a hash to prevent conflicts. Defaults to
749
- // "[name].[ext]" in lib mode, which usually results in "style.css". That means multiple
750
- // content scripts with styles would overwrite each other if it weren't changed below.
751
- assetFileNames: `assets/${entrypoint.name}.[ext]`
752
- }
753
- }
754
- }
755
- };
756
- const entryConfig = vite3.mergeConfig(
757
- libMode,
758
- config.vite
951
+ async function writePathsDeclarationFile(entrypoints, config) {
952
+ const filePath = (0, import_path8.resolve)(config.typesDir, "paths.d.ts");
953
+ await import_fs_extra8.default.writeFile(
954
+ filePath,
955
+ [
956
+ "// Generated by wxt",
957
+ "type EntrypointPath =",
958
+ ...entrypoints.map((entry) => {
959
+ const path5 = getEntrypointBundlePath(
960
+ entry,
961
+ config.outDir,
962
+ entry.inputPath.endsWith(".html") ? ".html" : ".js"
963
+ );
964
+ return ` | "/${path5}"`;
965
+ }).sort()
966
+ ].join("\n") + "\n"
759
967
  );
760
- const result = await vite3.build(entryConfig);
761
- return {
762
- entrypoints: entrypoint,
763
- chunks: getBuildOutputChunks(result)
764
- };
968
+ return filePath;
765
969
  }
766
- async function buildMultipleEntrypoints(entrypoints, config) {
767
- const multiPage = {
768
- plugins: [multipageMove(entrypoints, config)],
769
- build: {
770
- rollupOptions: {
771
- input: entrypoints.reduce((input, entry) => {
772
- input[entry.name] = entry.inputPath;
773
- return input;
774
- }, {}),
775
- output: {
776
- // Include a hash to prevent conflicts
777
- chunkFileNames: "chunks/[name]-[hash].js",
778
- // Include a hash to prevent conflicts
779
- entryFileNames: "chunks/[name]-[hash].js",
780
- // We can't control the "name", so we need a hash to prevent conflicts
781
- assetFileNames: "assets/[name]-[hash].[ext]"
782
- }
783
- }
784
- }
785
- };
786
- const entryConfig = vite3.mergeConfig(
787
- multiPage,
788
- config.vite
970
+ async function writeGlobalsDeclarationFile(config) {
971
+ const filePath = (0, import_path8.resolve)(config.typesDir, "globals.d.ts");
972
+ const globals = getGlobals(config);
973
+ await import_fs_extra8.default.writeFile(
974
+ filePath,
975
+ [
976
+ "// Generated by wxt",
977
+ "export {}",
978
+ "declare global {",
979
+ ...globals.map((global) => ` const ${global.name}: ${global.type};`),
980
+ "}"
981
+ ].join("\n") + "\n",
982
+ "utf-8"
789
983
  );
790
- const result = await vite3.build(entryConfig);
791
- return {
792
- entrypoints,
793
- chunks: getBuildOutputChunks(result)
794
- };
984
+ return filePath;
795
985
  }
796
- function getBuildOutputChunks(result) {
797
- if ("on" in result)
798
- throw Error("wxt does not support vite watch mode.");
799
- if (Array.isArray(result))
800
- return result.flatMap(({ output }) => output);
801
- return result.output;
986
+ async function writeMainDeclarationFile(references, config) {
987
+ const dir = config.wxtDir;
988
+ const filePath = (0, import_path8.resolve)(dir, "wxt.d.ts");
989
+ await import_fs_extra8.default.writeFile(
990
+ filePath,
991
+ [
992
+ "// Generated by wxt",
993
+ ...references.map(
994
+ (ref) => `/// <reference types="./${(0, import_path8.relative)(dir, ref)}" />`
995
+ )
996
+ ].join("\n") + "\n"
997
+ );
998
+ return filePath;
802
999
  }
803
- async function copyPublicDirectory(config) {
804
- const publicAssets = [];
805
- if (!await import_fs_extra6.default.exists(config.publicDir))
806
- return publicAssets;
807
- const files = await (0, import_fast_glob2.default)("**/*", { cwd: config.publicDir });
808
- for (const file of files) {
809
- const srcPath = (0, import_path7.resolve)(config.publicDir, file);
810
- const outPath = (0, import_path7.resolve)(config.outDir, file);
811
- await import_fs_extra6.default.ensureDir((0, import_path7.dirname)(outPath));
812
- await import_fs_extra6.default.copyFile(srcPath, outPath);
813
- publicAssets.push({
814
- type: "asset",
815
- fileName: file,
816
- name: file,
817
- needsCodeReference: false,
818
- source: await import_fs_extra6.default.readFile(srcPath)
819
- });
820
- }
821
- return publicAssets;
1000
+ async function writeTsConfigFile(mainReference, config) {
1001
+ const dir = config.wxtDir;
1002
+ await import_fs_extra8.default.writeFile(
1003
+ (0, import_path8.resolve)(dir, "tsconfig.json"),
1004
+ `{
1005
+ "compilerOptions": {
1006
+ "target": "ESNext",
1007
+ "module": "ESNext",
1008
+ "moduleResolution": "Bundler",
1009
+ "noEmit": true,
1010
+ "esModuleInterop": true,
1011
+ "forceConsistentCasingInFileNames": true,
1012
+ "resolveJsonModule": true,
1013
+
1014
+ /* Type Checking */
1015
+ "strict": true,
1016
+
1017
+ /* Completeness */
1018
+ "skipLibCheck": true
1019
+ },
1020
+ "include": [
1021
+ "${(0, import_path8.relative)(dir, config.root)}/**/*",
1022
+ "./${(0, import_path8.relative)(dir, mainReference)}"
1023
+ ],
1024
+ "exclude": ["${(0, import_path8.relative)(dir, config.outBaseDir)}"]
1025
+ }`
1026
+ );
822
1027
  }
823
1028
 
824
1029
  // src/core/utils/manifest.ts
825
- var import_fs_extra7 = __toESM(require("fs-extra"), 1);
826
- var import_path8 = require("path");
1030
+ var import_fs_extra9 = __toESM(require("fs-extra"), 1);
1031
+ var import_path9 = require("path");
827
1032
 
828
1033
  // src/core/utils/ContentSecurityPolicy.ts
829
1034
  var ContentSecurityPolicy = class _ContentSecurityPolicy {
@@ -871,8 +1076,8 @@ var ContentSecurityPolicy = class _ContentSecurityPolicy {
871
1076
  // src/core/utils/manifest.ts
872
1077
  async function writeManifest(manifest, output, config) {
873
1078
  const str = config.mode === "production" ? JSON.stringify(manifest) : JSON.stringify(manifest, null, 2);
874
- await import_fs_extra7.default.ensureDir(config.outDir);
875
- await import_fs_extra7.default.writeFile((0, import_path8.resolve)(config.outDir, "manifest.json"), str, "utf-8");
1079
+ await import_fs_extra9.default.ensureDir(config.outDir);
1080
+ await import_fs_extra9.default.writeFile((0, import_path9.resolve)(config.outDir, "manifest.json"), str, "utf-8");
876
1081
  output.publicAssets.unshift({
877
1082
  type: "asset",
878
1083
  fileName: "manifest.json",
@@ -900,10 +1105,12 @@ async function generateMainfest(entrypoints, buildOutput, config) {
900
1105
  addEntrypoints(manifest, entrypoints, buildOutput, config);
901
1106
  if (config.command === "serve")
902
1107
  addDevModeCsp(manifest, config);
1108
+ if (config.command === "serve")
1109
+ addDevModePermissions(manifest, config);
903
1110
  return manifest;
904
1111
  }
905
1112
  async function getPackageJson(config) {
906
- return await import_fs_extra7.default.readJson((0, import_path8.resolve)(config.root, "package.json"));
1113
+ return await import_fs_extra9.default.readJson((0, import_path9.resolve)(config.root, "package.json"));
907
1114
  }
908
1115
  function simplifyVersion(versionName) {
909
1116
  const version3 = /^((0|[1-9][0-9]{0,8})([.](0|[1-9][0-9]{0,8})){0,3}).*$/.exec(
@@ -1056,23 +1263,23 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
1056
1263
  }
1057
1264
  }
1058
1265
  if (contentScripts?.length) {
1059
- if (config.command === "serve") {
1060
- const permissionsKey = config.manifestVersion === 2 ? "permissions" : "host_permissions";
1061
- const hostPermissions = new Set(manifest[permissionsKey] ?? []);
1266
+ if (config.command === "serve" && config.manifestVersion === 3) {
1267
+ const hostPermissions = new Set(manifest.host_permissions ?? []);
1062
1268
  contentScripts.forEach((script) => {
1063
1269
  script.options.matches.forEach((matchPattern) => {
1064
1270
  hostPermissions.add(matchPattern);
1065
1271
  });
1066
1272
  });
1067
- manifest[permissionsKey] = Array.from(hostPermissions).sort();
1273
+ hostPermissions.forEach(
1274
+ (permission) => addHostPermission(manifest, permission)
1275
+ );
1068
1276
  } else {
1069
1277
  const hashToEntrypointsMap = contentScripts.reduce((map, script) => {
1070
1278
  const hash = JSON.stringify(script.options);
1071
- if (!map.has(hash)) {
1072
- map.set(hash, [script]);
1073
- } else {
1279
+ if (map.has(hash))
1074
1280
  map.get(hash)?.push(script);
1075
- }
1281
+ else
1282
+ map.set(hash, [script]);
1076
1283
  return map;
1077
1284
  }, /* @__PURE__ */ new Map());
1078
1285
  manifest.content_scripts = Array.from(hashToEntrypointsMap.entries()).map(
@@ -1093,13 +1300,9 @@ function addDevModeCsp(manifest, config) {
1093
1300
  const permission = `http://${config.server?.hostname ?? ""}/*`;
1094
1301
  const allowedCsp = config.server?.origin ?? "http://localhost:*";
1095
1302
  if (manifest.manifest_version === 3) {
1096
- manifest.host_permissions ??= [];
1097
- if (!manifest.host_permissions.includes(permission))
1098
- manifest.host_permissions.push(permission);
1303
+ addHostPermission(manifest, permission);
1099
1304
  } else {
1100
- manifest.permissions ??= [];
1101
- if (!manifest.permissions.includes(permission))
1102
- manifest.permissions.push(permission);
1305
+ addPermission(manifest, permission);
1103
1306
  }
1104
1307
  const csp = new ContentSecurityPolicy(
1105
1308
  manifest.manifest_version === 3 ? (
@@ -1117,6 +1320,11 @@ function addDevModeCsp(manifest, config) {
1117
1320
  manifest.content_security_policy = csp.toString();
1118
1321
  }
1119
1322
  }
1323
+ function addDevModePermissions(manifest, config) {
1324
+ addPermission(manifest, "tabs");
1325
+ if (config.manifestVersion === 3)
1326
+ addPermission(manifest, "scripting");
1327
+ }
1120
1328
  function getContentScriptCssFiles(contentScripts, buildOutput) {
1121
1329
  const css = [];
1122
1330
  const allChunks = buildOutput.steps.flatMap((step) => step.chunks);
@@ -1131,9 +1339,71 @@ function getContentScriptCssFiles(contentScripts, buildOutput) {
1131
1339
  return css;
1132
1340
  return void 0;
1133
1341
  }
1342
+ function addPermission(manifest, permission) {
1343
+ manifest.permissions ??= [];
1344
+ if (manifest.permissions.includes(permission))
1345
+ return;
1346
+ manifest.permissions.push(permission);
1347
+ }
1348
+ function addHostPermission(manifest, hostPermission) {
1349
+ manifest.host_permissions ??= [];
1350
+ if (manifest.host_permissions.includes(hostPermission))
1351
+ return;
1352
+ manifest.host_permissions.push(hostPermission);
1353
+ }
1354
+
1355
+ // src/core/build.ts
1356
+ var import_picocolors2 = __toESM(require("picocolors"), 1);
1357
+ var vite4 = __toESM(require("vite"), 1);
1358
+ var import_fs_extra11 = __toESM(require("fs-extra"), 1);
1359
+
1360
+ // src/core/utils/groupEntrypoints.ts
1361
+ function groupEntrypoints(entrypoints) {
1362
+ const groupIndexMap = {};
1363
+ const groups = [];
1364
+ for (const entry of entrypoints) {
1365
+ const group = ENTRY_TYPE_TO_GROUP_MAP[entry.type];
1366
+ if (group === "no-group") {
1367
+ groups.push(entry);
1368
+ } else {
1369
+ let groupIndex = groupIndexMap[group];
1370
+ if (groupIndex == null) {
1371
+ groupIndex = groups.push([]) - 1;
1372
+ groupIndexMap[group] = groupIndex;
1373
+ }
1374
+ groups[groupIndex].push(entry);
1375
+ }
1376
+ }
1377
+ return groups;
1378
+ }
1379
+ var ENTRY_TYPE_TO_GROUP_MAP = {
1380
+ sandbox: "sandbox-page",
1381
+ popup: "extension-page",
1382
+ newtab: "extension-page",
1383
+ history: "extension-page",
1384
+ options: "extension-page",
1385
+ devtools: "extension-page",
1386
+ bookmarks: "extension-page",
1387
+ sidepanel: "extension-page",
1388
+ "unlisted-page": "extension-page",
1389
+ background: "no-group",
1390
+ "content-script": "no-group",
1391
+ "unlisted-script": "no-group"
1392
+ };
1393
+
1394
+ // src/core/utils/formatDuration.ts
1395
+ function formatDuration(duration) {
1396
+ if (duration < 1e3)
1397
+ return `${duration} ms`;
1398
+ if (duration < 1e4)
1399
+ return `${(duration / 1e3).toFixed(3)} s`;
1400
+ if (duration < 6e4)
1401
+ return `${(duration / 1e3).toFixed(1)} s`;
1402
+ return `${(duration / 1e3).toFixed(0)} s`;
1403
+ }
1134
1404
 
1135
1405
  // src/core/log/printBuildSummary.ts
1136
- var import_path9 = __toESM(require("path"), 1);
1406
+ var import_path10 = __toESM(require("path"), 1);
1137
1407
 
1138
1408
  // src/core/log/printTable.ts
1139
1409
  function printTable(log, rows, gap = 2) {
@@ -1163,15 +1433,15 @@ function printTable(log, rows, gap = 2) {
1163
1433
 
1164
1434
  // src/core/log/printBuildSummary.ts
1165
1435
  var import_picocolors = __toESM(require("picocolors"), 1);
1166
- var import_fs_extra8 = __toESM(require("fs-extra"), 1);
1436
+ var import_fs_extra10 = __toESM(require("fs-extra"), 1);
1167
1437
  var import_filesize = require("filesize");
1168
1438
  async function printBuildSummary(output, config) {
1169
1439
  const chunks = [
1170
1440
  ...output.steps.flatMap((step) => step.chunks),
1171
1441
  ...output.publicAssets
1172
1442
  ].sort((l, r) => {
1173
- const lWeight = CHUNK_SORT_WEIGHTS[l.fileName] ?? CHUNK_SORT_WEIGHTS[(0, import_path9.extname)(l.fileName)] ?? DEFAULT_SORT_WEIGHT;
1174
- const rWeight = CHUNK_SORT_WEIGHTS[r.fileName] ?? CHUNK_SORT_WEIGHTS[(0, import_path9.extname)(r.fileName)] ?? DEFAULT_SORT_WEIGHT;
1443
+ const lWeight = CHUNK_SORT_WEIGHTS[l.fileName] ?? CHUNK_SORT_WEIGHTS[(0, import_path10.extname)(l.fileName)] ?? DEFAULT_SORT_WEIGHT;
1444
+ const rWeight = CHUNK_SORT_WEIGHTS[r.fileName] ?? CHUNK_SORT_WEIGHTS[(0, import_path10.extname)(r.fileName)] ?? DEFAULT_SORT_WEIGHT;
1175
1445
  const diff = lWeight - rWeight;
1176
1446
  if (diff !== 0)
1177
1447
  return diff;
@@ -1181,13 +1451,13 @@ async function printBuildSummary(output, config) {
1181
1451
  const chunkRows = await Promise.all(
1182
1452
  chunks.map(async (chunk, i) => {
1183
1453
  const file = [
1184
- (0, import_path9.relative)(process.cwd(), config.outDir) + import_path9.default.sep,
1454
+ (0, import_path10.relative)(process.cwd(), config.outDir) + import_path10.default.sep,
1185
1455
  chunk.fileName
1186
1456
  ];
1187
- const ext = (0, import_path9.extname)(chunk.fileName);
1457
+ const ext = (0, import_path10.extname)(chunk.fileName);
1188
1458
  const prefix = i === chunks.length - 1 ? " \u2514\u2500" : " \u251C\u2500";
1189
1459
  const color = CHUNK_COLORS[ext] ?? DEFAULT_COLOR;
1190
- const stats = await import_fs_extra8.default.lstat((0, import_path9.resolve)(config.outDir, chunk.fileName));
1460
+ const stats = await import_fs_extra10.default.lstat((0, import_path10.resolve)(config.outDir, chunk.fileName));
1191
1461
  totalSize += stats.size;
1192
1462
  const size = String((0, import_filesize.filesize)(stats.size));
1193
1463
  return [
@@ -1215,115 +1485,63 @@ var CHUNK_COLORS = {
1215
1485
  ".js": import_picocolors.default.cyan
1216
1486
  };
1217
1487
 
1218
- // src/index.ts
1219
- var import_fs_extra10 = __toESM(require("fs-extra"), 1);
1220
-
1221
- // src/core/build/generateTypesDir.ts
1222
- var import_unimport3 = require("unimport");
1223
- var import_fs_extra9 = __toESM(require("fs-extra"), 1);
1224
- var import_path10 = require("path");
1225
- async function generateTypesDir(entrypoints, config) {
1226
- await import_fs_extra9.default.ensureDir(config.typesDir);
1227
- const references = [];
1228
- references.push(await writeImportsDeclarationFile(config));
1229
- references.push(await writePathsDeclarationFile(entrypoints, config));
1230
- references.push(await writeGlobalsDeclarationFile(config));
1231
- const mainReference = await writeMainDeclarationFile(references, config);
1232
- await writeTsConfigFile(mainReference, config);
1233
- }
1234
- async function writeImportsDeclarationFile(config) {
1235
- const filePath = (0, import_path10.resolve)(config.typesDir, "imports.d.ts");
1236
- const unimport2 = (0, import_unimport3.createUnimport)(getUnimportOptions(config));
1237
- await unimport2.scanImportsFromDir(void 0, { cwd: config.srcDir });
1238
- await import_fs_extra9.default.writeFile(
1239
- filePath,
1240
- ["// Generated by wxt", await unimport2.generateTypeDeclarations()].join(
1241
- "\n"
1242
- ) + "\n"
1488
+ // src/core/build.ts
1489
+ async function buildInternal(config) {
1490
+ const verb = config.command === "serve" ? "Pre-rendering" : "Building";
1491
+ const target = `${config.browser}-mv${config.manifestVersion}`;
1492
+ config.logger.info(
1493
+ `${verb} ${import_picocolors2.default.cyan(target)} for ${import_picocolors2.default.cyan(config.mode)} with ${import_picocolors2.default.green(
1494
+ `Vite ${vite4.version}`
1495
+ )}`
1243
1496
  );
1244
- return filePath;
1245
- }
1246
- async function writePathsDeclarationFile(entrypoints, config) {
1247
- const filePath = (0, import_path10.resolve)(config.typesDir, "paths.d.ts");
1248
- await import_fs_extra9.default.writeFile(
1249
- filePath,
1250
- [
1251
- "// Generated by wxt",
1252
- "type EntrypointPath =",
1253
- ...entrypoints.map((entry) => {
1254
- const path5 = getEntrypointBundlePath(
1255
- entry,
1256
- config.outDir,
1257
- entry.inputPath.endsWith(".html") ? ".html" : ".js"
1258
- );
1259
- return ` | "/${path5}"`;
1260
- }).sort()
1261
- ].join("\n") + "\n"
1262
- );
1263
- return filePath;
1264
- }
1265
- async function writeGlobalsDeclarationFile(config) {
1266
- const filePath = (0, import_path10.resolve)(config.typesDir, "globals.d.ts");
1267
- const globals = getGlobals(config);
1268
- await import_fs_extra9.default.writeFile(
1269
- filePath,
1270
- [
1271
- "// Generated by wxt",
1272
- "export {}",
1273
- "declare global {",
1274
- ...globals.map((global) => ` const ${global.name}: ${global.type};`),
1275
- "}"
1276
- ].join("\n") + "\n",
1277
- "utf-8"
1278
- );
1279
- return filePath;
1280
- }
1281
- async function writeMainDeclarationFile(references, config) {
1282
- const dir = config.wxtDir;
1283
- const filePath = (0, import_path10.resolve)(dir, "wxt.d.ts");
1284
- await import_fs_extra9.default.writeFile(
1285
- filePath,
1286
- [
1287
- "// Generated by wxt",
1288
- ...references.map(
1289
- (ref) => `/// <reference types="./${(0, import_path10.relative)(dir, ref)}" />`
1290
- )
1291
- ].join("\n") + "\n"
1497
+ const startTime = Date.now();
1498
+ await import_fs_extra11.default.rm(config.outDir, { recursive: true, force: true });
1499
+ await import_fs_extra11.default.ensureDir(config.outDir);
1500
+ const entrypoints = await findEntrypoints(config);
1501
+ const groups = groupEntrypoints(entrypoints);
1502
+ const { output } = await rebuild(config, groups);
1503
+ config.logger.success(
1504
+ `Built extension in ${formatDuration(Date.now() - startTime)}`
1292
1505
  );
1293
- return filePath;
1506
+ await printBuildSummary(output, config);
1507
+ return output;
1294
1508
  }
1295
- async function writeTsConfigFile(mainReference, config) {
1296
- const dir = config.wxtDir;
1297
- await import_fs_extra9.default.writeFile(
1298
- (0, import_path10.resolve)(dir, "tsconfig.json"),
1299
- `{
1300
- "compilerOptions": {
1301
- "target": "ESNext",
1302
- "module": "ESNext",
1303
- "moduleResolution": "Bundler",
1304
- "noEmit": true,
1305
- "esModuleInterop": true,
1306
- "forceConsistentCasingInFileNames": true,
1307
- "resolveJsonModule": true,
1308
-
1309
- /* Type Checking */
1310
- "strict": true,
1311
-
1312
- /* Completeness */
1313
- "skipLibCheck": true
1314
- },
1315
- "include": [
1316
- "${(0, import_path10.relative)(dir, config.root)}/**/*",
1317
- "./${(0, import_path10.relative)(dir, mainReference)}"
1318
- ],
1319
- "exclude": ["${(0, import_path10.relative)(dir, config.outBaseDir)}"]
1320
- }`
1509
+ async function rebuild(config, entrypointGroups, existingOutput = {
1510
+ steps: [],
1511
+ publicAssets: []
1512
+ }) {
1513
+ const allEntrypoints = await findEntrypoints(config);
1514
+ await generateTypesDir(allEntrypoints, config);
1515
+ const newOutput = await buildEntrypoints(entrypointGroups, config);
1516
+ const mergedOutput = {
1517
+ steps: [...existingOutput.steps, ...newOutput.steps],
1518
+ publicAssets: [...existingOutput.publicAssets, ...newOutput.publicAssets]
1519
+ };
1520
+ const newManifest = await generateMainfest(
1521
+ allEntrypoints,
1522
+ mergedOutput,
1523
+ config
1321
1524
  );
1525
+ const finalOutput = {
1526
+ manifest: newManifest,
1527
+ ...newOutput
1528
+ };
1529
+ await writeManifest(newManifest, finalOutput, config);
1530
+ return {
1531
+ output: {
1532
+ manifest: newManifest,
1533
+ steps: [...existingOutput.steps, ...finalOutput.steps],
1534
+ publicAssets: [
1535
+ ...existingOutput.publicAssets,
1536
+ ...finalOutput.publicAssets
1537
+ ]
1538
+ },
1539
+ manifest: newManifest
1540
+ };
1322
1541
  }
1323
1542
 
1324
- // src/index.ts
1325
- var import_picocolors2 = __toESM(require("picocolors"), 1);
1326
- var vite4 = __toESM(require("vite"), 1);
1543
+ // src/core/server.ts
1544
+ var vite5 = __toESM(require("vite"), 1);
1327
1545
 
1328
1546
  // src/core/utils/findOpenPort.ts
1329
1547
  var import_node_net = __toESM(require("net"), 1);
@@ -1348,17 +1566,6 @@ function findOpenPortRecursive(port, startPort, endPort) {
1348
1566
  });
1349
1567
  }
1350
1568
 
1351
- // src/core/utils/formatDuration.ts
1352
- function formatDuration(duration) {
1353
- if (duration < 1e3)
1354
- return `${duration} ms`;
1355
- if (duration < 1e4)
1356
- return `${(duration / 1e3).toFixed(3)} s`;
1357
- if (duration < 6e4)
1358
- return `${(duration / 1e3).toFixed(1)} s`;
1359
- return `${(duration / 1e3).toFixed(0)} s`;
1360
- }
1361
-
1362
1569
  // src/core/runners/createWebExtRunner.ts
1363
1570
  function createWebExtRunner() {
1364
1571
  let runner;
@@ -1416,161 +1623,131 @@ function createWebExtRunner() {
1416
1623
  var WARN_LOG_LEVEL = 40;
1417
1624
  var ERROR_LOG_LEVEL = 50;
1418
1625
 
1419
- // src/core/utils/groupEntrypoints.ts
1420
- function groupEntrypoints(entrypoints) {
1421
- const groupIndexMap = {};
1422
- const groups = [];
1423
- for (const entry of entrypoints) {
1424
- const group = ENTRY_TYPE_TO_GROUP_MAP[entry.type];
1425
- if (group === "no-group") {
1426
- groups.push(entry);
1427
- } else {
1428
- let groupIndex = groupIndexMap[group];
1429
- if (groupIndex == null) {
1430
- groupIndex = groups.push([]) - 1;
1431
- groupIndexMap[group] = groupIndex;
1432
- }
1433
- groups[groupIndex].push(entry);
1626
+ // src/core/server.ts
1627
+ async function getServerInfo() {
1628
+ const port = await findOpenPort(3e3, 3010);
1629
+ const hostname = "localhost";
1630
+ const origin = `http://${hostname}:${port}`;
1631
+ const serverConfig = {
1632
+ server: {
1633
+ origin
1434
1634
  }
1435
- }
1436
- return groups;
1635
+ };
1636
+ return {
1637
+ port,
1638
+ hostname,
1639
+ origin,
1640
+ viteServerConfig: serverConfig
1641
+ };
1437
1642
  }
1438
- var ENTRY_TYPE_TO_GROUP_MAP = {
1439
- sandbox: "sandbox-page",
1440
- popup: "extension-page",
1441
- newtab: "extension-page",
1442
- history: "extension-page",
1443
- options: "extension-page",
1444
- devtools: "extension-page",
1445
- bookmarks: "extension-page",
1446
- sidepanel: "extension-page",
1447
- "unlisted-page": "extension-page",
1448
- background: "no-group",
1449
- "content-script": "no-group",
1450
- "unlisted-script": "no-group"
1451
- };
1452
-
1453
- // src/core/utils/detectDevChanges.ts
1454
- function detectDevChanges(changedFiles, currentOutput) {
1455
- if (currentOutput == null)
1456
- return { type: "no-change" };
1457
- const changedSteps = new Set(
1458
- changedFiles.flatMap(
1459
- (changedFile) => findEffectedSteps(changedFile, currentOutput)
1460
- )
1643
+ async function setupServer(serverInfo, config) {
1644
+ const runner = createWebExtRunner();
1645
+ const viteServer = await vite5.createServer(
1646
+ vite5.mergeConfig(serverInfo, config.vite)
1461
1647
  );
1462
- if (changedSteps.size === 0)
1463
- return { type: "no-change" };
1464
- const unchangedOutput = {
1465
- manifest: currentOutput.manifest,
1466
- steps: [],
1467
- publicAssets: []
1648
+ const start = async () => {
1649
+ await viteServer.listen(server.port);
1650
+ config.logger.success(`Started dev server @ ${serverInfo.origin}`);
1651
+ server.currentOutput = await buildInternal(config);
1652
+ config.logger.info("Opening browser...");
1653
+ await runner.openBrowser(config);
1654
+ config.logger.success("Opened!");
1468
1655
  };
1469
- const changedOutput = {
1470
- manifest: currentOutput.manifest,
1471
- steps: [],
1472
- publicAssets: []
1656
+ const reloadExtension = () => {
1657
+ viteServer.ws.send("wxt:reload-extension");
1473
1658
  };
1474
- for (const step of currentOutput.steps) {
1475
- if (changedSteps.has(step)) {
1476
- changedOutput.steps.push(step);
1477
- } else {
1478
- unchangedOutput.steps.push(step);
1479
- }
1480
- }
1481
- for (const asset of currentOutput.publicAssets) {
1482
- if (changedSteps.has(asset)) {
1483
- changedOutput.publicAssets.push(asset);
1484
- } else {
1485
- unchangedOutput.publicAssets.push(asset);
1486
- }
1487
- }
1488
- const isOnlyHtmlChanges = !changedFiles.find(
1489
- ([_, file]) => !file.endsWith(".html")
1490
- );
1491
- if (isOnlyHtmlChanges) {
1492
- return {
1493
- type: "html-reload",
1494
- cachedOutput: unchangedOutput,
1495
- rebuildGroups: changedOutput.steps.map((step) => step.entrypoints)
1496
- };
1497
- }
1498
- return {
1499
- type: "extension-reload",
1500
- cachedOutput: unchangedOutput,
1501
- rebuildGroups: changedOutput.steps.map((step) => step.entrypoints)
1659
+ const reloadPage = (path5) => {
1660
+ viteServer.ws.send("wxt:reload-page", path5);
1661
+ };
1662
+ const reloadContentScript = (contentScript) => {
1663
+ viteServer.ws.send("wxt:reload-content-script", contentScript);
1664
+ };
1665
+ const server = {
1666
+ ...viteServer,
1667
+ start,
1668
+ currentOutput: {
1669
+ manifest: {
1670
+ manifest_version: 3,
1671
+ name: "",
1672
+ version: ""
1673
+ },
1674
+ publicAssets: [],
1675
+ steps: []
1676
+ },
1677
+ port: serverInfo.port,
1678
+ hostname: serverInfo.hostname,
1679
+ origin: serverInfo.origin,
1680
+ reloadExtension,
1681
+ reloadPage,
1682
+ reloadContentScript
1502
1683
  };
1684
+ return server;
1503
1685
  }
1504
- function findEffectedSteps(changedFile, currentOutput) {
1505
- const changes = [];
1506
- const changedPath = changedFile[1];
1507
- const isChunkEffected = (chunk) => (
1508
- // If it's an HTML file with the same path, is is effected because HTML files need to be pre-rendered
1509
- // TODO: use bundle path to support `<name>/index.html`?
1510
- chunk.type === "asset" && changedPath.endsWith(chunk.fileName) || // If it's a chunk that depends on the changed file, it is effected
1511
- chunk.type === "chunk" && chunk.moduleIds.includes(changedPath)
1512
- );
1513
- for (const step of currentOutput.steps) {
1514
- const effectedChunk = step.chunks.find((chunk) => isChunkEffected(chunk));
1515
- if (effectedChunk)
1516
- changes.push(step);
1686
+ function reloadContentScripts(steps, config, server) {
1687
+ if (config.manifestVersion === 3) {
1688
+ steps.forEach((step) => {
1689
+ const entry = step.entrypoints;
1690
+ if (Array.isArray(entry) || entry.type !== "content-script")
1691
+ return;
1692
+ const js = [getEntrypointBundlePath(entry, config.outDir, ".js")];
1693
+ const css = getContentScriptCssFiles([entry], server.currentOutput);
1694
+ server.reloadContentScript({
1695
+ js,
1696
+ css,
1697
+ ...entry.options
1698
+ });
1699
+ });
1700
+ } else {
1701
+ server.reloadExtension();
1517
1702
  }
1518
- const effectedAsset = currentOutput.publicAssets.find(
1519
- (chunk) => isChunkEffected(chunk)
1520
- );
1521
- if (effectedAsset)
1522
- changes.push(effectedAsset);
1523
- return changes;
1703
+ }
1704
+ function reloadHtmlPages(groups, server, config) {
1705
+ groups.flat().forEach((entry) => {
1706
+ const path5 = getEntrypointBundlePath(entry, config.outDir, ".html");
1707
+ server.reloadPage(path5);
1708
+ });
1524
1709
  }
1525
1710
 
1526
1711
  // src/index.ts
1527
- var import_async_mutex = require("async-mutex");
1528
- var import_consola3 = require("consola");
1529
- var import_node_path4 = require("path");
1530
1712
  async function build2(config) {
1531
1713
  const internalConfig = await getInternalConfig(config, "build");
1532
1714
  return await buildInternal(internalConfig);
1533
1715
  }
1534
1716
  async function createServer2(config) {
1535
- const port = await findOpenPort(3e3, 3010);
1536
- const hostname = "localhost";
1537
- const origin = `http://${hostname}:${port}`;
1538
- const serverConfig = {
1539
- server: {
1540
- origin
1541
- }
1717
+ const serverInfo = await getServerInfo();
1718
+ const getLatestInternalConfig = () => {
1719
+ const viteConfig = vite6.mergeConfig(
1720
+ serverInfo.viteServerConfig,
1721
+ config?.vite ?? {}
1722
+ );
1723
+ return getInternalConfig({ ...config, vite: viteConfig }, "serve");
1542
1724
  };
1543
- let internalConfig = await getInternalConfig(
1544
- vite4.mergeConfig(serverConfig, config ?? {}),
1545
- "serve"
1546
- );
1547
- const runner = createWebExtRunner();
1548
- let hasBuiltOnce = false;
1549
- let currentOutput;
1725
+ let internalConfig = await getLatestInternalConfig();
1726
+ const server = await setupServer(serverInfo, internalConfig);
1727
+ internalConfig.server = server;
1550
1728
  const fileChangedMutex = new import_async_mutex.Mutex();
1551
1729
  const changeQueue = [];
1552
- const viteServer = await vite4.createServer(internalConfig.vite);
1553
- viteServer.watcher.on("all", async (event, path5, stats) => {
1554
- if (!hasBuiltOnce || path5.startsWith(internalConfig.outBaseDir))
1730
+ server.ws.on("wxt:background-initialized", () => {
1731
+ reloadContentScripts(server.currentOutput.steps, internalConfig, server);
1732
+ });
1733
+ server.watcher.on("all", async (event, path5, _stats) => {
1734
+ if (path5.startsWith(internalConfig.outBaseDir))
1555
1735
  return;
1556
1736
  changeQueue.push([event, path5]);
1557
1737
  await fileChangedMutex.runExclusive(async () => {
1558
1738
  const fileChanges = changeQueue.splice(0, changeQueue.length);
1559
- const changes = detectDevChanges(fileChanges, currentOutput);
1739
+ const changes = detectDevChanges(fileChanges, server.currentOutput);
1560
1740
  if (changes.type === "no-change")
1561
1741
  return;
1562
1742
  import_consola3.consola.info(
1563
- `Changed: ${Array.from(new Set(fileChanges.map((change) => change[1]))).map((file) => import_picocolors2.default.dim((0, import_node_path4.relative)(internalConfig.root, file))).join(", ")}`
1743
+ `Changed: ${Array.from(new Set(fileChanges.map((change) => change[1]))).map((file) => import_picocolors3.default.dim((0, import_node_path4.relative)(internalConfig.root, file))).join(", ")}`
1564
1744
  );
1565
1745
  const rebuiltNames = changes.rebuildGroups.flat().map((entry) => {
1566
- return import_picocolors2.default.cyan(
1746
+ return import_picocolors3.default.cyan(
1567
1747
  (0, import_node_path4.relative)(internalConfig.outDir, getEntrypointOutputFile(entry, ""))
1568
1748
  );
1569
- }).join(import_picocolors2.default.dim(", "));
1570
- internalConfig = await getInternalConfig(
1571
- vite4.mergeConfig(serverConfig, config ?? {}),
1572
- "serve"
1573
- );
1749
+ }).join(import_picocolors3.default.dim(", "));
1750
+ internalConfig = await getLatestInternalConfig();
1574
1751
  internalConfig.server = server;
1575
1752
  const { output: newOutput } = await rebuild(
1576
1753
  internalConfig,
@@ -1578,106 +1755,33 @@ async function createServer2(config) {
1578
1755
  changes.rebuildGroups,
1579
1756
  changes.cachedOutput
1580
1757
  );
1581
- currentOutput = newOutput;
1758
+ server.currentOutput = newOutput;
1582
1759
  switch (changes.type) {
1583
1760
  case "extension-reload":
1584
1761
  server.reloadExtension();
1585
- import_consola3.consola.success(`Reloaded extension: ${rebuiltNames}`);
1586
1762
  break;
1587
1763
  case "html-reload":
1588
- changes.rebuildGroups.flat().forEach((entry) => {
1589
- const path6 = getEntrypointBundlePath(
1590
- entry,
1591
- internalConfig.outDir,
1592
- ".html"
1593
- );
1594
- server.reloadPage(path6);
1595
- });
1596
- import_consola3.consola.success(`Reloaded pages: ${rebuiltNames}`);
1764
+ reloadHtmlPages(changes.rebuildGroups, server, internalConfig);
1765
+ break;
1766
+ case "content-script-reload":
1767
+ reloadContentScripts(changes.changedSteps, internalConfig, server);
1597
1768
  break;
1598
1769
  }
1770
+ import_consola3.consola.success(`Reloaded: ${rebuiltNames}`);
1599
1771
  });
1600
1772
  });
1601
- const server = {
1602
- ...viteServer,
1603
- async listen(port2, isRestart) {
1604
- const res = await viteServer.listen(port2, isRestart);
1605
- if (!isRestart) {
1606
- internalConfig.logger.success(`Started dev server @ ${origin}`);
1607
- internalConfig.logger.info("Opening browser...");
1608
- await runner.openBrowser(internalConfig);
1609
- internalConfig.logger.success("Opened!");
1610
- }
1611
- return res;
1612
- },
1613
- port,
1614
- hostname,
1615
- origin,
1616
- reloadExtension: () => {
1617
- server.ws.send("wxt:reload-extension");
1618
- },
1619
- reloadPage: (path5) => {
1620
- server.ws.send("wxt:reload-page", path5);
1621
- }
1622
- };
1623
- internalConfig.logger.info("Created dev server");
1624
- internalConfig.server = server;
1625
- currentOutput = await buildInternal(internalConfig);
1626
- hasBuiltOnce = true;
1627
1773
  return server;
1628
1774
  }
1629
- async function buildInternal(config) {
1630
- const verb = config.command === "serve" ? "Pre-rendering" : "Building";
1631
- const target = `${config.browser}-mv${config.manifestVersion}`;
1632
- config.logger.info(
1633
- `${verb} ${import_picocolors2.default.cyan(target)} for ${import_picocolors2.default.cyan(config.mode)} with ${import_picocolors2.default.green(
1634
- `Vite ${vite4.version}`
1635
- )}`
1636
- );
1637
- const startTime = Date.now();
1638
- await import_fs_extra10.default.rm(config.outDir, { recursive: true, force: true });
1639
- await import_fs_extra10.default.ensureDir(config.outDir);
1640
- const entrypoints = await findEntrypoints(config);
1641
- const groups = groupEntrypoints(entrypoints);
1642
- const { output } = await rebuild(config, groups);
1643
- config.logger.success(
1644
- `Built extension in ${formatDuration(Date.now() - startTime)}`
1645
- );
1646
- await printBuildSummary(output, config);
1647
- return output;
1648
- }
1649
- async function rebuild(config, entrypointGroups, existingOutput = {
1650
- steps: [],
1651
- publicAssets: []
1652
- }) {
1653
- const allEntrypoints = await findEntrypoints(config);
1654
- await generateTypesDir(allEntrypoints, config);
1655
- const buildOutput = await buildEntrypoints(entrypointGroups, config);
1656
- const manifest = await generateMainfest(allEntrypoints, buildOutput, config);
1657
- const output = {
1658
- manifest,
1659
- ...buildOutput
1660
- };
1661
- await writeManifest(manifest, output, config);
1662
- return {
1663
- output: {
1664
- manifest,
1665
- steps: [...existingOutput.steps, ...output.steps],
1666
- publicAssets: [...existingOutput.publicAssets, ...output.publicAssets]
1667
- },
1668
- manifest
1669
- };
1670
- }
1671
1775
 
1672
1776
  // src/cli/utils/defineCommand.ts
1673
1777
  var import_consola5 = require("consola");
1674
1778
 
1675
1779
  // src/core/log/printHeader.ts
1676
- var import_picocolors3 = __toESM(require("picocolors"), 1);
1780
+ var import_picocolors4 = __toESM(require("picocolors"), 1);
1677
1781
  var import_consola4 = require("consola");
1678
1782
  function printHeader() {
1679
1783
  console.log();
1680
- import_consola4.consola.log(`${import_picocolors3.default.gray("WXT")} ${import_picocolors3.default.gray(import_picocolors3.default.bold(version))}`);
1784
+ import_consola4.consola.log(`${import_picocolors4.default.gray("WXT")} ${import_picocolors4.default.gray(import_picocolors4.default.bold(version))}`);
1681
1785
  }
1682
1786
 
1683
1787
  // src/cli/utils/defineCommand.ts
@@ -1725,7 +1829,7 @@ var dev = defineCommand(async (root, flags) => {
1725
1829
  configFile: flags.config
1726
1830
  };
1727
1831
  const server = await createServer2(cliConfig);
1728
- await server.listen(server.port);
1832
+ await server.start();
1729
1833
  return true;
1730
1834
  });
1731
1835
 
@@ -1765,4 +1869,4 @@ cli.command("prepare [root]", "prepare").option("-c, --config <file>", "use spec
1765
1869
  cli.command("publish [root]", "publish to stores").action(publish);
1766
1870
  cli.command("init [directory]", "initialize a new project").action(init);
1767
1871
  cli.parse();
1768
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9pbmRleC50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvaW1wb3J0VHNGaWxlLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9kZXZIdG1sUHJlcmVuZGVyLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9kZXZTZXJ2ZXJHbG9iYWxzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL25ldHdvcmsudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcHJvbWlzZXMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rvd25sb2FkLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9tdWx0aXBhZ2VNb3ZlLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy91bmltcG9ydC50cyIsICIuLi9zcmMvY29yZS91dGlscy9hdXRvLWltcG9ydHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3ZpcnR1YWxFbnRyeXBvaW50LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NyZWF0ZUZzQ2FjaGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2xvYmFscy50cyIsICIuLi9zcmMvY29yZS9idWlsZC9maW5kRW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9yZW1vdmVFbXB0eURpcnMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbWFuaWZlc3QudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvQ29udGVudFNlY3VyaXR5UG9saWN5LnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludEJ1aWxkU3VtbWFyeS50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRUYWJsZS50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvZ2VuZXJhdGVUeXBlc0Rpci50cyIsICIuLi9zcmMvY29yZS91dGlscy9maW5kT3BlblBvcnQudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZm9ybWF0RHVyYXRpb24udHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy9jcmVhdGVXZWJFeHRSdW5uZXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ3JvdXBFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9kZXRlY3REZXZDaGFuZ2VzLnRzIiwgIi4uL3NyYy9jbGkvdXRpbHMvZGVmaW5lQ29tbWFuZC50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRIZWFkZXIudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9idWlsZC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2Rldi50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2luaXQudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9wcmVwYXJlLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvcHVibGlzaC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgY2FjIGZyb20gJ2NhYyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCAqIGFzIGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMnO1xuXG5jb25zdCBjbGkgPSBjYWMoJ3d4dCcpO1xuY2xpLmhlbHAoKTtcbmNsaS52ZXJzaW9uKHZlcnNpb24pO1xuXG4vLyBERVZcbmNsaVxuICAuY29tbWFuZCgnW3Jvb3RdJywgJ3N0YXJ0IGRldiBzZXJ2ZXInKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuZGV2KTtcblxuLy8gQlVJTERcbmNsaVxuICAuY29tbWFuZCgnYnVpbGQgW3Jvb3RdJywgJ2J1aWxkIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLm9wdGlvbignLW0sIC0tbW9kZSA8bW9kZT4nLCAnc2V0IGVudiBtb2RlJylcbiAgLm9wdGlvbignLWIsIC0tYnJvd3NlciA8YnJvd3Nlcj4nLCAnc3BlY2lmeSBhIGJyb3dzZXInKVxuICAub3B0aW9uKCctLW12MycsICd0YXJnZXQgbWFuaWZlc3QgdjMnKVxuICAub3B0aW9uKCctLW12MicsICd0YXJnZXQgbWFuaWZlc3QgdjInKVxuICAuYWN0aW9uKGNvbW1hbmRzLmJ1aWxkKTtcblxuLy8gUFJFUEFSRVxuY2xpXG4gIC5jb21tYW5kKCdwcmVwYXJlIFtyb290XScsICdwcmVwYXJlJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLmFjdGlvbihjb21tYW5kcy5wcmVwYXJlKTtcblxuLy8gUFVCTElTSFxuY2xpLmNvbW1hbmQoJ3B1Ymxpc2ggW3Jvb3RdJywgJ3B1Ymxpc2ggdG8gc3RvcmVzJykuYWN0aW9uKGNvbW1hbmRzLnB1Ymxpc2gpO1xuXG4vLyBJTklUXG5jbGlcbiAgLmNvbW1hbmQoJ2luaXQgW2RpcmVjdG9yeV0nLCAnaW5pdGlhbGl6ZSBhIG5ldyBwcm9qZWN0JylcbiAgLmFjdGlvbihjb21tYW5kcy5pbml0KTtcblxuY2xpLnBhcnNlKCk7XG4iLCAie1xuICBcIm5hbWVcIjogXCJ3eHRcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMC4yXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJOZXh0IGdlbiBmcmFtZXdvcmsgZm9yIGRldmVsb3Bpbmcgd2ViIGV4dGVuc2lvbnNcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ha2xpbmtlcjEvd3h0XCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJ2aXRlXCIsXG4gICAgXCJjaHJvbWVcIixcbiAgICBcIndlYlwiLFxuICAgIFwiZXh0ZW5zaW9uXCIsXG4gICAgXCJicm93c2VyXCIsXG4gICAgXCJidW5kbGVyXCIsXG4gICAgXCJmcmFtZXdvcmtcIlxuICBdLFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJuYW1lXCI6IFwiQWFyb24gS2xpbmtlclwiLFxuICAgIFwiZW1haWxcIjogXCJhYXJvbmtsaW5rZXIxK3d4dEBnbWFpbC5jb21cIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJkaXN0XCJcbiAgXSxcbiAgXCJiaW5cIjogXCJkaXN0L2NsaS5janNcIixcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiXG4gICAgfSxcbiAgICBcIi4vY2xpZW50XCI6IHtcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9jbGllbnQuY2pzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9jbGllbnQuanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvY2xpZW50LmQudHNcIlxuICAgIH1cbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInd4dFwiOiBcInRzeCBzcmMvY2xpL2luZGV4LnRzXCIsXG4gICAgXCJidWlsZFwiOiBcInRzeCBzY3JpcHRzL2J1aWxkLnRzXCIsXG4gICAgXCJmb3JtYXRcIjogXCJwcmV0dGllciAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcInByZXR0aWVyIC0td3JpdGUgLlwiLFxuICAgIFwiY29tcGlsZVwiOiBcInRzYyAtLW5vRW1pdFwiLFxuICAgIFwidGVzdFwiOiBcInZpdGVzdFwiLFxuICAgIFwidGVzdDpjb3ZlcmFnZVwiOiBcInZpdGVzdCBydW4gLS1jb3ZlcmFnZVwiLFxuICAgIFwicHJlcGFyZVwiOiBcInNpbXBsZS1naXQtaG9va3NcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJwbnBtIC1zIGJ1aWxkXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYXN5bmMtbXV0ZXhcIjogXCJeMC40LjBcIixcbiAgICBcImMxMlwiOiBcIl4xLjQuMlwiLFxuICAgIFwiY2FjXCI6IFwiXjYuNy4xNFwiLFxuICAgIFwiY29uc29sYVwiOiBcIl4zLjEuMFwiLFxuICAgIFwiZmFzdC1nbG9iXCI6IFwiXjMuMi4xMlwiLFxuICAgIFwiZmlsZXNpemVcIjogXCJeMTAuMC43XCIsXG4gICAgXCJmcy1leHRyYVwiOiBcIl4xMS4xLjFcIixcbiAgICBcImppdGlcIjogXCJeMS4xOC4yXCIsXG4gICAgXCJqc29uNVwiOiBcIl4yLjIuM1wiLFxuICAgIFwibGlua2Vkb21cIjogXCJeMC4xNC4yNlwiLFxuICAgIFwicGljb2NvbG9yc1wiOiBcIl4xLjAuMFwiLFxuICAgIFwicGljb21hdGNoXCI6IFwiXjIuMy4xXCIsXG4gICAgXCJ1bmltcG9ydFwiOiBcIl4zLjAuOFwiLFxuICAgIFwidml0ZVwiOiBcIl40LjMuOVwiLFxuICAgIFwid2ViLWV4dFwiOiBcIl43LjYuMlwiLFxuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBmYWtlci1qcy9mYWtlclwiOiBcIl44LjAuMlwiLFxuICAgIFwiQHR5cGVzL2ZzLWV4dHJhXCI6IFwiXjExLjAuMVwiLFxuICAgIFwiQHR5cGVzL2xvZGFzaC5tZXJnZVwiOiBcIl40LjYuN1wiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMy4xXCIsXG4gICAgXCJAdHlwZXMvcGljb21hdGNoXCI6IFwiXjIuMy4wXCIsXG4gICAgXCJAdHlwZXMvd2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiLFxuICAgIFwiQHZpdGVzdC9jb3ZlcmFnZS12OFwiOiBcIl4wLjMyLjJcIixcbiAgICBcImxvZGFzaC5tZXJnZVwiOiBcIl40LjYuMlwiLFxuICAgIFwibnBtLXJ1bi1hbGxcIjogXCJeNC4xLjVcIixcbiAgICBcIm9yYVwiOiBcIl42LjMuMVwiLFxuICAgIFwicHJldHRpZXJcIjogXCJeMi44LjhcIixcbiAgICBcInByZXR0eS1xdWlja1wiOiBcIl4zLjEuM1wiLFxuICAgIFwic2ltcGxlLWdpdC1ob29rc1wiOiBcIl4yLjguMVwiLFxuICAgIFwidHN1cFwiOiBcIl43LjAuMFwiLFxuICAgIFwidHN4XCI6IFwiXjMuMTIuN1wiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjEuM1wiLFxuICAgIFwidml0ZXN0XCI6IFwiXjAuMzIuMlwiLFxuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCI+PTAuMTAuMFwiXG4gIH0sXG4gIFwicGFja2FnZU1hbmFnZXJcIjogXCJwbnBtQDguNi4zXCIsXG4gIFwic2ltcGxlLWdpdC1ob29rc1wiOiB7XG4gICAgXCJwcmUtY29tbWl0XCI6IFwicG5wbSBwcmV0dHktcXVpY2sgLS1zdGFnZWRcIlxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgRXh0ZW5zaW9uUnVubmVyQ29uZmlnLFxuICBJbmxpbmVDb25maWcsXG4gIEludGVybmFsQ29uZmlnLFxuICBVc2VyQ29uZmlnLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aCwgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBpbXBvcnRUc0ZpbGUgfSBmcm9tICcuL2ltcG9ydFRzRmlsZSc7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gJy4uL3ZpdGUtcGx1Z2lucyc7XG5pbXBvcnQgeyBjcmVhdGVGc0NhY2hlIH0gZnJvbSAnLi9jcmVhdGVGc0NhY2hlJztcbmltcG9ydCB7IGdldEdsb2JhbHMgfSBmcm9tICcuL2dsb2JhbHMnO1xuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gJ2MxMic7XG5cbi8qKlxuICogR2l2ZW4gYW4gaW5saW5lIGNvbmZpZywgZGlzY292ZXIgdGhlIGNvbmZpZyBmaWxlIGlmIG5lY2Vzc2FyeSwgbWVyZ2UgdGhlIHJlc3VsdHMsIHJlc29sdmUgYW55XG4gKiByZWxhdGl2ZSBwYXRocywgYW5kIGFwcGx5IGFueSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEludGVybmFsQ29uZmlnKFxuICBjb25maWc6IElubGluZUNvbmZpZyxcbiAgY29tbWFuZDogJ2J1aWxkJyB8ICdzZXJ2ZScsXG4pOiBQcm9taXNlPEludGVybmFsQ29uZmlnPiB7XG4gIC8vIEFwcGx5IGRlZmF1bHRzIHRvIGEgYmFzZSBjb25maWdcbiAgY29uc3Qgcm9vdCA9IGNvbmZpZy5yb290ID8gcGF0aC5yZXNvbHZlKGNvbmZpZy5yb290KSA6IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IG1vZGUgPVxuICAgIGNvbmZpZy5tb2RlID8/IChjb21tYW5kID09PSAnYnVpbGQnID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50Jyk7XG4gIGNvbnN0IGJyb3dzZXIgPSBjb25maWcuYnJvd3NlciA/PyAnY2hyb21lJztcbiAgY29uc3QgbWFuaWZlc3RWZXJzaW9uID1cbiAgICBjb25maWcubWFuaWZlc3RWZXJzaW9uID8/IChicm93c2VyID09ICdmaXJlZm94JyA/IDIgOiAzKTtcbiAgY29uc3Qgb3V0QmFzZURpciA9IHBhdGgucmVzb2x2ZShyb290LCAnLm91dHB1dCcpO1xuICBjb25zdCBvdXREaXIgPSBwYXRoLnJlc29sdmUob3V0QmFzZURpciwgYCR7YnJvd3Nlcn0tbXYke21hbmlmZXN0VmVyc2lvbn1gKTtcbiAgY29uc3QgbG9nZ2VyID0gY29uZmlnLmxvZ2dlciA/PyBjb25zb2xhO1xuXG4gIGNvbnN0IGJhc2VDb25maWc6IEludGVybmFsQ29uZmlnTm9Vc2VyRGlycyA9IHtcbiAgICByb290LFxuICAgIG91dERpcixcbiAgICBvdXRCYXNlRGlyLFxuICAgIHN0b3JlSWRzOiBjb25maWcuc3RvcmVJZHMgPz8ge30sXG4gICAgYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kZSxcbiAgICBjb21tYW5kLFxuICAgIGxvZ2dlcixcbiAgICB2aXRlOiBjb25maWcudml0ZSA/PyB7fSxcbiAgICBtYW5pZmVzdDogY29uZmlnLm1hbmlmZXN0ID8/IHt9LFxuICAgIGltcG9ydHM6IGNvbmZpZy5pbXBvcnRzID8/IHt9LFxuICAgIHJ1bm5lckNvbmZpZzogYXdhaXQgbG9hZENvbmZpZzxFeHRlbnNpb25SdW5uZXJDb25maWc+KHtcbiAgICAgIG5hbWU6ICd3ZWItZXh0JyxcbiAgICAgIGN3ZDogcm9vdCxcbiAgICAgIGdsb2JhbFJjOiB0cnVlLFxuICAgICAgcmNGaWxlOiAnLndlYmV4dHJjJyxcbiAgICAgIG92ZXJyaWRlczogY29uZmlnLnJ1bm5lcixcbiAgICB9KSxcbiAgfTtcblxuICAvLyBMb2FkIHVzZXIgY29uZmlnIGZyb20gZmlsZVxuICBsZXQgdXNlckNvbmZpZzogVXNlckNvbmZpZyA9IHtcbiAgICBtb2RlLFxuICB9O1xuICBpZiAoY29uZmlnLmNvbmZpZ0ZpbGUgIT09IGZhbHNlKSB7XG4gICAgdXNlckNvbmZpZyA9IGF3YWl0IGltcG9ydFRzRmlsZTxVc2VyQ29uZmlnPihcbiAgICAgIHJvb3QsXG4gICAgICBwYXRoLnJlc29sdmUocm9vdCwgY29uZmlnLmNvbmZpZ0ZpbGUgPz8gJ3d4dC5jb25maWcudHMnKSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWVyZ2UgaW5saW5lIGFuZCB1c2VyIGNvbmZpZ3NcbiAgY29uc3QgbWVyZ2VkID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBiYXNlQ29uZmlnLFxuICAgIHVzZXJDb25maWcsXG4gICkgYXMgSW50ZXJuYWxDb25maWdOb1VzZXJEaXJzO1xuXG4gIC8vIEFwcGx5IHVzZXIgY29uZmlnIGFuZCBjcmVhdGUgZmluYWwgY29uZmlnXG4gIGNvbnN0IHNyY0RpciA9IHVzZXJDb25maWcuc3JjRGlyID8gcmVzb2x2ZShyb290LCB1c2VyQ29uZmlnLnNyY0RpcikgOiByb290O1xuICBjb25zdCBlbnRyeXBvaW50c0RpciA9IHJlc29sdmUoXG4gICAgc3JjRGlyLFxuICAgIHVzZXJDb25maWcuZW50cnlwb2ludHNEaXIgPz8gJ2VudHJ5cG9pbnRzJyxcbiAgKTtcbiAgY29uc3QgcHVibGljRGlyID0gcmVzb2x2ZShzcmNEaXIsIHVzZXJDb25maWcucHVibGljRGlyID8/ICdwdWJsaWMnKTtcbiAgY29uc3Qgd3h0RGlyID0gcmVzb2x2ZShzcmNEaXIsICcud3h0Jyk7XG4gIGNvbnN0IHR5cGVzRGlyID0gcmVzb2x2ZSh3eHREaXIsICd0eXBlcycpO1xuXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBJbnRlcm5hbENvbmZpZyA9IHtcbiAgICAuLi5tZXJnZWQsXG4gICAgc3JjRGlyLFxuICAgIGVudHJ5cG9pbnRzRGlyLFxuICAgIHB1YmxpY0RpcixcbiAgICB3eHREaXI6IHd4dERpcixcbiAgICB0eXBlc0RpcixcbiAgICBmc0NhY2hlOiBjcmVhdGVGc0NhY2hlKHd4dERpciksXG4gIH07XG5cbiAgLy8gQ3VzdG9taXplIHRoZSBkZWZhdWx0IHZpdGUgY29uZmlnXG4gIGZpbmFsQ29uZmlnLnZpdGUucm9vdCA9IHJvb3Q7XG4gIGZpbmFsQ29uZmlnLnZpdGUuY29uZmlnRmlsZSA9IGZhbHNlO1xuICBmaW5hbENvbmZpZy52aXRlLmxvZ0xldmVsID0gJ3dhcm4nO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUuYnVpbGQgPz89IHt9O1xuICBmaW5hbENvbmZpZy52aXRlLmJ1aWxkLm91dERpciA9IG91dERpcjtcbiAgZmluYWxDb25maWcudml0ZS5idWlsZC5lbXB0eU91dERpciA9IGZhbHNlO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucyA/Pz0gW107XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZG93bmxvYWQoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kZXZIdG1sUHJlcmVuZGVyKGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMudW5pbXBvcnQoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2goXG4gICAgcGx1Z2lucy52aXJ0dWFsRW50cnlwb2luKCdiYWNrZ3JvdW5kJywgZmluYWxDb25maWcpLFxuICApO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2NvbnRlbnQtc2NyaXB0JywgZmluYWxDb25maWcpLFxuICApO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRldlNlcnZlckdsb2JhbHMoZmluYWxDb25maWcpKTtcblxuICBmaW5hbENvbmZpZy52aXRlLmRlZmluZSA/Pz0ge307XG4gIGdldEdsb2JhbHMoZmluYWxDb25maWcpLmZvckVhY2goKGdsb2JhbCkgPT4ge1xuICAgIGZpbmFsQ29uZmlnLnZpdGUuZGVmaW5lIVtnbG9iYWwubmFtZV0gPSBKU09OLnN0cmluZ2lmeShnbG9iYWwudmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gZmluYWxDb25maWc7XG59XG5cbi8qKlxuICogSGVscGVyIHR5cGUgZm9yIGRlZmluaW5nIGEgYmFzZSBjb25maWcsIHNpbmNlIHVzZXItY29uZmlndXJhYmxlIGRpcmVjdG9yaWVzIG11c3QgYmUgc2V0IGFmdGVyXG4gKiByZWFkaW5nIGluIHRoZSB1c2VyIGNvbmZpZy5cbiAqL1xudHlwZSBJbnRlcm5hbENvbmZpZ05vVXNlckRpcnMgPSBPbWl0PFxuICBJbnRlcm5hbENvbmZpZyxcbiAgJ3NyY0RpcicgfCAncHVibGljRGlyJyB8ICdlbnRyeXBvaW50c0RpcicgfCAnd3h0RGlyJyB8ICd0eXBlc0RpcicgfCAnZnNDYWNoZSdcbj47XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IGNyZWF0ZUpJVEkgZnJvbSAnaml0aSc7XG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJ2ppdGkvZGlzdC9iYWJlbCc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzY2FuRXhwb3J0cyB9IGZyb20gJ3VuaW1wb3J0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFRzRmlsZTxUPihyb290OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCBjbGllbnRJbXBvcnRzID0gYXdhaXQgc2NhbkV4cG9ydHMoXG4gICAgcmVzb2x2ZShyb290LCAnbm9kZV9tb2R1bGVzL3d4dC9kaXN0L2NsaWVudC5qcycpLFxuICApO1xuICBjb25zdCBqaXRpID0gY3JlYXRlSklUSShfX2ZpbGVuYW1lLCB7XG4gICAgY2FjaGU6IGZhbHNlLFxuICAgIGVzbVJlc29sdmU6IHRydWUsXG4gICAgaW50ZXJvcERlZmF1bHQ6IHRydWUsXG5cbiAgICB0cmFuc2Zvcm0ob3B0cykge1xuICAgICAgLy8gUmVtb3ZlIENTUyBpbXBvcnRzIGZyb20gdGhlIHNvdXJjZSBjb2RlIC0gSml0aSBjYW4ndCBoYW5kbGUgdGhlbS5cbiAgICAgIG9wdHMuc291cmNlID0gb3B0cy5zb3VyY2UucmVwbGFjZSgvXmltcG9ydCBbJ1wiXS4qXFwuY3NzWydcIl07PyQvZ20sICcnKTtcbiAgICAgIG9wdHMuc291cmNlID0gb3B0cy5zb3VyY2UucmVwbGFjZShcbiAgICAgICAgL15pbXBvcnRcXHMrLipcXHMrZnJvbSBbJ1wiXXdlYmV4dGVuc2lvbi1wb2x5ZmlsbFsnXCJdOz8kL2dtLFxuICAgICAgICAnJyxcbiAgICAgICk7XG5cbiAgICAgIC8vIEFwcGVuZCBhbnkgd3h0L2NsaWVudCBmdW5jdGlvbnMgc28gYmFiZWwgZG9lc24ndCBjb21wbGFpbiBhYm91dCB1bmRlZmluZWQgdmFyaWFibGVzXG4gICAgICBpZiAob3B0cy5maWxlbmFtZSA9PT0gcGF0aCkge1xuICAgICAgICAvLyBUT0RPOiBPbmx5IGFwcGVuZCBpbXBvcnQgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbXBvcnRlZFxuICAgICAgICBjb25zdCBpbXBvcnRzID1cbiAgICAgICAgICBjbGllbnRJbXBvcnRzXG4gICAgICAgICAgICAubWFwKChpKSA9PiBgaW1wb3J0IHsgJHtpLm5hbWV9IH0gZnJvbSBcIiR7aS5mcm9tfVwiO2ApXG4gICAgICAgICAgICAuam9pbignXFxuJykgKyAnXFxuJztcbiAgICAgICAgb3B0cy5zb3VyY2UgPSBpbXBvcnRzICsgb3B0cy5zb3VyY2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgdGhlIGRlZmF1bHQgYmFiZWwgdHJhbnNmb3JtZXIgd2l0aCBvdXIgbW9kaWZpZWQgc291cmNlIGNvZGVcbiAgICAgIHJldHVybiB0cmFuc2Zvcm0ob3B0cyk7XG4gICAgfSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGppdGkocGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGEuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgZmlsZTogJHtwYXRofWApO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgcGFyc2VIVE1MIH0gZnJvbSAnbGlua2Vkb20nO1xuaW1wb3J0IHsgZGlybmFtZSwgaXNBYnNvbHV0ZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBQcmUtcmVuZGVycyB0aGUgSFRNTCBlbnRyeXBvaW50cyB3aGVuIGJ1aWxkaW5nIHRoZSBleHRlbnNpb24gdG8gY29ubmVjdCB0byB0aGUgZGV2IHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldkh0bWxQcmVyZW5kZXIoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBuYW1lOiAnd3h0OmRldi1odG1sLXByZXJlbmRlcicsXG4gICAgY29uZmlnKHVzZXJDb25maWcpIHtcbiAgICAgIHJldHVybiB2aXRlLm1lcmdlQ29uZmlnKFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICAgJ0B3eHQvcmVsb2FkLWh0bWwnOiByZXNvbHZlKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL3JlbG9hZC1odG1sLmpzJyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckNvbmZpZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oaHRtbCwgaWQpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IGNvbmZpZy5zZXJ2ZXI7XG4gICAgICBpZiAoY29uZmlnLmNvbW1hbmQgIT09ICdzZXJ2ZScgfHwgc2VydmVyID09IG51bGwgfHwgIWlkLmVuZHNXaXRoKCcuaHRtbCcpKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gYCR7c2VydmVyLm9yaWdpbn0ke2lkfWA7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBpZCk7XG4gICAgICBjb25zdCB1cmwgPSBgJHtzZXJ2ZXIub3JpZ2lufS8ke25hbWV9Lmh0bWxgO1xuICAgICAgY29uc3Qgc2VydmVySHRtbCA9IGF3YWl0IHNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwoXG4gICAgICAgIHVybCxcbiAgICAgICAgaHRtbCxcbiAgICAgICAgb3JpZ2luYWxVcmwsXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKHNlcnZlckh0bWwpO1xuXG4gICAgICBjb25zdCBwb2ludFRvRGV2U2VydmVyID0gKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgIGlmICghc3JjKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShzcmMpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBzZXJ2ZXIub3JpZ2luICsgc3JjKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNyYy5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHJlc29sdmUoZGlybmFtZShpZCksIHNyYyk7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHJlbGF0aXZlKGNvbmZpZy5yb290LCBhYnMpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgYCR7c2VydmVyLm9yaWdpbn0vJHtwYXRobmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ3NjcmlwdFt0eXBlPW1vZHVsZV0nLCAnc3JjJyk7XG4gICAgICBwb2ludFRvRGV2U2VydmVyKCdsaW5rW3JlbD1zdHlsZXNoZWV0XScsICdocmVmJyk7XG5cbiAgICAgIC8vIEFkZCBhIHNjcmlwdCB0byBhZGQgcGFnZSByZWxvYWRpbmdcbiAgICAgIGNvbnN0IHJlbG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICByZWxvYWRlci5zcmMgPSAnQHd4dC9yZWxvYWQtaHRtbCc7XG4gICAgICByZWxvYWRlci50eXBlID0gJ21vZHVsZSc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlbG9hZGVyKTtcblxuICAgICAgY29uc3QgbmV3SHRtbCA9IGRvY3VtZW50LnRvU3RyaW5nKCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdUcmFuc2Zvcm1lZCAnICsgaWQpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnT2xkIEhUTUw6XFxuJyArIGh0bWwpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTmV3IEhUTUw6XFxuJyArIG5ld0h0bWwpO1xuICAgICAgcmV0dXJuIG5ld0h0bWw7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGgsIHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE5hbWUoXG4gIGVudHJ5cG9pbnRzRGlyOiBzdHJpbmcsXG4gIGlucHV0UGF0aDogc3RyaW5nLFxuICAvLyB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGVudHJ5cG9pbnRzRGlyLCBpbnB1dFBhdGgpO1xuICAvLyBHcmFiIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IC4gb3IgL1xuICBjb25zdCBuYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KC9bXFwuXFwvXS8sIDIpWzBdO1xuXG4gIHJldHVybiBuYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmUoZW50cnlwb2ludC5vdXRwdXREaXIsIGAke2VudHJ5cG9pbnQubmFtZX0ke2V4dH1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4ncyB0aGUgZW50cnlwb2ludCdzIG91dHB1dCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBVc2VkIGZvciBwYXRocyBpbiB0aGVcbiAqIG1hbmlmZXN0IGFuZCByb2xsdXAncyBidW5kbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgZW50cnlwb2ludDogRW50cnlwb2ludCxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbGF0aXZlKG91dERpciwgZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoZW50cnlwb2ludCwgZXh0KSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBEZWZpbmVzIGdsb2JhbCBjb25zdGFudHMgYWJvdXQgdGhlIGRldiBzZXJ2ZXIuIEhlbHBzIHNjcmlwdHMgY29ubmVjdCB0byB0aGUgc2VydmVyJ3Mgd2ViIHNvY2tldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldlNlcnZlckdsb2JhbHMoaW50ZXJuYWxDb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmRldi1zZXJ2ZXItZ2xvYmFscycsXG4gICAgY29uZmlnKGNvbmZpZykge1xuICAgICAgaWYgKGludGVybmFsQ29uZmlnLnNlcnZlciA9PSBudWxsIHx8IGludGVybmFsQ29uZmlnLmNvbW1hbmQgPT0gJ2J1aWxkJylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25maWcuZGVmaW5lID8/PSB7fTtcbiAgICAgIGNvbmZpZy5kZWZpbmUuX19ERVZfU0VSVkVSX1BST1RPQ09MX18gPSBKU09OLnN0cmluZ2lmeSgnd3M6Jyk7XG4gICAgICBjb25maWcuZGVmaW5lLl9fREVWX1NFUlZFUl9IT1NUTkFNRV9fID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGludGVybmFsQ29uZmlnLnNlcnZlci5ob3N0bmFtZSxcbiAgICAgICk7XG4gICAgICBjb25maWcuZGVmaW5lLl9fREVWX1NFUlZFUl9QT1JUX18gPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgaW50ZXJuYWxDb25maWcuc2VydmVyLnBvcnQsXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IGRucyBmcm9tICdub2RlOmRucyc7XG5pbXBvcnQgeyB3aXRoVGltZW91dCB9IGZyb20gJy4vcHJvbWlzZXMnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGlzT2ZmbGluZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgaXNPZmZsaW5lID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlcykgPT4ge1xuICAgIGRucy5yZXNvbHZlKCdnb29nbGUuY29tJywgKGVycikgPT4ge1xuICAgICAgaWYgKGVyciA9PSBudWxsKSB7XG4gICAgICAgIHJlcyhmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXModHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gd2l0aFRpbWVvdXQoaXNPZmZsaW5lLCAxZTMpLmNhdGNoKCgpID0+IHRydWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNPbmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG9mZmxpbmUgPSBhd2FpdCBpc09mZmxpbmUoKTtcbiAgcmV0dXJuICFvZmZsaW5lO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSBVUkwgd2l0aCBhIHNpbXBsZSBHRVQgcmVxdWVzdC4gR3JhYnMgaXQgZnJvbSBjYWNoZSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBvciB0aHJvd3MgYW5cbiAqIGVycm9yIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkIHZpYSB0aGUgbmV0d29yayBvciBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2FjaGVkKFxuICB1cmw6IHN0cmluZyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmcgPSAnJztcblxuICBpZiAoYXdhaXQgaXNPbmxpbmUoKSkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgYXdhaXQgY29uZmlnLmZzQ2FjaGUuc2V0KHVybCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgXCIke3VybH1cIiwgZmFsbGluZyBiYWNrIHRvIGNhY2hlLi4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250ZW50KSBjb250ZW50ID0gKGF3YWl0IGNvbmZpZy5mc0NhY2hlLmdldCh1cmwpKSA/PyAnJztcbiAgaWYgKCFjb250ZW50KVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYE9mZmxpbmUgYW5kIFwiJHt1cmx9XCIgaGFzIG5vdCBiZWVuIGNhY2hlZC4gVHJ5IGFnYWluIHdoZW4gb25saW5lLmAsXG4gICAgKTtcblxuICByZXR1cm4gY29udGVudDtcbn1cbiIsICIvKipcbiAqIEFkZCBhIHRpbWVvdXQgdG8gYSBwcm9taXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlaihgUHJvbWlzZSB0aW1lZCBvdXQgYWZ0ZXIgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgICBwcm9taXNlXG4gICAgICAudGhlbihyZXMpXG4gICAgICAuY2F0Y2gocmVqKVxuICAgICAgLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgRG9uJ3QgdXNlIGluIHByb2R1Y3Rpb24sIGp1c3QgZm9yIHRlc3RpbmcgYW5kIHNsb3dpbmcgdGhpbmdzIGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzKSA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hDYWNoZWQgfSBmcm9tICcuLi91dGlscy9uZXR3b3JrJztcblxuLyoqXG4gKiBEb3dubG9hZHMgYW55IFVSTCBpbXBvcnRzLCBsaWtlIEdvb2dsZSBBbmFseXRpY3MsIGludG8gdmlydHVhbCBtb2R1bGVzIHNvIHRoZXkgYXJlIGJ1bmRsZWQgd2l0aFxuICogdGhlIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiByZW1vdGUgY29kZSBhdCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgXCJ1cmw6aHR0cHM6Ly9nb29nbGUtdGFnbWFuYWdlci5jb20vZ3RhZz9pZD1YWVpcIjtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZG93bmxvYWQnLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoJ3VybDonKSkgcmV0dXJuICdcXDAnICsgaWQ7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgoJ1xcMHVybDonKSkgcmV0dXJuO1xuXG4gICAgICAvLyBMb2FkIGZpbGUgZnJvbSBuZXR3b3JrIG9yIGNhY2hlXG4gICAgICBjb25zdCB1cmwgPSBpZC5yZXBsYWNlKCdcXDB1cmw6JywgJycpO1xuICAgICAgcmV0dXJuIGF3YWl0IGZldGNoQ2FjaGVkKHVybCwgY29uZmlnKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhlIEhUTUwgZmlsZXMgb3V0cHV0IGJ5IGEgbXVsdGlwYWdlIGJ1aWxkIGFyZSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4gVGhpcyBkb2VzIHR3b1xuICogdGhpbmdzOlxuICpcbiAqIDEuIE1vdmVzIHRoZSBITVRMIGZpbGVzIHRvIHRoZWlyIGZpbmFsIGxvY2F0aW9uIGF0IGA8b3V0RGlyPi88ZW50cnlwb2ludC5uYW1lPi5odG1sYC5cbiAqIDIuIFVwZGF0ZXMgdGhlIGJ1bmRsZSBzbyBpdCBzdW1tYXJpemVzIHRoZSBmaWxlcyBjb3JyZWN0bHkgaW4gdGhlIHJldHVybmVkIGJ1aWxkIG91dHB1dC5cbiAqXG4gKiBBc3NldHMgKEpTIGFuZCBDU1MpIGFyZSBvdXRwdXQgdG8gdGhlIGA8b3V0RGlyPi9hc3NldHNgIGRpcmVjdG9yeSwgYW5kIGRvbid0IG5lZWQgdG8gYmUgbW9kaWZpZWQuXG4gKiBIVE1MIGZpbGVzIGFjY2VzcyB0aGVtIHZpYSBhYnNvbHV0ZSBVUkxzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSBhbnkgaW1wb3J0IHBhdGhzIGluIHRoZSBIVE1MXG4gKiBmaWxlcyBlaXRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBhZ2VNb3ZlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6bXVsdGlwYWdlLW1vdmUnLFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgZm9yIChjb25zdCBvbGRCdW5kbGVQYXRoIGluIGJ1bmRsZSkge1xuICAgICAgICAvLyBvbGRCdW5kbGVQYXRoID0gJ2VudHJ5cG9pbnRzL3BvcHVwLmh0bWwnIG9yICdlbnRyeXBvaW50cy9vIHB0aW9ucy9pbmRleC5odG1sJ1xuXG4gICAgICAgIC8vIEZpbmQgYSBtYXRjaGluZyBlbnRyeXBvaW50IC0gb2xkQnVuZGxlUGF0aCBpcyB0aGUgc2FtZSBhcyBlbmQgZW5kIG9mIHRoZSBpbnB1dCBwYXRoLlxuICAgICAgICBjb25zdCBlbnRyeXBvaW50ID0gZW50cnlwb2ludHMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+ICEhZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKG9sZEJ1bmRsZVBhdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZW50cnlwb2ludCA9PSBudWxsKSB7XG4gICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTm8gZW50cnlwb2ludCBmb3VuZCBmb3InLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmV3IGJ1bmRsZSBwYXRoXG4gICAgICAgIGNvbnN0IG5ld0J1bmRsZVBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgZXh0bmFtZShvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0J1bmRsZVBhdGggPT09IG9sZEJ1bmRsZVBhdGgpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgJ0hUTUwgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uJyxcbiAgICAgICAgICAgIG9sZEJ1bmRsZVBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgZmlsZSBhbmQgdXBkYXRlIGJ1bmRsZVxuICAgICAgICAvLyBEbyB0aGlzIGluc2lkZSBhIG11dGV4IGxvY2sgc28gaXQgb25seSBydW5zIG9uZSBhdCBhIHRpbWUgZm9yIGNvbmN1cnJlbnQgbXVsdGlwYWdlIGJ1aWxkc1xuICAgICAgICBjb25zdCBvbGRBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3QWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgbmV3QnVuZGxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5ld0Fic1BhdGgpKTtcbiAgICAgICAgYXdhaXQgZnMubW92ZShvbGRBYnNQYXRoLCBuZXdBYnNQYXRoLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCByZW5hbWVkQ2h1bmsgPSB7XG4gICAgICAgICAgLi4uYnVuZGxlW29sZEJ1bmRsZVBhdGhdLFxuICAgICAgICAgIGZpbGVOYW1lOiBuZXdCdW5kbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgYnVuZGxlW29sZEJ1bmRsZVBhdGhdO1xuICAgICAgICBidW5kbGVbbmV3QnVuZGxlUGF0aF0gPSByZW5hbWVkQ2h1bms7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuXG4vKipcbiAqIEluamVjdCBhbnkgZ2xvYmFsIGltcG9ydHMgZGVmaW5lZCBieSB1bmltcG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pbXBvcnQoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChvcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6dW5pbXBvcnQnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICByZXR1cm4gdW5pbXBvcnQuaW5qZWN0SW1wb3J0cyhjb2RlLCBpZCk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBVbmltcG9ydE9wdGlvbnMgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmltcG9ydE9wdGlvbnMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQYXJ0aWFsPFVuaW1wb3J0T3B0aW9ucz4ge1xuICBjb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+ID0ge1xuICAgIGRlYnVnTG9nOiBjb25maWcubG9nZ2VyLmRlYnVnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgIHsgbmFtZTogJyonLCBhczogJ2Jyb3dzZXInLCBmcm9tOiAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJyB9LFxuICAgICAgeyBuYW1lOiAnZGVmaW5lQ29uZmlnJywgZnJvbTogJ3d4dCcgfSxcbiAgICBdLFxuICAgIHByZXNldHM6IFt7IHBhY2thZ2U6ICd3eHQvY2xpZW50JyB9XSxcbiAgICB3YXJuOiBjb25maWcubG9nZ2VyLndhcm4sXG4gICAgZGlyczogWydjb21wb25lbnRzJywgJ2NvbXBvc2FibGVzJywgJ2hvb2tzJywgJ3V0aWxzJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBXcmFwcyBhIHVzZXIncyBlbnRyeXBvaW50IHdpdGggYSB2aXR1YWwgdmVyc2lvbiB3aXRoIGFkZGl0aW9uYWwgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXJ0dWFsRW50cnlwb2luKFxuICB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQbHVnaW4ge1xuICBjb25zdCB2aXJ0dWFsSWQgPSBgdmlydHVhbDp3eHQtJHt0eXBlfT9gO1xuICBjb25zdCByZXNvbHZlZFZpcnR1YWxJZCA9IGBcXDAke3ZpcnR1YWxJZH1gO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogYHd4dDp2aXJ0dWFsLWVudHJ5cG9pbnRgLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgLy8gSWQgZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCwgaXQgbG9va3MgbGlrZSB0aGlzOlxuICAgICAgLy8gL3BhdGgvdG8vcHJvamVjdC92aXJ0dWFsOmJhY2tncm91bmQ/L3BhdGgvdG8vcHJvamVjdC9lbnRyeXBvaW50cy9iYWNrZ3JvdW5kLnRzXG4gICAgICBjb25zdCBpbmRleCA9IGlkLmluZGV4T2YodmlydHVhbElkKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRWaXJ0dWFsSWQgKyBpbnB1dFBhdGg7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgocmVzb2x2ZWRWaXJ0dWFsSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IGlkLnJlcGxhY2UocmVzb2x2ZWRWaXJ0dWFsSWQsICcnKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgIHJlc29sdmUoXG4gICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgYG5vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvJHt0eXBlfS1lbnRyeXBvaW50LmpzYCxcbiAgICAgICAgKSxcbiAgICAgICAgJ3V0Zi04JyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShgdmlydHVhbDp1c2VyLSR7dHlwZX1gLCBpbnB1dFBhdGgpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEZzQ2FjaGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbi8qKlxuICogQSBiYXNpYyBmaWxlIHN5c3RlbSBjYWNoZSBzdG9yZWQgYXQgYDxzcmNEaXI+Ly53eHQvY2FjaGUvPGtleT5gLiBKdXN0IGNhY2hlcyBhIHN0cmluZyBpbiBhXG4gKiBmaWxlIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSBzcmNEaXIgQWJzb2x1dGUgcGF0aCB0byBzb3VyY2UgZGlyZWN0b3J5LiBTZWUgYEludGVybmFsQ29uZmlnLnNyY0RpcmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZzQ2FjaGUod3h0RGlyOiBzdHJpbmcpOiBGc0NhY2hlIHtcbiAgY29uc3QgZ2V0UGF0aCA9IChrZXk6IHN0cmluZykgPT5cbiAgICByZXNvbHZlKHd4dERpciwgJ2NhY2hlJywgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUocGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIHZhbHVlLCAndXRmLTgnKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbHMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueTsgdHlwZTogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBuYW1lOiAnX19NQU5JRkVTVF9WRVJTSU9OX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgICB0eXBlOiBgMiB8IDNgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fQlJPV1NFUl9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlcixcbiAgICAgIHR5cGU6IGBcImNocm9taXVtXCIgfCBcImZpcmVmb3hcImAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19DSFJPTUVfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdjaHJvbWUnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRklSRUZPWF9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfU0FGQVJJX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnc2FmYXJpJyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0VER0VfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdlZGdlJyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX09QRVJBX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnb3BlcmEnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fQ09NTUFORF9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuY29tbWFuZCxcbiAgICAgIHR5cGU6IGBcImJ1aWxkXCIgfCBcInNlcnZlXCJgLFxuICAgIH0sXG4gIF07XG59XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4gIENvbnRlbnRTY3JpcHREZWZpbml0aW9uLFxuICBDb250ZW50U2NyaXB0RW50cnlwb2ludCxcbiAgRW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGljb21hdGNoIGZyb20gJ3BpY29tYXRjaCc7XG5pbXBvcnQgeyBwYXJzZUhUTUwgfSBmcm9tICdsaW5rZWRvbSc7XG5pbXBvcnQgSlNPTjUgZnJvbSAnanNvbjUnO1xuaW1wb3J0IHsgaW1wb3J0VHNGaWxlIH0gZnJvbSAnLi4vdXRpbHMvaW1wb3J0VHNGaWxlJztcbmltcG9ydCBnbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50TmFtZSB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcblxuLyoqXG4gKiBSZXR1cm4gZW50cnlwb2ludHMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gYnkgbG9va2luZyB0aHJvdWdoIHRoZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEVudHJ5cG9pbnRzKFxuICBjb25maWc6IEZpbmRFbnRyeXBvaW50c0NvbmZpZyxcbik6IFByb21pc2U8RW50cnlwb2ludFtdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBhd2FpdCBnbG9iKCcqKi8qJywge1xuICAgIGN3ZDogY29uZmlnLmVudHJ5cG9pbnRzRGlyLFxuICB9KTtcbiAgLy8gRW5zdXJlIGNvbnNpc3RlbnQgb3V0cHV0XG4gIHJlbGF0aXZlUGF0aHMuc29ydCgpO1xuXG4gIGNvbnN0IHBhdGhHbG9icyA9IE9iamVjdC5rZXlzKFBBVEhfR0xPQl9UT19UWVBFX01BUCk7XG4gIGNvbnN0IGV4aXN0aW5nTmFtZXM6IFJlY29yZDxzdHJpbmcsIEVudHJ5cG9pbnQgfCB1bmRlZmluZWQ+ID0ge307XG5cbiAgY29uc3QgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSA9IFtdO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByZWxhdGl2ZVBhdGhzLm1hcChhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShjb25maWcuZW50cnlwb2ludHNEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCBtYXRjaGluZ0dsb2IgPSBwYXRoR2xvYnMuZmluZCgoZ2xvYikgPT5cbiAgICAgICAgcGljb21hdGNoLmlzTWF0Y2gocmVsYXRpdmVQYXRoLCBnbG9iKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0dsb2IgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGAke3JlbGF0aXZlUGF0aH0gZG9lcyBub3QgbWF0Y2ggYW55IGtub3duIGVudHJ5cG9pbnQuIEtub3duIGVudHJ5cG9pbnRzOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBQQVRIX0dMT0JfVE9fVFlQRV9NQVAsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBQQVRIX0dMT0JfVE9fVFlQRV9NQVBbbWF0Y2hpbmdHbG9iXTtcbiAgICAgIGlmICh0eXBlID09PSAnaWdub3JlZCcpIHJldHVybjtcblxuICAgICAgbGV0IGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQ7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAncG9wdXAnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRQb3B1cEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3B0aW9ucyc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldE9wdGlvbnNFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JhY2tncm91bmQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb250ZW50LXNjcmlwdCc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldENvbnRlbnRTY3JpcHRFbnRyeXBvaW50KFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVsYXRpdmVQYXRoLnNwbGl0KCcuJywgMilbMF0sXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZW50cnlwb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdpdGhTYW1lTmFtZSA9IGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXTtcbiAgICAgIGlmICh3aXRoU2FtZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIGVudHJ5cG9pbnRzIHdpdGggdGhlIG5hbWUgXCIke1xuICAgICAgICAgICAgZW50cnlwb2ludC5uYW1lXG4gICAgICAgICAgfVwiIGRldGVjdGVkLCBidXQgb25seSBvbmUgaXMgYWxsb3dlZDogJHtbXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgd2l0aFNhbWVOYW1lLmlucHV0UGF0aCksXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgZW50cnlwb2ludC5pbnB1dFBhdGgpLFxuICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZW50cnlwb2ludHMucHVzaChlbnRyeXBvaW50KTtcbiAgICAgIGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXSA9IGVudHJ5cG9pbnQ7XG4gICAgfSksXG4gICk7XG4gIHJldHVybiBlbnRyeXBvaW50cztcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwb3B1cCBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvcHVwRW50cnlwb2ludChcbiAgY29uZmlnOiBGaW5kRW50cnlwb2ludHNDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8UG9wdXBFbnRyeXBvaW50PiB7XG4gIGNvbnN0IG9wdGlvbnM6IFBvcHVwRW50cnlwb2ludFsnb3B0aW9ucyddID0ge307XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICBpZiAodGl0bGUgIT0gbnVsbCkgb3B0aW9ucy5kZWZhdWx0VGl0bGUgPSB0aXRsZS50ZXh0Q29udGVudCA/PyB1bmRlZmluZWQ7XG5cbiAgY29uc3QgZGVmYXVsdEljb25Db250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuZGVmYXVsdF9pY29uJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoZGVmYXVsdEljb25Db250ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIG9wdGlvbnMuZGVmYXVsdEljb24gPSBKU09ONS5wYXJzZShkZWZhdWx0SWNvbkNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uZmlnLmxvZ2dlci5mYXRhbChcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBkZWZhdWx0X2ljb24gbWV0YSB0YWcgY29udGVudCBhcyBKU09ONS4gY29udGVudD0ke2RlZmF1bHRJY29uQ29udGVudH1gLFxuICAgICAgICBlcnIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG12MktleUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC50eXBlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAobXYyS2V5Q29udGVudCkge1xuICAgIG9wdGlvbnMubXYyS2V5ID1cbiAgICAgIG12MktleUNvbnRlbnQgPT09ICdwYWdlX2FjdGlvbicgPyAncGFnZV9hY3Rpb24nIDogJ2Jyb3dzZXJfYWN0aW9uJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3BvcHVwJyxcbiAgICBuYW1lOiAncG9wdXAnLFxuICAgIG9wdGlvbnMsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBvcHRpb25zIEhUTUwgZmlsZS5cbiAqIEBwYXJhbSBjb250ZW50IFN0cmluZyBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCB0aGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9uc0VudHJ5cG9pbnQoXG4gIGNvbmZpZzogRmluZEVudHJ5cG9pbnRzQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPE9wdGlvbnNFbnRyeXBvaW50PiB7XG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnNFbnRyeXBvaW50WydvcHRpb25zJ10gPSB7fTtcblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHsgZG9jdW1lbnQgfSA9IHBhcnNlSFRNTChjb250ZW50KTtcblxuICBjb25zdCBvcGVuSW5UYWJDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3Qub3Blbl9pbl90YWInXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChvcGVuSW5UYWJDb250ZW50KSB7XG4gICAgb3B0aW9ucy5vcGVuSW5UYWIgPSBCb29sZWFuKG9wZW5JblRhYkNvbnRlbnQpO1xuICB9XG5cbiAgY29uc3QgY2hyb21lU3R5bGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuY2hyb21lX3N0eWxlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoY2hyb21lU3R5bGVDb250ZW50KSB7XG4gICAgb3B0aW9ucy5jaHJvbWVTdHlsZSA9IEJvb2xlYW4oY2hyb21lU3R5bGVDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJTdHlsZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5icm93c2VyX3N0eWxlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoYnJvd3NlclN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuYnJvd3NlclN0eWxlID0gQm9vbGVhbihicm93c2VyU3R5bGVDb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ29wdGlvbnMnLFxuICAgIG5hbWU6ICdvcHRpb25zJyxcbiAgICBvcHRpb25zLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgYmFja2dyb3VuZCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJhY2tncm91bmRFbnRyeXBvaW50KFxuICBjb25maWc6IEZpbmRFbnRyeXBvaW50c0NvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxCYWNrZ3JvdW5kRW50cnlwb2ludD4ge1xuICBjb25zdCB7IG1haW46IF8sIC4uLm9wdGlvbnMgfSA9XG4gICAgYXdhaXQgaW1wb3J0VHNGaWxlPEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbj4oY29uZmlnLnJvb3QsIHBhdGgpO1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0JhY2tncm91bmQgc2NyaXB0IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2JhY2tncm91bmQnLFxuICAgIG5hbWU6ICdiYWNrZ3JvdW5kJyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgY29udGVudCBzY3JpcHQncyBUUyBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb250ZW50U2NyaXB0RW50cnlwb2ludChcbiAgY29uZmlnOiBGaW5kRW50cnlwb2ludHNDb25maWcsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxDb250ZW50U2NyaXB0RW50cnlwb2ludD4ge1xuICBjb25zdCB7IG1haW46IF8sIC4uLm9wdGlvbnMgfSA9IGF3YWl0IGltcG9ydFRzRmlsZTxDb250ZW50U2NyaXB0RGVmaW5pdGlvbj4oXG4gICAgY29uZmlnLnJvb3QsXG4gICAgcGF0aCxcbiAgKTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKGBDb250ZW50IHNjcmlwdCAke25hbWV9IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydGApO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IHJlc29sdmUoY29uZmlnLm91dERpciwgJ2NvbnRlbnQtc2NyaXB0cycpLFxuICAgIG9wdGlvbnMsXG4gIH07XG59XG5cbmNvbnN0IFBBVEhfR0xPQl9UT19UWVBFX01BUDogUmVjb3JkPHN0cmluZywgRW50cnlwb2ludFsndHlwZSddIHwgJ2lnbm9yZWQnPiA9IHtcbiAgJ3NhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJ3NhbmRib3gvaW5kZXguaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC5odG1sJzogJ3NhbmRib3gnLFxuICAnKi5zYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG5cbiAgJ2Jvb2ttYXJrcy5odG1sJzogJ2Jvb2ttYXJrcycsXG4gICdib29rbWFya3MvaW5kZXguaHRtbCc6ICdib29rbWFya3MnLFxuXG4gICdoaXN0b3J5Lmh0bWwnOiAnaGlzdG9yeScsXG4gICdoaXN0b3J5L2luZGV4Lmh0bWwnOiAnaGlzdG9yeScsXG5cbiAgJ25ld3RhYi5odG1sJzogJ25ld3RhYicsXG4gICduZXd0YWIvaW5kZXguaHRtbCc6ICduZXd0YWInLFxuXG4gICdzaWRlcGFuZWwuaHRtbCc6ICdzaWRlcGFuZWwnLFxuICAnc2lkZXBhbmVsL2luZGV4Lmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJyouc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJyouc2lkZXBhbmVsL2luZGV4Lmh0bWwnOiAnc2lkZXBhbmVsJyxcblxuICAnZGV2dG9vbHMuaHRtbCc6ICdkZXZ0b29scycsXG4gICdkZXZ0b29scy9pbmRleC5odG1sJzogJ2RldnRvb2xzJyxcblxuICAnYmFja2dyb3VuZC50cyc6ICdiYWNrZ3JvdW5kJyxcblxuICAnKi5jb250ZW50LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICcqLmNvbnRlbnQvaW5kZXgudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcblxuICAncG9wdXAuaHRtbCc6ICdwb3B1cCcsXG4gICdwb3B1cC9pbmRleC5odG1sJzogJ3BvcHVwJyxcblxuICAnb3B0aW9ucy5odG1sJzogJ29wdGlvbnMnLFxuICAnb3B0aW9ucy9pbmRleC5odG1sJzogJ29wdGlvbnMnLFxuXG4gICcqLmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqL2luZGV4Lmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqLnRzJzogJ3VubGlzdGVkLXNjcmlwdCcsXG5cbiAgLy8gRG9uJ3Qgd2FybiBhYm91dCBhbnkgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGxpa2UgQ1NTIG9yIEpTIGVudHJ5cG9pbnRzIGZvciBIVE1MIGZpbGVzXG4gICcqLyonOiAnaWdub3JlZCcsXG59O1xuXG5leHBvcnQgdHlwZSBGaW5kRW50cnlwb2ludHNDb25maWcgPSBQaWNrPFxuICBJbnRlcm5hbENvbmZpZyxcbiAgJ3Jvb3QnIHwgJ2VudHJ5cG9pbnRzRGlyJyB8ICdvdXREaXInIHwgJ2xvZ2dlcicgfCAnbW9kZScgfCAnY29tbWFuZCdcbj47XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7XG4gIEJ1aWxkT3V0cHV0LFxuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IHJlbW92ZUVtcHR5RGlycyB9IGZyb20gJy4uL3V0aWxzL3JlbW92ZUVtcHR5RGlycyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCBnbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRFbnRyeXBvaW50cyhcbiAgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8T21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4+IHtcbiAgY29uc3Qgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgY29uc3Qgc3RlcCA9IEFycmF5LmlzQXJyYXkoZ3JvdXApXG4gICAgICA/IGF3YWl0IGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhncm91cCwgY29uZmlnKVxuICAgICAgOiBhd2FpdCBidWlsZFNpbmdsZUVudHJ5cG9pbnQoZ3JvdXAsIGNvbmZpZyk7XG4gICAgc3RlcHMucHVzaChzdGVwKTtcbiAgfVxuICBjb25zdCBwdWJsaWNBc3NldHMgPSBhd2FpdCBjb3B5UHVibGljRGlyZWN0b3J5KGNvbmZpZyk7XG5cbiAgLy8gUmVtb3ZlIGFueSBlbXB0eSBkaXJlY3RvcmllcyBmcm9tIG1vdmluZyBvdXRwdXRzIGFyb3VuZFxuICBhd2FpdCByZW1vdmVFbXB0eURpcnMoY29uZmlnLm91dERpcik7XG5cbiAgcmV0dXJuIHsgcHVibGljQXNzZXRzLCBzdGVwcyB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbGliIG1vZGUgKyBJSUZFIGZvcm1hdCB0byBidW5kbGUgdGhlIGVudHJ5cG9pbnQgdG8gYSBzaW5nbGUgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTaW5nbGVFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgLy8gU2hvdWxkIHRoaXMgZW50cnlwb2ludCBiZSB3cmFwcGVkIGJ5IHRoZSB2aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQgcGx1Z2luP1xuICBjb25zdCBpc1ZpcnR1YWwgPSBbJ2JhY2tncm91bmQnLCAnY29udGVudC1zY3JpcHQnXS5pbmNsdWRlcyhlbnRyeXBvaW50LnR5cGUpO1xuICBjb25zdCBlbnRyeSA9IGlzVmlydHVhbFxuICAgID8gYHZpcnR1YWw6d3h0LSR7ZW50cnlwb2ludC50eXBlfT8ke2VudHJ5cG9pbnQuaW5wdXRQYXRofWBcbiAgICA6IGVudHJ5cG9pbnQuaW5wdXRQYXRoO1xuXG4gIGNvbnN0IGxpYk1vZGU6IHZpdGUuSW5saW5lQ29uZmlnID0ge1xuICAgIGJ1aWxkOiB7XG4gICAgICBsaWI6IHtcbiAgICAgICAgZW50cnksXG4gICAgICAgIGZvcm1hdHM6IFsnaWlmZSddLFxuICAgICAgICBuYW1lOiBlbnRyeXBvaW50Lm5hbWUsXG4gICAgICAgIGZpbGVOYW1lOiBlbnRyeXBvaW50Lm5hbWUsXG4gICAgICB9LFxuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAvLyBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgb3V0cHV0IGZvciB0aGlzIGJ1aWxkLCBzbyB3ZSB1c2UgdGhlIGRlc2lyZWQgYnVuZGxlIHBhdGggZm9yIHRoZVxuICAgICAgICAgIC8vIGVudHJ5IG91dHB1dCAobGlrZSBcImNvbnRlbnQtc2NyaXB0cy9vdmVybGF5LmpzXCIpXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgICAnLmpzJyxcbiAgICAgICAgICApLFxuICAgICAgICAgIC8vIE91dHB1dCBjb250ZW50IHNjcmlwdCBDU1MgdG8gYXNzZXRzLyB3aXRoIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0cy4gRGVmYXVsdHMgdG9cbiAgICAgICAgICAvLyBcIltuYW1lXS5bZXh0XVwiIGluIGxpYiBtb2RlLCB3aGljaCB1c3VhbGx5IHJlc3VsdHMgaW4gXCJzdHlsZS5jc3NcIi4gVGhhdCBtZWFucyBtdWx0aXBsZVxuICAgICAgICAgIC8vIGNvbnRlbnQgc2NyaXB0cyB3aXRoIHN0eWxlcyB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlciBpZiBpdCB3ZXJlbid0IGNoYW5nZWQgYmVsb3cuXG4gICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IGBhc3NldHMvJHtlbnRyeXBvaW50Lm5hbWV9LltleHRdYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgY29uc3QgZW50cnlDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIGxpYk1vZGUsXG4gICAgY29uZmlnLnZpdGUsXG4gICkgYXMgdml0ZS5JbmxpbmVDb25maWc7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdml0ZS5idWlsZChlbnRyeUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgZW50cnlwb2ludHM6IGVudHJ5cG9pbnQsXG4gICAgY2h1bmtzOiBnZXRCdWlsZE91dHB1dENodW5rcyhyZXN1bHQpLFxuICB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbXVsdGlwYWdlIGJ1aWxkIHRvIGJ1bmRsZSBhbGwgdGhlIGVudHJ5cG9pbnRzIGluIGEgc2luZ2xlIHN0ZXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8QnVpbGRTdGVwT3V0cHV0PiB7XG4gIGNvbnN0IG11bHRpUGFnZTogdml0ZS5JbmxpbmVDb25maWcgPSB7XG4gICAgcGx1Z2luczogW3BsdWdpbnMubXVsdGlwYWdlTW92ZShlbnRyeXBvaW50cywgY29uZmlnKV0sXG4gICAgYnVpbGQ6IHtcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGVudHJ5cG9pbnRzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoaW5wdXQsIGVudHJ5KSA9PiB7XG4gICAgICAgICAgaW5wdXRbZW50cnkubmFtZV0gPSBlbnRyeS5pbnB1dFBhdGg7XG4gICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9LCB7fSksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIC8vIEluY2x1ZGUgYSBoYXNoIHRvIHByZXZlbnQgY29uZmxpY3RzXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6ICdjaHVua3MvW25hbWVdLVtoYXNoXS5qcycsXG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBXZSBjYW4ndCBjb250cm9sIHRoZSBcIm5hbWVcIiwgc28gd2UgbmVlZCBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogJ2Fzc2V0cy9bbmFtZV0tW2hhc2hdLltleHRdJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBlbnRyeUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgbXVsdGlQYWdlLFxuICAgIGNvbmZpZy52aXRlLFxuICApIGFzIHZpdGUuSW5saW5lQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzLFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbGRPdXRwdXRDaHVua3MoXG4gIHJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB2aXRlLmJ1aWxkPj4sXG4pOiBCdWlsZFN0ZXBPdXRwdXRbJ2NodW5rcyddIHtcbiAgaWYgKCdvbicgaW4gcmVzdWx0KSB0aHJvdyBFcnJvcignd3h0IGRvZXMgbm90IHN1cHBvcnQgdml0ZSB3YXRjaCBtb2RlLicpO1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSByZXR1cm4gcmVzdWx0LmZsYXRNYXAoKHsgb3V0cHV0IH0pID0+IG91dHB1dCk7XG4gIHJldHVybiByZXN1bHQub3V0cHV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5UHVibGljRGlyZWN0b3J5KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10+IHtcbiAgY29uc3QgcHVibGljQXNzZXRzOiBCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10gPSBbXTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIHB1YmxpY0Fzc2V0cztcblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7IGN3ZDogY29uZmlnLnB1YmxpY0RpciB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJ1aWxkT3V0cHV0LFxuICBDb250ZW50U2NyaXB0RW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4vZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgQ29udGVudFNlY3VyaXR5UG9saWN5IH0gZnJvbSAnLi9Db250ZW50U2VjdXJpdHlQb2xpY3knO1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgbWFuaWZlc3QgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgYW5kIHRoZSBidWlsZCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZU1hbmlmZXN0KFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RyID1cbiAgICBjb25maWcubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KVxuICAgICAgOiBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMik7XG5cbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXREaXIpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocmVzb2x2ZShjb25maWcub3V0RGlyLCAnbWFuaWZlc3QuanNvbicpLCBzdHIsICd1dGYtOCcpO1xuXG4gIG91dHB1dC5wdWJsaWNBc3NldHMudW5zaGlmdCh7XG4gICAgdHlwZTogJ2Fzc2V0JyxcbiAgICBmaWxlTmFtZTogJ21hbmlmZXN0Lmpzb24nLFxuICAgIG5hbWU6ICdtYW5pZmVzdCcsXG4gICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICBzb3VyY2U6IHN0cixcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtYW5pZmVzdCBiYXNlZCBvbiB0aGUgY29uZmlnIGFuZCBlbnRyeXBvaW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWFpbmZlc3QoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8TWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3Q+IHtcbiAgY29uc3QgcGtnID0gYXdhaXQgZ2V0UGFja2FnZUpzb24oY29uZmlnKTtcbiAgaWYgKHBrZy52ZXJzaW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgdmVyc2lvbicpO1xuICBpZiAocGtnLm5hbWUgPT0gbnVsbCkgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgbmFtZScpO1xuICBpZiAocGtnLmRlc2NyaXB0aW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgZGVzY3JpcHRpb24nKTtcblxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RfdmVyc2lvbjogY29uZmlnLm1hbmlmZXN0VmVyc2lvbixcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBzaG9ydF9uYW1lOiBwa2cuc2hvcnROYW1lLFxuICAgIHZlcnNpb246IHNpbXBsaWZ5VmVyc2lvbihwa2cudmVyc2lvbiksXG4gICAgdmVyc2lvbl9uYW1lOiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gdW5kZWZpbmVkIDogcGtnLnZlcnNpb24sXG4gICAgLi4uY29uZmlnLm1hbmlmZXN0LFxuICB9O1xuXG4gIGFkZEVudHJ5cG9pbnRzKG1hbmlmZXN0LCBlbnRyeXBvaW50cywgYnVpbGRPdXRwdXQsIGNvbmZpZyk7XG5cbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSBhZGREZXZNb2RlQ3NwKG1hbmlmZXN0LCBjb25maWcpO1xuXG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKlxuICogVE9ETzogbG9vayBpbiByb290IGFuZCB1cCBkaXJlY3RvcmllcyB1bnRpbCBpdCdzIGZvdW5kXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VKc29uKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gYXdhaXQgZnMucmVhZEpzb24ocmVzb2x2ZShjb25maWcucm9vdCwgJ3BhY2thZ2UuanNvbicpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHN1ZmZpeGVzIGZyb20gdGhlIHZlcnNpb24sIGxpa2UgWC5ZLlotYWxwaGExICh3aGljaCBicm9zZXJzIGRvbid0IGFsbG93KSwgc28gaXQncyBhXG4gKiBzaW1wbGUgdmVyc2lvbiBudW1iZXIsIGxpa2UgWCBvciBYLlkgb3IgWC5ZLlosIHdoaWNoIGJyb3dzZXJzIGFsbG93LlxuICovXG5mdW5jdGlvbiBzaW1wbGlmeVZlcnNpb24odmVyc2lvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFJlZ2V4IGFkYXB0ZWQgZnJvbSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL01vemlsbGEvQWRkLW9ucy9XZWJFeHRlbnNpb25zL21hbmlmZXN0Lmpzb24vdmVyc2lvbiN2ZXJzaW9uX2Zvcm1hdFxuXG4gIGNvbnN0IHZlcnNpb24gPSAvXigoMHxbMS05XVswLTldezAsOH0pKFsuXSgwfFsxLTldWzAtOV17MCw4fSkpezAsM30pLiokLy5leGVjKFxuICAgIHZlcnNpb25OYW1lLFxuICApPy5bMV07XG5cbiAgaWYgKHZlcnNpb24gPT0gbnVsbClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3Qgc2ltcGxpZnkgcGFja2FnZS5qc29uIHZlcnNpb24gXCIke3ZlcnNpb25OYW1lfVwiIHRvIGEgdmFsaWQgZXh0ZW5zaW9uIHZlcnNpb24sIFwiWC5ZLlpcImAsXG4gICAgKTtcblxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gYWRkRW50cnlwb2ludHMoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgYnVpbGRPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVudHJpZXNCeVR5cGUgPSBlbnRyeXBvaW50cy5yZWR1Y2U8XG4gICAgUGFydGlhbDxSZWNvcmQ8RW50cnlwb2ludFsndHlwZSddLCBFbnRyeXBvaW50W10+PlxuICA+KChtYXAsIGVudHJ5cG9pbnQpID0+IHtcbiAgICBtYXBbZW50cnlwb2ludC50eXBlXSA/Pz0gW107XG4gICAgbWFwW2VudHJ5cG9pbnQudHlwZV0/LnB1c2goZW50cnlwb2ludCk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfSwge30pO1xuXG4gIGNvbnN0IGJhY2tncm91bmQgPSBlbnRyaWVzQnlUeXBlWydiYWNrZ3JvdW5kJ10/LlswXSBhc1xuICAgIHwgQmFja2dyb3VuZEVudHJ5cG9pbnRcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYm9va21hcmtzID0gZW50cmllc0J5VHlwZVsnYm9va21hcmtzJ10/LlswXTtcbiAgY29uc3QgY29udGVudFNjcmlwdHMgPSBlbnRyaWVzQnlUeXBlWydjb250ZW50LXNjcmlwdCddIGFzXG4gICAgfCBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRldnRvb2xzID0gZW50cmllc0J5VHlwZVsnZGV2dG9vbHMnXT8uWzBdO1xuICBjb25zdCBoaXN0b3J5ID0gZW50cmllc0J5VHlwZVsnaGlzdG9yeSddPy5bMF07XG4gIGNvbnN0IG5ld3RhYiA9IGVudHJpZXNCeVR5cGVbJ25ld3RhYiddPy5bMF07XG4gIGNvbnN0IG9wdGlvbnMgPSBlbnRyaWVzQnlUeXBlWydvcHRpb25zJ10/LlswXSBhc1xuICAgIHwgT3B0aW9uc0VudHJ5cG9pbnRcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9wdXAgPSBlbnRyaWVzQnlUeXBlWydwb3B1cCddPy5bMF0gYXMgUG9wdXBFbnRyeXBvaW50IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzYW5kYm94ZXMgPSBlbnRyaWVzQnlUeXBlWydzYW5kYm94J107XG4gIGNvbnN0IHNpZGVwYW5lbHMgPSBlbnRyaWVzQnlUeXBlWydzaWRlcGFuZWwnXTtcblxuICBpZiAoYmFja2dyb3VuZCkge1xuICAgIGNvbnN0IHNjcmlwdCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGJhY2tncm91bmQsIGNvbmZpZy5vdXREaXIsICcuanMnKTtcbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgICAgbWFuaWZlc3QuYmFja2dyb3VuZCA9IHtcbiAgICAgICAgdHlwZTogYmFja2dyb3VuZC5vcHRpb25zLnR5cGUsXG4gICAgICAgIHNlcnZpY2Vfd29ya2VyOiBzY3JpcHQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5iYWNrZ3JvdW5kID0ge1xuICAgICAgICBwZXJzaXN0ZW50OiBiYWNrZ3JvdW5kLm9wdGlvbnMucGVyc2lzdGVudCxcbiAgICAgICAgc2NyaXB0czogW3NjcmlwdF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChib29rbWFya3MpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnQm9va21hcmtzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIGNocm9tZV91cmxfb3ZlcnJpZGVzLmJvb2ttYXJrcyB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBib29rbWFya3MgaXMgdW50eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwsIGJ1dCBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5ib29rbWFya3MgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgYm9va21hcmtzLFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAnLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaGlzdG9yeSkge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdCb29rbWFya3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gY2hyb21lX3VybF9vdmVycmlkZXMuaGlzdG9yeSB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoaXN0b3J5IGlzIHVudHlwZWQgaW4gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsLCBidXQgc3VwcG9ydGVkIGJ5IGNocm9tZVxuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMuaGlzdG9yeSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAnLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmV3dGFiKSB7XG4gICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLm5ld3RhYiA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgbmV3dGFiLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwb3B1cCkge1xuICAgIGNvbnN0IGRlZmF1bHRfcG9wdXAgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIHBvcHVwLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zOiBNYW5pZmVzdC5BY3Rpb25NYW5pZmVzdCA9IHtcbiAgICAgIGRlZmF1bHRfaWNvbjogcG9wdXAub3B0aW9ucy5kZWZhdWx0SWNvbixcbiAgICAgIGRlZmF1bHRfdGl0bGU6IHBvcHVwLm9wdGlvbnMuZGVmYXVsdFRpdGxlLFxuICAgIH07XG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICAgIG1hbmlmZXN0LmFjdGlvbiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wb3B1cCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0W3BvcHVwLm9wdGlvbnMubXYyS2V5ID8/ICdicm93c2VyX2FjdGlvbiddID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BvcHVwLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGV2dG9vbHMpIHtcbiAgICBtYW5pZmVzdC5kZXZ0b29sc19wYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBkZXZ0b29scyxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gIH1cblxuICBpZiAob3B0aW9ucykge1xuICAgIGNvbnN0IHBhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChvcHRpb25zLCBjb25maWcub3V0RGlyLCAnLmh0bWwnKTtcbiAgICBtYW5pZmVzdC5vcHRpb25zX3VpID0ge1xuICAgICAgb3Blbl9pbl90YWI6IG9wdGlvbnMub3B0aW9ucy5vcGVuSW5UYWIsXG4gICAgICBicm93c2VyX3N0eWxlOlxuICAgICAgICBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gb3B0aW9ucy5vcHRpb25zLmJyb3dzZXJTdHlsZSA6IHVuZGVmaW5lZCxcbiAgICAgIGNocm9tZV9zdHlsZTpcbiAgICAgICAgY29uZmlnLmJyb3dzZXIgIT09ICdmaXJlZm94JyA/IG9wdGlvbnMub3B0aW9ucy5jaHJvbWVTdHlsZSA6IHVuZGVmaW5lZCxcbiAgICAgIHBhZ2UsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChzYW5kYm94ZXM/Lmxlbmd0aCkge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdTYW5kYm94ZWQgcGFnZXMgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBzYW5kYm94LnBhZ2VzIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHNhbmRib3ggbm90IHR5cGVkXG4gICAgICBtYW5pZmVzdC5zYW5kYm94ID0ge1xuICAgICAgICBwYWdlczogc2FuZGJveGVzLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2lkZXBhbmVscz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVmYXVsdFNpZGVwYW5lbCA9XG4gICAgICBzaWRlcGFuZWxzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSAnc2lkZXBhbmVsJykgPz8gc2lkZXBhbmVsc1swXTtcbiAgICBjb25zdCBwYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBkZWZhdWx0U2lkZXBhbmVsLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcblxuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBtYW5pZmVzdC5zaWRlYmFyX2FjdGlvbiA9IHtcbiAgICAgICAgLy8gVE9ETzogQWRkIG9wdGlvbnMgdG8gc2lkZSBwYW5lbFxuICAgICAgICAvLyAuLi5kZWZhdWx0U2lkZXBhbmVsLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcGFuZWw6IHBhZ2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVW50eXBlZFxuICAgICAgbWFuaWZlc3Quc2lkZV9wYW5lbCA9IHtcbiAgICAgICAgZGVmYXVsdF9wYXRoOiBwYWdlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnU2lkZSBwYW5lbCBub3Qgc3VwcG9ydGVkIGJ5IENocm9taXVtIHVzaW5nIE1WMi4gc2lkZV9wYW5lbC5kZWZhdWx0X3BhdGggd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGVudFNjcmlwdHM/Lmxlbmd0aCkge1xuICAgIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJykge1xuICAgICAgY29uc3QgcGVybWlzc2lvbnNLZXkgPVxuICAgICAgICBjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAyID8gJ3Blcm1pc3Npb25zJyA6ICdob3N0X3Blcm1pc3Npb25zJztcbiAgICAgIGNvbnN0IGhvc3RQZXJtaXNzaW9ucyA9IG5ldyBTZXQ8c3RyaW5nPihtYW5pZmVzdFtwZXJtaXNzaW9uc0tleV0gPz8gW10pO1xuICAgICAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgICAgIHNjcmlwdC5vcHRpb25zLm1hdGNoZXMuZm9yRWFjaCgobWF0Y2hQYXR0ZXJuKSA9PiB7XG4gICAgICAgICAgaG9zdFBlcm1pc3Npb25zLmFkZChtYXRjaFBhdHRlcm4pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgbWFuaWZlc3RbcGVybWlzc2lvbnNLZXldID0gQXJyYXkuZnJvbShob3N0UGVybWlzc2lvbnMpLnNvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFzaFRvRW50cnlwb2ludHNNYXAgPSBjb250ZW50U2NyaXB0cy5yZWR1Y2UoKG1hcCwgc2NyaXB0KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBKU09OLnN0cmluZ2lmeShzY3JpcHQub3B0aW9ucyk7XG4gICAgICAgIGlmICghbWFwLmhhcyhoYXNoKSkge1xuICAgICAgICAgIG1hcC5zZXQoaGFzaCwgW3NjcmlwdF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcC5nZXQoaGFzaCk/LnB1c2goc2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W10+KCkpO1xuXG4gICAgICBtYW5pZmVzdC5jb250ZW50X3NjcmlwdHMgPSBBcnJheS5mcm9tKGhhc2hUb0VudHJ5cG9pbnRzTWFwLmVudHJpZXMoKSkubWFwKFxuICAgICAgICAoWywgc2NyaXB0c10pID0+ICh7XG4gICAgICAgICAgLi4uc2NyaXB0c1swXS5vcHRpb25zLFxuICAgICAgICAgIC8vIFRPT0Q6IFNvcnRpbmcgY3NzIGFuZCBqcyBhcnJheXMgaGVyZSBzbyB3ZSBnZXQgY29uc2lzdGVudCB0ZXN0IHJlc3VsdHMuLi4gYnV0IHdlXG4gICAgICAgICAgLy8gc2hvdWxkbid0IGhhdmUgdG8uIFdoZXJlIGlzIHRoZSBpbmNvbnNpc3RlbmN5IGNvbWluZyBmcm9tP1xuICAgICAgICAgIGNzczogZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKHNjcmlwdHMsIGJ1aWxkT3V0cHV0KT8uc29ydCgpLFxuICAgICAgICAgIGpzOiBzY3JpcHRzXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICAgICAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zb3J0KCksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGV2TW9kZUNzcChcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdm9pZCB7XG4gIGNvbnN0IHBlcm1pc3Npb24gPSBgaHR0cDovLyR7Y29uZmlnLnNlcnZlcj8uaG9zdG5hbWUgPz8gJyd9LypgO1xuICBjb25zdCBhbGxvd2VkQ3NwID0gY29uZmlnLnNlcnZlcj8ub3JpZ2luID8/ICdodHRwOi8vbG9jYWxob3N0OionO1xuXG4gIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgbWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucyA/Pz0gW107XG4gICAgaWYgKCFtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zLmluY2x1ZGVzKHBlcm1pc3Npb24pKVxuICAgICAgbWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucy5wdXNoKHBlcm1pc3Npb24pO1xuICB9IGVsc2Uge1xuICAgIG1hbmlmZXN0LnBlcm1pc3Npb25zID8/PSBbXTtcbiAgICBpZiAoIW1hbmlmZXN0LnBlcm1pc3Npb25zLmluY2x1ZGVzKHBlcm1pc3Npb24pKVxuICAgICAgbWFuaWZlc3QucGVybWlzc2lvbnMucHVzaChwZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGNvbnN0IGNzcCA9IG5ldyBDb250ZW50U2VjdXJpdHlQb2xpY3koXG4gICAgbWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gM1xuICAgICAgPyAvLyBAdHMtZXhwZWN0LWVycm9yOiBleHRlbnNpb25fcGFnZXMgaXMgbm90IHR5cGVkXG4gICAgICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5Py5leHRlbnNpb25fcGFnZXMgPz9cbiAgICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyAnd2FzbS11bnNhZmUtZXZhbCc7IG9iamVjdC1zcmMgJ3NlbGYnO1wiIC8vIGRlZmF1bHQgQ1NQIGZvciBNVjNcbiAgICAgIDogbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPz9cbiAgICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJzsgb2JqZWN0LXNyYyAnc2VsZic7XCIsIC8vIGRlZmF1bHQgQ1NQIGZvciBNVjJcbiAgKTtcblxuICBpZiAoY29uZmlnLnNlcnZlcikgY3NwLmFkZCgnc2NyaXB0LXNyYycsIGFsbG93ZWRDc3ApO1xuXG4gIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPz89IHt9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGV4dGVuc2lvbl9wYWdlcyBpcyBub3QgdHlwZWRcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeS5leHRlbnNpb25fcGFnZXMgPSBjc3AudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA9IGNzcC50b1N0cmluZygpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYnVuZGxlIHBhdGhzIHRvIENTUyBmaWxlcyBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIGNvbnRlbnQgc2NyaXB0cywgb3IgdW5kZWZpbmVkIGlmXG4gKiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIENTUy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKFxuICBjb250ZW50U2NyaXB0czogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXSxcbiAgYnVpbGRPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+LFxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBjc3M6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgYWxsQ2h1bmtzID0gYnVpbGRPdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5jaHVua3MpO1xuXG4gIGNvbnRlbnRTY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgIC8vIFRPRE86IG9wdGltaXplIGFuZCByZW1vdmUgbG9vcCB3aXRoIGEgbWFwXG4gICAgY29uc3QgcmVsYXRlZENzcyA9IGFsbENodW5rcy5maW5kKFxuICAgICAgKGNodW5rKSA9PiBjaHVuay5maWxlTmFtZSA9PT0gYGFzc2V0cy8ke3NjcmlwdC5uYW1lfS5jc3NgLFxuICAgICk7XG4gICAgaWYgKHJlbGF0ZWRDc3MpIGNzcy5wdXNoKHJlbGF0ZWRDc3MuZmlsZU5hbWUpO1xuICB9KTtcblxuICBpZiAoY3NzLmxlbmd0aCA+IDApIHJldHVybiBjc3M7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCAiLyoqXG4gKiBEaXJlY3RpdmUgbmFtZXMgdGhhdCBtYWtlIHVwIENTUHMuIFRoZXJlIGFyZSBtb3JlLCB0aGlzIGlzIGFsbCBJIG5lZWQgZm9yIHRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCB0eXBlIENzcERpcmVjdGl2ZSA9ICdkZWZhdWx0LXNyYycgfCAnc2NyaXB0LXNyYycgfCAnb2JqZWN0LXNyYyc7XG5cbmV4cG9ydCBjbGFzcyBDb250ZW50U2VjdXJpdHlQb2xpY3kge1xuICBwcml2YXRlIHN0YXRpYyBESVJFQ1RJVkVfT1JERVI6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHVuZGVmaW5lZD4gPSB7XG4gICAgJ2RlZmF1bHQtc3JjJzogMCxcbiAgICAnc2NyaXB0LXNyYyc6IDEsXG4gICAgJ29iamVjdC1zcmMnOiAyLFxuICB9O1xuXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuICBjb25zdHJ1Y3Rvcihjc3A/OiBzdHJpbmcpIHtcbiAgICBpZiAoY3NwKSB7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IGNzcC5zcGxpdCgnOycpLm1hcCgoc2VjdGlvbikgPT4gc2VjdGlvbi50cmltKCkpO1xuICAgICAgdGhpcy5kYXRhID0gc2VjdGlvbnMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj4oKGRhdGEsIHNlY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4udmFsdWVzXSA9IHNlY3Rpb24uc3BsaXQoJyAnKS5tYXAoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgaWYgKGtleSkgZGF0YVtrZXldID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHNldCBvZiB2YWx1ZXMgYXJlIGxpc3RlZCB1bmRlciBhIGRpcmVjdGl2ZS5cbiAgICovXG4gIGFkZChkaXJlY3RpdmU6IENzcERpcmVjdGl2ZSwgLi4ubmV3VmFsdWVzOiBzdHJpbmdbXSk6IENvbnRlbnRTZWN1cml0eVBvbGljeSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5kYXRhW2RpcmVjdGl2ZV0gPz8gW107XG4gICAgbmV3VmFsdWVzLmZvckVhY2goKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyhuZXdWYWx1ZSkpIHZhbHVlcy5wdXNoKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFbZGlyZWN0aXZlXSA9IHZhbHVlcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyZWN0aXZlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YSkuc29ydCgoW2xdLCBbcl0pID0+IHtcbiAgICAgIGNvbnN0IGxvID0gQ29udGVudFNlY3VyaXR5UG9saWN5LkRJUkVDVElWRV9PUkRFUltsXSA/PyAyO1xuICAgICAgY29uc3Qgcm8gPSBDb250ZW50U2VjdXJpdHlQb2xpY3kuRElSRUNUSVZFX09SREVSW3JdID8/IDI7XG4gICAgICByZXR1cm4gbG8gLSBybztcbiAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aXZlcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5mbGF0KCkuam9pbignICcpKS5qb2luKCc7ICcpICsgJzsnO1xuICB9XG59XG4iLCAiaW1wb3J0IHBhdGgsIHsgZXh0bmFtZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByaW50VGFibGUgfSBmcm9tICcuL3ByaW50VGFibGUnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJpbnRCdWlsZFN1bW1hcnkoXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgY2h1bmtzID0gW1xuICAgIC4uLm91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyksXG4gICAgLi4ub3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgXS5zb3J0KChsLCByKSA9PiB7XG4gICAgY29uc3QgbFdlaWdodCA9XG4gICAgICBDSFVOS19TT1JUX1dFSUdIVFNbbC5maWxlTmFtZV0gPz9cbiAgICAgIENIVU5LX1NPUlRfV0VJR0hUU1tleHRuYW1lKGwuZmlsZU5hbWUpXSA/P1xuICAgICAgREVGQVVMVF9TT1JUX1dFSUdIVDtcbiAgICBjb25zdCByV2VpZ2h0ID1cbiAgICAgIENIVU5LX1NPUlRfV0VJR0hUU1tyLmZpbGVOYW1lXSA/P1xuICAgICAgQ0hVTktfU09SVF9XRUlHSFRTW2V4dG5hbWUoci5maWxlTmFtZSldID8/XG4gICAgICBERUZBVUxUX1NPUlRfV0VJR0hUO1xuICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgcmV0dXJuIGwuZmlsZU5hbWUubG9jYWxlQ29tcGFyZShyLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgY29uc3QgY2h1bmtSb3dzOiBzdHJpbmdbXVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBbXG4gICAgICAgIHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXREaXIpICsgcGF0aC5zZXAsXG4gICAgICAgIGNodW5rLmZpbGVOYW1lLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoY2h1bmsuZmlsZU5hbWUpO1xuICAgICAgY29uc3QgcHJlZml4ID0gaSA9PT0gY2h1bmtzLmxlbmd0aCAtIDEgPyAnICBcdTI1MTRcdTI1MDAnIDogJyAgXHUyNTFDXHUyNTAwJztcbiAgICAgIGNvbnN0IGNvbG9yID0gQ0hVTktfQ09MT1JTW2V4dF0gPz8gREVGQVVMVF9DT0xPUjtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMubHN0YXQocmVzb2x2ZShjb25maWcub3V0RGlyLCBjaHVuay5maWxlTmFtZSkpO1xuICAgICAgdG90YWxTaXplICs9IHN0YXRzLnNpemU7XG4gICAgICBjb25zdCBzaXplID0gU3RyaW5nKGZpbGVzaXplKHN0YXRzLnNpemUpKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGAke3BjLmdyYXkocHJlZml4KX0gJHtwYy5kaW0oZmlsZVswXSl9JHtjb2xvcihmaWxlWzFdKX1gLFxuICAgICAgICBwYy5kaW0oc2l6ZSksXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xuXG4gIHByaW50VGFibGUoY29uZmlnLmxvZ2dlci5sb2csIGNodW5rUm93cyk7XG5cbiAgY29uZmlnLmxvZ2dlci5sb2coXG4gICAgYCR7cGMuY3lhbignXHUwM0EzIFRvdGFsIHNpemU6Jyl9ICR7U3RyaW5nKGZpbGVzaXplKHRvdGFsU2l6ZSkpfWAsXG4gICk7XG59XG5cbmNvbnN0IERFRkFVTFRfU09SVF9XRUlHSFQgPSAxMDA7XG5jb25zdCBDSFVOS19TT1JUX1dFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICdtYW5pZmVzdC5qc29uJzogMCxcbiAgJy5odG1sJzogMSxcbiAgJy5qcyc6IDIsXG4gICcuY3NzJzogMyxcbn07XG5cbmNvbnN0IERFRkFVTFRfQ09MT1IgPSBwYy5ibHVlO1xuY29uc3QgQ0hVTktfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodGV4dDogc3RyaW5nKSA9PiBzdHJpbmc+ID0ge1xuICAnLmh0bWwnOiBwYy5ncmVlbixcbiAgJy5jc3MnOiBwYy5tYWdlbnRhLFxuICAnLmpzJzogcGMuY3lhbixcbn07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHByaW50VGFibGUoXG4gIGxvZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZCxcbiAgcm93czogc3RyaW5nW11bXSxcbiAgZ2FwID0gMixcbik6IHZvaWQge1xuICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBjb2x1bW5XaWR0aHMgPSByb3dzLnJlZHVjZShcbiAgICAod2lkdGhzLCByb3cpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5tYXgod2lkdGhzLmxlbmd0aCwgcm93Lmxlbmd0aCk7IGkrKykge1xuICAgICAgICB3aWR0aHNbaV0gPSBNYXRoLm1heChyb3dbaV0/Lmxlbmd0aCA/PyAwLCB3aWR0aHNbaV0gPz8gMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2lkdGhzO1xuICAgIH0sXG4gICAgcm93c1swXS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmxlbmd0aCksXG4gICk7XG5cbiAgbGV0IHN0ciA9ICcnO1xuICByb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChjb2wsIGopID0+IHtcbiAgICAgIHN0ciArPSBjb2wucGFkRW5kKGNvbHVtbldpZHRoc1tqXSwgJyAnKTtcbiAgICAgIGlmIChqICE9PSByb3cubGVuZ3RoIC0gMSkgc3RyICs9ICcnLnBhZEVuZChnYXAsICcgJyk7XG4gICAgfSk7XG4gICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkgc3RyICs9ICdcXG4nO1xuICB9KTtcblxuICBsb2coc3RyKTtcbn1cbiIsICJpbXBvcnQge1xuICBCdWlsZE91dHB1dCxcbiAgV3h0RGV2U2VydmVyLFxuICBJbmxpbmVDb25maWcsXG4gIEludGVybmFsQ29uZmlnLFxuICBFbnRyeXBvaW50R3JvdXAsXG59IGZyb20gJy4vY29yZS90eXBlcyc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4vY29yZS91dGlscy9nZXRJbnRlcm5hbENvbmZpZyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuL2NvcmUvYnVpbGQvZmluZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGJ1aWxkRW50cnlwb2ludHMgfSBmcm9tICcuL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1haW5mZXN0LCB3cml0ZU1hbmlmZXN0IH0gZnJvbSAnLi9jb3JlL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCB7IHByaW50QnVpbGRTdW1tYXJ5IH0gZnJvbSAnLi9jb3JlL2xvZy9wcmludEJ1aWxkU3VtbWFyeSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUeXBlc0RpciB9IGZyb20gJy4vY29yZS9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBmaW5kT3BlblBvcnQgfSBmcm9tICcuL2NvcmUvdXRpbHMvZmluZE9wZW5Qb3J0JztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2Zvcm1hdER1cmF0aW9uJztcbmltcG9ydCB7IGNyZWF0ZVdlYkV4dFJ1bm5lciB9IGZyb20gJy4vY29yZS9ydW5uZXJzL2NyZWF0ZVdlYkV4dFJ1bm5lcic7XG5pbXBvcnQgeyBncm91cEVudHJ5cG9pbnRzIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2dyb3VwRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgZGV0ZWN0RGV2Q2hhbmdlcyB9IGZyb20gJy4vY29yZS91dGlscy9kZXRlY3REZXZDaGFuZ2VzJztcbmltcG9ydCB7IE11dGV4IH0gZnJvbSAnYXN5bmMtbXV0ZXgnO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgsXG4gIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlLFxufSBmcm9tICcuL2NvcmUvdXRpbHMvZW50cnlwb2ludHMnO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS90eXBlcy9leHRlcm5hbCc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lQ29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS91dGlscy9kZWZpbmVSdW5uZXJDb25maWcnO1xuXG4vKipcbiAqIEJ1bmRsZXMgdGhlIGV4dGVuc2lvbiBmb3IgcHJvZHVjdGlvbi4gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogSW5saW5lQ29uZmlnKTogUHJvbWlzZTxCdWlsZE91dHB1dD4ge1xuICBjb25zdCBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNvbmZpZywgJ2J1aWxkJyk7XG4gIHJldHVybiBhd2FpdCBidWlsZEludGVybmFsKGludGVybmFsQ29uZmlnKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihcbiAgY29uZmlnPzogSW5saW5lQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRPcGVuUG9ydCgzMDAwLCAzMDEwKTtcbiAgY29uc3QgaG9zdG5hbWUgPSAnbG9jYWxob3N0JztcbiAgY29uc3Qgb3JpZ2luID0gYGh0dHA6Ly8ke2hvc3RuYW1lfToke3BvcnR9YDtcbiAgY29uc3Qgc2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHtcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIG9yaWdpbixcbiAgICB9LFxuICB9O1xuICBsZXQgaW50ZXJuYWxDb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhcbiAgICB2aXRlLm1lcmdlQ29uZmlnKHNlcnZlckNvbmZpZywgY29uZmlnID8/IHt9KSxcbiAgICAnc2VydmUnLFxuICApO1xuICBjb25zdCBydW5uZXIgPSBjcmVhdGVXZWJFeHRSdW5uZXIoKTtcblxuICBsZXQgaGFzQnVpbHRPbmNlID0gZmFsc2U7XG4gIGxldCBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlsZUNoYW5nZWRNdXRleCA9IG5ldyBNdXRleCgpO1xuICBjb25zdCBjaGFuZ2VRdWV1ZTogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcblxuICBjb25zdCB2aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoaW50ZXJuYWxDb25maWcudml0ZSk7XG4gIHZpdGVTZXJ2ZXIud2F0Y2hlci5vbignYWxsJywgYXN5bmMgKGV2ZW50LCBwYXRoLCBzdGF0cykgPT4ge1xuICAgIGlmICghaGFzQnVpbHRPbmNlIHx8IHBhdGguc3RhcnRzV2l0aChpbnRlcm5hbENvbmZpZy5vdXRCYXNlRGlyKSkgcmV0dXJuO1xuICAgIGNoYW5nZVF1ZXVlLnB1c2goW2V2ZW50LCBwYXRoXSk7XG5cbiAgICBhd2FpdCBmaWxlQ2hhbmdlZE11dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNoYW5nZVF1ZXVlLnNwbGljZSgwLCBjaGFuZ2VRdWV1ZS5sZW5ndGgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGRldGVjdERldkNoYW5nZXMoZmlsZUNoYW5nZXMsIGN1cnJlbnRPdXRwdXQpO1xuXG4gICAgICBpZiAoY2hhbmdlcy50eXBlID09PSAnbm8tY2hhbmdlJykgcmV0dXJuO1xuXG4gICAgICAvLyBMb2cgdGhlIGVudHJ5cG9pbnRzIHRoYXQgd2VyZSBlZmZlY3RlZFxuICAgICAgY29uc29sYS5pbmZvKFxuICAgICAgICBgQ2hhbmdlZDogJHtBcnJheS5mcm9tKG5ldyBTZXQoZmlsZUNoYW5nZXMubWFwKChjaGFuZ2UpID0+IGNoYW5nZVsxXSkpKVxuICAgICAgICAgIC5tYXAoKGZpbGUpID0+IHBjLmRpbShyZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5yb290LCBmaWxlKSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCByZWJ1aWx0TmFtZXMgPSBjaGFuZ2VzLnJlYnVpbGRHcm91cHNcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwYy5jeWFuKFxuICAgICAgICAgICAgcmVsYXRpdmUoaW50ZXJuYWxDb25maWcub3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeSwgJycpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihwYy5kaW0oJywgJykpO1xuXG4gICAgICAvLyBHZXQgbGF0ZXN0IGNvbmZpZyBhbmQgUmVidWlsZCBncm91cHMgd2l0aCBjaGFuZ2VzXG4gICAgICBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKFxuICAgICAgICB2aXRlLm1lcmdlQ29uZmlnKHNlcnZlckNvbmZpZywgY29uZmlnID8/IHt9KSxcbiAgICAgICAgJ3NlcnZlJyxcbiAgICAgICk7XG4gICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICBjb25zdCB7IG91dHB1dDogbmV3T3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKFxuICAgICAgICBpbnRlcm5hbENvbmZpZyxcbiAgICAgICAgLy8gVE9ETzogdGhpcyBleGNsdWRlcyBuZXcgZW50cnlwb2ludHMsIHNvIHRoZXkncmUgbm90IGJ1aWx0IHVudGlsIHRoZSBkZXYgY29tbWFuZCBpcyByZXN0YXJ0ZWRcbiAgICAgICAgY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLFxuICAgICAgICBjaGFuZ2VzLmNhY2hlZE91dHB1dCxcbiAgICAgICk7XG4gICAgICBjdXJyZW50T3V0cHV0ID0gbmV3T3V0cHV0O1xuXG4gICAgICAvLyBQZXJmb3JtIHJlbG9hZHNcbiAgICAgIHN3aXRjaCAoY2hhbmdlcy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2V4dGVuc2lvbi1yZWxvYWQnOlxuICAgICAgICAgIHNlcnZlci5yZWxvYWRFeHRlbnNpb24oKTtcbiAgICAgICAgICBjb25zb2xhLnN1Y2Nlc3MoYFJlbG9hZGVkIGV4dGVuc2lvbjogJHtyZWJ1aWx0TmFtZXN9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0bWwtcmVsb2FkJzpcbiAgICAgICAgICBjaGFuZ2VzLnJlYnVpbGRHcm91cHMuZmxhdCgpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgICBpbnRlcm5hbENvbmZpZy5vdXREaXIsXG4gICAgICAgICAgICAgICcuaHRtbCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2VydmVyLnJlbG9hZFBhZ2UocGF0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc29sYS5zdWNjZXNzKGBSZWxvYWRlZCBwYWdlczogJHtyZWJ1aWx0TmFtZXN9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCBzZXJ2ZXI6IFd4dERldlNlcnZlciA9IHtcbiAgICAuLi52aXRlU2VydmVyLFxuICAgIGFzeW5jIGxpc3Rlbihwb3J0LCBpc1Jlc3RhcnQpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHZpdGVTZXJ2ZXIubGlzdGVuKHBvcnQsIGlzUmVzdGFydCk7XG5cbiAgICAgIGlmICghaXNSZXN0YXJ0KSB7XG4gICAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5zdWNjZXNzKGBTdGFydGVkIGRldiBzZXJ2ZXIgQCAke29yaWdpbn1gKTtcblxuICAgICAgICBpbnRlcm5hbENvbmZpZy5sb2dnZXIuaW5mbygnT3BlbmluZyBicm93c2VyLi4uJyk7XG4gICAgICAgIGF3YWl0IHJ1bm5lci5vcGVuQnJvd3NlcihpbnRlcm5hbENvbmZpZyk7XG4gICAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5zdWNjZXNzKCdPcGVuZWQhJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICBwb3J0LFxuICAgIGhvc3RuYW1lLFxuICAgIG9yaWdpbixcbiAgICByZWxvYWRFeHRlbnNpb246ICgpID0+IHtcbiAgICAgIHNlcnZlci53cy5zZW5kKCd3eHQ6cmVsb2FkLWV4dGVuc2lvbicpO1xuICAgIH0sXG4gICAgcmVsb2FkUGFnZTogKHBhdGgpID0+IHtcbiAgICAgIC8vIENhbid0IHVzZSBWaXRlJ3MgYnVpbHQtaW4gXCJmdWxsLXJlbG9hZFwiIGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndCBsaWtlIG91ciBwYXRocywgaXQgZXhwZWN0c1xuICAgICAgLy8gcGF0aHMgZW5kaW5nIGluIFwiL2luZGV4Lmh0bWxcIlxuICAgICAgc2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtcGFnZScsIHBhdGgpO1xuICAgIH0sXG4gIH07XG4gIGludGVybmFsQ29uZmlnLmxvZ2dlci5pbmZvKCdDcmVhdGVkIGRldiBzZXJ2ZXInKTtcblxuICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIGN1cnJlbnRPdXRwdXQgPSBhd2FpdCBidWlsZEludGVybmFsKGludGVybmFsQ29uZmlnKTtcbiAgaGFzQnVpbHRPbmNlID0gdHJ1ZTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEludGVybmFsKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQcm9taXNlPEJ1aWxkT3V0cHV0PiB7XG4gIGNvbnN0IHZlcmIgPSBjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJyA/ICdQcmUtcmVuZGVyaW5nJyA6ICdCdWlsZGluZyc7XG4gIGNvbnN0IHRhcmdldCA9IGAke2NvbmZpZy5icm93c2VyfS1tdiR7Y29uZmlnLm1hbmlmZXN0VmVyc2lvbn1gO1xuICBjb25maWcubG9nZ2VyLmluZm8oXG4gICAgYCR7dmVyYn0gJHtwYy5jeWFuKHRhcmdldCl9IGZvciAke3BjLmN5YW4oY29uZmlnLm1vZGUpfSB3aXRoICR7cGMuZ3JlZW4oXG4gICAgICBgVml0ZSAke3ZpdGUudmVyc2lvbn1gLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAvLyBDbGVhbnVwXG4gIGF3YWl0IGZzLnJtKGNvbmZpZy5vdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXREaXIpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwRW50cnlwb2ludHMoZW50cnlwb2ludHMpO1xuICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgcmVidWlsZChjb25maWcsIGdyb3Vwcyk7XG5cbiAgLy8gUG9zdC1idWlsZFxuICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgYEJ1aWx0IGV4dGVuc2lvbiBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICk7XG4gIGF3YWl0IHByaW50QnVpbGRTdW1tYXJ5KG91dHB1dCwgY29uZmlnKTtcblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVidWlsZChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgZW50cnlwb2ludEdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIGV4aXN0aW5nT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfSxcbik6IFByb21pc2U8eyBvdXRwdXQ6IEJ1aWxkT3V0cHV0OyBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgfT4ge1xuICAvLyBCdWlsZFxuICBjb25zdCBhbGxFbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBhd2FpdCBnZW5lcmF0ZVR5cGVzRGlyKGFsbEVudHJ5cG9pbnRzLCBjb25maWcpO1xuICBjb25zdCBidWlsZE91dHB1dCA9IGF3YWl0IGJ1aWxkRW50cnlwb2ludHMoZW50cnlwb2ludEdyb3VwcywgY29uZmlnKTtcblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGdlbmVyYXRlTWFpbmZlc3QoYWxsRW50cnlwb2ludHMsIGJ1aWxkT3V0cHV0LCBjb25maWcpO1xuICBjb25zdCBvdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0LFxuICAgIC4uLmJ1aWxkT3V0cHV0LFxuICB9O1xuXG4gIC8vIFdyaXRlIG1hbmlmZXN0XG4gIGF3YWl0IHdyaXRlTWFuaWZlc3QobWFuaWZlc3QsIG91dHB1dCwgY29uZmlnKTtcblxuICByZXR1cm4ge1xuICAgIG91dHB1dDoge1xuICAgICAgbWFuaWZlc3QsXG4gICAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5vdXRwdXQuc3RlcHNdLFxuICAgICAgcHVibGljQXNzZXRzOiBbLi4uZXhpc3RpbmdPdXRwdXQucHVibGljQXNzZXRzLCAuLi5vdXRwdXQucHVibGljQXNzZXRzXSxcbiAgICB9LFxuICAgIG1hbmlmZXN0LFxuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IGdldEdsb2JhbHMgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbmQgd3JpdGUgYWxsIHRoZSBmaWxlcyBpbnNpZGUgdGhlIGBJbnRlcm5hbENvbmZpZy50eXBlc0RpcmAgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlc0RpcihcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLnR5cGVzRGlyKTtcblxuICBjb25zdCByZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVJbXBvcnRzRGVjbGFyYXRpb25GaWxlKGNvbmZpZykpO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShlbnRyeXBvaW50cywgY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG5cbiAgY29uc3QgbWFpblJlZmVyZW5jZSA9IGF3YWl0IHdyaXRlTWFpbkRlY2xhcmF0aW9uRmlsZShyZWZlcmVuY2VzLCBjb25maWcpO1xuICBhd2FpdCB3cml0ZVRzQ29uZmlnRmlsZShtYWluUmVmZXJlbmNlLCBjb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnaW1wb3J0cy5kLnRzJyk7XG4gIGNvbnN0IHVuaW1wb3J0ID0gY3JlYXRlVW5pbXBvcnQoZ2V0VW5pbXBvcnRPcHRpb25zKGNvbmZpZykpO1xuXG4gIC8vIExvYWQgcHJvamVjdCBpbXBvcnRzIGludG8gdW5pbXBvcnQgbWVtb3J5IHNvIHRoZXkgYXJlIG91dHB1dCB2aWEgZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zXG4gIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbJy8vIEdlbmVyYXRlZCBieSB3eHQnLCBhd2FpdCB1bmltcG9ydC5nZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoKV0uam9pbihcbiAgICAgICdcXG4nLFxuICAgICkgKyAnXFxuJyxcbiAgKTtcblxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUGF0aHNEZWNsYXJhdGlvbkZpbGUoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAncGF0aHMuZC50cycpO1xuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAndHlwZSBFbnRyeXBvaW50UGF0aCA9JyxcbiAgICAgIC4uLmVudHJ5cG9pbnRzXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKCcuaHRtbCcpID8gJy5odG1sJyA6ICcuanMnLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGAgIHwgXCIvJHtwYXRofVwiYDtcbiAgICAgICAgfSlcbiAgICAgICAgLnNvcnQoKSxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnZ2xvYmFscy5kLnRzJyk7XG4gIGNvbnN0IGdsb2JhbHMgPSBnZXRHbG9iYWxzKGNvbmZpZyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAnZXhwb3J0IHt9JyxcbiAgICAgICdkZWNsYXJlIGdsb2JhbCB7JyxcbiAgICAgIC4uLmdsb2JhbHMubWFwKChnbG9iYWwpID0+IGAgIGNvbnN0ICR7Z2xvYmFsLm5hbWV9OiAke2dsb2JhbC50eXBlfTtgKSxcbiAgICAgICd9JyxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICAgJ3V0Zi04JyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUoXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGRpciwgJ3d4dC5kLnRzJyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAuLi5yZWZlcmVuY2VzLm1hcChcbiAgICAgICAgKHJlZikgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi8ke3JlbGF0aXZlKGRpciwgcmVmKX1cIiAvPmAsXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRzQ29uZmlnRmlsZShcbiAgbWFpblJlZmVyZW5jZTogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICByZXNvbHZlKGRpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICBge1xuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJ0YXJnZXRcIjogXCJFU05leHRcIixcbiAgICBcIm1vZHVsZVwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIkJ1bmRsZXJcIixcbiAgICBcIm5vRW1pdFwiOiB0cnVlLFxuICAgIFwiZXNNb2R1bGVJbnRlcm9wXCI6IHRydWUsXG4gICAgXCJmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lc1wiOiB0cnVlLFxuICAgIFwicmVzb2x2ZUpzb25Nb2R1bGVcIjogdHJ1ZSxcblxuICAgIC8qIFR5cGUgQ2hlY2tpbmcgKi9cbiAgICBcInN0cmljdFwiOiB0cnVlLFxuXG4gICAgLyogQ29tcGxldGVuZXNzICovXG4gICAgXCJza2lwTGliQ2hlY2tcIjogdHJ1ZVxuICB9LFxuICBcImluY2x1ZGVcIjogW1xuICAgIFwiJHtyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KX0vKiovKlwiLFxuICAgIFwiLi8ke3JlbGF0aXZlKGRpciwgbWFpblJlZmVyZW5jZSl9XCJcbiAgXSxcbiAgXCJleGNsdWRlXCI6IFtcIiR7cmVsYXRpdmUoZGlyLCBjb25maWcub3V0QmFzZURpcil9XCJdXG59YCxcbiAgKTtcbn1cbiIsICJpbXBvcnQgbmV0IGZyb20gJ25vZGU6bmV0JztcblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3Qgb3BlbiBwb3J0IGluIGEgcmFuZ2Ugb2YgcG9ydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3BlblBvcnQoXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBlbmRQb3J0OiBudW1iZXIsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gZmluZE9wZW5Qb3J0UmVjdXJzaXZlKHN0YXJ0UG9ydCwgc3RhcnRQb3J0LCBlbmRQb3J0KTtcbn1cblxuZnVuY3Rpb24gZmluZE9wZW5Qb3J0UmVjdXJzaXZlKFxuICBwb3J0OiBudW1iZXIsXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBlbmRQb3J0OiBudW1iZXIsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChwb3J0ID4gZW5kUG9ydClcbiAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgIEVycm9yKGBDb3VsZCBub3QgZmluZCBvcGVuIHBvcnQgYmV0d2VlbiAke3N0YXJ0UG9ydH0tJHtlbmRQb3J0fWApLFxuICAgICAgKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIHNlcnZlci5vbmNlKCdjbG9zZScsICgpID0+IHJlc29sdmUocG9ydCkpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLm9uKCdlcnJvcicsICgpID0+XG4gICAgICByZXNvbHZlKGZpbmRPcGVuUG9ydFJlY3Vyc2l2ZShwb3J0ICsgMSwgc3RhcnRQb3J0LCBlbmRQb3J0KSksXG4gICAgKTtcbiAgfSk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZHVyYXRpb24gPCAxZTMpIHJldHVybiBgJHtkdXJhdGlvbn0gbXNgO1xuICBpZiAoZHVyYXRpb24gPCAxMGUzKSByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDMpfSBzYDtcbiAgaWYgKGR1cmF0aW9uIDwgNjBlMykgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgxKX0gc2A7XG4gIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMCl9IHNgO1xufVxuIiwgImltcG9ydCB0eXBlIHsgV2ViRXh0UnVuSW5zdGFuY2UgfSBmcm9tICd3ZWItZXh0JztcbmltcG9ydCB7IEV4dGVuc2lvblJ1bm5lciB9IGZyb20gJy4vRXh0ZW5zaW9uUnVubmVyJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gYEV4dGVuc2lvblJ1bm5lcmAgYmFja2VkIGJ5IGB3ZWItZXh0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYkV4dFJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICBsZXQgcnVubmVyOiBXZWJFeHRSdW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnc2FmYXJpJykge1xuICAgICAgICBjb25maWcubG9nZ2VyLndhcm4oJ0Nhbm5vdCBvcGVuIHNhZmFyaSBhdXRvbWF0aWNhbGx5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGUgcGx1Z2luJ3MgbG9nZ2VyIGluc3RlYWQgb2Ygd2ViLWV4dCdzIGJ1aWx0LWluIG9uZS5cbiAgICAgIGNvbnN0IHdlYkV4dExvZ2dlciA9IGF3YWl0IGltcG9ydCgnd2ViLWV4dC91dGlsL2xvZ2dlcicpO1xuICAgICAgd2ViRXh0TG9nZ2VyLmNvbnNvbGVTdHJlYW0ud3JpdGUgPSAoeyBsZXZlbCwgbXNnLCBuYW1lIH0pID0+IHtcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SX0xPR19MRVZFTCkgY29uZmlnLmxvZ2dlci5lcnJvcihuYW1lLCBtc2cpO1xuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTl9MT0dfTEVWRUwpIGNvbmZpZy5sb2dnZXIud2Fybihtc2cpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd3h0VXNlckNvbmZpZyA9IGNvbmZpZy5ydW5uZXJDb25maWcuY29uZmlnO1xuICAgICAgY29uc3QgdXNlckNvbmZpZyA9IHtcbiAgICAgICAgY29uc29sZTogd3h0VXNlckNvbmZpZz8ub3BlbkNvbnNvbGUsXG4gICAgICAgIGRldnRvb2xzOiB3eHRVc2VyQ29uZmlnPy5vcGVuRGV2dG9vbHMsXG4gICAgICAgIHN0YXJ0VXJsOiB3eHRVc2VyQ29uZmlnPy5zdGFydFVybHMsXG4gICAgICAgIC4uLihjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZpcmVmb3g6IHd4dFVzZXJDb25maWc/LmJpbmFyaWVzPy5maXJlZm94LFxuICAgICAgICAgICAgICBmaXJlZm94UHJvZmlsZTogd3h0VXNlckNvbmZpZz8uZmlyZWZveFByb2ZpbGUsXG4gICAgICAgICAgICAgIHByZWZzOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94UHJlZnMsXG4gICAgICAgICAgICAgIGFyZ3M6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hBcmdzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaHJvbWl1bUJpbmFyeTogd3h0VXNlckNvbmZpZz8uYmluYXJpZXM/Lltjb25maWcuYnJvd3Nlcl0sXG4gICAgICAgICAgICAgIGNocm9taXVtUHJvZmlsZTogd3h0VXNlckNvbmZpZz8uY2hyb21pdW1Qcm9maWxlLFxuICAgICAgICAgICAgICBhcmdzOiB3eHRVc2VyQ29uZmlnPy5jaHJvbWl1bUFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsQ29uZmlnID0ge1xuICAgICAgICAuLi51c2VyQ29uZmlnLFxuICAgICAgICB0YXJnZXQ6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyAnZmlyZWZveC1kZXNrdG9wJyA6ICdjaHJvbWl1bScsXG4gICAgICAgIHNvdXJjZURpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgLy8gV1hUIGhhbmRsZXMgcmVsb2Fkcywgc28gZGlzYWJsZSBhdXRvLXJlbG9hZCBiZWhhdmlvcnMgaW4gd2ViLWV4dFxuICAgICAgICBub1JlbG9hZDogdHJ1ZSxcbiAgICAgICAgbm9JbnB1dDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAvLyBEb24ndCBjYWxsIGBwcm9jZXNzLmV4aXQoMClgIGFmdGVyIHN0YXJ0aW5nIHdlYi1leHRcbiAgICAgICAgc2hvdWxkRXhpdFByb2dyYW06IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgY29uZmlnOicsIGZpbmFsQ29uZmlnKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgb3B0aW9uczonLCBvcHRpb25zKTtcblxuICAgICAgY29uc3Qgd2ViRXh0ID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0Jyk7XG4gICAgICBydW5uZXIgPSBhd2FpdCB3ZWJFeHQuZGVmYXVsdC5jbWQucnVuKGZpbmFsQ29uZmlnLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5lcj8uZXhpdCgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYi1leHQvYmxvYi9lMzdlNjBhMjczODQ3OGY1MTJmMTI1NWM1MzcxMzMzMjFmMzAxNzcxL3NyYy91dGlsL2xvZ2dlci5qcyNMMTJcbmNvbnN0IFdBUk5fTE9HX0xFVkVMID0gNDA7XG5jb25zdCBFUlJPUl9MT0dfTEVWRUwgPSA1MDtcbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIEVudHJ5cG9pbnRzIGNhbiBiZSBidWlsZCBpbiBncm91cHMuIEhUTUwgcGFnZXMgY2FuIGFsbCBiZSBidWlsdCB0b2dldGhlciBpbiBhIHNpbmdsZSBzdGVwLCB3aGlsZVxuICogY29udGVudCBzY3JpcHRzIG11c3QgYmUgYnVpbGQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZW50cnlwb2ludHMgcHV0IGludG8gdGhlc2UgdHlwZXMgb2YgZ3JvdXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBFbnRyeXBvaW50cyhlbnRyeXBvaW50czogRW50cnlwb2ludFtdKTogRW50cnlwb2ludEdyb3VwW10ge1xuICBjb25zdCBncm91cEluZGV4TWFwOiBQYXJ0aWFsPFJlY29yZDxHcm91cCwgbnVtYmVyPj4gPSB7fTtcbiAgY29uc3QgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cnlwb2ludHMpIHtcbiAgICBjb25zdCBncm91cCA9IEVOVFJZX1RZUEVfVE9fR1JPVVBfTUFQW2VudHJ5LnR5cGVdO1xuICAgIGlmIChncm91cCA9PT0gJ25vLWdyb3VwJykge1xuICAgICAgZ3JvdXBzLnB1c2goZW50cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZ3JvdXBJbmRleCA9IGdyb3VwSW5kZXhNYXBbZ3JvdXBdO1xuICAgICAgaWYgKGdyb3VwSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBncm91cEluZGV4ID0gZ3JvdXBzLnB1c2goW10pIC0gMTtcbiAgICAgICAgZ3JvdXBJbmRleE1hcFtncm91cF0gPSBncm91cEluZGV4O1xuICAgICAgfVxuICAgICAgKGdyb3Vwc1tncm91cEluZGV4XSBhcyBFbnRyeXBvaW50W10pLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cHM7XG59XG5cbmNvbnN0IEVOVFJZX1RZUEVfVE9fR1JPVVBfTUFQOiBSZWNvcmQ8RW50cnlwb2ludFsndHlwZSddLCBHcm91cD4gPSB7XG4gIHNhbmRib3g6ICdzYW5kYm94LXBhZ2UnLFxuXG4gIHBvcHVwOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBuZXd0YWI6ICdleHRlbnNpb24tcGFnZScsXG4gIGhpc3Rvcnk6ICdleHRlbnNpb24tcGFnZScsXG4gIG9wdGlvbnM6ICdleHRlbnNpb24tcGFnZScsXG4gIGRldnRvb2xzOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBib29rbWFya3M6ICdleHRlbnNpb24tcGFnZScsXG4gIHNpZGVwYW5lbDogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgJ3VubGlzdGVkLXBhZ2UnOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuXG4gIGJhY2tncm91bmQ6ICduby1ncm91cCcsXG4gICdjb250ZW50LXNjcmlwdCc6ICduby1ncm91cCcsXG4gICd1bmxpc3RlZC1zY3JpcHQnOiAnbm8tZ3JvdXAnLFxufTtcblxudHlwZSBHcm91cCA9ICdleHRlbnNpb24tcGFnZScgfCAnc2FuZGJveC1wYWdlJyB8ICduby1ncm91cCc7XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIEJ1aWxkU3RlcE91dHB1dCwgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcblxuLyoqXG4gKiBDb21wYXJlIHRoZSBjaGFuZ2VkIGZpbGVzIHZzIHRoZSBidWlsZCBvdXRwdXQgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcmVsb2FkIG5lZWRzIHRvIGhhcHBlbjpcbiAqXG4gKiAtIERvIG5vdGhpbmdcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gSFRNTCBwYWdlIGlzIGNoYW5nZWQgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGVcbiAqICAgICBkZXYgc2VydmVyXG4gKiAgIC0gQ2hhbmdlIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSBlbnRyeXBvaW50c1xuICogLSBSZWxvYWQgQ29udGVudCBzY3JpcHRcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjb250ZW50IHNjcmlwdFxuICogICAtIEJhY2tncm91bmQgc2NyaXB0IHdpbGwgYmUgdG9sZCB0byByZWxvYWQgdGhlIGNvbnRlbnQgc2NyaXB0XG4gKiAtIFJlbG9hZCBIVE1MIGZpbGVcbiAqICAgLSBIVE1MIGZpbGUgaXRzZWxmIGlzIHNhdmVkIC0gSE1SIGRvZXNuJ3QgaGFuZGxlIHRoaXMgYmVjYXVzZSB0aGUgSFRNTCBwYWdlcyBhcmUgcHJlLXJlbmRlcmVkXG4gKiAgIC0gQ2hyb21lIGlzIE9LIHJlbG9hZGluZyB0aGUgcGFnZSB3aGVuIHRoZSBIVE1MIGZpbGUgaXMgY2hhbmdlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGVcbiAqICAgICBleHRlbnNpb24uIE5vdCBzdXJlIGFib3V0IGZpcmVmb3gsIHRoaXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdG8gYW4gZXh0ZW5zaW9uIHJlbG9hZFxuICogLSBSZWxvYWQgZXh0ZW5zaW9uXG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgaXMgY2hhbmdlZFxuICogICAtIE1hbmlmZXN0IGlzIGRpZmZlcmVudFxuICogLSBSZXN0YXJ0IGJyb3dzZXJcbiAqICAgLSBDb25maWcgZmlsZSBjaGFuZ2VkICh3eHQuY29uZmlnLnRzLCAuZW52LCB3ZWItZXh0LmNvbmZpZy50cywgZXRjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RGV2Q2hhbmdlcyhcbiAgY2hhbmdlZEZpbGVzOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXVtdLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZCxcbik6IERldk1vZGVDaGFuZ2Uge1xuICBpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IGNoYW5nZWRTdGVwcyA9IG5ldyBTZXQoXG4gICAgY2hhbmdlZEZpbGVzLmZsYXRNYXAoKGNoYW5nZWRGaWxlKSA9PlxuICAgICAgZmluZEVmZmVjdGVkU3RlcHMoY2hhbmdlZEZpbGUsIGN1cnJlbnRPdXRwdXQpLFxuICAgICksXG4gICk7XG4gIGlmIChjaGFuZ2VkU3RlcHMuc2l6ZSA9PT0gMCkgcmV0dXJuIHsgdHlwZTogJ25vLWNoYW5nZScgfTtcblxuICBjb25zdCB1bmNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuICBjb25zdCBjaGFuZ2VkT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogY3VycmVudE91dHB1dC5tYW5pZmVzdCxcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGlmIChjaGFuZ2VkU3RlcHMuaGFzKHN0ZXApKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuY2hhbmdlZE91dHB1dC5zdGVwcy5wdXNoKHN0ZXApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoYXNzZXQpKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc09ubHlIdG1sQ2hhbmdlcyA9ICFjaGFuZ2VkRmlsZXMuZmluZChcbiAgICAoW18sIGZpbGVdKSA9PiAhZmlsZS5lbmRzV2l0aCgnLmh0bWwnKSxcbiAgKTtcbiAgaWYgKGlzT25seUh0bWxDaGFuZ2VzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdodG1sLXJlbG9hZCcsXG4gICAgICBjYWNoZWRPdXRwdXQ6IHVuY2hhbmdlZE91dHB1dCxcbiAgICAgIHJlYnVpbGRHcm91cHM6IGNoYW5nZWRPdXRwdXQuc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLmVudHJ5cG9pbnRzKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnZXh0ZW5zaW9uLXJlbG9hZCcsXG4gICAgY2FjaGVkT3V0cHV0OiB1bmNoYW5nZWRPdXRwdXQsXG4gICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICB9O1xufVxuXG4vKipcbiAqIEZvciBhIHNpbmdsZSBjaGFuZ2UsIHJldHVybiBhbGwgdGhlIHN0ZXAgb2YgdGhlIGJ1aWxkIG91dHB1dCB0aGF0IHdlcmUgZWZmZWN0ZWQgYnkgaXQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRFZmZlY3RlZFN0ZXBzKFxuICBjaGFuZ2VkRmlsZTogW2V2ZW50OiBzdHJpbmcsIHBhdGg6IHN0cmluZ10sXG4gIGN1cnJlbnRPdXRwdXQ6IEJ1aWxkT3V0cHV0LFxuKTogRGV0ZWN0ZWRDaGFuZ2VbXSB7XG4gIGNvbnN0IGNoYW5nZXM6IERldGVjdGVkQ2hhbmdlW10gPSBbXTtcbiAgY29uc3QgY2hhbmdlZFBhdGggPSBjaGFuZ2VkRmlsZVsxXTtcblxuICBjb25zdCBpc0NodW5rRWZmZWN0ZWQgPSAoXG4gICAgY2h1bms6IHZpdGUuUm9sbHVwLk91dHB1dENodW5rIHwgdml0ZS5Sb2xsdXAuT3V0cHV0QXNzZXQsXG4gICk6IGJvb2xlYW4gPT5cbiAgICAvLyBJZiBpdCdzIGFuIEhUTUwgZmlsZSB3aXRoIHRoZSBzYW1lIHBhdGgsIGlzIGlzIGVmZmVjdGVkIGJlY2F1c2UgSFRNTCBmaWxlcyBuZWVkIHRvIGJlIHByZS1yZW5kZXJlZFxuICAgIC8vIFRPRE86IHVzZSBidW5kbGUgcGF0aCB0byBzdXBwb3J0IGA8bmFtZT4vaW5kZXguaHRtbGA/XG4gICAgKGNodW5rLnR5cGUgPT09ICdhc3NldCcgJiYgY2hhbmdlZFBhdGguZW5kc1dpdGgoY2h1bmsuZmlsZU5hbWUpKSB8fFxuICAgIC8vIElmIGl0J3MgYSBjaHVuayB0aGF0IGRlcGVuZHMgb24gdGhlIGNoYW5nZWQgZmlsZSwgaXQgaXMgZWZmZWN0ZWRcbiAgICAoY2h1bmsudHlwZSA9PT0gJ2NodW5rJyAmJiBjaHVuay5tb2R1bGVJZHMuaW5jbHVkZXMoY2hhbmdlZFBhdGgpKTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGNvbnN0IGVmZmVjdGVkQ2h1bmsgPSBzdGVwLmNodW5rcy5maW5kKChjaHVuaykgPT4gaXNDaHVua0VmZmVjdGVkKGNodW5rKSk7XG4gICAgaWYgKGVmZmVjdGVkQ2h1bmspIGNoYW5nZXMucHVzaChzdGVwKTtcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdGVkQXNzZXQgPSBjdXJyZW50T3V0cHV0LnB1YmxpY0Fzc2V0cy5maW5kKChjaHVuaykgPT5cbiAgICBpc0NodW5rRWZmZWN0ZWQoY2h1bmspLFxuICApO1xuICBpZiAoZWZmZWN0ZWRBc3NldCkgY2hhbmdlcy5wdXNoKGVmZmVjdGVkQXNzZXQpO1xuXG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgZmlsZXMgY2hhbmdlZCwgd2hhdCBuZWVkcyByZWJ1aWx0LCBhbmQgdGhlIHR5cGUgb2YgcmVsb2FkIHRoYXQgaXNcbiAqIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBEZXZNb2RlQ2hhbmdlID0gTm9DaGFuZ2UgfCBIdG1sUmVsb2FkIHwgRXh0ZW5zaW9uUmVsb2FkO1xuLy8gfCBCcm93c2VyUmVzdGFydFxuLy8gfCBDb250ZW50U2NyaXB0UmVsb2FkXG5cbmludGVyZmFjZSBOb0NoYW5nZSB7XG4gIHR5cGU6ICduby1jaGFuZ2UnO1xufVxuXG5pbnRlcmZhY2UgUmVidWlsZENoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbnRyeXBvaW50cyB0aGF0IG5lZWQgcmVidWlsdC5cbiAgICovXG4gIHJlYnVpbGRHcm91cHM6IEVudHJ5cG9pbnRHcm91cFtdO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIG91dHB1dCBzdHJpcHBlZCBvZiBhbnkgZmlsZXMgYXJlIGdvaW5nIHRvIGNoYW5nZS5cbiAgICovXG4gIGNhY2hlZE91dHB1dDogQnVpbGRPdXRwdXQ7XG59XG5cbmludGVyZmFjZSBIdG1sUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdodG1sLXJlbG9hZCc7XG59XG5cbmludGVyZmFjZSBFeHRlbnNpb25SZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnO1xufVxuXG4vLyBpbnRlcmZhY2UgQnJvd3NlclJlc3RhcnQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbi8vICAgdHlwZTogJ2Jyb3dzZXItcmVzdGFydCc7XG4vLyB9XG5cbi8vIGludGVyZmFjZSBDb250ZW50U2NyaXB0UmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4vLyAgIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnO1xuLy8gfVxuXG4vKipcbiAqIFdoZW4gZmlndXJpbmcgb3V0IHdoYXQgbmVlZHMgcmVsb2FkZWQsIHRoaXMgc3RvcmVzIHRoZSBzdGVwIHRoYXQgd2FzIGNoYW5nZWQsIG9yIHRoZSBwdWJsaWNcbiAqIGRpcmVjdG9yeSBhc3NldCB0aGF0IHdhcyBjaGFuZ2VkLiBJdCBkb2Vzbid0IGtub3cgd2hhdCB0eXBlIG9mIGNoYW5nZSBpcyByZXF1aXJlZCB5ZXQuIEp1c3QgYW5cbiAqIGludGVybWVkaWF0ZSB0eXBlLlxuICovXG50eXBlIERldGVjdGVkQ2hhbmdlID0gQnVpbGRTdGVwT3V0cHV0IHwgdml0ZS5Sb2xsdXAuT3V0cHV0QXNzZXQ7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgcHJpbnRIZWFkZXIgfSBmcm9tICcuLi8uLi9jb3JlL2xvZy9wcmludEhlYWRlcic7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29tbWFuZDxUQXJncyBleHRlbmRzIGFueVtdPihcbiAgY2I6ICguLi5hcmdzOiBUQXJncykgPT4gdm9pZCB8IGJvb2xlYW4gfCBQcm9taXNlPHZvaWQgfCBib29sZWFuPixcbikge1xuICByZXR1cm4gYXN5bmMgKC4uLmFyZ3M6IFRBcmdzKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0cnkge1xuICAgICAgcHJpbnRIZWFkZXIoKTtcblxuICAgICAgY29uc3Qgb25nb2luZyA9IGF3YWl0IGNiKC4uLmFyZ3MpO1xuXG4gICAgICBpZiAoIW9uZ29pbmcpXG4gICAgICAgIGNvbnNvbGEuc3VjY2VzcyhcbiAgICAgICAgICBgRmluaXNoZWQgaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sYS5mYWlsKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgYWZ0ZXIgJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGEuZXJyb3IoZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50SGVhZGVyKCkge1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xhLmxvZyhgJHtwYy5ncmF5KCdXWFQnKX0gJHtwYy5ncmF5KHBjLmJvbGQodmVyc2lvbikpfWApO1xufVxuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBidWlsZCA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIG1vZGU/OiBzdHJpbmc7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgICBicm93c2VyPzogd3h0LlRhcmdldEJyb3dzZXI7XG4gICAgICBtdjM/OiBib29sZWFuO1xuICAgICAgbXYyPzogYm9vbGVhbjtcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBtb2RlID0gZmxhZ3MubW9kZSA/PyAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgfTtcblxuICBhd2FpdCB3eHQuYnVpbGQoY2xpQ29uZmlnKTtcbn0pO1xuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBkZXYgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgbW9kZSA9IGZsYWdzLm1vZGUgPz8gJ2RldmVsb3BtZW50JztcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuXG4gIGNvbnN0IHNlcnZlciA9IGF3YWl0IHd4dC5jcmVhdGVTZXJ2ZXIoY2xpQ29uZmlnKTtcbiAgYXdhaXQgc2VydmVyLmxpc3RlbihzZXJ2ZXIucG9ydCk7XG5cbiAgcmV0dXJuIHRydWU7XG59KTtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gZGVmaW5lQ29tbWFuZDxbZGlyZWN0b3J5Pzogc3RyaW5nXT4oYXN5bmMgKGRpcmVjdG9yeSkgPT4ge1xuICBjb25zb2xhLndhcm4oJ3d4dCBpbml0OiBOb3QgaW1wbGVtZW50ZWQnKTtcbn0pO1xuIiwgImltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9nZXRJbnRlcm5hbENvbmZpZyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkL2ZpbmRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVzRGlyIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcbmltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgfTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0SW50ZXJuYWxDb25maWcoY2xpQ29uZmlnLCAnYnVpbGQnKTtcblxuICBjb25maWcubG9nZ2VyLmluZm8oJ0dlbmVyYXRpbmcgdHlwZXMuLi4nKTtcblxuICBjb25zdCBlbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBhd2FpdCBnZW5lcmF0ZVR5cGVzRGlyKGVudHJ5cG9pbnRzLCBjb25maWcpO1xufSk7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgcHVibGlzaCA9IGRlZmluZUNvbW1hbmQoXG4gIGFzeW5jIChyb290OiBhbnksIHsgY29uZmlnOiBjb25maWdGaWxlIH06IGFueSkgPT4ge1xuICAgIGNvbnNvbGEud2Fybignd3h0IHB1Ymxpc2g6IE5vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsaUJBQWdCOzs7QUNDZCxjQUFXOzs7QUNHYixJQUFBQSxvQkFBOEI7QUFDOUIsSUFBQUMsUUFBc0I7QUFDdEIsSUFBQUMsa0JBQXdCOzs7QUNSeEIscUJBQXdCO0FBQ3hCLGtCQUF1QjtBQUN2QixtQkFBc0I7QUFDdEIsa0JBQXdCO0FBQ3hCLHNCQUE0QjtBQUU1QixlQUFzQixhQUFnQixNQUFjQyxPQUEwQjtBQUM1RSxRQUFNLGdCQUFnQixVQUFNO0FBQUEsUUFDMUIscUJBQVEsTUFBTSxpQ0FBaUM7QUFBQSxFQUNqRDtBQUNBLFFBQU0sV0FBTyxZQUFBQyxTQUFXLFlBQVk7QUFBQSxJQUNsQyxPQUFPO0FBQUEsSUFDUCxZQUFZO0FBQUEsSUFDWixnQkFBZ0I7QUFBQSxJQUVoQixVQUFVLE1BQU07QUFFZCxXQUFLLFNBQVMsS0FBSyxPQUFPLFFBQVEsZ0NBQWdDLEVBQUU7QUFDcEUsV0FBSyxTQUFTLEtBQUssT0FBTztBQUFBLFFBQ3hCO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFHQSxVQUFJLEtBQUssYUFBYUQsT0FBTTtBQUUxQixjQUFNLFVBQ0osY0FDRyxJQUFJLENBQUMsTUFBTSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUNuRCxLQUFLLElBQUksSUFBSTtBQUNsQixhQUFLLFNBQVMsVUFBVSxLQUFLO0FBQUEsTUFDL0I7QUFHQSxpQkFBTyxhQUFBRSxTQUFVLElBQUk7QUFBQSxJQUN2QjtBQUFBLEVBQ0YsQ0FBQztBQUNELE1BQUk7QUFDRixXQUFPLE1BQU0sS0FBS0YsS0FBSTtBQUFBLEVBQ3hCLFNBQVMsS0FBUDtBQUNBLDJCQUFRLE1BQU0sMEJBQTBCQSxPQUFNO0FBQzlDLFVBQU07QUFBQSxFQUNSO0FBQ0Y7OztBQzNDQSxXQUFzQjs7O0FDQ3RCLHVCQUF3QztBQUVqQyxTQUFTLGtC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QyxPQUFnQixHQUFHO0FBR3RCLElBQ0csUUFBUSxnQkFBZ0Isc0JBQXNCLEVBQzlDLE9BQU8sdUJBQXVCLDJCQUEyQixFQUN6RCxPQUFPLHFCQUFxQixjQUFjLEVBQzFDLE9BQU8sMkJBQTJCLG1CQUFtQixFQUNyRCxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBZ0JDLE1BQUs7QUFHeEIsSUFDRyxRQUFRLGtCQUFrQixTQUFTLEVBQ25DLE9BQU8sdUJBQXVCLDJCQUEyQixFQUN6RCxPQUFnQixPQUFPO0FBRzFCLElBQUksUUFBUSxrQkFBa0IsbUJBQW1CLEVBQUUsT0FBZ0IsT0FBTztBQUcxRSxJQUNHLFFBQVEsb0JBQW9CLDBCQUEwQixFQUN0RCxPQUFnQixJQUFJO0FBRXZCLElBQUksTUFBTTsiLAogICJuYW1lcyI6IFsiaW1wb3J0X25vZGVfcGF0aCIsICJ2aXRlIiwgImltcG9ydF9jb25zb2xhIiwgInBhdGgiLCAiY3JlYXRlSklUSSIsICJ0cmFuc2Zvcm0iLCAicGF0aCIsICJpbXBvcnRfcGF0aCIsICJpc09mZmxpbmUiLCAiZG5zIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiZnMiLCAiaW1wb3J0X3VuaW1wb3J0IiwgInVuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbGlua2Vkb20iLCAiZ2xvYiIsICJwYXRoIiwgInBpY29tYXRjaCIsICJmcyIsICJKU09ONSIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9mYXN0X2dsb2IiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgImdsb2IiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInZlcnNpb24iLCAib3B0aW9ucyIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAicGF0aCIsICJmcyIsICJwYyIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3VuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJ1bmltcG9ydCIsICJwYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAicmVzb2x2ZSIsICJuZXQiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAicGF0aCIsICJwYyIsICJwb3J0IiwgImZzIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9waWNvY29sb3JzIiwgImltcG9ydF9jb25zb2xhIiwgInBjIiwgImJ1aWxkIiwgImNyZWF0ZVNlcnZlciIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfY29uc29sYSIsICJjYWMiLCAiYnVpbGQiXQp9Cg==
1872
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9pbmRleC50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvaW1wb3J0VHNGaWxlLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9kZXZIdG1sUHJlcmVuZGVyLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9kZXZTZXJ2ZXJHbG9iYWxzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL25ldHdvcmsudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcHJvbWlzZXMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rvd25sb2FkLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9tdWx0aXBhZ2VNb3ZlLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy91bmltcG9ydC50cyIsICIuLi9zcmMvY29yZS91dGlscy9hdXRvLWltcG9ydHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3ZpcnR1YWxFbnRyeXBvaW50LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NyZWF0ZUZzQ2FjaGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2xvYmFscy50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvYXJyYXlzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2RldGVjdERldkNoYW5nZXMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9yZW1vdmVFbXB0eURpcnMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvZmluZEVudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbWFuaWZlc3QudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvQ29udGVudFNlY3VyaXR5UG9saWN5LnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2dyb3VwRW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZm9ybWF0RHVyYXRpb24udHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50QnVpbGRTdW1tYXJ5LnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludFRhYmxlLnRzIiwgIi4uL3NyYy9jb3JlL3NlcnZlci50cyIsICIuLi9zcmMvY29yZS91dGlscy9maW5kT3BlblBvcnQudHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy9jcmVhdGVXZWJFeHRSdW5uZXIudHMiLCAiLi4vc3JjL2NsaS91dGlscy9kZWZpbmVDb21tYW5kLnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludEhlYWRlci50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2J1aWxkLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvZGV2LnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvaW5pdC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL3ByZXBhcmUudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9wdWJsaXNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCBjYWMgZnJvbSAnY2FjJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0ICogYXMgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcyc7XG5cbmNvbnN0IGNsaSA9IGNhYygnd3h0Jyk7XG5jbGkuaGVscCgpO1xuY2xpLnZlcnNpb24odmVyc2lvbik7XG5cbi8vIERFVlxuY2xpXG4gIC5jb21tYW5kKCdbcm9vdF0nLCAnc3RhcnQgZGV2IHNlcnZlcicpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5vcHRpb24oJy1tLCAtLW1vZGUgPG1vZGU+JywgJ3NldCBlbnYgbW9kZScpXG4gIC5vcHRpb24oJy1iLCAtLWJyb3dzZXIgPGJyb3dzZXI+JywgJ3NwZWNpZnkgYSBicm93c2VyJylcbiAgLm9wdGlvbignLS1tdjMnLCAndGFyZ2V0IG1hbmlmZXN0IHYzJylcbiAgLm9wdGlvbignLS1tdjInLCAndGFyZ2V0IG1hbmlmZXN0IHYyJylcbiAgLmFjdGlvbihjb21tYW5kcy5kZXYpO1xuXG4vLyBCVUlMRFxuY2xpXG4gIC5jb21tYW5kKCdidWlsZCBbcm9vdF0nLCAnYnVpbGQgZm9yIHByb2R1Y3Rpb24nKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuYnVpbGQpO1xuXG4vLyBQUkVQQVJFXG5jbGlcbiAgLmNvbW1hbmQoJ3ByZXBhcmUgW3Jvb3RdJywgJ3ByZXBhcmUnKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAuYWN0aW9uKGNvbW1hbmRzLnByZXBhcmUpO1xuXG4vLyBQVUJMSVNIXG5jbGkuY29tbWFuZCgncHVibGlzaCBbcm9vdF0nLCAncHVibGlzaCB0byBzdG9yZXMnKS5hY3Rpb24oY29tbWFuZHMucHVibGlzaCk7XG5cbi8vIElOSVRcbmNsaVxuICAuY29tbWFuZCgnaW5pdCBbZGlyZWN0b3J5XScsICdpbml0aWFsaXplIGEgbmV3IHByb2plY3QnKVxuICAuYWN0aW9uKGNvbW1hbmRzLmluaXQpO1xuXG5jbGkucGFyc2UoKTtcbiIsICJ7XG4gIFwibmFtZVwiOiBcInd4dFwiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4xLjEtYWxwaGExXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJOZXh0IGdlbiBmcmFtZXdvcmsgZm9yIGRldmVsb3Bpbmcgd2ViIGV4dGVuc2lvbnNcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ha2xpbmtlcjEvd3h0XCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJ2aXRlXCIsXG4gICAgXCJjaHJvbWVcIixcbiAgICBcIndlYlwiLFxuICAgIFwiZXh0ZW5zaW9uXCIsXG4gICAgXCJicm93c2VyXCIsXG4gICAgXCJidW5kbGVyXCIsXG4gICAgXCJmcmFtZXdvcmtcIlxuICBdLFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJuYW1lXCI6IFwiQWFyb24gS2xpbmtlclwiLFxuICAgIFwiZW1haWxcIjogXCJhYXJvbmtsaW5rZXIxK3d4dEBnbWFpbC5jb21cIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJkaXN0XCJcbiAgXSxcbiAgXCJiaW5cIjogXCJkaXN0L2NsaS5janNcIixcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiXG4gICAgfSxcbiAgICBcIi4vY2xpZW50XCI6IHtcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9jbGllbnQuY2pzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9jbGllbnQuanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvY2xpZW50LmQudHNcIlxuICAgIH1cbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInd4dFwiOiBcInRzeCBzcmMvY2xpL2luZGV4LnRzXCIsXG4gICAgXCJidWlsZFwiOiBcInRzeCBzY3JpcHRzL2J1aWxkLnRzXCIsXG4gICAgXCJmb3JtYXRcIjogXCJwcmV0dGllciAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcInByZXR0aWVyIC0td3JpdGUgLlwiLFxuICAgIFwiY29tcGlsZVwiOiBcInRzYyAtLW5vRW1pdFwiLFxuICAgIFwidGVzdFwiOiBcInZpdGVzdFwiLFxuICAgIFwidGVzdDpjb3ZlcmFnZVwiOiBcInZpdGVzdCBydW4gLS1jb3ZlcmFnZVwiLFxuICAgIFwicHJlcGFyZVwiOiBcInNpbXBsZS1naXQtaG9va3NcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJwbnBtIC1zIGJ1aWxkXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHdlYmV4dC1jb3JlL21hdGNoLXBhdHRlcm5zXCI6IFwiXjEuMC4xXCIsXG4gICAgXCJhc3luYy1tdXRleFwiOiBcIl4wLjQuMFwiLFxuICAgIFwiYzEyXCI6IFwiXjEuNC4yXCIsXG4gICAgXCJjYWNcIjogXCJeNi43LjE0XCIsXG4gICAgXCJjb25zb2xhXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJmYXN0LWdsb2JcIjogXCJeMy4yLjEyXCIsXG4gICAgXCJmaWxlc2l6ZVwiOiBcIl4xMC4wLjdcIixcbiAgICBcImZzLWV4dHJhXCI6IFwiXjExLjEuMVwiLFxuICAgIFwiaml0aVwiOiBcIl4xLjE4LjJcIixcbiAgICBcImpzb241XCI6IFwiXjIuMi4zXCIsXG4gICAgXCJsaW5rZWRvbVwiOiBcIl4wLjE0LjI2XCIsXG4gICAgXCJwaWNvY29sb3JzXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJwaWNvbWF0Y2hcIjogXCJeMi4zLjFcIixcbiAgICBcInVuaW1wb3J0XCI6IFwiXjMuMC44XCIsXG4gICAgXCJ2aXRlXCI6IFwiXjQuMy45XCIsXG4gICAgXCJ3ZWItZXh0XCI6IFwiXjcuNi4yXCIsXG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGZha2VyLWpzL2Zha2VyXCI6IFwiXjguMC4yXCIsXG4gICAgXCJAdHlwZXMvZnMtZXh0cmFcIjogXCJeMTEuMC4xXCIsXG4gICAgXCJAdHlwZXMvbG9kYXNoLm1lcmdlXCI6IFwiXjQuNi43XCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIl4yMC4zLjFcIixcbiAgICBcIkB0eXBlcy9waWNvbWF0Y2hcIjogXCJeMi4zLjBcIixcbiAgICBcIkB0eXBlcy93ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCIsXG4gICAgXCJAdml0ZXN0L2NvdmVyYWdlLXY4XCI6IFwiXjAuMzIuMlwiLFxuICAgIFwibG9kYXNoLm1lcmdlXCI6IFwiXjQuNi4yXCIsXG4gICAgXCJucG0tcnVuLWFsbFwiOiBcIl40LjEuNVwiLFxuICAgIFwib3JhXCI6IFwiXjYuMy4xXCIsXG4gICAgXCJwcmV0dGllclwiOiBcIl4yLjguOFwiLFxuICAgIFwicHJldHR5LXF1aWNrXCI6IFwiXjMuMS4zXCIsXG4gICAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IFwiXjIuOC4xXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJ0c3hcIjogXCJeMy4xMi43XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMS4zXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMC4zMi40XCIsXG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIj49MC4xMC4wXCJcbiAgfSxcbiAgXCJwYWNrYWdlTWFuYWdlclwiOiBcInBucG1AOC42LjNcIixcbiAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IHtcbiAgICBcInByZS1jb21taXRcIjogXCJwbnBtIHByZXR0eS1xdWljayAtLXN0YWdlZFwiXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBFeHRlbnNpb25SdW5uZXJDb25maWcsXG4gIElubGluZUNvbmZpZyxcbiAgSW50ZXJuYWxDb25maWcsXG4gIFVzZXJDb25maWcsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwYXRoLCB7IHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IGltcG9ydFRzRmlsZSB9IGZyb20gJy4vaW1wb3J0VHNGaWxlJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IGNyZWF0ZUZzQ2FjaGUgfSBmcm9tICcuL2NyZWF0ZUZzQ2FjaGUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFscyB9IGZyb20gJy4vZ2xvYmFscyc7XG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSAnYzEyJztcblxuLyoqXG4gKiBHaXZlbiBhbiBpbmxpbmUgY29uZmlnLCBkaXNjb3ZlciB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LCBtZXJnZSB0aGUgcmVzdWx0cywgcmVzb2x2ZSBhbnlcbiAqIHJlbGF0aXZlIHBhdGhzLCBhbmQgYXBwbHkgYW55IGRlZmF1bHRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW50ZXJuYWxDb25maWcoXG4gIGNvbmZpZzogSW5saW5lQ29uZmlnLFxuICBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJyxcbik6IFByb21pc2U8SW50ZXJuYWxDb25maWc+IHtcbiAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gYSBiYXNlIGNvbmZpZ1xuICBjb25zdCByb290ID0gY29uZmlnLnJvb3QgPyBwYXRoLnJlc29sdmUoY29uZmlnLnJvb3QpIDogcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgbW9kZSA9XG4gICAgY29uZmlnLm1vZGUgPz8gKGNvbW1hbmQgPT09ICdidWlsZCcgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnKTtcbiAgY29uc3QgYnJvd3NlciA9IGNvbmZpZy5icm93c2VyID8/ICdjaHJvbWUnO1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPVxuICAgIGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPz8gKGJyb3dzZXIgPT0gJ2ZpcmVmb3gnID8gMiA6IDMpO1xuICBjb25zdCBvdXRCYXNlRGlyID0gcGF0aC5yZXNvbHZlKHJvb3QsICcub3V0cHV0Jyk7XG4gIGNvbnN0IG91dERpciA9IHBhdGgucmVzb2x2ZShvdXRCYXNlRGlyLCBgJHticm93c2VyfS1tdiR7bWFuaWZlc3RWZXJzaW9ufWApO1xuICBjb25zdCBsb2dnZXIgPSBjb25maWcubG9nZ2VyID8/IGNvbnNvbGE7XG5cbiAgY29uc3QgYmFzZUNvbmZpZzogSW50ZXJuYWxDb25maWdOb1VzZXJEaXJzID0ge1xuICAgIHJvb3QsXG4gICAgb3V0RGlyLFxuICAgIG91dEJhc2VEaXIsXG4gICAgc3RvcmVJZHM6IGNvbmZpZy5zdG9yZUlkcyA/PyB7fSxcbiAgICBicm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbixcbiAgICBtb2RlLFxuICAgIGNvbW1hbmQsXG4gICAgbG9nZ2VyLFxuICAgIHZpdGU6IGNvbmZpZy52aXRlID8/IHt9LFxuICAgIG1hbmlmZXN0OiBjb25maWcubWFuaWZlc3QgPz8ge30sXG4gICAgaW1wb3J0czogY29uZmlnLmltcG9ydHMgPz8ge30sXG4gICAgcnVubmVyQ29uZmlnOiBhd2FpdCBsb2FkQ29uZmlnPEV4dGVuc2lvblJ1bm5lckNvbmZpZz4oe1xuICAgICAgbmFtZTogJ3dlYi1leHQnLFxuICAgICAgY3dkOiByb290LFxuICAgICAgZ2xvYmFsUmM6IHRydWUsXG4gICAgICByY0ZpbGU6ICcud2ViZXh0cmMnLFxuICAgICAgb3ZlcnJpZGVzOiBjb25maWcucnVubmVyLFxuICAgIH0pLFxuICB9O1xuXG4gIC8vIExvYWQgdXNlciBjb25maWcgZnJvbSBmaWxlXG4gIGxldCB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnID0ge1xuICAgIG1vZGUsXG4gIH07XG4gIGlmIChjb25maWcuY29uZmlnRmlsZSAhPT0gZmFsc2UpIHtcbiAgICB1c2VyQ29uZmlnID0gYXdhaXQgaW1wb3J0VHNGaWxlPFVzZXJDb25maWc+KFxuICAgICAgcm9vdCxcbiAgICAgIHBhdGgucmVzb2x2ZShyb290LCBjb25maWcuY29uZmlnRmlsZSA/PyAnd3h0LmNvbmZpZy50cycpLFxuICAgICk7XG4gIH1cblxuICAvLyBNZXJnZSBpbmxpbmUgYW5kIHVzZXIgY29uZmlnc1xuICBjb25zdCBtZXJnZWQgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIGJhc2VDb25maWcsXG4gICAgdXNlckNvbmZpZyxcbiAgKSBhcyBJbnRlcm5hbENvbmZpZ05vVXNlckRpcnM7XG5cbiAgLy8gQXBwbHkgdXNlciBjb25maWcgYW5kIGNyZWF0ZSBmaW5hbCBjb25maWdcbiAgY29uc3Qgc3JjRGlyID0gdXNlckNvbmZpZy5zcmNEaXIgPyByZXNvbHZlKHJvb3QsIHVzZXJDb25maWcuc3JjRGlyKSA6IHJvb3Q7XG4gIGNvbnN0IGVudHJ5cG9pbnRzRGlyID0gcmVzb2x2ZShcbiAgICBzcmNEaXIsXG4gICAgdXNlckNvbmZpZy5lbnRyeXBvaW50c0RpciA/PyAnZW50cnlwb2ludHMnLFxuICApO1xuICBjb25zdCBwdWJsaWNEaXIgPSByZXNvbHZlKHNyY0RpciwgdXNlckNvbmZpZy5wdWJsaWNEaXIgPz8gJ3B1YmxpYycpO1xuICBjb25zdCB3eHREaXIgPSByZXNvbHZlKHNyY0RpciwgJy53eHQnKTtcbiAgY29uc3QgdHlwZXNEaXIgPSByZXNvbHZlKHd4dERpciwgJ3R5cGVzJyk7XG5cbiAgY29uc3QgZmluYWxDb25maWc6IEludGVybmFsQ29uZmlnID0ge1xuICAgIC4uLm1lcmdlZCxcbiAgICBzcmNEaXIsXG4gICAgZW50cnlwb2ludHNEaXIsXG4gICAgcHVibGljRGlyLFxuICAgIHd4dERpcjogd3h0RGlyLFxuICAgIHR5cGVzRGlyLFxuICAgIGZzQ2FjaGU6IGNyZWF0ZUZzQ2FjaGUod3h0RGlyKSxcbiAgfTtcblxuICAvLyBDdXN0b21pemUgdGhlIGRlZmF1bHQgdml0ZSBjb25maWdcbiAgZmluYWxDb25maWcudml0ZS5yb290ID0gcm9vdDtcbiAgZmluYWxDb25maWcudml0ZS5jb25maWdGaWxlID0gZmFsc2U7XG4gIGZpbmFsQ29uZmlnLnZpdGUubG9nTGV2ZWwgPSAnd2Fybic7XG5cbiAgZmluYWxDb25maWcudml0ZS5idWlsZCA/Pz0ge307XG4gIGZpbmFsQ29uZmlnLnZpdGUuYnVpbGQub3V0RGlyID0gb3V0RGlyO1xuICBmaW5hbENvbmZpZy52aXRlLmJ1aWxkLmVtcHR5T3V0RGlyID0gZmFsc2U7XG5cbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zID8/PSBbXTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kb3dubG9hZChmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRldkh0bWxQcmVyZW5kZXIoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy51bmltcG9ydChmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2JhY2tncm91bmQnLCBmaW5hbENvbmZpZyksXG4gICk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKFxuICAgIHBsdWdpbnMudmlydHVhbEVudHJ5cG9pbignY29udGVudC1zY3JpcHQnLCBmaW5hbENvbmZpZyksXG4gICk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZGV2U2VydmVyR2xvYmFscyhmaW5hbENvbmZpZykpO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUuZGVmaW5lID8/PSB7fTtcbiAgZ2V0R2xvYmFscyhmaW5hbENvbmZpZykuZm9yRWFjaCgoZ2xvYmFsKSA9PiB7XG4gICAgZmluYWxDb25maWcudml0ZS5kZWZpbmUhW2dsb2JhbC5uYW1lXSA9IEpTT04uc3RyaW5naWZ5KGdsb2JhbC52YWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBmaW5hbENvbmZpZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3IgZGVmaW5pbmcgYSBiYXNlIGNvbmZpZywgc2luY2UgdXNlci1jb25maWd1cmFibGUgZGlyZWN0b3JpZXMgbXVzdCBiZSBzZXQgYWZ0ZXJcbiAqIHJlYWRpbmcgaW4gdGhlIHVzZXIgY29uZmlnLlxuICovXG50eXBlIEludGVybmFsQ29uZmlnTm9Vc2VyRGlycyA9IE9taXQ8XG4gIEludGVybmFsQ29uZmlnLFxuICAnc3JjRGlyJyB8ICdwdWJsaWNEaXInIHwgJ2VudHJ5cG9pbnRzRGlyJyB8ICd3eHREaXInIHwgJ3R5cGVzRGlyJyB8ICdmc0NhY2hlJ1xuPjtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgY3JlYXRlSklUSSBmcm9tICdqaXRpJztcbmltcG9ydCB0cmFuc2Zvcm0gZnJvbSAnaml0aS9kaXN0L2JhYmVsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFRzRmlsZTxUPihyb290OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHt9KTtcbiAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRmlsZShcbiAgICByZXNvbHZlKHJvb3QsICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvY2xpZW50LmpzJyksXG4gICk7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgdW5pbXBvcnQuaW5qZWN0SW1wb3J0cyh0ZXh0LCBwYXRoKTtcbiAgY29uc3QgdHJhbnNmb3JtZWRUZXh0ID0gcmVzLmNvZGU7XG5cbiAgY29uc3Qgaml0aSA9IGNyZWF0ZUpJVEkoX19maWxlbmFtZSwge1xuICAgIGNhY2hlOiBmYWxzZSxcbiAgICBlc21SZXNvbHZlOiB0cnVlLFxuICAgIGludGVyb3BEZWZhdWx0OiB0cnVlLFxuICAgIGFsaWFzOiB7XG4gICAgICAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJzogJ3d4dCcsXG4gICAgfSxcblxuICAgIHRyYW5zZm9ybShvcHRzKSB7XG4gICAgICBpZiAob3B0cy5maWxlbmFtZSA9PT0gcGF0aCkgb3B0cy5zb3VyY2UgPSB0cmFuc2Zvcm1lZFRleHQ7XG5cbiAgICAgIC8vIFJlbW92ZSBDU1MgaW1wb3J0cyBmcm9tIHRoZSBzb3VyY2UgY29kZSAtIEppdGkgY2FuJ3QgaGFuZGxlIHRoZW0uXG4gICAgICBvcHRzLnNvdXJjZSA9IG9wdHMuc291cmNlLnJlcGxhY2UoL15pbXBvcnQgWydcIl0uKlxcLmNzc1snXCJdOz8kL2dtLCAnJyk7XG5cbiAgICAgIC8vIENhbGwgdGhlIGRlZmF1bHQgYmFiZWwgdHJhbnNmb3JtZXIgd2l0aCBvdXIgbW9kaWZpZWQgc291cmNlIGNvZGVcbiAgICAgIHJldHVybiB0cmFuc2Zvcm0ob3B0cyk7XG4gICAgfSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGppdGkocGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGEuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgZmlsZTogJHtwYXRofWApO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgcGFyc2VIVE1MIH0gZnJvbSAnbGlua2Vkb20nO1xuaW1wb3J0IHsgZGlybmFtZSwgaXNBYnNvbHV0ZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBQcmUtcmVuZGVycyB0aGUgSFRNTCBlbnRyeXBvaW50cyB3aGVuIGJ1aWxkaW5nIHRoZSBleHRlbnNpb24gdG8gY29ubmVjdCB0byB0aGUgZGV2IHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldkh0bWxQcmVyZW5kZXIoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBuYW1lOiAnd3h0OmRldi1odG1sLXByZXJlbmRlcicsXG4gICAgY29uZmlnKHVzZXJDb25maWcpIHtcbiAgICAgIHJldHVybiB2aXRlLm1lcmdlQ29uZmlnKFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICAgJ0B3eHQvcmVsb2FkLWh0bWwnOiByZXNvbHZlKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL3JlbG9hZC1odG1sLmpzJyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckNvbmZpZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oaHRtbCwgaWQpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IGNvbmZpZy5zZXJ2ZXI7XG4gICAgICBpZiAoY29uZmlnLmNvbW1hbmQgIT09ICdzZXJ2ZScgfHwgc2VydmVyID09IG51bGwgfHwgIWlkLmVuZHNXaXRoKCcuaHRtbCcpKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gYCR7c2VydmVyLm9yaWdpbn0ke2lkfWA7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBpZCk7XG4gICAgICBjb25zdCB1cmwgPSBgJHtzZXJ2ZXIub3JpZ2lufS8ke25hbWV9Lmh0bWxgO1xuICAgICAgY29uc3Qgc2VydmVySHRtbCA9IGF3YWl0IHNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwoXG4gICAgICAgIHVybCxcbiAgICAgICAgaHRtbCxcbiAgICAgICAgb3JpZ2luYWxVcmwsXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKHNlcnZlckh0bWwpO1xuXG4gICAgICBjb25zdCBwb2ludFRvRGV2U2VydmVyID0gKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgIGlmICghc3JjKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShzcmMpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBzZXJ2ZXIub3JpZ2luICsgc3JjKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNyYy5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHJlc29sdmUoZGlybmFtZShpZCksIHNyYyk7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHJlbGF0aXZlKGNvbmZpZy5yb290LCBhYnMpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgYCR7c2VydmVyLm9yaWdpbn0vJHtwYXRobmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ3NjcmlwdFt0eXBlPW1vZHVsZV0nLCAnc3JjJyk7XG4gICAgICBwb2ludFRvRGV2U2VydmVyKCdsaW5rW3JlbD1zdHlsZXNoZWV0XScsICdocmVmJyk7XG5cbiAgICAgIC8vIEFkZCBhIHNjcmlwdCB0byBhZGQgcGFnZSByZWxvYWRpbmdcbiAgICAgIGNvbnN0IHJlbG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICByZWxvYWRlci5zcmMgPSAnQHd4dC9yZWxvYWQtaHRtbCc7XG4gICAgICByZWxvYWRlci50eXBlID0gJ21vZHVsZSc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlbG9hZGVyKTtcblxuICAgICAgY29uc3QgbmV3SHRtbCA9IGRvY3VtZW50LnRvU3RyaW5nKCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdUcmFuc2Zvcm1lZCAnICsgaWQpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnT2xkIEhUTUw6XFxuJyArIGh0bWwpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTmV3IEhUTUw6XFxuJyArIG5ld0h0bWwpO1xuICAgICAgcmV0dXJuIG5ld0h0bWw7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGgsIHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE5hbWUoXG4gIGVudHJ5cG9pbnRzRGlyOiBzdHJpbmcsXG4gIGlucHV0UGF0aDogc3RyaW5nLFxuICAvLyB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGVudHJ5cG9pbnRzRGlyLCBpbnB1dFBhdGgpO1xuICAvLyBHcmFiIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IC4gb3IgL1xuICBjb25zdCBuYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KC9bXFwuXFwvXS8sIDIpWzBdO1xuXG4gIHJldHVybiBuYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmUoZW50cnlwb2ludC5vdXRwdXREaXIsIGAke2VudHJ5cG9pbnQubmFtZX0ke2V4dH1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4ncyB0aGUgZW50cnlwb2ludCdzIG91dHB1dCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBVc2VkIGZvciBwYXRocyBpbiB0aGVcbiAqIG1hbmlmZXN0IGFuZCByb2xsdXAncyBidW5kbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgZW50cnlwb2ludDogRW50cnlwb2ludCxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbGF0aXZlKG91dERpciwgZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoZW50cnlwb2ludCwgZXh0KSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBEZWZpbmVzIGdsb2JhbCBjb25zdGFudHMgYWJvdXQgdGhlIGRldiBzZXJ2ZXIuIEhlbHBzIHNjcmlwdHMgY29ubmVjdCB0byB0aGUgc2VydmVyJ3Mgd2ViIHNvY2tldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldlNlcnZlckdsb2JhbHMoaW50ZXJuYWxDb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmRldi1zZXJ2ZXItZ2xvYmFscycsXG4gICAgY29uZmlnKGNvbmZpZykge1xuICAgICAgaWYgKGludGVybmFsQ29uZmlnLnNlcnZlciA9PSBudWxsIHx8IGludGVybmFsQ29uZmlnLmNvbW1hbmQgPT0gJ2J1aWxkJylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25maWcuZGVmaW5lID8/PSB7fTtcbiAgICAgIGNvbmZpZy5kZWZpbmUuX19ERVZfU0VSVkVSX1BST1RPQ09MX18gPSBKU09OLnN0cmluZ2lmeSgnd3M6Jyk7XG4gICAgICBjb25maWcuZGVmaW5lLl9fREVWX1NFUlZFUl9IT1NUTkFNRV9fID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGludGVybmFsQ29uZmlnLnNlcnZlci5ob3N0bmFtZSxcbiAgICAgICk7XG4gICAgICBjb25maWcuZGVmaW5lLl9fREVWX1NFUlZFUl9QT1JUX18gPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgaW50ZXJuYWxDb25maWcuc2VydmVyLnBvcnQsXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IGRucyBmcm9tICdub2RlOmRucyc7XG5pbXBvcnQgeyB3aXRoVGltZW91dCB9IGZyb20gJy4vcHJvbWlzZXMnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGlzT2ZmbGluZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgaXNPZmZsaW5lID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlcykgPT4ge1xuICAgIGRucy5yZXNvbHZlKCdnb29nbGUuY29tJywgKGVycikgPT4ge1xuICAgICAgaWYgKGVyciA9PSBudWxsKSB7XG4gICAgICAgIHJlcyhmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXModHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gd2l0aFRpbWVvdXQoaXNPZmZsaW5lLCAxZTMpLmNhdGNoKCgpID0+IHRydWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNPbmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG9mZmxpbmUgPSBhd2FpdCBpc09mZmxpbmUoKTtcbiAgcmV0dXJuICFvZmZsaW5lO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSBVUkwgd2l0aCBhIHNpbXBsZSBHRVQgcmVxdWVzdC4gR3JhYnMgaXQgZnJvbSBjYWNoZSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBvciB0aHJvd3MgYW5cbiAqIGVycm9yIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkIHZpYSB0aGUgbmV0d29yayBvciBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2FjaGVkKFxuICB1cmw6IHN0cmluZyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmcgPSAnJztcblxuICBpZiAoYXdhaXQgaXNPbmxpbmUoKSkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgYXdhaXQgY29uZmlnLmZzQ2FjaGUuc2V0KHVybCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgXCIke3VybH1cIiwgZmFsbGluZyBiYWNrIHRvIGNhY2hlLi4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250ZW50KSBjb250ZW50ID0gKGF3YWl0IGNvbmZpZy5mc0NhY2hlLmdldCh1cmwpKSA/PyAnJztcbiAgaWYgKCFjb250ZW50KVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYE9mZmxpbmUgYW5kIFwiJHt1cmx9XCIgaGFzIG5vdCBiZWVuIGNhY2hlZC4gVHJ5IGFnYWluIHdoZW4gb25saW5lLmAsXG4gICAgKTtcblxuICByZXR1cm4gY29udGVudDtcbn1cbiIsICIvKipcbiAqIEFkZCBhIHRpbWVvdXQgdG8gYSBwcm9taXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlaihgUHJvbWlzZSB0aW1lZCBvdXQgYWZ0ZXIgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgICBwcm9taXNlXG4gICAgICAudGhlbihyZXMpXG4gICAgICAuY2F0Y2gocmVqKVxuICAgICAgLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgRG9uJ3QgdXNlIGluIHByb2R1Y3Rpb24sIGp1c3QgZm9yIHRlc3RpbmcgYW5kIHNsb3dpbmcgdGhpbmdzIGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzKSA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hDYWNoZWQgfSBmcm9tICcuLi91dGlscy9uZXR3b3JrJztcblxuLyoqXG4gKiBEb3dubG9hZHMgYW55IFVSTCBpbXBvcnRzLCBsaWtlIEdvb2dsZSBBbmFseXRpY3MsIGludG8gdmlydHVhbCBtb2R1bGVzIHNvIHRoZXkgYXJlIGJ1bmRsZWQgd2l0aFxuICogdGhlIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiByZW1vdGUgY29kZSBhdCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgXCJ1cmw6aHR0cHM6Ly9nb29nbGUtdGFnbWFuYWdlci5jb20vZ3RhZz9pZD1YWVpcIjtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZG93bmxvYWQnLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoJ3VybDonKSkgcmV0dXJuICdcXDAnICsgaWQ7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgoJ1xcMHVybDonKSkgcmV0dXJuO1xuXG4gICAgICAvLyBMb2FkIGZpbGUgZnJvbSBuZXR3b3JrIG9yIGNhY2hlXG4gICAgICBjb25zdCB1cmwgPSBpZC5yZXBsYWNlKCdcXDB1cmw6JywgJycpO1xuICAgICAgcmV0dXJuIGF3YWl0IGZldGNoQ2FjaGVkKHVybCwgY29uZmlnKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhlIEhUTUwgZmlsZXMgb3V0cHV0IGJ5IGEgbXVsdGlwYWdlIGJ1aWxkIGFyZSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4gVGhpcyBkb2VzIHR3b1xuICogdGhpbmdzOlxuICpcbiAqIDEuIE1vdmVzIHRoZSBITVRMIGZpbGVzIHRvIHRoZWlyIGZpbmFsIGxvY2F0aW9uIGF0IGA8b3V0RGlyPi88ZW50cnlwb2ludC5uYW1lPi5odG1sYC5cbiAqIDIuIFVwZGF0ZXMgdGhlIGJ1bmRsZSBzbyBpdCBzdW1tYXJpemVzIHRoZSBmaWxlcyBjb3JyZWN0bHkgaW4gdGhlIHJldHVybmVkIGJ1aWxkIG91dHB1dC5cbiAqXG4gKiBBc3NldHMgKEpTIGFuZCBDU1MpIGFyZSBvdXRwdXQgdG8gdGhlIGA8b3V0RGlyPi9hc3NldHNgIGRpcmVjdG9yeSwgYW5kIGRvbid0IG5lZWQgdG8gYmUgbW9kaWZpZWQuXG4gKiBIVE1MIGZpbGVzIGFjY2VzcyB0aGVtIHZpYSBhYnNvbHV0ZSBVUkxzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSBhbnkgaW1wb3J0IHBhdGhzIGluIHRoZSBIVE1MXG4gKiBmaWxlcyBlaXRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBhZ2VNb3ZlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6bXVsdGlwYWdlLW1vdmUnLFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgZm9yIChjb25zdCBvbGRCdW5kbGVQYXRoIGluIGJ1bmRsZSkge1xuICAgICAgICAvLyBvbGRCdW5kbGVQYXRoID0gJ2VudHJ5cG9pbnRzL3BvcHVwLmh0bWwnIG9yICdlbnRyeXBvaW50cy9vIHB0aW9ucy9pbmRleC5odG1sJ1xuXG4gICAgICAgIC8vIEZpbmQgYSBtYXRjaGluZyBlbnRyeXBvaW50IC0gb2xkQnVuZGxlUGF0aCBpcyB0aGUgc2FtZSBhcyBlbmQgZW5kIG9mIHRoZSBpbnB1dCBwYXRoLlxuICAgICAgICBjb25zdCBlbnRyeXBvaW50ID0gZW50cnlwb2ludHMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+ICEhZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKG9sZEJ1bmRsZVBhdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZW50cnlwb2ludCA9PSBudWxsKSB7XG4gICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTm8gZW50cnlwb2ludCBmb3VuZCBmb3InLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmV3IGJ1bmRsZSBwYXRoXG4gICAgICAgIGNvbnN0IG5ld0J1bmRsZVBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgZXh0bmFtZShvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0J1bmRsZVBhdGggPT09IG9sZEJ1bmRsZVBhdGgpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgJ0hUTUwgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uJyxcbiAgICAgICAgICAgIG9sZEJ1bmRsZVBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgZmlsZSBhbmQgdXBkYXRlIGJ1bmRsZVxuICAgICAgICAvLyBEbyB0aGlzIGluc2lkZSBhIG11dGV4IGxvY2sgc28gaXQgb25seSBydW5zIG9uZSBhdCBhIHRpbWUgZm9yIGNvbmN1cnJlbnQgbXVsdGlwYWdlIGJ1aWxkc1xuICAgICAgICBjb25zdCBvbGRBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3QWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgbmV3QnVuZGxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5ld0Fic1BhdGgpKTtcbiAgICAgICAgYXdhaXQgZnMubW92ZShvbGRBYnNQYXRoLCBuZXdBYnNQYXRoLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCByZW5hbWVkQ2h1bmsgPSB7XG4gICAgICAgICAgLi4uYnVuZGxlW29sZEJ1bmRsZVBhdGhdLFxuICAgICAgICAgIGZpbGVOYW1lOiBuZXdCdW5kbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgYnVuZGxlW29sZEJ1bmRsZVBhdGhdO1xuICAgICAgICBidW5kbGVbbmV3QnVuZGxlUGF0aF0gPSByZW5hbWVkQ2h1bms7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuXG4vKipcbiAqIEluamVjdCBhbnkgZ2xvYmFsIGltcG9ydHMgZGVmaW5lZCBieSB1bmltcG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pbXBvcnQoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChvcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6dW5pbXBvcnQnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICByZXR1cm4gdW5pbXBvcnQuaW5qZWN0SW1wb3J0cyhjb2RlLCBpZCk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBVbmltcG9ydE9wdGlvbnMgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmltcG9ydE9wdGlvbnMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQYXJ0aWFsPFVuaW1wb3J0T3B0aW9ucz4ge1xuICBjb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+ID0ge1xuICAgIGRlYnVnTG9nOiBjb25maWcubG9nZ2VyLmRlYnVnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgIHsgbmFtZTogJyonLCBhczogJ2Jyb3dzZXInLCBmcm9tOiAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJyB9LFxuICAgICAgeyBuYW1lOiAnZGVmaW5lQ29uZmlnJywgZnJvbTogJ3d4dCcgfSxcbiAgICBdLFxuICAgIHByZXNldHM6IFt7IHBhY2thZ2U6ICd3eHQvY2xpZW50JyB9XSxcbiAgICB3YXJuOiBjb25maWcubG9nZ2VyLndhcm4sXG4gICAgZGlyczogWydjb21wb25lbnRzJywgJ2NvbXBvc2FibGVzJywgJ2hvb2tzJywgJ3V0aWxzJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBXcmFwcyBhIHVzZXIncyBlbnRyeXBvaW50IHdpdGggYSB2aXR1YWwgdmVyc2lvbiB3aXRoIGFkZGl0aW9uYWwgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXJ0dWFsRW50cnlwb2luKFxuICB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQbHVnaW4ge1xuICBjb25zdCB2aXJ0dWFsSWQgPSBgdmlydHVhbDp3eHQtJHt0eXBlfT9gO1xuICBjb25zdCByZXNvbHZlZFZpcnR1YWxJZCA9IGBcXDAke3ZpcnR1YWxJZH1gO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogYHd4dDp2aXJ0dWFsLWVudHJ5cG9pbnRgLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgLy8gSWQgZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCwgaXQgbG9va3MgbGlrZSB0aGlzOlxuICAgICAgLy8gL3BhdGgvdG8vcHJvamVjdC92aXJ0dWFsOmJhY2tncm91bmQ/L3BhdGgvdG8vcHJvamVjdC9lbnRyeXBvaW50cy9iYWNrZ3JvdW5kLnRzXG4gICAgICBjb25zdCBpbmRleCA9IGlkLmluZGV4T2YodmlydHVhbElkKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRWaXJ0dWFsSWQgKyBpbnB1dFBhdGg7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgocmVzb2x2ZWRWaXJ0dWFsSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IGlkLnJlcGxhY2UocmVzb2x2ZWRWaXJ0dWFsSWQsICcnKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgIHJlc29sdmUoXG4gICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgYG5vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvJHt0eXBlfS1lbnRyeXBvaW50LmpzYCxcbiAgICAgICAgKSxcbiAgICAgICAgJ3V0Zi04JyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShgdmlydHVhbDp1c2VyLSR7dHlwZX1gLCBpbnB1dFBhdGgpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEZzQ2FjaGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbi8qKlxuICogQSBiYXNpYyBmaWxlIHN5c3RlbSBjYWNoZSBzdG9yZWQgYXQgYDxzcmNEaXI+Ly53eHQvY2FjaGUvPGtleT5gLiBKdXN0IGNhY2hlcyBhIHN0cmluZyBpbiBhXG4gKiBmaWxlIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSBzcmNEaXIgQWJzb2x1dGUgcGF0aCB0byBzb3VyY2UgZGlyZWN0b3J5LiBTZWUgYEludGVybmFsQ29uZmlnLnNyY0RpcmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZzQ2FjaGUod3h0RGlyOiBzdHJpbmcpOiBGc0NhY2hlIHtcbiAgY29uc3QgZ2V0UGF0aCA9IChrZXk6IHN0cmluZykgPT5cbiAgICByZXNvbHZlKHd4dERpciwgJ2NhY2hlJywgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUocGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIHZhbHVlLCAndXRmLTgnKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbHMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueTsgdHlwZTogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBuYW1lOiAnX19NQU5JRkVTVF9WRVJTSU9OX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgICB0eXBlOiBgMiB8IDNgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fQlJPV1NFUl9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlcixcbiAgICAgIHR5cGU6IGBcImNocm9taXVtXCIgfCBcImZpcmVmb3hcImAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19DSFJPTUVfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdjaHJvbWUnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRklSRUZPWF9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfU0FGQVJJX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnc2FmYXJpJyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0VER0VfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdlZGdlJyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX09QRVJBX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnb3BlcmEnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fQ09NTUFORF9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuY29tbWFuZCxcbiAgICAgIHR5cGU6IGBcImJ1aWxkXCIgfCBcInNlcnZlXCJgLFxuICAgIH0sXG4gIF07XG59XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIFd4dERldlNlcnZlciwgSW5saW5lQ29uZmlnIH0gZnJvbSAnLi9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBkZXRlY3REZXZDaGFuZ2VzIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2RldGVjdERldkNoYW5nZXMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICdhc3luYy1tdXRleCc7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZSB9IGZyb20gJy4vY29yZS91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBidWlsZEludGVybmFsLCByZWJ1aWxkIH0gZnJvbSAnLi9jb3JlL2J1aWxkJztcbmltcG9ydCB7XG4gIGdldFNlcnZlckluZm8sXG4gIHJlbG9hZENvbnRlbnRTY3JpcHRzLFxuICByZWxvYWRIdG1sUGFnZXMsXG4gIHNldHVwU2VydmVyLFxufSBmcm9tICcuL2NvcmUvc2VydmVyJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdHlwZXMvZXh0ZXJuYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3V0aWxzL2RlZmluZUNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lUnVubmVyQ29uZmlnJztcblxuLyoqXG4gKiBCdW5kbGVzIHRoZSBleHRlbnNpb24gZm9yIHByb2R1Y3Rpb24uIFJldHVybnMgYSBwcm9taXNlIG9mIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IElubGluZUNvbmZpZyk6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgaW50ZXJuYWxDb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjb25maWcsICdidWlsZCcpO1xuICByZXR1cm4gYXdhaXQgYnVpbGRJbnRlcm5hbChpbnRlcm5hbENvbmZpZyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2ZXIoXG4gIGNvbmZpZz86IElubGluZUNvbmZpZyxcbik6IFByb21pc2U8V3h0RGV2U2VydmVyPiB7XG4gIGNvbnN0IHNlcnZlckluZm8gPSBhd2FpdCBnZXRTZXJ2ZXJJbmZvKCk7XG5cbiAgY29uc3QgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcgPSAoKSA9PiB7XG4gICAgY29uc3Qgdml0ZUNvbmZpZzogdml0ZS5JbmxpbmVDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgICAgc2VydmVySW5mby52aXRlU2VydmVyQ29uZmlnLFxuICAgICAgY29uZmlnPy52aXRlID8/IHt9LFxuICAgICk7XG4gICAgcmV0dXJuIGdldEludGVybmFsQ29uZmlnKHsgLi4uY29uZmlnLCB2aXRlOiB2aXRlQ29uZmlnIH0sICdzZXJ2ZScpO1xuICB9O1xuXG4gIGxldCBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gIGNvbnN0IHNlcnZlciA9IGF3YWl0IHNldHVwU2VydmVyKHNlcnZlckluZm8sIGludGVybmFsQ29uZmlnKTtcbiAgaW50ZXJuYWxDb25maWcuc2VydmVyID0gc2VydmVyO1xuXG4gIGNvbnN0IGZpbGVDaGFuZ2VkTXV0ZXggPSBuZXcgTXV0ZXgoKTtcbiAgY29uc3QgY2hhbmdlUXVldWU6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG5cbiAgc2VydmVyLndzLm9uKCd3eHQ6YmFja2dyb3VuZC1pbml0aWFsaXplZCcsICgpID0+IHtcbiAgICAvLyBSZWdpc3RlciBjb250ZW50IHNjcmlwdHMgZm9yIHRoZSBmaXJzdCB0aW1lIHNpbmNlIHRoZXkncmUgbm90IGxpc3RlZCBpbiB0aGUgbWFuaWZlc3RcbiAgICByZWxvYWRDb250ZW50U2NyaXB0cyhzZXJ2ZXIuY3VycmVudE91dHB1dC5zdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gIH0pO1xuXG4gIHNlcnZlci53YXRjaGVyLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQsIHBhdGgsIF9zdGF0cykgPT4ge1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoaW50ZXJuYWxDb25maWcub3V0QmFzZURpcikpIHJldHVybjtcbiAgICBjaGFuZ2VRdWV1ZS5wdXNoKFtldmVudCwgcGF0aF0pO1xuXG4gICAgYXdhaXQgZmlsZUNoYW5nZWRNdXRleC5ydW5FeGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZUNoYW5nZXMgPSBjaGFuZ2VRdWV1ZS5zcGxpY2UoMCwgY2hhbmdlUXVldWUubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBkZXRlY3REZXZDaGFuZ2VzKGZpbGVDaGFuZ2VzLCBzZXJ2ZXIuY3VycmVudE91dHB1dCk7XG5cbiAgICAgIGlmIChjaGFuZ2VzLnR5cGUgPT09ICduby1jaGFuZ2UnKSByZXR1cm47XG5cbiAgICAgIC8vIExvZyB0aGUgZW50cnlwb2ludHMgdGhhdCB3ZXJlIGVmZmVjdGVkXG4gICAgICBjb25zb2xhLmluZm8oXG4gICAgICAgIGBDaGFuZ2VkOiAke0FycmF5LmZyb20obmV3IFNldChmaWxlQ2hhbmdlcy5tYXAoKGNoYW5nZSkgPT4gY2hhbmdlWzFdKSkpXG4gICAgICAgICAgLm1hcCgoZmlsZSkgPT4gcGMuZGltKHJlbGF0aXZlKGludGVybmFsQ29uZmlnLnJvb3QsIGZpbGUpKSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlYnVpbHROYW1lcyA9IGNoYW5nZXMucmVidWlsZEdyb3Vwc1xuICAgICAgICAuZmxhdCgpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBjLmN5YW4oXG4gICAgICAgICAgICByZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5vdXREaXIsIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlKGVudHJ5LCAnJykpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKHBjLmRpbSgnLCAnKSk7XG5cbiAgICAgIC8vIEdldCBsYXRlc3QgY29uZmlnIGFuZCBSZWJ1aWxkIGdyb3VwcyB3aXRoIGNoYW5nZXNcbiAgICAgIGludGVybmFsQ29uZmlnID0gYXdhaXQgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcoKTtcbiAgICAgIGludGVybmFsQ29uZmlnLnNlcnZlciA9IHNlcnZlcjtcbiAgICAgIGNvbnN0IHsgb3V0cHV0OiBuZXdPdXRwdXQgfSA9IGF3YWl0IHJlYnVpbGQoXG4gICAgICAgIGludGVybmFsQ29uZmlnLFxuICAgICAgICAvLyBUT0RPOiB0aGlzIGV4Y2x1ZGVzIG5ldyBlbnRyeXBvaW50cywgc28gdGhleSdyZSBub3QgYnVpbHQgdW50aWwgdGhlIGRldiBjb21tYW5kIGlzIHJlc3RhcnRlZFxuICAgICAgICBjaGFuZ2VzLnJlYnVpbGRHcm91cHMsXG4gICAgICAgIGNoYW5nZXMuY2FjaGVkT3V0cHV0LFxuICAgICAgKTtcbiAgICAgIHNlcnZlci5jdXJyZW50T3V0cHV0ID0gbmV3T3V0cHV0O1xuXG4gICAgICAvLyBQZXJmb3JtIHJlbG9hZHNcbiAgICAgIHN3aXRjaCAoY2hhbmdlcy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2V4dGVuc2lvbi1yZWxvYWQnOlxuICAgICAgICAgIHNlcnZlci5yZWxvYWRFeHRlbnNpb24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHRtbC1yZWxvYWQnOlxuICAgICAgICAgIHJlbG9hZEh0bWxQYWdlcyhjaGFuZ2VzLnJlYnVpbGRHcm91cHMsIHNlcnZlciwgaW50ZXJuYWxDb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb250ZW50LXNjcmlwdC1yZWxvYWQnOlxuICAgICAgICAgIHJlbG9hZENvbnRlbnRTY3JpcHRzKGNoYW5nZXMuY2hhbmdlZFN0ZXBzLCBpbnRlcm5hbENvbmZpZywgc2VydmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGEuc3VjY2VzcyhgUmVsb2FkZWQ6ICR7cmVidWlsdE5hbWVzfWApO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBhbGwgZWxlbWVudHMgb2YgdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oXG4gIGFycmF5OiBUW10sXG4gIHByZWRpY2F0ZTogKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpXSwgaSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIEJ1aWxkU3RlcE91dHB1dCwgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGV2ZXJ5IH0gZnJvbSAnLi9hcnJheXMnO1xuXG4vKipcbiAqIENvbXBhcmUgdGhlIGNoYW5nZWQgZmlsZXMgdnMgdGhlIGJ1aWxkIG91dHB1dCBhbmQgZGV0ZXJtaW5lIHdoYXQga2luZCBvZiByZWxvYWQgbmVlZHMgdG8gaGFwcGVuOlxuICpcbiAqIC0gRG8gbm90aGluZ1xuICogICAtIENTUyBvciBKUyBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBIVE1MIHBhZ2UgaXMgY2hhbmdlZCAtIHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZVxuICogICAgIGRldiBzZXJ2ZXJcbiAqICAgLSBDaGFuZ2UgaXNuJ3QgdXNlZCBieSBhbnkgb2YgdGhlIGVudHJ5cG9pbnRzXG4gKiAtIFJlbG9hZCBDb250ZW50IHNjcmlwdFxuICogICAtIENTUyBvciBKUyBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgc2NyaXB0XG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgd2lsbCBiZSB0b2xkIHRvIHJlbG9hZCB0aGUgY29udGVudCBzY3JpcHRcbiAqIC0gUmVsb2FkIEhUTUwgZmlsZVxuICogICAtIEhUTUwgZmlsZSBpdHNlbGYgaXMgc2F2ZWQgLSBITVIgZG9lc24ndCBoYW5kbGUgdGhpcyBiZWNhdXNlIHRoZSBIVE1MIHBhZ2VzIGFyZSBwcmUtcmVuZGVyZWRcbiAqICAgLSBDaHJvbWUgaXMgT0sgcmVsb2FkaW5nIHRoZSBwYWdlIHdoZW4gdGhlIEhUTUwgZmlsZSBpcyBjaGFuZ2VkIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSB3aG9sZVxuICogICAgIGV4dGVuc2lvbi4gTm90IHN1cmUgYWJvdXQgZmlyZWZveCwgdGhpcyBtaWdodCBuZWVkIHRvIGNoYW5nZSB0byBhbiBleHRlbnNpb24gcmVsb2FkXG4gKiAtIFJlbG9hZCBleHRlbnNpb25cbiAqICAgLSBCYWNrZ3JvdW5kIHNjcmlwdCBpcyBjaGFuZ2VkXG4gKiAgIC0gTWFuaWZlc3QgaXMgZGlmZmVyZW50XG4gKiAtIFJlc3RhcnQgYnJvd3NlclxuICogICAtIENvbmZpZyBmaWxlIGNoYW5nZWQgKHd4dC5jb25maWcudHMsIC5lbnYsIHdlYi1leHQuY29uZmlnLnRzLCBldGMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REZXZDaGFuZ2VzKFxuICBjaGFuZ2VkRmlsZXM6IFtldmVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmddW10sXG4gIGN1cnJlbnRPdXRwdXQ6IEJ1aWxkT3V0cHV0IHwgdW5kZWZpbmVkLFxuKTogRGV2TW9kZUNoYW5nZSB7XG4gIGlmIChjdXJyZW50T3V0cHV0ID09IG51bGwpIHJldHVybiB7IHR5cGU6ICduby1jaGFuZ2UnIH07XG5cbiAgY29uc3QgY2hhbmdlZFN0ZXBzID0gbmV3IFNldChcbiAgICBjaGFuZ2VkRmlsZXMuZmxhdE1hcCgoY2hhbmdlZEZpbGUpID0+XG4gICAgICBmaW5kRWZmZWN0ZWRTdGVwcyhjaGFuZ2VkRmlsZSwgY3VycmVudE91dHB1dCksXG4gICAgKSxcbiAgKTtcbiAgaWYgKGNoYW5nZWRTdGVwcy5zaXplID09PSAwKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IHVuY2hhbmdlZE91dHB1dDogQnVpbGRPdXRwdXQgPSB7XG4gICAgbWFuaWZlc3Q6IGN1cnJlbnRPdXRwdXQubWFuaWZlc3QsXG4gICAgc3RlcHM6IFtdLFxuICAgIHB1YmxpY0Fzc2V0czogW10sXG4gIH07XG4gIGNvbnN0IGNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjdXJyZW50T3V0cHV0LnN0ZXBzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoc3RlcCkpIHtcbiAgICAgIGNoYW5nZWRPdXRwdXQuc3RlcHMucHVzaChzdGVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgYXNzZXQgb2YgY3VycmVudE91dHB1dC5wdWJsaWNBc3NldHMpIHtcbiAgICBpZiAoY2hhbmdlZFN0ZXBzLmhhcyhhc3NldCkpIHtcbiAgICAgIGNoYW5nZWRPdXRwdXQucHVibGljQXNzZXRzLnB1c2goYXNzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmNoYW5nZWRPdXRwdXQucHVibGljQXNzZXRzLnB1c2goYXNzZXQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzT25seUh0bWxDaGFuZ2VzID1cbiAgICBjaGFuZ2VkRmlsZXMubGVuZ3RoID4gMCAmJlxuICAgIGV2ZXJ5KGNoYW5nZWRGaWxlcywgKFtfLCBmaWxlXSkgPT4gZmlsZS5lbmRzV2l0aCgnLmh0bWwnKSk7XG4gIGlmIChpc09ubHlIdG1sQ2hhbmdlcykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnaHRtbC1yZWxvYWQnLFxuICAgICAgY2FjaGVkT3V0cHV0OiB1bmNoYW5nZWRPdXRwdXQsXG4gICAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGlzT25seUNvbnRlbnRTY3JpcHRzID1cbiAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShcbiAgICAgIGNoYW5nZWRPdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gICAgICAoZW50cnkpID0+IGVudHJ5LnR5cGUgPT09ICdjb250ZW50LXNjcmlwdCcsXG4gICAgKTtcbiAgaWYgKGlzT25seUNvbnRlbnRTY3JpcHRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnLFxuICAgICAgY2FjaGVkT3V0cHV0OiB1bmNoYW5nZWRPdXRwdXQsXG4gICAgICBjaGFuZ2VkU3RlcHM6IGNoYW5nZWRPdXRwdXQuc3RlcHMsXG4gICAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnLFxuICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgIHJlYnVpbGRHcm91cHM6IGNoYW5nZWRPdXRwdXQuc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLmVudHJ5cG9pbnRzKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGb3IgYSBzaW5nbGUgY2hhbmdlLCByZXR1cm4gYWxsIHRoZSBzdGVwIG9mIHRoZSBidWlsZCBvdXRwdXQgdGhhdCB3ZXJlIGVmZmVjdGVkIGJ5IGl0LlxuICovXG5mdW5jdGlvbiBmaW5kRWZmZWN0ZWRTdGVwcyhcbiAgY2hhbmdlZEZpbGU6IFtldmVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmddLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCxcbik6IERldGVjdGVkQ2hhbmdlW10ge1xuICBjb25zdCBjaGFuZ2VzOiBEZXRlY3RlZENoYW5nZVtdID0gW107XG4gIGNvbnN0IGNoYW5nZWRQYXRoID0gY2hhbmdlZEZpbGVbMV07XG5cbiAgY29uc3QgaXNDaHVua0VmZmVjdGVkID0gKFxuICAgIGNodW5rOiB2aXRlLlJvbGx1cC5PdXRwdXRDaHVuayB8IHZpdGUuUm9sbHVwLk91dHB1dEFzc2V0LFxuICApOiBib29sZWFuID0+XG4gICAgLy8gSWYgaXQncyBhbiBIVE1MIGZpbGUgd2l0aCB0aGUgc2FtZSBwYXRoLCBpcyBpcyBlZmZlY3RlZCBiZWNhdXNlIEhUTUwgZmlsZXMgbmVlZCB0byBiZSBwcmUtcmVuZGVyZWRcbiAgICAvLyBUT0RPOiB1c2UgYnVuZGxlIHBhdGggdG8gc3VwcG9ydCBgPG5hbWU+L2luZGV4Lmh0bWxgP1xuICAgIChjaHVuay50eXBlID09PSAnYXNzZXQnICYmIGNoYW5nZWRQYXRoLmVuZHNXaXRoKGNodW5rLmZpbGVOYW1lKSkgfHxcbiAgICAvLyBJZiBpdCdzIGEgY2h1bmsgdGhhdCBkZXBlbmRzIG9uIHRoZSBjaGFuZ2VkIGZpbGUsIGl0IGlzIGVmZmVjdGVkXG4gICAgKGNodW5rLnR5cGUgPT09ICdjaHVuaycgJiYgY2h1bmsubW9kdWxlSWRzLmluY2x1ZGVzKGNoYW5nZWRQYXRoKSk7XG5cbiAgZm9yIChjb25zdCBzdGVwIG9mIGN1cnJlbnRPdXRwdXQuc3RlcHMpIHtcbiAgICBjb25zdCBlZmZlY3RlZENodW5rID0gc3RlcC5jaHVua3MuZmluZCgoY2h1bmspID0+IGlzQ2h1bmtFZmZlY3RlZChjaHVuaykpO1xuICAgIGlmIChlZmZlY3RlZENodW5rKSBjaGFuZ2VzLnB1c2goc3RlcCk7XG4gIH1cblxuICBjb25zdCBlZmZlY3RlZEFzc2V0ID0gY3VycmVudE91dHB1dC5wdWJsaWNBc3NldHMuZmluZCgoY2h1bmspID0+XG4gICAgaXNDaHVua0VmZmVjdGVkKGNodW5rKSxcbiAgKTtcbiAgaWYgKGVmZmVjdGVkQXNzZXQpIGNoYW5nZXMucHVzaChlZmZlY3RlZEFzc2V0KTtcblxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGZpbGVzIGNoYW5nZWQsIHdoYXQgbmVlZHMgcmVidWlsdCwgYW5kIHRoZSB0eXBlIG9mIHJlbG9hZCB0aGF0IGlzXG4gKiByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgRGV2TW9kZUNoYW5nZSA9XG4gIHwgTm9DaGFuZ2VcbiAgfCBIdG1sUmVsb2FkXG4gIHwgRXh0ZW5zaW9uUmVsb2FkXG4gIHwgQ29udGVudFNjcmlwdFJlbG9hZDtcbi8vIHwgQnJvd3NlclJlc3RhcnRcblxuaW50ZXJmYWNlIE5vQ2hhbmdlIHtcbiAgdHlwZTogJ25vLWNoYW5nZSc7XG59XG5cbmludGVyZmFjZSBSZWJ1aWxkQ2hhbmdlIHtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVudHJ5cG9pbnRzIHRoYXQgbmVlZCByZWJ1aWx0LlxuICAgKi9cbiAgcmVidWlsZEdyb3VwczogRW50cnlwb2ludEdyb3VwW107XG4gIC8qKlxuICAgKiBUaGUgcHJldmlvdXMgb3V0cHV0IHN0cmlwcGVkIG9mIGFueSBmaWxlcyBhcmUgZ29pbmcgdG8gY2hhbmdlLlxuICAgKi9cbiAgY2FjaGVkT3V0cHV0OiBCdWlsZE91dHB1dDtcbn1cblxuaW50ZXJmYWNlIEh0bWxSZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2h0bWwtcmVsb2FkJztcbn1cblxuaW50ZXJmYWNlIEV4dGVuc2lvblJlbG9hZCBleHRlbmRzIFJlYnVpbGRDaGFuZ2Uge1xuICB0eXBlOiAnZXh0ZW5zaW9uLXJlbG9hZCc7XG59XG5cbi8vIGludGVyZmFjZSBCcm93c2VyUmVzdGFydCBleHRlbmRzIFJlYnVpbGRDaGFuZ2Uge1xuLy8gICB0eXBlOiAnYnJvd3Nlci1yZXN0YXJ0Jztcbi8vIH1cblxuaW50ZXJmYWNlIENvbnRlbnRTY3JpcHRSZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2NvbnRlbnQtc2NyaXB0LXJlbG9hZCc7XG4gIGNoYW5nZWRTdGVwczogQnVpbGRTdGVwT3V0cHV0W107XG59XG5cbi8qKlxuICogV2hlbiBmaWd1cmluZyBvdXQgd2hhdCBuZWVkcyByZWxvYWRlZCwgdGhpcyBzdG9yZXMgdGhlIHN0ZXAgdGhhdCB3YXMgY2hhbmdlZCwgb3IgdGhlIHB1YmxpY1xuICogZGlyZWN0b3J5IGFzc2V0IHRoYXQgd2FzIGNoYW5nZWQuIEl0IGRvZXNuJ3Qga25vdyB3aGF0IHR5cGUgb2YgY2hhbmdlIGlzIHJlcXVpcmVkIHlldC4gSnVzdCBhblxuICogaW50ZXJtZWRpYXRlIHR5cGUuXG4gKi9cbnR5cGUgRGV0ZWN0ZWRDaGFuZ2UgPSBCdWlsZFN0ZXBPdXRwdXQgfCB2aXRlLlJvbGx1cC5PdXRwdXRBc3NldDtcbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHtcbiAgQnVpbGRPdXRwdXQsXG4gIEJ1aWxkU3RlcE91dHB1dCxcbiAgRW50cnlwb2ludCxcbiAgRW50cnlwb2ludEdyb3VwLFxuICBJbnRlcm5hbENvbmZpZyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tICcuLi92aXRlLXBsdWdpbnMnO1xuaW1wb3J0IHsgcmVtb3ZlRW1wdHlEaXJzIH0gZnJvbSAnLi4vdXRpbHMvcmVtb3ZlRW1wdHlEaXJzJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEVudHJ5cG9pbnRzKFxuICBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPj4ge1xuICBjb25zdCBzdGVwczogQnVpbGRTdGVwT3V0cHV0W10gPSBbXTtcbiAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICBjb25zdCBzdGVwID0gQXJyYXkuaXNBcnJheShncm91cClcbiAgICAgID8gYXdhaXQgYnVpbGRNdWx0aXBsZUVudHJ5cG9pbnRzKGdyb3VwLCBjb25maWcpXG4gICAgICA6IGF3YWl0IGJ1aWxkU2luZ2xlRW50cnlwb2ludChncm91cCwgY29uZmlnKTtcbiAgICBzdGVwcy5wdXNoKHN0ZXApO1xuICB9XG4gIGNvbnN0IHB1YmxpY0Fzc2V0cyA9IGF3YWl0IGNvcHlQdWJsaWNEaXJlY3RvcnkoY29uZmlnKTtcblxuICAvLyBSZW1vdmUgYW55IGVtcHR5IGRpcmVjdG9yaWVzIGZyb20gbW92aW5nIG91dHB1dHMgYXJvdW5kXG4gIGF3YWl0IHJlbW92ZUVtcHR5RGlycyhjb25maWcub3V0RGlyKTtcblxuICByZXR1cm4geyBwdWJsaWNBc3NldHMsIHN0ZXBzIH07XG59XG5cbi8qKlxuICogVXNlIFZpdGUncyBsaWIgbW9kZSArIElJRkUgZm9ybWF0IHRvIGJ1bmRsZSB0aGUgZW50cnlwb2ludCB0byBhIHNpbmdsZSBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFNpbmdsZUVudHJ5cG9pbnQoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkU3RlcE91dHB1dD4ge1xuICAvLyBTaG91bGQgdGhpcyBlbnRyeXBvaW50IGJlIHdyYXBwZWQgYnkgdGhlIHZpdGUtcGx1Z2lucy92aXJ0dWFsRW50cnlwb2ludCBwbHVnaW4/XG4gIGNvbnN0IGlzVmlydHVhbCA9IFsnYmFja2dyb3VuZCcsICdjb250ZW50LXNjcmlwdCddLmluY2x1ZGVzKGVudHJ5cG9pbnQudHlwZSk7XG4gIGNvbnN0IGVudHJ5ID0gaXNWaXJ0dWFsXG4gICAgPyBgdmlydHVhbDp3eHQtJHtlbnRyeXBvaW50LnR5cGV9PyR7ZW50cnlwb2ludC5pbnB1dFBhdGh9YFxuICAgIDogZW50cnlwb2ludC5pbnB1dFBhdGg7XG5cbiAgY29uc3QgbGliTW9kZTogdml0ZS5JbmxpbmVDb25maWcgPSB7XG4gICAgYnVpbGQ6IHtcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeSxcbiAgICAgICAgZm9ybWF0czogWydpaWZlJ10sXG4gICAgICAgIG5hbWU6IGVudHJ5cG9pbnQubmFtZSxcbiAgICAgICAgZmlsZU5hbWU6IGVudHJ5cG9pbnQubmFtZSxcbiAgICAgIH0sXG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIC8vIFRoZXJlJ3Mgb25seSBhIHNpbmdsZSBvdXRwdXQgZm9yIHRoaXMgYnVpbGQsIHNvIHdlIHVzZSB0aGUgZGVzaXJlZCBidW5kbGUgcGF0aCBmb3IgdGhlXG4gICAgICAgICAgLy8gZW50cnkgb3V0cHV0IChsaWtlIFwiY29udGVudC1zY3JpcHRzL292ZXJsYXkuanNcIilcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgICAgICcuanMnLFxuICAgICAgICAgICksXG4gICAgICAgICAgLy8gT3V0cHV0IGNvbnRlbnQgc2NyaXB0IENTUyB0byBhc3NldHMvIHdpdGggYSBoYXNoIHRvIHByZXZlbnQgY29uZmxpY3RzLiBEZWZhdWx0cyB0b1xuICAgICAgICAgIC8vIFwiW25hbWVdLltleHRdXCIgaW4gbGliIG1vZGUsIHdoaWNoIHVzdWFsbHkgcmVzdWx0cyBpbiBcInN0eWxlLmNzc1wiLiBUaGF0IG1lYW5zIG11bHRpcGxlXG4gICAgICAgICAgLy8gY29udGVudCBzY3JpcHRzIHdpdGggc3R5bGVzIHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyIGlmIGl0IHdlcmVuJ3QgY2hhbmdlZCBiZWxvdy5cbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogYGFzc2V0cy8ke2VudHJ5cG9pbnQubmFtZX0uW2V4dF1gLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuICBjb25zdCBlbnRyeUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgbGliTW9kZSxcbiAgICBjb25maWcudml0ZSxcbiAgKSBhcyB2aXRlLklubGluZUNvbmZpZztcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB2aXRlLmJ1aWxkKGVudHJ5Q29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICBlbnRyeXBvaW50czogZW50cnlwb2ludCxcbiAgICBjaHVua3M6IGdldEJ1aWxkT3V0cHV0Q2h1bmtzKHJlc3VsdCksXG4gIH07XG59XG5cbi8qKlxuICogVXNlIFZpdGUncyBtdWx0aXBhZ2UgYnVpbGQgdG8gYnVuZGxlIGFsbCB0aGUgZW50cnlwb2ludHMgaW4gYSBzaW5nbGUgc3RlcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRNdWx0aXBsZUVudHJ5cG9pbnRzKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgY29uc3QgbXVsdGlQYWdlOiB2aXRlLklubGluZUNvbmZpZyA9IHtcbiAgICBwbHVnaW5zOiBbcGx1Z2lucy5tdWx0aXBhZ2VNb3ZlKGVudHJ5cG9pbnRzLCBjb25maWcpXSxcbiAgICBidWlsZDoge1xuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBpbnB1dDogZW50cnlwb2ludHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChpbnB1dCwgZW50cnkpID0+IHtcbiAgICAgICAgICBpbnB1dFtlbnRyeS5uYW1lXSA9IGVudHJ5LmlucHV0UGF0aDtcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH0sIHt9KSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBjaHVua0ZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBJbmNsdWRlIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiAnY2h1bmtzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIC8vIFdlIGNhbid0IGNvbnRyb2wgdGhlIFwibmFtZVwiLCBzbyB3ZSBuZWVkIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAnYXNzZXRzL1tuYW1lXS1baGFzaF0uW2V4dF0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBtdWx0aVBhZ2UsXG4gICAgY29uZmlnLnZpdGUsXG4gICkgYXMgdml0ZS5JbmxpbmVDb25maWc7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdml0ZS5idWlsZChlbnRyeUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgZW50cnlwb2ludHMsXG4gICAgY2h1bmtzOiBnZXRCdWlsZE91dHB1dENodW5rcyhyZXN1bHQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsZE91dHB1dENodW5rcyhcbiAgcmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHZpdGUuYnVpbGQ+Pixcbik6IEJ1aWxkU3RlcE91dHB1dFsnY2h1bmtzJ10ge1xuICBpZiAoJ29uJyBpbiByZXN1bHQpIHRocm93IEVycm9yKCd3eHQgZG9lcyBub3Qgc3VwcG9ydCB2aXRlIHdhdGNoIG1vZGUuJyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQuZmxhdE1hcCgoeyBvdXRwdXQgfSkgPT4gb3V0cHV0KTtcbiAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlQdWJsaWNEaXJlY3RvcnkoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXT4ge1xuICBjb25zdCBwdWJsaWNBc3NldHM6IEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXSA9IFtdO1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoY29uZmlnLnB1YmxpY0RpcikpKSByZXR1cm4gcHVibGljQXNzZXRzO1xuXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYignKiovKicsIHsgY3dkOiBjb25maWcucHVibGljRGlyIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSByZXNvbHZlKGNvbmZpZy5wdWJsaWNEaXIsIGZpbGUpO1xuICAgIGNvbnN0IG91dFBhdGggPSByZXNvbHZlKGNvbmZpZy5vdXREaXIsIGZpbGUpO1xuXG4gICAgYXdhaXQgZnMuZW5zdXJlRGlyKGRpcm5hbWUob3V0UGF0aCkpO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNyY1BhdGgsIG91dFBhdGgpO1xuICAgIHB1YmxpY0Fzc2V0cy5wdXNoKHtcbiAgICAgIHR5cGU6ICdhc3NldCcsXG4gICAgICBmaWxlTmFtZTogZmlsZSxcbiAgICAgIG5hbWU6IGZpbGUsXG4gICAgICBuZWVkc0NvZGVSZWZlcmVuY2U6IGZhbHNlLFxuICAgICAgc291cmNlOiBhd2FpdCBmcy5yZWFkRmlsZShzcmNQYXRoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwdWJsaWNBc3NldHM7XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW1wdHlEaXJzKGRpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGUpO1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHJlbW92ZUVtcHR5RGlycyhmaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ybWRpcihkaXIpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBub29wIG9uIGZhaWx1cmUgLSB0aGlzIG1lYW5zIHRoZSBkaXJlY3Rvcnkgd2FzIG5vdCBlbXB0eS5cbiAgfVxufVxuIiwgImltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBCYWNrZ3JvdW5kRW50cnlwb2ludCxcbiAgQmFja2dyb3VuZFNjcmlwdERlZmludGl0aW9uLFxuICBDb250ZW50U2NyaXB0RGVmaW5pdGlvbixcbiAgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQsXG4gIEVudHJ5cG9pbnQsXG4gIEludGVybmFsQ29uZmlnLFxuICBPcHRpb25zRW50cnlwb2ludCxcbiAgUG9wdXBFbnRyeXBvaW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHBpY29tYXRjaCBmcm9tICdwaWNvbWF0Y2gnO1xuaW1wb3J0IHsgcGFyc2VIVE1MIH0gZnJvbSAnbGlua2Vkb20nO1xuaW1wb3J0IEpTT041IGZyb20gJ2pzb241JztcbmltcG9ydCB7IGltcG9ydFRzRmlsZSB9IGZyb20gJy4uL3V0aWxzL2ltcG9ydFRzRmlsZSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludE5hbWUgfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5cbi8qKlxuICogUmV0dXJuIGVudHJ5cG9pbnRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRFbnRyeXBvaW50cyhcbiAgY29uZmlnOiBGaW5kRW50cnlwb2ludHNDb25maWcsXG4pOiBQcm9taXNlPEVudHJ5cG9pbnRbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYignKiovKicsIHtcbiAgICBjd2Q6IGNvbmZpZy5lbnRyeXBvaW50c0RpcixcbiAgfSk7XG4gIC8vIEVuc3VyZSBjb25zaXN0ZW50IG91dHB1dFxuICByZWxhdGl2ZVBhdGhzLnNvcnQoKTtcblxuICBjb25zdCBwYXRoR2xvYnMgPSBPYmplY3Qua2V5cyhQQVRIX0dMT0JfVE9fVFlQRV9NQVApO1xuICBjb25zdCBleGlzdGluZ05hbWVzOiBSZWNvcmQ8c3RyaW5nLCBFbnRyeXBvaW50IHwgdW5kZWZpbmVkPiA9IHt9O1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10gPSBbXTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgbWF0Y2hpbmdHbG9iID0gcGF0aEdsb2JzLmZpbmQoKGdsb2IpID0+XG4gICAgICAgIHBpY29tYXRjaC5pc01hdGNoKHJlbGF0aXZlUGF0aCwgZ2xvYiksXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdHbG9iID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgICBgJHtyZWxhdGl2ZVBhdGh9IGRvZXMgbm90IG1hdGNoIGFueSBrbm93biBlbnRyeXBvaW50LiBLbm93biBlbnRyeXBvaW50czpcXG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgUEFUSF9HTE9CX1RPX1RZUEVfTUFQLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gUEFUSF9HTE9CX1RPX1RZUEVfTUFQW21hdGNoaW5nR2xvYl07XG4gICAgICBpZiAodHlwZSA9PT0gJ2lnbm9yZWQnKSByZXR1cm47XG5cbiAgICAgIGxldCBlbnRyeXBvaW50OiBFbnRyeXBvaW50O1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BvcHVwJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0UG9wdXBFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRPcHRpb25zRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrZ3JvdW5kJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0QmFja2dyb3VuZEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRDb250ZW50U2NyaXB0RW50cnlwb2ludChcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aC5zcGxpdCgnLicsIDIpWzBdLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICAgICAgICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICAgICAgICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3aXRoU2FtZU5hbWUgPSBleGlzdGluZ05hbWVzW2VudHJ5cG9pbnQubmFtZV07XG4gICAgICBpZiAod2l0aFNhbWVOYW1lKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBlbnRyeXBvaW50cyB3aXRoIHRoZSBuYW1lIFwiJHtcbiAgICAgICAgICAgIGVudHJ5cG9pbnQubmFtZVxuICAgICAgICAgIH1cIiBkZXRlY3RlZCwgYnV0IG9ubHkgb25lIGlzIGFsbG93ZWQ6ICR7W1xuICAgICAgICAgICAgcmVsYXRpdmUoY29uZmlnLnJvb3QsIHdpdGhTYW1lTmFtZS5pbnB1dFBhdGgpLFxuICAgICAgICAgICAgcmVsYXRpdmUoY29uZmlnLnJvb3QsIGVudHJ5cG9pbnQuaW5wdXRQYXRoKSxcbiAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVudHJ5cG9pbnRzLnB1c2goZW50cnlwb2ludCk7XG4gICAgICBleGlzdGluZ05hbWVzW2VudHJ5cG9pbnQubmFtZV0gPSBlbnRyeXBvaW50O1xuICAgIH0pLFxuICApO1xuICByZXR1cm4gZW50cnlwb2ludHM7XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgcG9wdXAgSFRNTCBmaWxlLlxuICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3B1cEVudHJ5cG9pbnQoXG4gIGNvbmZpZzogRmluZEVudHJ5cG9pbnRzQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPFBvcHVwRW50cnlwb2ludD4ge1xuICBjb25zdCBvcHRpb25zOiBQb3B1cEVudHJ5cG9pbnRbJ29wdGlvbnMnXSA9IHt9O1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKGNvbnRlbnQpO1xuXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKTtcbiAgaWYgKHRpdGxlICE9IG51bGwpIG9wdGlvbnMuZGVmYXVsdFRpdGxlID0gdGl0bGUudGV4dENvbnRlbnQgPz8gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRlZmF1bHRJY29uQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmRlZmF1bHRfaWNvbiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGRlZmF1bHRJY29uQ29udGVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zLmRlZmF1bHRJY29uID0gSlNPTjUucGFyc2UoZGVmYXVsdEljb25Db250ZW50KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZmF0YWwoXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgZGVmYXVsdF9pY29uIG1ldGEgdGFnIGNvbnRlbnQgYXMgSlNPTjUuIGNvbnRlbnQ9JHtkZWZhdWx0SWNvbkNvbnRlbnR9YCxcbiAgICAgICAgZXJyLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtdjJLZXlDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QudHlwZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG12MktleUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm12MktleSA9XG4gICAgICBtdjJLZXlDb250ZW50ID09PSAncGFnZV9hY3Rpb24nID8gJ3BhZ2VfYWN0aW9uJyA6ICdicm93c2VyX2FjdGlvbic7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdwb3B1cCcsXG4gICAgbmFtZTogJ3BvcHVwJyxcbiAgICBvcHRpb25zLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgb3B0aW9ucyBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnNFbnRyeXBvaW50KFxuICBjb25maWc6IEZpbmRFbnRyeXBvaW50c0NvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxPcHRpb25zRW50cnlwb2ludD4ge1xuICBjb25zdCBvcHRpb25zOiBPcHRpb25zRW50cnlwb2ludFsnb3B0aW9ucyddID0ge307XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3Qgb3BlbkluVGFiQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0Lm9wZW5faW5fdGFiJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAob3BlbkluVGFiQ29udGVudCkge1xuICAgIG9wdGlvbnMub3BlbkluVGFiID0gQm9vbGVhbihvcGVuSW5UYWJDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZVN0eWxlQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmNocm9tZV9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGNocm9tZVN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuY2hyb21lU3R5bGUgPSBCb29sZWFuKGNocm9tZVN0eWxlQ29udGVudCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyU3R5bGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuYnJvd3Nlcl9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGJyb3dzZXJTdHlsZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmJyb3dzZXJTdHlsZSA9IEJvb2xlYW4oYnJvd3NlclN0eWxlQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdvcHRpb25zJyxcbiAgICBuYW1lOiAnb3B0aW9ucycsXG4gICAgb3B0aW9ucyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIGJhY2tncm91bmQncyBUUyBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChcbiAgY29uZmlnOiBGaW5kRW50cnlwb2ludHNDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8QmFja2dyb3VuZEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgeyBtYWluOiBfLCAuLi5vcHRpb25zIH0gPVxuICAgIGF3YWl0IGltcG9ydFRzRmlsZTxCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24+KGNvbmZpZy5yb290LCBwYXRoKTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdiYWNrZ3JvdW5kJyxcbiAgICBuYW1lOiAnYmFja2dyb3VuZCcsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgICBvcHRpb25zOiBvcHRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIGNvbnRlbnQgc2NyaXB0J3MgVFMgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdEVudHJ5cG9pbnQoXG4gIGNvbmZpZzogRmluZEVudHJ5cG9pbnRzQ29uZmlnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8Q29udGVudFNjcmlwdEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgeyBtYWluOiBfLCAuLi5vcHRpb25zIH0gPSBhd2FpdCBpbXBvcnRUc0ZpbGU8Q29udGVudFNjcmlwdERlZmluaXRpb24+KFxuICAgIGNvbmZpZy5yb290LFxuICAgIHBhdGgsXG4gICk7XG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICB0aHJvdyBFcnJvcihgQ29udGVudCBzY3JpcHQgJHtuYW1lfSBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnRgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdjb250ZW50LXNjcmlwdCcsXG4gICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiByZXNvbHZlKGNvbmZpZy5vdXREaXIsICdjb250ZW50LXNjcmlwdHMnKSxcbiAgICBvcHRpb25zLFxuICB9O1xufVxuXG5jb25zdCBQQVRIX0dMT0JfVE9fVFlQRV9NQVA6IFJlY29yZDxzdHJpbmcsIEVudHJ5cG9pbnRbJ3R5cGUnXSB8ICdpZ25vcmVkJz4gPSB7XG4gICdzYW5kYm94Lmh0bWwnOiAnc2FuZGJveCcsXG4gICdzYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG4gICcqLnNhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC9pbmRleC5odG1sJzogJ3NhbmRib3gnLFxuXG4gICdib29rbWFya3MuaHRtbCc6ICdib29rbWFya3MnLFxuICAnYm9va21hcmtzL2luZGV4Lmh0bWwnOiAnYm9va21hcmtzJyxcblxuICAnaGlzdG9yeS5odG1sJzogJ2hpc3RvcnknLFxuICAnaGlzdG9yeS9pbmRleC5odG1sJzogJ2hpc3RvcnknLFxuXG4gICduZXd0YWIuaHRtbCc6ICduZXd0YWInLFxuICAnbmV3dGFiL2luZGV4Lmh0bWwnOiAnbmV3dGFiJyxcblxuICAnc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJ3NpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG5cbiAgJ2RldnRvb2xzLmh0bWwnOiAnZGV2dG9vbHMnLFxuICAnZGV2dG9vbHMvaW5kZXguaHRtbCc6ICdkZXZ0b29scycsXG5cbiAgJ2JhY2tncm91bmQudHMnOiAnYmFja2dyb3VuZCcsXG5cbiAgJyouY29udGVudC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICAnKi5jb250ZW50L2luZGV4LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG5cbiAgJ3BvcHVwLmh0bWwnOiAncG9wdXAnLFxuICAncG9wdXAvaW5kZXguaHRtbCc6ICdwb3B1cCcsXG5cbiAgJ29wdGlvbnMuaHRtbCc6ICdvcHRpb25zJyxcbiAgJ29wdGlvbnMvaW5kZXguaHRtbCc6ICdvcHRpb25zJyxcblxuICAnKi5odG1sJzogJ3VubGlzdGVkLXBhZ2UnLFxuICAnKi9pbmRleC5odG1sJzogJ3VubGlzdGVkLXBhZ2UnLFxuICAnKi50cyc6ICd1bmxpc3RlZC1zY3JpcHQnLFxuXG4gIC8vIERvbid0IHdhcm4gYWJvdXQgYW55IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzLCBsaWtlIENTUyBvciBKUyBlbnRyeXBvaW50cyBmb3IgSFRNTCBmaWxlc1xuICAnKi8qJzogJ2lnbm9yZWQnLFxufTtcblxuZXhwb3J0IHR5cGUgRmluZEVudHJ5cG9pbnRzQ29uZmlnID0gUGljazxcbiAgSW50ZXJuYWxDb25maWcsXG4gICdyb290JyB8ICdlbnRyeXBvaW50c0RpcicgfCAnb3V0RGlyJyB8ICdsb2dnZXInIHwgJ21vZGUnIHwgJ2NvbW1hbmQnXG4+O1xuIiwgImltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IGdldEdsb2JhbHMgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbmQgd3JpdGUgYWxsIHRoZSBmaWxlcyBpbnNpZGUgdGhlIGBJbnRlcm5hbENvbmZpZy50eXBlc0RpcmAgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlc0RpcihcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLnR5cGVzRGlyKTtcblxuICBjb25zdCByZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVJbXBvcnRzRGVjbGFyYXRpb25GaWxlKGNvbmZpZykpO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShlbnRyeXBvaW50cywgY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG5cbiAgY29uc3QgbWFpblJlZmVyZW5jZSA9IGF3YWl0IHdyaXRlTWFpbkRlY2xhcmF0aW9uRmlsZShyZWZlcmVuY2VzLCBjb25maWcpO1xuICBhd2FpdCB3cml0ZVRzQ29uZmlnRmlsZShtYWluUmVmZXJlbmNlLCBjb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnaW1wb3J0cy5kLnRzJyk7XG4gIGNvbnN0IHVuaW1wb3J0ID0gY3JlYXRlVW5pbXBvcnQoZ2V0VW5pbXBvcnRPcHRpb25zKGNvbmZpZykpO1xuXG4gIC8vIExvYWQgcHJvamVjdCBpbXBvcnRzIGludG8gdW5pbXBvcnQgbWVtb3J5IHNvIHRoZXkgYXJlIG91dHB1dCB2aWEgZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zXG4gIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbJy8vIEdlbmVyYXRlZCBieSB3eHQnLCBhd2FpdCB1bmltcG9ydC5nZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoKV0uam9pbihcbiAgICAgICdcXG4nLFxuICAgICkgKyAnXFxuJyxcbiAgKTtcblxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUGF0aHNEZWNsYXJhdGlvbkZpbGUoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAncGF0aHMuZC50cycpO1xuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAndHlwZSBFbnRyeXBvaW50UGF0aCA9JyxcbiAgICAgIC4uLmVudHJ5cG9pbnRzXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKCcuaHRtbCcpID8gJy5odG1sJyA6ICcuanMnLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGAgIHwgXCIvJHtwYXRofVwiYDtcbiAgICAgICAgfSlcbiAgICAgICAgLnNvcnQoKSxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnZ2xvYmFscy5kLnRzJyk7XG4gIGNvbnN0IGdsb2JhbHMgPSBnZXRHbG9iYWxzKGNvbmZpZyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAnZXhwb3J0IHt9JyxcbiAgICAgICdkZWNsYXJlIGdsb2JhbCB7JyxcbiAgICAgIC4uLmdsb2JhbHMubWFwKChnbG9iYWwpID0+IGAgIGNvbnN0ICR7Z2xvYmFsLm5hbWV9OiAke2dsb2JhbC50eXBlfTtgKSxcbiAgICAgICd9JyxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICAgJ3V0Zi04JyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUoXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGRpciwgJ3d4dC5kLnRzJyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAuLi5yZWZlcmVuY2VzLm1hcChcbiAgICAgICAgKHJlZikgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi8ke3JlbGF0aXZlKGRpciwgcmVmKX1cIiAvPmAsXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRzQ29uZmlnRmlsZShcbiAgbWFpblJlZmVyZW5jZTogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICByZXNvbHZlKGRpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICBge1xuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJ0YXJnZXRcIjogXCJFU05leHRcIixcbiAgICBcIm1vZHVsZVwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIkJ1bmRsZXJcIixcbiAgICBcIm5vRW1pdFwiOiB0cnVlLFxuICAgIFwiZXNNb2R1bGVJbnRlcm9wXCI6IHRydWUsXG4gICAgXCJmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lc1wiOiB0cnVlLFxuICAgIFwicmVzb2x2ZUpzb25Nb2R1bGVcIjogdHJ1ZSxcblxuICAgIC8qIFR5cGUgQ2hlY2tpbmcgKi9cbiAgICBcInN0cmljdFwiOiB0cnVlLFxuXG4gICAgLyogQ29tcGxldGVuZXNzICovXG4gICAgXCJza2lwTGliQ2hlY2tcIjogdHJ1ZVxuICB9LFxuICBcImluY2x1ZGVcIjogW1xuICAgIFwiJHtyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KX0vKiovKlwiLFxuICAgIFwiLi8ke3JlbGF0aXZlKGRpciwgbWFpblJlZmVyZW5jZSl9XCJcbiAgXSxcbiAgXCJleGNsdWRlXCI6IFtcIiR7cmVsYXRpdmUoZGlyLCBjb25maWcub3V0QmFzZURpcil9XCJdXG59YCxcbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJ1aWxkT3V0cHV0LFxuICBDb250ZW50U2NyaXB0RW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4vZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgQ29udGVudFNlY3VyaXR5UG9saWN5IH0gZnJvbSAnLi9Db250ZW50U2VjdXJpdHlQb2xpY3knO1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgbWFuaWZlc3QgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgYW5kIHRoZSBidWlsZCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZU1hbmlmZXN0KFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RyID1cbiAgICBjb25maWcubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KVxuICAgICAgOiBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMik7XG5cbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXREaXIpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocmVzb2x2ZShjb25maWcub3V0RGlyLCAnbWFuaWZlc3QuanNvbicpLCBzdHIsICd1dGYtOCcpO1xuXG4gIG91dHB1dC5wdWJsaWNBc3NldHMudW5zaGlmdCh7XG4gICAgdHlwZTogJ2Fzc2V0JyxcbiAgICBmaWxlTmFtZTogJ21hbmlmZXN0Lmpzb24nLFxuICAgIG5hbWU6ICdtYW5pZmVzdCcsXG4gICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICBzb3VyY2U6IHN0cixcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtYW5pZmVzdCBiYXNlZCBvbiB0aGUgY29uZmlnIGFuZCBlbnRyeXBvaW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWFpbmZlc3QoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8TWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3Q+IHtcbiAgY29uc3QgcGtnID0gYXdhaXQgZ2V0UGFja2FnZUpzb24oY29uZmlnKTtcbiAgaWYgKHBrZy52ZXJzaW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgdmVyc2lvbicpO1xuICBpZiAocGtnLm5hbWUgPT0gbnVsbCkgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgbmFtZScpO1xuICBpZiAocGtnLmRlc2NyaXB0aW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgZGVzY3JpcHRpb24nKTtcblxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RfdmVyc2lvbjogY29uZmlnLm1hbmlmZXN0VmVyc2lvbixcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBzaG9ydF9uYW1lOiBwa2cuc2hvcnROYW1lLFxuICAgIHZlcnNpb246IHNpbXBsaWZ5VmVyc2lvbihwa2cudmVyc2lvbiksXG4gICAgdmVyc2lvbl9uYW1lOiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gdW5kZWZpbmVkIDogcGtnLnZlcnNpb24sXG4gICAgLi4uY29uZmlnLm1hbmlmZXN0LFxuICB9O1xuXG4gIGFkZEVudHJ5cG9pbnRzKG1hbmlmZXN0LCBlbnRyeXBvaW50cywgYnVpbGRPdXRwdXQsIGNvbmZpZyk7XG5cbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSBhZGREZXZNb2RlQ3NwKG1hbmlmZXN0LCBjb25maWcpO1xuICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScpIGFkZERldk1vZGVQZXJtaXNzaW9ucyhtYW5pZmVzdCwgY29uZmlnKTtcblxuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgcGFja2FnZS5qc29uIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIFRPRE86IGxvb2sgaW4gcm9vdCBhbmQgdXAgZGlyZWN0b3JpZXMgdW50aWwgaXQncyBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvbihjb25maWc6IEludGVybmFsQ29uZmlnKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGF3YWl0IGZzLnJlYWRKc29uKHJlc29sdmUoY29uZmlnLnJvb3QsICdwYWNrYWdlLmpzb24nKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBzdWZmaXhlcyBmcm9tIHRoZSB2ZXJzaW9uLCBsaWtlIFguWS5aLWFscGhhMSAod2hpY2ggYnJvc2VycyBkb24ndCBhbGxvdyksIHNvIGl0J3MgYVxuICogc2ltcGxlIHZlcnNpb24gbnVtYmVyLCBsaWtlIFggb3IgWC5ZIG9yIFguWS5aLCB3aGljaCBicm93c2VycyBhbGxvdy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnlWZXJzaW9uKHZlcnNpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZWdleCBhZGFwdGVkIGZyb20gaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Nb3ppbGxhL0FkZC1vbnMvV2ViRXh0ZW5zaW9ucy9tYW5pZmVzdC5qc29uL3ZlcnNpb24jdmVyc2lvbl9mb3JtYXRcblxuICBjb25zdCB2ZXJzaW9uID0gL14oKDB8WzEtOV1bMC05XXswLDh9KShbLl0oMHxbMS05XVswLTldezAsOH0pKXswLDN9KS4qJC8uZXhlYyhcbiAgICB2ZXJzaW9uTmFtZSxcbiAgKT8uWzFdO1xuXG4gIGlmICh2ZXJzaW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNpbXBsaWZ5IHBhY2thZ2UuanNvbiB2ZXJzaW9uIFwiJHt2ZXJzaW9uTmFtZX1cIiB0byBhIHZhbGlkIGV4dGVuc2lvbiB2ZXJzaW9uLCBcIlguWS5aXCJgLFxuICAgICk7XG5cbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGFkZEVudHJ5cG9pbnRzKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IHZvaWQge1xuICBjb25zdCBlbnRyaWVzQnlUeXBlID0gZW50cnlwb2ludHMucmVkdWNlPFxuICAgIFBhcnRpYWw8UmVjb3JkPEVudHJ5cG9pbnRbJ3R5cGUnXSwgRW50cnlwb2ludFtdPj5cbiAgPigobWFwLCBlbnRyeXBvaW50KSA9PiB7XG4gICAgbWFwW2VudHJ5cG9pbnQudHlwZV0gPz89IFtdO1xuICAgIG1hcFtlbnRyeXBvaW50LnR5cGVdPy5wdXNoKGVudHJ5cG9pbnQpO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIHt9KTtcblxuICBjb25zdCBiYWNrZ3JvdW5kID0gZW50cmllc0J5VHlwZVsnYmFja2dyb3VuZCddPy5bMF0gYXNcbiAgICB8IEJhY2tncm91bmRFbnRyeXBvaW50XG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvb2ttYXJrcyA9IGVudHJpZXNCeVR5cGVbJ2Jvb2ttYXJrcyddPy5bMF07XG4gIGNvbnN0IGNvbnRlbnRTY3JpcHRzID0gZW50cmllc0J5VHlwZVsnY29udGVudC1zY3JpcHQnXSBhc1xuICAgIHwgQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXVxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBkZXZ0b29scyA9IGVudHJpZXNCeVR5cGVbJ2RldnRvb2xzJ10/LlswXTtcbiAgY29uc3QgaGlzdG9yeSA9IGVudHJpZXNCeVR5cGVbJ2hpc3RvcnknXT8uWzBdO1xuICBjb25zdCBuZXd0YWIgPSBlbnRyaWVzQnlUeXBlWyduZXd0YWInXT8uWzBdO1xuICBjb25zdCBvcHRpb25zID0gZW50cmllc0J5VHlwZVsnb3B0aW9ucyddPy5bMF0gYXNcbiAgICB8IE9wdGlvbnNFbnRyeXBvaW50XG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcHVwID0gZW50cmllc0J5VHlwZVsncG9wdXAnXT8uWzBdIGFzIFBvcHVwRW50cnlwb2ludCB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2FuZGJveGVzID0gZW50cmllc0J5VHlwZVsnc2FuZGJveCddO1xuICBjb25zdCBzaWRlcGFuZWxzID0gZW50cmllc0J5VHlwZVsnc2lkZXBhbmVsJ107XG5cbiAgaWYgKGJhY2tncm91bmQpIHtcbiAgICBjb25zdCBzY3JpcHQgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChiYWNrZ3JvdW5kLCBjb25maWcub3V0RGlyLCAnLmpzJyk7XG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICAgIG1hbmlmZXN0LmJhY2tncm91bmQgPSB7XG4gICAgICAgIHR5cGU6IGJhY2tncm91bmQub3B0aW9ucy50eXBlLFxuICAgICAgICBzZXJ2aWNlX3dvcmtlcjogc2NyaXB0LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3QuYmFja2dyb3VuZCA9IHtcbiAgICAgICAgcGVyc2lzdGVudDogYmFja2dyb3VuZC5vcHRpb25zLnBlcnNpc3RlbnQsXG4gICAgICAgIHNjcmlwdHM6IFtzY3JpcHRdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoYm9va21hcmtzKSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ0Jvb2ttYXJrcyBhcmUgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBjaHJvbWVfdXJsX292ZXJyaWRlcy5ib29rbWFya3Mgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYm9va21hcmtzIGlzIHVudHlwZWQgaW4gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsLCBidXQgc3VwcG9ydGVkIGJ5IGNocm9tZVxuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMuYm9va21hcmtzID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgIGJvb2ttYXJrcyxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgJy5odG1sJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhpc3RvcnkpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnQm9va21hcmtzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIGNocm9tZV91cmxfb3ZlcnJpZGVzLmhpc3Rvcnkgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogaGlzdG9yeSBpcyB1bnR5cGVkIGluIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCwgYnV0IHN1cHBvcnRlZCBieSBjaHJvbWVcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLmhpc3RvcnkgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgJy5odG1sJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5ld3RhYikge1xuICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5uZXd0YWIgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIG5ld3RhYixcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gIH1cblxuICBpZiAocG9wdXApIHtcbiAgICBjb25zdCBkZWZhdWx0X3BvcHVwID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBwb3B1cCxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uczogTWFuaWZlc3QuQWN0aW9uTWFuaWZlc3QgPSB7XG4gICAgICBkZWZhdWx0X2ljb246IHBvcHVwLm9wdGlvbnMuZGVmYXVsdEljb24sXG4gICAgICBkZWZhdWx0X3RpdGxlOiBwb3B1cC5vcHRpb25zLmRlZmF1bHRUaXRsZSxcbiAgICB9O1xuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgICBtYW5pZmVzdC5hY3Rpb24gPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcG9wdXAsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdFtwb3B1cC5vcHRpb25zLm12MktleSA/PyAnYnJvd3Nlcl9hY3Rpb24nXSA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wb3B1cCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldnRvb2xzKSB7XG4gICAgbWFuaWZlc3QuZGV2dG9vbHNfcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgZGV2dG9vbHMsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgob3B0aW9ucywgY29uZmlnLm91dERpciwgJy5odG1sJyk7XG4gICAgbWFuaWZlc3Qub3B0aW9uc191aSA9IHtcbiAgICAgIG9wZW5faW5fdGFiOiBvcHRpb25zLm9wdGlvbnMub3BlbkluVGFiLFxuICAgICAgYnJvd3Nlcl9zdHlsZTpcbiAgICAgICAgY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94JyA/IG9wdGlvbnMub3B0aW9ucy5icm93c2VyU3R5bGUgOiB1bmRlZmluZWQsXG4gICAgICBjaHJvbWVfc3R5bGU6XG4gICAgICAgIGNvbmZpZy5icm93c2VyICE9PSAnZmlyZWZveCcgPyBvcHRpb25zLm9wdGlvbnMuY2hyb21lU3R5bGUgOiB1bmRlZmluZWQsXG4gICAgICBwYWdlLFxuICAgIH07XG4gIH1cblxuICBpZiAoc2FuZGJveGVzPy5sZW5ndGgpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnU2FuZGJveGVkIHBhZ2VzIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gc2FuZGJveC5wYWdlcyB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzYW5kYm94IG5vdCB0eXBlZFxuICAgICAgbWFuaWZlc3Quc2FuZGJveCA9IHtcbiAgICAgICAgcGFnZXM6IHNhbmRib3hlcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmh0bWwnKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKHNpZGVwYW5lbHM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGRlZmF1bHRTaWRlcGFuZWwgPVxuICAgICAgc2lkZXBhbmVscy5maW5kKChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gJ3NpZGVwYW5lbCcpID8/IHNpZGVwYW5lbHNbMF07XG4gICAgY29uc3QgcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgZGVmYXVsdFNpZGVwYW5lbCxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG5cbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgbWFuaWZlc3Quc2lkZWJhcl9hY3Rpb24gPSB7XG4gICAgICAgIC8vIFRPRE86IEFkZCBvcHRpb25zIHRvIHNpZGUgcGFuZWxcbiAgICAgICAgLy8gLi4uZGVmYXVsdFNpZGVwYW5lbC5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BhbmVsOiBwYWdlLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IFVudHlwZWRcbiAgICAgIG1hbmlmZXN0LnNpZGVfcGFuZWwgPSB7XG4gICAgICAgIGRlZmF1bHRfcGF0aDogcGFnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ1NpZGUgcGFuZWwgbm90IHN1cHBvcnRlZCBieSBDaHJvbWl1bSB1c2luZyBNVjIuIHNpZGVfcGFuZWwuZGVmYXVsdF9wYXRoIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRlbnRTY3JpcHRzPy5sZW5ndGgpIHtcbiAgICAvLyBEb24ndCBhZGQgY29udGVudCBzY3JpcHRzIHRvIHRoZSBtYW5pZmVzdCBpbiBkZXYgbW9kZSBmb3IgTVYzIC0gdGhleSdyZSBtYW5hZ2VkIGFuZCByZWxvYWRlZFxuICAgIC8vIGF0IHJ1bnRpbWVcbiAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScgJiYgY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgICAgY29uc3QgaG9zdFBlcm1pc3Npb25zID0gbmV3IFNldDxzdHJpbmc+KG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMgPz8gW10pO1xuICAgICAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgICAgIHNjcmlwdC5vcHRpb25zLm1hdGNoZXMuZm9yRWFjaCgobWF0Y2hQYXR0ZXJuKSA9PiB7XG4gICAgICAgICAgaG9zdFBlcm1pc3Npb25zLmFkZChtYXRjaFBhdHRlcm4pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaG9zdFBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+XG4gICAgICAgIGFkZEhvc3RQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhc2hUb0VudHJ5cG9pbnRzTWFwID0gY29udGVudFNjcmlwdHMucmVkdWNlKChtYXAsIHNjcmlwdCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoID0gSlNPTi5zdHJpbmdpZnkoc2NyaXB0Lm9wdGlvbnMpO1xuICAgICAgICBpZiAobWFwLmhhcyhoYXNoKSkgbWFwLmdldChoYXNoKT8ucHVzaChzY3JpcHQpO1xuICAgICAgICBlbHNlIG1hcC5zZXQoaGFzaCwgW3NjcmlwdF0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W10+KCkpO1xuXG4gICAgICBtYW5pZmVzdC5jb250ZW50X3NjcmlwdHMgPSBBcnJheS5mcm9tKGhhc2hUb0VudHJ5cG9pbnRzTWFwLmVudHJpZXMoKSkubWFwKFxuICAgICAgICAoWywgc2NyaXB0c10pID0+ICh7XG4gICAgICAgICAgLi4uc2NyaXB0c1swXS5vcHRpb25zLFxuICAgICAgICAgIC8vIFRPT0Q6IFNvcnRpbmcgY3NzIGFuZCBqcyBhcnJheXMgaGVyZSBzbyB3ZSBnZXQgY29uc2lzdGVudCB0ZXN0IHJlc3VsdHMuLi4gYnV0IHdlXG4gICAgICAgICAgLy8gc2hvdWxkbid0IGhhdmUgdG8uIFdoZXJlIGlzIHRoZSBpbmNvbnNpc3RlbmN5IGNvbWluZyBmcm9tP1xuICAgICAgICAgIGNzczogZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKHNjcmlwdHMsIGJ1aWxkT3V0cHV0KT8uc29ydCgpLFxuICAgICAgICAgIGpzOiBzY3JpcHRzXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICAgICAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zb3J0KCksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGV2TW9kZUNzcChcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdm9pZCB7XG4gIGNvbnN0IHBlcm1pc3Npb24gPSBgaHR0cDovLyR7Y29uZmlnLnNlcnZlcj8uaG9zdG5hbWUgPz8gJyd9LypgO1xuICBjb25zdCBhbGxvd2VkQ3NwID0gY29uZmlnLnNlcnZlcj8ub3JpZ2luID8/ICdodHRwOi8vbG9jYWxob3N0OionO1xuXG4gIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgYWRkSG9zdFBlcm1pc3Npb24obWFuaWZlc3QsIHBlcm1pc3Npb24pO1xuICB9IGVsc2Uge1xuICAgIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsIHBlcm1pc3Npb24pO1xuICB9XG5cbiAgY29uc3QgY3NwID0gbmV3IENvbnRlbnRTZWN1cml0eVBvbGljeShcbiAgICBtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzXG4gICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3I6IGV4dGVuc2lvbl9wYWdlcyBpcyBub3QgdHlwZWRcbiAgICAgICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3k/LmV4dGVuc2lvbl9wYWdlcyA/P1xuICAgICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnICd3YXNtLXVuc2FmZS1ldmFsJzsgb2JqZWN0LXNyYyAnc2VsZic7XCIgLy8gZGVmYXVsdCBDU1AgZm9yIE1WM1xuICAgICAgOiBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA/P1xuICAgICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnOyBvYmplY3Qtc3JjICdzZWxmJztcIiwgLy8gZGVmYXVsdCBDU1AgZm9yIE1WMlxuICApO1xuXG4gIGlmIChjb25maWcuc2VydmVyKSBjc3AuYWRkKCdzY3JpcHQtc3JjJywgYWxsb3dlZENzcCk7XG5cbiAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA/Pz0ge307XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogZXh0ZW5zaW9uX3BhZ2VzIGlzIG5vdCB0eXBlZFxuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmV4dGVuc2lvbl9wYWdlcyA9IGNzcC50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID0gY3NwLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGV2TW9kZVBlcm1pc3Npb25zKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgLy8gRm9yIHJlbG9hZGluZyB0aGUgcGFnZVxuICBhZGRQZXJtaXNzaW9uKG1hbmlmZXN0LCAndGFicycpO1xuXG4gIC8vIEZvciByZWdpc3RlcmluZyBjb250ZW50IHNjcmlwdHNcbiAgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsICdzY3JpcHRpbmcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBidW5kbGUgcGF0aHMgdG8gQ1NTIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBhIGxpc3Qgb2YgY29udGVudCBzY3JpcHRzLCBvciB1bmRlZmluZWQgaWZcbiAqIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgQ1NTLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKFxuICBjb250ZW50U2NyaXB0czogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXSxcbiAgYnVpbGRPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+LFxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBjc3M6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgYWxsQ2h1bmtzID0gYnVpbGRPdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5jaHVua3MpO1xuXG4gIGNvbnRlbnRTY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgIC8vIFRPRE86IG9wdGltaXplIGFuZCByZW1vdmUgbG9vcCB3aXRoIGEgbWFwXG4gICAgY29uc3QgcmVsYXRlZENzcyA9IGFsbENodW5rcy5maW5kKFxuICAgICAgKGNodW5rKSA9PiBjaHVuay5maWxlTmFtZSA9PT0gYGFzc2V0cy8ke3NjcmlwdC5uYW1lfS5jc3NgLFxuICAgICk7XG4gICAgaWYgKHJlbGF0ZWRDc3MpIGNzcy5wdXNoKHJlbGF0ZWRDc3MuZmlsZU5hbWUpO1xuICB9KTtcblxuICBpZiAoY3NzLmxlbmd0aCA+IDApIHJldHVybiBjc3M7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZFBlcm1pc3Npb24oXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgcGVybWlzc2lvbjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIG1hbmlmZXN0LnBlcm1pc3Npb25zID8/PSBbXTtcbiAgaWYgKG1hbmlmZXN0LnBlcm1pc3Npb25zLmluY2x1ZGVzKHBlcm1pc3Npb24pKSByZXR1cm47XG4gIG1hbmlmZXN0LnBlcm1pc3Npb25zLnB1c2gocGVybWlzc2lvbik7XG59XG5cbmZ1bmN0aW9uIGFkZEhvc3RQZXJtaXNzaW9uKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGhvc3RQZXJtaXNzaW9uOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgbWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucyA/Pz0gW107XG4gIGlmIChtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zLmluY2x1ZGVzKGhvc3RQZXJtaXNzaW9uKSkgcmV0dXJuO1xuICBtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zLnB1c2goaG9zdFBlcm1pc3Npb24pO1xufVxuIiwgIi8qKlxuICogRGlyZWN0aXZlIG5hbWVzIHRoYXQgbWFrZSB1cCBDU1BzLiBUaGVyZSBhcmUgbW9yZSwgdGhpcyBpcyBhbGwgSSBuZWVkIGZvciB0aGUgcGx1Z2luLlxuICovXG5leHBvcnQgdHlwZSBDc3BEaXJlY3RpdmUgPSAnZGVmYXVsdC1zcmMnIHwgJ3NjcmlwdC1zcmMnIHwgJ29iamVjdC1zcmMnO1xuXG5leHBvcnQgY2xhc3MgQ29udGVudFNlY3VyaXR5UG9saWN5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgRElSRUNUSVZFX09SREVSOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCB1bmRlZmluZWQ+ID0ge1xuICAgICdkZWZhdWx0LXNyYyc6IDAsXG4gICAgJ3NjcmlwdC1zcmMnOiAxLFxuICAgICdvYmplY3Qtc3JjJzogMixcbiAgfTtcblxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbiAgY29uc3RydWN0b3IoY3NwPzogc3RyaW5nKSB7XG4gICAgaWYgKGNzcCkge1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjc3Auc3BsaXQoJzsnKS5tYXAoKHNlY3Rpb24pID0+IHNlY3Rpb24udHJpbSgpKTtcbiAgICAgIHRoaXMuZGF0YSA9IHNlY3Rpb25zLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KChkYXRhLCBzZWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnZhbHVlc10gPSBzZWN0aW9uLnNwbGl0KCcgJykubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgICAgIGlmIChrZXkpIGRhdGFba2V5XSA9IHZhbHVlcztcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSBzZXQgb2YgdmFsdWVzIGFyZSBsaXN0ZWQgdW5kZXIgYSBkaXJlY3RpdmUuXG4gICAqL1xuICBhZGQoZGlyZWN0aXZlOiBDc3BEaXJlY3RpdmUsIC4uLm5ld1ZhbHVlczogc3RyaW5nW10pOiBDb250ZW50U2VjdXJpdHlQb2xpY3kge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZGF0YVtkaXJlY3RpdmVdID8/IFtdO1xuICAgIG5ld1ZhbHVlcy5mb3JFYWNoKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZXMuaW5jbHVkZXMobmV3VmFsdWUpKSB2YWx1ZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5kYXRhW2RpcmVjdGl2ZV0gPSB2YWx1ZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpcmVjdGl2ZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLmRhdGEpLnNvcnQoKFtsXSwgW3JdKSA9PiB7XG4gICAgICBjb25zdCBsbyA9IENvbnRlbnRTZWN1cml0eVBvbGljeS5ESVJFQ1RJVkVfT1JERVJbbF0gPz8gMjtcbiAgICAgIGNvbnN0IHJvID0gQ29udGVudFNlY3VyaXR5UG9saWN5LkRJUkVDVElWRV9PUkRFUltyXSA/PyAyO1xuICAgICAgcmV0dXJuIGxvIC0gcm87XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKChlbnRyeSkgPT4gZW50cnkuZmxhdCgpLmpvaW4oJyAnKSkuam9pbignOyAnKSArICc7JztcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZEVudHJ5cG9pbnRzIH0gZnJvbSAnLi9idWlsZC9idWlsZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGZpbmRFbnRyeXBvaW50cyB9IGZyb20gJy4vYnVpbGQvZmluZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdlbmVyYXRlVHlwZXNEaXIgfSBmcm9tICcuL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXInO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNYWluZmVzdCwgd3JpdGVNYW5pZmVzdCB9IGZyb20gJy4vdXRpbHMvbWFuaWZlc3QnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBncm91cEVudHJ5cG9pbnRzIH0gZnJvbSAnLi91dGlscy9ncm91cEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi91dGlscy9mb3JtYXREdXJhdGlvbic7XG5pbXBvcnQgeyBwcmludEJ1aWxkU3VtbWFyeSB9IGZyb20gJy4vbG9nL3ByaW50QnVpbGRTdW1tYXJ5JztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGV4dGVuc2lvbiBiYXNlZCBvbiBhbiBpbnRlcm5hbCBjb25maWcuXG4gKlxuICogVGhpcyBmdW5jdGlvbjpcbiAqIDEuIENsZWFucyB0aGUgb3V0cHV0IGRpcmVjdG9yeVxuICogMi4gRXhlY3V0ZXMgdGhlIHJlYnVpbGQgZnVuY3Rpb24gd2l0aCBhIGJsYW5rIHByZXZpb3VzIG91dHB1dCBzbyBldmVyeXRoaW5nIGlzIGJ1aWx0IChzZWVcbiAqICAgIGByZWJ1aWxkYCBmb3IgbW9yZSBkZXRhaWxzKVxuICogMy4gUHJpbnRzIHRoZSBzdW1tYXJ5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEludGVybmFsKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZE91dHB1dD4ge1xuICBjb25zdCB2ZXJiID0gY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScgPyAnUHJlLXJlbmRlcmluZycgOiAnQnVpbGRpbmcnO1xuICBjb25zdCB0YXJnZXQgPSBgJHtjb25maWcuYnJvd3Nlcn0tbXYke2NvbmZpZy5tYW5pZmVzdFZlcnNpb259YDtcbiAgY29uZmlnLmxvZ2dlci5pbmZvKFxuICAgIGAke3ZlcmJ9ICR7cGMuY3lhbih0YXJnZXQpfSBmb3IgJHtwYy5jeWFuKGNvbmZpZy5tb2RlKX0gd2l0aCAke3BjLmdyZWVuKFxuICAgICAgYFZpdGUgJHt2aXRlLnZlcnNpb259YCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgLy8gQ2xlYW51cFxuICBhd2FpdCBmcy5ybShjb25maWcub3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcub3V0RGlyKTtcblxuICBjb25zdCBlbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBjb25zdCBncm91cHMgPSBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzKTtcbiAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHJlYnVpbGQoY29uZmlnLCBncm91cHMpO1xuXG4gIC8vIFBvc3QtYnVpbGRcbiAgY29uZmlnLmxvZ2dlci5zdWNjZXNzKFxuICAgIGBCdWlsdCBleHRlbnNpb24gaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICApO1xuICBhd2FpdCBwcmludEJ1aWxkU3VtbWFyeShvdXRwdXQsIGNvbmZpZyk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGxpc3Qgb2YgZW50cnlwb2ludHMsIGFuZCBhbiBleGlzdGluZywgcGFydGlhbCBvdXRwdXQsIGJ1aWxkIHRoZVxuICogZW50cnlwb2ludHMgYW5kIG1lcmdlIHRoZSBuZXcgb3V0cHV0IHdpdGggdGhlIGV4aXN0aW5nIG91dHB1dC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGw6XG4gKiAxLiBHZW5lcmF0ZSB0aGUgLnd4dCBkaXJlY3RvcnkncyB0eXBlc1xuICogMi4gQnVpbGQgdGhlIGBlbnRyeXBvaW50R3JvdXBzYCAoYW5kIGNvcGllcyBwdWJsaWMgZmlsZXMpXG4gKiAzLiBHZW5lcmF0ZSB0aGUgbGF0ZXN0IG1hbmlmZXN0IGZvciBhbGwgZW50cnlwb2ludHNcbiAqIDQuIFdyaXRlIHRoZSBuZXcgbWFuaWZlc3QgdG8gdGhlIGZpbGUgc3lzdGVtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50R3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgZXhpc3RpbmdPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+ID0ge1xuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9LFxuKTogUHJvbWlzZTx7IG91dHB1dDogQnVpbGRPdXRwdXQ7IG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCB9PiB7XG4gIC8vIFVwZGF0ZSB0eXBlcyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgYW5kIHR5cGVzXG4gIGNvbnN0IGFsbEVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoYWxsRW50cnlwb2ludHMsIGNvbmZpZyk7XG5cbiAgLy8gQnVpbGQgYW5kIG1lcmdlIHRoZSBvdXRwdXRzXG4gIGNvbnN0IG5ld091dHB1dCA9IGF3YWl0IGJ1aWxkRW50cnlwb2ludHMoZW50cnlwb2ludEdyb3VwcywgY29uZmlnKTtcbiAgY29uc3QgbWVyZ2VkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5uZXdPdXRwdXQuc3RlcHNdLFxuICAgIHB1YmxpY0Fzc2V0czogWy4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cywgLi4ubmV3T3V0cHV0LnB1YmxpY0Fzc2V0c10sXG4gIH07XG5cbiAgY29uc3QgbmV3TWFuaWZlc3QgPSBhd2FpdCBnZW5lcmF0ZU1haW5mZXN0KFxuICAgIGFsbEVudHJ5cG9pbnRzLFxuICAgIG1lcmdlZE91dHB1dCxcbiAgICBjb25maWcsXG4gICk7XG4gIGNvbnN0IGZpbmFsT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgLi4ubmV3T3V0cHV0LFxuICB9O1xuXG4gIC8vIFdyaXRlIG1hbmlmZXN0XG4gIGF3YWl0IHdyaXRlTWFuaWZlc3QobmV3TWFuaWZlc3QsIGZpbmFsT3V0cHV0LCBjb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgb3V0cHV0OiB7XG4gICAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5maW5hbE91dHB1dC5zdGVwc10sXG4gICAgICBwdWJsaWNBc3NldHM6IFtcbiAgICAgICAgLi4uZXhpc3RpbmdPdXRwdXQucHVibGljQXNzZXRzLFxuICAgICAgICAuLi5maW5hbE91dHB1dC5wdWJsaWNBc3NldHMsXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRW50cnlwb2ludHMgY2FuIGJlIGJ1aWxkIGluIGdyb3Vwcy4gSFRNTCBwYWdlcyBjYW4gYWxsIGJlIGJ1aWx0IHRvZ2V0aGVyIGluIGEgc2luZ2xlIHN0ZXAsIHdoaWxlXG4gKiBjb250ZW50IHNjcmlwdHMgbXVzdCBiZSBidWlsZCBpbmRpdmlkdWFsbHkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbnRyeXBvaW50cyBwdXQgaW50byB0aGVzZSB0eXBlcyBvZiBncm91cHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10pOiBFbnRyeXBvaW50R3JvdXBbXSB7XG4gIGNvbnN0IGdyb3VwSW5kZXhNYXA6IFBhcnRpYWw8UmVjb3JkPEdyb3VwLCBudW1iZXI+PiA9IHt9O1xuICBjb25zdCBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyeXBvaW50cykge1xuICAgIGNvbnN0IGdyb3VwID0gRU5UUllfVFlQRV9UT19HUk9VUF9NQVBbZW50cnkudHlwZV07XG4gICAgaWYgKGdyb3VwID09PSAnbm8tZ3JvdXAnKSB7XG4gICAgICBncm91cHMucHVzaChlbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBncm91cEluZGV4ID0gZ3JvdXBJbmRleE1hcFtncm91cF07XG4gICAgICBpZiAoZ3JvdXBJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGdyb3VwSW5kZXggPSBncm91cHMucHVzaChbXSkgLSAxO1xuICAgICAgICBncm91cEluZGV4TWFwW2dyb3VwXSA9IGdyb3VwSW5kZXg7XG4gICAgICB9XG4gICAgICAoZ3JvdXBzW2dyb3VwSW5kZXhdIGFzIEVudHJ5cG9pbnRbXSkucHVzaChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuY29uc3QgRU5UUllfVFlQRV9UT19HUk9VUF9NQVA6IFJlY29yZDxFbnRyeXBvaW50Wyd0eXBlJ10sIEdyb3VwPiA9IHtcbiAgc2FuZGJveDogJ3NhbmRib3gtcGFnZScsXG5cbiAgcG9wdXA6ICdleHRlbnNpb24tcGFnZScsXG4gIG5ld3RhYjogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgaGlzdG9yeTogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgb3B0aW9uczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgZGV2dG9vbHM6ICdleHRlbnNpb24tcGFnZScsXG4gIGJvb2ttYXJrczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgc2lkZXBhbmVsOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICAndW5saXN0ZWQtcGFnZSc6ICdleHRlbnNpb24tcGFnZScsXG5cbiAgYmFja2dyb3VuZDogJ25vLWdyb3VwJyxcbiAgJ2NvbnRlbnQtc2NyaXB0JzogJ25vLWdyb3VwJyxcbiAgJ3VubGlzdGVkLXNjcmlwdCc6ICduby1ncm91cCcsXG59O1xuXG50eXBlIEdyb3VwID0gJ2V4dGVuc2lvbi1wYWdlJyB8ICdzYW5kYm94LXBhZ2UnIHwgJ25vLWdyb3VwJztcbiIsICJleHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkdXJhdGlvbiA8IDFlMykgcmV0dXJuIGAke2R1cmF0aW9ufSBtc2A7XG4gIGlmIChkdXJhdGlvbiA8IDEwZTMpIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMyl9IHNgO1xuICBpZiAoZHVyYXRpb24gPCA2MGUzKSByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDEpfSBzYDtcbiAgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgwKX0gc2A7XG59XG4iLCAiaW1wb3J0IHBhdGgsIHsgZXh0bmFtZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByaW50VGFibGUgfSBmcm9tICcuL3ByaW50VGFibGUnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJpbnRCdWlsZFN1bW1hcnkoXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgY2h1bmtzID0gW1xuICAgIC4uLm91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyksXG4gICAgLi4ub3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgXS5zb3J0KChsLCByKSA9PiB7XG4gICAgY29uc3QgbFdlaWdodCA9XG4gICAgICBDSFVOS19TT1JUX1dFSUdIVFNbbC5maWxlTmFtZV0gPz9cbiAgICAgIENIVU5LX1NPUlRfV0VJR0hUU1tleHRuYW1lKGwuZmlsZU5hbWUpXSA/P1xuICAgICAgREVGQVVMVF9TT1JUX1dFSUdIVDtcbiAgICBjb25zdCByV2VpZ2h0ID1cbiAgICAgIENIVU5LX1NPUlRfV0VJR0hUU1tyLmZpbGVOYW1lXSA/P1xuICAgICAgQ0hVTktfU09SVF9XRUlHSFRTW2V4dG5hbWUoci5maWxlTmFtZSldID8/XG4gICAgICBERUZBVUxUX1NPUlRfV0VJR0hUO1xuICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgcmV0dXJuIGwuZmlsZU5hbWUubG9jYWxlQ29tcGFyZShyLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgY29uc3QgY2h1bmtSb3dzOiBzdHJpbmdbXVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBbXG4gICAgICAgIHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXREaXIpICsgcGF0aC5zZXAsXG4gICAgICAgIGNodW5rLmZpbGVOYW1lLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoY2h1bmsuZmlsZU5hbWUpO1xuICAgICAgY29uc3QgcHJlZml4ID0gaSA9PT0gY2h1bmtzLmxlbmd0aCAtIDEgPyAnICBcdTI1MTRcdTI1MDAnIDogJyAgXHUyNTFDXHUyNTAwJztcbiAgICAgIGNvbnN0IGNvbG9yID0gQ0hVTktfQ09MT1JTW2V4dF0gPz8gREVGQVVMVF9DT0xPUjtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMubHN0YXQocmVzb2x2ZShjb25maWcub3V0RGlyLCBjaHVuay5maWxlTmFtZSkpO1xuICAgICAgdG90YWxTaXplICs9IHN0YXRzLnNpemU7XG4gICAgICBjb25zdCBzaXplID0gU3RyaW5nKGZpbGVzaXplKHN0YXRzLnNpemUpKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGAke3BjLmdyYXkocHJlZml4KX0gJHtwYy5kaW0oZmlsZVswXSl9JHtjb2xvcihmaWxlWzFdKX1gLFxuICAgICAgICBwYy5kaW0oc2l6ZSksXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xuXG4gIHByaW50VGFibGUoY29uZmlnLmxvZ2dlci5sb2csIGNodW5rUm93cyk7XG5cbiAgY29uZmlnLmxvZ2dlci5sb2coXG4gICAgYCR7cGMuY3lhbignXHUwM0EzIFRvdGFsIHNpemU6Jyl9ICR7U3RyaW5nKGZpbGVzaXplKHRvdGFsU2l6ZSkpfWAsXG4gICk7XG59XG5cbmNvbnN0IERFRkFVTFRfU09SVF9XRUlHSFQgPSAxMDA7XG5jb25zdCBDSFVOS19TT1JUX1dFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICdtYW5pZmVzdC5qc29uJzogMCxcbiAgJy5odG1sJzogMSxcbiAgJy5qcyc6IDIsXG4gICcuY3NzJzogMyxcbn07XG5cbmNvbnN0IERFRkFVTFRfQ09MT1IgPSBwYy5ibHVlO1xuY29uc3QgQ0hVTktfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodGV4dDogc3RyaW5nKSA9PiBzdHJpbmc+ID0ge1xuICAnLmh0bWwnOiBwYy5ncmVlbixcbiAgJy5jc3MnOiBwYy5tYWdlbnRhLFxuICAnLmpzJzogcGMuY3lhbixcbn07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHByaW50VGFibGUoXG4gIGxvZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZCxcbiAgcm93czogc3RyaW5nW11bXSxcbiAgZ2FwID0gMixcbik6IHZvaWQge1xuICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBjb2x1bW5XaWR0aHMgPSByb3dzLnJlZHVjZShcbiAgICAod2lkdGhzLCByb3cpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5tYXgod2lkdGhzLmxlbmd0aCwgcm93Lmxlbmd0aCk7IGkrKykge1xuICAgICAgICB3aWR0aHNbaV0gPSBNYXRoLm1heChyb3dbaV0/Lmxlbmd0aCA/PyAwLCB3aWR0aHNbaV0gPz8gMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2lkdGhzO1xuICAgIH0sXG4gICAgcm93c1swXS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmxlbmd0aCksXG4gICk7XG5cbiAgbGV0IHN0ciA9ICcnO1xuICByb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChjb2wsIGopID0+IHtcbiAgICAgIHN0ciArPSBjb2wucGFkRW5kKGNvbHVtbldpZHRoc1tqXSwgJyAnKTtcbiAgICAgIGlmIChqICE9PSByb3cubGVuZ3RoIC0gMSkgc3RyICs9ICcnLnBhZEVuZChnYXAsICcgJyk7XG4gICAgfSk7XG4gICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkgc3RyICs9ICdcXG4nO1xuICB9KTtcblxuICBsb2coc3RyKTtcbn1cbiIsICJpbXBvcnQge1xuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIFd4dERldlNlcnZlcixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgZmluZE9wZW5Qb3J0IH0gZnJvbSAnLi91dGlscy9maW5kT3BlblBvcnQnO1xuaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyB9IGZyb20gJy4vdXRpbHMvbWFuaWZlc3QnO1xuaW1wb3J0IHsgY3JlYXRlV2ViRXh0UnVubmVyIH0gZnJvbSAnLi9ydW5uZXJzL2NyZWF0ZVdlYkV4dFJ1bm5lcic7XG5pbXBvcnQgeyBidWlsZEludGVybmFsIH0gZnJvbSAnLi9idWlsZCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTZXJ2ZXJJbmZvKCk6IFByb21pc2U8U2VydmVySW5mbz4ge1xuICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZE9wZW5Qb3J0KDMwMDAsIDMwMTApO1xuICBjb25zdCBob3N0bmFtZSA9ICdsb2NhbGhvc3QnO1xuICBjb25zdCBvcmlnaW4gPSBgaHR0cDovLyR7aG9zdG5hbWV9OiR7cG9ydH1gO1xuICBjb25zdCBzZXJ2ZXJDb25maWc6IHZpdGUuSW5saW5lQ29uZmlnID0ge1xuICAgIHNlcnZlcjoge1xuICAgICAgb3JpZ2luLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwb3J0LFxuICAgIGhvc3RuYW1lLFxuICAgIG9yaWdpbixcbiAgICB2aXRlU2VydmVyQ29uZmlnOiBzZXJ2ZXJDb25maWcsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlcnZlcihcbiAgc2VydmVySW5mbzogU2VydmVySW5mbyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8V3h0RGV2U2VydmVyPiB7XG4gIGNvbnN0IHJ1bm5lciA9IGNyZWF0ZVdlYkV4dFJ1bm5lcigpO1xuXG4gIGNvbnN0IHZpdGVTZXJ2ZXIgPSBhd2FpdCB2aXRlLmNyZWF0ZVNlcnZlcihcbiAgICB2aXRlLm1lcmdlQ29uZmlnKHNlcnZlckluZm8sIGNvbmZpZy52aXRlKSxcbiAgKTtcblxuICBjb25zdCBzdGFydCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB2aXRlU2VydmVyLmxpc3RlbihzZXJ2ZXIucG9ydCk7XG4gICAgY29uZmlnLmxvZ2dlci5zdWNjZXNzKGBTdGFydGVkIGRldiBzZXJ2ZXIgQCAke3NlcnZlckluZm8ub3JpZ2lufWApO1xuXG4gICAgc2VydmVyLmN1cnJlbnRPdXRwdXQgPSBhd2FpdCBidWlsZEludGVybmFsKGNvbmZpZyk7XG4gICAgY29uZmlnLmxvZ2dlci5pbmZvKCdPcGVuaW5nIGJyb3dzZXIuLi4nKTtcbiAgICBhd2FpdCBydW5uZXIub3BlbkJyb3dzZXIoY29uZmlnKTtcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoJ09wZW5lZCEnKTtcbiAgfTtcblxuICBjb25zdCByZWxvYWRFeHRlbnNpb24gPSAoKSA9PiB7XG4gICAgdml0ZVNlcnZlci53cy5zZW5kKCd3eHQ6cmVsb2FkLWV4dGVuc2lvbicpO1xuICB9O1xuICBjb25zdCByZWxvYWRQYWdlID0gKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIC8vIENhbid0IHVzZSBWaXRlJ3MgYnVpbHQtaW4gXCJmdWxsLXJlbG9hZFwiIGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndCBsaWtlIG91ciBwYXRocywgaXQgZXhwZWN0c1xuICAgIC8vIHBhdGhzIGVuZGluZyBpbiBcIi9pbmRleC5odG1sXCJcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtcGFnZScsIHBhdGgpO1xuICB9O1xuICBjb25zdCByZWxvYWRDb250ZW50U2NyaXB0ID0gKGNvbnRlbnRTY3JpcHQ6IE1hbmlmZXN0LkNvbnRlbnRTY3JpcHQpID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtY29udGVudC1zY3JpcHQnLCBjb250ZW50U2NyaXB0KTtcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXI6IFd4dERldlNlcnZlciA9IHtcbiAgICAuLi52aXRlU2VydmVyLFxuICAgIHN0YXJ0LFxuICAgIGN1cnJlbnRPdXRwdXQ6IHtcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIG1hbmlmZXN0X3ZlcnNpb246IDMsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICB2ZXJzaW9uOiAnJyxcbiAgICAgIH0sXG4gICAgICBwdWJsaWNBc3NldHM6IFtdLFxuICAgICAgc3RlcHM6IFtdLFxuICAgIH0sXG4gICAgcG9ydDogc2VydmVySW5mby5wb3J0LFxuICAgIGhvc3RuYW1lOiBzZXJ2ZXJJbmZvLmhvc3RuYW1lLFxuICAgIG9yaWdpbjogc2VydmVySW5mby5vcmlnaW4sXG4gICAgcmVsb2FkRXh0ZW5zaW9uLFxuICAgIHJlbG9hZFBhZ2UsXG4gICAgcmVsb2FkQ29udGVudFNjcmlwdCxcbiAgfTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG4vKipcbiAqIEZyb20gdGhlIHNlcnZlciwgdGVsbCB0aGUgY2xpZW50IHRvIHJlbG9hZCBjb250ZW50IHNjcmlwdHMgZnJvbSB0aGUgcHJvdmlkZWQgYnVpbGQgc3RlcCBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkQ29udGVudFNjcmlwdHMoXG4gIHN0ZXBzOiBCdWlsZFN0ZXBPdXRwdXRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgc2VydmVyOiBXeHREZXZTZXJ2ZXIsXG4pIHtcbiAgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHN0ZXAuZW50cnlwb2ludHM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgZW50cnkudHlwZSAhPT0gJ2NvbnRlbnQtc2NyaXB0JykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBqcyA9IFtnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5qcycpXTtcbiAgICAgIGNvbnN0IGNzcyA9IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhbZW50cnldLCBzZXJ2ZXIuY3VycmVudE91dHB1dCk7XG5cbiAgICAgIHNlcnZlci5yZWxvYWRDb250ZW50U2NyaXB0KHtcbiAgICAgICAganMsXG4gICAgICAgIGNzcyxcbiAgICAgICAgLi4uZW50cnkub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlcnZlci5yZWxvYWRFeHRlbnNpb24oKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSHRtbFBhZ2VzKFxuICBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdLFxuICBzZXJ2ZXI6IFd4dERldlNlcnZlcixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbikge1xuICBncm91cHMuZmxhdCgpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmh0bWwnKTtcbiAgICBzZXJ2ZXIucmVsb2FkUGFnZShwYXRoKTtcbiAgfSk7XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJJbmZvIHtcbiAgcG9ydDogbnVtYmVyO1xuICBob3N0bmFtZTogc3RyaW5nO1xuICBvcmlnaW46IHN0cmluZztcbiAgdml0ZVNlcnZlckNvbmZpZzogdml0ZS5JbmxpbmVDb25maWc7XG59XG4iLCAiaW1wb3J0IG5ldCBmcm9tICdub2RlOm5ldCc7XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IG9wZW4gcG9ydCBpbiBhIHJhbmdlIG9mIHBvcnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE9wZW5Qb3J0KFxuICBzdGFydFBvcnQ6IG51bWJlcixcbiAgZW5kUG9ydDogbnVtYmVyLFxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIGZpbmRPcGVuUG9ydFJlY3Vyc2l2ZShzdGFydFBvcnQsIHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRPcGVuUG9ydFJlY3Vyc2l2ZShcbiAgcG9ydDogbnVtYmVyLFxuICBzdGFydFBvcnQ6IG51bWJlcixcbiAgZW5kUG9ydDogbnVtYmVyLFxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAocG9ydCA+IGVuZFBvcnQpXG4gICAgICByZXR1cm4gcmVqZWN0KFxuICAgICAgICBFcnJvcihgQ291bGQgbm90IGZpbmQgb3BlbiBwb3J0IGJldHdlZW4gJHtzdGFydFBvcnR9LSR7ZW5kUG9ydH1gKSxcbiAgICAgICk7XG4gICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIub25jZSgnY2xvc2UnLCAoKSA9PiByZXNvbHZlKHBvcnQpKTtcbiAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuICAgIHNlcnZlci5vbignZXJyb3InLCAoKSA9PlxuICAgICAgcmVzb2x2ZShmaW5kT3BlblBvcnRSZWN1cnNpdmUocG9ydCArIDEsIHN0YXJ0UG9ydCwgZW5kUG9ydCkpLFxuICAgICk7XG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgV2ViRXh0UnVuSW5zdGFuY2UgfSBmcm9tICd3ZWItZXh0JztcbmltcG9ydCB7IEV4dGVuc2lvblJ1bm5lciB9IGZyb20gJy4vRXh0ZW5zaW9uUnVubmVyJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gYEV4dGVuc2lvblJ1bm5lcmAgYmFja2VkIGJ5IGB3ZWItZXh0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYkV4dFJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICBsZXQgcnVubmVyOiBXZWJFeHRSdW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnc2FmYXJpJykge1xuICAgICAgICBjb25maWcubG9nZ2VyLndhcm4oJ0Nhbm5vdCBvcGVuIHNhZmFyaSBhdXRvbWF0aWNhbGx5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGUgcGx1Z2luJ3MgbG9nZ2VyIGluc3RlYWQgb2Ygd2ViLWV4dCdzIGJ1aWx0LWluIG9uZS5cbiAgICAgIGNvbnN0IHdlYkV4dExvZ2dlciA9IGF3YWl0IGltcG9ydCgnd2ViLWV4dC91dGlsL2xvZ2dlcicpO1xuICAgICAgd2ViRXh0TG9nZ2VyLmNvbnNvbGVTdHJlYW0ud3JpdGUgPSAoeyBsZXZlbCwgbXNnLCBuYW1lIH0pID0+IHtcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SX0xPR19MRVZFTCkgY29uZmlnLmxvZ2dlci5lcnJvcihuYW1lLCBtc2cpO1xuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTl9MT0dfTEVWRUwpIGNvbmZpZy5sb2dnZXIud2Fybihtc2cpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd3h0VXNlckNvbmZpZyA9IGNvbmZpZy5ydW5uZXJDb25maWcuY29uZmlnO1xuICAgICAgY29uc3QgdXNlckNvbmZpZyA9IHtcbiAgICAgICAgY29uc29sZTogd3h0VXNlckNvbmZpZz8ub3BlbkNvbnNvbGUsXG4gICAgICAgIGRldnRvb2xzOiB3eHRVc2VyQ29uZmlnPy5vcGVuRGV2dG9vbHMsXG4gICAgICAgIHN0YXJ0VXJsOiB3eHRVc2VyQ29uZmlnPy5zdGFydFVybHMsXG4gICAgICAgIC4uLihjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZpcmVmb3g6IHd4dFVzZXJDb25maWc/LmJpbmFyaWVzPy5maXJlZm94LFxuICAgICAgICAgICAgICBmaXJlZm94UHJvZmlsZTogd3h0VXNlckNvbmZpZz8uZmlyZWZveFByb2ZpbGUsXG4gICAgICAgICAgICAgIHByZWZzOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94UHJlZnMsXG4gICAgICAgICAgICAgIGFyZ3M6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hBcmdzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaHJvbWl1bUJpbmFyeTogd3h0VXNlckNvbmZpZz8uYmluYXJpZXM/Lltjb25maWcuYnJvd3Nlcl0sXG4gICAgICAgICAgICAgIGNocm9taXVtUHJvZmlsZTogd3h0VXNlckNvbmZpZz8uY2hyb21pdW1Qcm9maWxlLFxuICAgICAgICAgICAgICBhcmdzOiB3eHRVc2VyQ29uZmlnPy5jaHJvbWl1bUFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsQ29uZmlnID0ge1xuICAgICAgICAuLi51c2VyQ29uZmlnLFxuICAgICAgICB0YXJnZXQ6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyAnZmlyZWZveC1kZXNrdG9wJyA6ICdjaHJvbWl1bScsXG4gICAgICAgIHNvdXJjZURpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgLy8gV1hUIGhhbmRsZXMgcmVsb2Fkcywgc28gZGlzYWJsZSBhdXRvLXJlbG9hZCBiZWhhdmlvcnMgaW4gd2ViLWV4dFxuICAgICAgICBub1JlbG9hZDogdHJ1ZSxcbiAgICAgICAgbm9JbnB1dDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAvLyBEb24ndCBjYWxsIGBwcm9jZXNzLmV4aXQoMClgIGFmdGVyIHN0YXJ0aW5nIHdlYi1leHRcbiAgICAgICAgc2hvdWxkRXhpdFByb2dyYW06IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgY29uZmlnOicsIGZpbmFsQ29uZmlnKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgb3B0aW9uczonLCBvcHRpb25zKTtcblxuICAgICAgY29uc3Qgd2ViRXh0ID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0Jyk7XG4gICAgICBydW5uZXIgPSBhd2FpdCB3ZWJFeHQuZGVmYXVsdC5jbWQucnVuKGZpbmFsQ29uZmlnLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5lcj8uZXhpdCgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYi1leHQvYmxvYi9lMzdlNjBhMjczODQ3OGY1MTJmMTI1NWM1MzcxMzMzMjFmMzAxNzcxL3NyYy91dGlsL2xvZ2dlci5qcyNMMTJcbmNvbnN0IFdBUk5fTE9HX0xFVkVMID0gNDA7XG5jb25zdCBFUlJPUl9MT0dfTEVWRUwgPSA1MDtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBwcmludEhlYWRlciB9IGZyb20gJy4uLy4uL2NvcmUvbG9nL3ByaW50SGVhZGVyJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9mb3JtYXREdXJhdGlvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb21tYW5kPFRBcmdzIGV4dGVuZHMgYW55W10+KFxuICBjYjogKC4uLmFyZ3M6IFRBcmdzKSA9PiB2b2lkIHwgYm9vbGVhbiB8IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+LFxuKSB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogVEFyZ3MpID0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICBwcmludEhlYWRlcigpO1xuXG4gICAgICBjb25zdCBvbmdvaW5nID0gYXdhaXQgY2IoLi4uYXJncyk7XG5cbiAgICAgIGlmICghb25nb2luZylcbiAgICAgICAgY29uc29sYS5zdWNjZXNzKFxuICAgICAgICAgIGBGaW5pc2hlZCBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xhLmZhaWwoXG4gICAgICAgIGBDb21tYW5kIGZhaWxlZCBhZnRlciAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICAgICApO1xuICAgICAgY29uc29sYS5lcnJvcihlcnIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRIZWFkZXIoKSB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGEubG9nKGAke3BjLmdyYXkoJ1dYVCcpfSAke3BjLmdyYXkocGMuYm9sZCh2ZXJzaW9uKSl9YCk7XG59XG4iLCAiaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IG1vZGUgPSBmbGFncy5tb2RlID8/ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuXG4gIGF3YWl0IHd4dC5idWlsZChjbGlDb25maWcpO1xufSk7XG4iLCAiaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IGRldiA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIG1vZGU/OiBzdHJpbmc7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgICBicm93c2VyPzogd3h0LlRhcmdldEJyb3dzZXI7XG4gICAgICBtdjM/OiBib29sZWFuO1xuICAgICAgbXYyPzogYm9vbGVhbjtcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBtb2RlID0gZmxhZ3MubW9kZSA/PyAnZGV2ZWxvcG1lbnQnO1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBtb2RlLFxuICAgIGJyb3dzZXI6IGZsYWdzLmJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uOiBmbGFncy5tdjMgPyAzIDogZmxhZ3MubXYyID8gMiA6IHVuZGVmaW5lZCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG5cbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgd3h0LmNyZWF0ZVNlcnZlcihjbGlDb25maWcpO1xuICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKTtcblxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuIiwgImltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IGluaXQgPSBkZWZpbmVDb21tYW5kPFtkaXJlY3Rvcnk/OiBzdHJpbmddPihhc3luYyAoZGlyZWN0b3J5KSA9PiB7XG4gIGNvbnNvbGEud2Fybignd3h0IGluaXQ6IE5vdCBpbXBsZW1lbnRlZCcpO1xufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnJztcbmltcG9ydCB7IGZpbmRFbnRyeXBvaW50cyB9IGZyb20gJy4uLy4uL2NvcmUvYnVpbGQvZmluZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdlbmVyYXRlVHlwZXNEaXIgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXInO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNvbnN0IHByZXBhcmUgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjbGlDb25maWcsICdidWlsZCcpO1xuXG4gIGNvbmZpZy5sb2dnZXIuaW5mbygnR2VuZXJhdGluZyB0eXBlcy4uLicpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoZW50cnlwb2ludHMsIGNvbmZpZyk7XG59KTtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBwdWJsaXNoID0gZGVmaW5lQ29tbWFuZChcbiAgYXN5bmMgKHJvb3Q6IGFueSwgeyBjb25maWc6IGNvbmZpZ0ZpbGUgfTogYW55KSA9PiB7XG4gICAgY29uc29sYS53YXJuKCd3eHQgcHVibGlzaDogTm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG4pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxpQkFBZ0I7OztBQ0NkLGNBQVc7OztBQ0diLElBQUFBLG9CQUE4QjtBQUM5QixJQUFBQyxRQUFzQjtBQUN0QixJQUFBQyxrQkFBd0I7OztBQ1J4QixxQkFBd0I7QUFDeEIsa0JBQXVC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QixFQUNwQyxPQUFnQkMsTUFBSztBQUd4QixJQUNHLFFBQVEsa0JBQWtCLFNBQVMsRUFDbkMsT0FBTyx1QkFBdUIsMkJBQTJCLEVBQ3pELE9BQWdCLE9BQU87QUFHMUIsSUFBSSxRQUFRLGtCQUFrQixtQkFBbUIsRUFBRSxPQUFnQixPQUFPO0FBRzFFLElBQ0csUUFBUSxvQkFBb0IsMEJBQTBCLEVBQ3RELE9BQWdCLElBQUk7QUFFdkIsSUFBSSxNQUFNOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfbm9kZV9wYXRoIiwgInZpdGUiLCAiaW1wb3J0X2NvbnNvbGEiLCAicGF0aCIsICJ1bmltcG9ydCIsICJmcyIsICJjcmVhdGVKSVRJIiwgInRyYW5zZm9ybSIsICJwYXRoIiwgImltcG9ydF9wYXRoIiwgImlzT2ZmbGluZSIsICJkbnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiZnMiLCAiaW1wb3J0X3VuaW1wb3J0IiwgInVuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJnbG9iIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbGlua2Vkb20iLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJnbG9iIiwgInBhdGgiLCAicGljb21hdGNoIiwgImZzIiwgIkpTT041IiwgImltcG9ydF91bmltcG9ydCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiZnMiLCAidW5pbXBvcnQiLCAicGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiZnMiLCAidmVyc2lvbiIsICJvcHRpb25zIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJwYXRoIiwgImZzIiwgInBjIiwgInBjIiwgImZzIiwgInZpdGUiLCAicmVzb2x2ZSIsICJuZXQiLCAicGF0aCIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAicGF0aCIsICJwYyIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJpbXBvcnRfY29uc29sYSIsICJwYyIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X2NvbnNvbGEiLCAiY2FjIiwgImJ1aWxkIl0KfQo=