@nlabs/lex 1.49.5 → 1.50.0

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.
Files changed (52) hide show
  1. package/.swcrc +35 -0
  2. package/README.md +43 -59
  3. package/config.json +32 -8
  4. package/examples/lex.config.js +110 -10
  5. package/lex.config.js +34 -7
  6. package/lib/Button.stories.js +99 -0
  7. package/lib/LexConfig.d.ts +60 -22
  8. package/lib/LexConfig.js +285 -244
  9. package/lib/commands/ai/ai.js +287 -288
  10. package/lib/commands/ai/index.js +8 -7
  11. package/lib/commands/build/build.d.ts +2 -2
  12. package/lib/commands/build/build.js +349 -458
  13. package/lib/commands/clean/clean.js +45 -33
  14. package/lib/commands/compile/compile.js +214 -228
  15. package/lib/commands/config/config.js +46 -42
  16. package/lib/commands/copy/copy.js +36 -35
  17. package/lib/commands/create/create.js +200 -121
  18. package/lib/commands/dev/dev.d.ts +1 -0
  19. package/lib/commands/dev/dev.js +261 -259
  20. package/lib/commands/init/init.js +108 -88
  21. package/lib/commands/link/link.js +18 -14
  22. package/lib/commands/lint/lint.js +735 -742
  23. package/lib/commands/migrate/migrate.js +49 -36
  24. package/lib/commands/publish/publish.js +116 -96
  25. package/lib/commands/serverless/serverless.js +611 -585
  26. package/lib/commands/storybook/storybook.js +242 -238
  27. package/lib/commands/test/test.js +381 -409
  28. package/lib/commands/update/update.js +141 -120
  29. package/lib/commands/upgrade/upgrade.js +51 -44
  30. package/lib/commands/versions/versions.d.ts +1 -1
  31. package/lib/commands/versions/versions.js +36 -38
  32. package/lib/create/changelog.js +136 -125
  33. package/lib/index.js +40 -38
  34. package/lib/lex.js +95 -68
  35. package/lib/storybook/index.js +6 -1
  36. package/lib/test-react/index.js +7 -84
  37. package/lib/types.d.ts +1 -1
  38. package/lib/types.js +7 -1
  39. package/lib/utils/aiService.js +240 -227
  40. package/lib/utils/app.js +274 -273
  41. package/lib/utils/deepMerge.js +37 -23
  42. package/lib/utils/file.js +218 -215
  43. package/lib/utils/log.js +29 -27
  44. package/lib/utils/reactShim.js +7 -85
  45. package/lib/utils/translations.js +92 -82
  46. package/package.json +63 -64
  47. package/templates/typescript/DataLayer.js.txt +218 -0
  48. package/templates/typescript/DataLayer.test.js.txt +268 -0
  49. package/templates/typescript/DataLayer.test.ts.txt +269 -0
  50. package/templates/typescript/DataLayer.ts.txt +227 -0
  51. package/webpack.config.js +38 -28
  52. package/lib/commands/lint/autofix.d.ts +0 -2
@@ -1,455 +1,352 @@
1
- import GraphqlLoaderPlugin from "@luckycatfactory/esbuild-graphql-loader";
2
- import { execa } from "execa";
3
- import { existsSync, readFileSync } from "fs";
4
- import { sync as globSync } from "glob";
5
- import { dirname, resolve as pathResolve } from "path";
6
- import { LexConfig, getTypeScriptConfigPath } from "../../LexConfig.js";
7
- import { checkLinkedModules, copyConfiguredFiles, createSpinner, handleWebpackProgress, removeFiles } from "../../utils/app.js";
8
- import { getDirName, relativeNodePath, resolveWebpackPaths, getLexPackageJsonPath } from "../../utils/file.js";
9
- import { log } from "../../utils/log.js";
10
- import { processTranslations } from "../../utils/translations.js";
11
- import { aiFunction } from "../ai/ai.js";
12
- import boxen from "boxen";
13
- import chalk from "chalk";
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { transform } from '@swc/core';
5
+ import { execa } from 'execa';
6
+ import { existsSync, readFileSync } from 'fs';
7
+ import { sync as globSync } from 'glob';
8
+ import { dirname, resolve as pathResolve } from 'path';
9
+ import { LexConfig, getTypeScriptConfigPath } from '../../LexConfig.js';
10
+ import { checkLinkedModules, copyConfiguredFiles, createSpinner, handleWebpackProgress, removeFiles } from '../../utils/app.js';
11
+ import { resolveWebpackPaths, getLexPackageJsonPath } from '../../utils/file.js';
12
+ import { log } from '../../utils/log.js';
13
+ import { processTranslations } from '../../utils/translations.js';
14
+ import { aiFunction } from '../ai/ai.js';
15
+ import boxen from 'boxen';
16
+ import chalk from 'chalk';
14
17
  let currentFilename;
15
18
  let currentDirname;
16
19
  try {
17
- currentFilename = eval('require("url").fileURLToPath(import.meta.url)');
18
- currentDirname = dirname(currentFilename);
19
- } catch {
20
- currentFilename = process.cwd();
21
- currentDirname = process.cwd();
20
+ currentFilename = eval('require("url").fileURLToPath(import.meta.url)');
21
+ currentDirname = dirname(currentFilename);
22
+ } catch {
23
+ currentFilename = process.cwd();
24
+ currentDirname = process.cwd();
22
25
  }
