css-to-tailwind-react 0.3.4 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -6,8 +39,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
39
  const commander_1 = require("commander");
7
40
  const scanner_1 = require("./scanner");
8
41
  const transformer_1 = require("./transformer");
42
+ const fileWriter_1 = require("./fileWriter");
9
43
  const logger_1 = require("./utils/logger");
10
44
  const config_1 = require("./utils/config");
45
+ const reporter_1 = require("./utils/reporter");
11
46
  const path_1 = __importDefault(require("path"));
12
47
  const program = new commander_1.Command();
13
48
  program
@@ -15,7 +50,10 @@ program
15
50
  .description('Convert traditional CSS into Tailwind CSS utility classes for React')
16
51
  .version('1.0.0')
17
52
  .argument('<directory>', 'Target directory to scan and transform')
18
- .option('--dry-run', 'Show changes without modifying files')
53
+ .option('--dry-run, --preview', 'Show changes without modifying files')
54
+ .option('--diff', 'Print unified diff for each modified file')
55
+ .option('--silent', 'Suppress per-file logs, show only summary')
56
+ .option('--json-report', 'Output structured JSON summary')
19
57
  .option('--verbose', 'Show detailed output')
20
58
  .option('--delete-css', 'Delete CSS files when all rules are converted')
21
59
  .option('--skip-external', 'Skip external CSS files (imports)')
@@ -23,18 +61,23 @@ program
23
61
  .option('--skip-internal', 'Skip internal <style> blocks')
