@nlabs/lex 1.48.5 → 1.48.7

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.
@@ -1,6 +1,6 @@
1
1
  import { execa } from "execa";
2
2
  import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
3
- import { dirname, resolve as pathResolve } from "path";
3
+ import { dirname, resolve as pathResolve, extname } from "path";
4
4
  import { LexConfig } from "../../LexConfig.js";
5
5
  import { createSpinner } from "../../utils/app.js";
6
6
  import { resolveBinaryPath } from "../../utils/file.js";
@@ -15,17 +15,13 @@ try {
15
15
  currentDirname = process.cwd();
16
16
  }
17
17
  const createDefaultESLintConfig = (useTypescript, cwd) => {
18
- const configPath = pathResolve(cwd, "eslint.config.ts");
19
- let originalConfig;
20
- if (existsSync(configPath)) {
21
- try {
22
- originalConfig = readFileSync(configPath, "utf8");
23
- } catch (_error) {
24
- }
25
- }
18
+ const configPath = pathResolve(cwd, ".lex-temp-default-eslint.cjs");
19
+ const originalConfig = null;
26
20
  const possiblePaths = [
27
- pathResolve(currentDirname, "../../../../eslint.config.ts"),
28
- pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.ts")
21
+ pathResolve(currentDirname, "eslint.config.ts"),
22
+ pathResolve(currentDirname, "eslint.config.js"),
23
+ pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.ts"),
24
+ pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.js")
29
25
  ];
30
26
  let foundConfig = "";
31
27
  for (const path of possiblePaths) {
@@ -34,79 +30,21 @@ const createDefaultESLintConfig = (useTypescript, cwd) => {
34
30
  break;
35
31
  }
36
32
  }
37
- let eslintConfig;
38
- if (foundConfig) {
39
- try {
40
- eslintConfig = readFileSync(foundConfig, "utf8");
41
- } catch (_error) {
42
- eslintConfig = createBasicESLintConfig(useTypescript);
43
- }
44
- } else {
45
- eslintConfig = createBasicESLintConfig(useTypescript);
46
- }
47
- writeFileSync(configPath, eslintConfig, "utf8");
33
+ const configContent = `// Temporary ESLint config generated by Lex
34
+ const lexConfig = require('@nlabs/lex/eslint.config.js');
35
+
36
+ module.exports = lexConfig;`;
37
+ writeFileSync(configPath, configContent, "utf8");
48
38
  return {
49
39
  configPath,
50
40
  originalConfig
51
41
  };
52
42
  };
53
43
  const createBasicESLintConfig = (useTypescript) => {
54
- let config = `// ESLint configuration
55
- import { typescriptConfig } from 'eslint-config-styleguidejs';
56
-
57
- const config = [
58
- {
59
- ignores: ['**/node_modules/**', '**/dist/**', '**/build/**']
60
- },
61
- // Config for JavaScript files
62
- {
63
- files: ['**/*.{js,jsx}'],
64
- languageOptions: {
65
- ecmaVersion: 'latest',
66
- sourceType: 'module'
67
- },
68
- rules: {
69
- 'indent': ['error', 2],
70
- 'quotes': ['error', 'single'],
71
- 'semi': ['error', 'always'],
72
- 'no-unused-vars': ['warn', { 'argsIgnorePattern': '^_', 'varsIgnorePattern': '^_', 'caughtErrors': 'all', 'caughtErrorsIgnorePattern': '^_' }],
73
- 'eqeqeq': ['error', 'always']
74
- }
75
- }`;
76
- if (useTypescript) {
77
- config += `,
78
- // Config for TypeScript files
79
- {
80
- files: ['**/*.{ts,tsx}'],
81
- languageOptions: {
82
- ecmaVersion: 'latest',
83
- sourceType: 'module',
84
- parser: {
85
- importSource: '@typescript-eslint/parser'
86
- },
87
- parserOptions: {
88
- project: getTypeScriptConfigPath('tsconfig.lint.json')
89
- }
90
- },
91
- plugins: {
92
- '@typescript-eslint': {
93
- importSource: '@typescript-eslint/eslint-plugin'
94
- }
95
- },
96
- rules: {
97
- 'indent': ['error', 2],
98
- 'quotes': ['error', 'single'],
99
- 'semi': ['error', 'always'],
100
- 'no-unused-vars': 'off',
101
- '@typescript-eslint/no-unused-vars': ['warn', { 'argsIgnorePattern': '^_', 'varsIgnorePattern': '^_', 'caughtErrors': 'all', 'caughtErrorsIgnorePattern': '^_' }],
102
- 'eqeqeq': ['error', 'always']
103
- }
104
- }`;
105
- }
106
- config += `
107
- ];
44
+ const config = `// ESLint configuration
45
+ import lexConfig from '@nlabs/lex/eslint.config.js';
108
46
 
109
- export default config;`;
47
+ return lexConfig;`;
110
48
  return config;
111
49
  };
112
50
  const detectTypeScript = (cwd) => existsSync(pathResolve(cwd, "tsconfig.json"));
@@ -136,8 +74,11 @@ const runEslintWithLex = async (cwd, quiet, cliName, fix, debug, useTypescript,
136
74
  const projectConfigPath = pathResolve(cwd, "eslint.config.js");
137
75
  const projectConfigPathTs = pathResolve(cwd, "eslint.config.ts");
138
76
  const hasProjectConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs);
77
+ const hasLexConfigEslint = LexConfig.config.eslint && Object.keys(LexConfig.config.eslint).length > 0;
139
78
  const possiblePaths = [
79
+ pathResolve(currentDirname, "../../../../eslint.config.js"),
140
80
  pathResolve(currentDirname, "../../../../eslint.config.ts"),
81
+ pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.js"),
141
82
  pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.ts")
142
83
  ];
143
84
  let lexConfigPath = "";
@@ -147,7 +88,47 @@ const runEslintWithLex = async (cwd, quiet, cliName, fix, debug, useTypescript,
147
88
  break;
148
89
  }
149
90
  }
150
- const configPath = hasProjectConfig ? existsSync(projectConfigPathTs) ? projectConfigPathTs : projectConfigPath : lexConfigPath || projectConfigPath;
91
+ let configPath = "";
92
+ let tempConfigPath = "";
93
+ if (hasProjectConfig) {
94
+ configPath = existsSync(projectConfigPathTs) ? projectConfigPathTs : projectConfigPath;
95
+ if (debug) {
96
+ log(`Using project ESLint config file: ${configPath}`, "info", quiet);
97
+ }
98
+ } else if (hasLexConfigEslint) {
99
+ tempConfigPath = pathResolve(cwd, ".lex-temp-eslint.cjs");
100
+ const configContent = `// Temporary ESLint config generated by Lex
101
+ const lexConfig = require('@nlabs/lex/eslint.config.js');
102
+ const userConfig = ${JSON.stringify(LexConfig.config.eslint, null, 2)};
103
+
104
+ // Merge Lex's config with user config
105
+ module.exports = {
106
+ ...lexConfig
107
+ };`;
108
+ writeFileSync(tempConfigPath, configContent, "utf8");
109
+ configPath = tempConfigPath;
110
+ if (debug) {
111
+ log(`Using ESLint config from lex.config.* file via temp file: ${tempConfigPath}`, "info", quiet);
112
+ }
113
+ } else if (lexConfigPath && existsSync(lexConfigPath)) {
114
+ configPath = lexConfigPath;
115
+ if (debug) {
116
+ log(`Using Lex ESLint config file: ${configPath}`, "info", quiet);
117
+ }
118
+ } else {
119
+ tempConfigPath = pathResolve(cwd, ".lex-temp-default-eslint.cjs");
120
+ const configContent = `// Temporary default ESLint config generated by Lex
121
+ const lexConfig = require('@nlabs/lex/eslint.config.js');
122
+
123
+ module.exports = lexConfig;`;
124
+ writeFileSync(tempConfigPath, configContent, "utf8");
125
+ configPath = tempConfigPath;
126
+ if (debug) {
127
+ log(`Created temporary default ESLint config at: ${tempConfigPath}`, "info", quiet);
128
+ } else {
129
+ log("No ESLint configuration found. Using Lex default configuration.", "info", quiet);
130
+ }
131
+ }
151
132
  const eslintBinary = resolveBinaryPath("eslint", "eslint");