23
- const displayBuildStatus = (bundler, outputPath, quiet, stats) => {
24
- if (quiet) return;
25
- let statsInfo = "";
26
- if (stats && stats.modules && stats.assets) {
27
- statsInfo = `
28
- ${chalk.green("Modules:")} ${chalk.cyan(stats.modules)}
29
- ${chalk.green("Assets:")} ${chalk.cyan(stats.assets)}
30
- ${chalk.green("Size:")} ${chalk.cyan(stats.size)}
31
- `;
32
- }
33
- const statusBox = boxen(
34
- `${chalk.cyan.bold("\u{1F3D7}\uFE0F Build Completed Successfully")}
35
-
36
- ${chalk.green("Bundler:")} ${chalk.cyan(bundler)}
37
- ${chalk.green("Output:")} ${chalk.underline(outputPath)}${statsInfo}
38
- ${chalk.yellow("Ready for deployment! \u{1F680}")}`,
39
- {
40
- padding: 1,
41
- margin: 1,
42
- borderStyle: "round",
43
- borderColor: "green",
44
- backgroundColor: "#1a1a1a"
26
+ const displayBuildStatus = (bundler, outputPath, quiet, stats)=>{
27
+ if (quiet) return;
28
+ let statsInfo = '';
29
+ if (stats && stats.modules && stats.assets) {
30
+ statsInfo = `\n${chalk.green('Modules:')} ${chalk.cyan(stats.modules)}\n` + `${chalk.green('Assets:')} ${chalk.cyan(stats.assets)}\n` + `${chalk.green('Size:')} ${chalk.cyan(stats.size)}\n`;
45
31
  }
46
- );
47
- console.log("\n" + statusBox + "\n");
48
- };
49
- const buildWithEsBuild = async (spinner, commandOptions, callback) => {
50
- const {
51
- cliName = "Lex",
52
- format = "esm",
53
- outputPath,
54
- quiet,
55
- sourcePath,
56
- watch
57
- } = commandOptions;
58
- const {
59
- outputFullPath,
60
- sourceFullPath,
61
- targetEnvironment,
62
- useGraphQl,
63
- useTypescript
64
- } = LexConfig.config;
65
- const sourceDir = sourcePath ? pathResolve(process.cwd(), `./${sourcePath}`) : sourceFullPath || "";
66
- const loader = {
67
- ".js": "js"
68
- };
69
- if (useTypescript) {
70
- loader[".ts"] = "ts";
71
- loader[".tsx"] = "tsx";
72
- }
73
- const plugins = [];
74
- if (useGraphQl) {
75
- plugins.push(GraphqlLoaderPlugin());
76
- }
77
- const globOptions = {
78
- cwd: sourceDir,
79
- dot: false,
80
- nodir: true,
81
- nosort: true
82
- };
83
- const tsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).ts*`, globOptions);
84
- const jsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).js`, globOptions);
85
- const sourceFiles = [...tsFiles, ...jsFiles];
86
- const packageJsonData = readFileSync(pathResolve(process.cwd(), "./package.json"));
87
- const packageJson = JSON.parse(packageJsonData.toString());
88
- const external = [
89
- ...Object.keys(packageJson.dependencies || {}),
90
- ...Object.keys(packageJson.peerDependencies || {})
91
- ];
92
- const dirName = getDirName();
93
- const dirPath = pathResolve(dirName, "../..");
94
- const outputDir = outputPath || outputFullPath || "";
95
- const esbuildPath = relativeNodePath("esbuild/bin/esbuild", dirPath);
96
- const esbuildConfig = LexConfig.config.esbuild || {};
97
- const esbuildOptions = [
98
- ...sourceFiles,
99
- "--bundle",
100
- "--color=true",
101
- `--format=${format}`,
102
- `--outdir=${outputDir}`,
103
- `--platform=${esbuildConfig.platform || "node"}`,
104
- `--target=${esbuildConfig.target || (targetEnvironment === "node" ? "node20" : "es2020")}`,
105
- `--sourcemap=${esbuildConfig.sourcemap || "inline"}`
106
- ];
107
- if (esbuildConfig.minify !== false) {
108
- esbuildOptions.push("--minify");
109
- }
110
- if (esbuildConfig.treeShaking !== false) {
111
- esbuildOptions.push("--tree-shaking=true");
112
- }
113
- if (esbuildConfig.drop && esbuildConfig.drop.length > 0) {
114
- esbuildConfig.drop.forEach((item) => {
115
- esbuildOptions.push(`--drop:${item}`);
116
- });
117
- }
118
- if (esbuildConfig.pure && esbuildConfig.pure.length > 0) {
119
- esbuildConfig.pure.forEach((item) => {
120
- esbuildOptions.push(`--pure:${item}`);
121
- });
122
- }
123
- if (esbuildConfig.legalComments) {
124
- esbuildOptions.push(`--legal-comments=${esbuildConfig.legalComments}`);
125
- }
126
- if (esbuildConfig.splitting !== false) {
127
- esbuildOptions.push("--splitting");
128
- }
129
- if (esbuildConfig.metafile) {
130
- esbuildOptions.push("--metafile");
131
- }
132
- if (esbuildConfig.banner) {
133
- Object.entries(esbuildConfig.banner).forEach(([type, content]) => {
134
- esbuildOptions.push(`--banner:${type}=${content}`);
32
+ const statusBox = boxen(`${chalk.cyan.bold('🏗️ Build Completed Successfully')}\n\n` + `${chalk.green('Bundler:')} ${chalk.cyan(bundler)}\n` + `${chalk.green('Output:')} ${chalk.underline(outputPath)}${statsInfo}\n` + `${chalk.yellow('Ready for deployment! 🚀')}`, {
33
+ padding: 1,
34
+ margin: 1,
35
+ borderStyle: 'round',
36
+ borderColor: 'green',
37
+ backgroundColor: '#1a1a1a'
135
38
  });
136
- }
137
- if (esbuildConfig.footer) {
138
- Object.entries(esbuildConfig.footer).forEach(([type, content]) => {
139
- esbuildOptions.push(`--footer:${type}=${content}`);
140
- });
141
- }
142
- if (esbuildConfig.define) {
143
- Object.entries(esbuildConfig.define).forEach(([key, value]) => {
144
- esbuildOptions.push(`--define:${key}=${value}`);
145
- });
146
- }
147
- if (external.length) {
148
- esbuildOptions.push(`--external:${external.join(",")}`);
149
- }
150
- if (plugins.length) {
151
- esbuildOptions.push(`--plugins=${plugins.join(",")}`);
152
- }
153
- if (watch) {
154
- esbuildOptions.push("--watch");
155
- }
156
- try {
157
- await execa(esbuildPath, esbuildOptions, { encoding: "utf8" });
158
- spinner.succeed("Build completed successfully!");
159
- displayBuildStatus("esbuild", outputDir, quiet);
160
- } catch (error) {
161
- log(`
162
- ${cliName} Error: ${error.message}`, "error", quiet);
163
- if (!quiet) {
164
- console.error(error);
165
- }
166
- spinner.fail("Code build failed.");
167
- if (commandOptions.assist) {
168
- spinner.start("AI is analyzing the error...");
169
- try {
170
- await aiFunction({
171
- prompt: `Fix this esbuild error: ${error.message}
172
-
173
- Error details:
174
- ${error.toString()}`,
175
- task: "help",
176
- context: true,
177
- quiet
178
- });
179
- spinner.succeed("AI analysis complete");
180
- } catch (aiError) {
181
- spinner.fail("Could not generate AI assistance");
39
+ console.log('\n' + statusBox + '\n');
40
+ };
41
+ // Removed buildWithEsBuild function - using SWC instead
42
+ export const buildWithSWC = async (spinner, commandOptions, callback)=>{
43
+ const { cliName = 'Lex', format = 'esm', outputPath, quiet, sourcePath, watch } = commandOptions;
44
+ const { outputFullPath, sourceFullPath, swc: swcConfig, targetEnvironment, useGraphQl, useTypescript } = LexConfig.config;
45
+ const sourceDir = sourcePath ? pathResolve(process.cwd(), `./${sourcePath}`) : sourceFullPath || '';
46
+ const globOptions = {
47
+ cwd: sourceDir,
48
+ dot: false,
49
+ nodir: true,
50
+ nosort: true
51
+ };
52
+ const tsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).ts*`, globOptions);
53
+ const jsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).js`, globOptions);
54
+ const sourceFiles = [
55
+ ...tsFiles,
56
+ ...jsFiles
57
+ ];
58
+ const outputDir = outputPath || outputFullPath || '';
59
+ try {
60
+ spinner.start('Building with SWC...');
61
+ for (const file of sourceFiles){
62
+ const sourcePath = pathResolve(sourceDir, file);
63
+ const outputPath = pathResolve(outputDir, file.replace(/\.(ts|tsx)$/, '.js'));
64
+ // Ensure output directory exists
65
+ const outputDirPath = dirname(outputPath);
66
+ if (!existsSync(outputDirPath)) {
67
+ const { mkdirSync } = await import('fs');
68
+ mkdirSync(outputDirPath, {
69
+ recursive: true
70
+ });
71
+ }
72
+ const sourceCode = readFileSync(sourcePath, 'utf8');
73
+ const isTSX = file.endsWith('.tsx');
74
+ // Merge SWC config with command-specific overrides
75
+ const swcOptions = {
76
+ filename: file,
77
+ ...swcConfig,
78
+ jsc: {
79
+ ...swcConfig?.jsc,
80
+ parser: {
81
+ syntax: 'typescript',
82
+ tsx: isTSX,
83
+ decorators: swcConfig?.jsc?.parser?.decorators ?? true,
84
+ dynamicImport: swcConfig?.jsc?.parser?.dynamicImport ?? true
85
+ },
86
+ target: swcConfig?.jsc?.target ?? 'es2020',
87
+ transform: isTSX ? {
88
+ ...swcConfig?.jsc?.transform,
89
+ react: {
90
+ runtime: 'automatic',
91
+ ...swcConfig?.jsc?.transform?.react
92
+ }
93
+ } : swcConfig?.jsc?.transform
94
+ },
95
+ module: {
96
+ ...swcConfig?.module,
97
+ type: format === 'cjs' ? 'commonjs' : swcConfig?.module?.type || 'es6'
98
+ }
99
+ };
100
+ const result = await transform(sourceCode, swcOptions);
101
+ const { writeFileSync } = await import('fs');
102
+ writeFileSync(outputPath, result.code);
103
+ }
104
+ spinner.succeed('Build completed with SWC');
105
+ displayBuildStatus('SWC', outputDir, quiet);
106
+ callback(0);
107
+ return 0;
108
+ } catch (error) {
109
+ spinner.fail('Build failed with SWC');
182
110
  if (!quiet) {
183
- console.error("AI assistance error:", aiError);
111
+ console.error(error);
184
112
  }
185
- }
113
+ callback(1);
114
+ return 1;
186
115
  }
187
- callback(1);
188
- return 1;
189
- }
190
- callback(0);
191
- return 0;
192
116
  };
193
- const buildWithWebpack = async (spinner, cmd, callback) => {
194
- const {
195
- analyze,
196
- cliName = "Lex",
197
- config,
198
- configName,
199
- defineProcessEnvNodeEnv,
200
- devtool,
201
- disableInterpret,
202
- entry,
203
- env,
204
- failOnWarnings,
205
- json,
206
- merge,
207
- mode,
208
- name,
209
- nodeEnv,
210
- noDevtool,
211
- noStats,
212
- noTarget,
213
- noWatch,
214
- noWatchOptionsStdin,
215
- outputPath,
216
- quiet = false,
217
- stats,
218
- target,
219
- watch,
220
- watchOptionsStdin
221
- } = cmd;
222
- console.log("entry:", entry, "type:", typeof entry);
223
- console.log("outputPath:", outputPath, "type:", typeof outputPath);
224
- const entryValue = Array.isArray(entry) ? entry[0] : entry;
225
- let webpackConfig;
226
- if (config) {
227
- const isRelativeConfig = config.substr(0, 2) === "./";
228
- webpackConfig = isRelativeConfig ? pathResolve(process.cwd(), config) : config;
229
- } else {
230
- const projectConfigPath = pathResolve(process.cwd(), "webpack.config.js");
231
- const projectConfigPathTs = pathResolve(process.cwd(), "webpack.config.ts");
232
- const hasProjectConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs);
233
- if (hasProjectConfig) {
234
- webpackConfig = existsSync(projectConfigPathTs) ? projectConfigPathTs : projectConfigPath;
117
+ export const buildWithWebpack = async (spinner, cmd, callback)=>{
118
+ const { analyze, cliName = 'Lex', config, configName, defineProcessEnvNodeEnv, devtool, disableInterpret, entry, env, failOnWarnings, json, merge, mode, name, nodeEnv, noDevtool, noStats, noTarget, noWatch, noWatchOptionsStdin, outputPath, quiet = false, stats, target, watch, watchOptionsStdin } = cmd;
119
+ console.log('entry:', entry, 'type:', typeof entry);
120
+ console.log('outputPath:', outputPath, 'type:', typeof outputPath);
121
+ const entryValue = Array.isArray(entry) ? entry[0] : entry;
122
+ let webpackConfig;
123
+ if (config) {
124
+ const isRelativeConfig = config.substr(0, 2) === './';
125
+ webpackConfig = isRelativeConfig ? pathResolve(process.cwd(), config) : config;
235
126
  } else {
236
- const { webpackConfig: resolvedConfig } = resolveWebpackPaths(currentDirname);
237
- webpackConfig = resolvedConfig;
127
+ const projectConfigPath = pathResolve(process.cwd(), 'webpack.config.js');
128
+ const projectConfigPathTs = pathResolve(process.cwd(), 'webpack.config.ts');
129
+ const hasProjectConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs);
130
+ if (hasProjectConfig) {
131
+ webpackConfig = existsSync(projectConfigPathTs) ? projectConfigPathTs : projectConfigPath;
132
+ } else {
133
+ const { webpackConfig: resolvedConfig } = resolveWebpackPaths(currentDirname);
134
+ webpackConfig = resolvedConfig;
135
+ }
238
136
  }
239
- }
240
- console.log("webpackConfig path:", webpackConfig);
241
- console.log("webpackConfig exists:", existsSync(webpackConfig));
242
- if (!existsSync(webpackConfig)) {
243
- const lexPackagePath = getLexPackageJsonPath();
244
- const lexPackageDir = dirname(lexPackagePath);
245
- const lexWebpackConfig = pathResolve(lexPackageDir, "webpack.config.js");
246
- if (existsSync(lexWebpackConfig)) {
247
- webpackConfig = lexWebpackConfig;
248
- console.log("Using Lex webpack config:", webpackConfig);
249
- } else {
250
- log(`
251
- ${cliName} Error: Could not find webpack.config.js`, "error", quiet);
252
- spinner.fail("Build failed.");
253
- callback(1);
254
- return 1;
137
+ console.log('webpackConfig path:', webpackConfig);
138
+ console.log('webpackConfig exists:', existsSync(webpackConfig));
139
+ if (!existsSync(webpackConfig)) {
140
+ const lexPackagePath = getLexPackageJsonPath();
141
+ const lexPackageDir = dirname(lexPackagePath);
142
+ const lexWebpackConfig = pathResolve(lexPackageDir, 'webpack.config.js');
143
+ if (existsSync(lexWebpackConfig)) {
144
+ webpackConfig = lexWebpackConfig;
145
+ console.log('Using Lex webpack config:', webpackConfig);
146
+ } else {
147
+ log(`\n${cliName} Error: Could not find webpack.config.js`, 'error', quiet);
148
+ spinner.fail('Build failed.');
149
+ callback(1);
150
+ return 1;
151
+ }
255
152
  }
256
- }
257
- const webpackOptions = [
258
- "--color",
259
- "--progress",
260
- "--config",
261
- webpackConfig
262
- ];
263
- if (analyze) webpackOptions.push("--analyze");
264
- if (configName) webpackOptions.push("--configName", configName);
265
- if (defineProcessEnvNodeEnv) webpackOptions.push("--defineProcessEnvNodeEnv", defineProcessEnvNodeEnv);
266
- if (devtool) webpackOptions.push("--devtool", devtool);
267
- if (disableInterpret) webpackOptions.push("--disableInterpret");
268
- if (entryValue) webpackOptions.push("--entry", entryValue.toString());
269
- if (env) webpackOptions.push("--env", env);
270
- if (failOnWarnings) webpackOptions.push("--failOnWarnings");
271
- if (json) webpackOptions.push("--json", json);
272
- if (mode) webpackOptions.push("--mode", mode);
273
- if (merge) webpackOptions.push("--merge");
274
- if (name) webpackOptions.push("--name", name);
275
- if (noDevtool) webpackOptions.push("--noDevtool");
276
- if (noStats) webpackOptions.push("--noStats");
277
- if (noTarget) webpackOptions.push("--noTarget");
278
- if (noWatch) webpackOptions.push("--noWatch");
279
- if (noWatchOptionsStdin) webpackOptions.push("--noWatchOptionsStdin");
280
- if (nodeEnv) webpackOptions.push("--nodeEnv", nodeEnv);
281
- if (outputPath) webpackOptions.push("--output-path", outputPath.toString());
282
- if (stats) webpackOptions.push("--stats", stats);
283
- if (target) webpackOptions.push("--target", target);
284
- if (watch) webpackOptions.push("--watch");
285
- if (watchOptionsStdin) webpackOptions.push("--watchOptionsStdin");
286
- try {
287
- const { webpackPath } = resolveWebpackPaths(currentDirname);
288
- let finalWebpackOptions;
289
- if (webpackPath === "npx") {
290
- finalWebpackOptions = ["webpack", ...webpackOptions];
291
- } else {
292
- finalWebpackOptions = [...webpackOptions];
153
+ const webpackOptions = [
154
+ '--color',
155
+ '--progress',
156
+ '--config',
157
+ webpackConfig
158
+ ];
159
+ if (analyze) webpackOptions.push('--analyze');
160
+ if (configName) webpackOptions.push('--configName', configName);
161
+ if (defineProcessEnvNodeEnv) webpackOptions.push('--defineProcessEnvNodeEnv', defineProcessEnvNodeEnv);
162
+ if (devtool) webpackOptions.push('--devtool', devtool);
163
+ if (disableInterpret) webpackOptions.push('--disableInterpret');
164
+ // Pass entry directly as CLI flag
165
+ if (entryValue) webpackOptions.push('--entry', entryValue.toString());
166
+ if (env) webpackOptions.push('--env', env);
167
+ if (failOnWarnings) webpackOptions.push('--failOnWarnings');
168
+ if (json) webpackOptions.push('--json', json);
169
+ if (mode) webpackOptions.push('--mode', mode);
170
+ if (merge) webpackOptions.push('--merge');
171
+ if (name) webpackOptions.push('--name', name);
172
+ if (noDevtool) webpackOptions.push('--noDevtool');
173
+ if (noStats) webpackOptions.push('--noStats');
174
+ if (noTarget) webpackOptions.push('--noTarget');
175
+ if (noWatch) webpackOptions.push('--noWatch');
176
+ if (noWatchOptionsStdin) webpackOptions.push('--noWatchOptionsStdin');
177
+ if (nodeEnv) webpackOptions.push('--nodeEnv', nodeEnv);
178
+ if (outputPath) webpackOptions.push('--output-path', outputPath.toString()); // Convert to string
179
+ if (stats) webpackOptions.push('--stats', stats);
180
+ if (target) webpackOptions.push('--target', target);
181
+ if (watch) webpackOptions.push('--watch');
182
+ if (watchOptionsStdin) webpackOptions.push('--watchOptionsStdin');
183
+ try {
184
+ const { webpackPath } = resolveWebpackPaths(currentDirname);
185
+ // Fix: Ensure finalWebpackOptions is always an array of strings
186
+ let finalWebpackOptions;
187
+ if (webpackPath === 'npx') {
188
+ finalWebpackOptions = [
189
+ 'webpack',
190
+ ...webpackOptions
191
+ ];
192
+ } else {
193
+ finalWebpackOptions = [
194
+ ...webpackOptions
195
+ ];
196
+ }
197
+ console.log('webpackPath:', webpackPath);
198
+ console.log('finalWebpackOptions:', JSON.stringify(finalWebpackOptions));
199
+ console.log('finalWebpackOptions type:', Array.isArray(finalWebpackOptions) ? 'Array' : typeof finalWebpackOptions);
200
+ // Make sure we're passing an array of strings to execa
201
+ const childProcess = execa(webpackPath, finalWebpackOptions, {
202
+ encoding: 'utf8',
203
+ stdio: 'pipe'
204
+ });
205
+ let buildCompleted = false;
206
+ let buildStats = {
207
+ modules: 0,
208
+ assets: 0,
209
+ size: '0 B'
210
+ };
211
+ childProcess.stdout?.on('data', (data)=>{
212
+ const output = data.toString();
213
+ handleWebpackProgress(output, spinner, quiet, '🏗️', 'Webpack Building');
214
+ if (!buildCompleted && output.includes('compiled successfully')) {
215
+ buildCompleted = true;
216
+ spinner.succeed('Build completed successfully!');
217
+ const moduleMatch = output.match(/(\d+) modules/);
218
+ const assetMatch = output.match(/(\d+) assets/);
219
+ const sizeMatch = output.match(/assets by status ([\d.]+ \w+)/) || output.match(/assets by path.*?([\d.]+ \w+)/);
220
+ if (moduleMatch) buildStats.modules = parseInt(moduleMatch[1], 10);
221
+ if (assetMatch) buildStats.assets = parseInt(assetMatch[1], 10);
222
+ if (sizeMatch) buildStats.size = sizeMatch[1];
223
+ displayBuildStatus('webpack', LexConfig.config.outputFullPath || 'lib', quiet, buildStats);
224
+ }
225
+ });
226
+ childProcess.stderr?.on('data', (data)=>{
227
+ const output = data.toString();
228
+ handleWebpackProgress(output, spinner, quiet, '🏗️', 'Webpack Building');
229
+ if (!buildCompleted && output.includes('compiled successfully')) {
230
+ buildCompleted = true;
231
+ spinner.succeed('Build completed successfully!');
232
+ const moduleMatch = output.match(/(\d+) modules/);
233
+ const assetMatch = output.match(/(\d+) assets/);
234
+ const sizeMatch = output.match(/assets by status ([\d.]+ \w+)/) || output.match(/assets by path.*?([\d.]+ \w+)/);
235
+ if (moduleMatch) buildStats.modules = parseInt(moduleMatch[1], 10);
236
+ if (assetMatch) buildStats.assets = parseInt(assetMatch[1], 10);
237
+ if (sizeMatch) buildStats.size = sizeMatch[1];
238
+ displayBuildStatus('webpack', LexConfig.config.outputFullPath || 'lib', quiet, buildStats);
239
+ }
240
+ });
241
+ await childProcess;
242
+ if (!buildCompleted) {
243
+ spinner.succeed('Build completed successfully!');
244
+ displayBuildStatus('webpack', LexConfig.config.outputFullPath || 'lib', quiet, buildStats);
245
+ }
246
+ callback(0);
247
+ return 0;
248
+ } catch (error) {
249
+ log(`\n${cliName} Error: ${error.message}`, 'error', quiet);
250
+ spinner.fail('Build failed.');
251
+ if (cmd.assist) {
252
+ spinner.start('AI is analyzing the webpack error...');
253
+ try {
254
+ await aiFunction({
255
+ prompt: `Fix this webpack build error: ${error.message}\n\nError details:\n${error.toString()}\n\nConfiguration used:\n${JSON.stringify(webpackOptions, null, 2)}`,
256
+ task: 'help',
257
+ context: true,
258
+ quiet
259
+ });
260
+ spinner.succeed('AI analysis complete');
261
+ } catch (aiError) {
262
+ spinner.fail('Could not generate AI assistance');
263
+ if (!quiet) {
264
+ console.error('AI assistance error:', aiError);
265
+ }
266
+ }
267
+ }
268
+ callback(1);
269
+ return 1;
293
270
  }
294
- console.log("webpackPath:", webpackPath);
295
- console.log("finalWebpackOptions:", JSON.stringify(finalWebpackOptions));
296
- console.log("finalWebpackOptions type:", Array.isArray(finalWebpackOptions) ? "Array" : typeof finalWebpackOptions);
297
- const childProcess = execa(webpackPath, finalWebpackOptions, { encoding: "utf8", stdio: "pipe" });
298
- let buildCompleted = false;
299
- let buildStats = {
300
- modules: 0,
301
- assets: 0,
302
- size: "0 B"
271
+ };
272
+ export const build = async (cmd, callback = ()=>({}))=>{
273
+ const { bundler = 'webpack', cliName = 'Lex', quiet = false, remove = false, test = false, translations = false, variables = '{}' } = cmd;
274
+ const spinner = createSpinner(quiet);
275
+ log(`${cliName} building...`, 'info', quiet);
276
+ await LexConfig.parseConfig(cmd);
277
+ const { outputFullPath, useTypescript } = LexConfig.config;
278
+ checkLinkedModules();
279
+ let variablesObj = {
280
+ NODE_ENV: 'production'
303
281
  };
304
- childProcess.stdout?.on("data", (data) => {
305
- const output = data.toString();
306
- handleWebpackProgress(output, spinner, quiet, "\u{1F3D7}\uFE0F", "Webpack Building");
307
- if (!buildCompleted && output.includes("compiled successfully")) {
308
- buildCompleted = true;
309
- spinner.succeed("Build completed successfully!");
310
- const moduleMatch = output.match(/(\d+) modules/);
311
- const assetMatch = output.match(/(\d+) assets/);
312
- const sizeMatch = output.match(/assets by status ([\d.]+ \w+)/) || output.match(/assets by path.*?([\d.]+ \w+)/);
313
- if (moduleMatch) buildStats.modules = parseInt(moduleMatch[1], 10);
314
- if (assetMatch) buildStats.assets = parseInt(assetMatch[1], 10);
315
- if (sizeMatch) buildStats.size = sizeMatch[1];
316
- displayBuildStatus("webpack", LexConfig.config.outputFullPath || "lib", quiet, buildStats);
317
- }
318
- });
319
- childProcess.stderr?.on("data", (data) => {
320
- const output = data.toString();
321
- handleWebpackProgress(output, spinner, quiet, "\u{1F3D7}\uFE0F", "Webpack Building");
322
- if (!buildCompleted && output.includes("compiled successfully")) {
323
- buildCompleted = true;
324
- spinner.succeed("Build completed successfully!");
325
- const moduleMatch = output.match(/(\d+) modules/);
326
- const assetMatch = output.match(/(\d+) assets/);
327
- const sizeMatch = output.match(/assets by status ([\d.]+ \w+)/) || output.match(/assets by path.*?([\d.]+ \w+)/);
328
- if (moduleMatch) buildStats.modules = parseInt(moduleMatch[1], 10);
329
- if (assetMatch) buildStats.assets = parseInt(assetMatch[1], 10);
330
- if (sizeMatch) buildStats.size = sizeMatch[1];
331
- displayBuildStatus("webpack", LexConfig.config.outputFullPath || "lib", quiet, buildStats);
332
- }
333
- });
334
- await childProcess;
335
- if (!buildCompleted) {
336
- spinner.succeed("Build completed successfully!");
337
- displayBuildStatus("webpack", LexConfig.config.outputFullPath || "lib", quiet, buildStats);
282
+ if (variables) {
283
+ try {
284
+ variablesObj = JSON.parse(variables);
285
+ } catch (error) {
286
+ log(`\n${cliName} Error: Environment variables option is not a valid JSON object.`, 'error', quiet);
287
+ callback(1);
288
+ return 1;
289
+ }
338
290
  }
339
- callback(0);
340
- return 0;
341
- } catch (error) {
342
- log(`
343
- ${cliName} Error: ${error.message}`, "error", quiet);
344
- spinner.fail("Build failed.");
345
- if (cmd.assist) {
346
- spinner.start("AI is analyzing the webpack error...");
347
- try {
348
- await aiFunction({
349
- prompt: `Fix this webpack build error: ${error.message}
350
-
351
- Error details:
352
- ${error.toString()}
353
-
354
- Configuration used:
355
- ${JSON.stringify(webpackOptions, null, 2)}`,
356
- task: "help",
357
- context: true,
358
- quiet
359
- });
360
- spinner.succeed("AI analysis complete");
361
- } catch (aiError) {
362
- spinner.fail("Could not generate AI assistance");
363
- if (!quiet) {
364
- console.error("AI assistance error:", aiError);
291
+ process.env = {
292
+ ...process.env,
293
+ ...variablesObj
294
+ };
295
+ // If in test mode, exit early
296
+ if (test) {
297
+ log('Test mode: Build environment loaded, exiting', 'info', quiet);
298
+ callback(0);
299
+ return 0;
300
+ }
301
+ // Process translations if flag is enabled (before building)
302
+ if (translations) {
303
+ spinner.start('Processing translations...');
304
+ try {
305
+ const sourcePath = LexConfig.config.sourceFullPath || process.cwd();
306
+ const outputPath = LexConfig.config.outputFullPath || 'lib';
307
+ await processTranslations(sourcePath, outputPath, quiet);
308
+ spinner.succeed('Translations processed successfully!');
309
+ } catch (translationError) {
310
+ log(`\n${cliName} Error: Failed to process translations: ${translationError.message}`, 'error', quiet);
311
+ spinner.fail('Failed to process translations.');
312
+ callback(1);
313
+ return 1;
365
314
  }
366
- }
367
315
  }
368
- callback(1);
369
- return 1;
370
- }
371
- };
372
- const build = async (cmd, callback = () => ({})) => {
373
- const {
374
- bundler = "webpack",
375
- cliName = "Lex",
376
- quiet = false,
377
- remove = false,
378
- test = false,
379
- translations = false,
380
- variables = "{}"
381
- } = cmd;
382
- const spinner = createSpinner(quiet);
383
- log(`${cliName} building...`, "info", quiet);
384
- await LexConfig.parseConfig(cmd);
385
- const { outputFullPath, useTypescript } = LexConfig.config;
386
- checkLinkedModules();
387
- let variablesObj = { NODE_ENV: "production" };
388
- if (variables) {
389
- try {
390
- variablesObj = JSON.parse(variables);
391
- } catch (error) {
392
- log(`
393
- ${cliName} Error: Environment variables option is not a valid JSON object.`, "error", quiet);
394
- callback(1);
395
- return 1;
316
+ spinner.start('Building code...');
317
+ if (remove) {
318
+ await removeFiles(outputFullPath || '');
396
319
  }
397
- }
398
- process.env = { ...process.env, ...variablesObj };
399
- if (test) {
400
- log("Test mode: Build environment loaded, exiting", "info", quiet);
401
- callback(0);
402
- return 0;
403
- }
404
- if (translations) {
405
- spinner.start("Processing translations...");
406
- try {
407
- const sourcePath = LexConfig.config.sourceFullPath || process.cwd();
408
- const outputPath = LexConfig.config.outputFullPath || "lib";
409
- await processTranslations(sourcePath, outputPath, quiet);
410
- spinner.succeed("Translations processed successfully!");
411
- } catch (translationError) {
412
- log(`
413
- ${cliName} Error: Failed to process translations: ${translationError.message}`, "error", quiet);
414
- spinner.fail("Failed to process translations.");
415
- callback(1);
416
- return 1;
320
+ if (useTypescript) {
321
+ const compileConfigPath = getTypeScriptConfigPath('tsconfig.build.json');
322
+ if (existsSync(compileConfigPath)) {
323
+ log('Using tsconfig.build.json for build...', 'info', quiet);
324
+ } else {
325
+ LexConfig.checkCompileTypescriptConfig();
326
+ }
417
327
  }
418
- }
419
- spinner.start("Building code...");
420
- if (remove) {
421
- await removeFiles(outputFullPath || "");
422
- }
423
- if (useTypescript) {
424
- const compileConfigPath = getTypeScriptConfigPath("tsconfig.build.json");
425
- if (existsSync(compileConfigPath)) {
426
- log("Using tsconfig.build.json for build...", "info", quiet);
328
+ let buildResult = 0;
329
+ if (bundler === 'swc') {
330
+ buildResult = await buildWithSWC(spinner, cmd, (status)=>{
331
+ buildResult = status;
332
+ });
427
333
  } else {
428
- LexConfig.checkCompileTypescriptConfig();
334
+ buildResult = await buildWithWebpack(spinner, cmd, (status)=>{
335
+ buildResult = status;
336
+ });
429
337
  }
430
- }
431
- let buildResult = 0;
432
- if (bundler === "esbuild") {
433
- buildResult = await buildWithEsBuild(spinner, cmd, (status) => {
434
- buildResult = status;
435
- });
436
- } else {
437
- buildResult = await buildWithWebpack(spinner, cmd, (status) => {
438
- buildResult = status;
439
- });
440
- }
441
- if (buildResult === 0 && cmd.analyze) {
442
- spinner.start("AI is analyzing the build output for optimization opportunities...");
443
- try {
444
- const stats = {
445
- outputPath: LexConfig.config.outputFullPath,
446
- entryPoints: bundler === "esbuild" ? `Source files: ${LexConfig.config.sourceFullPath}/**/*.{ts,js}` : LexConfig.config.webpack?.entry || "Unknown entry points"
447
- };
448
- await aiFunction({
449
- prompt: `Analyze this build for optimization opportunities:
338
+ if (buildResult === 0 && cmd.analyze) {
339
+ spinner.start('AI is analyzing the build output for optimization opportunities...');
340
+ try {
341
+ const stats = {
342
+ outputPath: LexConfig.config.outputFullPath,
343
+ entryPoints: bundler === 'swc' ? `Source files: ${LexConfig.config.sourceFullPath}/**/*.{ts,js}` : LexConfig.config.webpack?.entry || 'Unknown entry points'
344
+ };
345
+ await aiFunction({
346
+ prompt: `Analyze this build for optimization opportunities:
450
347
 
451
348
  Build Type: ${bundler}
452
- Format: ${cmd.format || "default"}
349
+ Format: ${cmd.format || 'default'}
453
350
  Environment: ${LexConfig.config.targetEnvironment}
454
351
  ${JSON.stringify(stats, null, 2)}
455
352
 
@@ -459,36 +356,30 @@ What are the key optimization opportunities for this build configuration? Consid
459
356
  3. Tree-shaking improvements
460
357
  4. Performance enhancements
461
358
  5. Dependency optimizations`,
462
- task: "optimize",
463
- context: true,
464
- quiet
465
- });
466
- spinner.succeed("AI build analysis complete");
467
- } catch (aiError) {
468
- spinner.fail("Could not generate AI optimization analysis");
469
- if (!quiet) {
470
- console.error("AI analysis error:", aiError);
471
- }
359
+ task: 'optimize',
360
+ context: true,
361
+ quiet
362
+ });
363
+ spinner.succeed('AI build analysis complete');
364
+ } catch (aiError) {
365
+ spinner.fail('Could not generate AI optimization analysis');
366
+ if (!quiet) {
367
+ console.error('AI analysis error:', aiError);
368
+ }
369
+ }
472
370
  }
473
- }
474
- if (buildResult === 0) {
475
- try {
476
- await copyConfiguredFiles(spinner, LexConfig.config, quiet);
477
- } catch (copyError) {
478
- log(`
479
- ${cliName} Error: Failed to copy configured files: ${copyError.message}`, "error", quiet);
480
- callback(1);
481
- return 1;
371
+ if (buildResult === 0) {
372
+ try {
373
+ await copyConfiguredFiles(spinner, LexConfig.config, quiet);
374
+ } catch (copyError) {
375
+ log(`\n${cliName} Error: Failed to copy configured files: ${copyError.message}`, 'error', quiet);
376
+ callback(1);
377
+ return 1;
378
+ }
482
379
  }
483
- }
484
- callback(buildResult);
485
- return buildResult;
486
- };
487
- var build_default = build;
488
- export {
489
- build,
490
- buildWithEsBuild,
491
- buildWithWebpack,
492
- build_default as default
380
+ callback(buildResult);
381
+ return buildResult;
493
382
  };
494
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1aWxkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IEdyYXBocWxMb2FkZXJQbHVnaW4gZnJvbSAnQGx1Y2t5Y2F0ZmFjdG9yeS9lc2J1aWxkLWdyYXBocWwtbG9hZGVyJztcbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtkaXJuYW1lLCByZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWcsIGdldFR5cGVTY3JpcHRDb25maWdQYXRofSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjaGVja0xpbmtlZE1vZHVsZXMsIGNvcHlDb25maWd1cmVkRmlsZXMsIGNyZWF0ZVNwaW5uZXIsIGNyZWF0ZVByb2dyZXNzQmFyLCBoYW5kbGVXZWJwYWNrUHJvZ3Jlc3MsIHJlbW92ZUZpbGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtnZXREaXJOYW1lLCByZWxhdGl2ZU5vZGVQYXRoLCByZXNvbHZlV2VicGFja1BhdGhzLCBnZXRMZXhQYWNrYWdlSnNvblBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQge3Byb2Nlc3NUcmFuc2xhdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0aW9ucy5qcyc7XG5pbXBvcnQge2FpRnVuY3Rpb259IGZyb20gJy4uL2FpL2FpLmpzJztcbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5sZXQgY3VycmVudEZpbGVuYW1lOiBzdHJpbmc7XG5sZXQgY3VycmVudERpcm5hbWU6IHN0cmluZztcblxudHJ5IHtcbiAgY3VycmVudEZpbGVuYW1lID0gZXZhbCgncmVxdWlyZShcInVybFwiKS5maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCknKTtcbiAgY3VycmVudERpcm5hbWUgPSBkaXJuYW1lKGN1cnJlbnRGaWxlbmFtZSk7XG59IGNhdGNoIHtcbiAgY3VycmVudEZpbGVuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbiAgY3VycmVudERpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFzc2lzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBidW5kbGVyPzogJ3dlYnBhY2snIHwgJ2VzYnVpbGQnO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRyeT86IHN0cmluZzsgLy8gPC0tIGFkZCBlbnRyeVxuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7IC8vIDwtLSBhbHJlYWR5IHByZXNlbnRcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmU/OiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSB0ZXN0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhbnNsYXRpb25zPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB3YXRjaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmNvbnN0IGRpc3BsYXlCdWlsZFN0YXR1cyA9IChidW5kbGVyOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4sIHN0YXRzPzoge21vZHVsZXM/OiBudW1iZXI7IGFzc2V0cz86IG51bWJlcjsgc2l6ZT86IHN0cmluZ30pID0+IHtcbiAgaWYocXVpZXQpIHJldHVybjtcblxuICBsZXQgc3RhdHNJbmZvID0gJyc7XG4gIGlmKHN0YXRzICYmIHN0YXRzLm1vZHVsZXMgJiYgc3RhdHMuYXNzZXRzKSB7XG4gICAgc3RhdHNJbmZvID0gYFxcbiR7Y2hhbGsuZ3JlZW4oJ01vZHVsZXM6Jyl9ICAgICR7Y2hhbGsuY3lhbihzdGF0cy5tb2R1bGVzKX1cXG5gICtcbiAgICAgIGAke2NoYWxrLmdyZWVuKCdBc3NldHM6Jyl9ICAgICAke2NoYWxrLmN5YW4oc3RhdHMuYXNzZXRzKX1cXG5gICtcbiAgICAgIGAke2NoYWxrLmdyZWVuKCdTaXplOicpfSAgICAgICAke2NoYWxrLmN5YW4oc3RhdHMuc2l6ZSl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgnXHVEODNDXHVERkQ3XHVGRTBGICBCdWlsZCBDb21wbGV0ZWQgU3VjY2Vzc2Z1bGx5Jyl9XFxuXFxuYCArXG4gICAgYCR7Y2hhbGsuZ3JlZW4oJ0J1bmRsZXI6Jyl9ICAgICR7Y2hhbGsuY3lhbihidW5kbGVyKX1cXG5gICtcbiAgICBgJHtjaGFsay5ncmVlbignT3V0cHV0OicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUob3V0cHV0UGF0aCl9JHtzdGF0c0luZm99XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdSZWFkeSBmb3IgZGVwbG95bWVudCEgXHVEODNEXHVERTgwJyl9YCxcbiAgICB7XG4gICAgICBwYWRkaW5nOiAxLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgYm9yZGVyU3R5bGU6ICdyb3VuZCcsXG4gICAgICBib3JkZXJDb2xvcjogJ2dyZWVuJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnXG4gICAgfVxuICApO1xuXG4gIGNvbnNvbGUubG9nKCdcXG4nICsgc3RhdHVzQm94ICsgJ1xcbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkV2l0aEVzQnVpbGQgPSBhc3luYyAoc3Bpbm5lciwgY29tbWFuZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2spID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRwdXRQYXRoLFxuICAgIHF1aWV0LFxuICAgIHNvdXJjZVBhdGgsXG4gICAgd2F0Y2hcbiAgfSA9IGNvbW1hbmRPcHRpb25zO1xuICBjb25zdCB7XG4gICAgb3V0cHV0RnVsbFBhdGgsXG4gICAgc291cmNlRnVsbFBhdGgsXG4gICAgdGFyZ2V0RW52aXJvbm1lbnQsXG4gICAgdXNlR3JhcGhRbCxcbiAgICB1c2VUeXBlc2NyaXB0XG4gIH0gPSBMZXhDb25maWcuY29uZmlnO1xuICBjb25zdCBzb3VyY2VEaXI6IHN0cmluZyA9IHNvdXJjZVBhdGggPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgLi8ke3NvdXJjZVBhdGh9YCkgOiBzb3VyY2VGdWxsUGF0aCB8fCAnJztcbiAgY29uc3QgbG9hZGVyID0ge1xuICAgICcuanMnOiAnanMnXG4gIH07XG5cbiAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgIGxvYWRlclsnLnRzJ10gPSAndHMnO1xuICAgIGxvYWRlclsnLnRzeCddID0gJ3RzeCc7XG4gIH1cblxuICBjb25zdCBwbHVnaW5zID0gW107XG5cbiAgaWYodXNlR3JhcGhRbCkge1xuICAgIHBsdWdpbnMucHVzaCgoR3JhcGhxbExvYWRlclBsdWdpbiBhcyB1bmtub3duIGFzICgpID0+IG5ldmVyKSgpKTtcbiAgfVxuXG4gIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgIGN3ZDogc291cmNlRGlyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgbm9zb3J0OiB0cnVlXG4gIH07XG4gIGNvbnN0IHRzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCR7c291cmNlRGlyfS8qKi8hKCouc3BlY3wqLnRlc3QpLnRzKmAsIGdsb2JPcHRpb25zKTtcbiAgY29uc3QganNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgJHtzb3VyY2VEaXJ9LyoqLyEoKi5zcGVjfCoudGVzdCkuanNgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzOiBzdHJpbmdbXSA9IFsuLi50c0ZpbGVzLCAuLi5qc0ZpbGVzXTtcblxuICBjb25zdCBwYWNrYWdlSnNvbkRhdGEgPSByZWFkRmlsZVN5bmMocGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vcGFja2FnZS5qc29uJykpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25EYXRhLnRvU3RyaW5nKCkpO1xuICBjb25zdCBleHRlcm5hbCA9IFtcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgfHwge30pXG4gIF07XG5cbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUoKTtcbiAgY29uc3QgZGlyUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uJyk7XG4gIGNvbnN0IG91dHB1dERpcjogc3RyaW5nID0gb3V0cHV0UGF0aCB8fCBvdXRwdXRGdWxsUGF0aCB8fCAnJztcbiAgY29uc3QgZXNidWlsZFBhdGg6IHN0cmluZyA9IHJlbGF0aXZlTm9kZVBhdGgoJ2VzYnVpbGQvYmluL2VzYnVpbGQnLCBkaXJQYXRoKTtcbiAgY29uc3QgZXNidWlsZENvbmZpZyA9IExleENvbmZpZy5jb25maWcuZXNidWlsZCB8fCB7fTtcblxuICBjb25zdCBlc2J1aWxkT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgLi4uc291cmNlRmlsZXMsXG4gICAgJy0tYnVuZGxlJyxcbiAgICAnLS1jb2xvcj10cnVlJyxcbiAgICBgLS1mb3JtYXQ9JHtmb3JtYXR9YCxcbiAgICBgLS1vdXRkaXI9JHtvdXRwdXREaXJ9YCxcbiAgICBgLS1wbGF0Zm9ybT0ke2VzYnVpbGRDb25maWcucGxhdGZvcm0gfHwgJ25vZGUnfWAsXG4gICAgYC0tdGFyZ2V0PSR7ZXNidWlsZENvbmZpZy50YXJnZXQgfHwgKHRhcmdldEVudmlyb25tZW50ID09PSAnbm9kZScgPyAnbm9kZTIwJyA6ICdlczIwMjAnKX1gLFxuICAgIGAtLXNvdXJjZW1hcD0ke2VzYnVpbGRDb25maWcuc291cmNlbWFwIHx8ICdpbmxpbmUnfWBcbiAgXTtcblxuICBpZihlc2J1aWxkQ29uZmlnLm1pbmlmeSAhPT0gZmFsc2UpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLW1pbmlmeScpO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy50cmVlU2hha2luZyAhPT0gZmFsc2UpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLXRyZWUtc2hha2luZz10cnVlJyk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLmRyb3AgJiYgZXNidWlsZENvbmZpZy5kcm9wLmxlbmd0aCA+IDApIHtcbiAgICBlc2J1aWxkQ29uZmlnLmRyb3AuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tZHJvcDoke2l0ZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLnB1cmUgJiYgZXNidWlsZENvbmZpZy5wdXJlLmxlbmd0aCA+IDApIHtcbiAgICBlc2J1aWxkQ29uZmlnLnB1cmUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tcHVyZToke2l0ZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLmxlZ2FsQ29tbWVudHMpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLWxlZ2FsLWNvbW1lbnRzPSR7ZXNidWlsZENvbmZpZy5sZWdhbENvbW1lbnRzfWApO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy5zcGxpdHRpbmcgIT09IGZhbHNlKSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaCgnLS1zcGxpdHRpbmcnKTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcubWV0YWZpbGUpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLW1ldGFmaWxlJyk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLmJhbm5lcikge1xuICAgIE9iamVjdC5lbnRyaWVzKGVzYnVpbGRDb25maWcuYmFubmVyKS5mb3JFYWNoKChbdHlwZSwgY29udGVudF0pID0+IHtcbiAgICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHtjb250ZW50fWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy5mb290ZXIpIHtcbiAgICBPYmplY3QuZW50cmllcyhlc2J1aWxkQ29uZmlnLmZvb3RlcikuZm9yRWFjaCgoW3R5cGUsIGNvbnRlbnRdKSA9PiB7XG4gICAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLWZvb3Rlcjoke3R5cGV9PSR7Y29udGVudH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcuZGVmaW5lKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoZXNidWlsZENvbmZpZy5kZWZpbmUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1kZWZpbmU6JHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZihleHRlcm5hbC5sZW5ndGgpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLWV4dGVybmFsOiR7ZXh0ZXJuYWwuam9pbignLCcpfWApO1xuICB9XG5cbiAgaWYocGx1Z2lucy5sZW5ndGgpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLXBsdWdpbnM9JHtwbHVnaW5zLmpvaW4oJywnKX1gKTtcbiAgfVxuICBpZih3YXRjaCkge1xuICAgIGVzYnVpbGRPcHRpb25zLnB1c2goJy0td2F0Y2gnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY2EoZXNidWlsZFBhdGgsIGVzYnVpbGRPcHRpb25zLCB7ZW5jb2Rpbmc6ICd1dGY4J30pO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgIGRpc3BsYXlCdWlsZFN0YXR1cygnZXNidWlsZCcsIG91dHB1dERpciwgcXVpZXQpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG5cbiAgICBzcGlubmVyLmZhaWwoJ0NvZGUgYnVpbGQgZmFpbGVkLicpO1xuXG4gICAgaWYoY29tbWFuZE9wdGlvbnMuYXNzaXN0KSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGhlIGVycm9yLi4uJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIHByb21wdDogYEZpeCB0aGlzIGVzYnVpbGQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1cXG5cXG5FcnJvciBkZXRhaWxzOlxcbiR7ZXJyb3IudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIHRhc2s6ICdoZWxwJyxcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIHF1aWV0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgYW5hbHlzaXMgY29tcGxldGUnKTtcbiAgICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBhc3Npc3RhbmNlJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIGFzc2lzdGFuY2UgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNhbGxiYWNrKDApO1xuICByZXR1cm4gMDtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZFdpdGhXZWJwYWNrID0gYXN5bmMgKHNwaW5uZXIsIGNtZCwgY2FsbGJhY2spID0+IHtcbiAgY29uc3Qge1xuICAgIGFuYWx5emUsXG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbmZpZyxcbiAgICBjb25maWdOYW1lLFxuICAgIGRlZmluZVByb2Nlc3NFbnZOb2RlRW52LFxuICAgIGRldnRvb2wsXG4gICAgZGlzYWJsZUludGVycHJldCxcbiAgICBlbnRyeSxcbiAgICBlbnYsXG4gICAgZmFpbE9uV2FybmluZ3MsXG4gICAganNvbixcbiAgICBtZXJnZSxcbiAgICBtb2RlLFxuICAgIG5hbWUsXG4gICAgbm9kZUVudixcbiAgICBub0RldnRvb2wsXG4gICAgbm9TdGF0cyxcbiAgICBub1RhcmdldCxcbiAgICBub1dhdGNoLFxuICAgIG5vV2F0Y2hPcHRpb25zU3RkaW4sXG4gICAgb3V0cHV0UGF0aCxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHN0YXRzLFxuICAgIHRhcmdldCxcbiAgICB3YXRjaCxcbiAgICB3YXRjaE9wdGlvbnNTdGRpblxuICB9ID0gY21kO1xuXG4gIGNvbnNvbGUubG9nKCdlbnRyeTonLCBlbnRyeSwgJ3R5cGU6JywgdHlwZW9mIGVudHJ5KTtcbiAgY29uc29sZS5sb2coJ291dHB1dFBhdGg6Jywgb3V0cHV0UGF0aCwgJ3R5cGU6JywgdHlwZW9mIG91dHB1dFBhdGgpO1xuXG4gIGNvbnN0IGVudHJ5VmFsdWUgPSBBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzBdIDogZW50cnk7XG5cbiAgbGV0IHdlYnBhY2tDb25maWc6IHN0cmluZztcblxuICBpZihjb25maWcpIHtcbiAgICBjb25zdCBpc1JlbGF0aXZlQ29uZmlnOiBib29sZWFuID0gY29uZmlnLnN1YnN0cigwLCAyKSA9PT0gJy4vJztcbiAgICB3ZWJwYWNrQ29uZmlnID0gaXNSZWxhdGl2ZUNvbmZpZyA/IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZykgOiBjb25maWc7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcuanMnKTtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aFRzID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnLnRzJyk7XG4gICAgY29uc3QgaGFzUHJvamVjdENvbmZpZyA9IGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGgpIHx8IGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcyk7XG5cbiAgICBpZihoYXNQcm9qZWN0Q29uZmlnKSB7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKSA/IHByb2plY3RDb25maWdQYXRoVHMgOiBwcm9qZWN0Q29uZmlnUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qge3dlYnBhY2tDb25maWc6IHJlc29sdmVkQ29uZmlnfSA9IHJlc29sdmVXZWJwYWNrUGF0aHMoY3VycmVudERpcm5hbWUpO1xuICAgICAgd2VicGFja0NvbmZpZyA9IHJlc29sdmVkQ29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKCd3ZWJwYWNrQ29uZmlnIHBhdGg6Jywgd2VicGFja0NvbmZpZyk7XG4gIGNvbnNvbGUubG9nKCd3ZWJwYWNrQ29uZmlnIGV4aXN0czonLCBleGlzdHNTeW5jKHdlYnBhY2tDb25maWcpKTtcblxuICBpZighZXhpc3RzU3luYyh3ZWJwYWNrQ29uZmlnKSkge1xuICAgIGNvbnN0IGxleFBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG4gICAgY29uc3QgbGV4UGFja2FnZURpciA9IGRpcm5hbWUobGV4UGFja2FnZVBhdGgpO1xuICAgIGNvbnN0IGxleFdlYnBhY2tDb25maWcgPSBwYXRoUmVzb2x2ZShsZXhQYWNrYWdlRGlyLCAnd2VicGFjay5jb25maWcuanMnKTtcblxuICAgIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0NvbmZpZykpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBsZXhXZWJwYWNrQ29uZmlnO1xuICAgICAgY29uc29sZS5sb2coJ1VzaW5nIExleCB3ZWJwYWNrIGNvbmZpZzonLCB3ZWJwYWNrQ29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb3VsZCBub3QgZmluZCB3ZWJwYWNrLmNvbmZpZy5qc2AsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgJy0tY29sb3InLFxuICAgICctLXByb2dyZXNzJyxcbiAgICAnLS1jb25maWcnLCB3ZWJwYWNrQ29uZmlnXG4gIF07XG5cbiAgaWYoYW5hbHl6ZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1hbmFseXplJyk7XG4gIGlmKGNvbmZpZ05hbWUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tY29uZmlnTmFtZScsIGNvbmZpZ05hbWUpO1xuICBpZihkZWZpbmVQcm9jZXNzRW52Tm9kZUVudikgd2VicGFja09wdGlvbnMucHVzaCgnLS1kZWZpbmVQcm9jZXNzRW52Tm9kZUVudicsIGRlZmluZVByb2Nlc3NFbnZOb2RlRW52KTtcbiAgaWYoZGV2dG9vbCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1kZXZ0b29sJywgZGV2dG9vbCk7XG4gIGlmKGRpc2FibGVJbnRlcnByZXQpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZGlzYWJsZUludGVycHJldCcpO1xuICAvLyBQYXNzIGVudHJ5IGRpcmVjdGx5IGFzIENMSSBmbGFnXG4gIGlmKGVudHJ5VmFsdWUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZW50cnknLCBlbnRyeVZhbHVlLnRvU3RyaW5nKCkpO1xuICBpZihlbnYpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZW52JywgZW52KTtcbiAgaWYoZmFpbE9uV2FybmluZ3MpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZmFpbE9uV2FybmluZ3MnKTtcbiAgaWYoanNvbikgd2VicGFja09wdGlvbnMucHVzaCgnLS1qc29uJywganNvbik7XG4gIGlmKG1vZGUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbW9kZScsIG1vZGUpO1xuICBpZihtZXJnZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1tZXJnZScpO1xuICBpZihuYW1lKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5hbWUnLCBuYW1lKTtcbiAgaWYobm9EZXZ0b29sKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vRGV2dG9vbCcpO1xuICBpZihub1N0YXRzKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vU3RhdHMnKTtcbiAgaWYobm9UYXJnZXQpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9UYXJnZXQnKTtcbiAgaWYobm9XYXRjaCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1dhdGNoJyk7XG4gIGlmKG5vV2F0Y2hPcHRpb25zU3RkaW4pIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9XYXRjaE9wdGlvbnNTdGRpbicpO1xuICBpZihub2RlRW52KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vZGVFbnYnLCBub2RlRW52KTtcbiAgaWYob3V0cHV0UGF0aCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1vdXRwdXQtcGF0aCcsIG91dHB1dFBhdGgudG9TdHJpbmcoKSk7IC8vIENvbnZlcnQgdG8gc3RyaW5nXG4gIGlmKHN0YXRzKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXN0YXRzJywgc3RhdHMpO1xuICBpZih0YXJnZXQpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tdGFyZ2V0JywgdGFyZ2V0KTtcbiAgaWYod2F0Y2gpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0td2F0Y2gnKTtcbiAgaWYod2F0Y2hPcHRpb25zU3RkaW4pIHdlYnBhY2tPcHRpb25zLnB1c2goJy0td2F0Y2hPcHRpb25zU3RkaW4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHt3ZWJwYWNrUGF0aH0gPSByZXNvbHZlV2VicGFja1BhdGhzKGN1cnJlbnREaXJuYW1lKTtcblxuICAgIC8vIEZpeDogRW5zdXJlIGZpbmFsV2VicGFja09wdGlvbnMgaXMgYWx3YXlzIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICBsZXQgZmluYWxXZWJwYWNrT3B0aW9uczogc3RyaW5nW107XG4gICAgaWYod2VicGFja1BhdGggPT09ICducHgnKSB7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gWyd3ZWJwYWNrJywgLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gWy4uLndlYnBhY2tPcHRpb25zXTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnd2VicGFja1BhdGg6Jywgd2VicGFja1BhdGgpO1xuICAgIGNvbnNvbGUubG9nKCdmaW5hbFdlYnBhY2tPcHRpb25zOicsIEpTT04uc3RyaW5naWZ5KGZpbmFsV2VicGFja09wdGlvbnMpKTtcbiAgICBjb25zb2xlLmxvZygnZmluYWxXZWJwYWNrT3B0aW9ucyB0eXBlOicsIEFycmF5LmlzQXJyYXkoZmluYWxXZWJwYWNrT3B0aW9ucykgPyAnQXJyYXknIDogdHlwZW9mIGZpbmFsV2VicGFja09wdGlvbnMpO1xuXG4gICAgLy8gTWFrZSBzdXJlIHdlJ3JlIHBhc3NpbmcgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBleGVjYVxuICAgIGNvbnN0IGNoaWxkUHJvY2VzcyA9IGV4ZWNhKHdlYnBhY2tQYXRoLCBmaW5hbFdlYnBhY2tPcHRpb25zLCB7ZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJ30pO1xuXG4gICAgbGV0IGJ1aWxkQ29tcGxldGVkID0gZmFsc2U7XG4gICAgbGV0IGJ1aWxkU3RhdHMgPSB7XG4gICAgICBtb2R1bGVzOiAwLFxuICAgICAgYXNzZXRzOiAwLFxuICAgICAgc2l6ZTogJzAgQidcbiAgICB9O1xuXG4gICAgY2hpbGRQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICAgIGhhbmRsZVdlYnBhY2tQcm9ncmVzcyhvdXRwdXQsIHNwaW5uZXIsIHF1aWV0LCAnXHVEODNDXHVERkQ3XHVGRTBGJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIWJ1aWxkQ29tcGxldGVkICYmIG91dHB1dC5pbmNsdWRlcygnY29tcGlsZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgYnVpbGRDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBtb2R1bGVzLyk7XG4gICAgICAgIGNvbnN0IGFzc2V0TWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBhc3NldHMvKTtcbiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgc3RhdHVzIChbXFxkLl0rIFxcdyspLykgfHwgb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgcGF0aC4qPyhbXFxkLl0rIFxcdyspLyk7XG5cbiAgICAgICAgaWYobW9kdWxlTWF0Y2gpIGJ1aWxkU3RhdHMubW9kdWxlcyA9IHBhcnNlSW50KG1vZHVsZU1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKGFzc2V0TWF0Y2gpIGJ1aWxkU3RhdHMuYXNzZXRzID0gcGFyc2VJbnQoYXNzZXRNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihzaXplTWF0Y2gpIGJ1aWxkU3RhdHMuc2l6ZSA9IHNpemVNYXRjaFsxXTtcblxuICAgICAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ3dlYnBhY2snLCBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInLCBxdWlldCwgYnVpbGRTdGF0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICdcdUQ4M0NcdURGRDdcdUZFMEYnLCAnV2VicGFjayBCdWlsZGluZycpO1xuXG4gICAgICBpZighYnVpbGRDb21wbGV0ZWQgJiYgb3V0cHV0LmluY2x1ZGVzKCdjb21waWxlZCBzdWNjZXNzZnVsbHknKSkge1xuICAgICAgICBidWlsZENvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcblxuICAgICAgICBjb25zdCBtb2R1bGVNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspIG1vZHVsZXMvKTtcbiAgICAgICAgY29uc3QgYXNzZXRNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspIGFzc2V0cy8pO1xuICAgICAgICBjb25zdCBzaXplTWF0Y2ggPSBvdXRwdXQubWF0Y2goL2Fzc2V0cyBieSBzdGF0dXMgKFtcXGQuXSsgXFx3KykvKSB8fCBvdXRwdXQubWF0Y2goL2Fzc2V0cyBieSBwYXRoLio/KFtcXGQuXSsgXFx3KykvKTtcblxuICAgICAgICBpZihtb2R1bGVNYXRjaCkgYnVpbGRTdGF0cy5tb2R1bGVzID0gcGFyc2VJbnQobW9kdWxlTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgaWYoYXNzZXRNYXRjaCkgYnVpbGRTdGF0cy5hc3NldHMgPSBwYXJzZUludChhc3NldE1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKHNpemVNYXRjaCkgYnVpbGRTdGF0cy5zaXplID0gc2l6ZU1hdGNoWzFdO1xuXG4gICAgICAgIGRpc3BsYXlCdWlsZFN0YXR1cygnd2VicGFjaycsIExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYicsIHF1aWV0LCBidWlsZFN0YXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IGNoaWxkUHJvY2VzcztcblxuICAgIGlmKCFidWlsZENvbXBsZXRlZCkge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgICAgZGlzcGxheUJ1aWxkU3RhdHVzKCd3ZWJwYWNrJywgTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJywgcXVpZXQsIGJ1aWxkU3RhdHMpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQuJyk7XG5cbiAgICBpZihjbWQuYXNzaXN0KSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGhlIHdlYnBhY2sgZXJyb3IuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgcHJvbXB0OiBgRml4IHRoaXMgd2VicGFjayBidWlsZCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfVxcblxcbkVycm9yIGRldGFpbHM6XFxuJHtlcnJvci50b1N0cmluZygpfVxcblxcbkNvbmZpZ3VyYXRpb24gdXNlZDpcXG4ke0pTT04uc3RyaW5naWZ5KHdlYnBhY2tPcHRpb25zLCBudWxsLCAyKX1gLFxuICAgICAgICAgIHRhc2s6ICdoZWxwJyxcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIHF1aWV0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgYW5hbHlzaXMgY29tcGxldGUnKTtcbiAgICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBhc3Npc3RhbmNlJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIGFzc2lzdGFuY2UgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkID0gYXN5bmMgKGNtZDogQnVpbGRPcHRpb25zLCBjYWxsYmFjazogQnVpbGRDYWxsYmFjayA9ICgpID0+ICh7fSkpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgYnVuZGxlciA9ICd3ZWJwYWNrJyxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICByZW1vdmUgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2UsXG4gICAgdHJhbnNsYXRpb25zID0gZmFsc2UsXG4gICAgdmFyaWFibGVzID0gJ3t9J1xuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gYnVpbGRpbmcuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICBjaGVja0xpbmtlZE1vZHVsZXMoKTtcblxuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdwcm9kdWN0aW9uJ307XG5cbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhcmlhYmxlc09iaiA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIC8vIElmIGluIHRlc3QgbW9kZSwgZXhpdCBlYXJseVxuICBpZih0ZXN0KSB7XG4gICAgbG9nKCdUZXN0IG1vZGU6IEJ1aWxkIGVudmlyb25tZW50IGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gUHJvY2VzcyB0cmFuc2xhdGlvbnMgaWYgZmxhZyBpcyBlbmFibGVkIChiZWZvcmUgYnVpbGRpbmcpXG4gIGlmKHRyYW5zbGF0aW9ucykge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1Byb2Nlc3NpbmcgdHJhbnNsYXRpb25zLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IExleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGggfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInO1xuXG4gICAgICBhd2FpdCBwcm9jZXNzVHJhbnNsYXRpb25zKHNvdXJjZVBhdGgsIG91dHB1dFBhdGgsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnVHJhbnNsYXRpb25zIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgfSBjYXRjaCh0cmFuc2xhdGlvbkVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBwcm9jZXNzIHRyYW5zbGF0aW9uczogJHt0cmFuc2xhdGlvbkVycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gcHJvY2VzcyB0cmFuc2xhdGlvbnMuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHNwaW5uZXIuc3RhcnQoJ0J1aWxkaW5nIGNvZGUuLi4nKTtcblxuICBpZihyZW1vdmUpIHtcbiAgICBhd2FpdCByZW1vdmVGaWxlcyhvdXRwdXRGdWxsUGF0aCB8fCAnJyk7XG4gIH1cblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgY29uc3QgY29tcGlsZUNvbmZpZ1BhdGggPSBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aCgndHNjb25maWcuYnVpbGQuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMoY29tcGlsZUNvbmZpZ1BhdGgpKSB7XG4gICAgICBsb2coJ1VzaW5nIHRzY29uZmlnLmJ1aWxkLmpzb24gZm9yIGJ1aWxkLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIExleENvbmZpZy5jaGVja0NvbXBpbGVUeXBlc2NyaXB0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGJ1aWxkUmVzdWx0ID0gMDtcblxuICBpZihidW5kbGVyID09PSAnZXNidWlsZCcpIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aEVzQnVpbGQoc3Bpbm5lciwgY21kLCAoc3RhdHVzKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aFdlYnBhY2soc3Bpbm5lciwgY21kLCAoc3RhdHVzKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGJ1aWxkUmVzdWx0ID09PSAwICYmIGNtZC5hbmFseXplKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSBidWlsZCBvdXRwdXQgZm9yIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSB7XG4gICAgICAgIG91dHB1dFBhdGg6IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGgsXG4gICAgICAgIGVudHJ5UG9pbnRzOiBidW5kbGVyID09PSAnZXNidWlsZCcgP1xuICAgICAgICAgIGBTb3VyY2UgZmlsZXM6ICR7TGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aH0vKiovKi57dHMsanN9YCA6XG4gICAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy53ZWJwYWNrPy5lbnRyeSB8fCAnVW5rbm93biBlbnRyeSBwb2ludHMnXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgcHJvbXB0OiBgQW5hbHl6ZSB0aGlzIGJ1aWxkIGZvciBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllczpcblxuQnVpbGQgVHlwZTogJHtidW5kbGVyfVxuRm9ybWF0OiAke2NtZC5mb3JtYXQgfHwgJ2RlZmF1bHQnfVxuRW52aXJvbm1lbnQ6ICR7TGV4Q29uZmlnLmNvbmZpZy50YXJnZXRFbnZpcm9ubWVudH1cbiR7SlNPTi5zdHJpbmdpZnkoc3RhdHMsIG51bGwsIDIpfVxuXG5XaGF0IGFyZSB0aGUga2V5IG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzIGZvciB0aGlzIGJ1aWxkIGNvbmZpZ3VyYXRpb24/IENvbnNpZGVyOlxuMS4gQnVuZGxlIHNpemUgb3B0aW1pemF0aW9uIHN0cmF0ZWdpZXNcbjIuIENvZGUgc3BsaXR0aW5nIHJlY29tbWVuZGF0aW9uc1xuMy4gVHJlZS1zaGFraW5nIGltcHJvdmVtZW50c1xuNC4gUGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzXG41LiBEZXBlbmRlbmN5IG9wdGltaXphdGlvbnNgLFxuICAgICAgICB0YXNrOiAnb3B0aW1pemUnLFxuICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICBxdWlldFxuICAgICAgfSk7XG5cbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgYnVpbGQgYW5hbHlzaXMgY29tcGxldGUnKTtcbiAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgIHNwaW5uZXIuZmFpbCgnQ291bGQgbm90IGdlbmVyYXRlIEFJIG9wdGltaXphdGlvbiBhbmFseXNpcycpO1xuICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIGFuYWx5c2lzIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmKGJ1aWxkUmVzdWx0ID09PSAwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvcHlDb25maWd1cmVkRmlsZXMoc3Bpbm5lciwgTGV4Q29uZmlnLmNvbmZpZywgcXVpZXQpO1xuICAgIH0gY2F0Y2goY29weUVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBjb3B5IGNvbmZpZ3VyZWQgZmlsZXM6ICR7Y29weUVycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhidWlsZFJlc3VsdCk7XG4gIHJldHVybiBidWlsZFJlc3VsdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBTyx5QkFBeUI7QUFDaEMsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsWUFBWSxvQkFBbUI7QUFDdkMsU0FBUSxRQUFRLGdCQUFlO0FBQy9CLFNBQVEsU0FBUyxXQUFXLG1CQUFrQjtBQUU5QyxTQUFRLFdBQVcsK0JBQThCO0FBQ2pELFNBQVEsb0JBQW9CLHFCQUFxQixlQUFrQyx1QkFBdUIsbUJBQWtCO0FBQzVILFNBQVEsWUFBWSxrQkFBa0IscUJBQXFCLDZCQUE0QjtBQUN2RixTQUFRLFdBQVU7QUFDbEIsU0FBUSwyQkFBMEI7QUFDbEMsU0FBUSxrQkFBaUI7QUFDekIsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sV0FBVztBQUVsQixJQUFJO0FBQ0osSUFBSTtBQUVKLElBQUk7QUFDRixvQkFBa0IsS0FBSywrQ0FBK0M7QUFDdEUsbUJBQWlCLFFBQVEsZUFBZTtBQUMxQyxRQUFRO0FBQ04sb0JBQWtCLFFBQVEsSUFBSTtBQUM5QixtQkFBaUIsUUFBUSxJQUFJO0FBQy9CO0FBcUJBLE1BQU0scUJBQXFCLENBQUMsU0FBaUIsWUFBb0IsT0FBZ0IsVUFBK0Q7QUFDOUksTUFBRyxNQUFPO0FBRVYsTUFBSSxZQUFZO0FBQ2hCLE1BQUcsU0FBUyxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQ3pDLGdCQUFZO0FBQUEsRUFBSyxNQUFNLE1BQU0sVUFBVSxDQUFDLE9BQU8sTUFBTSxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDbkUsTUFBTSxNQUFNLFNBQVMsQ0FBQyxRQUFRLE1BQU0sS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQ3RELE1BQU0sTUFBTSxPQUFPLENBQUMsVUFBVSxNQUFNLEtBQUssTUFBTSxJQUFJ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SUFDN0QsT0FBTztBQUNMLGdCQUFVLDZCQUE2QjtBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUVBLE1BQUksY0FBYztBQUVsQixNQUFHLFlBQVksV0FBVztBQUN4QixrQkFBYyxNQUFNLGlCQUFpQixTQUFTLEtBQUssQ0FBQyxXQUFXO0FBQzdELG9CQUFjO0FBQUEsSUFDaEIsQ0FBQztBQUFBLEVBQ0gsT0FBTztBQUNMLGtCQUFjLE1BQU0saUJBQWlCLFNBQVMsS0FBSyxDQUFDLFdBQVc7QUFDN0Qsb0JBQWM7QUFBQSxJQUNoQixDQUFDO0FBQUEsRUFDSDtBQUVBLE1BQUcsZ0JBQWdCLEtBQUssSUFBSSxTQUFTO0FBQ25DLFlBQVEsTUFBTSxvRUFBb0U7QUFFbEYsUUFBSTtBQUNGLFlBQU0sUUFBUTtBQUFBLFFBQ1osWUFBWSxVQUFVLE9BQU87QUFBQSxRQUM3QixhQUFhLFlBQVksWUFDdkIsaUJBQWlCLFVBQVUsT0FBTyxjQUFjLGtCQUNoRCxVQUFVLE9BQU8sU0FBUyxTQUFTO0FBQUEsTUFDdkM7QUFFQSxZQUFNLFdBQVc7QUFBQSxRQUNmLFFBQVE7QUFBQTtBQUFBLGNBRUYsT0FBTztBQUFBLFVBQ1gsSUFBSSxVQUFVLFNBQVM7QUFBQSxlQUNsQixVQUFVLE9BQU8saUJBQWlCO0FBQUEsRUFDL0MsS0FBSyxVQUFVLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBUXhCLE1BQU07QUFBQSxRQUNOLFNBQVM7QUFBQSxRQUNUO0FBQUEsTUFDRixDQUFDO0FBRUQsY0FBUSxRQUFRLDRCQUE0QjtBQUFBLElBQzlDLFNBQVEsU0FBUztBQUNmLGNBQVEsS0FBSyw2Q0FBNkM7QUFDMUQsVUFBRyxDQUFDLE9BQU87QUFDVCxnQkFBUSxNQUFNLHNCQUFzQixPQUFPO0FBQUEsTUFDN0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUcsZ0JBQWdCLEdBQUc7QUFDcEIsUUFBSTtBQUNGLFlBQU0sb0JBQW9CLFNBQVMsVUFBVSxRQUFRLEtBQUs7QUFBQSxJQUM1RCxTQUFRLFdBQVc7QUFDakIsVUFBSTtBQUFBLEVBQUssT0FBTyw0Q0FBNEMsVUFBVSxPQUFPLElBQUksU0FBUyxLQUFLO0FBQy9GLGVBQVMsQ0FBQztBQUNWLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFdBQVMsV0FBVztBQUNwQixTQUFPO0FBQ1Q7QUFFQSxJQUFPLGdCQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
383
+ export default build;
384
+
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7ZGlybmFtZSwgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnLCBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aH0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y2hlY2tMaW5rZWRNb2R1bGVzLCBjb3B5Q29uZmlndXJlZEZpbGVzLCBjcmVhdGVTcGlubmVyLCBjcmVhdGVQcm9ncmVzc0JhciwgaGFuZGxlV2VicGFja1Byb2dyZXNzLCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7Z2V0RGlyTmFtZSwgcmVsYXRpdmVOb2RlUGF0aCwgcmVzb2x2ZVdlYnBhY2tQYXRocywgZ2V0TGV4UGFja2FnZUpzb25QYXRofSBmcm9tICcuLi8uLi91dGlscy9maWxlLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHtwcm9jZXNzVHJhbnNsYXRpb25zfSBmcm9tICcuLi8uLi91dGlscy90cmFuc2xhdGlvbnMuanMnO1xuaW1wb3J0IHthaUZ1bmN0aW9ufSBmcm9tICcuLi9haS9haS5qcyc7XG5pbXBvcnQgYm94ZW4gZnJvbSAnYm94ZW4nO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxubGV0IGN1cnJlbnRGaWxlbmFtZTogc3RyaW5nO1xubGV0IGN1cnJlbnREaXJuYW1lOiBzdHJpbmc7XG5cbnRyeSB7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IGV2YWwoJ3JlcXVpcmUoXCJ1cmxcIikuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpJyk7XG4gIGN1cnJlbnREaXJuYW1lID0gZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xufSBjYXRjaCB7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IHByb2Nlc3MuY3dkKCk7XG4gIGN1cnJlbnREaXJuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICByZWFkb25seSBhc3Npc3Q/OiBib29sZWFuO1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYnVuZGxlcj86ICd3ZWJwYWNrJyB8ICdzd2MnO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRyeT86IHN0cmluZzsgLy8gPC0tIGFkZCBlbnRyeVxuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7IC8vIDwtLSBhbHJlYWR5IHByZXNlbnRcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmU/OiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSB0ZXN0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhbnNsYXRpb25zPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB3YXRjaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmNvbnN0IGRpc3BsYXlCdWlsZFN0YXR1cyA9IChidW5kbGVyOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4sIHN0YXRzPzoge21vZHVsZXM/OiBudW1iZXI7IGFzc2V0cz86IG51bWJlcjsgc2l6ZT86IHN0cmluZ30pID0+IHtcbiAgaWYocXVpZXQpIHJldHVybjtcblxuICBsZXQgc3RhdHNJbmZvID0gJyc7XG4gIGlmKHN0YXRzICYmIHN0YXRzLm1vZHVsZXMgJiYgc3RhdHMuYXNzZXRzKSB7XG4gICAgc3RhdHNJbmZvID0gYFxcbiR7Y2hhbGsuZ3JlZW4oJ01vZHVsZXM6Jyl9ICAgICR7Y2hhbGsuY3lhbihzdGF0cy5tb2R1bGVzKX1cXG5gICtcbiAgICAgIGAke2NoYWxrLmdyZWVuKCdBc3NldHM6Jyl9ICAgICAke2NoYWxrLmN5YW4oc3RhdHMuYXNzZXRzKX1cXG5gICtcbiAgICAgIGAke2NoYWxrLmdyZWVuKCdTaXplOicpfSAgICAgICAke2NoYWxrLmN5YW4oc3RhdHMuc2l6ZSl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+Pl++4jyAgQnVpbGQgQ29tcGxldGVkIFN1Y2Nlc3NmdWxseScpfVxcblxcbmAgK1xuICAgIGAke2NoYWxrLmdyZWVuKCdCdW5kbGVyOicpfSAgICAke2NoYWxrLmN5YW4oYnVuZGxlcil9XFxuYCArXG4gICAgYCR7Y2hhbGsuZ3JlZW4oJ091dHB1dDonKX0gICAgICR7Y2hhbGsudW5kZXJsaW5lKG91dHB1dFBhdGgpfSR7c3RhdHNJbmZvfVxcbmAgK1xuICAgIGAke2NoYWxrLnllbGxvdygnUmVhZHkgZm9yIGRlcGxveW1lbnQhIPCfmoAnKX1gLFxuICAgIHtcbiAgICAgIHBhZGRpbmc6IDEsXG4gICAgICBtYXJnaW46IDEsXG4gICAgICBib3JkZXJTdHlsZTogJ3JvdW5kJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnZ3JlZW4nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzFhMWExYSdcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coJ1xcbicgKyBzdGF0dXNCb3ggKyAnXFxuJyk7XG59O1xuXG4vLyBSZW1vdmVkIGJ1aWxkV2l0aEVzQnVpbGQgZnVuY3Rpb24gLSB1c2luZyBTV0MgaW5zdGVhZFxuXG5leHBvcnQgY29uc3QgYnVpbGRXaXRoU1dDID0gYXN5bmMgKHNwaW5uZXIsIGNvbW1hbmRPcHRpb25zOiBCdWlsZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWlsZENhbGxiYWNrKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgZm9ybWF0ID0gJ2VzbScsXG4gICAgb3V0cHV0UGF0aCxcbiAgICBxdWlldCxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHdhdGNoXG4gIH0gPSBjb21tYW5kT3B0aW9ucztcbiAgY29uc3Qge1xuICAgIG91dHB1dEZ1bGxQYXRoLFxuICAgIHNvdXJjZUZ1bGxQYXRoLFxuICAgIHN3Yzogc3djQ29uZmlnLFxuICAgIHRhcmdldEVudmlyb25tZW50LFxuICAgIHVzZUdyYXBoUWwsXG4gICAgdXNlVHlwZXNjcmlwdFxuICB9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgc291cmNlRGlyOiBzdHJpbmcgPSBzb3VyY2VQYXRoID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYC4vJHtzb3VyY2VQYXRofWApIDogc291cmNlRnVsbFBhdGggfHwgJyc7XG5cbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7XG4gICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgZG90OiBmYWxzZSxcbiAgICBub2RpcjogdHJ1ZSxcbiAgICBub3NvcnQ6IHRydWVcbiAgfTtcbiAgY29uc3QgdHNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgJHtzb3VyY2VEaXJ9LyoqLyEoKi5zcGVjfCoudGVzdCkudHMqYCwgZ2xvYk9wdGlvbnMpO1xuICBjb25zdCBqc0ZpbGVzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKGAke3NvdXJjZURpcn0vKiovISgqLnNwZWN8Ki50ZXN0KS5qc2AsIGdsb2JPcHRpb25zKTtcbiAgY29uc3Qgc291cmNlRmlsZXM6IHN0cmluZ1tdID0gWy4uLnRzRmlsZXMsIC4uLmpzRmlsZXNdO1xuXG4gIGNvbnN0IG91dHB1dERpcjogc3RyaW5nID0gb3V0cHV0UGF0aCB8fCBvdXRwdXRGdWxsUGF0aCB8fCAnJztcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0J1aWxkaW5nIHdpdGggU1dDLi4uJyk7XG5cbiAgICBmb3IoY29uc3QgZmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGhSZXNvbHZlKHNvdXJjZURpciwgZmlsZSk7XG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aFJlc29sdmUob3V0cHV0RGlyLCBmaWxlLnJlcGxhY2UoL1xcLih0c3x0c3gpJC8sICcuanMnKSk7XG5cbiAgICAgIC8vIEVuc3VyZSBvdXRwdXQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgY29uc3Qgb3V0cHV0RGlyUGF0aCA9IGRpcm5hbWUob3V0cHV0UGF0aCk7XG4gICAgICBpZighZXhpc3RzU3luYyhvdXRwdXREaXJQYXRoKSkge1xuICAgICAgICBjb25zdCB7bWtkaXJTeW5jfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgICAgbWtkaXJTeW5jKG91dHB1dERpclBhdGgsIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHJlYWRGaWxlU3luYyhzb3VyY2VQYXRoLCAndXRmOCcpO1xuXG4gICAgICBjb25zdCBpc1RTWCA9IGZpbGUuZW5kc1dpdGgoJy50c3gnKTtcblxuICAgICAgLy8gTWVyZ2UgU1dDIGNvbmZpZyB3aXRoIGNvbW1hbmQtc3BlY2lmaWMgb3ZlcnJpZGVzXG4gICAgICBjb25zdCBzd2NPcHRpb25zID0ge1xuICAgICAgICBmaWxlbmFtZTogZmlsZSxcbiAgICAgICAgLi4uc3djQ29uZmlnLFxuICAgICAgICBqc2M6IHtcbiAgICAgICAgICAuLi5zd2NDb25maWc/LmpzYyxcbiAgICAgICAgICBwYXJzZXI6IHtcbiAgICAgICAgICAgIHN5bnRheDogJ3R5cGVzY3JpcHQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgdHN4OiBpc1RTWCxcbiAgICAgICAgICAgIGRlY29yYXRvcnM6IHN3Y0NvbmZpZz8uanNjPy5wYXJzZXI/LmRlY29yYXRvcnMgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGR5bmFtaWNJbXBvcnQ6IHN3Y0NvbmZpZz8uanNjPy5wYXJzZXI/LmR5bmFtaWNJbXBvcnQgPz8gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0OiBzd2NDb25maWc/LmpzYz8udGFyZ2V0ID8/ICdlczIwMjAnLFxuICAgICAgICAgIHRyYW5zZm9ybTogaXNUU1ggPyB7XG4gICAgICAgICAgICAuLi5zd2NDb25maWc/LmpzYz8udHJhbnNmb3JtLFxuICAgICAgICAgICAgcmVhY3Q6IHtcbiAgICAgICAgICAgICAgcnVudGltZTogJ2F1dG9tYXRpYycgYXMgY29uc3QsXG4gICAgICAgICAgICAgIC4uLnN3Y0NvbmZpZz8uanNjPy50cmFuc2Zvcm0/LnJlYWN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSA6IHN3Y0NvbmZpZz8uanNjPy50cmFuc2Zvcm1cbiAgICAgICAgfSxcbiAgICAgICAgbW9kdWxlOiB7XG4gICAgICAgICAgLi4uc3djQ29uZmlnPy5tb2R1bGUsXG4gICAgICAgICAgdHlwZTogZm9ybWF0ID09PSAnY2pzJyA/ICdjb21tb25qcycgYXMgY29uc3QgOiAoc3djQ29uZmlnPy5tb2R1bGU/LnR5cGUgYXMgJ2VzNicgfHwgJ2VzNicpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybShzb3VyY2VDb2RlLCBzd2NPcHRpb25zKTtcblxuICAgICAgY29uc3Qge3dyaXRlRmlsZVN5bmN9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgICAgd3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCByZXN1bHQuY29kZSk7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgd2l0aCBTV0MnKTtcbiAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ1NXQycsIG91dHB1dERpciwgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQgd2l0aCBTV0MnKTtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkV2l0aFdlYnBhY2sgPSBhc3luYyAoc3Bpbm5lciwgY21kLCBjYWxsYmFjaykgPT4ge1xuICBjb25zdCB7XG4gICAgYW5hbHl6ZSxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZ05hbWUsXG4gICAgZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYsXG4gICAgZGV2dG9vbCxcbiAgICBkaXNhYmxlSW50ZXJwcmV0LFxuICAgIGVudHJ5LFxuICAgIGVudixcbiAgICBmYWlsT25XYXJuaW5ncyxcbiAgICBqc29uLFxuICAgIG1lcmdlLFxuICAgIG1vZGUsXG4gICAgbmFtZSxcbiAgICBub2RlRW52LFxuICAgIG5vRGV2dG9vbCxcbiAgICBub1N0YXRzLFxuICAgIG5vVGFyZ2V0LFxuICAgIG5vV2F0Y2gsXG4gICAgbm9XYXRjaE9wdGlvbnNTdGRpbixcbiAgICBvdXRwdXRQYXRoLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgc3RhdHMsXG4gICAgdGFyZ2V0LFxuICAgIHdhdGNoLFxuICAgIHdhdGNoT3B0aW9uc1N0ZGluXG4gIH0gPSBjbWQ7XG5cbiAgY29uc29sZS5sb2coJ2VudHJ5OicsIGVudHJ5LCAndHlwZTonLCB0eXBlb2YgZW50cnkpO1xuICBjb25zb2xlLmxvZygnb3V0cHV0UGF0aDonLCBvdXRwdXRQYXRoLCAndHlwZTonLCB0eXBlb2Ygb3V0cHV0UGF0aCk7XG5cbiAgY29uc3QgZW50cnlWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMF0gOiBlbnRyeTtcblxuICBsZXQgd2VicGFja0NvbmZpZzogc3RyaW5nO1xuXG4gIGlmKGNvbmZpZykge1xuICAgIGNvbnN0IGlzUmVsYXRpdmVDb25maWc6IGJvb2xlYW4gPSBjb25maWcuc3Vic3RyKDAsIDIpID09PSAnLi8nO1xuICAgIHdlYnBhY2tDb25maWcgPSBpc1JlbGF0aXZlQ29uZmlnID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnKSA6IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZy5qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcudHMnKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHwgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKTtcblxuICAgIGlmKGhhc1Byb2plY3RDb25maWcpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoVHMpID8gcHJvamVjdENvbmZpZ1BhdGhUcyA6IHByb2plY3RDb25maWdQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7d2VicGFja0NvbmZpZzogcmVzb2x2ZWRDb25maWd9ID0gcmVzb2x2ZVdlYnBhY2tQYXRocyhjdXJyZW50RGlybmFtZSk7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gcmVzb2x2ZWRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coJ3dlYnBhY2tDb25maWcgcGF0aDonLCB3ZWJwYWNrQ29uZmlnKTtcbiAgY29uc29sZS5sb2coJ3dlYnBhY2tDb25maWcgZXhpc3RzOicsIGV4aXN0c1N5bmMod2VicGFja0NvbmZpZykpO1xuXG4gIGlmKCFleGlzdHNTeW5jKHdlYnBhY2tDb25maWcpKSB7XG4gICAgY29uc3QgbGV4UGFja2FnZVBhdGggPSBnZXRMZXhQYWNrYWdlSnNvblBhdGgoKTtcbiAgICBjb25zdCBsZXhQYWNrYWdlRGlyID0gZGlybmFtZShsZXhQYWNrYWdlUGF0aCk7XG4gICAgY29uc3QgbGV4V2VicGFja0NvbmZpZyA9IHBhdGhSZXNvbHZlKGxleFBhY2thZ2VEaXIsICd3ZWJwYWNrLmNvbmZpZy5qcycpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhsZXhXZWJwYWNrQ29uZmlnKSkge1xuICAgICAgd2VicGFja0NvbmZpZyA9IGxleFdlYnBhY2tDb25maWc7XG4gICAgICBjb25zb2xlLmxvZygnVXNpbmcgTGV4IHdlYnBhY2sgY29uZmlnOicsIHdlYnBhY2tDb25maWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvdWxkIG5vdCBmaW5kIHdlYnBhY2suY29uZmlnLmpzYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAnLS1jb2xvcicsXG4gICAgJy0tcHJvZ3Jlc3MnLFxuICAgICctLWNvbmZpZycsIHdlYnBhY2tDb25maWdcbiAgXTtcblxuICBpZihhbmFseXplKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWFuYWx5emUnKTtcbiAgaWYoY29uZmlnTmFtZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1jb25maWdOYW1lJywgY29uZmlnTmFtZSk7XG4gIGlmKGRlZmluZVByb2Nlc3NFbnZOb2RlRW52KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWRlZmluZVByb2Nlc3NFbnZOb2RlRW52JywgZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYpO1xuICBpZihkZXZ0b29sKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWRldnRvb2wnLCBkZXZ0b29sKTtcbiAgaWYoZGlzYWJsZUludGVycHJldCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1kaXNhYmxlSW50ZXJwcmV0Jyk7XG4gIC8vIFBhc3MgZW50cnkgZGlyZWN0bHkgYXMgQ0xJIGZsYWdcbiAgaWYoZW50cnlWYWx1ZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1lbnRyeScsIGVudHJ5VmFsdWUudG9TdHJpbmcoKSk7XG4gIGlmKGVudikgd2VicGFja09wdGlvbnMucHVzaCgnLS1lbnYnLCBlbnYpO1xuICBpZihmYWlsT25XYXJuaW5ncykgd2VicGFja09wdGlvbnMucHVzaCgnLS1mYWlsT25XYXJuaW5ncycpO1xuICBpZihqc29uKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWpzb24nLCBqc29uKTtcbiAgaWYobW9kZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1tb2RlJywgbW9kZSk7XG4gIGlmKG1lcmdlKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW1lcmdlJyk7XG4gIGlmKG5hbWUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbmFtZScsIG5hbWUpO1xuICBpZihub0RldnRvb2wpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9EZXZ0b29sJyk7XG4gIGlmKG5vU3RhdHMpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9TdGF0cycpO1xuICBpZihub1RhcmdldCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1RhcmdldCcpO1xuICBpZihub1dhdGNoKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vV2F0Y2gnKTtcbiAgaWYobm9XYXRjaE9wdGlvbnNTdGRpbikgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1dhdGNoT3B0aW9uc1N0ZGluJyk7XG4gIGlmKG5vZGVFbnYpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9kZUVudicsIG5vZGVFbnYpO1xuICBpZihvdXRwdXRQYXRoKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW91dHB1dC1wYXRoJywgb3V0cHV0UGF0aC50b1N0cmluZygpKTsgLy8gQ29udmVydCB0byBzdHJpbmdcbiAgaWYoc3RhdHMpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tc3RhdHMnLCBzdGF0cyk7XG4gIGlmKHRhcmdldCkgd2VicGFja09wdGlvbnMucHVzaCgnLS10YXJnZXQnLCB0YXJnZXQpO1xuICBpZih3YXRjaCkgd2VicGFja09wdGlvbnMucHVzaCgnLS13YXRjaCcpO1xuICBpZih3YXRjaE9wdGlvbnNTdGRpbikgd2VicGFja09wdGlvbnMucHVzaCgnLS13YXRjaE9wdGlvbnNTdGRpbicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qge3dlYnBhY2tQYXRofSA9IHJlc29sdmVXZWJwYWNrUGF0aHMoY3VycmVudERpcm5hbWUpO1xuXG4gICAgLy8gRml4OiBFbnN1cmUgZmluYWxXZWJwYWNrT3B0aW9ucyBpcyBhbHdheXMgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGxldCBmaW5hbFdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXTtcbiAgICBpZih3ZWJwYWNrUGF0aCA9PT0gJ25weCcpIHtcbiAgICAgIGZpbmFsV2VicGFja09wdGlvbnMgPSBbJ3dlYnBhY2snLCAuLi53ZWJwYWNrT3B0aW9uc107XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFsV2VicGFja09wdGlvbnMgPSBbLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCd3ZWJwYWNrUGF0aDonLCB3ZWJwYWNrUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ2ZpbmFsV2VicGFja09wdGlvbnM6JywgSlNPTi5zdHJpbmdpZnkoZmluYWxXZWJwYWNrT3B0aW9ucykpO1xuICAgIGNvbnNvbGUubG9nKCdmaW5hbFdlYnBhY2tPcHRpb25zIHR5cGU6JywgQXJyYXkuaXNBcnJheShmaW5hbFdlYnBhY2tPcHRpb25zKSA/ICdBcnJheScgOiB0eXBlb2YgZmluYWxXZWJwYWNrT3B0aW9ucyk7XG5cbiAgICAvLyBNYWtlIHN1cmUgd2UncmUgcGFzc2luZyBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIGV4ZWNhXG4gICAgY29uc3QgY2hpbGRQcm9jZXNzID0gZXhlY2Eod2VicGFja1BhdGgsIGZpbmFsV2VicGFja09wdGlvbnMsIHtlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnfSk7XG5cbiAgICBsZXQgYnVpbGRDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICBsZXQgYnVpbGRTdGF0cyA9IHtcbiAgICAgIG1vZHVsZXM6IDAsXG4gICAgICBhc3NldHM6IDAsXG4gICAgICBzaXplOiAnMCBCJ1xuICAgIH07XG5cbiAgICBjaGlsZFByb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICfwn4+X77iPJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIWJ1aWxkQ29tcGxldGVkICYmIG91dHB1dC5pbmNsdWRlcygnY29tcGlsZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgYnVpbGRDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBtb2R1bGVzLyk7XG4gICAgICAgIGNvbnN0IGFzc2V0TWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBhc3NldHMvKTtcbiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgc3RhdHVzIChbXFxkLl0rIFxcdyspLykgfHwgb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgcGF0aC4qPyhbXFxkLl0rIFxcdyspLyk7XG5cbiAgICAgICAgaWYobW9kdWxlTWF0Y2gpIGJ1aWxkU3RhdHMubW9kdWxlcyA9IHBhcnNlSW50KG1vZHVsZU1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKGFzc2V0TWF0Y2gpIGJ1aWxkU3RhdHMuYXNzZXRzID0gcGFyc2VJbnQoYXNzZXRNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihzaXplTWF0Y2gpIGJ1aWxkU3RhdHMuc2l6ZSA9IHNpemVNYXRjaFsxXTtcblxuICAgICAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ3dlYnBhY2snLCBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInLCBxdWlldCwgYnVpbGRTdGF0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICfwn4+X77iPJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIWJ1aWxkQ29tcGxldGVkICYmIG91dHB1dC5pbmNsdWRlcygnY29tcGlsZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgYnVpbGRDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBtb2R1bGVzLyk7XG4gICAgICAgIGNvbnN0IGFzc2V0TWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBhc3NldHMvKTtcbiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgc3RhdHVzIChbXFxkLl0rIFxcdyspLykgfHwgb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgcGF0aC4qPyhbXFxkLl0rIFxcdyspLyk7XG5cbiAgICAgICAgaWYobW9kdWxlTWF0Y2gpIGJ1aWxkU3RhdHMubW9kdWxlcyA9IHBhcnNlSW50KG1vZHVsZU1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKGFzc2V0TWF0Y2gpIGJ1aWxkU3RhdHMuYXNzZXRzID0gcGFyc2VJbnQoYXNzZXRNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihzaXplTWF0Y2gpIGJ1aWxkU3RhdHMuc2l6ZSA9IHNpemVNYXRjaFsxXTtcblxuICAgICAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ3dlYnBhY2snLCBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInLCBxdWlldCwgYnVpbGRTdGF0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBjaGlsZFByb2Nlc3M7XG5cbiAgICBpZighYnVpbGRDb21wbGV0ZWQpIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICAgIGRpc3BsYXlCdWlsZFN0YXR1cygnd2VicGFjaycsIExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYicsIHF1aWV0LCBidWlsZFN0YXRzKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkLicpO1xuXG4gICAgaWYoY21kLmFzc2lzdCkge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSB3ZWJwYWNrIGVycm9yLi4uJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIHByb21wdDogYEZpeCB0aGlzIHdlYnBhY2sgYnVpbGQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1cXG5cXG5FcnJvciBkZXRhaWxzOlxcbiR7ZXJyb3IudG9TdHJpbmcoKX1cXG5cXG5Db25maWd1cmF0aW9uIHVzZWQ6XFxuJHtKU09OLnN0cmluZ2lmeSh3ZWJwYWNrT3B0aW9ucywgbnVsbCwgMil9YCxcbiAgICAgICAgICB0YXNrOiAnaGVscCcsXG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBxdWlldFxuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgYXNzaXN0YW5jZScpO1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhc3Npc3RhbmNlIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZCA9IGFzeW5jIChjbWQ6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2sgPSAoKSA9PiAoe30pKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGJ1bmRsZXIgPSAnd2VicGFjaycsXG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgcmVtb3ZlID0gZmFsc2UsXG4gICAgdGVzdCA9IGZhbHNlLFxuICAgIHRyYW5zbGF0aW9ucyA9IGZhbHNlLFxuICAgIHZhcmlhYmxlcyA9ICd7fSdcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IGJ1aWxkaW5nLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCB1c2VUeXBlc2NyaXB0fSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgY2hlY2tMaW5rZWRNb2R1bGVzKCk7XG5cbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAncHJvZHVjdGlvbid9O1xuXG4gIGlmKHZhcmlhYmxlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXJpYWJsZXNPYmogPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICAvLyBJZiBpbiB0ZXN0IG1vZGUsIGV4aXQgZWFybHlcbiAgaWYodGVzdCkge1xuICAgIGxvZygnVGVzdCBtb2RlOiBCdWlsZCBlbnZpcm9ubWVudCBsb2FkZWQsIGV4aXRpbmcnLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgdHJhbnNsYXRpb25zIGlmIGZsYWcgaXMgZW5hYmxlZCAoYmVmb3JlIGJ1aWxkaW5nKVxuICBpZih0cmFuc2xhdGlvbnMpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdQcm9jZXNzaW5nIHRyYW5zbGF0aW9ucy4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBMZXhDb25maWcuY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcblxuICAgICAgYXdhaXQgcHJvY2Vzc1RyYW5zbGF0aW9ucyhzb3VyY2VQYXRoLCBvdXRwdXRQYXRoLCBxdWlldCk7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1RyYW5zbGF0aW9ucyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgIH0gY2F0Y2godHJhbnNsYXRpb25FcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gcHJvY2VzcyB0cmFuc2xhdGlvbnM6ICR7dHJhbnNsYXRpb25FcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHByb2Nlc3MgdHJhbnNsYXRpb25zLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBzcGlubmVyLnN0YXJ0KCdCdWlsZGluZyBjb2RlLi4uJyk7XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RnVsbFBhdGggfHwgJycpO1xuICB9XG5cbiAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgIGNvbnN0IGNvbXBpbGVDb25maWdQYXRoID0gZ2V0VHlwZVNjcmlwdENvbmZpZ1BhdGgoJ3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKGNvbXBpbGVDb25maWdQYXRoKSkge1xuICAgICAgbG9nKCdVc2luZyB0c2NvbmZpZy5idWlsZC5qc29uIGZvciBidWlsZC4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBMZXhDb25maWcuY2hlY2tDb21waWxlVHlwZXNjcmlwdENvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBidWlsZFJlc3VsdCA9IDA7XG5cbiAgaWYoYnVuZGxlciA9PT0gJ3N3YycpIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aFNXQyhzcGlubmVyLCBjbWQsIChzdGF0dXMpID0+IHtcbiAgICAgIGJ1aWxkUmVzdWx0ID0gc3RhdHVzO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJ1aWxkUmVzdWx0ID0gYXdhaXQgYnVpbGRXaXRoV2VicGFjayhzcGlubmVyLCBjbWQsIChzdGF0dXMpID0+IHtcbiAgICAgIGJ1aWxkUmVzdWx0ID0gc3RhdHVzO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoYnVpbGRSZXN1bHQgPT09IDAgJiYgY21kLmFuYWx5emUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGhlIGJ1aWxkIG91dHB1dCBmb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IHtcbiAgICAgICAgb3V0cHV0UGF0aDogTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCxcbiAgICAgICAgZW50cnlQb2ludHM6IGJ1bmRsZXIgPT09ICdzd2MnID9cbiAgICAgICAgICBgU291cmNlIGZpbGVzOiAke0xleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGh9LyoqLyoue3RzLGpzfWAgOlxuICAgICAgICAgIExleENvbmZpZy5jb25maWcud2VicGFjaz8uZW50cnkgfHwgJ1Vua25vd24gZW50cnkgcG9pbnRzJ1xuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgIHByb21wdDogYEFuYWx5emUgdGhpcyBidWlsZCBmb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXM6XG5cbkJ1aWxkIFR5cGU6ICR7YnVuZGxlcn1cbkZvcm1hdDogJHtjbWQuZm9ybWF0IHx8ICdkZWZhdWx0J31cbkVudmlyb25tZW50OiAke0xleENvbmZpZy5jb25maWcudGFyZ2V0RW52aXJvbm1lbnR9XG4ke0pTT04uc3RyaW5naWZ5KHN0YXRzLCBudWxsLCAyKX1cblxuV2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyBmb3IgdGhpcyBidWlsZCBjb25maWd1cmF0aW9uPyBDb25zaWRlcjpcbjEuIEJ1bmRsZSBzaXplIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzXG4yLiBDb2RlIHNwbGl0dGluZyByZWNvbW1lbmRhdGlvbnNcbjMuIFRyZWUtc2hha2luZyBpbXByb3ZlbWVudHNcbjQuIFBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuNS4gRGVwZW5kZW5jeSBvcHRpbWl6YXRpb25zYCxcbiAgICAgICAgdGFzazogJ29wdGltaXplJyxcbiAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgcXVpZXRcbiAgICAgIH0pO1xuXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGJ1aWxkIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBvcHRpbWl6YXRpb24gYW5hbHlzaXMnKTtcbiAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhbmFseXNpcyBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZihidWlsZFJlc3VsdCA9PT0gMCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb3B5Q29uZmlndXJlZEZpbGVzKHNwaW5uZXIsIExleENvbmZpZy5jb25maWcsIHF1aWV0KTtcbiAgICB9IGNhdGNoKGNvcHlFcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gY29weSBjb25maWd1cmVkIGZpbGVzOiAke2NvcHlFcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soYnVpbGRSZXN1bHQpO1xuICByZXR1cm4gYnVpbGRSZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBidWlsZDtcbiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm0iLCJleGVjYSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJkaXJuYW1lIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiTGV4Q29uZmlnIiwiZ2V0VHlwZVNjcmlwdENvbmZpZ1BhdGgiLCJjaGVja0xpbmtlZE1vZHVsZXMiLCJjb3B5Q29uZmlndXJlZEZpbGVzIiwiY3JlYXRlU3Bpbm5lciIsImhhbmRsZVdlYnBhY2tQcm9ncmVzcyIsInJlbW92ZUZpbGVzIiwicmVzb2x2ZVdlYnBhY2tQYXRocyIsImdldExleFBhY2thZ2VKc29uUGF0aCIsImxvZyIsInByb2Nlc3NUcmFuc2xhdGlvbnMiLCJhaUZ1bmN0aW9uIiwiYm94ZW4iLCJjaGFsayIsImN1cnJlbnRGaWxlbmFtZSIsImN1cnJlbnREaXJuYW1lIiwiZXZhbCIsInByb2Nlc3MiLCJjd2QiLCJkaXNwbGF5QnVpbGRTdGF0dXMiLCJidW5kbGVyIiwib3V0cHV0UGF0aCIsInF1aWV0Iiwic3RhdHMiLCJzdGF0c0luZm8iLCJtb2R1bGVzIiwiYXNzZXRzIiwiZ3JlZW4iLCJjeWFuIiwic2l6ZSIsInN0YXR1c0JveCIsImJvbGQiLCJ1bmRlcmxpbmUiLCJ5ZWxsb3ciLCJwYWRkaW5nIiwibWFyZ2luIiwiYm9yZGVyU3R5bGUiLCJib3JkZXJDb2xvciIsImJhY2tncm91bmRDb2xvciIsImNvbnNvbGUiLCJidWlsZFdpdGhTV0MiLCJzcGlubmVyIiwiY29tbWFuZE9wdGlvbnMiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJmb3JtYXQiLCJzb3VyY2VQYXRoIiwid2F0Y2giLCJvdXRwdXRGdWxsUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwic3djIiwic3djQ29uZmlnIiwidGFyZ2V0RW52aXJvbm1lbnQiLCJ1c2VHcmFwaFFsIiwidXNlVHlwZXNjcmlwdCIsImNvbmZpZyIsInNvdXJjZURpciIsImdsb2JPcHRpb25zIiwiZG90Iiwibm9kaXIiLCJub3NvcnQiLCJ0c0ZpbGVzIiwianNGaWxlcyIsInNvdXJjZUZpbGVzIiwib3V0cHV0RGlyIiwic3RhcnQiLCJmaWxlIiwicmVwbGFjZSIsIm91dHB1dERpclBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJzb3VyY2VDb2RlIiwiaXNUU1giLCJlbmRzV2l0aCIsInN3Y09wdGlvbnMiLCJmaWxlbmFtZSIsImpzYyIsInBhcnNlciIsInN5bnRheCIsInRzeCIsImRlY29yYXRvcnMiLCJkeW5hbWljSW1wb3J0IiwidGFyZ2V0IiwicmVhY3QiLCJydW50aW1lIiwibW9kdWxlIiwidHlwZSIsInJlc3VsdCIsIndyaXRlRmlsZVN5bmMiLCJjb2RlIiwic3VjY2VlZCIsImVycm9yIiwiZmFpbCIsImJ1aWxkV2l0aFdlYnBhY2siLCJjbWQiLCJhbmFseXplIiwiY29uZmlnTmFtZSIsImRlZmluZVByb2Nlc3NFbnZOb2RlRW52IiwiZGV2dG9vbCIsImRpc2FibGVJbnRlcnByZXQiLCJlbnRyeSIsImVudiIsImZhaWxPbldhcm5pbmdzIiwianNvbiIsIm1lcmdlIiwibW9kZSIsIm5hbWUiLCJub2RlRW52Iiwibm9EZXZ0b29sIiwibm9TdGF0cyIsIm5vVGFyZ2V0Iiwibm9XYXRjaCIsIm5vV2F0Y2hPcHRpb25zU3RkaW4iLCJ3YXRjaE9wdGlvbnNTdGRpbiIsImVudHJ5VmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJ3ZWJwYWNrQ29uZmlnIiwiaXNSZWxhdGl2ZUNvbmZpZyIsInN1YnN0ciIsInByb2plY3RDb25maWdQYXRoIiwicHJvamVjdENvbmZpZ1BhdGhUcyIsImhhc1Byb2plY3RDb25maWciLCJyZXNvbHZlZENvbmZpZyIsImxleFBhY2thZ2VQYXRoIiwibGV4UGFja2FnZURpciIsImxleFdlYnBhY2tDb25maWciLCJ3ZWJwYWNrT3B0aW9ucyIsInB1c2giLCJ0b1N0cmluZyIsIndlYnBhY2tQYXRoIiwiZmluYWxXZWJwYWNrT3B0aW9ucyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjaGlsZFByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiYnVpbGRDb21wbGV0ZWQiLCJidWlsZFN0YXRzIiwic3Rkb3V0Iiwib24iLCJkYXRhIiwib3V0cHV0IiwiaW5jbHVkZXMiLCJtb2R1bGVNYXRjaCIsIm1hdGNoIiwiYXNzZXRNYXRjaCIsInNpemVNYXRjaCIsInBhcnNlSW50Iiwic3RkZXJyIiwibWVzc2FnZSIsImFzc2lzdCIsInByb21wdCIsInRhc2siLCJjb250ZXh0IiwiYWlFcnJvciIsImJ1aWxkIiwicmVtb3ZlIiwidGVzdCIsInRyYW5zbGF0aW9ucyIsInZhcmlhYmxlcyIsInBhcnNlQ29uZmlnIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJwYXJzZSIsInRyYW5zbGF0aW9uRXJyb3IiLCJjb21waWxlQ29uZmlnUGF0aCIsImNoZWNrQ29tcGlsZVR5cGVzY3JpcHRDb25maWciLCJidWlsZFJlc3VsdCIsInN0YXR1cyIsImVudHJ5UG9pbnRzIiwid2VicGFjayIsImNvcHlFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsU0FBUyxRQUFPLFlBQVk7QUFDcEMsU0FBUUMsS0FBSyxRQUFPLFFBQVE7QUFDNUIsU0FBUUMsVUFBVSxFQUFFQyxZQUFZLFFBQU8sS0FBSztBQUM1QyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxPQUFPLEVBQUVDLFdBQVdDLFdBQVcsUUFBTyxPQUFPO0FBRXJELFNBQVFDLFNBQVMsRUFBRUMsdUJBQXVCLFFBQU8scUJBQXFCO0FBQ3RFLFNBQVFDLGtCQUFrQixFQUFFQyxtQkFBbUIsRUFBRUMsYUFBYSxFQUFxQkMscUJBQXFCLEVBQUVDLFdBQVcsUUFBTyxxQkFBcUI7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