24
62
  .action(async (directory, options) => {
25
63
  const startTime = Date.now();
64
+ const isDryRun = options.dryRun || options.preview || false;
65
+ const showDiff = options.diff || false;
66
+ const isSilent = options.silent || options.jsonReport || false;
67
+ const isJsonReport = options.jsonReport || false;
26
68
  try {
27
- // Set verbose mode for logger
28
69
  logger_1.logger.setVerbose(options.verbose || false);
70
+ logger_1.logger.setSilent(isSilent);
29
71
  logger_1.logger.info('🚀 CSS to Tailwind React Converter');
30
72
  logger_1.logger.info(`📁 Target directory: ${path_1.default.resolve(directory)}`);
31
- if (options.dryRun) {
73
+ if (isDryRun) {
32
74
  logger_1.logger.info('🔍 Dry run mode - no files will be modified');
33
75
  }
34
- // Load Tailwind config
76
+ if (showDiff) {
77
+ logger_1.logger.info('📋 Diff mode enabled - showing changes');
78
+ }
35
79
  logger_1.logger.info('⚙️ Loading Tailwind configuration...');
36
80
  const tailwindConfig = await (0, config_1.loadTailwindConfig)(directory);
37
- // Scan project files
38
81
  logger_1.logger.info('🔎 Scanning project files...');
39
82
  const files = await (0, scanner_1.scanProject)(directory);
40
83
  logger_1.logger.success(`Found ${files.length} files to process`);
@@ -42,9 +85,8 @@ program
42
85
  logger_1.logger.warn('No supported files found in the target directory');
43
86
  process.exit(0);
44
87
  }
45
- // Transform files
46
- const results = await (0, transformer_1.transformFiles)(files, {
47
- dryRun: options.dryRun || false,
88
+ const { fileResults, stats } = await (0, transformer_1.transformFilesDetailed)(files, {
89
+ dryRun: isDryRun,
48
90
  deleteCss: options.deleteCss || false,
49
91
  skipExternal: options.skipExternal || false,
50
92
  skipInline: options.skipInline || false,
@@ -52,22 +94,63 @@ program
52
94
  tailwindConfig,
53
95
  projectRoot: path_1.default.resolve(directory)
54
96
  });
55
- // Print summary
97
+ const reporter = new reporter_1.Reporter({
98
+ showDiff,
99
+ silent: isSilent,
100
+ verbose: options.verbose || false,
101
+ dryRun: isDryRun,
102
+ projectRoot: path_1.default.resolve(directory)
103
+ });
104
+ for (const result of fileResults) {
105
+ reporter.addFileResult(result);
106
+ }
107
+ reporter.addWarning(stats.warnings);
108
+ if (!isDryRun) {
109
+ logger_1.logger.info('\n💾 Writing changes...');
110
+ const writtenCount = await (0, fileWriter_1.writeFiles)(fileResults, {
111
+ dryRun: false,
112
+ projectRoot: path_1.default.resolve(directory)
113
+ });
114
+ if (options.deleteCss) {
115
+ for (const result of fileResults) {
116
+ if (result.hasChanges && result.filePath.endsWith('.css')) {
117
+ const cssContent = result.newContent.trim();
118
+ if (cssContent === '' || cssContent === '/* All CSS converted to Tailwind */') {
119
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
120
+ const backupDir = path_1.default.join(path_1.default.resolve(directory), '.css-to-tailwind-backups');
121
+ const relativePath = path_1.default.relative(path_1.default.resolve(directory), result.filePath);
122
+ const backupPath = path_1.default.join(backupDir, relativePath);
123
+ if (!fs.existsSync(backupDir)) {
124
+ fs.mkdirSync(backupDir, { recursive: true });
125
+ }
126
+ const backupDirPath = path_1.default.dirname(backupPath);
127
+ if (!fs.existsSync(backupDirPath)) {
128
+ fs.mkdirSync(backupDirPath, { recursive: true });
129
+ }
130
+ fs.writeFileSync(backupPath, result.originalContent, 'utf-8');
131
+ fs.unlinkSync(result.filePath);
132
+ logger_1.logger.info(`🗑️ Deleted ${path_1.default.basename(result.filePath)} (all rules converted)`);
133
+ }
134
+ }
135
+ }
136
+ }
137
+ logger_1.logger.success(`Wrote ${writtenCount} files`);
138
+ }
56
139
  const duration = ((Date.now() - startTime) / 1000).toFixed(2);
57
- console.log('\n' + '='.repeat(50));
58
- logger_1.logger.success('✨ Transformation Complete!');
59
- console.log('='.repeat(50));
60
- console.log(`📊 Summary:`);
61
- console.log(` Files scanned: ${results.filesScanned}`);
62
- console.log(` Files modified: ${results.filesModified}`);
63
- console.log(` Styles converted: ${results.stylesConverted}`);
64
- console.log(` Classes replaced: ${results.classesReplaced}`);
65
- console.log(` Warnings: ${results.warnings}`);
66
- console.log(` Duration: ${duration}s`);
67
- console.log('='.repeat(50));
68
- if (results.warnings > 0) {
69
- logger_1.logger.warn('Some styles could not be converted. Run with --verbose for details.');
70
- process.exit(0);
140
+ if (isJsonReport) {
141
+ const jsonOutput = reporter.toJSON();
142
+ const output = {
143
+ ...jsonOutput,
144
+ duration: `${duration}s`
145
+ };
146
+ console.log(JSON.stringify(output, null, 2));
147
+ }
148
+ else {
149
+ reporter.print();
150
+ console.log(`\n⏱️ Duration: ${duration}s`);
151
+ }
152
+ if (stats.errors > 0) {
153
+ process.exit(1);
71
154
  }
72
155
  process.exit(0);
73
156
  }
@@ -77,4 +160,4 @@ program
77
160
  }
78
161
  });
79
162
  program.parse();
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlDQUFvQztBQUNwQyx1Q0FBd0M7QUFDeEMsK0NBQStDO0FBQy9DLDJDQUF3QztBQUN4QywyQ0FBb0Q7QUFDcEQsZ0RBQXdCO0FBV3hCLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsdUJBQXVCLENBQUM7S0FDN0IsV0FBVyxDQUFDLHFFQUFxRSxDQUFDO0tBQ2xGLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDaEIsUUFBUSxDQUFDLGFBQWEsRUFBRSx3Q0FBd0MsQ0FBQztLQUNqRSxNQUFNLENBQUMsV0FBVyxFQUFFLHNDQUFzQyxDQUFDO0tBQzNELE1BQU0sQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUM7S0FDM0MsTUFBTSxDQUFDLGNBQWMsRUFBRSwrQ0FBK0MsQ0FBQztLQUN2RSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsbUNBQW1DLENBQUM7S0FDOUQsTUFBTSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQztLQUM3QyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7S0FDekQsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFpQixFQUFFLE9BQW1CLEVBQUUsRUFBRTtJQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFN0IsSUFBSSxDQUFDO1FBQ0gsOEJBQThCO1FBQzlCLGVBQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQztRQUU1QyxlQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDbEQsZUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFL0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsZUFBTSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsZUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBQSwyQkFBa0IsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUUzRCxxQkFBcUI7UUFDckIsZUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSxxQkFBVyxFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNDLGVBQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixlQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7WUFDaEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSw0QkFBYyxFQUFDLEtBQUssRUFBRTtZQUMxQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLO1lBQy9CLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDckMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksS0FBSztZQUMzQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLO1lBQ3ZDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDM0MsY0FBYztZQUNkLFdBQVcsRUFBRSxjQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUNyQyxDQUFDLENBQUM7UUFFSCxnQkFBZ0I7UUFDaEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25DLGVBQU0sQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFNUIsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLGVBQU0sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQztZQUNuRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsZUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgc2NhblByb2plY3QgfSBmcm9tICcuL3NjYW5uZXInO1xuaW1wb3J0IHsgdHJhbnNmb3JtRmlsZXMgfSBmcm9tICcuL3RyYW5zZm9ybWVyJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGxvYWRUYWlsd2luZENvbmZpZyB9IGZyb20gJy4vdXRpbHMvY29uZmlnJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbnRlcmZhY2UgQ0xJT3B0aW9ucyB7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICBkZWxldGVDc3M/OiBib29sZWFuO1xuICBza2lwRXh0ZXJuYWw/OiBib29sZWFuO1xuICBza2lwSW5saW5lPzogYm9vbGVhbjtcbiAgc2tpcEludGVybmFsPzogYm9vbGVhbjtcbn1cblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nzcy10by10YWlsd2luZC1yZWFjdCcpXG4gIC5kZXNjcmlwdGlvbignQ29udmVydCB0cmFkaXRpb25hbCBDU1MgaW50byBUYWlsd2luZCBDU1MgdXRpbGl0eSBjbGFzc2VzIGZvciBSZWFjdCcpXG4gIC52ZXJzaW9uKCcxLjAuMCcpXG4gIC5hcmd1bWVudCgnPGRpcmVjdG9yeT4nLCAnVGFyZ2V0IGRpcmVjdG9yeSB0byBzY2FuIGFuZCB0cmFuc2Zvcm0nKVxuICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyBjaGFuZ2VzIHdpdGhvdXQgbW9kaWZ5aW5nIGZpbGVzJylcbiAgLm9wdGlvbignLS12ZXJib3NlJywgJ1Nob3cgZGV0YWlsZWQgb3V0cHV0JylcbiAgLm9wdGlvbignLS1kZWxldGUtY3NzJywgJ0RlbGV0ZSBDU1MgZmlsZXMgd2hlbiBhbGwgcnVsZXMgYXJlIGNvbnZlcnRlZCcpXG4gIC5vcHRpb24oJy0tc2tpcC1leHRlcm5hbCcsICdTa2lwIGV4dGVybmFsIENTUyBmaWxlcyAoaW1wb3J0cyknKVxuICAub3B0aW9uKCctLXNraXAtaW5saW5lJywgJ1NraXAgaW5saW5lIHN0eWxlcycpXG4gIC5vcHRpb24oJy0tc2tpcC1pbnRlcm5hbCcsICdTa2lwIGludGVybmFsIDxzdHlsZT4gYmxvY2tzJylcbiAgLmFjdGlvbihhc3luYyAoZGlyZWN0b3J5OiBzdHJpbmcsIG9wdGlvbnM6IENMSU9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBTZXQgdmVyYm9zZSBtb2RlIGZvciBsb2dnZXJcbiAgICAgIGxvZ2dlci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSB8fCBmYWxzZSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5qAIENTUyB0byBUYWlsd2luZCBSZWFjdCBDb252ZXJ0ZXInKTtcbiAgICAgIGxvZ2dlci5pbmZvKGDwn5OBIFRhcmdldCBkaXJlY3Rvcnk6ICR7cGF0aC5yZXNvbHZlKGRpcmVjdG9yeSl9YCk7XG4gICAgICBcbiAgICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgICBsb2dnZXIuaW5mbygn8J+UjSBEcnkgcnVuIG1vZGUgLSBubyBmaWxlcyB3aWxsIGJlIG1vZGlmaWVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgVGFpbHdpbmQgY29uZmlnXG4gICAgICBsb2dnZXIuaW5mbygn4pqZ77iPICBMb2FkaW5nIFRhaWx3aW5kIGNvbmZpZ3VyYXRpb24uLi4nKTtcbiAgICAgIGNvbnN0IHRhaWx3aW5kQ29uZmlnID0gYXdhaXQgbG9hZFRhaWx3aW5kQ29uZmlnKGRpcmVjdG9yeSk7XG4gICAgICBcbiAgICAgIC8vIFNjYW4gcHJvamVjdCBmaWxlc1xuICAgICAgbG9nZ2VyLmluZm8oJ/CflI4gU2Nhbm5pbmcgcHJvamVjdCBmaWxlcy4uLicpO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBzY2FuUHJvamVjdChkaXJlY3RvcnkpO1xuICAgICAgXG4gICAgICBsb2dnZXIuc3VjY2VzcyhgRm91bmQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzIHRvIHByb2Nlc3NgKTtcbiAgICAgIFxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dnZXIud2FybignTm8gc3VwcG9ydGVkIGZpbGVzIGZvdW5kIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5Jyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJhbnNmb3JtIGZpbGVzXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdHJhbnNmb3JtRmlsZXMoZmlsZXMsIHtcbiAgICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1biB8fCBmYWxzZSxcbiAgICAgICAgZGVsZXRlQ3NzOiBvcHRpb25zLmRlbGV0ZUNzcyB8fCBmYWxzZSxcbiAgICAgICAgc2tpcEV4dGVybmFsOiBvcHRpb25zLnNraXBFeHRlcm5hbCB8fCBmYWxzZSxcbiAgICAgICAgc2tpcElubGluZTogb3B0aW9ucy5za2lwSW5saW5lIHx8IGZhbHNlLFxuICAgICAgICBza2lwSW50ZXJuYWw6IG9wdGlvbnMuc2tpcEludGVybmFsIHx8IGZhbHNlLFxuICAgICAgICB0YWlsd2luZENvbmZpZyxcbiAgICAgICAgcHJvamVjdFJvb3Q6IHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpXG4gICAgICB9KTtcblxuICAgICAgLy8gUHJpbnQgc3VtbWFyeVxuICAgICAgY29uc3QgZHVyYXRpb24gPSAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ1xcbicgKyAnPScucmVwZWF0KDUwKSk7XG4gICAgICBsb2dnZXIuc3VjY2Vzcygn4pyoIFRyYW5zZm9ybWF0aW9uIENvbXBsZXRlIScpO1xuICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg1MCkpO1xuICAgICAgY29uc29sZS5sb2coYPCfk4ogU3VtbWFyeTpgKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBGaWxlcyBzY2FubmVkOiAgICAgICR7cmVzdWx0cy5maWxlc1NjYW5uZWR9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAgRmlsZXMgbW9kaWZpZWQ6ICAgICAke3Jlc3VsdHMuZmlsZXNNb2RpZmllZH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBTdHlsZXMgY29udmVydGVkOiAgICR7cmVzdWx0cy5zdHlsZXNDb252ZXJ0ZWR9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAgQ2xhc3NlcyByZXBsYWNlZDogICAke3Jlc3VsdHMuY2xhc3Nlc1JlcGxhY2VkfWApO1xuICAgICAgY29uc29sZS5sb2coYCAgIFdhcm5pbmdzOiAgICAgICAgICAgJHtyZXN1bHRzLndhcm5pbmdzfWApO1xuICAgICAgY29uc29sZS5sb2coYCAgIER1cmF0aW9uOiAgICAgICAgICAgJHtkdXJhdGlvbn1zYCk7XG4gICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDUwKSk7XG5cbiAgICAgIGlmIChyZXN1bHRzLndhcm5pbmdzID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignU29tZSBzdHlsZXMgY291bGQgbm90IGJlIGNvbnZlcnRlZC4gUnVuIHdpdGggLS12ZXJib3NlIGZvciBkZXRhaWxzLicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCfinYwgVHJhbnNmb3JtYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFvQztBQUNwQyx1Q0FBd0M7QUFDeEMsK0NBQXVEO0FBQ3ZELDZDQUEwQztBQUMxQywyQ0FBd0M7QUFDeEMsMkNBQW9EO0FBQ3BELCtDQUE0QztBQUM1QyxnREFBd0I7QUFleEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7QUFFOUIsT0FBTztLQUNKLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztLQUM3QixXQUFXLENBQUMscUVBQXFFLENBQUM7S0FDbEYsT0FBTyxDQUFDLE9BQU8sQ0FBQztLQUNoQixRQUFRLENBQUMsYUFBYSxFQUFFLHdDQUF3QyxDQUFDO0tBQ2pFLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxzQ0FBc0MsQ0FBQztLQUN0RSxNQUFNLENBQUMsUUFBUSxFQUFFLDJDQUEyQyxDQUFDO0tBQzdELE1BQU0sQ0FBQyxVQUFVLEVBQUUsMkNBQTJDLENBQUM7S0FDL0QsTUFBTSxDQUFDLGVBQWUsRUFBRSxnQ0FBZ0MsQ0FBQztLQUN6RCxNQUFNLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDO0tBQzNDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsK0NBQStDLENBQUM7S0FDdkUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLG1DQUFtQyxDQUFDO0tBQzlELE1BQU0sQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUM7S0FDN0MsTUFBTSxDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDO0tBQ3pELE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBaUIsRUFBRSxPQUFtQixFQUFFLEVBQUU7SUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FB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QUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsZUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgc2NhblByb2plY3QgfSBmcm9tICcuL3NjYW5uZXInO1xuaW1wb3J0IHsgdHJhbnNmb3JtRmlsZXNEZXRhaWxlZCB9IGZyb20gJy4vdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgd3JpdGVGaWxlcyB9IGZyb20gJy4vZmlsZVdyaXRlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBsb2FkVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBSZXBvcnRlciB9IGZyb20gJy4vdXRpbHMvcmVwb3J0ZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmludGVyZmFjZSBDTElPcHRpb25zIHtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgcHJldmlldz86IGJvb2xlYW47XG4gIGRpZmY/OiBib29sZWFuO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICBqc29uUmVwb3J0PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIGRlbGV0ZUNzcz86IGJvb2xlYW47XG4gIHNraXBFeHRlcm5hbD86IGJvb2xlYW47XG4gIHNraXBJbmxpbmU/OiBib29sZWFuO1xuICBza2lwSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuICAubmFtZSgnY3NzLXRvLXRhaWx3aW5kLXJlYWN0JylcbiAgLmRlc2NyaXB0aW9uKCdDb252ZXJ0IHRyYWRpdGlvbmFsIENTUyBpbnRvIFRhaWx3aW5kIENTUyB1dGlsaXR5IGNsYXNzZXMgZm9yIFJlYWN0JylcbiAgLnZlcnNpb24oJzEuMC4wJylcbiAgLmFyZ3VtZW50KCc8ZGlyZWN0b3J5PicsICdUYXJnZXQgZGlyZWN0b3J5IHRvIHNjYW4gYW5kIHRyYW5zZm9ybScpXG4gIC5vcHRpb24oJy0tZHJ5LXJ1biwgLS1wcmV2aWV3JywgJ1Nob3cgY2hhbmdlcyB3aXRob3V0IG1vZGlmeWluZyBmaWxlcycpXG4gIC5vcHRpb24oJy0tZGlmZicsICdQcmludCB1bmlmaWVkIGRpZmYgZm9yIGVhY2ggbW9kaWZpZWQgZmlsZScpXG4gIC5vcHRpb24oJy0tc2lsZW50JywgJ1N1cHByZXNzIHBlci1maWxlIGxvZ3MsIHNob3cgb25seSBzdW1tYXJ5JylcbiAgLm9wdGlvbignLS1qc29uLXJlcG9ydCcsICdPdXRwdXQgc3RydWN0dXJlZCBKU09OIHN1bW1hcnknKVxuICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBvdXRwdXQnKVxuICAub3B0aW9uKCctLWRlbGV0ZS1jc3MnLCAnRGVsZXRlIENTUyBmaWxlcyB3aGVuIGFsbCBydWxlcyBhcmUgY29udmVydGVkJylcbiAgLm9wdGlvbignLS1za2lwLWV4dGVybmFsJywgJ1NraXAgZXh0ZXJuYWwgQ1NTIGZpbGVzIChpbXBvcnRzKScpXG4gIC5vcHRpb24oJy0tc2tpcC1pbmxpbmUnLCAnU2tpcCBpbmxpbmUgc3R5bGVzJylcbiAgLm9wdGlvbignLS1za2lwLWludGVybmFsJywgJ1NraXAgaW50ZXJuYWwgPHN0eWxlPiBibG9ja3MnKVxuICAuYWN0aW9uKGFzeW5jIChkaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9uczogQ0xJT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgXG4gICAgY29uc3QgaXNEcnlSdW4gPSBvcHRpb25zLmRyeVJ1biB8fCBvcHRpb25zLnByZXZpZXcgfHwgZmFsc2U7XG4gICAgY29uc3Qgc2hvd0RpZmYgPSBvcHRpb25zLmRpZmYgfHwgZmFsc2U7XG4gICAgY29uc3QgaXNTaWxlbnQgPSBvcHRpb25zLnNpbGVudCB8fCBvcHRpb25zLmpzb25SZXBvcnQgfHwgZmFsc2U7XG4gICAgY29uc3QgaXNKc29uUmVwb3J0ID0gb3B0aW9ucy5qc29uUmVwb3J0IHx8IGZhbHNlO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuc2V0VmVyYm9zZShvcHRpb25zLnZlcmJvc2UgfHwgZmFsc2UpO1xuICAgICAgbG9nZ2VyLnNldFNpbGVudChpc1NpbGVudCk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5qAIENTUyB0byBUYWlsd2luZCBSZWFjdCBDb252ZXJ0ZXInKTtcbiAgICAgIGxvZ2dlci5pbmZvKGDwn5OBIFRhcmdldCBkaXJlY3Rvcnk6ICR7cGF0aC5yZXNvbHZlKGRpcmVjdG9yeSl9YCk7XG4gICAgICBcbiAgICAgIGlmIChpc0RyeVJ1bikge1xuICAgICAgICBsb2dnZXIuaW5mbygn8J+UjSBEcnkgcnVuIG1vZGUgLSBubyBmaWxlcyB3aWxsIGJlIG1vZGlmaWVkJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChzaG93RGlmZikge1xuICAgICAgICBsb2dnZXIuaW5mbygn8J+TiyBEaWZmIG1vZGUgZW5hYmxlZCAtIHNob3dpbmcgY2hhbmdlcycpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygn4pqZ77iPICBMb2FkaW5nIFRhaWx3aW5kIGNvbmZpZ3VyYXRpb24uLi4nKTtcbiAgICAgIGNvbnN0IHRhaWx3aW5kQ29uZmlnID0gYXdhaXQgbG9hZFRhaWx3aW5kQ29uZmlnKGRpcmVjdG9yeSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SOIFNjYW5uaW5nIHByb2plY3QgZmlsZXMuLi4nKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgc2NhblByb2plY3QoZGlyZWN0b3J5KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYEZvdW5kICR7ZmlsZXMubGVuZ3RofSBmaWxlcyB0byBwcm9jZXNzYCk7XG4gICAgICBcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ05vIHN1cHBvcnRlZCBmaWxlcyBmb3VuZCBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeScpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZmlsZVJlc3VsdHMsIHN0YXRzIH0gPSBhd2FpdCB0cmFuc2Zvcm1GaWxlc0RldGFpbGVkKGZpbGVzLCB7XG4gICAgICAgIGRyeVJ1bjogaXNEcnlSdW4sXG4gICAgICAgIGRlbGV0ZUNzczogb3B0aW9ucy5kZWxldGVDc3MgfHwgZmFsc2UsXG4gICAgICAgIHNraXBFeHRlcm5hbDogb3B0aW9ucy5za2lwRXh0ZXJuYWwgfHwgZmFsc2UsXG4gICAgICAgIHNraXBJbmxpbmU6IG9wdGlvbnMuc2tpcElubGluZSB8fCBmYWxzZSxcbiAgICAgICAgc2tpcEludGVybmFsOiBvcHRpb25zLnNraXBJbnRlcm5hbCB8fCBmYWxzZSxcbiAgICAgICAgdGFpbHdpbmRDb25maWcsXG4gICAgICAgIHByb2plY3RSb290OiBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyKHtcbiAgICAgICAgc2hvd0RpZmYsXG4gICAgICAgIHNpbGVudDogaXNTaWxlbnQsXG4gICAgICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSB8fCBmYWxzZSxcbiAgICAgICAgZHJ5UnVuOiBpc0RyeVJ1bixcbiAgICAgICAgcHJvamVjdFJvb3Q6IHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpXG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgZmlsZVJlc3VsdHMpIHtcbiAgICAgICAgcmVwb3J0ZXIuYWRkRmlsZVJlc3VsdChyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVwb3J0ZXIuYWRkV2FybmluZyhzdGF0cy53YXJuaW5ncyk7XG5cbiAgICAgIGlmICghaXNEcnlSdW4pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1xcbvCfkr4gV3JpdGluZyBjaGFuZ2VzLi4uJyk7XG4gICAgICAgIGNvbnN0IHdyaXR0ZW5Db3VudCA9IGF3YWl0IHdyaXRlRmlsZXMoZmlsZVJlc3VsdHMsIHtcbiAgICAgICAgICBkcnlSdW46IGZhbHNlLFxuICAgICAgICAgIHByb2plY3RSb290OiBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmRlbGV0ZUNzcykge1xuICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGZpbGVSZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0NoYW5nZXMgJiYgcmVzdWx0LmZpbGVQYXRoLmVuZHNXaXRoKCcuY3NzJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3NzQ29udGVudCA9IHJlc3VsdC5uZXdDb250ZW50LnRyaW0oKTtcbiAgICAgICAgICAgICAgaWYgKGNzc0NvbnRlbnQgPT09ICcnIHx8IGNzc0NvbnRlbnQgPT09ICcvKiBBbGwgQ1NTIGNvbnZlcnRlZCB0byBUYWlsd2luZCAqLycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiYWNrdXBEaXIgPSBwYXRoLmpvaW4ocGF0aC5yZXNvbHZlKGRpcmVjdG9yeSksICcuY3NzLXRvLXRhaWx3aW5kLWJhY2t1cHMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpLCByZXN1bHQuZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBwYXRoLmpvaW4oYmFja3VwRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBEaXIpKSB7XG4gICAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMoYmFja3VwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguZGlybmFtZShiYWNrdXBQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmFja3VwRGlyUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhiYWNrdXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhiYWNrdXBQYXRoLCByZXN1bHQub3JpZ2luYWxDb250ZW50LCAndXRmLTgnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKHJlc3VsdC5maWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYPCfl5HvuI8gIERlbGV0ZWQgJHtwYXRoLmJhc2VuYW1lKHJlc3VsdC5maWxlUGF0aCl9IChhbGwgcnVsZXMgY29udmVydGVkKWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuc3VjY2VzcyhgV3JvdGUgJHt3cml0dGVuQ291bnR9IGZpbGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gKChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDApLnRvRml4ZWQoMik7XG5cbiAgICAgIGlmIChpc0pzb25SZXBvcnQpIHtcbiAgICAgICAgY29uc3QganNvbk91dHB1dCA9IHJlcG9ydGVyLnRvSlNPTigpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgICAgLi4uanNvbk91dHB1dCxcbiAgICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259c2BcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXBvcnRlci5wcmludCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxu4o+x77iPICBEdXJhdGlvbjogJHtkdXJhdGlvbn1zYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0cy5lcnJvcnMgPiAwKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ+KdjCBUcmFuc2Zvcm1hdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
@@ -1,5 +1,6 @@
1
1
  import { TailwindMapper, CSSProperty } from './tailwindMapper';
2
2
  import { Specificity } from './utils/specificityCalculator';
3
+ import { VariableRegistry } from './utils/variableRegistry';
3
4
  export interface UtilityWithVariant {
4
5
  value: string;
5
6
  variants: string[];
@@ -40,7 +41,9 @@ export declare class CSSParser {
40
41
  private breakpoints;
41
42
  private sourceOrderCounter;
42
43
  private variableRegistry;
43
- constructor(mapper: TailwindMapper, screens?: Record<string, string | [string, string]>);
44
+ private sharedRegistry;
45
+ constructor(mapper: TailwindMapper, screens?: Record<string, string | [string, string]>, variableRegistry?: VariableRegistry);
46
+ getVariableRegistry(): VariableRegistry;
44
47
  private resetSourceOrder;
45
48
  private getNextSourceOrder;
46
49
  private collectVariables;
@@ -64,4 +67,6 @@ export declare class CSSParser {
64
67
  warnings: string[];
65
68
  }>;
66
69
  extractImportPaths(code: string): string[];
70
+ collectVariablesOnly(css: string, filePath: string): Promise<void>;
71
+ collectVariablesFromInternalCSS(html: string, filePath: string): Promise<void>;
67
72
  }
package/dist/cssParser.js CHANGED
@@ -14,17 +14,29 @@ const variantAssembler_1 = require("./utils/variantAssembler");
14
14
  const specificityCalculator_1 = require("./utils/specificityCalculator");
15
15
  const variableRegistry_1 = require("./utils/variableRegistry");
16
16
  class CSSParser {
17
- constructor(mapper, screens) {
17
+ constructor(mapper, screens, variableRegistry) {
18
18
  this.sourceOrderCounter = 0;
19
+ this.sharedRegistry = false;
19
20
  this.mapper = mapper;
20
21
  this.breakpoints = screens
21
22
  ? (0, breakpointResolver_1.resolveBreakpointsFromConfig)(screens)
22
23
  : (0, breakpointResolver_1.getBreakpoints)();
23
- this.variableRegistry = new variableRegistry_1.VariableRegistry();
24
+ if (variableRegistry) {
25
+ this.variableRegistry = variableRegistry;
26
+ this.sharedRegistry = true;
27
+ }
28
+ else {
29
+ this.variableRegistry = new variableRegistry_1.VariableRegistry();
30
+ }
31
+ }
32
+ getVariableRegistry() {
33
+ return this.variableRegistry;
24
34
  }
25
35
  resetSourceOrder() {
26
36
  this.sourceOrderCounter = 0;
27
- this.variableRegistry.clear();
37
+ if (!this.sharedRegistry) {
38
+ this.variableRegistry.clear();
39
+ }
28
40
  }
29
41
  getNextSourceOrder() {
30
42
  return ++this.sourceOrderCounter;
@@ -275,7 +287,9 @@ class CSSParser {
275
287
  parser: postcss_safe_parser_1.default,
276
288
  from: filePath
277
289
  }).then(result => result.root);
278
- this.collectVariables(root, []);
290
+ if (!this.sharedRegistry) {
291
+ this.collectVariables(root, []);
292
+ }
279
293
  root.walkAtRules((atRule) => {
280
294
  if (atRule.name !== 'media') {
281
295
  return;
@@ -286,7 +300,9 @@ class CSSParser {
286
300
  return;
287
301
  }
288
302
  const responsiveVariant = mediaResult.breakpoint;
289
- this.collectVariables(atRule, [responsiveVariant]);
303
+ if (!this.sharedRegistry) {
304
+ this.collectVariables(atRule, [responsiveVariant]);
305
+ }
290
306
  const nestedRules = [];
291
307
  atRule.walkRules((rule) => {
292
308
  nestedRules.push(rule);
@@ -510,6 +526,40 @@ class CSSParser {
510
526
  }
511
527
  return imports;
512
528
  }
529
+ async collectVariablesOnly(css, filePath) {
530
+ try {
531
+ const root = await (0, postcss_1.default)().process(css, {
532
+ parser: postcss_safe_parser_1.default,
533
+ from: filePath
534
+ }).then(result => result.root);
535
+ this.collectVariables(root, []);
536
+ root.walkAtRules((atRule) => {
537
+ if (atRule.name !== 'media') {
538
+ return;
539
+ }
540
+ const mediaResult = (0, breakpointResolver_1.processMediaQuery)(atRule.params, this.breakpoints);
541
+ if (mediaResult.skipped) {
542
+ return;
543
+ }
544
+ const responsiveVariant = mediaResult.breakpoint;
545
+ this.collectVariables(atRule, [responsiveVariant]);
546
+ });
547
+ }
548
+ catch (error) {
549
+ logger_1.logger.warn(`Failed to collect variables from ${filePath}: ${error}`);
550
+ }
551
+ }
552
+ async collectVariablesFromInternalCSS(html, filePath) {
553
+ const { styles } = this.parseInternalStyle(html);
554
+ for (const style of styles) {
555
+ try {
556
+ await this.collectVariablesOnly(style.content, filePath);
557
+ }
558
+ catch (error) {
559
+ logger_1.logger.warn(`Failed to collect variables from internal CSS in ${filePath}: ${error}`);
560
+ }
561
+ }
562
+ }
513
563
  }
514
564
  exports.CSSParser = CSSParser;
515
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFLb0M7QUFDcEMsMkVBSXdDO0FBQ3hDLG1GQU00QztBQUM1QywrREFNa0M7QUFDbEMseUVBS3VDO0FBRXZDLCtEQVNrQztBQTBDbEMsTUFBYSxTQUFTO0lBTXBCLFlBQVksTUFBc0IsRUFBRSxPQUFtRDtRQUgvRSx1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFJckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPO1lBQ3hCLENBQUMsQ0FBQyxJQUFBLGlEQUE0QixFQUFDLE9BQU8sQ0FBQztZQUN2QyxDQUFDLENBQUMsSUFBQSxtQ0FBYyxHQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksbUNBQWdCLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNuQyxDQUFDO0lBRU8sZ0JBQWdCLENBQ3RCLElBQW1CLEVBQ25CLHFCQUErQixFQUFFO1FBRWpDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUVwQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMvQixNQUFNLGNBQWMsR0FBRyxRQUFRLEtBQUssT0FBTyxDQUFDO1lBRTVDLElBQUksS0FBb0IsQ0FBQztZ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LENBQUM7UUFDekIsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQWhwQkQsOEJBZ3BCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwb3N0Y3NzLCB7IFJvb3QsIFJ1bGUsIERlY2xhcmF0aW9uLCBBdFJ1bGUgfSBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBzYWZlUGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2FmZS1wYXJzZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRNYXBwZXIsIENTU1Byb3BlcnR5IH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBcbiAgQnJlYWtwb2ludCwgXG4gIGdldEJyZWFrcG9pbnRzLCBcbiAgcmVzb2x2ZUJyZWFrcG9pbnRzRnJvbUNvbmZpZyxcbiAgcHJvY2Vzc01lZGlhUXVlcnkgXG59IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmltcG9ydCB7XG4gIHByb2Nlc3NQc2V1ZG9TZWxlY3RvcixcbiAgcGFyc2VNdWx0aXBsZVNlbGVjdG9ycyxcbiAgUGFyc2VkU2VsZWN0b3Jcbn0gZnJvbSAnLi91dGlscy9wc2V1ZG9TZWxlY3RvclJlc29sdmVyJztcbmltcG9ydCB7XG4gIHBhcnNlRGVzY2VuZGFudFNlbGVjdG9yLFxuICBwcm9jZXNzRGVzY2VuZGFudFNlbGVjdG9yLFxuICBEZXNjZW5kYW50U2VsZWN0b3IsXG4gIFNlbGVjdG9yUGFydCxcbiAgaXNIdG1sRWxlbWVudFxufSBmcm9tICcuL3V0aWxzL2Rlc2NlbmRhbnRTZWxlY3RvclJlc29sdmVyJztcbmltcG9ydCB7XG4gIGFzc2VtYmxlVXRpbGl0eSxcbiAgYXNzZW1ibGVVdGlsaXRpZXMsXG4gIE1lcmdlZFV0aWxpdHksXG4gIG1lcmdlVXRpbGl0aWVzLFxuICBub3JtYWxpemVWYXJpYW50T3JkZXJcbn0gZnJvbSAnLi91dGlscy92YXJpYW50QXNzZW1ibGVyJztcbmltcG9ydCB7XG4gIFNwZWNpZmljaXR5LFxuICBjYWxjdWxhdGVTZWxlY3RvclNwZWNpZmljaXR5LFxuICBjYWxjdWxhdGVEZXNjZW5kYW50U3BlY2lmaWNpdHksXG4gIFpFUk9fU1BFQ0lGSUNJVFlcbn0gZnJvbSAnLi91dGlscy9zcGVjaWZpY2l0eUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgZ2V0UHJvcGVydHlGb3JVdGlsaXR5IH0gZnJvbSAnLi91dGlscy9wcm9wZXJ0eU1hcHBlcic7XG5pbXBvcnQge1xuICBWYXJpYWJsZVJlZ2lzdHJ5LFxuICBWYXJpYWJsZURlZmluaXRpb24sXG4gIFZhcmlhYmxlU2NvcGUsXG4gIFJlc29sdXRpb25Db250ZXh0LFxuICBpc0Nzc1ZhcmlhYmxlLFxuICBpc1ZhckV4cHJlc3Npb24sXG4gIGNyZWF0ZUdsb2JhbFNjb3BlLFxuICBjcmVhdGVTZWxlY3RvclNjb3BlXG59IGZyb20gJy4vdXRpbHMvdmFyaWFibGVSZWdpc3RyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXRpbGl0eVdpdGhWYXJpYW50IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgdmFyaWFudHM6IHN0cmluZ1tdO1xuICBjc3NQcm9wZXJ0eTogc3RyaW5nO1xuICBzcGVjaWZpY2l0eTogU3BlY2lmaWNpdHk7XG4gIHNvdXJjZU9yZGVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0b3JUYXJnZXQge1xuICB0eXBlOiAnY2xhc3MnIHwgJ2VsZW1lbnQnO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUnVsZSB7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W107XG4gIGNvbnZlcnRlZENsYXNzZXM6IHN0cmluZ1tdO1xuICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdO1xuICBza2lwcGVkOiBib29sZWFuO1xuICBmdWxseUNvbnZlcnRlZDogYm9vbGVhbjtcbiAgcGFydGlhbENvbnZlcnNpb246IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbiAgaXNEZXNjZW5kYW50OiBib29sZWFuO1xuICBwYXJlbnRTZWxlY3Rvcj86IFNlbGVjdG9yVGFyZ2V0O1xuICB0YXJnZXRTZWxlY3Rvcj86IFNlbGVjdG9yVGFyZ2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1BhcnNlUmVzdWx0IHtcbiAgY3NzOiBzdHJpbmc7XG4gIHJ1bGVzOiBDU1NSdWxlW107XG4gIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gIGNhbkRlbGV0ZTogYm9vbGVhbjtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1VzYWdlTWFwIHtcbiAgW2NsYXNzTmFtZTogc3RyaW5nXTogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBDU1NQYXJzZXIge1xuICBwcml2YXRlIG1hcHBlcjogVGFpbHdpbmRNYXBwZXI7XG4gIHByaXZhdGUgYnJlYWtwb2ludHM6IEJyZWFrcG9pbnRbXTtcbiAgcHJpdmF0ZSBzb3VyY2VPcmRlckNvdW50ZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgdmFyaWFibGVSZWdpc3RyeTogVmFyaWFibGVSZWdpc3RyeTtcblxuICBjb25zdHJ1Y3RvcihtYXBwZXI6IFRhaWx3aW5kTWFwcGVyLCBzY3JlZW5zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgW3N0cmluZywgc3RyaW5nXT4pIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgICB0aGlzLmJyZWFrcG9pbnRzID0gc2NyZWVucyBcbiAgICAgID8gcmVzb2x2ZUJyZWFrcG9pbnRzRnJvbUNvbmZpZyhzY3JlZW5zKSBcbiAgICAgIDogZ2V0QnJlYWtwb2ludHMoKTtcbiAgICB0aGlzLnZhcmlhYmxlUmVnaXN0cnkgPSBuZXcgVmFyaWFibGVSZWdpc3RyeSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNvdXJjZU9yZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc291cmNlT3JkZXJDb3VudGVyID0gMDtcbiAgICB0aGlzLnZhcmlhYmxlUmVnaXN0cnkuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmV4dFNvdXJjZU9yZGVyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICsrdGhpcy5zb3VyY2VPcmRlckNvdW50ZXI7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RWYXJpYWJsZXMoXG4gICAgbm9kZTogUm9vdCB8IEF0UnVsZSxcbiAgICBhZGRpdGlvbmFsVmFyaWFudHM6IHN0cmluZ1tdID0gW11cbiAgKTogdm9pZCB7XG4gICAgbGV0IHNvdXJjZU9yZGVyID0gMDtcbiAgICBcbiAgICBub2RlLndhbGtSdWxlcygocnVsZSkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgICAgY29uc3QgaXNSb290U2VsZWN0b3IgPSBzZWxlY3RvciA9PT0gJzpyb290JztcbiAgICAgIFxuICAgICAgbGV0IHNjb3BlOiBWYXJpYWJsZVNjb3BlO1xuICAgICAgbGV0IHNwZWNpZmljaXR5OiBTcGVjaWZpY2l0eTtcbiAgICAgIFxuICAgICAgaWYgKGlzUm9vdFNlbGVjdG9yKSB7XG4gICAgICAgIHNjb3BlID0gY3JlYXRlR2xvYmFsU2NvcGUoKTtcbiAgICAgICAgc3BlY2lmaWNpdHkgPSB7IGlubGluZTogMCwgaWQ6IDAsIGNsYXNzOiAwLCBlbGVtZW50OiAwIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURlc2NlbmRhbnRTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmIChwYXJzZWQuaXNDb21wbGV4KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFyc2VkLnBhcmVudCkge1xuICAgICAgICAgIHNjb3BlID0gY3JlYXRlU2VsZWN0b3JTY29wZShzZWxlY3RvciwgcGFyc2VkLnBhcmVudC50eXBlKTtcbiAgICAgICAgICBzcGVjaWZpY2l0eSA9IGNhbGN1bGF0ZURlc2NlbmRhbnRTcGVjaWZpY2l0eShcbiAgICAgICAgICAgIHBhcnNlZC5wYXJlbnQudHlwZSxcbiAgICAgICAgICAgIHBhcnNlZC5wYXJlbnQubmFtZSxcbiAgICAgICAgICAgIHBhcnNlZC50YXJnZXQudHlwZSxcbiAgICAgICAgICAgIHBhcnNlZC50YXJnZXQubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3JUeXBlID0gc2VsZWN0b3Iuc3RhcnRzV2l0aCgnLicpID8gJ2NsYXNzJyA6ICdlbGVtZW50JztcbiAgICAgICAgICBzY29wZSA9IGNyZWF0ZVNlbGVjdG9yU2NvcGUoc2VsZWN0b3IsIHNlbGVjdG9yVHlwZSk7XG4gICAgICAgICAgc3BlY2lmaWNpdHkgPSBjYWxjdWxhdGVTZWxlY3RvclNwZWNpZmljaXR5KHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICBpZiAoIWlzQ3NzVmFyaWFibGUoZGVjbC5wcm9wKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdmFyRGVmOiBWYXJpYWJsZURlZmluaXRpb24gPSB7XG4gICAgICAgICAgbmFtZTogZGVjbC5wcm9wLFxuICAgICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlLFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHNwZWNpZmljaXR5LFxuICAgICAgICAgIHNvdXJjZU9yZGVyOiArK3NvdXJjZU9yZGVyLFxuICAgICAgICAgIHZhcmlhbnRzOiBhZGRpdGlvbmFsVmFyaWFudHNcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudmFyaWFibGVSZWdpc3RyeS5yZWdpc3Rlcih2YXJEZWYpO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVnaXN0ZXJlZCBDU1MgdmFyaWFibGU6ICR7ZGVjbC5wcm9wfSA9ICR7ZGVjbC52YWx1ZX0gKHNjb3BlOiAke3Njb3BlLnR5cGV9KWApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVEZWNsYXJhdGlvblZhbHVlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgc2VsZWN0b3I6IHN0cmluZyxcbiAgICBzcGVjaWZpY2l0eTogU3BlY2lmaWNpdHksXG4gICAgdmFyaWFudHM6IHN0cmluZ1tdXG4gICk6IHsgcmVzb2x2ZWRWYWx1ZTogc3RyaW5nOyBoYXNVbnJlc29sdmVkOiBib29sZWFuIH0ge1xuICAgIGlmICghaXNWYXJFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgcmVzb2x2ZWRWYWx1ZTogdmFsdWUsIGhhc1VucmVzb2x2ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvbnRleHQ6IFJlc29sdXRpb25Db250ZXh0ID0ge1xuICAgICAgc2VsZWN0b3IsXG4gICAgICBzcGVjaWZpY2l0eSxcbiAgICAgIHZhcmlhbnRzXG4gICAgfTtcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhcmlhYmxlUmVnaXN0cnkucmVzb2x2ZVZhbHVlKHZhbHVlLCBjb250ZXh0KTtcbiAgICByZXR1cm4geyByZXNvbHZlZFZhbHVlOiByZXN1bHQudmFsdWUsIGhhc1VucmVzb2x2ZWQ6IHJlc3VsdC5oYXNVbnJlc29sdmVkIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREZWNsYXJhdGlvbnMoXG4gICAgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdLFxuICAgIHNwZWNpZmljaXR5OiBTcGVjaWZpY2l0eSxcbiAgICBzb3VyY2VPcmRlcjogbnVtYmVyLFxuICAgIHNlbGVjdG9yOiBzdHJpbmcgPSAnJyxcbiAgICB2YXJpYW50czogc3RyaW5nW10gPSBbXVxuICApOiB7XG4gICAgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXTtcbiAgICBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsOyByZXNvbHZlZFZhbHVlPzogc3RyaW5nIH0+O1xuICAgIGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7XG4gICAgICBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7XG4gICAgICBjb252ZXJ0ZWQ6IGJvb2xlYW47XG4gICAgICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgICByZXNvbHZlZFZhbHVlPzogc3RyaW5nO1xuICAgIH0+ID0gW107XG4gICAgY29uc3QgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZGVjbGFyYXRpb25zLmZvckVhY2goZGVjbCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZVRvQ29udmVydCA9IHRoaXMucmVzb2x2ZURlY2xhcmF0aW9uVmFsdWUoXG4gICAgICAgIGRlY2wudmFsdWUsXG4gICAgICAgIHNlbGVjdG9yLFxuICAgICAgICBzcGVjaWZpY2l0eSxcbiAgICAgICAgdmFyaWFudHNcbiAgICAgICk7XG4gICAgICBcbiAgICAgIGxldCBjb252ZXJ0ZWRJblRoaXNCbG9jayA9IGZhbHNlO1xuICAgICAgXG4gICAgICBpZiAodmFsdWVUb0NvbnZlcnQuaGFzVW5yZXNvbHZlZCkge1xuICAgICAgICBjb25zdCBtdWx0aVJlc3VsdCA9IHRoaXMubWFwcGVyLmNvbnZlcnRQcm9wZXJ0eVdpdGhNdWx0aXBsZShkZWNsLnByb3BlcnR5LCB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlIHx8IGRlY2wudmFsdWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKG11bHRpUmVzdWx0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG11bHRpUmVzdWx0LmNsYXNzZXMuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb252ZXJzaW9uUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb246IGRlY2wsXG4gICAgICAgICAgICAgIGNvbnZlcnRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICByZXNvbHZlZFZhbHVlOiB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlIHx8IGRlY2wudmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIG11bHRpUmVzdWx0Lndhcm5pbmdzLmZvckVhY2godyA9PiBjb252ZXJzaW9uV2FybmluZ3MucHVzaCh3KSk7XG4gICAgICAgICAgY29udmVydGVkSW5UaGlzQmxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWNvbnZlcnRlZEluVGhpc0Jsb2NrKSB7XG4gICAgICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbjogZGVjbCxcbiAgICAgICAgICAgIGNvbnZlcnRlZDogZmFsc2UsXG4gICAgICAgICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICAgICAgICByZXNvbHZlZFZhbHVlOiB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udmVyc2lvbldhcm5pbmdzLnB1c2goYENvdWxkIG5vdCBmdWxseSByZXNvbHZlIHZhcigpIGluOiAke2RlY2wucHJvcGVydHl9OiAke2RlY2wudmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBtdWx0aVJlc3VsdCA9IHRoaXMubWFwcGVyLmNvbnZlcnRQcm9wZXJ0eVdpdGhNdWx0aXBsZShkZWNsLnByb3BlcnR5LCB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlKTtcbiAgICAgIFxuICAgICAgaWYgKG11bHRpUmVzdWx0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBtdWx0aVJlc3VsdC5jbGFzc2VzLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnZlcnNpb25SZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgZGVjbGFyYXRpb246IGRlY2wsXG4gICAgICAgICAgICBjb252ZXJ0ZWQ6IHRydWUsXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICByZXNvbHZlZFZhbHVlOiB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBtdWx0aVJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHcgPT4gY29udmVyc2lvbldhcm5pbmdzLnB1c2godykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tYXBwZXIuY29udmVydFByb3BlcnR5KGRlY2wucHJvcGVydHksIHZhbHVlVG9Db252ZXJ0LnJlc29sdmVkVmFsdWUpO1xuICAgICAgICBjb252ZXJzaW9uUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICBkZWNsYXJhdGlvbjogZGVjbCxcbiAgICAgICAgICBjb252ZXJ0ZWQ6ICFyZXN1bHQuc2tpcHBlZCAmJiByZXN1bHQuY2xhc3NOYW1lICE9PSBudWxsLFxuICAgICAgICAgIGNsYXNzTmFtZTogcmVzdWx0LmNsYXNzTmFtZSxcbiAgICAgICAgICByZXNvbHZlZFZhbHVlOiB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnNraXBwZWQgJiYgcmVzdWx0LnJlYXNvbikge1xuICAgICAgICAgIGNvbnZlcnNpb25XYXJuaW5ncy5wdXNoKHJlc3VsdC5yZWFzb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdID0gY29udmVyc2lvblJlc3VsdHNcbiAgICAgIC5maWx0ZXIociA9PiByLmNvbnZlcnRlZCAmJiByLmNsYXNzTmFtZSlcbiAgICAgIC5tYXAociA9PiAoe1xuICAgICAgICB2YWx1ZTogci5jbGFzc05hbWUhLFxuICAgICAgICB2YXJpYW50czogW10sXG4gICAgICAgIGNzc1Byb3BlcnR5OiByLmRlY2xhcmF0aW9uLnByb3BlcnR5LFxuICAgICAgICBzcGVjaWZpY2l0eSxcbiAgICAgICAgc291cmNlT3JkZXJcbiAgICAgIH0pKTtcblxuICAgIHJldHVybiB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU2ltcGxlUnVsZShcbiAgICBydWxlOiBSdWxlLFxuICAgIGFkZGl0aW9uYWxWYXJpYW50czogc3RyaW5nW10gPSBbXVxuICApOiB7IGNzc1J1bGVzOiBDU1NSdWxlW107IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7IHJlc29sdmVkVmFsdWU/OiBzdHJpbmcgfT5bXTsgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgIGNvbnN0IHBhcnNlZFNlbGVjdG9ycyA9IHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMoc2VsZWN0b3IpO1xuICAgIFxuICAgIGNvbnN0IHZhbGlkU2VsZWN0b3JzID0gcGFyc2VkU2VsZWN0b3JzLmZpbHRlcihzID0+ICFzLmlzQ29tcGxleCAmJiBzLmJhc2VDbGFzcyk7XG4gICAgXG4gICAgaWYgKHZhbGlkU2VsZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdID0gW107XG5cbiAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgaWYgKGRlY2wucHJvcC5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5OiBkZWNsLnByb3AsXG4gICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjc3NSdWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3QgYWxsQ29udmVyc2lvblJlc3VsdHM6IEFycmF5PHsgZGVjbGFyYXRpb246IENTU1Byb3BlcnR5OyBjb252ZXJ0ZWQ6IGJvb2xlYW47IGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDsgcmVzb2x2ZWRWYWx1ZT86IHN0cmluZyB9PltdID0gW107XG4gICAgY29uc3QgYWxsQ29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwYXJzZWQgb2YgdmFsaWRTZWxlY3RvcnMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gdGhpcy5nZXROZXh0U291cmNlT3JkZXIoKTtcbiAgICAgIGNvbnN0IHNwZWNpZmljaXR5ID0gY2FsY3VsYXRlU2VsZWN0b3JTcGVjaWZpY2l0eShzZWxlY3Rvcik7XG4gICAgICBjb25zdCBwc2V1ZG9Db3VudCA9IChwYXJzZWQucHNldWRvcyB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgc3BlY2lmaWNpdHlXaXRoUHNldWRvID0ge1xuICAgICAgICBpbmxpbmU6IHNwZWNpZmljaXR5LmlubGluZSxcbiAgICAgICAgaWQ6IHNwZWNpZmljaXR5LmlkLFxuICAgICAgICBjbGFzczogc3BlY2lmaWNpdHkuY2xhc3MgKyBwc2V1ZG9Db3VudCxcbiAgICAgICAgZWxlbWVudDogc3BlY2lmaWNpdHkuZWxlbWVudFxuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgcHNldWRvVmFyaWFudHMgPSBwYXJzZWQucHNldWRvcyB8fCBbXTtcbiAgICAgIGNvbnN0IGFsbFZhcmlhbnRzID0gbm9ybWFsaXplVmFyaWFudE9yZGVyKFsuLi5wc2V1ZG9WYXJpYW50cywgLi4uYWRkaXRpb25hbFZhcmlhbnRzXSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHsgdXRpbGl0aWVzLCBjb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzIH0gPSB0aGlzLmNvbnZlcnREZWNsYXJhdGlvbnMoXG4gICAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgc3BlY2lmaWNpdHlXaXRoUHNldWRvLFxuICAgICAgICBzb3VyY2VPcmRlcixcbiAgICAgICAgc2VsZWN0b3IsXG4gICAgICAgIGFsbFZhcmlhbnRzXG4gICAgICApO1xuICAgICAgXG4gICAgICBjb25zdCB1dGlsaXRpZXNGb3JTZWxlY3RvciA9IHV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgICAuLi51LFxuICAgICAgICB2YXJpYW50czogYWxsVmFyaWFudHNcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgY29udmVydGVkQ2xhc3NlcyA9IGFzc2VtYmxlVXRpbGl0aWVzKHV0aWxpdGllc0ZvclNlbGVjdG9yKTtcblxuICAgICAgY29uc3QgYWxsRGVjbGFyYXRpb25zQ29udmVydGVkID0gY29udmVyc2lvblJlc3VsdHMuZXZlcnkociA9PiByLmNvbnZlcnRlZCk7XG4gICAgICBjb25zdCBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkID0gY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwO1xuXG4gICAgICBjb25zdCBjc3NSdWxlOiBDU1NSdWxlID0ge1xuICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgIGNsYXNzTmFtZTogcGFyc2VkLmJhc2VDbGFzcyxcbiAgICAgICAgZGVjbGFyYXRpb25zLFxuICAgICAgICBjb252ZXJ0ZWRDbGFzc2VzLFxuICAgICAgICB1dGlsaXRpZXM6IHV0aWxpdGllc0ZvclNlbGVjdG9yLFxuICAgICAgICBza2lwcGVkOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgICAgZnVsbHlDb252ZXJ0ZWQ6IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgICAgcGFydGlhbENvbnZlcnNpb246IHNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgJiYgIWFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgICAgcmVhc29uOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA/ICdObyBjb252ZXJ0aWJsZSBkZWNsYXJhdGlvbnMnIDogdW5kZWZpbmVkLFxuICAgICAgICBpc0Rlc2NlbmRhbnQ6IGZhbHNlXG4gICAgICB9O1xuXG4gICAgICBjc3NSdWxlcy5wdXNoKGNzc1J1bGUpO1xuICAgICAgYWxsQ29udmVyc2lvblJlc3VsdHMucHVzaChjb252ZXJzaW9uUmVzdWx0cyk7XG4gICAgICBhbGxDb252ZXJzaW9uV2FybmluZ3MucHVzaCguLi5jb252ZXJzaW9uV2FybmluZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNzc1J1bGVzLCBjb252ZXJzaW9uUmVzdWx0czogYWxsQ29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5nczogYWxsQ29udmVyc2lvbldhcm5pbmdzIH07XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NEZXNjZW5kYW50UnVsZShcbiAgICBydWxlOiBSdWxlLFxuICAgIGFkZGl0aW9uYWxWYXJpYW50czogc3RyaW5nW10gPSBbXVxuICApOiB7IGNzc1J1bGU6IENTU1J1bGU7IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7IHJlc29sdmVkVmFsdWU/OiBzdHJpbmcgfT47IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gfSB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gcnVsZS5zZWxlY3RvcjtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURlc2NlbmRhbnRTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgXG4gICAgaWYgKHBhcnNlZC5pc0NvbXBsZXggfHwgIXBhcnNlZC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSA9IFtdO1xuXG4gICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgIGlmIChkZWNsLnByb3Auc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNsLnZhbHVlLmluY2x1ZGVzKCdjYWxjKCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICBwcm9wZXJ0eTogZGVjbC5wcm9wLFxuICAgICAgICB2YWx1ZTogZGVjbC52YWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlT3JkZXIgPSB0aGlzLmdldE5leHRTb3VyY2VPcmRlcigpO1xuICAgIGNvbnN0IHNwZWNpZmljaXR5ID0gY2FsY3VsYXRlRGVzY2VuZGFudFNwZWNpZmljaXR5KFxuICAgICAgcGFyc2VkLnBhcmVudC50eXBlLFxuICAgICAgcGFyc2VkLnBhcmVudC5uYW1lLFxuICAgICAgcGFyc2VkLnRhcmdldC50eXBlLFxuICAgICAgcGFyc2VkLnRhcmdldC5uYW1lXG4gICAgKTtcblxuICAgIGNvbnN0IHsgdXRpbGl0aWVzLCBjb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzIH0gPSB0aGlzLmNvbnZlcnREZWNsYXJhdGlvbnMoXG4gICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICBzcGVjaWZpY2l0eSxcbiAgICAgIHNvdXJjZU9yZGVyLFxuICAgICAgc2VsZWN0b3IsXG4gICAgICBhZGRpdGlvbmFsVmFyaWFudHNcbiAgICApO1xuICAgIFxuICAgIGNvbnN0IHV0aWxpdGllc1dpdGhWYXJpYW50cyA9IHV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgLi4udSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnUudmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29udmVydGVkQ2xhc3NlcyA9IGFzc2VtYmxlVXRpbGl0aWVzKHV0aWxpdGllc1dpdGhWYXJpYW50cyk7XG5cbiAgICBjb25zdCBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJzaW9uUmVzdWx0cy5ldmVyeShyID0+IHIuY29udmVydGVkKTtcbiAgICBjb25zdCBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkID0gY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gcGFyc2VkLnBhcmVudC50eXBlID09PSAnY2xhc3MnID8gcGFyc2VkLnBhcmVudC5uYW1lIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHBhcnNlZC50YXJnZXQudHlwZSA9PT0gJ2NsYXNzJyA/IGAuJHtwYXJzZWQudGFyZ2V0Lm5hbWV9YCA6IHBhcnNlZC50YXJnZXQubmFtZTtcblxuICAgIGNvbnN0IGNzc1J1bGU6IENTU1J1bGUgPSB7XG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICBjb252ZXJ0ZWRDbGFzc2VzLFxuICAgICAgdXRpbGl0aWVzOiB1dGlsaXRpZXNXaXRoVmFyaWFudHMsXG4gICAgICBza2lwcGVkOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgIGZ1bGx5Q29udmVydGVkOiBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICBwYXJ0aWFsQ29udmVyc2lvbjogc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCAmJiAhYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgcmVhc29uOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA/ICdObyBjb252ZXJ0aWJsZSBkZWNsYXJhdGlvbnMnIDogdW5kZWZpbmVkLFxuICAgICAgaXNEZXNjZW5kYW50OiB0cnVlLFxuICAgICAgcGFyZW50U2VsZWN0b3I6IHBhcnNlZC5wYXJlbnQsXG4gICAgICB0YXJnZXRTZWxlY3RvcjogcGFyc2VkLnRhcmdldFxuICAgIH07XG5cbiAgICByZXR1cm4geyBjc3NSdWxlLCBjb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBwYXJzZShjc3M6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Q1NTUGFyc2VSZXN1bHQ+IHtcbiAgICB0aGlzLnJlc2V0U291cmNlT3JkZXIoKTtcbiAgICBjb25zdCBydWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb290ID0gYXdhaXQgcG9zdGNzcygpLnByb2Nlc3MoY3NzLCB7XG4gICAgICAgIHBhcnNlcjogc2FmZVBhcnNlcixcbiAgICAgICAgZnJvbTogZmlsZVBhdGhcbiAgICAgIH0pLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC5yb290KTtcblxuICAgICAgdGhpcy5jb2xsZWN0VmFyaWFibGVzKHJvb3QsIFtdKTtcblxuICAgICAgcm9vdC53YWxrQXRSdWxlcygoYXRSdWxlKSA9PiB7XG4gICAgICAgIGlmIChhdFJ1bGUubmFtZSAhPT0gJ21lZGlhJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lZGlhUmVzdWx0ID0gcHJvY2Vzc01lZGlhUXVlcnkoYXRSdWxlLnBhcmFtcywgdGhpcy5icmVha3BvaW50cyk7XG5cbiAgICAgICAgaWYgKG1lZGlhUmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKG1lZGlhUmVzdWx0LnJlYXNvbiB8fCBgU2tpcHBlZCBtZWRpYSBxdWVyeTogJHthdFJ1bGUucGFyYW1zfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNpdmVWYXJpYW50ID0gbWVkaWFSZXN1bHQuYnJlYWtwb2ludCE7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNvbGxlY3RWYXJpYWJsZXMoYXRSdWxlLCBbcmVzcG9uc2l2ZVZhcmlhbnRdKTtcblxuICAgICAgICBjb25zdCBuZXN0ZWRSdWxlczogUnVsZVtdID0gW107XG4gICAgICAgIGF0UnVsZS53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgICAgICBuZXN0ZWRSdWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgbmVzdGVkUnVsZXMpIHtcbiAgICAgICAgICBjb25zdCBkZXNjZW5kYW50UmVzdWx0ID0gdGhpcy5wcm9jZXNzRGVzY2VuZGFudFJ1bGUocnVsZSwgW3Jlc3BvbnNpdmVWYXJpYW50XSk7XG4gICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlKTtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBkZXNjZW5kYW50IHJ1bGUgJHtydWxlLnNlbGVjdG9yfSBpbiBAbWVkaWEg4oaSICR7cmVzcG9uc2l2ZVZhcmlhbnR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjciBvZiBkZXNjZW5kYW50UmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2wucHJvcCA9PT0gY3IuZGVjbGFyYXRpb24ucHJvcGVydHkgJiYgZGVjbC52YWx1ZSA9PT0gY3IuZGVjbGFyYXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFBhcnRpYWwgY29udmVyc2lvbiBvZiBkZXNjZW5kYW50IHJ1bGUgaW4gQG1lZGlhIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzaW1wbGVSZXN1bHQgPSB0aGlzLnByb2Nlc3NTaW1wbGVSdWxlKHJ1bGUsIFtyZXNwb25zaXZlVmFyaWFudF0pO1xuICAgICAgICAgIGlmIChzaW1wbGVSZXN1bHQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goLi4uc2ltcGxlUmVzdWx0LmNzc1J1bGVzKTtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uc2ltcGxlUmVzdWx0LmNvbnZlcnNpb25XYXJuaW5ncyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFueUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5zb21lKHIgPT4gci5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgaWYgKGFueUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBjb25zdCBhbGxGdWxseUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5ldmVyeShyID0+IHIuZnVsbHlDb252ZXJ0ZWQpO1xuICAgICAgICAgICAgICBpZiAoYWxsRnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICBydWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMubWFwKHIgPT4gci5jbGFzc05hbWUpLmpvaW4oJywgLicpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIHJ1bGUgLiR7Y2xhc3NOYW1lc30gaW4gQG1lZGlhIChtaW4td2lkdGgpIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2Ygc2ltcGxlUmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzLmZsYXQoKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGNyLmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gaW4gQG1lZGlhIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYFNraXBwZWQgcnVsZSBpbiBAbWVkaWE6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZW1wdHkgQG1lZGlhIHJ1bGVgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICAgIGlmIChydWxlLnBhcmVudCAmJiBydWxlLnBhcmVudC50eXBlID09PSAnYXRydWxlJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NlbmRhbnRSZXN1bHQgPSB0aGlzLnByb2Nlc3NEZXNjZW5kYW50UnVsZShydWxlKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQpIHtcbiAgICAgICAgICBydWxlcy5wdXNoKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZSk7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCguLi5kZXNjZW5kYW50UmVzdWx0LmNvbnZlcnNpb25XYXJuaW5ncyk7XG5cbiAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChkZXNjZW5kYW50UmVzdWx0LmNzc1J1bGUuZnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZGVzY2VuZGFudCBydWxlICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2YgZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChjci5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVjbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgZGVzY2VuZGFudCBydWxlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpbXBsZVJlc3VsdCA9IHRoaXMucHJvY2Vzc1NpbXBsZVJ1bGUocnVsZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXNpbXBsZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGVzY2VuZGFudFNlbGVjdG9yKHJ1bGUuc2VsZWN0b3IpO1xuICAgICAgICAgIGlmIChwYXJzZWQuaXNDb21wbGV4KSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHBhcnNlZC5yZWFzb24gfHwgYFNraXBwZWQgY29tcGxleCBzZWxlY3RvcjogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwaW5nIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2VsZWN0b3JzID0gcGFyc2VNdWx0aXBsZVNlbGVjdG9ycyhydWxlLnNlbGVjdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbENvbXBsZXggPSBwYXJzZWRTZWxlY3RvcnMuZXZlcnkocyA9PiBzLmlzQ29tcGxleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChhbGxDb21wbGV4KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYXNvbnMgPSBwYXJzZWRTZWxlY3RvcnMubWFwKHMgPT4gcy5yZWFzb24pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCguLi5yZWFzb25zIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwaW5nIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVsZXMucHVzaCguLi5zaW1wbGVSZXN1bHQuY3NzUnVsZXMpO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnNpbXBsZVJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIGNvbnN0IGFueUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5zb21lKHIgPT4gci5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoYW55Q29udmVydGVkKSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICBjb25zdCBhbGxGdWxseUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5ldmVyeShyID0+IHIuZnVsbHlDb252ZXJ0ZWQpO1xuICAgICAgICAgIGlmIChhbGxGdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMubWFwKHIgPT4gci5jbGFzc05hbWUpLmpvaW4oJywgLicpO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgcnVsZSAuJHtjbGFzc05hbWVzfSAoYWxsIGRlY2xhcmF0aW9ucyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2Ygc2ltcGxlUmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzLmZsYXQoKSkge1xuICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgcnVsZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW5EZWxldGUgPSByb290Lm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIGNvbnN0IG5ld0NzcyA9IHJvb3QudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBuZXdDc3MsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICBjYW5EZWxldGUsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIENTUyAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENTUyBwYXJzaW5nIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUludGVybmFsU3R5bGUoaHRtbDogc3RyaW5nKTogeyBcbiAgICBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHN0eWxlczogQXJyYXk8eyBjb250ZW50OiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBzdHlsZVJlZ2V4ID0gLzxzdHlsZVtePl0qPihbXFxzXFxTXSo/KTxcXC9zdHlsZT4vZ2k7XG4gICAgbGV0IG1hdGNoO1xuXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUmVnZXguZXhlYyhodG1sKSkgIT09IG51bGwpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgY29udGVudDogbWF0Y2hbMV0udHJpbSgpLFxuICAgICAgICBzdGFydDogbWF0Y2guaW5kZXgsXG4gICAgICAgIGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0eWxlcywgd2FybmluZ3MgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlSW50ZXJuYWxDU1MoaHRtbDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaHRtbDogc3RyaW5nO1xuICAgIHJ1bGVzOiBDU1NSdWxlW107XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBhbGxSdWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3QgYWxsV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1vZGlmaWVkSHRtbCA9IGh0bWw7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHsgc3R5bGVzIH0gPSB0aGlzLnBhcnNlSW50ZXJuYWxTdHlsZShodG1sKTtcblxuICAgIGZvciAobGV0IGkgPSBzdHlsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhcnNlKHN0eWxlLmNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIGFsbFJ1bGVzLnB1c2goLi4ucmVzdWx0LnJ1bGVzKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaCguLi5yZXN1bHQud2FybmluZ3MpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5jYW5EZWxldGUgfHwgcmVzdWx0LmNzcy50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICBtb2RpZmllZEh0bWwgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpICsgbW9kaWZpZWRIdG1sLnNsaWNlKHN0eWxlLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IG1vZGlmaWVkSHRtbC5zbGljZSgwLCBzdHlsZS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IG1vZGlmaWVkSHRtbC5zbGljZShzdHlsZS5lbmQpO1xuICAgICAgICAgICAgY29uc3QgdGFnU3RhcnQgPSBodG1sLnNsaWNlKHN0eWxlLnN0YXJ0KS5tYXRjaCgvPHN0eWxlW14+XSo+Lyk/LlswXSB8fCAnPHN0eWxlPic7XG4gICAgICAgICAgICBjb25zdCB0YWdFbmQgPSAnPC9zdHlsZT4nO1xuICAgICAgICAgICAgbW9kaWZpZWRIdG1sID0gYmVmb3JlICsgdGFnU3RhcnQgKyAnXFxuJyArIHJlc3VsdC5jc3MgKyAnXFxuJyArIHRhZ0VuZCArIGFmdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZSBibG9jazogJHtlcnJvcn1gKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaChgRmFpbGVkIHRvIHBhcnNlIGludGVybmFsIHN0eWxlOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBodG1sOiBtb2RpZmllZEh0bWwsXG4gICAgICBydWxlczogYWxsUnVsZXMsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgd2FybmluZ3M6IGFsbFdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIGV4dHJhY3RJbXBvcnRQYXRocyhjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRcXHMrWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXTs/L2c7XG4gICAgbGV0IG1hdGNoO1xuICAgIFxuICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXVxccypcXCkvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRzO1xuICB9XG59Il19
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFLb0M7QUFDcEMsMkVBSXdDO0FBQ3hDLG1GQU00QztBQUM1QywrREFNa0M7QUFDbEMseUVBS3VDO0FBRXZDLCtEQVNrQztBQTBDbEMsTUFBYSxTQUFTO0lBT3BCLFlBQVksTUFBc0IsRUFBRSxPQUFtRCxFQUFFLGdCQUFtQztRQUpwSCx1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFFL0IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFHdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPO1lBQ3hCLENBQUMsQ0FBQyxJQUFBLGlEQUE0QixFQUFDLE9BQU8sQ0FBQztZQUN2QyxDQUFDLENBQUMsSUFBQSxtQ0FBYyxHQUFFLENBQUM7UUFDckIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLG1DQUFnQixFQUFFLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRU8s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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwb3N0Y3NzLCB7IFJvb3QsIFJ1bGUsIERlY2xhcmF0aW9uLCBBdFJ1bGUgfSBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBzYWZlUGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2FmZS1wYXJzZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRNYXBwZXIsIENTU1Byb3BlcnR5IH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBcbiAgQnJlYWtwb2ludCwgXG4gIGdldEJyZWFrcG9pbnRzLCBcbiAgcmVzb2x2ZUJyZWFrcG9pbnRzRnJvbUNvbmZpZyxcbiAgcHJvY2Vzc01lZGlhUXVlcnkgXG59IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmltcG9ydCB7XG4gIHByb2Nlc3NQc2V1ZG9TZWxlY3RvcixcbiAgcGFyc2VNdWx0aXBsZVNlbGVjdG9ycyxcbiAgUGFyc2VkU2VsZWN0b3Jcbn0gZnJvbSAnLi91dGlscy9wc2V1ZG9TZWxlY3RvclJlc29sdmVyJztcbmltcG9ydCB7XG4gIHBhcnNlRGVzY2VuZGFudFNlbGVjdG9yLFxuICBwcm9jZXNzRGVzY2VuZGFudFNlbGVjdG9yLFxuICBEZXNjZW5kYW50U2VsZWN0b3IsXG4gIFNlbGVjdG9yUGFydCxcbiAgaXNIdG1sRWxlbWVudFxufSBmcm9tICcuL3V0aWxzL2Rlc2NlbmRhbnRTZWxlY3RvclJlc29sdmVyJztcbmltcG9ydCB7XG4gIGFzc2VtYmxlVXRpbGl0eSxcbiAgYXNzZW1ibGVVdGlsaXRpZXMsXG4gIE1lcmdlZFV0aWxpdHksXG4gIG1lcmdlVXRpbGl0aWVzLFxuICBub3JtYWxpemVWYXJpYW50T3JkZXJcbn0gZnJvbSAnLi91dGlscy92YXJpYW50QXNzZW1ibGVyJztcbmltcG9ydCB7XG4gIFNwZWNpZmljaXR5LFxuICBjYWxjdWxhdGVTZWxlY3RvclNwZWNpZmljaXR5LFxuICBjYWxjdWxhdGVEZXNjZW5kYW50U3BlY2lmaWNpdHksXG4gIFpFUk9fU1BFQ0lGSUNJVFlcbn0gZnJvbSAnLi91dGlscy9zcGVjaWZpY2l0eUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgZ2V0UHJvcGVydHlGb3JVdGlsaXR5IH0gZnJvbSAnLi91dGlscy9wcm9wZXJ0eU1hcHBlcic7XG5pbXBvcnQge1xuICBWYXJpYWJsZVJlZ2lzdHJ5LFxuICBWYXJpYWJsZURlZmluaXRpb24sXG4gIFZhcmlhYmxlU2NvcGUsXG4gIFJlc29sdXRpb25Db250ZXh0LFxuICBpc0Nzc1ZhcmlhYmxlLFxuICBpc1ZhckV4cHJlc3Npb24sXG4gIGNyZWF0ZUdsb2JhbFNjb3BlLFxuICBjcmVhdGVTZWxlY3RvclNjb3BlXG59IGZyb20gJy4vdXRpbHMvdmFyaWFibGVSZWdpc3RyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXRpbGl0eVdpdGhWYXJpYW50IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgdmFyaWFudHM6IHN0cmluZ1tdO1xuICBjc3NQcm9wZXJ0eTogc3RyaW5nO1xuICBzcGVjaWZpY2l0eTogU3BlY2lmaWNpdHk7XG4gIHNvdXJjZU9yZGVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0b3JUYXJnZXQge1xuICB0eXBlOiAnY2xhc3MnIHwgJ2VsZW1lbnQnO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUnVsZSB7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W107XG4gIGNvbnZlcnRlZENsYXNzZXM6IHN0cmluZ1tdO1xuICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdO1xuICBza2lwcGVkOiBib29sZWFuO1xuICBmdWxseUNvbnZlcnRlZDogYm9vbGVhbjtcbiAgcGFydGlhbENvbnZlcnNpb246IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbiAgaXNEZXNjZW5kYW50OiBib29sZWFuO1xuICBwYXJlbnRTZWxlY3Rvcj86IFNlbGVjdG9yVGFyZ2V0O1xuICB0YXJnZXRTZWxlY3Rvcj86IFNlbGVjdG9yVGFyZ2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1BhcnNlUmVzdWx0IHtcbiAgY3NzOiBzdHJpbmc7XG4gIHJ1bGVzOiBDU1NSdWxlW107XG4gIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gIGNhbkRlbGV0ZTogYm9vbGVhbjtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1VzYWdlTWFwIHtcbiAgW2NsYXNzTmFtZTogc3RyaW5nXTogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBDU1NQYXJzZXIge1xuICBwcml2YXRlIG1hcHBlcjogVGFpbHdpbmRNYXBwZXI7XG4gIHByaXZhdGUgYnJlYWtwb2ludHM6IEJyZWFrcG9pbnRbXTtcbiAgcHJpdmF0ZSBzb3VyY2VPcmRlckNvdW50ZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgdmFyaWFibGVSZWdpc3RyeTogVmFyaWFibGVSZWdpc3RyeTtcbiAgcHJpdmF0ZSBzaGFyZWRSZWdpc3RyeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIsIHNjcmVlbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddPiwgdmFyaWFibGVSZWdpc3RyeT86IFZhcmlhYmxlUmVnaXN0cnkpIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgICB0aGlzLmJyZWFrcG9pbnRzID0gc2NyZWVucyBcbiAgICAgID8gcmVzb2x2ZUJyZWFrcG9pbnRzRnJvbUNvbmZpZyhzY3JlZW5zKSBcbiAgICAgIDogZ2V0QnJlYWtwb2ludHMoKTtcbiAgICBpZiAodmFyaWFibGVSZWdpc3RyeSkge1xuICAgICAgdGhpcy52YXJpYWJsZVJlZ2lzdHJ5ID0gdmFyaWFibGVSZWdpc3RyeTtcbiAgICAgIHRoaXMuc2hhcmVkUmVnaXN0cnkgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhcmlhYmxlUmVnaXN0cnkgPSBuZXcgVmFyaWFibGVSZWdpc3RyeSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhcmlhYmxlUmVnaXN0cnkoKTogVmFyaWFibGVSZWdpc3RyeSB7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGVSZWdpc3RyeTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTb3VyY2VPcmRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNvdXJjZU9yZGVyQ291bnRlciA9IDA7XG4gICAgaWYgKCF0aGlzLnNoYXJlZFJlZ2lzdHJ5KSB7XG4gICAgICB0aGlzLnZhcmlhYmxlUmVnaXN0cnkuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRTb3VyY2VPcmRlcigpOiBudW1iZXIge1xuICAgIHJldHVybiArK3RoaXMuc291cmNlT3JkZXJDb3VudGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0VmFyaWFibGVzKFxuICAgIG5vZGU6IFJvb3QgfCBBdFJ1bGUsXG4gICAgYWRkaXRpb25hbFZhcmlhbnRzOiBzdHJpbmdbXSA9IFtdXG4gICk6IHZvaWQge1xuICAgIGxldCBzb3VyY2VPcmRlciA9IDA7XG4gICAgXG4gICAgbm9kZS53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gcnVsZS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IGlzUm9vdFNlbGVjdG9yID0gc2VsZWN0b3IgPT09ICc6cm9vdCc7XG4gICAgICBcbiAgICAgIGxldCBzY29wZTogVmFyaWFibGVTY29wZTtcbiAgICAgIGxldCBzcGVjaWZpY2l0eTogU3BlY2lmaWNpdHk7XG4gICAgICBcbiAgICAgIGlmIChpc1Jvb3RTZWxlY3Rvcikge1xuICAgICAgICBzY29wZSA9IGNyZWF0ZUdsb2JhbFNjb3BlKCk7XG4gICAgICAgIHNwZWNpZmljaXR5ID0geyBpbmxpbmU6IDAsIGlkOiAwLCBjbGFzczogMCwgZWxlbWVudDogMCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VEZXNjZW5kYW50U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICBpZiAocGFyc2VkLmlzQ29tcGxleCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhcnNlZC5wYXJlbnQpIHtcbiAgICAgICAgICBzY29wZSA9IGNyZWF0ZVNlbGVjdG9yU2NvcGUoc2VsZWN0b3IsIHBhcnNlZC5wYXJlbnQudHlwZSk7XG4gICAgICAgICAgc3BlY2lmaWNpdHkgPSBjYWxjdWxhdGVEZXNjZW5kYW50U3BlY2lmaWNpdHkoXG4gICAgICAgICAgICBwYXJzZWQucGFyZW50LnR5cGUsXG4gICAgICAgICAgICBwYXJzZWQucGFyZW50Lm5hbWUsXG4gICAgICAgICAgICBwYXJzZWQudGFyZ2V0LnR5cGUsXG4gICAgICAgICAgICBwYXJzZWQudGFyZ2V0Lm5hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVHlwZSA9IHNlbGVjdG9yLnN0YXJ0c1dpdGgoJy4nKSA/ICdjbGFzcycgOiAnZWxlbWVudCc7XG4gICAgICAgICAgc2NvcGUgPSBjcmVhdGVTZWxlY3RvclNjb3BlKHNlbGVjdG9yLCBzZWxlY3RvclR5cGUpO1xuICAgICAgICAgIHNwZWNpZmljaXR5ID0gY2FsY3VsYXRlU2VsZWN0b3JTcGVjaWZpY2l0eShzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgaWYgKCFpc0Nzc1ZhcmlhYmxlKGRlY2wucHJvcCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHZhckRlZjogVmFyaWFibGVEZWZpbml0aW9uID0ge1xuICAgICAgICAgIG5hbWU6IGRlY2wucHJvcCxcbiAgICAgICAgICB2YWx1ZTogZGVjbC52YWx1ZSxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBzcGVjaWZpY2l0eSxcbiAgICAgICAgICBzb3VyY2VPcmRlcjogKytzb3VyY2VPcmRlcixcbiAgICAgICAgICB2YXJpYW50czogYWRkaXRpb25hbFZhcmlhbnRzXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICB0aGlzLnZhcmlhYmxlUmVnaXN0cnkucmVnaXN0ZXIodmFyRGVmKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlZ2lzdGVyZWQgQ1NTIHZhcmlhYmxlOiAke2RlY2wucHJvcH0gPSAke2RlY2wudmFsdWV9IChzY29wZTogJHtzY29wZS50eXBlfSlgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGVjbGFyYXRpb25WYWx1ZShcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHNlbGVjdG9yOiBzdHJpbmcsXG4gICAgc3BlY2lmaWNpdHk6IFNwZWNpZmljaXR5LFxuICAgIHZhcmlhbnRzOiBzdHJpbmdbXVxuICApOiB7IHJlc29sdmVkVmFsdWU6IHN0cmluZzsgaGFzVW5yZXNvbHZlZDogYm9vbGVhbiB9IHtcbiAgICBpZiAoIWlzVmFyRXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IHJlc29sdmVkVmFsdWU6IHZhbHVlLCBoYXNVbnJlc29sdmVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb250ZXh0OiBSZXNvbHV0aW9uQ29udGV4dCA9IHtcbiAgICAgIHNlbGVjdG9yLFxuICAgICAgc3BlY2lmaWNpdHksXG4gICAgICB2YXJpYW50c1xuICAgIH07XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YXJpYWJsZVJlZ2lzdHJ5LnJlc29sdmVWYWx1ZSh2YWx1ZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIHsgcmVzb2x2ZWRWYWx1ZTogcmVzdWx0LnZhbHVlLCBoYXNVbnJlc29sdmVkOiByZXN1bHQuaGFzVW5yZXNvbHZlZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGVjbGFyYXRpb25zKFxuICAgIGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSxcbiAgICBzcGVjaWZpY2l0eTogU3BlY2lmaWNpdHksXG4gICAgc291cmNlT3JkZXI6IG51bWJlcixcbiAgICBzZWxlY3Rvcjogc3RyaW5nID0gJycsXG4gICAgdmFyaWFudHM6IHN0cmluZ1tdID0gW11cbiAgKToge1xuICAgIHV0aWxpdGllczogVXRpbGl0eVdpdGhWYXJpYW50W107XG4gICAgY29udmVyc2lvblJlc3VsdHM6IEFycmF5PHsgZGVjbGFyYXRpb246IENTU1Byb3BlcnR5OyBjb252ZXJ0ZWQ6IGJvb2xlYW47IGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDsgcmVzb2x2ZWRWYWx1ZT86IHN0cmluZyB9PjtcbiAgICBjb252ZXJzaW9uV2FybmluZ3M6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8e1xuICAgICAgZGVjbGFyYXRpb246IENTU1Byb3BlcnR5O1xuICAgICAgY29udmVydGVkOiBib29sZWFuO1xuICAgICAgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmVzb2x2ZWRWYWx1ZT86IHN0cmluZztcbiAgICB9PiA9IFtdO1xuICAgIGNvbnN0IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2wgPT4ge1xuICAgICAgY29uc3QgdmFsdWVUb0NvbnZlcnQgPSB0aGlzLnJlc29sdmVEZWNsYXJhdGlvblZhbHVlKFxuICAgICAgICBkZWNsLnZhbHVlLFxuICAgICAgICBzZWxlY3RvcixcbiAgICAgICAgc3BlY2lmaWNpdHksXG4gICAgICAgIHZhcmlhbnRzXG4gICAgICApO1xuICAgICAgXG4gICAgICBsZXQgY29udmVydGVkSW5UaGlzQmxvY2sgPSBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYgKHZhbHVlVG9Db252ZXJ0Lmhhc1VucmVzb2x2ZWQpIHtcbiAgICAgICAgY29uc3QgbXVsdGlSZXN1bHQgPSB0aGlzLm1hcHBlci5jb252ZXJ0UHJvcGVydHlXaXRoTXVsdGlwbGUoZGVjbC5wcm9wZXJ0eSwgdmFsdWVUb0NvbnZlcnQucmVzb2x2ZWRWYWx1ZSB8fCBkZWNsLnZhbHVlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChtdWx0aVJlc3VsdC5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtdWx0aVJlc3VsdC5jbGFzc2VzLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uOiBkZWNsLFxuICAgICAgICAgICAgICBjb252ZXJ0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZTogdmFsdWVUb0NvbnZlcnQucmVzb2x2ZWRWYWx1ZSB8fCBkZWNsLnZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBtdWx0aVJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHcgPT4gY29udmVyc2lvbldhcm5pbmdzLnB1c2godykpO1xuICAgICAgICAgIGNvbnZlcnRlZEluVGhpc0Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWRJblRoaXNCbG9jaykge1xuICAgICAgICAgIGNvbnZlcnNpb25SZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgZGVjbGFyYXRpb246IGRlY2wsXG4gICAgICAgICAgICBjb252ZXJ0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBudWxsLFxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZTogdmFsdWVUb0NvbnZlcnQucmVzb2x2ZWRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnZlcnNpb25XYXJuaW5ncy5wdXNoKGBDb3VsZCBub3QgZnVsbHkgcmVzb2x2ZSB2YXIoKSBpbjogJHtkZWNsLnByb3BlcnR5fTogJHtkZWNsLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgbXVsdGlSZXN1bHQgPSB0aGlzLm1hcHBlci5jb252ZXJ0UHJvcGVydHlXaXRoTXVsdGlwbGUoZGVjbC5wcm9wZXJ0eSwgdmFsdWVUb0NvbnZlcnQucmVzb2x2ZWRWYWx1ZSk7XG4gICAgICBcbiAgICAgIGlmIChtdWx0aVJlc3VsdC5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXVsdGlSZXN1bHQuY2xhc3Nlcy5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgICAgICBjb252ZXJzaW9uUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uOiBkZWNsLFxuICAgICAgICAgICAgY29udmVydGVkOiB0cnVlLFxuICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZTogdmFsdWVUb0NvbnZlcnQucmVzb2x2ZWRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbXVsdGlSZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3ID0+IGNvbnZlcnNpb25XYXJuaW5ncy5wdXNoKHcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWFwcGVyLmNvbnZlcnRQcm9wZXJ0eShkZWNsLnByb3BlcnR5LCB2YWx1ZVRvQ29udmVydC5yZXNvbHZlZFZhbHVlKTtcbiAgICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgZGVjbGFyYXRpb246IGRlY2wsXG4gICAgICAgICAgY29udmVydGVkOiAhcmVzdWx0LnNraXBwZWQgJiYgcmVzdWx0LmNsYXNzTmFtZSAhPT0gbnVsbCxcbiAgICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5jbGFzc05hbWUsXG4gICAgICAgICAgcmVzb2x2ZWRWYWx1ZTogdmFsdWVUb0NvbnZlcnQucmVzb2x2ZWRWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5za2lwcGVkICYmIHJlc3VsdC5yZWFzb24pIHtcbiAgICAgICAgICBjb252ZXJzaW9uV2FybmluZ3MucHVzaChyZXN1bHQucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXSA9IGNvbnZlcnNpb25SZXN1bHRzXG4gICAgICAuZmlsdGVyKHIgPT4gci5jb252ZXJ0ZWQgJiYgci5jbGFzc05hbWUpXG4gICAgICAubWFwKHIgPT4gKHtcbiAgICAgICAgdmFsdWU6IHIuY2xhc3NOYW1lISxcbiAgICAgICAgdmFyaWFudHM6IFtdLFxuICAgICAgICBjc3NQcm9wZXJ0eTogci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSxcbiAgICAgICAgc3BlY2lmaWNpdHksXG4gICAgICAgIHNvdXJjZU9yZGVyXG4gICAgICB9KSk7XG5cbiAgICByZXR1cm4geyB1dGlsaXRpZXMsIGNvbnZlcnNpb25SZXN1bHRzLCBjb252ZXJzaW9uV2FybmluZ3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1NpbXBsZVJ1bGUoXG4gICAgcnVsZTogUnVsZSxcbiAgICBhZGRpdGlvbmFsVmFyaWFudHM6IHN0cmluZ1tdID0gW11cbiAgKTogeyBjc3NSdWxlczogQ1NTUnVsZVtdOyBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsOyByZXNvbHZlZFZhbHVlPzogc3RyaW5nIH0+W107IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gfSB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gcnVsZS5zZWxlY3RvcjtcbiAgICBjb25zdCBwYXJzZWRTZWxlY3RvcnMgPSBwYXJzZU11bHRpcGxlU2VsZWN0b3JzKHNlbGVjdG9yKTtcbiAgICBcbiAgICBjb25zdCB2YWxpZFNlbGVjdG9ycyA9IHBhcnNlZFNlbGVjdG9ycy5maWx0ZXIocyA9PiAhcy5pc0NvbXBsZXggJiYgcy5iYXNlQ2xhc3MpO1xuICAgIFxuICAgIGlmICh2YWxpZFNlbGVjdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSA9IFtdO1xuXG4gICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgIGlmIChkZWNsLnByb3Auc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNsLnZhbHVlLmluY2x1ZGVzKCdjYWxjKCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICBwcm9wZXJ0eTogZGVjbC5wcm9wLFxuICAgICAgICB2YWx1ZTogZGVjbC52YWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY3NzUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7IHJlc29sdmVkVmFsdWU/OiBzdHJpbmcgfT5bXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcGFyc2VkIG9mIHZhbGlkU2VsZWN0b3JzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcmRlciA9IHRoaXMuZ2V0TmV4dFNvdXJjZU9yZGVyKCk7XG4gICAgICBjb25zdCBzcGVjaWZpY2l0eSA9IGNhbGN1bGF0ZVNlbGVjdG9yU3BlY2lmaWNpdHkoc2VsZWN0b3IpO1xuICAgICAgY29uc3QgcHNldWRvQ291bnQgPSAocGFyc2VkLnBzZXVkb3MgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNwZWNpZmljaXR5V2l0aFBzZXVkbyA9IHtcbiAgICAgICAgaW5saW5lOiBzcGVjaWZpY2l0eS5pbmxpbmUsXG4gICAgICAgIGlkOiBzcGVjaWZpY2l0eS5pZCxcbiAgICAgICAgY2xhc3M6IHNwZWNpZmljaXR5LmNsYXNzICsgcHNldWRvQ291bnQsXG4gICAgICAgIGVsZW1lbnQ6IHNwZWNpZmljaXR5LmVsZW1lbnRcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IHBzZXVkb1ZhcmlhbnRzID0gcGFyc2VkLnBzZXVkb3MgfHwgW107XG4gICAgICBjb25zdCBhbGxWYXJpYW50cyA9IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4ucHNldWRvVmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pO1xuICAgICAgXG4gICAgICBjb25zdCB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9ID0gdGhpcy5jb252ZXJ0RGVjbGFyYXRpb25zKFxuICAgICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICAgIHNwZWNpZmljaXR5V2l0aFBzZXVkbyxcbiAgICAgICAgc291cmNlT3JkZXIsXG4gICAgICAgIHNlbGVjdG9yLFxuICAgICAgICBhbGxWYXJpYW50c1xuICAgICAgKTtcbiAgICAgIFxuICAgICAgY29uc3QgdXRpbGl0aWVzRm9yU2VsZWN0b3IgPSB1dGlsaXRpZXMubWFwKHUgPT4gKHtcbiAgICAgICAgLi4udSxcbiAgICAgICAgdmFyaWFudHM6IGFsbFZhcmlhbnRzXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGNvbnZlcnRlZENsYXNzZXMgPSBhc3NlbWJsZVV0aWxpdGllcyh1dGlsaXRpZXNGb3JTZWxlY3Rvcik7XG5cbiAgICAgIGNvbnN0IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5jb252ZXJ0ZWQpO1xuICAgICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgICAgY29uc3QgY3NzUnVsZTogQ1NTUnVsZSA9IHtcbiAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICBjbGFzc05hbWU6IHBhcnNlZC5iYXNlQ2xhc3MsXG4gICAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgdXRpbGl0aWVzOiB1dGlsaXRpZXNGb3JTZWxlY3RvcixcbiAgICAgICAgc2tpcHBlZDogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIGZ1bGx5Q29udmVydGVkOiBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHJlYXNvbjogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPyAnTm8gY29udmVydGlibGUgZGVjbGFyYXRpb25zJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNEZXNjZW5kYW50OiBmYWxzZVxuICAgICAgfTtcblxuICAgICAgY3NzUnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgIGFsbENvbnZlcnNpb25SZXN1bHRzLnB1c2goY29udmVyc2lvblJlc3VsdHMpO1xuICAgICAgYWxsQ29udmVyc2lvbldhcm5pbmdzLnB1c2goLi4uY29udmVyc2lvbldhcm5pbmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjc3NSdWxlcywgY29udmVyc2lvblJlc3VsdHM6IGFsbENvbnZlcnNpb25SZXN1bHRzLCBjb252ZXJzaW9uV2FybmluZ3M6IGFsbENvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRGVzY2VuZGFudFJ1bGUoXG4gICAgcnVsZTogUnVsZSxcbiAgICBhZGRpdGlvbmFsVmFyaWFudHM6IHN0cmluZ1tdID0gW11cbiAgKTogeyBjc3NSdWxlOiBDU1NSdWxlOyBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsOyByZXNvbHZlZFZhbHVlPzogc3RyaW5nIH0+OyBjb252ZXJzaW9uV2FybmluZ3M6IHN0cmluZ1tdIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IHJ1bGUuc2VsZWN0b3I7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VEZXNjZW5kYW50U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIFxuICAgIGlmIChwYXJzZWQuaXNDb21wbGV4IHx8ICFwYXJzZWQucGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W10gPSBbXTtcblxuICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICBpZiAoZGVjbC5wcm9wLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVjbC52YWx1ZS5pbmNsdWRlcygnY2FsYygnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgcHJvcGVydHk6IGRlY2wucHJvcCxcbiAgICAgICAgdmFsdWU6IGRlY2wudmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gdGhpcy5nZXROZXh0U291cmNlT3JkZXIoKTtcbiAgICBjb25zdCBzcGVjaWZpY2l0eSA9IGNhbGN1bGF0ZURlc2NlbmRhbnRTcGVjaWZpY2l0eShcbiAgICAgIHBhcnNlZC5wYXJlbnQudHlwZSxcbiAgICAgIHBhcnNlZC5wYXJlbnQubmFtZSxcbiAgICAgIHBhcnNlZC50YXJnZXQudHlwZSxcbiAgICAgIHBhcnNlZC50YXJnZXQubmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9ID0gdGhpcy5jb252ZXJ0RGVjbGFyYXRpb25zKFxuICAgICAgZGVjbGFyYXRpb25zLFxuICAgICAgc3BlY2lmaWNpdHksXG4gICAgICBzb3VyY2VPcmRlcixcbiAgICAgIHNlbGVjdG9yLFxuICAgICAgYWRkaXRpb25hbFZhcmlhbnRzXG4gICAgKTtcbiAgICBcbiAgICBjb25zdCB1dGlsaXRpZXNXaXRoVmFyaWFudHMgPSB1dGlsaXRpZXMubWFwKHUgPT4gKHtcbiAgICAgIC4uLnUsXG4gICAgICB2YXJpYW50czogbm9ybWFsaXplVmFyaWFudE9yZGVyKFsuLi51LnZhcmlhbnRzLCAuLi5hZGRpdGlvbmFsVmFyaWFudHNdKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbnZlcnRlZENsYXNzZXMgPSBhc3NlbWJsZVV0aWxpdGllcyh1dGlsaXRpZXNXaXRoVmFyaWFudHMpO1xuXG4gICAgY29uc3QgYWxsRGVjbGFyYXRpb25zQ29udmVydGVkID0gY29udmVyc2lvblJlc3VsdHMuZXZlcnkociA9PiByLmNvbnZlcnRlZCk7XG4gICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnNlZC5wYXJlbnQudHlwZSA9PT0gJ2NsYXNzJyA/IHBhcnNlZC5wYXJlbnQubmFtZSA6ICcnO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSBwYXJzZWQudGFyZ2V0LnR5cGUgPT09ICdjbGFzcycgPyBgLiR7cGFyc2VkLnRhcmdldC5uYW1lfWAgOiBwYXJzZWQudGFyZ2V0Lm5hbWU7XG5cbiAgICBjb25zdCBjc3NSdWxlOiBDU1NSdWxlID0ge1xuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZGVjbGFyYXRpb25zLFxuICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgIHV0aWxpdGllczogdXRpbGl0aWVzV2l0aFZhcmlhbnRzLFxuICAgICAgc2tpcHBlZDogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICBmdWxseUNvbnZlcnRlZDogYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgcGFydGlhbENvbnZlcnNpb246IHNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgJiYgIWFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgIHJlYXNvbjogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPyAnTm8gY29udmVydGlibGUgZGVjbGFyYXRpb25zJyA6IHVuZGVmaW5lZCxcbiAgICAgIGlzRGVzY2VuZGFudDogdHJ1ZSxcbiAgICAgIHBhcmVudFNlbGVjdG9yOiBwYXJzZWQucGFyZW50LFxuICAgICAgdGFyZ2V0U2VsZWN0b3I6IHBhcnNlZC50YXJnZXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgY3NzUnVsZSwgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2UoY3NzOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENTU1BhcnNlUmVzdWx0PiB7XG4gICAgdGhpcy5yZXNldFNvdXJjZU9yZGVyKCk7XG4gICAgY29uc3QgcnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdCA9IGF3YWl0IHBvc3Rjc3MoKS5wcm9jZXNzKGNzcywge1xuICAgICAgICBwYXJzZXI6IHNhZmVQYXJzZXIsXG4gICAgICAgIGZyb206IGZpbGVQYXRoXG4gICAgICB9KS50aGVuKHJlc3VsdCA9PiByZXN1bHQucm9vdCk7XG5cbiAgICAgIGlmICghdGhpcy5zaGFyZWRSZWdpc3RyeSkge1xuICAgICAgICB0aGlzLmNvbGxlY3RWYXJpYWJsZXMocm9vdCwgW10pO1xuICAgICAgfVxuXG4gICAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgICAgaWYgKGF0UnVsZS5uYW1lICE9PSAnbWVkaWEnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVkaWFSZXN1bHQgPSBwcm9jZXNzTWVkaWFRdWVyeShhdFJ1bGUucGFyYW1zLCB0aGlzLmJyZWFrcG9pbnRzKTtcblxuICAgICAgICBpZiAobWVkaWFSZXN1bHQuc2tpcHBlZCkge1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2gobWVkaWFSZXN1bHQucmVhc29uIHx8IGBTa2lwcGVkIG1lZGlhIHF1ZXJ5OiAke2F0UnVsZS5wYXJhbXN9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVZhcmlhbnQgPSBtZWRpYVJlc3VsdC5icmVha3BvaW50ITtcbiAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5zaGFyZWRSZWdpc3RyeSkge1xuICAgICAgICAgIHRoaXMuY29sbGVjdFZhcmlhYmxlcyhhdFJ1bGUsIFtyZXNwb25zaXZlVmFyaWFudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmVzdGVkUnVsZXM6IFJ1bGVbXSA9IFtdO1xuICAgICAgICBhdFJ1bGUud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICAgICAgbmVzdGVkUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIG5lc3RlZFJ1bGVzKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudFJlc3VsdCA9IHRoaXMucHJvY2Vzc0Rlc2NlbmRhbnRSdWxlKHJ1bGUsIFtyZXNwb25zaXZlVmFyaWFudF0pO1xuICAgICAgICAgIGlmIChkZXNjZW5kYW50UmVzdWx0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZSk7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLmRlc2NlbmRhbnRSZXN1bHQuY29udmVyc2lvbldhcm5pbmdzKTtcblxuICAgICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZS5mdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZGVzY2VuZGFudCBydWxlICR7cnVsZS5zZWxlY3Rvcn0gaW4gQG1lZGlhIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2YgZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgaWYgKGNyLmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgZGVzY2VuZGFudCBydWxlIGluIEBtZWRpYSDihpIgJHtyZXNwb25zaXZlVmFyaWFudH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2ltcGxlUmVzdWx0ID0gdGhpcy5wcm9jZXNzU2ltcGxlUnVsZShydWxlLCBbcmVzcG9uc2l2ZVZhcmlhbnRdKTtcbiAgICAgICAgICBpZiAoc2ltcGxlUmVzdWx0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKC4uLnNpbXBsZVJlc3VsdC5jc3NSdWxlcyk7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnNpbXBsZVJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgICAgICBjb25zdCBhbnlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuc29tZShyID0+IHIuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgIGlmIChhbnlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgY29uc3QgYWxsRnVsbHlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuZXZlcnkociA9PiByLmZ1bGx5Q29udmVydGVkKTtcbiAgICAgICAgICAgICAgaWYgKGFsbEZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gc2ltcGxlUmVzdWx0LmNzc1J1bGVzLm1hcChyID0+IHIuY2xhc3NOYW1lKS5qb2luKCcsIC4nKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBydWxlIC4ke2NsYXNzTmFtZXN9IGluIEBtZWRpYSAobWluLXdpZHRoKSDihpIgJHtyZXNwb25zaXZlVmFyaWFudH1gKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNyIG9mIHNpbXBsZVJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cy5mbGF0KCkpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjci5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIGluIEBtZWRpYSDihpIgJHtyZXNwb25zaXZlVmFyaWFudH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKGBTa2lwcGVkIHJ1bGUgaW4gQG1lZGlhOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0UnVsZS5ub2RlcyAmJiBhdFJ1bGUubm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIGVtcHR5IEBtZWRpYSBydWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuICAgICAgICBpZiAocnVsZS5wYXJlbnQgJiYgcnVsZS5wYXJlbnQudHlwZSA9PT0gJ2F0cnVsZScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNjZW5kYW50UmVzdWx0ID0gdGhpcy5wcm9jZXNzRGVzY2VuZGFudFJ1bGUocnVsZSk7XG4gICAgICAgIGlmIChkZXNjZW5kYW50UmVzdWx0KSB7XG4gICAgICAgICAgcnVsZXMucHVzaChkZXNjZW5kYW50UmVzdWx0LmNzc1J1bGUpO1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIGRlc2NlbmRhbnQgcnVsZSAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNyIG9mIGRlc2NlbmRhbnRSZXN1bHQuY29udmVyc2lvblJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIGRlc2NlbmRhbnQgcnVsZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaW1wbGVSZXN1bHQgPSB0aGlzLnByb2Nlc3NTaW1wbGVSdWxlKHJ1bGUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFzaW1wbGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURlc2NlbmRhbnRTZWxlY3RvcihydWxlLnNlbGVjdG9yKTtcbiAgICAgICAgICBpZiAocGFyc2VkLmlzQ29tcGxleCkge1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaChwYXJzZWQucmVhc29uIHx8IGBTa2lwcGVkIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGluZyBjb21wbGV4IHNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFNlbGVjdG9ycyA9IHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMocnVsZS5zZWxlY3Rvcik7XG4gICAgICAgICAgICBjb25zdCBhbGxDb21wbGV4ID0gcGFyc2VkU2VsZWN0b3JzLmV2ZXJ5KHMgPT4gcy5pc0NvbXBsZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYWxsQ29tcGxleCkge1xuICAgICAgICAgICAgICBjb25zdCByZWFzb25zID0gcGFyc2VkU2VsZWN0b3JzLm1hcChzID0+IHMucmVhc29uKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4ucmVhc29ucyBhcyBzdHJpbmdbXSk7XG4gICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGluZyBjb21wbGV4IHNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uc2ltcGxlUmVzdWx0LmNzc1J1bGVzKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi5zaW1wbGVSZXN1bHQuY29udmVyc2lvbldhcm5pbmdzKTtcblxuICAgICAgICBjb25zdCBhbnlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuc29tZShyID0+IHIuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKTtcbiAgICAgICAgaWYgKGFueUNvbnZlcnRlZCkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgY29uc3QgYWxsRnVsbHlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuZXZlcnkociA9PiByLmZ1bGx5Q29udmVydGVkKTtcbiAgICAgICAgICBpZiAoYWxsRnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gc2ltcGxlUmVzdWx0LmNzc1J1bGVzLm1hcChyID0+IHIuY2xhc3NOYW1lKS5qb2luKCcsIC4nKTtcbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIHJ1bGUgLiR7Y2xhc3NOYW1lc30gKGFsbCBkZWNsYXJhdGlvbnMgY29udmVydGVkKWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNyIG9mIHNpbXBsZVJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cy5mbGF0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKGNyLmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIHJ1bGVgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgICAgaWYgKGF0UnVsZS5ub2RlcyAmJiBhdFJ1bGUubm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY2FuRGVsZXRlID0gcm9vdC5ub2Rlcy5sZW5ndGggPT09IDA7XG4gICAgICBjb25zdCBuZXdDc3MgPSByb290LnRvU3RyaW5nKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogbmV3Q3NzLFxuICAgICAgICBydWxlcyxcbiAgICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgICAgY2FuRGVsZXRlLFxuICAgICAgICB3YXJuaW5nc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBDU1MgJHtmaWxlUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDU1MgcGFyc2luZyBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VJbnRlcm5hbFN0eWxlKGh0bWw6IHN0cmluZyk6IHsgXG4gICAgc3R5bGVzOiBBcnJheTx7IGNvbnRlbnQ6IHN0cmluZzsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3Qgc3R5bGVSZWdleCA9IC88c3R5bGVbXj5dKj4oW1xcc1xcU10qPyk8XFwvc3R5bGU+L2dpO1xuICAgIGxldCBtYXRjaDtcblxuICAgIHdoaWxlICgobWF0Y2ggPSBzdHlsZVJlZ2V4LmV4ZWMoaHRtbCkpICE9PSBudWxsKSB7XG4gICAgICBzdHlsZXMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IG1hdGNoWzFdLnRyaW0oKSxcbiAgICAgICAgc3RhcnQ6IG1hdGNoLmluZGV4LFxuICAgICAgICBlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdHlsZXMsIHdhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBwYXJzZUludGVybmFsQ1NTKGh0bWw6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGh0bWw6IHN0cmluZztcbiAgICBydWxlczogQ1NTUnVsZVtdO1xuICAgIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9PiB7XG4gICAgY29uc3QgYWxsUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtb2RpZmllZEh0bWwgPSBodG1sO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBjb25zdCB7IHN0eWxlcyB9ID0gdGhpcy5wYXJzZUludGVybmFsU3R5bGUoaHRtbCk7XG5cbiAgICBmb3IgKGxldCBpID0gc3R5bGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHN0eWxlc1tpXTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYXJzZShzdHlsZS5jb250ZW50LCBmaWxlUGF0aCk7XG4gICAgICAgIFxuICAgICAgICBhbGxSdWxlcy5wdXNoKC4uLnJlc3VsdC5ydWxlcyk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goLi4ucmVzdWx0Lndhcm5pbmdzKTtcblxuICAgICAgICBpZiAocmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuY2FuRGVsZXRlIHx8IHJlc3VsdC5jc3MudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgbW9kaWZpZWRIdG1sID0gbW9kaWZpZWRIdG1sLnNsaWNlKDAsIHN0eWxlLnN0YXJ0KSArIG1vZGlmaWVkSHRtbC5zbGljZShzdHlsZS5lbmQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBtb2RpZmllZEh0bWwuc2xpY2Uoc3R5bGUuZW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ1N0YXJ0ID0gaHRtbC5zbGljZShzdHlsZS5zdGFydCkubWF0Y2goLzxzdHlsZVtePl0qPi8pPy5bMF0gfHwgJzxzdHlsZT4nO1xuICAgICAgICAgICAgY29uc3QgdGFnRW5kID0gJzwvc3R5bGU+JztcbiAgICAgICAgICAgIG1vZGlmaWVkSHRtbCA9IGJlZm9yZSArIHRhZ1N0YXJ0ICsgJ1xcbicgKyByZXN1bHQuY3NzICsgJ1xcbicgKyB0YWdFbmQgKyBhZnRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgc3R5bGUgYmxvY2s6ICR7ZXJyb3J9YCk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZTogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaHRtbDogbW9kaWZpZWRIdG1sLFxuICAgICAgcnVsZXM6IGFsbFJ1bGVzLFxuICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgIHdhcm5pbmdzOiBhbGxXYXJuaW5nc1xuICAgIH07XG4gIH1cblxuICBleHRyYWN0SW1wb3J0UGF0aHMoY29kZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgY29uc3QgaW1wb3J0UmVnZXggPSAvaW1wb3J0XFxzK1snXCJdKFteJ1wiXStcXC5jc3MpWydcIl07Py9nO1xuICAgIGxldCBtYXRjaDtcbiAgICBcbiAgICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWlyZVJlZ2V4ID0gL3JlcXVpcmVcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXStcXC5jc3MpWydcIl1cXHMqXFwpL2c7XG4gICAgd2hpbGUgKChtYXRjaCA9IHJlcXVpcmVSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1wb3J0cztcbiAgfVxuXG4gIGFzeW5jIGNvbGxlY3RWYXJpYWJsZXNPbmx5KGNzczogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCBwb3N0Y3NzKCkucHJvY2Vzcyhjc3MsIHtcbiAgICAgICAgcGFyc2VyOiBzYWZlUGFyc2VyLFxuICAgICAgICBmcm9tOiBmaWxlUGF0aFxuICAgICAgfSkudGhlbihyZXN1bHQgPT4gcmVzdWx0LnJvb3QpO1xuXG4gICAgICB0aGlzLmNvbGxlY3RWYXJpYWJsZXMocm9vdCwgW10pO1xuXG4gICAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgICAgaWYgKGF0UnVsZS5uYW1lICE9PSAnbWVkaWEnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVkaWFSZXN1bHQgPSBwcm9jZXNzTWVkaWFRdWVyeShhdFJ1bGUucGFyYW1zLCB0aGlzLmJyZWFrcG9pbnRzKTtcbiAgICAgICAgaWYgKG1lZGlhUmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zaXZlVmFyaWFudCA9IG1lZGlhUmVzdWx0LmJyZWFrcG9pbnQhO1xuICAgICAgICB0aGlzLmNvbGxlY3RWYXJpYWJsZXMoYXRSdWxlLCBbcmVzcG9uc2l2ZVZhcmlhbnRdKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGNvbGxlY3QgdmFyaWFibGVzIGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29sbGVjdFZhcmlhYmxlc0Zyb21JbnRlcm5hbENTUyhodG1sOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHN0eWxlcyB9ID0gdGhpcy5wYXJzZUludGVybmFsU3R5bGUoaHRtbCk7XG5cbiAgICBmb3IgKGNvbnN0IHN0eWxlIG9mIHN0eWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0VmFyaWFibGVzT25seShzdHlsZS5jb250ZW50LCBmaWxlUGF0aCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGNvbGxlY3QgdmFyaWFibGVzIGZyb20gaW50ZXJuYWwgQ1NTIGluICR7ZmlsZVBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==