152
133
  if (!eslintBinary) {
153
134
  log(`
@@ -155,13 +136,17 @@ ${cliName} Error: ESLint binary not found in Lex's node_modules`, "error", quiet
155
136
  log("Please reinstall Lex or check your installation.", "info", quiet);
156
137
  return 1;
157
138
  }
158
- const jsResult = await execa(eslintBinary, [
159
- "src/**/*.{js,jsx}",
160
- "--config",
161
- configPath,
139
+ const baseEslintArgs = [
162
140
  ...fix ? ["--fix"] : [],
163
141
  ...debug ? ["--debug"] : [],
164
- "--no-error-on-unmatched-pattern"
142
+ "--no-error-on-unmatched-pattern",
143
+ "--no-warn-ignored"
144
+ ];
145
+ const configArgs = configPath ? ["--config", configPath] : [];
146
+ const jsResult = await execa(eslintBinary, [
147
+ "src/**/*.{js,jsx}",
148
+ ...configArgs,
149
+ ...baseEslintArgs
165
150
  ], {
166
151
  reject: false,
167
152
  stdio: "pipe",
@@ -184,11 +169,8 @@ ${cliName} Error: ESLint binary not found in Lex's node_modules`, "error", quiet
184
169
  if (useTypescript) {
185
170
  tsResult = await execa(eslintBinary, [
186
171
  "src/**/*.{ts,tsx}",
187
- "--config",
188
- configPath,
189
- ...fix ? ["--fix"] : [],
190
- ...debug ? ["--debug"] : [],
191
- "--no-error-on-unmatched-pattern"
172
+ ...configArgs,
173
+ ...baseEslintArgs
192
174
  ], {
193
175
  reject: false,
194
176
  stdio: "pipe",
@@ -202,6 +184,18 @@ ${cliName} Error: ESLint binary not found in Lex's node_modules`, "error", quiet
202
184
  console.error(tsResult.stderr);
203
185
  }
204
186
  }
187
+ if (tempConfigPath && existsSync(tempConfigPath)) {
188
+ try {
189
+ unlinkSync(tempConfigPath);
190
+ if (debug) {
191
+ log(`Removed temporary ESLint config at ${tempConfigPath}`, "info", quiet);
192
+ }
193
+ } catch (error) {
194
+ if (debug) {
195
+ log(`Failed to remove temporary ESLint config: ${error.message}`, "warn", quiet);
196
+ }
197
+ }
198
+ }
205
199
  const eslintNotFound = jsResult.stderr?.includes("command not found") || jsResult.stderr?.includes("eslint: command not found");
206
200
  if (eslintNotFound) {
207
201
  spinner.fail("ESLint not found!");
@@ -662,7 +656,7 @@ const applyDirectFixes = async (filePath, quiet) => {
662
656
  return false;
663
657
  }
664
658
  };
665
- const loadAIConfig = async (cwd, quiet) => {
659
+ const loadAIConfig = async (cwd, quiet, debug = false) => {
666
660
  const configFormats = ["js", "mjs", "cjs", "ts", "json"];
667
661
  const configBaseName = "lex.config";
668
662
  let lexConfigPath = "";
@@ -675,29 +669,191 @@ const loadAIConfig = async (cwd, quiet) => {
675
669
  }
676
670
  if (lexConfigPath) {
677
671
  try {
678
- const lexConfig = await import(lexConfigPath);
679
- if (lexConfig.default && lexConfig.default.ai) {
672
+ const format = extname(lexConfigPath).slice(1);
673
+ let importPath = lexConfigPath;
674
+ if (format === "mjs") {
675
+ try {
676
+ const url = new URL(`file://${lexConfigPath}`);
677
+ importPath = url.href;
678
+ if (debug) {
679
+ log(`Using URL format for MJS import: ${importPath}`, "info", quiet);
680
+ }
681
+ } catch (urlError) {
682
+ log(`Error creating URL for MJS import: ${urlError.message}`, "warn", debug || !quiet);
683
+ importPath = `file://${lexConfigPath}`;
684
+ }
685
+ }
686
+ if (debug) {
687
+ log(`Trying to import config from ${importPath} (format: ${format})`, "info", quiet);
688
+ }
689
+ let lexConfig;
690
+ try {
691
+ lexConfig = await import(importPath);
692
+ } catch (importError) {
693
+ if (importError.message.includes("not defined in ES module scope")) {
694
+ log(`ES Module syntax error in ${lexConfigPath}. Make sure you're using 'export' instead of 'module.exports'.`, "error", quiet);
695
+ if (debug) {
696
+ console.error(importError);
697
+ }
698
+ return;
699
+ }
700
+ throw importError;
701
+ }
702
+ let configData = null;
703
+ if (lexConfig.default) {
704
+ configData = lexConfig.default;
705
+ if (debug) {
706
+ log(`Found default export in ${lexConfigPath}`, "info", quiet);
707
+ }
708
+ } else {
709
+ configData = lexConfig;
710
+ if (debug) {
711
+ log(`Using direct export in ${lexConfigPath}`, "info", quiet);
712
+ }
713
+ }
714
+ if (configData && configData.ai) {
680
715
  log(`Found AI configuration in ${pathResolve(cwd, lexConfigPath)}, applying settings...`, "info", quiet);
681
- LexConfig.config.ai = { ...LexConfig.config.ai, ...lexConfig.default.ai };
716
+ LexConfig.config.ai = { ...LexConfig.config.ai, ...configData.ai };
682
717
  }
683
718
  } catch (error) {
684
719
  log(`Error loading AI configuration from ${lexConfigPath}: ${error.message}`, "warn", quiet);
720
+ if (debug) {
721
+ console.error(error);
722
+ }
685
723
  }
686
724
  }
687
725
  };
726
+ const loadESLintConfig = async (cwd, quiet, debug) => {
727
+ if (LexConfig.config.eslint && Object.keys(LexConfig.config.eslint).length > 0) {
728
+ log("Found ESLint configuration in lex.config.* file", "info", debug || !quiet);
729
+ return true;
730
+ }
731
+ const configFormats = ["js", "mjs", "cjs", "ts", "json"];
732
+ const configBaseName = "lex.config";
733
+ for (const format of configFormats) {
734
+ const potentialPath = pathResolve(cwd, `./${configBaseName}.${format}`);
735
+ if (existsSync(potentialPath)) {
736
+ try {
737
+ const fileFormat = extname(potentialPath).slice(1);
738
+ let importPath = potentialPath;
739
+ if (fileFormat === "mjs") {
740
+ try {
741
+ const url = new URL(`file://${potentialPath}`);
742
+ importPath = url.href;
743
+ if (debug) {
744
+ log(`Using URL format for MJS import: ${importPath}`, "info", quiet);
745
+ }
746
+ } catch (urlError) {
747
+ log(`Error creating URL for MJS import: ${urlError.message}`, "warn", debug || !quiet);
748
+ importPath = `file://${potentialPath}`;
749
+ }
750
+ }
751
+ if (debug) {
752
+ log(`Trying to import config from ${importPath} (format: ${fileFormat})`, "info", quiet);
753
+ }
754
+ let lexConfig;
755
+ try {
756
+ lexConfig = await import(importPath);
757
+ } catch (importError) {
758
+ if (importError.message.includes("not defined in ES module scope")) {
759
+ log(`ES Module syntax error in ${potentialPath}. Make sure you're using 'export' instead of 'module.exports'.`, "error", quiet);
760
+ if (debug) {
761
+ console.error(importError);
762
+ }
763
+ continue;
764
+ }
765
+ throw importError;
766
+ }
767
+ let configData = null;
768
+ if (lexConfig.default) {
769
+ configData = lexConfig.default;
770
+ if (debug) {
771
+ log(`Found default export in ${potentialPath}`, "info", quiet);
772
+ }
773
+ } else {
774
+ configData = lexConfig;
775
+ if (debug) {
776
+ log(`Using direct export in ${potentialPath}`, "info", quiet);
777
+ }
778
+ }
779
+ if (configData && configData.eslint && Object.keys(configData.eslint).length > 0) {
780
+ log(`Found ESLint configuration in ${pathResolve(cwd, potentialPath)}, applying settings...`, "info", debug || !quiet);
781
+ LexConfig.config.eslint = { ...LexConfig.config.eslint, ...configData.eslint };
782
+ return true;
783
+ }
784
+ } catch (error) {
785
+ log(`Error loading ESLint configuration from ${potentialPath}: ${error.message}`, "warn", quiet);
786
+ if (debug) {
787
+ console.error(error);
788
+ }
789
+ }
790
+ }
791
+ }
792
+ return false;
793
+ };
794
+ const removeFileComments = (filePath, quiet) => {
795
+ try {
796
+ const fileContent = readFileSync(filePath, "utf8");
797
+ if (fileContent.length > 1e6) {
798
+ log(`Skipping comment removal for large file: ${filePath}`, "info", quiet);
799
+ return false;
800
+ }
801
+ const ext = extname(filePath);
802
+ let isTypeScript = false;
803
+ let isJavaScript = false;
804
+ if ([".ts", ".tsx"].includes(ext)) {
805
+ isTypeScript = true;
806
+ } else if ([".js", ".jsx"].includes(ext)) {
807
+ isJavaScript = true;
808
+ } else {
809
+ return false;
810
+ }
811
+ let newContent = fileContent.replace(
812
+ /\/\*[\s\S]*?\*\//g,
813
+ (match) => {
814
+ if (match.includes("Copyright") || match.includes("LICENSE") || match.includes("License") || match.includes("license")) {
815
+ return match;
816
+ }
817
+ return "";
818
+ }
819
+ );
820
+ newContent = newContent.replace(
821
+ /\/\/.*$/gm,
822
+ (match) => {
823
+ if (match.includes("TODO") || match.includes("FIXME")) {
824
+ return match;
825
+ }
826
+ return "";
827
+ }
828
+ );
829
+ newContent = newContent.replace(/\n\s*\n\s*\n/g, "\n\n");
830
+ if (newContent !== fileContent) {
831
+ writeFileSync(filePath, newContent, "utf8");
832
+ log(`Removed comments from ${filePath}`, "info", quiet);
833
+ return true;
834
+ }
835
+ return false;
836
+ } catch (error) {
837
+ log(`Error removing comments from ${filePath}: ${error.message}`, "error", quiet);
838
+ return false;
839
+ }
840
+ };
688
841
  const lint = async (cmd, callback = process.exit) => {
689
842
  const {
690
843
  cliName = "Lex",
691
844
  fix = false,
692
845
  debug = false,
693
846
  quiet = false,
694
- config = null
847
+ config = null,
848
+ removeComments = false,
849
+ // Handle kebab-case CLI flag conversion
850
+ "remove-comments": removeCommentsFlag = false
695
851
  } = cmd;
852
+ const shouldRemoveComments = removeComments || removeCommentsFlag;
696
853
  log(`${cliName} linting...`, "info", quiet);
697
854
  const cwd = process.cwd();
698
855
  const spinner = createSpinner(quiet);
699
- await loadAIConfig(cwd, quiet);
700
- let originalConfig = null;
856
+ await loadAIConfig(cwd, quiet, debug);
701
857
  let tempConfigPath = null;
702
858
  try {
703
859
  const useTypescript = detectTypeScript(cwd);
@@ -710,15 +866,21 @@ const lint = async (cmd, callback = process.exit) => {
710
866
  const projectConfigPath = pathResolve(cwd, "eslint.config.js");
711
867
  const projectConfigPathTs = pathResolve(cwd, "eslint.config.ts");
712
868
  const hasEslintConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs) || existsSync(pathResolve(cwd, ".eslintrc.js")) || existsSync(pathResolve(cwd, ".eslintrc.json")) || existsSync(pathResolve(cwd, ".eslintrc.yml")) || existsSync(pathResolve(cwd, ".eslintrc.yaml")) || existsSync(pathResolve(cwd, ".eslintrc"));
869
+ const hasLexEslintConfig = await loadESLintConfig(cwd, quiet, debug);
870
+ if (hasLexEslintConfig) {
871
+ log("Using ESLint configuration from lex.config.* file", "info", quiet);
872
+ }
713
873
  if (existsSync(pathResolve(cwd, ".eslintrc.json"))) {
714
874
  unlinkSync(pathResolve(cwd, ".eslintrc.json"));
715
875
  }
716
876
  let lexConfigPath = "";
717
877
  let shouldCreateTempConfig = false;
718
- if (!hasEslintConfig) {
878
+ if (!hasEslintConfig && !hasLexEslintConfig) {
719
879
  const possiblePaths = [
720
880
  pathResolve(currentDirname, "../../../../eslint.config.ts"),
721
- pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.ts")
881
+ pathResolve(currentDirname, "../../../../eslint.config.js"),
882
+ pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.ts"),
883
+ pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.js")
722
884
  ];
723
885
  for (const path of possiblePaths) {
724
886
  if (existsSync(path)) {
@@ -752,7 +914,6 @@ const lint = async (cmd, callback = process.exit) => {
752
914
  log("No ESLint configuration found. Creating a temporary configuration...", "info", quiet);
753
915
  const configResult = createDefaultESLintConfig(useTypescript, cwd);
754
916
  tempConfigPath = configResult.configPath;
755
- originalConfig = configResult.originalConfig;
756
917
  }
757
918
  let eslintOutput = "";
758
919
  const captureOutput = (output) => {
@@ -760,6 +921,22 @@ const lint = async (cmd, callback = process.exit) => {
760
921
  `;
761
922
  };
762
923
  const result = await runEslintWithLex(cwd, quiet, cliName, true, debug, useTypescript, captureOutput);
924
+ if (shouldRemoveComments) {
925
+ spinner.start("Removing comments from files...");
926
+ const glob = await import("glob");
927
+ const files = glob.sync("{src,lib}/**/*.{js,jsx,ts,tsx}", {
928
+ cwd,
929
+ ignore: ["**/node_modules/**", "**/dist/**", "**/build/**"]
930
+ });
931
+ let processedCount = 0;
932
+ for (const file of files) {
933
+ const filePath = pathResolve(cwd, file);
934
+ if (removeFileComments(filePath, quiet)) {
935
+ processedCount++;
936
+ }
937
+ }
938
+ spinner.succeed(`Removed comments from ${processedCount} files`);
939
+ }
763
940
  if (result !== 0 && fix) {
764
941
  const aiConfigured = LexConfig.config.ai?.provider && LexConfig.config.ai.provider !== "none";
765
942
  if (aiConfigured) {
@@ -792,15 +969,20 @@ ${cliName} Error: ${error.message}`, "error", quiet);
792
969
  callback(1);
793
970
  return 1;
794
971
  } finally {
795
- if (tempConfigPath && originalConfig) {
796
- try {
797
- writeFileSync(tempConfigPath, originalConfig, "utf8");
798
- } catch (_error) {
799
- }
800
- } else if (tempConfigPath) {
801
- try {
802
- unlinkSync(tempConfigPath);
803
- } catch (_error) {
972
+ const tempFilePaths = [
973
+ tempConfigPath,
974
+ pathResolve(cwd, ".lex-temp-eslint.cjs"),
975
+ pathResolve(cwd, ".lex-temp-default-eslint.cjs")
976
+ ];
977
+ for (const filePath of tempFilePaths) {
978
+ if (filePath && existsSync(filePath)) {
979
+ try {
980
+ unlinkSync(filePath);
981
+ if (debug) {
982
+ log(`Cleaned up temporary ESLint config at ${filePath}`, "info", quiet);
983
+ }
984
+ } catch (_error) {
985
+ }
804
986
  }
805
987
  }
806
988
  }
@@ -808,4 +990,4 @@ ${cliName} Error: ${error.message}`, "error", quiet);
808
990
  export {
809
991
  lint
810
992
  };
811
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2xpbnQvbGludC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmxldCBjdXJyZW50RmlsZW5hbWU6IHN0cmluZztcbmxldCBjdXJyZW50RGlybmFtZTogc3RyaW5nO1xuXG50cnkge1xuICBjdXJyZW50RmlsZW5hbWUgPSBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKScpO1xuICBjdXJyZW50RGlybmFtZSA9IGRpcm5hbWUoY3VycmVudEZpbGVuYW1lKTtcbn0gY2F0Y2h7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IHByb2Nlc3MuY3dkKCk7XG4gIGN1cnJlbnREaXJuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW50T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FjaGVGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBjYWNoZUxvY2F0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBlbnY/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudkluZm8/OiBib29sZWFuO1xuICByZWFkb25seSBleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpeD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZpeERyeVJ1bj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZpeFR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZvcm1hdD86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsPzogc3RyaW5nO1xuICByZWFkb25seSBpZ25vcmVQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBpZ25vcmVQYXR0ZXJuPzogc3RyaW5nO1xuICByZWFkb25seSBpbml0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbWF4V2FybmluZ3M/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5vQ29sb3I/OiBib29sZWFuO1xuICByZWFkb25seSBub0VzbGludHJjPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9JZ25vcmU/OiBib29sZWFuO1xuICByZWFkb25seSBub0lubGluZUNvbmZpZz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG91dHB1dEZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnNlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgcGFyc2VyT3B0aW9ucz86IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luPzogc3RyaW5nO1xuICByZWFkb25seSBwcmludENvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc29sdmVQbHVnaW5zUmVsYXRpdmVUbz86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXNkaXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZGluPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RkaW5GaWxlbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTGludENhbGxiYWNrID0gdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuaW50ZXJmYWNlIENvbmZpZ1Jlc3VsdCB7XG4gIGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgb3JpZ2luYWxDb25maWc6IHN0cmluZyB8IG51bGw7XG59XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRFU0xpbnRDb25maWcgPSAodXNlVHlwZXNjcmlwdDogYm9vbGVhbiwgY3dkOiBzdHJpbmcpOiBDb25maWdSZXN1bHQgPT4ge1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCAnZXNsaW50LmNvbmZpZy50cycpO1xuICBsZXQgb3JpZ2luYWxDb25maWc7XG5cbiAgaWYoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBvcmlnaW5hbENvbmZpZyA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnZXNsaW50LmNvbmZpZy50cycpXG4gIF07XG5cbiAgbGV0IGZvdW5kQ29uZmlnID0gJyc7XG5cbiAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIGZvdW5kQ29uZmlnID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGxldCBlc2xpbnRDb25maWc7XG5cbiAgaWYoZm91bmRDb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgZXNsaW50Q29uZmlnID0gcmVhZEZpbGVTeW5jKGZvdW5kQ29uZmlnLCAndXRmOCcpO1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBlc2xpbnRDb25maWcgPSBjcmVhdGVCYXNpY0VTTGludENvbmZpZyh1c2VUeXBlc2NyaXB0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZXNsaW50Q29uZmlnID0gY3JlYXRlQmFzaWNFU0xpbnRDb25maWcodXNlVHlwZXNjcmlwdCk7XG4gIH1cblxuICB3cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGVzbGludENvbmZpZywgJ3V0ZjgnKTtcblxuICByZXR1cm4ge1xuICAgIGNvbmZpZ1BhdGgsXG4gICAgb3JpZ2luYWxDb25maWdcbiAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZUJhc2ljRVNMaW50Q29uZmlnID0gKHVzZVR5cGVzY3JpcHQ6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBsZXQgY29uZmlnID0gYC8vIEVTTGludCBjb25maWd1cmF0aW9uXG5pbXBvcnQgeyB0eXBlc2NyaXB0Q29uZmlnIH0gZnJvbSAnZXNsaW50LWNvbmZpZy1zdHlsZWd1aWRlanMnO1xuXG5jb25zdCBjb25maWcgPSBbXG4gIHtcbiAgICBpZ25vcmVzOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2J1aWxkLyoqJ11cbiAgfSxcbiAgLy8gQ29uZmlnIGZvciBKYXZhU2NyaXB0IGZpbGVzXG4gIHtcbiAgICBmaWxlczogWycqKi8qLntqcyxqc3h9J10sXG4gICAgbGFuZ3VhZ2VPcHRpb25zOiB7XG4gICAgICBlY21hVmVyc2lvbjogJ2xhdGVzdCcsXG4gICAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJ1xuICAgIH0sXG4gICAgcnVsZXM6IHtcbiAgICAgICdpbmRlbnQnOiBbJ2Vycm9yJywgMl0sXG4gICAgICAncXVvdGVzJzogWydlcnJvcicsICdzaW5nbGUnXSxcbiAgICAgICdzZW1pJzogWydlcnJvcicsICdhbHdheXMnXSxcbiAgICAgICduby11bnVzZWQtdmFycyc6IFsnd2FybicsIHsgJ2FyZ3NJZ25vcmVQYXR0ZXJuJzogJ15fJywgJ3ZhcnNJZ25vcmVQYXR0ZXJuJzogJ15fJywgJ2NhdWdodEVycm9ycyc6ICdhbGwnLCAnY2F1Z2h0RXJyb3JzSWdub3JlUGF0dGVybic6ICdeXycgfV0sXG4gICAgICAnZXFlcWVxJzogWydlcnJvcicsICdhbHdheXMnXVxuICAgIH1cbiAgfWA7XG5cbiAgLy8gQWRkIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBpZiBuZWVkZWRcbiAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgIGNvbmZpZyArPSBgLFxuICAvLyBDb25maWcgZm9yIFR5cGVTY3JpcHQgZmlsZXNcbiAge1xuICAgIGZpbGVzOiBbJyoqLyoue3RzLHRzeH0nXSxcbiAgICBsYW5ndWFnZU9wdGlvbnM6IHtcbiAgICAgIGVjbWFWZXJzaW9uOiAnbGF0ZXN0JyxcbiAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnLFxuICAgICAgcGFyc2VyOiB7XG4gICAgICAgIGltcG9ydFNvdXJjZTogJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXG4gICAgICB9LFxuICAgICAgICAgICAgICBwYXJzZXJPcHRpb25zOiB7XG4gICAgICAgICAgcHJvamVjdDogZ2V0VHlwZVNjcmlwdENvbmZpZ1BhdGgoJ3RzY29uZmlnLmxpbnQuanNvbicpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHBsdWdpbnM6IHtcbiAgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQnOiB7XG4gICAgICAgIGltcG9ydFNvdXJjZTogJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ1xuICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXM6IHtcbiAgICAgICdpbmRlbnQnOiBbJ2Vycm9yJywgMl0sXG4gICAgICAncXVvdGVzJzogWydlcnJvcicsICdzaW5nbGUnXSxcbiAgICAgICdzZW1pJzogWydlcnJvcicsICdhbHdheXMnXSxcbiAgICAgICduby11bnVzZWQtdmFycyc6ICdvZmYnLFxuICAgICAgJ0B0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyc6IFsnd2FybicsIHsgJ2FyZ3NJZ25vcmVQYXR0ZXJuJzogJ15fJywgJ3ZhcnNJZ25vcmVQYXR0ZXJuJzogJ15fJywgJ2NhdWdodEVycm9ycyc6ICdhbGwnLCAnY2F1Z2h0RXJyb3JzSWdub3JlUGF0dGVybic6ICdeXycgfV0sXG4gICAgICAnZXFlcWVxJzogWydlcnJvcicsICdhbHdheXMnXVxuICAgIH1cbiAgfWA7XG4gIH1cblxuICAvLyBDbG9zZSB0aGUgYXJyYXkgYW5kIGV4cG9ydFxuICBjb25maWcgKz0gYFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO2A7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgVHlwZVNjcmlwdCBpcyBiZWluZyB1c2VkIGJ5IGxvb2tpbmcgZm9yIHRzY29uZmlnLmpzb25cbiAqL1xuY29uc3QgZGV0ZWN0VHlwZVNjcmlwdCA9IChjd2Q6IHN0cmluZyk6IGJvb2xlYW4gPT4gZXhpc3RzU3luYyhwYXRoUmVzb2x2ZShjd2QsICd0c2NvbmZpZy5qc29uJykpO1xuXG4vKipcbiAqIEVuc3VyZSBwYWNrYWdlLmpzb24gaGFzIHR5cGU6IG1vZHVsZSBmb3IgRVNNIHN1cHBvcnRcbiAqL1xuY29uc3QgZW5zdXJlTW9kdWxlVHlwZSA9IChjd2Q6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoUmVzb2x2ZShjd2QsICdwYWNrYWdlLmpzb24nKTtcblxuICBpZihleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpO1xuXG4gICAgICAvLyBJZiB0eXBlIGlzIG5vdCBzZXQgdG8gbW9kdWxlLCB3YXJuIGluc3RlYWQgb2YgYXV0by1tb2RpZnlpbmdcbiAgICAgIGlmKHBhY2thZ2VKc29uLnR5cGUgIT09ICdtb2R1bGUnKSB7XG4gICAgICAgIGxvZygnV2FybmluZzogcGFja2FnZS5qc29uIHNob3VsZCBoYXZlIFwidHlwZVwiOiBcIm1vZHVsZVwiIGZvciBFU00gc3VwcG9ydC4gUGxlYXNlIGFkZCB0aGlzIG1hbnVhbGx5LicsICd3YXJuJywgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBpbnN0YWxsRGVwZW5kZW5jaWVzID0gYXN5bmMgKGN3ZDogc3RyaW5nLCB1c2VUeXBlc2NyaXB0OiBib29sZWFuLCBxdWlldDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgbG9nKCdVc2luZyBUeXBlU2NyaXB0IEVTTGludCBmcm9tIExleC4uLicsICdpbmZvJywgcXVpZXQpO1xuICB9IGVsc2Uge1xuICAgIGxvZygnVXNpbmcgRVNMaW50IGZyb20gTGV4Li4uJywgJ2luZm8nLCBxdWlldCk7XG4gIH1cbn07XG5cbmNvbnN0IHJ1bkVzbGludFdpdGhMZXggPSBhc3luYyAoXG4gIGN3ZDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgY2xpTmFtZTogc3RyaW5nLFxuICBmaXg6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuLFxuICB1c2VUeXBlc2NyaXB0OiBib29sZWFuLFxuICBjYXB0dXJlT3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiB2b2lkXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJ2VzbGludC5jb25maWcuanMnKTtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aFRzID0gcGF0aFJlc29sdmUoY3dkLCAnZXNsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGhhc1Byb2plY3RDb25maWcgPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoKSB8fCBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoVHMpO1xuXG4gICAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnLi4vLi4vLi4vLi4vZXNsaW50LmNvbmZpZy50cycpLFxuICAgICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ2VzbGludC5jb25maWcudHMnKVxuICAgIF07XG5cbiAgICBsZXQgbGV4Q29uZmlnUGF0aCA9ICcnO1xuICAgIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgICAgbGV4Q29uZmlnUGF0aCA9IHBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBoYXNQcm9qZWN0Q29uZmlnID8gKGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcykgPyBwcm9qZWN0Q29uZmlnUGF0aFRzIDogcHJvamVjdENvbmZpZ1BhdGgpIDogKGxleENvbmZpZ1BhdGggfHwgcHJvamVjdENvbmZpZ1BhdGgpO1xuXG4gICAgY29uc3QgZXNsaW50QmluYXJ5ID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ2VzbGludCcsICdlc2xpbnQnKTtcblxuICAgIGlmKCFlc2xpbnRCaW5hcnkpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRVNMaW50IGJpbmFyeSBub3QgZm91bmQgaW4gTGV4J3Mgbm9kZV9tb2R1bGVzYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgbG9nKCdQbGVhc2UgcmVpbnN0YWxsIExleCBvciBjaGVjayB5b3VyIGluc3RhbGxhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGpzUmVzdWx0ID0gYXdhaXQgZXhlY2EoZXNsaW50QmluYXJ5LCBbXG4gICAgICAnc3JjLyoqLyoue2pzLGpzeH0nLFxuICAgICAgJy0tY29uZmlnJywgY29uZmlnUGF0aCxcbiAgICAgIC4uLihmaXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZGVidWcgPyBbJy0tZGVidWcnXSA6IFtdKSxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJ1xuICAgIF0sIHtcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgY3dkLFxuICAgICAgc2hlbGw6IHRydWVcbiAgICB9KTtcblxuICAgIGlmKGpzUmVzdWx0LnN0ZG91dCkge1xuICAgICAgY29uc29sZS5sb2coanNSZXN1bHQuc3Rkb3V0KTtcbiAgICAgIGlmKGNhcHR1cmVPdXRwdXQpIHtcbiAgICAgICAgY2FwdHVyZU91dHB1dChqc1Jlc3VsdC5zdGRvdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGpzUmVzdWx0LnN0ZGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihqc1Jlc3VsdC5zdGRlcnIpO1xuICAgICAgaWYoY2FwdHVyZU91dHB1dCkge1xuICAgICAgICBjYXB0dXJlT3V0cHV0KGpzUmVzdWx0LnN0ZGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRzUmVzdWx0OiBhbnkgPSB7ZXhpdENvZGU6IDAsIHN0ZG91dDogJycsIHN0ZGVycjogJyd9O1xuICAgIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICAgIHRzUmVzdWx0ID0gYXdhaXQgZXhlY2EoZXNsaW50QmluYXJ5LCBbXG4gICAgICAgICdzcmMvKiovKi57dHMsdHN4fScsXG4gICAgICAgICctLWNvbmZpZycsIGNvbmZpZ1BhdGgsXG4gICAgICAgIC4uLihmaXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAgIC4uLihkZWJ1ZyA/IFsnLS1kZWJ1ZyddIDogW10pLFxuICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybidcbiAgICAgIF0sIHtcbiAgICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgICAgY3dkLFxuICAgICAgICBzaGVsbDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmKHRzUmVzdWx0LnN0ZG91dCkge1xuICAgICAgICBjb25zb2xlLmxvZyh0c1Jlc3VsdC5zdGRvdXQpO1xuICAgICAgfVxuXG4gICAgICBpZih0c1Jlc3VsdC5zdGRlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcih0c1Jlc3VsdC5zdGRlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVzbGludE5vdEZvdW5kID0ganNSZXN1bHQuc3RkZXJyPy5pbmNsdWRlcygnY29tbWFuZCBub3QgZm91bmQnKSB8fCBqc1Jlc3VsdC5zdGRlcnI/LmluY2x1ZGVzKCdlc2xpbnQ6IGNvbW1hbmQgbm90IGZvdW5kJyk7XG4gICAgaWYoZXNsaW50Tm90Rm91bmQpIHtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRVNMaW50IG5vdCBmb3VuZCEnKTtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogTGV4J3MgRVNMaW50IGJpbmFyeSBub3QgZm91bmQuIFBsZWFzZSByZWluc3RhbGwgTGV4IG9yIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmKGpzUmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHRzUmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0xpbnRpbmcgY29tcGxldGVkIScpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9GaWxlc0ZvdW5kID1cbiAgICAgIChqc1Jlc3VsdC5zdGRlcnI/LmluY2x1ZGVzKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykgfHwganNSZXN1bHQuc3Rkb3V0Py5pbmNsdWRlcygnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpKSAmJlxuICAgICAgKCF1c2VUeXBlc2NyaXB0IHx8IHRzUmVzdWx0LnN0ZGVycj8uaW5jbHVkZXMoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSB8fCB0c1Jlc3VsdC5zdGRvdXQ/LmluY2x1ZGVzKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykpO1xuXG4gICAgaWYobm9GaWxlc0ZvdW5kKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ05vIGZpbGVzIGZvdW5kIHRvIGxpbnQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzcGlubmVyLmZhaWwoJ0xpbnRpbmcgZmFpbGVkIScpO1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRVNMaW50IGZvdW5kIGlzc3VlcyBpbiB5b3VyIGNvZGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHJldHVybiAxO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdMaW50aW5nIGZhaWxlZCEnKTtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmNvbnN0IGFwcGx5QUlGaXggPSBhc3luYyAoXG4gIGN3ZDogc3RyaW5nLFxuICBlcnJvcnM6IHN0cmluZyxcbiAgcXVpZXQ6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG4gIHNwaW5uZXIuc3RhcnQoJ1VzaW5nIEFJIHRvIGZpeCByZW1haW5pbmcgbGludCBpc3N1ZXMuLi4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGZpbGVFcnJvck1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBsaW5lcyA9IGVycm9ycy5zcGxpdCgnXFxuJyk7XG4gICAgbGV0IGN1cnJlbnRGaWxlID0gJyc7XG5cbiAgICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYobGluZS5tYXRjaCgvXihcXC98W0EtWl06XFxcXCkuKj9cXC4oanN8anN4fHRzfHRzeCkkLykpIHtcbiAgICAgICAgY3VycmVudEZpbGUgPSBsaW5lLnRyaW0oKTtcbiAgICAgICAgaWYoIWZpbGVFcnJvck1hcC5oYXMoY3VycmVudEZpbGUpKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChjdXJyZW50RmlsZSwgW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoY3VycmVudEZpbGUgJiYgbGluZS50cmltKCkgJiYgbGluZS5tYXRjaCgvXFxzK1xcZCs6XFxkK1xccysoZXJyb3J8d2FybmluZylcXHMrLykpIHtcbiAgICAgICAgY29uc3QgZXJyb3JBcnJheSA9IGZpbGVFcnJvck1hcC5nZXQoY3VycmVudEZpbGUpO1xuICAgICAgICBpZihlcnJvckFycmF5KSB7XG4gICAgICAgICAgZXJyb3JBcnJheS5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGZpbGVFcnJvck1hcC5zaXplID09PSAwKSB7XG4gICAgICBsb2coJ1VzaW5nIGFsdGVybmF0aXZlIGVycm9yIHBhcnNpbmcgc3RyYXRlZ3knLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBlcnJvcnMuc3BsaXQoJ1xcblxcbicpO1xuXG4gICAgICBmb3IoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICBpZihzZWN0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVzID0gc2VjdGlvbi5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gbGluZXNbMF0udHJpbSgpO1xuXG4gICAgICAgIGlmKGZpbGVQYXRoLm1hdGNoKC9cXC4oanN8anN4fHRzfHRzeCkkLykpIHtcbiAgICAgICAgICBmaWxlRXJyb3JNYXAuc2V0KGZpbGVQYXRoLCBbXSk7XG5cbiAgICAgICAgICBmb3IobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmKGxpbmVzW2ldLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgZmlsZUVycm9yTWFwLmdldChmaWxlUGF0aCk/LnB1c2gobGluZXNbaV0udHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihmaWxlRXJyb3JNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgbG9nKCdVc2luZyBkaXJlY3QgZmlsZSBwYXRoIGV4dHJhY3Rpb24nLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgY29uc3QgZmlsZVBhdGhSZWdleCA9IC8oPzpcXC98W0EtWl06XFxcXCkoPzpbXjpcXG5dK1xcLykqW146XFxuXStcXC4oanN8anN4fHRzfHRzeCkvZztcbiAgICAgIGNvbnN0IGZpbGVQYXRocyA9IGVycm9ycy5tYXRjaChmaWxlUGF0aFJlZ2V4KSB8fCBbXTtcblxuICAgICAgZm9yKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgICBpZighZmlsZUVycm9yTWFwLmhhcyhmaWxlUGF0aCkgJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBmaWxlRXJyb3JNYXAuc2V0KGZpbGVQYXRoLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qga25vd25GaWxlcyA9IFtcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL2NyZWF0ZS9jaGFuZ2Vsb2cudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL3V0aWxzL2FpU2VydmljZS50cycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShjd2QsICdzcmMvdXRpbHMvYXBwLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy91dGlscy9yZWFjdFNoaW0udHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL2NvbW1hbmRzL2xpbnQvYXV0b2ZpeC5qcycpXG4gICAgICBdO1xuXG4gICAgICBmb3IoY29uc3QgZmlsZSBvZiBrbm93bkZpbGVzKSB7XG4gICAgICAgIGlmKGV4aXN0c1N5bmMoZmlsZSkgJiYgIWZpbGVFcnJvck1hcC5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBmaWxlRXJyb3JNYXAuc2V0KGZpbGUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlRXJyb3JNYXAua2V5cygpKSB7XG4gICAgICBpZighZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgbG9nKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxvZyhgUHJvY2Vzc2luZyBmaWxlOiAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBjb25zdCBpc0N1cnNvcklERSA9IExleENvbmZpZy5jb25maWcuYWk/LnByb3ZpZGVyID09PSAnY3Vyc29yJyB8fCBwcm9jZXNzLmVudi5DVVJTT1JfSURFID09PSAndHJ1ZSc7XG5cbiAgICAgIGlmKGlzQ3Vyc29ySURFKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJvbXB0ID0gYEZpeCBhbGwgRVNMaW50IGVycm9ycyBpbiB0aGlzIGZpbGUuIEZvY3VzIG9uOlxuMS4gRml4aW5nIG5hbWluZyBjb252ZW50aW9uc1xuMi4gRml4aW5nIHNvcnQta2V5cyBpc3N1ZXNcbjMuIFJlcGxhY2luZyBjb25zb2xlLmxvZyB3aXRoIGxvZyB1dGlsaXR5XG40LiBGaXhpbmcgbm8tcGx1c3BsdXMgaXNzdWVzXG41LiBGaXhpbmcgdW5uZWNlc3NhcnkgZXNjYXBlIGNoYXJhY3RlcnNcbjYuIEZpeGluZyBvdGhlciBFU0xpbnQgZXJyb3JzXG5cbkNSSVRJQ0FMIFJFUVVJUkVNRU5UUzpcbi0gT05MWSBmaXggdGhlIHNwZWNpZmljIGxpbmVzIHdpdGggRVNMaW50IGVycm9yc1xuLSBETyBOT1QgbW9kaWZ5IGFueSBvdGhlciBsaW5lcyBvZiBjb2RlXG4tIERPIE5PVCByZW1vdmUgbGluZSBicmVha3MgdW5sZXNzIHRoZXkgYXJlIHNwZWNpZmljYWxseSBjYXVzaW5nIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIGNvbmRlbnNlIG11bHRpLWxpbmUgc3RydWN0dXJlcyB0byBzaW5nbGUgbGluZXNcbi0gUFJFU0VSVkUgYWxsIGV4aXN0aW5nIGxpbmUgYnJlYWtzIGFuZCBmb3JtYXR0aW5nIHRoYXQgaXMgbm90IGNhdXNpbmcgZXJyb3JzXG5cblNQRUNJRklDIEZPUk1BVFRJTkcgUlVMRVM6XG4tIE1haW50YWluIHByb3BlciBpbmRlbnRhdGlvbiAoMiBzcGFjZXMpXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBjbGFzcy9pbnRlcmZhY2UgZGVjbGFyYXRpb24gYW5kIHRoZWlyIG1lbWJlcnNcbi0gS2VlcCBsaW5lIGJyZWFrcyBiZXR3ZWVuIG1ldGhvZHNcbi0gRW5zdXJlIHRoZXJlIGlzIGEgbGluZSBicmVhayBhZnRlciBvcGVuaW5nIGJyYWNlcyBmb3IgY2xhc3NlcywgaW50ZXJmYWNlcywgYW5kIG1ldGhvZHNcbi0gRE8gTk9UIHBsYWNlIGNsYXNzL2ludGVyZmFjZSBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBicmFjZVxuLSBQcmVzZXJ2ZSBlbXB0eSBsaW5lcyBiZXR3ZWVuIGxvZ2ljYWwgY29kZSBibG9ja3Ncbi0gUFJFU0VSVkUgbXVsdGktbGluZSBpbXBvcnRzIC0gZG8gbm90IGNvbmRlbnNlIHRoZW0gdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgb2JqZWN0L2FycmF5IGRlY2xhcmF0aW9ucyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuXG5TT1JULUtFWVMgUlVMRSAoSElHSEVTVCBQUklPUklUWSk6XG4tIEFsbCBvYmplY3QgbGl0ZXJhbCBrZXlzIE1VU1QgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5IGluIGFzY2VuZGluZyBvcmRlclxuLSBUaGlzIGFwcGxpZXMgdG8gQUxMIG9iamVjdHMgaW4gdGhlIGZpbGUsIG5vdCBqdXN0IHRob3NlIHdpdGggZXhwbGljaXQgc29ydC1rZXlzIGVycm9yc1xuLSBFeGFtcGxlOiB7YjogMiwgYTogMSwgYzogM30gc2hvdWxkIGJlY29tZSB7YTogMSwgYjogMiwgYzogM31cbi0gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZvcm1hdHRpbmcgYW5kIGxpbmUgYnJlYWtzIHdoZW4gc29ydGluZ1xuXG5FeGFtcGxlIG9mIENPUlJFQ1QgZm9ybWF0dGluZyAoRE8gTk9UIENIQU5HRSk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7XG4gIHN0YXRpYyByZWFkb25seSBBRERfSVRFTV9FUlJPUjogc3RyaW5nID0gJ1VTRVJfQUREX0lURU1fRVJST1InO1xuICBzdGF0aWMgcmVhZG9ubHkgT1RIRVJfQ09OU1RBTlQ6IHN0cmluZyA9ICdPVEhFUl9DT05TVEFOVCc7XG59XG5cbmNvbnN0cnVjdG9yKGZsdXg6IEZsdXhGcmFtZXdvcmssIEN1c3RvbUFkYXB0ZXI6IHR5cGVvZiBFdmVudCA9IEV2ZW50KSB7XG4gIHRoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7XG59XG5cbmltcG9ydCB7XG4gIGFwcCxcbiAgZXZlbnRzLFxuICBpbWFnZXMsXG4gIGxvY2F0aW9ucyxcbiAgbWVzc2FnZXMsXG4gIHBvc3RzLFxuICB0YWdzLFxuICB1c2VycyxcbiAgd2Vic29ja2V0XG59IGZyb20gJy4vc3RvcmVzJztcblxuY29uc3QgY29uZmlnID0ge1xuICBhcGlLZXk6ICd2YWx1ZScsXG4gIGJhc2VVcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gIHRpbWVvdXQ6IDUwMDBcbn07XG5cbkV4YW1wbGUgb2YgSU5DT1JSRUNUIGZvcm1hdHRpbmcgKEZJWCBUSElTKTpcbmV4cG9ydCBjbGFzcyBVc2VyQ29uc3RhbnRzIHtzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge3RoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7fVxuXG5pbXBvcnQge2FwcCwgZXZlbnRzLCBpbWFnZXMsIGxvY2F0aW9ucywgbWVzc2FnZXMsIHBvc3RzLCB0YWdzLCB1c2Vycywgd2Vic29ja2V0fSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLCBhcGlLZXk6ICd2YWx1ZScsIHRpbWVvdXQ6IDUwMDB9O1xuXG5GaXggT05MWSB0aGUgc3BlY2lmaWMgRVNMaW50IGVycm9ycy4gUmV0dXJuIHRoZSBwcm9wZXJseSBmb3JtYXR0ZWQgY29kZS5gO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21wdEZpbGUgPSBwYXRoUmVzb2x2ZShjd2QsICcuY3Vyc29yX3Byb21wdF90ZW1wLnR4dCcpO1xuICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhwcm9tcHRGaWxlLCBwcm9tcHQsICd1dGY4Jyk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBDdXJzb3IgQ0xJIHRvIGZpeCB0aGUgZmlsZVxuICAgICAgICAgICAgYXdhaXQgZXhlY2EoJ2N1cnNvcicsIFsnZWRpdCcsICctLWZpbGUnLCBmaWxlUGF0aCwgJy0tcHJvbXB0LWZpbGUnLCBwcm9tcHRGaWxlXSwge1xuICAgICAgICAgICAgICByZWplY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgICAgICBjd2RcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB1bmxpbmtTeW5jKHByb21wdEZpbGUpO1xuICAgICAgICAgICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9nKGBBcHBsaWVkIEN1cnNvciBBSSBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gYXdhaXQgYXBwbHlEaXJlY3RGaXhlcyhmaWxlUGF0aCwgcXVpZXQpO1xuICAgICAgICAgICAgaWYod2FzTW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgbG9nKGBBcHBsaWVkIGRpcmVjdCBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIGxvZyhgRXJyb3IgdXNpbmcgQ3Vyc29yIEFJOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGF3YWl0IGFwcGx5RGlyZWN0Rml4ZXMoZmlsZVBhdGgsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBhd2FpdCBhcHBseURpcmVjdEZpeGVzKGZpbGVQYXRoLCBxdWlldCk7XG4gICAgICAgIGlmKHdhc01vZGlmaWVkKSB7XG4gICAgICAgICAgbG9nKGBBcHBsaWVkIGRpcmVjdCBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUVycm9ycyA9IGZpbGVFcnJvck1hcC5nZXQoZmlsZVBhdGgpIHx8IFtdO1xuICAgICAgICBpZihmaWxlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qge2NhbGxBSVNlcnZpY2V9ID0gYXdhaXQgaW1wb3J0KCcuLi8uLi91dGlscy9haVNlcnZpY2UuanMnKTtcblxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21wdCA9IGBGaXggdGhlIGZvbGxvd2luZyBFU0xpbnQgZXJyb3JzIGluIHRoaXMgY29kZTpcbiR7ZmlsZUVycm9ycy5qb2luKCdcXG4nKX1cblxuSGVyZSdzIHRoZSBjb2RlOlxuXFxgXFxgXFxgXG4ke2ZpbGVDb250ZW50fVxuXFxgXFxgXFxgXG5cbkNSSVRJQ0FMIFJFUVVJUkVNRU5UUzpcbi0gT05MWSBmaXggdGhlIHNwZWNpZmljIGxpbmVzIHdpdGggRVNMaW50IGVycm9yc1xuLSBETyBOT1QgbW9kaWZ5IGFueSBvdGhlciBsaW5lcyBvZiBjb2RlXG4tIERPIE5PVCByZW1vdmUgbGluZSBicmVha3MgdW5sZXNzIHRoZXkgYXJlIHNwZWNpZmljYWxseSBjYXVzaW5nIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIGNvbmRlbnNlIG11bHRpLWxpbmUgc3RydWN0dXJlcyB0byBzaW5nbGUgbGluZXNcbi0gUFJFU0VSVkUgYWxsIGV4aXN0aW5nIGxpbmUgYnJlYWtzIGFuZCBmb3JtYXR0aW5nIHRoYXQgaXMgbm90IGNhdXNpbmcgZXJyb3JzXG5cblNQRUNJRklDIEZPUk1BVFRJTkcgUlVMRVM6XG4tIE1haW50YWluIHByb3BlciBpbmRlbnRhdGlvbiAoMiBzcGFjZXMpXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBjbGFzcy9pbnRlcmZhY2UgZGVjbGFyYXRpb24gYW5kIHRoZWlyIG1lbWJlcnNcbi0gS2VlcCBsaW5lIGJyZWFrcyBiZXR3ZWVuIG1ldGhvZHNcbi0gRW5zdXJlIHRoZXJlIGlzIGEgbGluZSBicmVhayBhZnRlciBvcGVuaW5nIGJyYWNlcyBmb3IgY2xhc3NlcywgaW50ZXJmYWNlcywgYW5kIG1ldGhvZHNcbi0gRE8gTk9UIHBsYWNlIGNsYXNzL2ludGVyZmFjZSBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBicmFjZVxuLSBQcmVzZXJ2ZSBlbXB0eSBsaW5lcyBiZXR3ZWVuIGxvZ2ljYWwgY29kZSBibG9ja3Ncbi0gUFJFU0VSVkUgbXVsdGktbGluZSBpbXBvcnRzIC0gZG8gbm90IGNvbmRlbnNlIHRoZW0gdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgb2JqZWN0L2FycmF5IGRlY2xhcmF0aW9ucyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuXG5TT1JULUtFWVMgUlVMRSAoSElHSEVTVCBQUklPUklUWSk6XG4tIEFsbCBvYmplY3QgbGl0ZXJhbCBrZXlzIE1VU1QgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5IGluIGFzY2VuZGluZyBvcmRlclxuLSBUaGlzIGFwcGxpZXMgdG8gQUxMIG9iamVjdHMgaW4gdGhlIGZpbGUsIG5vdCBqdXN0IHRob3NlIHdpdGggZXhwbGljaXQgc29ydC1rZXlzIGVycm9yc1xuLSBFeGFtcGxlOiB7YjogMiwgYTogMSwgYzogM30gc2hvdWxkIGJlY29tZSB7YTogMSwgYjogMiwgYzogM31cbi0gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZvcm1hdHRpbmcgYW5kIGxpbmUgYnJlYWtzIHdoZW4gc29ydGluZ1xuXG5XSEFUIFRPIEZJWDpcbjEuIFNvcnRpbmcgYWxsIG9iamVjdCBrZXlzIGFscGhhYmV0aWNhbGx5IChzb3J0LWtleXMgcnVsZSkgLSBBTEwgb2JqZWN0cyBtdXN0IGhhdmUgc29ydGVkIGtleXNcbjIuIEZpeGluZyBuYW1pbmcgY29udmVudGlvbnMgLSBPTkxZIGZvciB2YXJpYWJsZXMvZnVuY3Rpb25zIHdpdGggbmFtaW5nIGVycm9yc1xuMy4gUmVwbGFjaW5nIGNvbnNvbGUubG9nIHdpdGggbG9nIHV0aWxpdHkgLSBPTkxZIGZvciBjb25zb2xlLmxvZyBzdGF0ZW1lbnRzXG40LiBGaXhpbmcgbm8tcGx1c3BsdXMgaXNzdWVzIC0gT05MWSBmb3IgKysvLS0gb3BlcmF0b3JzXG41LiBGaXhpbmcgdW5uZWNlc3NhcnkgZXNjYXBlIGNoYXJhY3RlcnMgLSBPTkxZIGZvciBlc2NhcGVkIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBuZWVkIGVzY2FwaW5nXG42LiBQcm9wZXIgaW5kZW50YXRpb24gYW5kIHNwYWNpbmcgLSBPTkxZIHdoZXJlIHNwZWNpZmljYWxseSByZXF1aXJlZCBieSBlcnJvcnNcbjcuIFN0cmluZyBxdW90ZXMgY29uc2lzdGVuY3kgKHVzZSBzaW5nbGUgcXVvdGVzKSAtIE9OTFkgZm9yIHN0cmluZyBsaXRlcmFscyB3aXRoIHF1b3RlIGVycm9yc1xuOC4gSW1wb3J0IG9yZGVyIGFuZCBzcGFjaW5nIC0gT05MWSBmb3IgaW1wb3J0cyB3aXRoIG9yZGVyL3NwYWNpbmcgZXJyb3JzXG45LiBGdW5jdGlvbiBwYXJhbWV0ZXIgZm9ybWF0dGluZyAtIE9OTFkgZm9yIGZ1bmN0aW9ucyB3aXRoIHBhcmFtZXRlciBlcnJvcnNcbjEwLiBWYXJpYWJsZSBuYW1pbmcgY29udmVudGlvbnMgLSBPTkxZIGZvciB2YXJpYWJsZXMgd2l0aCBuYW1pbmcgZXJyb3JzXG4xMS4gTm8gdW51c2VkIHZhcmlhYmxlcyBvciBpbXBvcnRzIC0gT05MWSBmb3IgdW51c2VkIHZhcmlhYmxlcy9pbXBvcnRzXG4xMi4gQXZvaWRpbmcgbmVzdGVkIHRlcm5hcmllcyAtIE9OTFkgZm9yIG5lc3RlZCB0ZXJuYXJ5IGV4cHJlc3Npb25zXG4xMy4gQW55IG90aGVyIEVTTGludCBlcnJvcnMgLSBPTkxZIGZvciB0aGUgc3BlY2lmaWMgZXJyb3JzIGxpc3RlZCBhYm92ZVxuXG5XSEFUIE5PVCBUTyBGSVg6XG4tIERvIG5vdCBjaGFuZ2UgcHJvcGVybHkgZm9ybWF0dGVkIG11bHRpLWxpbmUgc3RydWN0dXJlc1xuLSBEbyBub3QgcmVtb3ZlIGxpbmUgYnJlYWtzIHRoYXQgYXJlIG5vdCBjYXVzaW5nIGVycm9yc1xuLSBEbyBub3QgY2hhbmdlIGluZGVudGF0aW9uIHRoYXQgaXMgYWxyZWFkeSBjb3JyZWN0XG4tIERvIG5vdCBtb2RpZnkgc3BhY2luZyB0aGF0IGlzIGFscmVhZHkgY29ycmVjdFxuLSBEbyBub3QgY29uZGVuc2UgcmVhZGFibGUgbXVsdGktbGluZSBjb2RlIHRvIHNpbmdsZSBsaW5lc1xuLSBEbyBub3QgbW9kaWZ5IGNvZGUgdGhhdCBpcyBub3QgbWVudGlvbmVkIGluIHRoZSBFU0xpbnQgZXJyb3JzXG5cbkV4YW1wbGUgb2YgQ09SUkVDVCBmb3JtYXR0aW5nIChETyBOT1QgQ0hBTkdFKTpcbmV4cG9ydCBjbGFzcyBVc2VyQ29uc3RhbnRzIHtcbiAgc3RhdGljIHJlYWRvbmx5IEFERF9JVEVNX0VSUk9SOiBzdHJpbmcgPSAnVVNFUl9BRERfSVRFTV9FUlJPUic7XG4gIHN0YXRpYyByZWFkb25seSBPVEhFUl9DT05TVEFOVDogc3RyaW5nID0gJ09USEVSX0NPTlNUQU5UJztcbn1cblxuY29uc3RydWN0b3IoZmx1eDogRmx1eEZyYW1ld29yaywgQ3VzdG9tQWRhcHRlcjogdHlwZW9mIEV2ZW50ID0gRXZlbnQpIHtcbiAgdGhpcy5DdXN0b21BZGFwdGVyID0gQ3VzdG9tQWRhcHRlcjtcbiAgdGhpcy5mbHV4ID0gZmx1eDtcbn1cblxuaW1wb3J0IHtcbiAgYXBwLFxuICBldmVudHMsXG4gIGltYWdlcyxcbiAgbG9jYXRpb25zLFxuICBtZXNzYWdlcyxcbiAgcG9zdHMsXG4gIHRhZ3MsXG4gIHVzZXJzLFxuICB3ZWJzb2NrZXRcbn0gZnJvbSAnLi9zdG9yZXMnO1xuXG5jb25zdCBjb25maWcgPSB7XG4gIGFwaUtleTogJ3ZhbHVlJyxcbiAgYmFzZVVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyxcbiAgdGltZW91dDogNTAwMFxufTtcblxuRXhhbXBsZSBvZiBJTkNPUlJFQ1QgZm9ybWF0dGluZyAoRklYIFRISVMpOlxuZXhwb3J0IGNsYXNzIFVzZXJDb25zdGFudHMge3N0YXRpYyByZWFkb25seSBBRERfSVRFTV9FUlJPUjogc3RyaW5nID0gJ1VTRVJfQUREX0lURU1fRVJST1InO1xuICBzdGF0aWMgcmVhZG9ubHkgT1RIRVJfQ09OU1RBTlQ6IHN0cmluZyA9ICdPVEhFUl9DT05TVEFOVCc7XG59XG5cbmNvbnN0cnVjdG9yKGZsdXg6IEZsdXhGcmFtZXdvcmssIEN1c3RvbUFkYXB0ZXI6IHR5cGVvZiBFdmVudCA9IEV2ZW50KSB7dGhpcy5DdXN0b21BZGFwdGVyID0gQ3VzdG9tQWRhcHRlcjtcbiAgdGhpcy5mbHV4ID0gZmx1eDt9XG5cbmltcG9ydCB7YXBwLCBldmVudHMsIGltYWdlcywgbG9jYXRpb25zLCBtZXNzYWdlcywgcG9zdHMsIHRhZ3MsIHVzZXJzLCB3ZWJzb2NrZXR9IGZyb20gJy4vc3RvcmVzJztcblxuY29uc3QgY29uZmlnID0ge2Jhc2VVcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsIGFwaUtleTogJ3ZhbHVlJywgdGltZW91dDogNTAwMH07XG5cbkZpeCBPTkxZIHRoZSBzcGVjaWZpYyBFU0xpbnQgZXJyb3JzIGxpc3RlZCBhYm92ZS4gUmV2aWV3IHRoZSBlbnRpcmUgZmlsZSBmb3IgY29tcGxpYW5jZSB3aXRoIGFsbCBFU0xpbnQgcnVsZXMuXG5SZXR1cm4gb25seSB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIGZpeGVkIGNvZGUgd2l0aG91dCBhbnkgZXhwbGFuYXRpb25zLmA7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpeGVkQ29udGVudCA9IGF3YWl0IGNhbGxBSVNlcnZpY2UocHJvbXB0LCBxdWlldCk7XG5cbiAgICAgICAgICAgIGlmKGZpeGVkQ29udGVudCAmJiBmaXhlZENvbnRlbnQgIT09IGZpbGVDb250ZW50KSB7XG4gICAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZpeGVkQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgbG9nKGBBcHBsaWVkIEFJIGZpeGVzIHRvICR7ZmlsZVBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgbG9nKGBFcnJvciBhcHBseWluZyBBSSBmaXhlcyB0byAke2ZpbGVQYXRofTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGZpeGVzIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gYXBwbHkgQUkgZml4ZXMnKTtcbiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhcHBseURpcmVjdEZpeGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGxldCB3YXNNb2RpZmllZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudDtcblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdhaVNlcnZpY2UudHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGFpU2VydmljZS50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvblxcL2pzb24nLFxccyonQXV0aG9yaXphdGlvbic6IGBCZWFyZXIvZyxcbiAgICAgICAgJ1xcJ0F1dGhvcml6YXRpb25cXCc6IGBCZWFyZXJcXCcsIFxcJ0NvbnRlbnQtVHlwZVxcJzogXFwnYXBwbGljYXRpb24vanNvblxcJydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9oZWFkZXJzOiB7KFtefV0qKX0sXFxzKm1ldGhvZDogJ1BPU1QnL2csXG4gICAgICAgICdtZXRob2Q6IFxcJ1BPU1RcXCcsXFxuICAgICAgaGVhZGVyczogeyQxfSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC97cm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6L2csXG4gICAgICAgICd7Y29udGVudDosIHJvbGU6IFxcJ3N5c3RlbVxcJywnXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL3tyb2xlOiAndXNlcicsIGNvbnRlbnQ6L2csXG4gICAgICAgICd7Y29udGVudDosIHJvbGU6IFxcJ3VzZXJcXCcsJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL1xcKChbXildKj8pXyhbYS16QS1aMC05XSspKFxccyo6W14pXSopXFwpL2csXG4gICAgICAgICcoJDEkMiQzKSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL2NvbnNvbGVcXC5sb2dcXCgvZywgJ2xvZygnKTtcblxuICAgICAgaWYoIW5ld0NvbnRlbnQuaW5jbHVkZXMoJ2ltcG9ydCB7bG9nfScpICYmIG5ld0NvbnRlbnQuaW5jbHVkZXMoJ2xvZygnKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAgIC9pbXBvcnQgeyhbXn1dKil9IGZyb20gJyguKiknOy8sXG4gICAgICAgICAgJ2ltcG9ydCB7JDF9IGZyb20gXFwnJDJcXCc7XFxuaW1wb3J0IHtsb2d9IGZyb20gXFwnLi9sb2cuanNcXCc7J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdyZWFjdFNoaW0udHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgbmFtaW5nLWNvbnZlbnRpb24gaXNzdWVzIGluIHJlYWN0U2hpbS50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAnaW1wb3J0ICogYXMgUmVhY3QgZnJvbScsXG4gICAgICAgICdpbXBvcnQgKiBhcyByZWFjdCBmcm9tJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvUmVhY3RcXC4vZywgJ3JlYWN0LicpO1xuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdjaGFuZ2Vsb2cudHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGNoYW5nZWxvZy50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC8oXFx3KylcXCtcXCsvZywgJyQxICs9IDEnKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcJC9nLCAnJCcpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcLi9nLCAnLicpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcKi9nLCAnKicpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXDovZywgJzonKTtcbiAgICB9XG5cbiAgICBpZihmaWxlUGF0aC5pbmNsdWRlcygnYXBwLnRzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIGlzc3VlcyBpbiBhcHAudHMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvY29uc29sZVxcLmxvZ1xcKC9nLCAnbG9nKCcpO1xuXG4gICAgICBpZighbmV3Q29udGVudC5pbmNsdWRlcygnaW1wb3J0IHtsb2d9JykgJiYgbmV3Q29udGVudC5pbmNsdWRlcygnbG9nKCcpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgL2ltcG9ydCBib3hlbiBmcm9tICdib3hlbic7LyxcbiAgICAgICAgICAnaW1wb3J0IGJveGVuIGZyb20gXFwnYm94ZW5cXCc7XFxuaW1wb3J0IHtsb2d9IGZyb20gXFwnLi9sb2cuanNcXCc7J1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9cXFxcXFwvL2csICcvJyk7XG4gICAgfVxuXG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJ2F1dG9maXguanMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGF1dG9maXguanMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2ltcG9ydCB7KFtefV0qKX0gZnJvbSAncGF0aCc7W1xcc1xcbl0qaW1wb3J0IHsoW159XSopfSBmcm9tICdwYXRoJzsvLFxuICAgICAgICAnaW1wb3J0IHskMSwgJDJ9IGZyb20gXFwncGF0aFxcJzsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvX19maWxlbmFtZS9nLFxuICAgICAgICAnY3VycmVudEZpbGVuYW1lJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9fX2Rpcm5hbWUvZyxcbiAgICAgICAgJ2N1cnJlbnREaXJuYW1lJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2NvbnN0IHByZWZpeCA9IHR5cGUgPT09ICdlcnJvcicgXFw/ICdcdTI3NEMgJyA6IHR5cGUgPT09ICdzdWNjZXNzJyBcXD8gJ1x1MjcwNSAnIDogJ1x1MjEzOVx1RkUwRiAnOy8sXG4gICAgICAgICdsZXQgcHJlZml4ID0gXFwnXHUyMTM5XHVGRTBGIFxcJztcXG5pZih0eXBlID09PSBcXCdlcnJvclxcJykge1xcbiAgcHJlZml4ID0gXFwnXHUyNzRDIFxcJztcXG59IGVsc2UgaWYodHlwZSA9PT0gXFwnc3VjY2Vzc1xcJykge1xcbiAgcHJlZml4ID0gXFwnXHUyNzA1IFxcJztcXG59J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIHJ1bkVzbGludEZpeFxcKFxcKS9nLFxuICAgICAgICAnY29uc3QgcnVuRXNsaW50Rml4ID0gYXN5bmMgKCknXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIGdldEZpbGVzV2l0aEVycm9yc1xcKFxcKS9nLFxuICAgICAgICAnY29uc3QgZ2V0RmlsZXNXaXRoRXJyb3JzID0gYXN5bmMgKCknXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIGlzQ3Vyc29yQXZhaWxhYmxlXFwoXFwpL2csXG4gICAgICAgICdjb25zdCBpc0N1cnNvckF2YWlsYWJsZSA9IGFzeW5jICgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBmaXhGaWxlV2l0aEN1cnNvckFJXFwoZmlsZVBhdGhcXCkvZyxcbiAgICAgICAgJ2NvbnN0IGZpeEZpbGVXaXRoQ3Vyc29yQUkgPSBhc3luYyAoZmlsZVBhdGgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBtYWluXFwoXFwpL2csXG4gICAgICAgICdjb25zdCBtYWluID0gYXN5bmMgKCknXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmN9L2csXG4gICAgICAgICdpbXBvcnQge3dyaXRlRmlsZVN5bmN9J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2NvbnNvbGVcXC5sb2dcXChgXFwke3ByZWZpeH0gXFwke21lc3NhZ2V9YFxcKTsvZyxcbiAgICAgICAgJ3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3ByZWZpeH0gJHttZXNzYWdlfVxcXFxuYCk7J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL30gY2F0Y2hcXChlcnJvclxcKSB7W1xcc1xcbl0qXFwvXFwvIElnbm9yZSBjbGVhbnVwIGVycm9ycy9nLFxuICAgICAgICAnfSBjYXRjaChfKSB7XFxuICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC99IGNhdGNoXFwoZXJyb3JcXCkge1tcXHNcXG5dKmxvZ1xcKC9nLFxuICAgICAgICAnfSBjYXRjaChlcnIpIHtcXG4gICAgbG9nKCdcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvfSBjYXRjaFxcKGVycm9yXFwpIHtbXFxzXFxuXSpyZXR1cm4gZmFsc2U7L2csXG4gICAgICAgICd9IGNhdGNoKF8pIHtcXG4gICAgcmV0dXJuIGZhbHNlOydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9mb3JcXChjb25zdCBmaWxlUGF0aCBvZiBmaWxlc1dpdGhFcnJvcnNcXCkge1tcXHNcXG5dKmNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaXhGaWxlV2l0aEN1cnNvckFJXFwoZmlsZVBhdGhcXCk7L2csXG4gICAgICAgICdjb25zdCBmaXhSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXNXaXRoRXJyb3JzLm1hcChmaWxlUGF0aCA9PiBmaXhGaWxlV2l0aEN1cnNvckFJKGZpbGVQYXRoKSkpO1xcbmZvcihjb25zdCBzdWNjZXNzIG9mIGZpeFJlc3VsdHMpIHsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvZml4ZWRDb3VudFxcK1xcKzsvZyxcbiAgICAgICAgJ2ZpeGVkQ291bnQgKz0gMTsnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmKG5ld0NvbnRlbnQgIT09IGZpbGVDb250ZW50KSB7XG4gICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCAndXRmOCcpO1xuICAgICAgbG9nKGBGaXhlZCBpc3N1ZXMgaW4gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHdhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2FzTW9kaWZpZWQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIGFwcGx5aW5nIGRpcmVjdCBmaXhlcyB0byAke2ZpbGVQYXRofTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IGxvYWRBSUNvbmZpZyA9IGFzeW5jIChjd2Q6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG4gIGNvbnN0IGNvbmZpZ0Jhc2VOYW1lID0gJ2xleC5jb25maWcnO1xuICBsZXQgbGV4Q29uZmlnUGF0aCA9ICcnO1xuXG4gIGZvcihjb25zdCBmb3JtYXQgb2YgY29uZmlnRm9ybWF0cykge1xuICAgIGNvbnN0IHBvdGVudGlhbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIGAuLyR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWApO1xuICAgIGlmKGV4aXN0c1N5bmMocG90ZW50aWFsUGF0aCkpIHtcbiAgICAgIGxleENvbmZpZ1BhdGggPSBwb3RlbnRpYWxQYXRoO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYobGV4Q29uZmlnUGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsZXhDb25maWcgPSBhd2FpdCBpbXBvcnQobGV4Q29uZmlnUGF0aCk7XG4gICAgICBpZihsZXhDb25maWcuZGVmYXVsdCAmJiBsZXhDb25maWcuZGVmYXVsdC5haSkge1xuICAgICAgICBsb2coYEZvdW5kIEFJIGNvbmZpZ3VyYXRpb24gaW4gJHtwYXRoUmVzb2x2ZShjd2QsIGxleENvbmZpZ1BhdGgpfSwgYXBwbHlpbmcgc2V0dGluZ3MuLi5gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5haSA9IHsuLi5MZXhDb25maWcuY29uZmlnLmFpLCAuLi5sZXhDb25maWcuZGVmYXVsdC5haX07XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBFcnJvciBsb2FkaW5nIEFJIGNvbmZpZ3VyYXRpb24gZnJvbSAke2xleENvbmZpZ1BhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGludCA9IGFzeW5jIChjbWQ6IExpbnRPcHRpb25zLCBjYWxsYmFjazogTGludENhbGxiYWNrID0gcHJvY2Vzcy5leGl0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBmaXggPSBmYWxzZSxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgY29uZmlnID0gbnVsbFxuICB9ID0gY21kO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSBsaW50aW5nLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGF3YWl0IGxvYWRBSUNvbmZpZyhjd2QsIHF1aWV0KTtcblxuICBsZXQgb3JpZ2luYWxDb25maWc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgdGVtcENvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgdXNlVHlwZXNjcmlwdCA9IGRldGVjdFR5cGVTY3JpcHQoY3dkKTtcbiAgICBsb2coYFR5cGVTY3JpcHQgJHt1c2VUeXBlc2NyaXB0ID8gJ2RldGVjdGVkJyA6ICdub3QgZGV0ZWN0ZWQnfSBmcm9tIHRzY29uZmlnLmpzb25gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICAgIExleENvbmZpZy5jaGVja0xpbnRUeXBlc2NyaXB0Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgZW5zdXJlTW9kdWxlVHlwZShjd2QpO1xuXG4gICAgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyhjd2QsIHVzZVR5cGVzY3JpcHQsIHF1aWV0KTtcblxuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCAnZXNsaW50LmNvbmZpZy5qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgaGFzRXNsaW50Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHxcbiAgICAgIGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcykgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzJykpIHx8XG4gICAgICBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJy5lc2xpbnRyYy5qc29uJykpIHx8XG4gICAgICBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJy5lc2xpbnRyYy55bWwnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLnlhbWwnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjJykpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMuanNvbicpKSkge1xuICAgICAgdW5saW5rU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMuanNvbicpKTtcbiAgICB9XG5cbiAgICBsZXQgbGV4Q29uZmlnUGF0aCA9ICcnO1xuICAgIGxldCBzaG91bGRDcmVhdGVUZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgICBpZighaGFzRXNsaW50Q29uZmlnKSB7XG4gICAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ2VzbGludC5jb25maWcudHMnKVxuICAgICAgXTtcblxuICAgICAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgICBpZihleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICAgICAgbGV4Q29uZmlnUGF0aCA9IHBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBDdXJyZW50IGRpcmVjdG9yeTogJHtjdXJyZW50RGlybmFtZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgbG9nKGBQcm9qZWN0IGNvbmZpZyBwYXRoOiAke3Byb2plY3RDb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBsb2coYFByb2plY3QgY29uZmlnIGV4aXN0czogJHtoYXNFc2xpbnRDb25maWd9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgRm91bmQgTGV4IGNvbmZpZzogJHtsZXhDb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBsb2coYExleCBjb25maWcgZXhpc3RzOiAkeyEhbGV4Q29uZmlnUGF0aCAmJiBleGlzdHNTeW5jKGxleENvbmZpZ1BhdGgpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBpZihsZXhDb25maWdQYXRoICYmIGV4aXN0c1N5bmMobGV4Q29uZmlnUGF0aCkpIHtcbiAgICAgICAgbG9nKCdObyBFU0xpbnQgY29uZmlndXJhdGlvbiBmb3VuZCBpbiBwcm9qZWN0LiBVc2luZyBMZXhcXCdzIGRlZmF1bHQgY29uZmlndXJhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3VsZENyZWF0ZVRlbXBDb25maWcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNvbmZpZykge1xuICAgICAgY29uc3QgdXNlckNvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsIGNvbmZpZyk7XG4gICAgICBpZihleGlzdHNTeW5jKHVzZXJDb25maWdQYXRoKSkge1xuICAgICAgICBsb2coYFVzaW5nIHNwZWNpZmllZCBFU0xpbnQgY29uZmlndXJhdGlvbjogJHtjb25maWd9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIHNob3VsZENyZWF0ZVRlbXBDb25maWcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZyhgU3BlY2lmaWVkIEVTTGludCBjb25maWd1cmF0aW9uIG5vdCBmb3VuZDogJHtjb25maWd9LiBVc2luZyBMZXgncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoc2hvdWxkQ3JlYXRlVGVtcENvbmZpZykge1xuICAgICAgbG9nKCdObyBFU0xpbnQgY29uZmlndXJhdGlvbiBmb3VuZC4gQ3JlYXRpbmcgYSB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbi4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgY29uZmlnUmVzdWx0ID0gY3JlYXRlRGVmYXVsdEVTTGludENvbmZpZyh1c2VUeXBlc2NyaXB0LCBjd2QpO1xuICAgICAgdGVtcENvbmZpZ1BhdGggPSBjb25maWdSZXN1bHQuY29uZmlnUGF0aDtcbiAgICAgIG9yaWdpbmFsQ29uZmlnID0gY29uZmlnUmVzdWx0Lm9yaWdpbmFsQ29uZmlnO1xuICAgIH1cblxuICAgIGxldCBlc2xpbnRPdXRwdXQgPSAnJztcbiAgICBjb25zdCBjYXB0dXJlT3V0cHV0ID0gKG91dHB1dDogc3RyaW5nKSA9PiB7XG4gICAgICBlc2xpbnRPdXRwdXQgKz0gYCR7b3V0cHV0fVxcbmA7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkVzbGludFdpdGhMZXgoY3dkLCBxdWlldCwgY2xpTmFtZSwgdHJ1ZSwgZGVidWcsIHVzZVR5cGVzY3JpcHQsIGNhcHR1cmVPdXRwdXQpO1xuXG4gICAgaWYocmVzdWx0ICE9PSAwICYmIGZpeCkge1xuICAgICAgY29uc3QgYWlDb25maWd1cmVkID0gTGV4Q29uZmlnLmNvbmZpZy5haT8ucHJvdmlkZXIgJiYgTGV4Q29uZmlnLmNvbmZpZy5haS5wcm92aWRlciAhPT0gJ25vbmUnO1xuXG4gICAgICBpZihhaUNvbmZpZ3VyZWQpIHtcbiAgICAgICAgbG9nKCdBcHBseWluZyBBSSBmaXhlcyB0byByZW1haW5pbmcgaXNzdWVzLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGF3YWl0IGFwcGx5QUlGaXgoY3dkLCBlc2xpbnRPdXRwdXQsIHF1aWV0KTtcblxuICAgICAgICBjb25zdCBhZnRlckZpeFJlc3VsdCA9IGF3YWl0IHJ1bkVzbGludFdpdGhMZXgoY3dkLCBxdWlldCwgY2xpTmFtZSwgZmFsc2UsIGRlYnVnLCB1c2VUeXBlc2NyaXB0KTtcblxuICAgICAgICBjYWxsYmFjayhhZnRlckZpeFJlc3VsdCk7XG4gICAgICAgIHJldHVybiBhZnRlckZpeFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGxvZygnRVNMaW50IGNvdWxkIG5vdCBmaXggYWxsIGlzc3VlcyBhdXRvbWF0aWNhbGx5LicsICd3YXJuJywgcXVpZXQpO1xuICAgICAgbG9nKCdUbyBlbmFibGUgQUktcG93ZXJlZCBmaXhlcywgYWRkIEFJIGNvbmZpZ3VyYXRpb24gdG8geW91ciBsZXguY29uZmlnIGZpbGU6JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coYFxuLy8gSW4gbGV4LmNvbmZpZy5qcyAob3IgbGV4LmNvbmZpZy5tanMsIGxleC5jb25maWcuY2pzLCBldGMuKVxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBZb3VyIGV4aXN0aW5nIGNvbmZpZ1xuICBhaToge1xuICAgIHByb3ZpZGVyOiAnY3Vyc29yJyAvLyBvciAnb3BlbmFpJywgJ2FudGhyb3BpYycsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIHByb3ZpZGVyLXNwZWNpZmljIHNldHRpbmdzXG4gIH1cbn07YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGlmKHNwaW5uZXIpIHtcbiAgICAgIHNwaW5uZXIuZmFpbCgnTGludGluZyBmYWlsZWQhJyk7XG4gICAgfVxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9IGZpbmFsbHkge1xuICAgIGlmKHRlbXBDb25maWdQYXRoICYmIG9yaWdpbmFsQ29uZmlnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBDb25maWdQYXRoLCBvcmlnaW5hbENvbmZpZywgJ3V0ZjgnKTtcbiAgICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHRlbXBDb25maWdQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB1bmxpbmtTeW5jKHRlbXBDb25maWdQYXRoKTtcbiAgICAgIH0gY2F0Y2go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
993
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2xpbnQvbGludC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmUsIGV4dG5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmxldCBjdXJyZW50RmlsZW5hbWU6IHN0cmluZztcbmxldCBjdXJyZW50RGlybmFtZTogc3RyaW5nO1xuXG50cnkge1xuICBjdXJyZW50RmlsZW5hbWUgPSBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKScpO1xuICBjdXJyZW50RGlybmFtZSA9IGRpcm5hbWUoY3VycmVudEZpbGVuYW1lKTtcbn0gY2F0Y2gge1xuICBjdXJyZW50RmlsZW5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xuICBjdXJyZW50RGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGludE9wdGlvbnMge1xuICByZWFkb25seSBjYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNhY2hlRmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY2FjaGVMb2NhdGlvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nO1xuICByZWFkb25seSBlbnZJbmZvPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXh0Pzogc3RyaW5nO1xuICByZWFkb25seSBmaXg/OiBib29sZWFuO1xuICByZWFkb25seSBmaXhEcnlSdW4/OiBib29sZWFuO1xuICByZWFkb25seSBmaXhUeXBlPzogc3RyaW5nO1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsb2JhbD86IHN0cmluZztcbiAgcmVhZG9ubHkgaWdub3JlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgaWdub3JlUGF0dGVybj86IHN0cmluZztcbiAgcmVhZG9ubHkgaW5pdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1heFdhcm5pbmdzPzogc3RyaW5nO1xuICByZWFkb25seSBub0NvbG9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9Fc2xpbnRyYz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG5vSWdub3JlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9JbmxpbmVDb25maWc/OiBib29sZWFuO1xuICByZWFkb25seSBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJzZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnNlck9wdGlvbnM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbj86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbnRDb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29tbWVudHM/OiBib29sZWFuO1xuICByZWFkb25seSByZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc29sdmVQbHVnaW5zUmVsYXRpdmVUbz86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXNkaXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZGluPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RkaW5GaWxlbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTGludENhbGxiYWNrID0gdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuaW50ZXJmYWNlIENvbmZpZ1Jlc3VsdCB7XG4gIGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgb3JpZ2luYWxDb25maWc6IHN0cmluZyB8IG51bGw7XG59XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRFU0xpbnRDb25maWcgPSAodXNlVHlwZXNjcmlwdDogYm9vbGVhbiwgY3dkOiBzdHJpbmcpOiBDb25maWdSZXN1bHQgPT4ge1xuICAvLyBVc2UgYSB0ZW1wb3JhcnkgZmlsZSBwYXRoIGluc3RlYWQgb2YgY3JlYXRpbmcgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICcubGV4LXRlbXAtZGVmYXVsdC1lc2xpbnQuY2pzJyk7XG4gIGNvbnN0IG9yaWdpbmFsQ29uZmlnID0gbnVsbDtcblxuICAvLyBUcnkgdG8gbG9jYXRlIExleCdzIEVTTGludCBjb25maWdcbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ2VzbGludC5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ2VzbGludC5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnLi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLnRzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy4vbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnZXNsaW50LmNvbmZpZy5qcycpXG4gIF07XG5cbiAgbGV0IGZvdW5kQ29uZmlnID0gJyc7XG5cbiAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIGZvdW5kQ29uZmlnID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBDb21tb25KUyBtb2R1bGUgdGhhdCByZXF1aXJlcyBMZXgncyBFU0xpbnQgY29uZmlnXG4gIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBgLy8gVGVtcG9yYXJ5IEVTTGludCBjb25maWcgZ2VuZXJhdGVkIGJ5IExleFxuY29uc3QgbGV4Q29uZmlnID0gcmVxdWlyZSgnQG5sYWJzL2xleC9lc2xpbnQuY29uZmlnLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbGV4Q29uZmlnO2A7XG5cbiAgd3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjb25maWdDb250ZW50LCAndXRmOCcpO1xuXG4gIHJldHVybiB7XG4gICAgY29uZmlnUGF0aCxcbiAgICBvcmlnaW5hbENvbmZpZ1xuICB9O1xufTtcblxuY29uc3QgY3JlYXRlQmFzaWNFU0xpbnRDb25maWcgPSAodXNlVHlwZXNjcmlwdDogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIC8vIENyZWF0ZSBhIHNpbXBsaWZpZWQgY29uZmlnIHRoYXQgZXh0ZW5kcyBMZXgncyBFU0xpbnQgY29uZmlnXG4gIGNvbnN0IGNvbmZpZyA9IGAvLyBFU0xpbnQgY29uZmlndXJhdGlvblxuaW1wb3J0IGxleENvbmZpZyBmcm9tICdAbmxhYnMvbGV4L2VzbGludC5jb25maWcuanMnO1xuXG5yZXR1cm4gbGV4Q29uZmlnO2A7XG4gIHJldHVybiBjb25maWc7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIFR5cGVTY3JpcHQgaXMgYmVpbmcgdXNlZCBieSBsb29raW5nIGZvciB0c2NvbmZpZy5qc29uXG4gKi9cbmNvbnN0IGRldGVjdFR5cGVTY3JpcHQgPSAoY3dkOiBzdHJpbmcpOiBib29sZWFuID0+IGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuanNvbicpKTtcblxuLyoqXG4gKiBFbnN1cmUgcGFja2FnZS5qc29uIGhhcyB0eXBlOiBtb2R1bGUgZm9yIEVTTSBzdXBwb3J0XG4gKi9cbmNvbnN0IGVuc3VyZU1vZHVsZVR5cGUgPSAoY3dkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aFJlc29sdmUoY3dkLCAncGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KTtcblxuICAgICAgLy8gSWYgdHlwZSBpcyBub3Qgc2V0IHRvIG1vZHVsZSwgd2FybiBpbnN0ZWFkIG9mIGF1dG8tbW9kaWZ5aW5nXG4gICAgICBpZihwYWNrYWdlSnNvbi50eXBlICE9PSAnbW9kdWxlJykge1xuICAgICAgICBsb2coJ1dhcm5pbmc6IHBhY2thZ2UuanNvbiBzaG91bGQgaGF2ZSBcInR5cGVcIjogXCJtb2R1bGVcIiBmb3IgRVNNIHN1cHBvcnQuIFBsZWFzZSBhZGQgdGhpcyBtYW51YWxseS4nLCAnd2FybicsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgaW5zdGFsbERlcGVuZGVuY2llcyA9IGFzeW5jIChjd2Q6IHN0cmluZywgdXNlVHlwZXNjcmlwdDogYm9vbGVhbiwgcXVpZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgIGxvZygnVXNpbmcgVHlwZVNjcmlwdCBFU0xpbnQgZnJvbSBMZXguLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgfSBlbHNlIHtcbiAgICBsb2coJ1VzaW5nIEVTTGludCBmcm9tIExleC4uLicsICdpbmZvJywgcXVpZXQpO1xuICB9XG59O1xuXG5jb25zdCBydW5Fc2xpbnRXaXRoTGV4ID0gYXN5bmMgKFxuICBjd2Q6IHN0cmluZyxcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGNsaU5hbWU6IHN0cmluZyxcbiAgZml4OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhbixcbiAgdXNlVHlwZXNjcmlwdDogYm9vbGVhbixcbiAgY2FwdHVyZU91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gdm9pZFxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLmpzJyk7XG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGhUcyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ2VzbGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHwgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKTtcbiAgICBjb25zdCBoYXNMZXhDb25maWdFc2xpbnQgPSBMZXhDb25maWcuY29uZmlnLmVzbGludCAmJiBPYmplY3Qua2V5cyhMZXhDb25maWcuY29uZmlnLmVzbGludCkubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcuanMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnLi4vLi4vLi4vLi4vZXNsaW50LmNvbmZpZy50cycpLFxuICAgICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ2VzbGludC5jb25maWcuanMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvdXNyL2xvY2FsL2xpYi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLnRzJylcbiAgICBdO1xuXG4gICAgbGV0IGxleENvbmZpZ1BhdGggPSAnJztcbiAgICBmb3IoY29uc3QgcGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgICBpZihleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICAgIGxleENvbmZpZ1BhdGggPSBwYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY29uZmlnUGF0aCA9ICcnO1xuICAgIGxldCB0ZW1wQ29uZmlnUGF0aCA9ICcnO1xuXG4gICAgLy8gUHJpb3JpdHk6XG4gICAgLy8gMS4gUHJvamVjdCBlc2xpbnQuY29uZmlnIGZpbGVzXG4gICAgLy8gMi4gRVNMaW50IGNvbmZpZyBpbiBsZXguY29uZmlnLiogZmlsZVxuICAgIC8vIDMuIExleCdzIGRlZmF1bHQgZXNsaW50LmNvbmZpZy5qc1xuICAgIC8vIDQuIENyZWF0ZSBhIHRlbXBvcmFyeSBjb25maWcgZmlsZVxuICAgIGlmKGhhc1Byb2plY3RDb25maWcpIHtcbiAgICAgIGNvbmZpZ1BhdGggPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoVHMpID8gcHJvamVjdENvbmZpZ1BhdGhUcyA6IHByb2plY3RDb25maWdQYXRoO1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBVc2luZyBwcm9qZWN0IEVTTGludCBjb25maWcgZmlsZTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihoYXNMZXhDb25maWdFc2xpbnQpIHtcbiAgICAgIC8vIFdoZW4gdXNpbmcgbGV4LmNvbmZpZy5lc2xpbnQsIGNyZWF0ZSBhIHRlbXBvcmFyeSBKUyBjb25maWcgZmlsZSAobm90IEpTT04pXG4gICAgICAvLyB0byBhdm9pZCBFU00gSlNPTiBpbXBvcnQgaXNzdWVzXG4gICAgICB0ZW1wQ29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJy5sZXgtdGVtcC1lc2xpbnQuY2pzJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIENvbW1vbkpTIG1vZHVsZSB0aGF0IGV4dGVuZHMgTGV4J3MgZXNsaW50IGNvbmZpZ1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IGAvLyBUZW1wb3JhcnkgRVNMaW50IGNvbmZpZyBnZW5lcmF0ZWQgYnkgTGV4XG5jb25zdCBsZXhDb25maWcgPSByZXF1aXJlKCdAbmxhYnMvbGV4L2VzbGludC5jb25maWcuanMnKTtcbmNvbnN0IHVzZXJDb25maWcgPSAke0pTT04uc3RyaW5naWZ5KExleENvbmZpZy5jb25maWcuZXNsaW50LCBudWxsLCAyKX07XG5cbi8vIE1lcmdlIExleCdzIGNvbmZpZyB3aXRoIHVzZXIgY29uZmlnXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLi4ubGV4Q29uZmlnXG59O2A7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmModGVtcENvbmZpZ1BhdGgsIGNvbmZpZ0NvbnRlbnQsICd1dGY4Jyk7XG4gICAgICBjb25maWdQYXRoID0gdGVtcENvbmZpZ1BhdGg7XG5cbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgRVNMaW50IGNvbmZpZyBmcm9tIGxleC5jb25maWcuKiBmaWxlIHZpYSB0ZW1wIGZpbGU6ICR7dGVtcENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGxleENvbmZpZ1BhdGggJiYgZXhpc3RzU3luYyhsZXhDb25maWdQYXRoKSkge1xuICAgICAgY29uZmlnUGF0aCA9IGxleENvbmZpZ1BhdGg7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIExleCBFU0xpbnQgY29uZmlnIGZpbGU6ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGRlZmF1bHQgY29uZmlnIGZpbGUgaWYgbm8gb3RoZXIgY29uZmlnIGlzIGZvdW5kXG4gICAgICB0ZW1wQ29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJy5sZXgtdGVtcC1kZWZhdWx0LWVzbGludC5janMnKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgYmFzaWMgRVNMaW50IGNvbmZpZ1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IGAvLyBUZW1wb3JhcnkgZGVmYXVsdCBFU0xpbnQgY29uZmlnIGdlbmVyYXRlZCBieSBMZXhcbmNvbnN0IGxleENvbmZpZyA9IHJlcXVpcmUoJ0BubGFicy9sZXgvZXNsaW50LmNvbmZpZy5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxleENvbmZpZztgO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHRlbXBDb25maWdQYXRoLCBjb25maWdDb250ZW50LCAndXRmOCcpO1xuICAgICAgY29uZmlnUGF0aCA9IHRlbXBDb25maWdQYXRoO1xuXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYENyZWF0ZWQgdGVtcG9yYXJ5IGRlZmF1bHQgRVNMaW50IGNvbmZpZyBhdDogJHt0ZW1wQ29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnTm8gRVNMaW50IGNvbmZpZ3VyYXRpb24gZm91bmQuIFVzaW5nIExleCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXNsaW50QmluYXJ5ID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ2VzbGludCcsICdlc2xpbnQnKTtcblxuICAgIGlmKCFlc2xpbnRCaW5hcnkpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRVNMaW50IGJpbmFyeSBub3QgZm91bmQgaW4gTGV4J3Mgbm9kZV9tb2R1bGVzYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgbG9nKCdQbGVhc2UgcmVpbnN0YWxsIExleCBvciBjaGVjayB5b3VyIGluc3RhbGxhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIEJhc2UgRVNMaW50IGFyZ3VtZW50c1xuICAgIGNvbnN0IGJhc2VFc2xpbnRBcmdzID0gW1xuICAgICAgLi4uKGZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihkZWJ1ZyA/IFsnLS1kZWJ1ZyddIDogW10pLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgJy0tbm8td2Fybi1pZ25vcmVkJ1xuICAgIF07XG5cbiAgICAvLyBBZGQgY29uZmlnIHBhdGhcbiAgICBjb25zdCBjb25maWdBcmdzID0gY29uZmlnUGF0aCA/IFsnLS1jb25maWcnLCBjb25maWdQYXRoXSA6IFtdO1xuXG4gICAgY29uc3QganNSZXN1bHQgPSBhd2FpdCBleGVjYShlc2xpbnRCaW5hcnksIFtcbiAgICAgICdzcmMvKiovKi57anMsanN4fScsXG4gICAgICAuLi5jb25maWdBcmdzLFxuICAgICAgLi4uYmFzZUVzbGludEFyZ3NcbiAgICBdLCB7XG4gICAgICByZWplY3Q6IGZhbHNlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGN3ZCxcbiAgICAgIHNoZWxsOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZihqc1Jlc3VsdC5zdGRvdXQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGpzUmVzdWx0LnN0ZG91dCk7XG4gICAgICBpZihjYXB0dXJlT3V0cHV0KSB7XG4gICAgICAgIGNhcHR1cmVPdXRwdXQoanNSZXN1bHQuc3Rkb3V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihqc1Jlc3VsdC5zdGRlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoanNSZXN1bHQuc3RkZXJyKTtcbiAgICAgIGlmKGNhcHR1cmVPdXRwdXQpIHtcbiAgICAgICAgY2FwdHVyZU91dHB1dChqc1Jlc3VsdC5zdGRlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0c1Jlc3VsdDogYW55ID0ge2V4aXRDb2RlOiAwLCBzdGRvdXQ6ICcnLCBzdGRlcnI6ICcnfTtcbiAgICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgICB0c1Jlc3VsdCA9IGF3YWl0IGV4ZWNhKGVzbGludEJpbmFyeSwgW1xuICAgICAgICAnc3JjLyoqLyoue3RzLHRzeH0nLFxuICAgICAgICAuLi5jb25maWdBcmdzLFxuICAgICAgICAuLi5iYXNlRXNsaW50QXJnc1xuICAgICAgXSwge1xuICAgICAgICByZWplY3Q6IGZhbHNlLFxuICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICBjd2QsXG4gICAgICAgIHNoZWxsOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgaWYodHNSZXN1bHQuc3Rkb3V0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRzUmVzdWx0LnN0ZG91dCk7XG4gICAgICB9XG5cbiAgICAgIGlmKHRzUmVzdWx0LnN0ZGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKHRzUmVzdWx0LnN0ZGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgdGVtcCBmaWxlIGlmIGNyZWF0ZWRcbiAgICBpZih0ZW1wQ29uZmlnUGF0aCAmJiBleGlzdHNTeW5jKHRlbXBDb25maWdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdW5saW5rU3luYyh0ZW1wQ29uZmlnUGF0aCk7XG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBSZW1vdmVkIHRlbXBvcmFyeSBFU0xpbnQgY29uZmlnIGF0ICR7dGVtcENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgLy8gSWdub3JlIGVycm9ycyB3aGVuIGNsZWFuaW5nIHVwXG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBGYWlsZWQgdG8gcmVtb3ZlIHRlbXBvcmFyeSBFU0xpbnQgY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlc2xpbnROb3RGb3VuZCA9IGpzUmVzdWx0LnN0ZGVycj8uaW5jbHVkZXMoJ2NvbW1hbmQgbm90IGZvdW5kJykgfHwganNSZXN1bHQuc3RkZXJyPy5pbmNsdWRlcygnZXNsaW50OiBjb21tYW5kIG5vdCBmb3VuZCcpO1xuICAgIGlmKGVzbGludE5vdEZvdW5kKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0VTTGludCBub3QgZm91bmQhJyk7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IExleCdzIEVTTGludCBiaW5hcnkgbm90IGZvdW5kLiBQbGVhc2UgcmVpbnN0YWxsIExleCBvciBjaGVjayB5b3VyIGluc3RhbGxhdGlvbi5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZihqc1Jlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiB0c1Jlc3VsdC5leGl0Q29kZSA9PT0gMCkge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdMaW50aW5nIGNvbXBsZXRlZCEnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IG5vRmlsZXNGb3VuZCA9XG4gICAgICAoanNSZXN1bHQuc3RkZXJyPy5pbmNsdWRlcygnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpIHx8IGpzUmVzdWx0LnN0ZG91dD8uaW5jbHVkZXMoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSkgJiZcbiAgICAgICghdXNlVHlwZXNjcmlwdCB8fCB0c1Jlc3VsdC5zdGRlcnI/LmluY2x1ZGVzKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykgfHwgdHNSZXN1bHQuc3Rkb3V0Py5pbmNsdWRlcygnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpKTtcblxuICAgIGlmKG5vRmlsZXNGb3VuZCkge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdObyBmaWxlcyBmb3VuZCB0byBsaW50Jyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc3Bpbm5lci5mYWlsKCdMaW50aW5nIGZhaWxlZCEnKTtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVTTGludCBmb3VuZCBpc3N1ZXMgaW4geW91ciBjb2RlLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICByZXR1cm4gMTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnTGludGluZyBmYWlsZWQhJyk7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5jb25zdCBhcHBseUFJRml4ID0gYXN5bmMgKFxuICBjd2Q6IHN0cmluZyxcbiAgZXJyb3JzOiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuICBzcGlubmVyLnN0YXJ0KCdVc2luZyBBSSB0byBmaXggcmVtYWluaW5nIGxpbnQgaXNzdWVzLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlRXJyb3JNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgY29uc3QgbGluZXMgPSBlcnJvcnMuc3BsaXQoJ1xcbicpO1xuICAgIGxldCBjdXJyZW50RmlsZSA9ICcnO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGlmKGxpbmUubWF0Y2goL14oXFwvfFtBLVpdOlxcXFwpLio/XFwuKGpzfGpzeHx0c3x0c3gpJC8pKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlID0gbGluZS50cmltKCk7XG4gICAgICAgIGlmKCFmaWxlRXJyb3JNYXAuaGFzKGN1cnJlbnRGaWxlKSkge1xuICAgICAgICAgIGZpbGVFcnJvck1hcC5zZXQoY3VycmVudEZpbGUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKGN1cnJlbnRGaWxlICYmIGxpbmUudHJpbSgpICYmIGxpbmUubWF0Y2goL1xccytcXGQrOlxcZCtcXHMrKGVycm9yfHdhcm5pbmcpXFxzKy8pKSB7XG4gICAgICAgIGNvbnN0IGVycm9yQXJyYXkgPSBmaWxlRXJyb3JNYXAuZ2V0KGN1cnJlbnRGaWxlKTtcbiAgICAgICAgaWYoZXJyb3JBcnJheSkge1xuICAgICAgICAgIGVycm9yQXJyYXkucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihmaWxlRXJyb3JNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgbG9nKCdVc2luZyBhbHRlcm5hdGl2ZSBlcnJvciBwYXJzaW5nIHN0cmF0ZWd5JywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gZXJyb3JzLnNwbGl0KCdcXG5cXG4nKTtcblxuICAgICAgZm9yKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgICAgaWYoc2VjdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IHNlY3Rpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGxpbmVzWzBdLnRyaW0oKTtcblxuICAgICAgICBpZihmaWxlUGF0aC5tYXRjaCgvXFwuKGpzfGpzeHx0c3x0c3gpJC8pKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChmaWxlUGF0aCwgW10pO1xuXG4gICAgICAgICAgZm9yKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZihsaW5lc1tpXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgIGZpbGVFcnJvck1hcC5nZXQoZmlsZVBhdGgpPy5wdXNoKGxpbmVzW2ldLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoZmlsZUVycm9yTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGxvZygnVXNpbmcgZGlyZWN0IGZpbGUgcGF0aCBleHRyYWN0aW9uJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoUmVnZXggPSAvKD86XFwvfFtBLVpdOlxcXFwpKD86W146XFxuXStcXC8pKlteOlxcbl0rXFwuKGpzfGpzeHx0c3x0c3gpL2c7XG4gICAgICBjb25zdCBmaWxlUGF0aHMgPSBlcnJvcnMubWF0Y2goZmlsZVBhdGhSZWdleCkgfHwgW107XG5cbiAgICAgIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgICAgaWYoIWZpbGVFcnJvck1hcC5oYXMoZmlsZVBhdGgpICYmIGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChmaWxlUGF0aCwgW10pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtub3duRmlsZXMgPSBbXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy9jcmVhdGUvY2hhbmdlbG9nLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy91dGlscy9haVNlcnZpY2UudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL3V0aWxzL2FwcC50cycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShjd2QsICdzcmMvdXRpbHMvcmVhY3RTaGltLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy9jb21tYW5kcy9saW50L2F1dG9maXguanMnKVxuICAgICAgXTtcblxuICAgICAgZm9yKGNvbnN0IGZpbGUgb2Yga25vd25GaWxlcykge1xuICAgICAgICBpZihleGlzdHNTeW5jKGZpbGUpICYmICFmaWxlRXJyb3JNYXAuaGFzKGZpbGUpKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChmaWxlLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IoY29uc3QgZmlsZVBhdGggb2YgZmlsZUVycm9yTWFwLmtleXMoKSkge1xuICAgICAgaWYoIWV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGxvZyhgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsb2coYFByb2Nlc3NpbmcgZmlsZTogJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgY29uc3QgaXNDdXJzb3JJREUgPSBMZXhDb25maWcuY29uZmlnLmFpPy5wcm92aWRlciA9PT0gJ2N1cnNvcicgfHwgcHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnO1xuXG4gICAgICBpZihpc0N1cnNvcklERSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByb21wdCA9IGBGaXggYWxsIEVTTGludCBlcnJvcnMgaW4gdGhpcyBmaWxlLiBGb2N1cyBvbjpcbjEuIEZpeGluZyBuYW1pbmcgY29udmVudGlvbnNcbjIuIEZpeGluZyBzb3J0LWtleXMgaXNzdWVzXG4zLiBSZXBsYWNpbmcgY29uc29sZS5sb2cgd2l0aCBsb2cgdXRpbGl0eVxuNC4gRml4aW5nIG5vLXBsdXNwbHVzIGlzc3Vlc1xuNS4gRml4aW5nIHVubmVjZXNzYXJ5IGVzY2FwZSBjaGFyYWN0ZXJzXG42LiBGaXhpbmcgb3RoZXIgRVNMaW50IGVycm9yc1xuXG5DUklUSUNBTCBSRVFVSVJFTUVOVFM6XG4tIE9OTFkgZml4IHRoZSBzcGVjaWZpYyBsaW5lcyB3aXRoIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIG1vZGlmeSBhbnkgb3RoZXIgbGluZXMgb2YgY29kZVxuLSBETyBOT1QgcmVtb3ZlIGxpbmUgYnJlYWtzIHVubGVzcyB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgY2F1c2luZyBFU0xpbnQgZXJyb3JzXG4tIERPIE5PVCBjb25kZW5zZSBtdWx0aS1saW5lIHN0cnVjdHVyZXMgdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIGFsbCBleGlzdGluZyBsaW5lIGJyZWFrcyBhbmQgZm9ybWF0dGluZyB0aGF0IGlzIG5vdCBjYXVzaW5nIGVycm9yc1xuXG5TUEVDSUZJQyBGT1JNQVRUSU5HIFJVTEVTOlxuLSBNYWludGFpbiBwcm9wZXIgaW5kZW50YXRpb24gKDIgc3BhY2VzKVxuLSBLZWVwIGxpbmUgYnJlYWtzIGJldHdlZW4gY2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGFuZCB0aGVpciBtZW1iZXJzXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBtZXRob2RzXG4tIEVuc3VyZSB0aGVyZSBpcyBhIGxpbmUgYnJlYWsgYWZ0ZXIgb3BlbmluZyBicmFjZXMgZm9yIGNsYXNzZXMsIGludGVyZmFjZXMsIGFuZCBtZXRob2RzXG4tIERPIE5PVCBwbGFjZSBjbGFzcy9pbnRlcmZhY2UgcHJvcGVydGllcyBvciBtZXRob2RzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgYnJhY2Vcbi0gUHJlc2VydmUgZW1wdHkgbGluZXMgYmV0d2VlbiBsb2dpY2FsIGNvZGUgYmxvY2tzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgaW1wb3J0cyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuLSBQUkVTRVJWRSBtdWx0aS1saW5lIG9iamVjdC9hcnJheSBkZWNsYXJhdGlvbnMgLSBkbyBub3QgY29uZGVuc2UgdGhlbSB0byBzaW5nbGUgbGluZXNcblxuU09SVC1LRVlTIFJVTEUgKEhJR0hFU1QgUFJJT1JJVFkpOlxuLSBBbGwgb2JqZWN0IGxpdGVyYWwga2V5cyBNVVNUIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBpbiBhc2NlbmRpbmcgb3JkZXJcbi0gVGhpcyBhcHBsaWVzIHRvIEFMTCBvYmplY3RzIGluIHRoZSBmaWxlLCBub3QganVzdCB0aG9zZSB3aXRoIGV4cGxpY2l0IHNvcnQta2V5cyBlcnJvcnNcbi0gRXhhbXBsZToge2I6IDIsIGE6IDEsIGM6IDN9IHNob3VsZCBiZWNvbWUge2E6IDEsIGI6IDIsIGM6IDN9XG4tIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmb3JtYXR0aW5nIGFuZCBsaW5lIGJyZWFrcyB3aGVuIHNvcnRpbmdcblxuRXhhbXBsZSBvZiBDT1JSRUNUIGZvcm1hdHRpbmcgKERPIE5PVCBDSEFOR0UpOlxuZXhwb3J0IGNsYXNzIFVzZXJDb25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge1xuICB0aGlzLkN1c3RvbUFkYXB0ZXIgPSBDdXN0b21BZGFwdGVyO1xuICB0aGlzLmZsdXggPSBmbHV4O1xufVxuXG5pbXBvcnQge1xuICBhcHAsXG4gIGV2ZW50cyxcbiAgaW1hZ2VzLFxuICBsb2NhdGlvbnMsXG4gIG1lc3NhZ2VzLFxuICBwb3N0cyxcbiAgdGFncyxcbiAgdXNlcnMsXG4gIHdlYnNvY2tldFxufSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtcbiAgYXBpS2V5OiAndmFsdWUnLFxuICBiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICB0aW1lb3V0OiA1MDAwXG59O1xuXG5FeGFtcGxlIG9mIElOQ09SUkVDVCBmb3JtYXR0aW5nIChGSVggVEhJUyk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7c3RhdGljIHJlYWRvbmx5IEFERF9JVEVNX0VSUk9SOiBzdHJpbmcgPSAnVVNFUl9BRERfSVRFTV9FUlJPUic7XG4gIHN0YXRpYyByZWFkb25seSBPVEhFUl9DT05TVEFOVDogc3RyaW5nID0gJ09USEVSX0NPTlNUQU5UJztcbn1cblxuY29uc3RydWN0b3IoZmx1eDogRmx1eEZyYW1ld29yaywgQ3VzdG9tQWRhcHRlcjogdHlwZW9mIEV2ZW50ID0gRXZlbnQpIHt0aGlzLkN1c3RvbUFkYXB0ZXIgPSBDdXN0b21BZGFwdGVyO1xuICB0aGlzLmZsdXggPSBmbHV4O31cblxuaW1wb3J0IHthcHAsIGV2ZW50cywgaW1hZ2VzLCBsb2NhdGlvbnMsIG1lc3NhZ2VzLCBwb3N0cywgdGFncywgdXNlcnMsIHdlYnNvY2tldH0gZnJvbSAnLi9zdG9yZXMnO1xuXG5jb25zdCBjb25maWcgPSB7YmFzZVVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJywgYXBpS2V5OiAndmFsdWUnLCB0aW1lb3V0OiA1MDAwfTtcblxuRml4IE9OTFkgdGhlIHNwZWNpZmljIEVTTGludCBlcnJvcnMuIFJldHVybiB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIGNvZGUuYDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9tcHRGaWxlID0gcGF0aFJlc29sdmUoY3dkLCAnLmN1cnNvcl9wcm9tcHRfdGVtcC50eHQnKTtcbiAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMocHJvbXB0RmlsZSwgcHJvbXB0LCAndXRmOCcpO1xuXG4gICAgICAgICAgICAvLyBVc2UgQ3Vyc29yIENMSSB0byBmaXggdGhlIGZpbGVcbiAgICAgICAgICAgIGF3YWl0IGV4ZWNhKCdjdXJzb3InLCBbJ2VkaXQnLCAnLS1maWxlJywgZmlsZVBhdGgsICctLXByb21wdC1maWxlJywgcHJvbXB0RmlsZV0sIHtcbiAgICAgICAgICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgICAgICAgICAgY3dkXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdW5saW5rU3luYyhwcm9tcHRGaWxlKTtcbiAgICAgICAgICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvZyhgQXBwbGllZCBDdXJzb3IgQUkgZml4ZXMgdG8gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNNb2RpZmllZCA9IGF3YWl0IGFwcGx5RGlyZWN0Rml4ZXMoZmlsZVBhdGgsIHF1aWV0KTtcbiAgICAgICAgICAgIGlmKHdhc01vZGlmaWVkKSB7XG4gICAgICAgICAgICAgIGxvZyhgQXBwbGllZCBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICBsb2coYEVycm9yIHVzaW5nIEN1cnNvciBBSTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBhd2FpdCBhcHBseURpcmVjdEZpeGVzKGZpbGVQYXRoLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gYXdhaXQgYXBwbHlEaXJlY3RGaXhlcyhmaWxlUGF0aCwgcXVpZXQpO1xuICAgICAgICBpZih3YXNNb2RpZmllZCkge1xuICAgICAgICAgIGxvZyhgQXBwbGllZCBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVFcnJvcnMgPSBmaWxlRXJyb3JNYXAuZ2V0KGZpbGVQYXRoKSB8fCBbXTtcbiAgICAgICAgaWYoZmlsZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHtjYWxsQUlTZXJ2aWNlfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vdXRpbHMvYWlTZXJ2aWNlLmpzJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgICAgICAgICBjb25zdCBwcm9tcHQgPSBgRml4IHRoZSBmb2xsb3dpbmcgRVNMaW50IGVycm9ycyBpbiB0aGlzIGNvZGU6XG4ke2ZpbGVFcnJvcnMuam9pbignXFxuJyl9XG5cbkhlcmUncyB0aGUgY29kZTpcblxcYFxcYFxcYFxuJHtmaWxlQ29udGVudH1cblxcYFxcYFxcYFxuXG5DUklUSUNBTCBSRVFVSVJFTUVOVFM6XG4tIE9OTFkgZml4IHRoZSBzcGVjaWZpYyBsaW5lcyB3aXRoIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIG1vZGlmeSBhbnkgb3RoZXIgbGluZXMgb2YgY29kZVxuLSBETyBOT1QgcmVtb3ZlIGxpbmUgYnJlYWtzIHVubGVzcyB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgY2F1c2luZyBFU0xpbnQgZXJyb3JzXG4tIERPIE5PVCBjb25kZW5zZSBtdWx0aS1saW5lIHN0cnVjdHVyZXMgdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIGFsbCBleGlzdGluZyBsaW5lIGJyZWFrcyBhbmQgZm9ybWF0dGluZyB0aGF0IGlzIG5vdCBjYXVzaW5nIGVycm9yc1xuXG5TUEVDSUZJQyBGT1JNQVRUSU5HIFJVTEVTOlxuLSBNYWludGFpbiBwcm9wZXIgaW5kZW50YXRpb24gKDIgc3BhY2VzKVxuLSBLZWVwIGxpbmUgYnJlYWtzIGJldHdlZW4gY2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGFuZCB0aGVpciBtZW1iZXJzXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBtZXRob2RzXG4tIEVuc3VyZSB0aGVyZSBpcyBhIGxpbmUgYnJlYWsgYWZ0ZXIgb3BlbmluZyBicmFjZXMgZm9yIGNsYXNzZXMsIGludGVyZmFjZXMsIGFuZCBtZXRob2RzXG4tIERPIE5PVCBwbGFjZSBjbGFzcy9pbnRlcmZhY2UgcHJvcGVydGllcyBvciBtZXRob2RzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgYnJhY2Vcbi0gUHJlc2VydmUgZW1wdHkgbGluZXMgYmV0d2VlbiBsb2dpY2FsIGNvZGUgYmxvY2tzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgaW1wb3J0cyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuLSBQUkVTRVJWRSBtdWx0aS1saW5lIG9iamVjdC9hcnJheSBkZWNsYXJhdGlvbnMgLSBkbyBub3QgY29uZGVuc2UgdGhlbSB0byBzaW5nbGUgbGluZXNcblxuU09SVC1LRVlTIFJVTEUgKEhJR0hFU1QgUFJJT1JJVFkpOlxuLSBBbGwgb2JqZWN0IGxpdGVyYWwga2V5cyBNVVNUIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBpbiBhc2NlbmRpbmcgb3JkZXJcbi0gVGhpcyBhcHBsaWVzIHRvIEFMTCBvYmplY3RzIGluIHRoZSBmaWxlLCBub3QganVzdCB0aG9zZSB3aXRoIGV4cGxpY2l0IHNvcnQta2V5cyBlcnJvcnNcbi0gRXhhbXBsZToge2I6IDIsIGE6IDEsIGM6IDN9IHNob3VsZCBiZWNvbWUge2E6IDEsIGI6IDIsIGM6IDN9XG4tIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmb3JtYXR0aW5nIGFuZCBsaW5lIGJyZWFrcyB3aGVuIHNvcnRpbmdcblxuV0hBVCBUTyBGSVg6XG4xLiBTb3J0aW5nIGFsbCBvYmplY3Qga2V5cyBhbHBoYWJldGljYWxseSAoc29ydC1rZXlzIHJ1bGUpIC0gQUxMIG9iamVjdHMgbXVzdCBoYXZlIHNvcnRlZCBrZXlzXG4yLiBGaXhpbmcgbmFtaW5nIGNvbnZlbnRpb25zIC0gT05MWSBmb3IgdmFyaWFibGVzL2Z1bmN0aW9ucyB3aXRoIG5hbWluZyBlcnJvcnNcbjMuIFJlcGxhY2luZyBjb25zb2xlLmxvZyB3aXRoIGxvZyB1dGlsaXR5IC0gT05MWSBmb3IgY29uc29sZS5sb2cgc3RhdGVtZW50c1xuNC4gRml4aW5nIG5vLXBsdXNwbHVzIGlzc3VlcyAtIE9OTFkgZm9yICsrLy0tIG9wZXJhdG9yc1xuNS4gRml4aW5nIHVubmVjZXNzYXJ5IGVzY2FwZSBjaGFyYWN0ZXJzIC0gT05MWSBmb3IgZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgbmVlZCBlc2NhcGluZ1xuNi4gUHJvcGVyIGluZGVudGF0aW9uIGFuZCBzcGFjaW5nIC0gT05MWSB3aGVyZSBzcGVjaWZpY2FsbHkgcmVxdWlyZWQgYnkgZXJyb3JzXG43LiBTdHJpbmcgcXVvdGVzIGNvbnNpc3RlbmN5ICh1c2Ugc2luZ2xlIHF1b3RlcykgLSBPTkxZIGZvciBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBxdW90ZSBlcnJvcnNcbjguIEltcG9ydCBvcmRlciBhbmQgc3BhY2luZyAtIE9OTFkgZm9yIGltcG9ydHMgd2l0aCBvcmRlci9zcGFjaW5nIGVycm9yc1xuOS4gRnVuY3Rpb24gcGFyYW1ldGVyIGZvcm1hdHRpbmcgLSBPTkxZIGZvciBmdW5jdGlvbnMgd2l0aCBwYXJhbWV0ZXIgZXJyb3JzXG4xMC4gVmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zIC0gT05MWSBmb3IgdmFyaWFibGVzIHdpdGggbmFtaW5nIGVycm9yc1xuMTEuIE5vIHVudXNlZCB2YXJpYWJsZXMgb3IgaW1wb3J0cyAtIE9OTFkgZm9yIHVudXNlZCB2YXJpYWJsZXMvaW1wb3J0c1xuMTIuIEF2b2lkaW5nIG5lc3RlZCB0ZXJuYXJpZXMgLSBPTkxZIGZvciBuZXN0ZWQgdGVybmFyeSBleHByZXNzaW9uc1xuMTMuIEFueSBvdGhlciBFU0xpbnQgZXJyb3JzIC0gT05MWSBmb3IgdGhlIHNwZWNpZmljIGVycm9ycyBsaXN0ZWQgYWJvdmVcblxuV0hBVCBOT1QgVE8gRklYOlxuLSBEbyBub3QgY2hhbmdlIHByb3Blcmx5IGZvcm1hdHRlZCBtdWx0aS1saW5lIHN0cnVjdHVyZXNcbi0gRG8gbm90IHJlbW92ZSBsaW5lIGJyZWFrcyB0aGF0IGFyZSBub3QgY2F1c2luZyBlcnJvcnNcbi0gRG8gbm90IGNoYW5nZSBpbmRlbnRhdGlvbiB0aGF0IGlzIGFscmVhZHkgY29ycmVjdFxuLSBEbyBub3QgbW9kaWZ5IHNwYWNpbmcgdGhhdCBpcyBhbHJlYWR5IGNvcnJlY3Rcbi0gRG8gbm90IGNvbmRlbnNlIHJlYWRhYmxlIG11bHRpLWxpbmUgY29kZSB0byBzaW5nbGUgbGluZXNcbi0gRG8gbm90IG1vZGlmeSBjb2RlIHRoYXQgaXMgbm90IG1lbnRpb25lZCBpbiB0aGUgRVNMaW50IGVycm9yc1xuXG5FeGFtcGxlIG9mIENPUlJFQ1QgZm9ybWF0dGluZyAoRE8gTk9UIENIQU5HRSk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7XG4gIHN0YXRpYyByZWFkb25seSBBRERfSVRFTV9FUlJPUjogc3RyaW5nID0gJ1VTRVJfQUREX0lURU1fRVJST1InO1xuICBzdGF0aWMgcmVhZG9ubHkgT1RIRVJfQ09OU1RBTlQ6IHN0cmluZyA9ICdPVEhFUl9DT05TVEFOVCc7XG59XG5cbmNvbnN0cnVjdG9yKGZsdXg6IEZsdXhGcmFtZXdvcmssIEN1c3RvbUFkYXB0ZXI6IHR5cGVvZiBFdmVudCA9IEV2ZW50KSB7XG4gIHRoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7XG59XG5cbmltcG9ydCB7XG4gIGFwcCxcbiAgZXZlbnRzLFxuICBpbWFnZXMsXG4gIGxvY2F0aW9ucyxcbiAgbWVzc2FnZXMsXG4gIHBvc3RzLFxuICB0YWdzLFxuICB1c2VycyxcbiAgd2Vic29ja2V0XG59IGZyb20gJy4vc3RvcmVzJztcblxuY29uc3QgY29uZmlnID0ge1xuICBhcGlLZXk6ICd2YWx1ZScsXG4gIGJhc2VVcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gIHRpbWVvdXQ6IDUwMDBcbn07XG5cbkV4YW1wbGUgb2YgSU5DT1JSRUNUIGZvcm1hdHRpbmcgKEZJWCBUSElTKTpcbmV4cG9ydCBjbGFzcyBVc2VyQ29uc3RhbnRzIHtzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge3RoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7fVxuXG5pbXBvcnQge2FwcCwgZXZlbnRzLCBpbWFnZXMsIGxvY2F0aW9ucywgbWVzc2FnZXMsIHBvc3RzLCB0YWdzLCB1c2Vycywgd2Vic29ja2V0fSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLCBhcGlLZXk6ICd2YWx1ZScsIHRpbWVvdXQ6IDUwMDB9O1xuXG5GaXggT05MWSB0aGUgc3BlY2lmaWMgRVNMaW50IGVycm9ycyBsaXN0ZWQgYWJvdmUuIFJldmlldyB0aGUgZW50aXJlIGZpbGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCBhbGwgRVNMaW50IHJ1bGVzLlxuUmV0dXJuIG9ubHkgdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBmaXhlZCBjb2RlIHdpdGhvdXQgYW55IGV4cGxhbmF0aW9ucy5gO1xuXG4gICAgICAgICAgICBjb25zdCBmaXhlZENvbnRlbnQgPSBhd2FpdCBjYWxsQUlTZXJ2aWNlKHByb21wdCwgcXVpZXQpO1xuXG4gICAgICAgICAgICBpZihmaXhlZENvbnRlbnQgJiYgZml4ZWRDb250ZW50ICE9PSBmaWxlQ29udGVudCkge1xuICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaXhlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICAgICAgICAgIGxvZyhgQXBwbGllZCBBSSBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgRXJyb3IgYXBwbHlpbmcgQUkgZml4ZXMgdG8gJHtmaWxlUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBmaXhlcyBhcHBsaWVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGFwcGx5IEFJIGZpeGVzJyk7XG4gICAgbG9nKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgYXBwbHlEaXJlY3RGaXhlcyA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nLCBxdWlldDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBsZXQgd2FzTW9kaWZpZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gZmlsZUNvbnRlbnQ7XG5cbiAgICBpZihmaWxlUGF0aC5pbmNsdWRlcygnYWlTZXJ2aWNlLnRzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIGlzc3VlcyBpbiBhaVNlcnZpY2UudHMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgLydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb25cXC9qc29uJyxcXHMqJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyL2csXG4gICAgICAgICdcXCdBdXRob3JpemF0aW9uXFwnOiBgQmVhcmVyXFwnLCBcXCdDb250ZW50LVR5cGVcXCc6IFxcJ2FwcGxpY2F0aW9uL2pzb25cXCcnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvaGVhZGVyczogeyhbXn1dKil9LFxccyptZXRob2Q6ICdQT1NUJy9nLFxuICAgICAgICAnbWV0aG9kOiBcXCdQT1NUXFwnLFxcbiAgICAgIGhlYWRlcnM6IHskMX0nXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAve3JvbGU6ICdzeXN0ZW0nLCBjb250ZW50Oi9nLFxuICAgICAgICAne2NvbnRlbnQ6LCByb2xlOiBcXCdzeXN0ZW1cXCcsJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC97cm9sZTogJ3VzZXInLCBjb250ZW50Oi9nLFxuICAgICAgICAne2NvbnRlbnQ6LCByb2xlOiBcXCd1c2VyXFwnLCdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9cXCgoW14pXSo/KV8oW2EtekEtWjAtOV0rKShcXHMqOlteKV0qKVxcKS9nLFxuICAgICAgICAnKCQxJDIkMyknXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9jb25zb2xlXFwubG9nXFwoL2csICdsb2coJyk7XG5cbiAgICAgIGlmKCFuZXdDb250ZW50LmluY2x1ZGVzKCdpbXBvcnQge2xvZ30nKSAmJiBuZXdDb250ZW50LmluY2x1ZGVzKCdsb2coJykpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAvaW1wb3J0IHsoW159XSopfSBmcm9tICcoLiopJzsvLFxuICAgICAgICAgICdpbXBvcnQgeyQxfSBmcm9tIFxcJyQyXFwnO1xcbmltcG9ydCB7bG9nfSBmcm9tIFxcJy4vbG9nLmpzXFwnOydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihmaWxlUGF0aC5pbmNsdWRlcygncmVhY3RTaGltLnRzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIG5hbWluZy1jb252ZW50aW9uIGlzc3VlcyBpbiByZWFjdFNoaW0udHMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgJ2ltcG9ydCAqIGFzIFJlYWN0IGZyb20nLFxuICAgICAgICAnaW1wb3J0ICogYXMgcmVhY3QgZnJvbSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1JlYWN0XFwuL2csICdyZWFjdC4nKTtcbiAgICB9XG5cbiAgICBpZihmaWxlUGF0aC5pbmNsdWRlcygnY2hhbmdlbG9nLnRzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIGlzc3VlcyBpbiBjaGFuZ2Vsb2cudHMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvKFxcdyspXFwrXFwrL2csICckMSArPSAxJyk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xcXFxcXCQvZywgJyQnKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xcXFxcXC4vZywgJy4nKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xcXFxcXCovZywgJyonKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xcXFw6L2csICc6Jyk7XG4gICAgfVxuXG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJ2FwcC50cycpKSB7XG4gICAgICBsb2coJ0ZpeGluZyBpc3N1ZXMgaW4gYXBwLnRzJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL2NvbnNvbGVcXC5sb2dcXCgvZywgJ2xvZygnKTtcblxuICAgICAgaWYoIW5ld0NvbnRlbnQuaW5jbHVkZXMoJ2ltcG9ydCB7bG9nfScpICYmIG5ld0NvbnRlbnQuaW5jbHVkZXMoJ2xvZygnKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAgIC9pbXBvcnQgYm94ZW4gZnJvbSAnYm94ZW4nOy8sXG4gICAgICAgICAgJ2ltcG9ydCBib3hlbiBmcm9tIFxcJ2JveGVuXFwnO1xcbmltcG9ydCB7bG9nfSBmcm9tIFxcJy4vbG9nLmpzXFwnOydcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcLy9nLCAnLycpO1xuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdhdXRvZml4LmpzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIGlzc3VlcyBpbiBhdXRvZml4LmpzJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9pbXBvcnQgeyhbXn1dKil9IGZyb20gJ3BhdGgnO1tcXHNcXG5dKmltcG9ydCB7KFtefV0qKX0gZnJvbSAncGF0aCc7LyxcbiAgICAgICAgJ2ltcG9ydCB7JDEsICQyfSBmcm9tIFxcJ3BhdGhcXCc7J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL19fZmlsZW5hbWUvZyxcbiAgICAgICAgJ2N1cnJlbnRGaWxlbmFtZSdcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvX19kaXJuYW1lL2csXG4gICAgICAgICdjdXJyZW50RGlybmFtZSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9jb25zdCBwcmVmaXggPSB0eXBlID09PSAnZXJyb3InIFxcPyAnXHUyNzRDICcgOiB0eXBlID09PSAnc3VjY2VzcycgXFw/ICdcdTI3MDUgJyA6ICdcdTIxMzlcdUZFMEYgJzsvLFxuICAgICAgICAnbGV0IHByZWZpeCA9IFxcJ1x1MjEzOVx1RkUwRiBcXCc7XFxuaWYodHlwZSA9PT0gXFwnZXJyb3JcXCcpIHtcXG4gIHByZWZpeCA9IFxcJ1x1Mjc0QyBcXCc7XFxufSBlbHNlIGlmKHR5cGUgPT09IFxcJ3N1Y2Nlc3NcXCcpIHtcXG4gIHByZWZpeCA9IFxcJ1x1MjcwNSBcXCc7XFxufSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBydW5Fc2xpbnRGaXhcXChcXCkvZyxcbiAgICAgICAgJ2NvbnN0IHJ1bkVzbGludEZpeCA9IGFzeW5jICgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBnZXRGaWxlc1dpdGhFcnJvcnNcXChcXCkvZyxcbiAgICAgICAgJ2NvbnN0IGdldEZpbGVzV2l0aEVycm9ycyA9IGFzeW5jICgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBpc0N1cnNvckF2YWlsYWJsZVxcKFxcKS9nLFxuICAgICAgICAnY29uc3QgaXNDdXJzb3JBdmFpbGFibGUgPSBhc3luYyAoKSdcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvYXN5bmMgZnVuY3Rpb24gZml4RmlsZVdpdGhDdXJzb3JBSVxcKGZpbGVQYXRoXFwpL2csXG4gICAgICAgICdjb25zdCBmaXhGaWxlV2l0aEN1cnNvckFJID0gYXN5bmMgKGZpbGVQYXRoKSdcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvYXN5bmMgZnVuY3Rpb24gbWFpblxcKFxcKS9nLFxuICAgICAgICAnY29uc3QgbWFpbiA9IGFzeW5jICgpJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2ltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfS9nLFxuICAgICAgICAnaW1wb3J0IHt3cml0ZUZpbGVTeW5jfSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9jb25zb2xlXFwubG9nXFwoYFxcJHtwcmVmaXh9IFxcJHttZXNzYWdlfWBcXCk7L2csXG4gICAgICAgICdwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtwcmVmaXh9ICR7bWVzc2FnZX1cXFxcbmApOydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC99IGNhdGNoXFwoZXJyb3JcXCkge1tcXHNcXG5dKlxcL1xcLyBJZ25vcmUgY2xlYW51cCBlcnJvcnMvZyxcbiAgICAgICAgJ30gY2F0Y2goXykge1xcbiAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9ycydcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvfSBjYXRjaFxcKGVycm9yXFwpIHtbXFxzXFxuXSpsb2dcXCgvZyxcbiAgICAgICAgJ30gY2F0Y2goZXJyKSB7XFxuICAgIGxvZygnXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL30gY2F0Y2hcXChlcnJvclxcKSB7W1xcc1xcbl0qcmV0dXJuIGZhbHNlOy9nLFxuICAgICAgICAnfSBjYXRjaChfKSB7XFxuICAgIHJldHVybiBmYWxzZTsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvZm9yXFwoY29uc3QgZmlsZVBhdGggb2YgZmlsZXNXaXRoRXJyb3JzXFwpIHtbXFxzXFxuXSpjb25zdCBzdWNjZXNzID0gYXdhaXQgZml4RmlsZVdpdGhDdXJzb3JBSVxcKGZpbGVQYXRoXFwpOy9nLFxuICAgICAgICAnY29uc3QgZml4UmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGZpbGVzV2l0aEVycm9ycy5tYXAoZmlsZVBhdGggPT4gZml4RmlsZVdpdGhDdXJzb3JBSShmaWxlUGF0aCkpKTtcXG5mb3IoY29uc3Qgc3VjY2VzcyBvZiBmaXhSZXN1bHRzKSB7J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2ZpeGVkQ291bnRcXCtcXCs7L2csXG4gICAgICAgICdmaXhlZENvdW50ICs9IDE7J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZihuZXdDb250ZW50ICE9PSBmaWxlQ29udGVudCkge1xuICAgICAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgbmV3Q29udGVudCwgJ3V0ZjgnKTtcbiAgICAgIGxvZyhgRml4ZWQgaXNzdWVzIGluICR7ZmlsZVBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB3YXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdhc01vZGlmaWVkO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBhcHBseWluZyBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBsb2FkQUlDb25maWcgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBbJ2pzJywgJ21qcycsICdjanMnLCAndHMnLCAnanNvbiddO1xuICBjb25zdCBjb25maWdCYXNlTmFtZSA9ICdsZXguY29uZmlnJztcbiAgbGV0IGxleENvbmZpZ1BhdGggPSAnJztcblxuICBmb3IoY29uc3QgZm9ybWF0IG9mIGNvbmZpZ0Zvcm1hdHMpIHtcbiAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBgLi8ke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gKTtcbiAgICBpZihleGlzdHNTeW5jKHBvdGVudGlhbFBhdGgpKSB7XG4gICAgICBsZXhDb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKGxleENvbmZpZ1BhdGgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9yIE1KUyBmaWxlcywgd2UgbmVlZCB0byB1c2UgZHluYW1pYyBpbXBvcnQgd2l0aCBVUkwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGZvcm1hdCA9IGV4dG5hbWUobGV4Q29uZmlnUGF0aCkuc2xpY2UoMSk7XG4gICAgICBsZXQgaW1wb3J0UGF0aCA9IGxleENvbmZpZ1BhdGg7XG5cbiAgICAgIC8vIFVzZSBVUkwgcHJvdG9jb2wgZm9yIEVTTSBpbXBvcnRzXG4gICAgICBpZihmb3JtYXQgPT09ICdtanMnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgZmlsZTovLyR7bGV4Q29uZmlnUGF0aH1gKTtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gdXJsLmhyZWY7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgVXNpbmcgVVJMIGZvcm1hdCBmb3IgTUpTIGltcG9ydDogJHtpbXBvcnRQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCh1cmxFcnJvcikge1xuICAgICAgICAgIGxvZyhgRXJyb3IgY3JlYXRpbmcgVVJMIGZvciBNSlMgaW1wb3J0OiAke3VybEVycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBkZWJ1ZyB8fCAhcXVpZXQpO1xuICAgICAgICAgIGltcG9ydFBhdGggPSBgZmlsZTovLyR7bGV4Q29uZmlnUGF0aH1gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVHJ5aW5nIHRvIGltcG9ydCBjb25maWcgZnJvbSAke2ltcG9ydFBhdGh9IChmb3JtYXQ6ICR7Zm9ybWF0fSlgLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxleENvbmZpZztcbiAgICAgIHRyeSB7XG4gICAgICAgIGxleENvbmZpZyA9IGF3YWl0IGltcG9ydChpbXBvcnRQYXRoKTtcbiAgICAgIH0gY2F0Y2goaW1wb3J0RXJyb3IpIHtcbiAgICAgICAgaWYoaW1wb3J0RXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90IGRlZmluZWQgaW4gRVMgbW9kdWxlIHNjb3BlJykpIHtcbiAgICAgICAgICBsb2coYEVTIE1vZHVsZSBzeW50YXggZXJyb3IgaW4gJHtsZXhDb25maWdQYXRofS4gTWFrZSBzdXJlIHlvdSdyZSB1c2luZyAnZXhwb3J0JyBpbnN0ZWFkIG9mICdtb2R1bGUuZXhwb3J0cycuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGltcG9ydEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGltcG9ydEVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm90aCBFU00gKGRlZmF1bHQgZXhwb3J0KSBhbmQgQ29tbW9uSlMgKG1vZHVsZS5leHBvcnRzKVxuICAgICAgbGV0IGNvbmZpZ0RhdGEgPSBudWxsO1xuICAgICAgaWYobGV4Q29uZmlnLmRlZmF1bHQpIHtcbiAgICAgICAgY29uZmlnRGF0YSA9IGxleENvbmZpZy5kZWZhdWx0O1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgRm91bmQgZGVmYXVsdCBleHBvcnQgaW4gJHtsZXhDb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3IgQ29tbW9uSlMgb3Igb3RoZXIgbW9kdWxlIHN5c3RlbXNcbiAgICAgICAgY29uZmlnRGF0YSA9IGxleENvbmZpZztcbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBsb2coYFVzaW5nIGRpcmVjdCBleHBvcnQgaW4gJHtsZXhDb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGNvbmZpZ0RhdGEgJiYgY29uZmlnRGF0YS5haSkge1xuICAgICAgICBsb2coYEZvdW5kIEFJIGNvbmZpZ3VyYXRpb24gaW4gJHtwYXRoUmVzb2x2ZShjd2QsIGxleENvbmZpZ1BhdGgpfSwgYXBwbHlpbmcgc2V0dGluZ3MuLi5gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5haSA9IHsuLi5MZXhDb25maWcuY29uZmlnLmFpLCAuLi5jb25maWdEYXRhLmFpfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgQUkgY29uZmlndXJhdGlvbiBmcm9tICR7bGV4Q29uZmlnUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIEVTTGludCBjb25maWd1cmF0aW9uIGZyb20gbGV4LmNvbmZpZy4qIGZpbGVzXG4gKi9cbmNvbnN0IGxvYWRFU0xpbnRDb25maWcgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBkZWJ1ZzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAvLyBDaGVjayBpZiBMZXhDb25maWcgYWxyZWFkeSBoYXMgRVNMaW50IGNvbmZpZ3VyYXRpb24gbG9hZGVkXG4gIGlmKExleENvbmZpZy5jb25maWcuZXNsaW50ICYmIE9iamVjdC5rZXlzKExleENvbmZpZy5jb25maWcuZXNsaW50KS5sZW5ndGggPiAwKSB7XG4gICAgbG9nKCdGb3VuZCBFU0xpbnQgY29uZmlndXJhdGlvbiBpbiBsZXguY29uZmlnLiogZmlsZScsICdpbmZvJywgZGVidWcgfHwgIXF1aWV0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFRyeSB0byBsb2FkIGZyb20gbGV4LmNvbmZpZy4qIGZpbGVzIGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICBjb25zdCBjb25maWdGb3JtYXRzID0gWydqcycsICdtanMnLCAnY2pzJywgJ3RzJywgJ2pzb24nXTtcbiAgY29uc3QgY29uZmlnQmFzZU5hbWUgPSAnbGV4LmNvbmZpZyc7XG5cbiAgZm9yKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgY29uc3QgcG90ZW50aWFsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgYC4vJHtjb25maWdCYXNlTmFtZX0uJHtmb3JtYXR9YCk7XG4gICAgaWYoZXhpc3RzU3luYyhwb3RlbnRpYWxQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRm9yIE1KUyBmaWxlcywgd2UgbmVlZCB0byB1c2UgZHluYW1pYyBpbXBvcnQgd2l0aCBVUkwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgY29uc3QgZmlsZUZvcm1hdCA9IGV4dG5hbWUocG90ZW50aWFsUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGxldCBpbXBvcnRQYXRoID0gcG90ZW50aWFsUGF0aDtcblxuICAgICAgICAvLyBVc2UgVVJMIHByb3RvY29sIGZvciBFU00gaW1wb3J0c1xuICAgICAgICBpZihmaWxlRm9ybWF0ID09PSAnbWpzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGBmaWxlOi8vJHtwb3RlbnRpYWxQYXRofWApO1xuICAgICAgICAgICAgaW1wb3J0UGF0aCA9IHVybC5ocmVmO1xuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgbG9nKGBVc2luZyBVUkwgZm9ybWF0IGZvciBNSlMgaW1wb3J0OiAke2ltcG9ydFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCh1cmxFcnJvcikge1xuICAgICAgICAgICAgbG9nKGBFcnJvciBjcmVhdGluZyBVUkwgZm9yIE1KUyBpbXBvcnQ6ICR7dXJsRXJyb3IubWVzc2FnZX1gLCAnd2FybicsIGRlYnVnIHx8ICFxdWlldCk7XG4gICAgICAgICAgICBpbXBvcnRQYXRoID0gYGZpbGU6Ly8ke3BvdGVudGlhbFBhdGh9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgVHJ5aW5nIHRvIGltcG9ydCBjb25maWcgZnJvbSAke2ltcG9ydFBhdGh9IChmb3JtYXQ6ICR7ZmlsZUZvcm1hdH0pYCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGV4Q29uZmlnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxleENvbmZpZyA9IGF3YWl0IGltcG9ydChpbXBvcnRQYXRoKTtcbiAgICAgICAgfSBjYXRjaChpbXBvcnRFcnJvcikge1xuICAgICAgICAgIGlmKGltcG9ydEVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBkZWZpbmVkIGluIEVTIG1vZHVsZSBzY29wZScpKSB7XG4gICAgICAgICAgICBsb2coYEVTIE1vZHVsZSBzeW50YXggZXJyb3IgaW4gJHtwb3RlbnRpYWxQYXRofS4gTWFrZSBzdXJlIHlvdSdyZSB1c2luZyAnZXhwb3J0JyBpbnN0ZWFkIG9mICdtb2R1bGUuZXhwb3J0cycuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihpbXBvcnRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgaW1wb3J0RXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYm90aCBFU00gKGRlZmF1bHQgZXhwb3J0KSBhbmQgQ29tbW9uSlMgKG1vZHVsZS5leHBvcnRzKVxuICAgICAgICBsZXQgY29uZmlnRGF0YSA9IG51bGw7XG4gICAgICAgIGlmKGxleENvbmZpZy5kZWZhdWx0KSB7XG4gICAgICAgICAgY29uZmlnRGF0YSA9IGxleENvbmZpZy5kZWZhdWx0O1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2coYEZvdW5kIGRlZmF1bHQgZXhwb3J0IGluICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIENvbW1vbkpTIG9yIG90aGVyIG1vZHVsZSBzeXN0ZW1zXG4gICAgICAgICAgY29uZmlnRGF0YSA9IGxleENvbmZpZztcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBVc2luZyBkaXJlY3QgZXhwb3J0IGluICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihjb25maWdEYXRhICYmIGNvbmZpZ0RhdGEuZXNsaW50ICYmIE9iamVjdC5rZXlzKGNvbmZpZ0RhdGEuZXNsaW50KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nKGBGb3VuZCBFU0xpbnQgY29uZmlndXJhdGlvbiBpbiAke3BhdGhSZXNvbHZlKGN3ZCwgcG90ZW50aWFsUGF0aCl9LCBhcHBseWluZyBzZXR0aW5ncy4uLmAsICdpbmZvJywgZGVidWcgfHwgIXF1aWV0KTtcbiAgICAgICAgICBMZXhDb25maWcuY29uZmlnLmVzbGludCA9IHsuLi5MZXhDb25maWcuY29uZmlnLmVzbGludCwgLi4uY29uZmlnRGF0YS5lc2xpbnR9O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgRXJyb3IgbG9hZGluZyBFU0xpbnQgY29uZmlndXJhdGlvbiBmcm9tICR7cG90ZW50aWFsUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBjb21tZW50cyBmcm9tIGEgZmlsZSBleGNlcHQgZm9yIFRPRE9zIGFuZCBjb3B5cmlnaHQgbm90aWNlc1xuICovXG5jb25zdCByZW1vdmVGaWxlQ29tbWVudHMgPSAoZmlsZVBhdGg6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIC8vIFNraXAgZmlsZXMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGlzc3Vlc1xuICAgIGlmKGZpbGVDb250ZW50Lmxlbmd0aCA+IDEwMDAwMDApIHsgLy8gMU1CIGxpbWl0XG4gICAgICBsb2coYFNraXBwaW5nIGNvbW1lbnQgcmVtb3ZhbCBmb3IgbGFyZ2UgZmlsZTogJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgZmlsZSB0eXBlIGZyb20gZXh0ZW5zaW9uXG4gICAgY29uc3QgZXh0ID0gZXh0bmFtZShmaWxlUGF0aCk7XG4gICAgbGV0IGlzVHlwZVNjcmlwdCA9IGZhbHNlO1xuICAgIGxldCBpc0phdmFTY3JpcHQgPSBmYWxzZTtcblxuICAgIGlmKFsnLnRzJywgJy50c3gnXS5pbmNsdWRlcyhleHQpKSB7XG4gICAgICBpc1R5cGVTY3JpcHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZihbJy5qcycsICcuanN4J10uaW5jbHVkZXMoZXh0KSkge1xuICAgICAgaXNKYXZhU2NyaXB0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2tpcCB1bnN1cHBvcnRlZCBmaWxlIHR5cGVzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHJlZ2V4IHRvIG1hdGNoIGRpZmZlcmVudCB0eXBlcyBvZiBjb21tZW50c1xuICAgIC8vIFByZXNlcnZlczpcbiAgICAvLyAxLiBDb3B5cmlnaHQgbm90aWNlcyAoLyogQ29weXJpZ2h0IC4uLiAqLylcbiAgICAvLyAyLiBUT0RPIGNvbW1lbnRzICgvLyBUT0RPOiAuLi4pXG4gICAgLy8gMy4gTGljZW5zZSBoZWFkZXJzICgvKiAuLi4gTGljZW5zZSAuLi4gKi8pXG5cbiAgICAvLyBIYW5kbGUgbXVsdGktbGluZSBjb21tZW50cyBmaXJzdCAtIHByZXNlcnZlIGNvcHlyaWdodC9saWNlbnNlIG5vdGljZXNcbiAgICBsZXQgbmV3Q29udGVudCA9IGZpbGVDb250ZW50LnJlcGxhY2UoXG4gICAgICAvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLFxuICAgICAgKG1hdGNoKSA9PiB7XG4gICAgICAgIGlmKG1hdGNoLmluY2x1ZGVzKCdDb3B5cmlnaHQnKSB8fFxuICAgICAgICAgIG1hdGNoLmluY2x1ZGVzKCdMSUNFTlNFJykgfHxcbiAgICAgICAgICBtYXRjaC5pbmNsdWRlcygnTGljZW5zZScpIHx8XG4gICAgICAgICAgbWF0Y2guaW5jbHVkZXMoJ2xpY2Vuc2UnKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSBzaW5nbGUtbGluZSBjb21tZW50cyAtIHByZXNlcnZlIFRPRE9zXG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXC8uKiQvZ20sXG4gICAgICAobWF0Y2gpID0+IHtcbiAgICAgICAgaWYobWF0Y2guaW5jbHVkZXMoJ1RPRE8nKSB8fCBtYXRjaC5pbmNsdWRlcygnRklYTUUnKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIENsZWFuIHVwIGFueSBtdWx0aXBsZSBibGFuayBsaW5lcyBjcmVhdGVkIGJ5IGNvbW1lbnQgcmVtb3ZhbFxuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xcblxccypcXG5cXHMqXFxuL2csICdcXG5cXG4nKTtcblxuICAgIC8vIElmIHRoZSBmaWxlIHdhcyBtb2RpZmllZCwgc2F2ZSBpdFxuICAgIGlmKG5ld0NvbnRlbnQgIT09IGZpbGVDb250ZW50KSB7XG4gICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCAndXRmOCcpO1xuICAgICAgbG9nKGBSZW1vdmVkIGNvbW1lbnRzIGZyb20gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSAke2ZpbGVQYXRofTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaW50ID0gYXN5bmMgKGNtZDogTGludE9wdGlvbnMgJiB7J3JlbW92ZS1jb21tZW50cyc/OiBib29sZWFufSwgY2FsbGJhY2s6IExpbnRDYWxsYmFjayA9IHByb2Nlc3MuZXhpdCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgZml4ID0gZmFsc2UsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIGNvbmZpZyA9IG51bGwsXG4gICAgcmVtb3ZlQ29tbWVudHMgPSBmYWxzZSxcbiAgICAvLyBIYW5kbGUga2ViYWItY2FzZSBDTEkgZmxhZyBjb252ZXJzaW9uXG4gICAgJ3JlbW92ZS1jb21tZW50cyc6IHJlbW92ZUNvbW1lbnRzRmxhZyA9IGZhbHNlXG4gIH0gPSBjbWQ7XG5cbiAgLy8gVXNlIGVpdGhlciB0aGUgY2FtZWxDYXNlIG9yIGtlYmFiLWNhc2UgdmVyc2lvbiBvZiB0aGUgZmxhZ1xuICBjb25zdCBzaG91bGRSZW1vdmVDb21tZW50cyA9IHJlbW92ZUNvbW1lbnRzIHx8IHJlbW92ZUNvbW1lbnRzRmxhZztcblxuICBsb2coYCR7Y2xpTmFtZX0gbGludGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBhd2FpdCBsb2FkQUlDb25maWcoY3dkLCBxdWlldCwgZGVidWcpO1xuXG4gIGxldCB0ZW1wQ29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VUeXBlc2NyaXB0ID0gZGV0ZWN0VHlwZVNjcmlwdChjd2QpO1xuICAgIGxvZyhgVHlwZVNjcmlwdCAke3VzZVR5cGVzY3JpcHQgPyAnZGV0ZWN0ZWQnIDogJ25vdCBkZXRlY3RlZCd9IGZyb20gdHNjb25maWcuanNvbmAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgICAgTGV4Q29uZmlnLmNoZWNrTGludFR5cGVzY3JpcHRDb25maWcoKTtcbiAgICB9XG5cbiAgICBlbnN1cmVNb2R1bGVUeXBlKGN3ZCk7XG5cbiAgICBhd2FpdCBpbnN0YWxsRGVwZW5kZW5jaWVzKGN3ZCwgdXNlVHlwZXNjcmlwdCwgcXVpZXQpO1xuXG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLmpzJyk7XG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGhUcyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ2VzbGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBoYXNFc2xpbnRDb25maWcgPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoKSB8fFxuICAgICAgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKSB8fFxuICAgICAgZXhpc3RzU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMuanMnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzb24nKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLnltbCcpKSB8fFxuICAgICAgZXhpc3RzU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMueWFtbCcpKSB8fFxuICAgICAgZXhpc3RzU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMnKSk7XG5cbiAgICAvLyBDaGVjayBmb3IgRVNMaW50IGNvbmZpZyBpbiBsZXguY29uZmlnLipcbiAgICBjb25zdCBoYXNMZXhFc2xpbnRDb25maWcgPSBhd2FpdCBsb2FkRVNMaW50Q29uZmlnKGN3ZCwgcXVpZXQsIGRlYnVnKTtcblxuICAgIGlmKGhhc0xleEVzbGludENvbmZpZykge1xuICAgICAgbG9nKCdVc2luZyBFU0xpbnQgY29uZmlndXJhdGlvbiBmcm9tIGxleC5jb25maWcuKiBmaWxlJywgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuXG4gICAgaWYoZXhpc3RzU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMuanNvbicpKSkge1xuICAgICAgdW5saW5rU3luYyhwYXRoUmVzb2x2ZShjd2QsICcuZXNsaW50cmMuanNvbicpKTtcbiAgICB9XG5cbiAgICBsZXQgbGV4Q29uZmlnUGF0aCA9ICcnO1xuICAgIGxldCBzaG91bGRDcmVhdGVUZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgICBpZighaGFzRXNsaW50Q29uZmlnICYmICFoYXNMZXhFc2xpbnRDb25maWcpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnLi4vLi4vLi4vLi4vZXNsaW50LmNvbmZpZy50cycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcuanMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy4vbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnZXNsaW50LmNvbmZpZy50cycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnLi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLmpzJylcbiAgICAgIF07XG5cbiAgICAgIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICAgIGxleENvbmZpZ1BhdGggPSBwYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgQ3VycmVudCBkaXJlY3Rvcnk6ICR7Y3VycmVudERpcm5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgUHJvamVjdCBjb25maWcgcGF0aDogJHtwcm9qZWN0Q29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgbG9nKGBQcm9qZWN0IGNvbmZpZyBleGlzdHM6ICR7aGFzRXNsaW50Q29uZmlnfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBsb2coYEZvdW5kIExleCBjb25maWc6ICR7bGV4Q29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgbG9nKGBMZXggY29uZmlnIGV4aXN0czogJHshIWxleENvbmZpZ1BhdGggJiYgZXhpc3RzU3luYyhsZXhDb25maWdQYXRoKX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgaWYobGV4Q29uZmlnUGF0aCAmJiBleGlzdHNTeW5jKGxleENvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGxvZygnTm8gRVNMaW50IGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gcHJvamVjdC4gVXNpbmcgTGV4XFwncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG91bGRDcmVhdGVUZW1wQ29uZmlnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjb25maWcpIHtcbiAgICAgIGNvbnN0IHVzZXJDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBjb25maWcpO1xuICAgICAgaWYoZXhpc3RzU3luYyh1c2VyQ29uZmlnUGF0aCkpIHtcbiAgICAgICAgbG9nKGBVc2luZyBzcGVjaWZpZWQgRVNMaW50IGNvbmZpZ3VyYXRpb246ICR7Y29uZmlnfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBzaG91bGRDcmVhdGVUZW1wQ29uZmlnID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFNwZWNpZmllZCBFU0xpbnQgY29uZmlndXJhdGlvbiBub3QgZm91bmQ6ICR7Y29uZmlnfS4gVXNpbmcgTGV4J3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLmAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHNob3VsZENyZWF0ZVRlbXBDb25maWcpIHtcbiAgICAgIGxvZygnTm8gRVNMaW50IGNvbmZpZ3VyYXRpb24gZm91bmQuIENyZWF0aW5nIGEgdGVtcG9yYXJ5IGNvbmZpZ3VyYXRpb24uLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGNvbnN0IGNvbmZpZ1Jlc3VsdCA9IGNyZWF0ZURlZmF1bHRFU0xpbnRDb25maWcodXNlVHlwZXNjcmlwdCwgY3dkKTtcbiAgICAgIHRlbXBDb25maWdQYXRoID0gY29uZmlnUmVzdWx0LmNvbmZpZ1BhdGg7XG4gICAgfVxuXG4gICAgbGV0IGVzbGludE91dHB1dCA9ICcnO1xuICAgIGNvbnN0IGNhcHR1cmVPdXRwdXQgPSAob3V0cHV0OiBzdHJpbmcpID0+IHtcbiAgICAgIGVzbGludE91dHB1dCArPSBgJHtvdXRwdXR9XFxuYDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRXNsaW50V2l0aExleChjd2QsIHF1aWV0LCBjbGlOYW1lLCB0cnVlLCBkZWJ1ZywgdXNlVHlwZXNjcmlwdCwgY2FwdHVyZU91dHB1dCk7XG5cbiAgICAvLyBSZW1vdmUgY29tbWVudHMgaWYgZW5hYmxlZFxuICAgIGlmKHNob3VsZFJlbW92ZUNvbW1lbnRzKSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdSZW1vdmluZyBjb21tZW50cyBmcm9tIGZpbGVzLi4uJyk7XG5cbiAgICAgIC8vIEdldCBhbGwgLmpzLCAuanN4LCAudHMsIC50c3ggZmlsZXMgaW4gdGhlIHByb2plY3RcbiAgICAgIGNvbnN0IGdsb2IgPSBhd2FpdCBpbXBvcnQoJ2dsb2InKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gZ2xvYi5zeW5jKCd7c3JjLGxpYn0vKiovKi57anMsanN4LHRzLHRzeH0nLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2J1aWxkLyoqJ11cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgcHJvY2Vzc2VkQ291bnQgPSAwO1xuICAgICAgZm9yKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIGZpbGUpO1xuICAgICAgICBpZihyZW1vdmVGaWxlQ29tbWVudHMoZmlsZVBhdGgsIHF1aWV0KSkge1xuICAgICAgICAgIHByb2Nlc3NlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3Bpbm5lci5zdWNjZWVkKGBSZW1vdmVkIGNvbW1lbnRzIGZyb20gJHtwcm9jZXNzZWRDb3VudH0gZmlsZXNgKTtcbiAgICB9XG5cbiAgICBpZihyZXN1bHQgIT09IDAgJiYgZml4KSB7XG4gICAgICBjb25zdCBhaUNvbmZpZ3VyZWQgPSBMZXhDb25maWcuY29uZmlnLmFpPy5wcm92aWRlciAmJiBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyICE9PSAnbm9uZSc7XG5cbiAgICAgIGlmKGFpQ29uZmlndXJlZCkge1xuICAgICAgICBsb2coJ0FwcGx5aW5nIEFJIGZpeGVzIHRvIHJlbWFpbmluZyBpc3N1ZXMuLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgYXdhaXQgYXBwbHlBSUZpeChjd2QsIGVzbGludE91dHB1dCwgcXVpZXQpO1xuXG4gICAgICAgIGNvbnN0IGFmdGVyRml4UmVzdWx0ID0gYXdhaXQgcnVuRXNsaW50V2l0aExleChjd2QsIHF1aWV0LCBjbGlOYW1lLCBmYWxzZSwgZGVidWcsIHVzZVR5cGVzY3JpcHQpO1xuXG4gICAgICAgIGNhbGxiYWNrKGFmdGVyRml4UmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIGFmdGVyRml4UmVzdWx0O1xuICAgICAgfVxuICAgICAgbG9nKCdFU0xpbnQgY291bGQgbm90IGZpeCBhbGwgaXNzdWVzIGF1dG9tYXRpY2FsbHkuJywgJ3dhcm4nLCBxdWlldCk7XG4gICAgICBsb2coJ1RvIGVuYWJsZSBBSS1wb3dlcmVkIGZpeGVzLCBhZGQgQUkgY29uZmlndXJhdGlvbiB0byB5b3VyIGxleC5jb25maWcgZmlsZTonLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGxvZyhgXG4vLyBJbiBsZXguY29uZmlnLmpzIChvciBsZXguY29uZmlnLm1qcywgbGV4LmNvbmZpZy5janMsIGV0Yy4pXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8vIFlvdXIgZXhpc3RpbmcgY29uZmlnXG4gIGFpOiB7XG4gICAgcHJvdmlkZXI6ICdjdXJzb3InIC8vIG9yICdvcGVuYWknLCAnYW50aHJvcGljJywgZXRjLlxuICAgIC8vIEFkZGl0aW9uYWwgcHJvdmlkZXItc3BlY2lmaWMgc2V0dGluZ3NcbiAgfVxufTtgLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgaWYoc3Bpbm5lcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdMaW50aW5nIGZhaWxlZCEnKTtcbiAgICB9XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2xlYW4gdXAgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlc1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aHMgPSBbXG4gICAgICB0ZW1wQ29uZmlnUGF0aCxcbiAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJy5sZXgtdGVtcC1lc2xpbnQuY2pzJyksXG4gICAgICBwYXRoUmVzb2x2ZShjd2QsICcubGV4LXRlbXAtZGVmYXVsdC1lc2xpbnQuY2pzJylcbiAgICBdO1xuXG4gICAgZm9yKGNvbnN0IGZpbGVQYXRoIG9mIHRlbXBGaWxlUGF0aHMpIHtcbiAgICAgIGlmKGZpbGVQYXRoICYmIGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdW5saW5rU3luYyhmaWxlUGF0aCk7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgQ2xlYW5lZCB1cCB0ZW1wb3JhcnkgRVNMaW50IGNvbmZpZyBhdCAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsWUFBWSxjQUFjLFlBQVkscUJBQW9CO0FBQ2xFLFNBQVEsU0FBUyxXQUFXLGFBQWEsZUFBYztBQUV2RCxTQUFRLGlCQUFnQjtBQUN4QixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLHlCQUF3QjtBQUNoQyxTQUFRLFdBQVU7QUFFbEIsSUFBSTtBQUNKLElBQUk7QUFFSixJQUFJO0FBQ0Ysb0JBQWtCLEtBQUssK0NBQStDO0FBQ3RFLG1CQUFpQixRQUFRLGVBQWU7QUFDMUMsUUFBUTtBQUNOLG9CQUFrQixRQUFRLElBQUk7QUFDOUIsbUJBQWlCLFFBQVEsSUFBSTtBQUMvQjtBQWdEQSxNQUFNLDRCQUE0QixDQUFDLGVBQXdCLFFBQThCO0FBRXZGLFFBQU0sYUFBYSxZQUFZLEtBQUssOEJBQThCO0FBQ2xFLFFBQU0saUJBQWlCO0FB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