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.
@@ -4,37 +4,80 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.transformFiles = transformFiles;
7
+ exports.transformFilesDetailed = transformFilesDetailed;
7
8
  const fs_1 = __importDefault(require("fs"));
8
9
  const path_1 = __importDefault(require("path"));
9
10
  const tailwindMapper_1 = require("./tailwindMapper");
10
11
  const jsxParser_1 = require("./jsxParser");
11
12
  const cssParser_1 = require("./cssParser");
12
- const fileWriter_1 = require("./fileWriter");
13
13
  const logger_1 = require("./utils/logger");
14
14
  const breakpointResolver_1 = require("./utils/breakpointResolver");
15
15
  const variantAssembler_1 = require("./utils/variantAssembler");
16
16
  const jsxDescendantTransformer_1 = require("./jsxDescendantTransformer");
17
17
  const conflictResolver_1 = require("./utils/conflictResolver");
18
+ const variableRegistry_1 = require("./utils/variableRegistry");
18
19
  async function transformFiles(files, options) {
19
- const results = {
20
+ const detailed = await transformFilesDetailed(files, options);
21
+ return {
22
+ filesScanned: detailed.stats.filesScanned,
23
+ filesModified: detailed.stats.filesModified,
24
+ stylesConverted: detailed.stats.utilitiesGenerated,
25
+ classesReplaced: detailed.stats.classesReplaced,
26
+ warnings: detailed.stats.warnings
27
+ };
28
+ }
29
+ async function transformFilesDetailed(files, options) {
30
+ const stats = {
20
31
  filesScanned: files.length,
21
32
  filesModified: 0,
22
- stylesConverted: 0,
33
+ filesUnchanged: 0,
34
+ filesWithError: 0,
35
+ utilitiesGenerated: 0,
23
36
  classesReplaced: 0,
37
+ conflictsResolved: 0,
38
+ unsupportedSelectors: 0,
39
+ errors: 0,
24
40
  warnings: 0
25
41
  };
42
+ const fileResults = [];
26
43
  const mapper = new tailwindMapper_1.TailwindMapper(options.tailwindConfig || {});
27
44
  const jsxParser = new jsxParser_1.JSXParser(mapper);
28
45
  const screens = options.tailwindConfig?.theme?.screens;
29
- const cssParser = new cssParser_1.CSSParser(mapper, screens);
30
- const fileWriter = new fileWriter_1.FileWriter({ dryRun: options.dryRun });
46
+ const sharedVariableRegistry = new variableRegistry_1.VariableRegistry();
47
+ const cssParser = new cssParser_1.CSSParser(mapper, screens, sharedVariableRegistry);
31
48
  (0, breakpointResolver_1.clearBreakpointCache)();
32
49
  const cssClassMap = {};
33
50
  const allDescendantRules = [];
51
+ const cssFiles = files.filter(f => f.type === 'css');
52
+ const jsxFiles = files.filter(f => f.type === 'jsx');
53
+ logger_1.logger.info('\nšŸ” Phase 0: Collecting CSS variables from all files...');
54
+ if (!options.skipExternal) {
55
+ for (const file of cssFiles) {
56
+ try {
57
+ const content = fs_1.default.readFileSync(file.path, 'utf-8');
58
+ await cssParser.collectVariablesOnly(content, file.path);
59
+ }
60
+ catch (error) {
61
+ logger_1.logger.warn(`Failed to collect variables from ${file.path}: ${error}`);
62
+ }
63
+ }
64
+ for (const file of jsxFiles) {
65
+ if (options.skipInternal)
66
+ continue;
67
+ try {
68
+ const content = fs_1.default.readFileSync(file.path, 'utf-8');
69
+ await cssParser.collectVariablesFromInternalCSS(content, file.path);
70
+ }
71
+ catch (error) {
72
+ logger_1.logger.warn(`Failed to collect internal CSS variables from ${file.path}: ${error}`);
73
+ }
74
+ }
75
+ logger_1.logger.verbose(`Collected ${sharedVariableRegistry.getRegisteredVariables().length} unique CSS variables`);
76
+ }
77
+ logger_1.logger.info('\nšŸ” Phase 1: Analyzing CSS files...');
34
78
  const cssFileResults = new Map();
35
- logger_1.logger.info('\nšŸ” Phase 1: Analyzing files...');
36
79
  if (!options.skipExternal) {
37
- for (const file of files.filter(f => f.type === 'css')) {
80
+ for (const file of cssFiles) {
38
81
  try {
39
82
  const content = fs_1.default.readFileSync(file.path, 'utf-8');
40
83
  const result = await cssParser.parse(content, file.path);
@@ -46,7 +89,7 @@ async function transformFiles(files, options) {
46
89
  if (rule.isDescendant) {
47
90
  if (rule.convertedClasses.length > 0) {
48
91
  allDescendantRules.push(rule);
49
- results.stylesConverted += rule.declarations.length;
92
+ stats.utilitiesGenerated += rule.declarations.length;
50
93
  }
51
94
  }
52
95
  else if (rule.className && rule.convertedClasses.length > 0) {
@@ -58,23 +101,25 @@ async function transformFiles(files, options) {
58
101
  cssClassMap[rule.className] = buildClassInfoFromRule(rule, file.path);
59
102
  }
60
103
  if (rule.fullyConverted) {
61
- results.stylesConverted += rule.declarations.length;
104
+ stats.utilitiesGenerated += rule.declarations.length;
62
105
  }
63
106
  else {
64
- results.stylesConverted += rule.convertedClasses.length;
107
+ stats.utilitiesGenerated += rule.convertedClasses.length;
65
108
  logger_1.logger.verbose(` Rule .${rule.className}: partial conversion (${rule.convertedClasses.length}/${rule.declarations.length} declarations)`);
66
109
  }
67
110
  }
68
111
  });
69
112
  cssFileResults.set(file.path, {
113
+ path: file.path,
70
114
  content,
71
115
  newContent: result.css,
72
116
  rules: result.rules,
73
117
  canDelete: result.canDelete,
74
118
  hasChanges: result.hasChanges,
75
- fullyConvertible
119
+ fullyConvertible,
120
+ warnings: result.warnings
76
121
  });
77
- results.warnings += result.warnings.length;
122
+ stats.warnings += result.warnings.length;
78
123
  logger_1.logger.verbose(`Analyzed ${file.path}:`);
79
124
  logger_1.logger.verbose(` - Total rules: ${totalRules}`);
80
125
  logger_1.logger.verbose(` - Fully converted rules: ${fullyConvertedRules}`);
@@ -85,26 +130,41 @@ async function transformFiles(files, options) {
85
130
  });
86
131
  }
87
132
  catch (error) {
133
+ const errorMessage = error instanceof Error ? error.message : String(error);
88
134
  logger_1.logger.error(`Failed to analyze ${file.path}:`, error);
89
- results.warnings++;
135
+ cssFileResults.set(file.path, {
136
+ path: file.path,
137
+ content: '',
138
+ newContent: '',
139
+ rules: [],
140
+ canDelete: false,
141
+ hasChanges: false,
142
+ fullyConvertible: false,
143
+ warnings: [],
144
+ error: errorMessage
145
+ });
146
+ stats.errors++;
147
+ stats.warnings++;
90
148
  }
91
149
  }
92
150
  }
93
151
  logger_1.logger.info('\nāš›ļø Phase 2: Transforming React components...');
94
152
  const jsxFileResults = new Map();
95
- for (const file of files.filter(f => f.type === 'jsx')) {
153
+ for (const file of jsxFiles) {
96
154
  try {
97
155
  let content = fs_1.default.readFileSync(file.path, 'utf-8');
98
156
  const originalContent = content;
99
157
  let hasChanges = false;
100
158
  let fileWarnings = [];
159
+ let utilitiesGenerated = 0;
160
+ let classesReplaced = 0;
101
161
  if (!options.skipInline) {
102
162
  try {
103
163
  const jsxResult = jsxParser.parse(content, file.path);
104
164
  if (jsxResult.hasChanges) {
105
165
  content = jsxResult.code;
106
166
  hasChanges = true;
107
- results.stylesConverted += jsxResult.transformations.reduce((sum, t) => sum + t.classes.length, 0);
167
+ utilitiesGenerated += jsxResult.transformations.reduce((sum, t) => sum + t.classes.length, 0);
108
168
  fileWarnings.push(...jsxResult.warnings);
109
169
  }
110
170
  }
@@ -123,7 +183,7 @@ async function transformFiles(files, options) {
123
183
  if (rule.isDescendant) {
124
184
  if (rule.convertedClasses.length > 0) {
125
185
  allDescendantRules.push(rule);
126
- results.stylesConverted += rule.declarations.length;
186
+ utilitiesGenerated += rule.declarations.length;
127
187
  }
128
188
  }
129
189
  else if (rule.convertedClasses.length > 0 && rule.className) {
@@ -134,7 +194,7 @@ async function transformFiles(files, options) {
134
194
  else {
135
195
  cssClassMap[rule.className] = buildClassInfoFromRule(rule, file.path);
136
196
  }
137
- results.stylesConverted += rule.declarations.length;
197
+ utilitiesGenerated += rule.declarations.length;
138
198
  }
139
199
  });
140
200
  fileWarnings.push(...internalResult.warnings);
@@ -146,30 +206,48 @@ async function transformFiles(files, options) {
146
206
  }
147
207
  }
148
208
  jsxFileResults.set(file.path, {
209
+ path: file.path,
149
210
  content: originalContent,
150
211
  newContent: content,
151
- hasChanges
212
+ hasChanges,
213
+ warnings: fileWarnings,
214
+ utilitiesGenerated,
215
+ classesReplaced
152
216
  });
153
- results.warnings += fileWarnings.length;
217
+ stats.warnings += fileWarnings.length;
154
218
  fileWarnings.forEach(warning => {
155
219
  logger_1.logger.verbose(`āš ļø ${file.path}: ${warning}`);
156
220
  });
157
221
  }
158
222
  catch (error) {
223
+ const errorMessage = error instanceof Error ? error.message : String(error);
159
224
  logger_1.logger.error(`Failed to process ${file.path}:`, error);
160
- results.warnings++;
225
+ jsxFileResults.set(file.path, {
226
+ path: file.path,
227
+ content: '',
228
+ newContent: '',
229
+ hasChanges: false,
230
+ warnings: [],
231
+ utilitiesGenerated: 0,
232
+ classesReplaced: 0,
233
+ error: errorMessage
234
+ });
235
+ stats.errors++;
161
236
  }
162
237
  }
163
238
  if (Object.keys(cssClassMap).length > 0) {
164
239
  logger_1.logger.info('\nšŸ”„ Phase 3: Replacing className references...');
165
240
  for (const [filePath, fileResult] of jsxFileResults) {
241
+ if (fileResult.error)
242
+ continue;
166
243
  let content = fileResult.newContent;
167
244
  let hasChanges = fileResult.hasChanges;
168
245
  const replacementResult = replaceClassNameReferences(content, cssClassMap);
169
246
  if (replacementResult.hasChanges) {
170
247
  content = replacementResult.code;
171
248
  hasChanges = true;
172
- results.classesReplaced += replacementResult.replacements;
249
+ fileResult.classesReplaced += replacementResult.replacements;
250
+ stats.classesReplaced += replacementResult.replacements;
173
251
  logger_1.logger.verbose(`Replaced ${replacementResult.replacements} class references in ${path_1.default.basename(filePath)}`);
174
252
  }
175
253
  jsxFileResults.set(filePath, {
@@ -182,17 +260,20 @@ async function transformFiles(files, options) {
182
260
  if (allDescendantRules.length > 0) {
183
261
  logger_1.logger.info('\n🌳 Phase 3.5: Applying descendant selector rules...');
184
262
  for (const [filePath, fileResult] of jsxFileResults) {
263
+ if (fileResult.error)
264
+ continue;
185
265
  let content = fileResult.newContent;
186
266
  let hasChanges = fileResult.hasChanges;
187
267
  const descendantResult = (0, jsxDescendantTransformer_1.transformDescendantSelectors)(content, allDescendantRules);
188
268
  if (descendantResult.hasChanges) {
189
269
  content = descendantResult.code;
190
270
  hasChanges = true;
191
- results.classesReplaced += descendantResult.transformations;
271
+ fileResult.classesReplaced += descendantResult.transformations;
272
+ stats.classesReplaced += descendantResult.transformations;
192
273
  logger_1.logger.verbose(`Applied ${descendantResult.transformations} descendant transformations in ${path_1.default.basename(filePath)}`);
193
274
  }
194
275
  if (descendantResult.warnings.length > 0) {
195
- results.warnings += descendantResult.warnings.length;
276
+ stats.warnings += descendantResult.warnings.length;
196
277
  descendantResult.warnings.forEach(warning => {
197
278
  logger_1.logger.verbose(`āš ļø ${filePath}: ${warning}`);
198
279
  });
@@ -204,47 +285,69 @@ async function transformFiles(files, options) {
204
285
  });
205
286
  }
206
287
  }
207
- logger_1.logger.info('\nšŸ’¾ Phase 4: Writing changes...');
208
288
  for (const [filePath, fileResult] of jsxFileResults) {
209
- if (fileResult.hasChanges) {
210
- const success = await fileWriter.writeFile(filePath, fileResult.newContent, fileResult.content);
211
- if (success) {
212
- results.filesModified++;
289
+ if (fileResult.error) {
290
+ fileResults.push({
291
+ filePath,
292
+ originalContent: fileResult.content,
293
+ newContent: fileResult.newContent,
294
+ hasChanges: false,
295
+ status: 'error',
296
+ error: fileResult.error
297
+ });
298
+ stats.filesWithError++;
299
+ continue;
300
+ }
301
+ const hasChanges = fileResult.newContent !== fileResult.content;
302
+ fileResults.push({
303
+ filePath,
304
+ originalContent: fileResult.content,
305
+ newContent: fileResult.newContent,
306
+ hasChanges,
307
+ status: hasChanges ? 'modified' : 'unchanged',
308
+ transformations: {
309
+ utilitiesGenerated: fileResult.utilitiesGenerated,
310
+ classesReplaced: fileResult.classesReplaced,
311
+ conflictsResolved: 0
213
312
  }
313
+ });
314
+ if (hasChanges) {
315
+ stats.filesModified++;
316
+ }
317
+ else {
318
+ stats.filesUnchanged++;
214
319
  }
215
320
  }
216
- if (!options.skipExternal) {
217
- for (const [filePath, fileResult] of cssFileResults) {
218
- if (!fileResult.hasChanges)
219
- continue;
220
- if (fileResult.canDelete && options.deleteCss) {
221
- const success = await fileWriter.deleteFile(filePath);
222
- if (success) {
223
- results.filesModified++;
224
- logger_1.logger.info(`šŸ—‘ļø Deleted ${path_1.default.basename(filePath)} (all rules converted)`);
225
- }
226
- }
227
- else if (fileResult.canDelete && !options.deleteCss) {
228
- logger_1.logger.info(`ā„¹ļø ${path_1.default.basename(filePath)} is now empty (use --delete-css to remove)`);
229
- }
230
- else if (fileResult.fullyConvertible) {
231
- const success = await fileWriter.writeFile(filePath, fileResult.newContent, fileResult.content);
232
- if (success) {
233
- results.filesModified++;
234
- }
235
- }
236
- else {
237
- const success = await fileWriter.writeFile(filePath, fileResult.newContent, fileResult.content);
238
- if (success) {
239
- results.filesModified++;
240
- const convertedCount = fileResult.rules.filter(r => r.convertedClasses.length > 0).length;
241
- const totalCount = fileResult.rules.length;
242
- logger_1.logger.info(`šŸ“ ${path_1.default.basename(filePath)}: converted ${convertedCount}/${totalCount} rules (unconverted properties kept)`);
243
- }
244
- }
321
+ for (const [filePath, fileResult] of cssFileResults) {
322
+ if (fileResult.error) {
323
+ fileResults.push({
324
+ filePath,
325
+ originalContent: fileResult.content,
326
+ newContent: fileResult.newContent,
327
+ hasChanges: false,
328
+ status: 'error',
329
+ error: fileResult.error
330
+ });
331
+ stats.filesWithError++;
332
+ continue;
333
+ }
334
+ const hasChanges = fileResult.hasChanges && fileResult.newContent !== fileResult.content;
335
+ fileResults.push({
336
+ filePath,
337
+ originalContent: fileResult.content,
338
+ newContent: fileResult.newContent,
339
+ hasChanges,
340
+ status: hasChanges ? 'modified' : 'unchanged'
341
+ });
342
+ if (hasChanges) {
343
+ stats.filesModified++;
344
+ }
345
+ else {
346
+ stats.filesUnchanged++;
245
347
  }
246
348
  }
247
- return results;
349
+ stats.utilitiesGenerated = stats.classesReplaced + stats.utilitiesGenerated;
350
+ return { fileResults, stats };
248
351
  }
249
352
  function buildClassInfoFromRule(rule, sourceFile) {
250
353
  return {
@@ -336,4 +439,4 @@ function replaceClassNameReferences(code, classMap) {
336
439
  });
337
440
  return { code: modifiedCode, hasChanges, replacements };
338
441
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF5REEsd0NBa1JDO0FBM1VELDRDQUFvQjtBQUNwQixnREFBd0I7QUFFeEIscURBQWtEO0FBQ2xELDJDQUF3QztBQUN4QywyQ0FBcUU7QUFDckUsNkNBQTBDO0FBRTFDLDJDQUF3QztBQUN4QyxtRUFBa0U7QUFDbEUsK0RBSWtDO0FBQ2xDLHlFQUEwRTtBQUMxRSwrREFLa0M7QUFvQzNCLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQW9CLEVBQ3BCLE9BQXlCO0lBRXpCLE1BQU0sT0FBTyxHQUFxQjtRQUNoQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDMUIsYUFBYSxFQUFFLENBQUM7UUFDaEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsUUFBUSxFQUFFLENBQUM7S0FDWixDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSwrQkFBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUU5RCxJQUFBLHlDQUFvQixHQUFFLENBQUM7SUFFdkIsTUFBTSxXQUFXLEdBQWdCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGtCQUFrQixHQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLGNB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QyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGNBQWMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRixVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixZQUFZLEVBQUUsQ0FBQztnQkFDZixlQUFNLENBQUMsT0FBTyxDQUFDLDRCQUE0QixRQUFRLFVBQVUsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNjYW5uZWRGaWxlIH0gZnJvbSAnLi9zY2FubmVyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyIH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBKU1hQYXJzZXIgfSBmcm9tICcuL2pzeFBhcnNlcic7XG5pbXBvcnQgeyBDU1NQYXJzZXIsIENTU1J1bGUsIFV0aWxpdHlXaXRoVmFyaWFudCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmltcG9ydCB7IEZpbGVXcml0ZXIgfSBmcm9tICcuL2ZpbGVXcml0ZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBjbGVhckJyZWFrcG9pbnRDYWNoZSB9IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmltcG9ydCB7IFxuICBhc3NlbWJsZVV0aWxpdGllcywgXG4gIG1lcmdlVXRpbGl0aWVzLFxuICBub3JtYWxpemVWYXJpYW50T3JkZXIgXG59IGZyb20gJy4vdXRpbHMvdmFyaWFudEFzc2VtYmxlcic7XG5pbXBvcnQgeyB0cmFuc2Zvcm1EZXNjZW5kYW50U2VsZWN0b3JzIH0gZnJvbSAnLi9qc3hEZXNjZW5kYW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgXG4gIFV0aWxpdHlXaXRoTWV0YSwgXG4gIFJlc29sdmVkVXRpbGl0eSwgXG4gIHJlc29sdmVDb25mbGljdHMsIFxuICByZXNvbHZlZFV0aWxpdGllc1RvU3RyaW5ncyBcbn0gZnJvbSAnLi91dGlscy9jb25mbGljdFJlc29sdmVyJztcbmltcG9ydCB7IFNwZWNpZmljaXR5LCBaRVJPX1NQRUNJRklDSVRZIH0gZnJvbSAnLi91dGlscy9zcGVjaWZpY2l0eUNhbGN1bGF0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybU9wdGlvbnMge1xuICBkcnlSdW46IGJvb2xlYW47XG4gIGRlbGV0ZUNzczogYm9vbGVhbjtcbiAgc2tpcEV4dGVybmFsOiBib29sZWFuO1xuICBza2lwSW5saW5lOiBib29sZWFuO1xuICBza2lwSW50ZXJuYWw6IGJvb2xlYW47XG4gIHRhaWx3aW5kQ29uZmlnOiBUYWlsd2luZENvbmZpZyB8IG51bGw7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtUmVzdWx0cyB7XG4gIGZpbGVzU2Nhbm5lZDogbnVtYmVyO1xuICBmaWxlc01vZGlmaWVkOiBudW1iZXI7XG4gIHN0eWxlc0NvbnZlcnRlZDogbnVtYmVyO1xuICBjbGFzc2VzUmVwbGFjZWQ6IG51bWJlcjtcbiAgd2FybmluZ3M6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENsYXNzSW5mbyB7XG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhNZXRhW107XG4gIHNvdXJjZUZpbGU6IHN0cmluZztcbiAgZnVsbHlDb252ZXJ0aWJsZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENTU0NsYXNzTWFwIHtcbiAgW2NsYXNzTmFtZTogc3RyaW5nXTogQ2xhc3NJbmZvO1xufVxuXG5pbnRlcmZhY2UgQ29sbGVjdGVkUnVsZXMge1xuICBzaW1wbGVSdWxlczogQ1NTUnVsZVtdO1xuICBkZXNjZW5kYW50UnVsZXM6IENTU1J1bGVbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZpbGVzKFxuICBmaWxlczogU2Nhbm5lZEZpbGVbXSxcbiAgb3B0aW9uczogVHJhbnNmb3JtT3B0aW9uc1xuKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHRzPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRyYW5zZm9ybVJlc3VsdHMgPSB7XG4gICAgZmlsZXNTY2FubmVkOiBmaWxlcy5sZW5ndGgsXG4gICAgZmlsZXNNb2RpZmllZDogMCxcbiAgICBzdHlsZXNDb252ZXJ0ZWQ6IDAsXG4gICAgY2xhc3Nlc1JlcGxhY2VkOiAwLFxuICAgIHdhcm5pbmdzOiAwXG4gIH07XG5cbiAgY29uc3QgbWFwcGVyID0gbmV3IFRhaWx3aW5kTWFwcGVyKG9wdGlvbnMudGFpbHdpbmRDb25maWcgfHwge30pO1xuICBjb25zdCBqc3hQYXJzZXIgPSBuZXcgSlNYUGFyc2VyKG1hcHBlcik7XG4gIGNvbnN0IHNjcmVlbnMgPSBvcHRpb25zLnRhaWx3aW5kQ29uZmlnPy50aGVtZT8uc2NyZWVucztcbiAgY29uc3QgY3NzUGFyc2VyID0gbmV3IENTU1BhcnNlcihtYXBwZXIsIHNjcmVlbnMpO1xuICBjb25zdCBmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoeyBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuIH0pO1xuXG4gIGNsZWFyQnJlYWtwb2ludENhY2hlKCk7XG5cbiAgY29uc3QgY3NzQ2xhc3NNYXA6IENTU0NsYXNzTWFwID0ge307XG4gIGNvbnN0IGFsbERlc2NlbmRhbnRSdWxlczogQ1NTUnVsZVtdID0gW107XG4gIGNvbnN0IGNzc0ZpbGVSZXN1bHRzOiBNYXA8c3RyaW5nLCB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5ld0NvbnRlbnQ6IHN0cmluZztcbiAgICBydWxlczogQ1NTUnVsZVtdO1xuICAgIGNhbkRlbGV0ZTogYm9vbGVhbjtcbiAgICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICAgIGZ1bGx5Q29udmVydGlibGU6IGJvb2xlYW47XG4gIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGxvZ2dlci5pbmZvKCdcXG7wn5SNIFBoYXNlIDE6IEFuYWx5emluZyBmaWxlcy4uLicpO1xuXG4gIGlmICghb3B0aW9ucy5za2lwRXh0ZXJuYWwpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnY3NzJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3NzUGFyc2VyLnBhcnNlKGNvbnRlbnQsIGZpbGUucGF0aCk7XG5cbiAgICAgICAgY29uc3QgdG90YWxSdWxlcyA9IHJlc3VsdC5ydWxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZ1bGx5Q29udmVydGVkUnVsZXMgPSByZXN1bHQucnVsZXMuZmlsdGVyKHIgPT4gci5mdWxseUNvbnZlcnRlZCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXJ0aWFsbHlDb252ZXJ0ZWRSdWxlcyA9IHJlc3VsdC5ydWxlcy5maWx0ZXIociA9PiByLnBhcnRpYWxDb252ZXJzaW9uKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZ1bGx5Q29udmVydGlibGUgPSB0b3RhbFJ1bGVzID4gMCAmJiB0b3RhbFJ1bGVzID09PSBmdWxseUNvbnZlcnRlZFJ1bGVzICYmIHBhcnRpYWxseUNvbnZlcnRlZFJ1bGVzID09PSAwO1xuXG4gICAgICAgIHJlc3VsdC5ydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgIGlmIChydWxlLmlzRGVzY2VuZGFudCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGFsbERlc2NlbmRhbnRSdWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydWxlLmNsYXNzTmFtZSAmJiBydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV07XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgbWVyZ2VSdWxlSW50b0NsYXNzSW5mbyhleGlzdGluZywgcnVsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV0gPSBidWlsZENsYXNzSW5mb0Zyb21SdWxlKHJ1bGUsIGZpbGUucGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZS5mdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoO1xuICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgICBSdWxlIC4ke3J1bGUuY2xhc3NOYW1lfTogcGFydGlhbCBjb252ZXJzaW9uICgke3J1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGh9LyR7cnVsZS5kZWNsYXJhdGlvbnMubGVuZ3RofSBkZWNsYXJhdGlvbnMpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjc3NGaWxlUmVzdWx0cy5zZXQoZmlsZS5wYXRoLCB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBuZXdDb250ZW50OiByZXN1bHQuY3NzLFxuICAgICAgICAgIHJ1bGVzOiByZXN1bHQucnVsZXMsXG4gICAgICAgICAgY2FuRGVsZXRlOiByZXN1bHQuY2FuRGVsZXRlLFxuICAgICAgICAgIGhhc0NoYW5nZXM6IHJlc3VsdC5oYXNDaGFuZ2VzLFxuICAgICAgICAgIGZ1bGx5Q29udmVydGlibGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzdWx0cy53YXJuaW5ncyArPSByZXN1bHQud2FybmluZ3MubGVuZ3RoO1xuXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBBbmFseXplZCAke2ZpbGUucGF0aH06YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIC0gVG90YWwgcnVsZXM6ICR7dG90YWxSdWxlc31gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBGdWxseSBjb252ZXJ0ZWQgcnVsZXM6ICR7ZnVsbHlDb252ZXJ0ZWRSdWxlc31gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBQYXJ0aWFsbHkgY29udmVydGVkIHJ1bGVzOiAke3BhcnRpYWxseUNvbnZlcnRlZFJ1bGVzfWApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIEZ1bGx5IGNvbnZlcnRpYmxlOiAke2Z1bGx5Q29udmVydGlibGV9YCk7XG5cbiAgICAgICAgcmVzdWx0Lndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYOKaoO+4jyAgJHtmaWxlLnBhdGh9OiAke3dhcm5pbmd9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhbmFseXplICR7ZmlsZS5wYXRofTpgLCBlcnJvcik7XG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbygnXFxu4pqb77iPICBQaGFzZSAyOiBUcmFuc2Zvcm1pbmcgUmVhY3QgY29tcG9uZW50cy4uLicpO1xuXG4gIGNvbnN0IGpzeEZpbGVSZXN1bHRzOiBNYXA8c3RyaW5nLCB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5ld0NvbnRlbnQ6IHN0cmluZztcbiAgICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICB9PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnanN4JykpIHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGNvbnRlbnQ7XG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgbGV0IGZpbGVXYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKCFvcHRpb25zLnNraXBJbmxpbmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc3hSZXN1bHQgPSBqc3hQYXJzZXIucGFyc2UoY29udGVudCwgZmlsZS5wYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoanN4UmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBqc3hSZXN1bHQuY29kZTtcbiAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgICAgcmVzdWx0cy5zdHlsZXNDb252ZXJ0ZWQgKz0ganN4UmVzdWx0LnRyYW5zZm9ybWF0aW9ucy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChzdW0sIHQpID0+IHN1bSArIHQuY2xhc3Nlcy5sZW5ndGgsIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaCguLi5qc3hSZXN1bHQud2FybmluZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIEpTWCBpbmxpbmUgc3R5bGVzIGluICR7ZmlsZS5wYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaChgSlNYIHBhcnNlIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy5za2lwSW50ZXJuYWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBpbnRlcm5hbFJlc3VsdCA9IGF3YWl0IGNzc1BhcnNlci5wYXJzZUludGVybmFsQ1NTKGNvbnRlbnQsIGZpbGUucGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGludGVybmFsUmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBpbnRlcm5hbFJlc3VsdC5odG1sO1xuICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGludGVybmFsUmVzdWx0LnJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICAgIGlmIChydWxlLmlzRGVzY2VuZGFudCkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgYWxsRGVzY2VuZGFudFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwICYmIHJ1bGUuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICBtZXJnZVJ1bGVJbnRvQ2xhc3NJbmZvKGV4aXN0aW5nLCBydWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY3NzQ2xhc3NNYXBbcnVsZS5jbGFzc05hbWVdID0gYnVpbGRDbGFzc0luZm9Gcm9tUnVsZShydWxlLCBmaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaCguLi5pbnRlcm5hbFJlc3VsdC53YXJuaW5ncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgQ1NTIGluICR7ZmlsZS5wYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaChgSW50ZXJuYWwgQ1NTIHBhcnNlIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGpzeEZpbGVSZXN1bHRzLnNldChmaWxlLnBhdGgsIHtcbiAgICAgICAgY29udGVudDogb3JpZ2luYWxDb250ZW50LFxuICAgICAgICBuZXdDb250ZW50OiBjb250ZW50LFxuICAgICAgICBoYXNDaGFuZ2VzXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0cy53YXJuaW5ncyArPSBmaWxlV2FybmluZ3MubGVuZ3RoO1xuXG4gICAgICBmaWxlV2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYOKaoO+4jyAgJHtmaWxlLnBhdGh9OiAke3dhcm5pbmd9YCk7XG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzICR7ZmlsZS5wYXRofTpgLCBlcnJvcik7XG4gICAgICByZXN1bHRzLndhcm5pbmdzKys7XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGNzc0NsYXNzTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1xcbvCflIQgUGhhc2UgMzogUmVwbGFjaW5nIGNsYXNzTmFtZSByZWZlcmVuY2VzLi4uJyk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZmlsZVJlc3VsdF0gb2YganN4RmlsZVJlc3VsdHMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gZmlsZVJlc3VsdC5uZXdDb250ZW50O1xuICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmaWxlUmVzdWx0Lmhhc0NoYW5nZXM7XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50UmVzdWx0ID0gcmVwbGFjZUNsYXNzTmFtZVJlZmVyZW5jZXMoY29udGVudCwgY3NzQ2xhc3NNYXApO1xuICAgICAgaWYgKHJlcGxhY2VtZW50UmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgY29udGVudCA9IHJlcGxhY2VtZW50UmVzdWx0LmNvZGU7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXN1bHRzLmNsYXNzZXNSZXBsYWNlZCArPSByZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHM7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgJHtyZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHN9IGNsYXNzIHJlZmVyZW5jZXMgaW4gJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1gKTtcbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGVQYXRoLCB7XG4gICAgICAgIC4uLmZpbGVSZXN1bHQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxEZXNjZW5kYW50UnVsZXMubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci5pbmZvKCdcXG7wn4yzIFBoYXNlIDMuNTogQXBwbHlpbmcgZGVzY2VuZGFudCBzZWxlY3RvciBydWxlcy4uLicpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGpzeEZpbGVSZXN1bHRzKSB7XG4gICAgICBsZXQgY29udGVudCA9IGZpbGVSZXN1bHQubmV3Q29udGVudDtcbiAgICAgIGxldCBoYXNDaGFuZ2VzID0gZmlsZVJlc3VsdC5oYXNDaGFuZ2VzO1xuXG4gICAgICBjb25zdCBkZXNjZW5kYW50UmVzdWx0ID0gdHJhbnNmb3JtRGVzY2VuZGFudFNlbGVjdG9ycyhjb250ZW50LCBhbGxEZXNjZW5kYW50UnVsZXMpO1xuICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICBjb250ZW50ID0gZGVzY2VuZGFudFJlc3VsdC5jb2RlO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0cy5jbGFzc2VzUmVwbGFjZWQgKz0gZGVzY2VuZGFudFJlc3VsdC50cmFuc2Zvcm1hdGlvbnM7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIudmVyYm9zZShgQXBwbGllZCAke2Rlc2NlbmRhbnRSZXN1bHQudHJhbnNmb3JtYXRpb25zfSBkZXNjZW5kYW50IHRyYW5zZm9ybWF0aW9ucyBpbiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MgKz0gZGVzY2VuZGFudFJlc3VsdC53YXJuaW5ncy5sZW5ndGg7XG4gICAgICAgIGRlc2NlbmRhbnRSZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShg4pqg77iPICAke2ZpbGVQYXRofTogJHt3YXJuaW5nfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGVQYXRoLCB7XG4gICAgICAgIC4uLmZpbGVSZXN1bHQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKCdcXG7wn5K+IFBoYXNlIDQ6IFdyaXRpbmcgY2hhbmdlcy4uLicpO1xuXG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBqc3hGaWxlUmVzdWx0cykge1xuICAgIGlmIChmaWxlUmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaWxlV3JpdGVyLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZVJlc3VsdC5uZXdDb250ZW50LCBmaWxlUmVzdWx0LmNvbnRlbnQpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRpb25zLnNraXBFeHRlcm5hbCkge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBjc3NGaWxlUmVzdWx0cykge1xuICAgICAgaWYgKCFmaWxlUmVzdWx0Lmhhc0NoYW5nZXMpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoZmlsZVJlc3VsdC5jYW5EZWxldGUgJiYgb3B0aW9ucy5kZWxldGVDc3MpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZpbGVXcml0ZXIuZGVsZXRlRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYPCfl5HvuI8gIERlbGV0ZWQgJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX0gKGFsbCBydWxlcyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsZVJlc3VsdC5jYW5EZWxldGUgJiYgIW9wdGlvbnMuZGVsZXRlQ3NzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGDihLnvuI8gICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9IGlzIG5vdyBlbXB0eSAodXNlIC0tZGVsZXRlLWNzcyB0byByZW1vdmUpYCk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVSZXN1bHQuZnVsbHlDb252ZXJ0aWJsZSkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgZmlsZVdyaXRlci53cml0ZUZpbGUoZmlsZVBhdGgsIGZpbGVSZXN1bHQubmV3Q29udGVudCwgZmlsZVJlc3VsdC5jb250ZW50KTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN1bHRzLmZpbGVzTW9kaWZpZWQrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZpbGVXcml0ZXIud3JpdGVGaWxlKGZpbGVQYXRoLCBmaWxlUmVzdWx0Lm5ld0NvbnRlbnQsIGZpbGVSZXN1bHQuY29udGVudCk7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICAgICAgY29uc3QgY29udmVydGVkQ291bnQgPSBmaWxlUmVzdWx0LnJ1bGVzLmZpbHRlcihyID0+IHIuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IGZpbGVSZXN1bHQucnVsZXMubGVuZ3RoO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGDwn5OdICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9OiBjb252ZXJ0ZWQgJHtjb252ZXJ0ZWRDb3VudH0vJHt0b3RhbENvdW50fSBydWxlcyAodW5jb252ZXJ0ZWQgcHJvcGVydGllcyBrZXB0KWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xhc3NJbmZvRnJvbVJ1bGUocnVsZTogQ1NTUnVsZSwgc291cmNlRmlsZTogc3RyaW5nKTogQ2xhc3NJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICB1dGlsaXRpZXM6IHJ1bGUudXRpbGl0aWVzLm1hcCh1ID0+ICh7XG4gICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnUudmFyaWFudHNdKSxcbiAgICAgIGNzc1Byb3BlcnR5OiB1LmNzc1Byb3BlcnR5LFxuICAgICAgc3BlY2lmaWNpdHk6IHUuc3BlY2lmaWNpdHksXG4gICAgICBzb3VyY2VPcmRlcjogdS5zb3VyY2VPcmRlcixcbiAgICAgIG9yaWdpbmFsU2VsZWN0b3I6IHJ1bGUuc2VsZWN0b3JcbiAgICB9KSksXG4gICAgc291cmNlRmlsZSxcbiAgICBmdWxseUNvbnZlcnRpYmxlOiBydWxlLmZ1bGx5Q29udmVydGVkXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUludG9DbGFzc0luZm8oaW5mbzogQ2xhc3NJbmZvLCBydWxlOiBDU1NSdWxlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdXRpbGl0eSBvZiBydWxlLnV0aWxpdGllcykge1xuICAgIGNvbnN0IHV0aWxpdHlXaXRoTWV0YTogVXRpbGl0eVdpdGhNZXRhID0ge1xuICAgICAgdmFsdWU6IHV0aWxpdHkudmFsdWUsXG4gICAgICB2YXJpYW50czogbm9ybWFsaXplVmFyaWFudE9yZGVyKFsuLi51dGlsaXR5LnZhcmlhbnRzXSksXG4gICAgICBjc3NQcm9wZXJ0eTogdXRpbGl0eS5jc3NQcm9wZXJ0eSxcbiAgICAgIHNwZWNpZmljaXR5OiB1dGlsaXR5LnNwZWNpZmljaXR5LFxuICAgICAgc291cmNlT3JkZXI6IHV0aWxpdHkuc291cmNlT3JkZXIsXG4gICAgICBvcmlnaW5hbFNlbGVjdG9yOiBydWxlLnNlbGVjdG9yXG4gICAgfTtcbiAgICBcbiAgICBpbmZvLnV0aWxpdGllcy5wdXNoKHV0aWxpdHlXaXRoTWV0YSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZW1ibGVUYWlsd2luZENsYXNzZXMoaW5mbzogQ2xhc3NJbmZvKTogc3RyaW5nIHtcbiAgY29uc3QgeyByZXNvbHZlZCB9ID0gcmVzb2x2ZUNvbmZsaWN0cyhpbmZvLnV0aWxpdGllcywgZmFsc2UpO1xuICByZXR1cm4gcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3MocmVzb2x2ZWQpLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNsYXNzTmFtZVJlZmVyZW5jZXMoXG4gIGNvZGU6IHN0cmluZywgXG4gIGNsYXNzTWFwOiBDU1NDbGFzc01hcFxuKTogeyBcbiAgY29kZTogc3RyaW5nOyBcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjsgXG4gIHJlcGxhY2VtZW50czogbnVtYmVyIFxufSB7XG4gIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gIGxldCByZXBsYWNlbWVudHMgPSAwO1xuICBsZXQgbW9kaWZpZWRDb2RlID0gY29kZTtcblxuICBPYmplY3QuZW50cmllcyhjbGFzc01hcCkuZm9yRWFjaCgoW29sZENsYXNzLCBpbmZvXSkgPT4ge1xuICAgIGlmIChpbmZvLnV0aWxpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWlsd2luZENsYXNzU3RyaW5nID0gYXNzZW1ibGVUYWlsd2luZENsYXNzZXMoaW5mbyk7XG4gICAgXG4gICAgaWYgKGluZm8uZnVsbHlDb252ZXJ0aWJsZSkge1xuICAgICAgY29uc3QgcGF0dGVybjEgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiYCwgJ2cnKTtcbiAgICAgIGlmIChwYXR0ZXJuMS50ZXN0KG1vZGlmaWVkQ29kZSkpIHtcbiAgICAgICAgbW9kaWZpZWRDb2RlID0gbW9kaWZpZWRDb2RlLnJlcGxhY2UocGF0dGVybjEsIGBjbGFzc05hbWU9XCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHJlcGxhY2VtZW50cysrO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgY2xhc3NOYW1lPVwiJHtvbGRDbGFzc31cIiB3aXRoIFwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4yID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVxcXFx7XCIke29sZENsYXNzfVwiXFxcXH1gLCAnZycpO1xuICAgICAgaWYgKHBhdHRlcm4yLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMiwgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9e1wiJHtvbGRDbGFzc31cIn0gd2l0aCBcIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuMyA9IG5ldyBSZWdFeHAoYGNsYXNzTmFtZT1cXFxce1xcYFxcXFxzKiR7b2xkQ2xhc3N9XFxcXHMqXFxgXFxcXH1gLCAnZycpO1xuICAgICAgaWYgKHBhdHRlcm4zLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMywgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9e1xcYCR7b2xkQ2xhc3N9XFxgfSB3aXRoIFwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkQ2xhc3NTdHJpbmcgPSBgJHtvbGRDbGFzc30gJHt0YWlsd2luZENsYXNzU3RyaW5nfWA7XG4gICAgICBcbiAgICAgIGNvbnN0IHBhdHRlcm4xID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVwiJHtvbGRDbGFzc31cImAsICdnJyk7XG4gICAgICBpZiAocGF0dGVybjEudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICAgIG1vZGlmaWVkQ29kZSA9IG1vZGlmaWVkQ29kZS5yZXBsYWNlKHBhdHRlcm4xLCBgY2xhc3NOYW1lPVwiJHtjb21iaW5lZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYEFwcGVuZGVkIHRvIGNsYXNzTmFtZT1cIiR7b2xkQ2xhc3N9XCIg4oaSIFwiJHtjb21iaW5lZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4yID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVxcXFx7XCIke29sZENsYXNzfVwiXFxcXH1gLCAnZycpO1xuICAgICAgaWYgKHBhdHRlcm4yLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMiwgYGNsYXNzTmFtZT1cIiR7Y29tYmluZWRDbGFzc1N0cmluZ31cImApO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBBcHBlbmRlZCB0byBjbGFzc05hbWU9e1wiJHtvbGRDbGFzc31cIn0g4oaSIFwiJHtjb21iaW5lZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4zID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVxcXFx7XFxgXFxcXHMqJHtvbGRDbGFzc31cXFxccypcXGBcXFxcfWAsICdnJyk7XG4gICAgICBpZiAocGF0dGVybjMudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICAgIG1vZGlmaWVkQ29kZSA9IG1vZGlmaWVkQ29kZS5yZXBsYWNlKHBhdHRlcm4zLCBgY2xhc3NOYW1lPVwiJHtjb21iaW5lZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYEFwcGVuZGVkIHRvIGNsYXNzTmFtZT17XFxgJHtvbGRDbGFzc31cXGB9IOKGkiBcIiR7Y29tYmluZWRDbGFzc1N0cmluZ31cImApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogbW9kaWZpZWRDb2RlLCBoYXNDaGFuZ2VzLCByZXBsYWNlbWVudHMgfTtcbn0iXX0=
442
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErRUEsd0NBWUM7QUFFRCx3REErV0M7QUE1Y0QsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUV4QixxREFBa0Q7QUFDbEQsMkNBQXdDO0FBQ3hDLDJDQUFxRTtBQUVyRSwyQ0FBd0M7QUFDeEMsbUVBQWtFO0FBQ2xFLCtEQUdrQztBQUNsQyx5RUFBMEU7QUFDMUUsK0RBSWtDO0FBR2xDLCtEQUE0RDtBQTBEckQsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBb0IsRUFDcEIsT0FBeUI7SUFFekIsTUFBTSxRQUFRLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsT0FBTztRQUNMLFlBQVksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVk7UUFDekMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYTtRQUMzQyxlQUFlLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7UUFDbEQsZUFBZSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZTtRQUMvQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRO0tBQ2xDLENBQUM7QUFDSixDQUFDO0FBRU0sS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxLQUFvQixFQUNwQixPQUF5QjtJQUV6QixNQUFNLEtBQUssR0FBaUI7UUFDMUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQzFCLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLGtCQUFrQixFQUFFLENBQUM7UUFDckIsZUFBZSxFQUFFLENBQUM7UUFDbEIsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQixvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxD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WUFBWSxFQUFFLENBQUM7Z0JBQ2YsZUFBTSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsUUFBUSxVQUFVLG1CQUFtQixHQUFHLENBQUMsQ0FBQztZQUN2RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTY2FubmVkRmlsZSB9IGZyb20gJy4vc2Nhbm5lcic7XG5pbXBvcnQgeyBUYWlsd2luZE1hcHBlciB9IGZyb20gJy4vdGFpbHdpbmRNYXBwZXInO1xuaW1wb3J0IHsgSlNYUGFyc2VyIH0gZnJvbSAnLi9qc3hQYXJzZXInO1xuaW1wb3J0IHsgQ1NTUGFyc2VyLCBDU1NSdWxlLCBVdGlsaXR5V2l0aFZhcmlhbnQgfSBmcm9tICcuL2Nzc1BhcnNlcic7XG5pbXBvcnQgeyBUYWlsd2luZENvbmZpZyB9IGZyb20gJy4vdXRpbHMvY29uZmlnJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGNsZWFyQnJlYWtwb2ludENhY2hlIH0gZnJvbSAnLi91dGlscy9icmVha3BvaW50UmVzb2x2ZXInO1xuaW1wb3J0IHsgXG4gIGFzc2VtYmxlVXRpbGl0aWVzLCBcbiAgbm9ybWFsaXplVmFyaWFudE9yZGVyIFxufSBmcm9tICcuL3V0aWxzL3ZhcmlhbnRBc3NlbWJsZXInO1xuaW1wb3J0IHsgdHJhbnNmb3JtRGVzY2VuZGFudFNlbGVjdG9ycyB9IGZyb20gJy4vanN4RGVzY2VuZGFudFRyYW5zZm9ybWVyJztcbmltcG9ydCB7IFxuICBVdGlsaXR5V2l0aE1ldGEsIFxuICByZXNvbHZlQ29uZmxpY3RzLCBcbiAgcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3MgXG59IGZyb20gJy4vdXRpbHMvY29uZmxpY3RSZXNvbHZlcic7XG5pbXBvcnQgeyBTcGVjaWZpY2l0eSB9IGZyb20gJy4vdXRpbHMvc3BlY2lmaWNpdHlDYWxjdWxhdG9yJztcbmltcG9ydCB7IEZpbGVSZXN1bHQsIFN1bW1hcnlTdGF0cyB9IGZyb20gJy4vdXRpbHMvcmVwb3J0ZXInO1xuaW1wb3J0IHsgVmFyaWFibGVSZWdpc3RyeSB9IGZyb20gJy4vdXRpbHMvdmFyaWFibGVSZWdpc3RyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtT3B0aW9ucyB7XG4gIGRyeVJ1bjogYm9vbGVhbjtcbiAgZGVsZXRlQ3NzOiBib29sZWFuO1xuICBza2lwRXh0ZXJuYWw6IGJvb2xlYW47XG4gIHNraXBJbmxpbmU6IGJvb2xlYW47XG4gIHNraXBJbnRlcm5hbDogYm9vbGVhbjtcbiAgdGFpbHdpbmRDb25maWc6IFRhaWx3aW5kQ29uZmlnIHwgbnVsbDtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRzIHtcbiAgZmlsZXNTY2FubmVkOiBudW1iZXI7XG4gIGZpbGVzTW9kaWZpZWQ6IG51bWJlcjtcbiAgc3R5bGVzQ29udmVydGVkOiBudW1iZXI7XG4gIGNsYXNzZXNSZXBsYWNlZDogbnVtYmVyO1xuICB3YXJuaW5nczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbGVkVHJhbnNmb3JtUmVzdWx0cyB7XG4gIGZpbGVSZXN1bHRzOiBGaWxlUmVzdWx0W107XG4gIHN0YXRzOiBTdW1tYXJ5U3RhdHM7XG59XG5cbmludGVyZmFjZSBDbGFzc0luZm8ge1xuICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoTWV0YVtdO1xuICBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGZ1bGx5Q29udmVydGlibGU6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDU1NDbGFzc01hcCB7XG4gIFtjbGFzc05hbWU6IHN0cmluZ106IENsYXNzSW5mbztcbn1cblxuaW50ZXJmYWNlIFByb2Nlc3NlZENTU0ZpbGUge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgbmV3Q29udGVudDogc3RyaW5nO1xuICBydWxlczogQ1NTUnVsZVtdO1xuICBjYW5EZWxldGU6IGJvb2xlYW47XG4gIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gIGZ1bGx5Q29udmVydGlibGU6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQcm9jZXNzZWRKU1hGaWxlIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIG5ld0NvbnRlbnQ6IHN0cmluZztcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICBlcnJvcj86IHN0cmluZztcbiAgdXRpbGl0aWVzR2VuZXJhdGVkOiBudW1iZXI7XG4gIGNsYXNzZXNSZXBsYWNlZDogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtRmlsZXMoXG4gIGZpbGVzOiBTY2FubmVkRmlsZVtdLFxuICBvcHRpb25zOiBUcmFuc2Zvcm1PcHRpb25zXG4pOiBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdHM+IHtcbiAgY29uc3QgZGV0YWlsZWQgPSBhd2FpdCB0cmFuc2Zvcm1GaWxlc0RldGFpbGVkKGZpbGVzLCBvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlc1NjYW5uZWQ6IGRldGFpbGVkLnN0YXRzLmZpbGVzU2Nhbm5lZCxcbiAgICBmaWxlc01vZGlmaWVkOiBkZXRhaWxlZC5zdGF0cy5maWxlc01vZGlmaWVkLFxuICAgIHN0eWxlc0NvbnZlcnRlZDogZGV0YWlsZWQuc3RhdHMudXRpbGl0aWVzR2VuZXJhdGVkLFxuICAgIGNsYXNzZXNSZXBsYWNlZDogZGV0YWlsZWQuc3RhdHMuY2xhc3Nlc1JlcGxhY2VkLFxuICAgIHdhcm5pbmdzOiBkZXRhaWxlZC5zdGF0cy53YXJuaW5nc1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtRmlsZXNEZXRhaWxlZChcbiAgZmlsZXM6IFNjYW5uZWRGaWxlW10sXG4gIG9wdGlvbnM6IFRyYW5zZm9ybU9wdGlvbnNcbik6IFByb21pc2U8RGV0YWlsZWRUcmFuc2Zvcm1SZXN1bHRzPiB7XG4gIGNvbnN0IHN0YXRzOiBTdW1tYXJ5U3RhdHMgPSB7XG4gICAgZmlsZXNTY2FubmVkOiBmaWxlcy5sZW5ndGgsXG4gICAgZmlsZXNNb2RpZmllZDogMCxcbiAgICBmaWxlc1VuY2hhbmdlZDogMCxcbiAgICBmaWxlc1dpdGhFcnJvcjogMCxcbiAgICB1dGlsaXRpZXNHZW5lcmF0ZWQ6IDAsXG4gICAgY2xhc3Nlc1JlcGxhY2VkOiAwLFxuICAgIGNvbmZsaWN0c1Jlc29sdmVkOiAwLFxuICAgIHVuc3VwcG9ydGVkU2VsZWN0b3JzOiAwLFxuICAgIGVycm9yczogMCxcbiAgICB3YXJuaW5nczogMFxuICB9O1xuXG4gIGNvbnN0IGZpbGVSZXN1bHRzOiBGaWxlUmVzdWx0W10gPSBbXTtcblxuICBjb25zdCBtYXBwZXIgPSBuZXcgVGFpbHdpbmRNYXBwZXIob3B0aW9ucy50YWlsd2luZENvbmZpZyB8fCB7fSk7XG4gIGNvbnN0IGpzeFBhcnNlciA9IG5ldyBKU1hQYXJzZXIobWFwcGVyKTtcbiAgY29uc3Qgc2NyZWVucyA9IG9wdGlvbnMudGFpbHdpbmRDb25maWc/LnRoZW1lPy5zY3JlZW5zO1xuICBcbiAgY29uc3Qgc2hhcmVkVmFyaWFibGVSZWdpc3RyeSA9IG5ldyBWYXJpYWJsZVJlZ2lzdHJ5KCk7XG4gIGNvbnN0IGNzc1BhcnNlciA9IG5ldyBDU1NQYXJzZXIobWFwcGVyLCBzY3JlZW5zLCBzaGFyZWRWYXJpYWJsZVJlZ2lzdHJ5KTtcblxuICBjbGVhckJyZWFrcG9pbnRDYWNoZSgpO1xuXG4gIGNvbnN0IGNzc0NsYXNzTWFwOiBDU1NDbGFzc01hcCA9IHt9O1xuICBjb25zdCBhbGxEZXNjZW5kYW50UnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuXG4gIGNvbnN0IGNzc0ZpbGVzID0gZmlsZXMuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnY3NzJyk7XG4gIGNvbnN0IGpzeEZpbGVzID0gZmlsZXMuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnanN4Jyk7XG5cbiAgbG9nZ2VyLmluZm8oJ1xcbvCflI0gUGhhc2UgMDogQ29sbGVjdGluZyBDU1MgdmFyaWFibGVzIGZyb20gYWxsIGZpbGVzLi4uJyk7XG5cbiAgaWYgKCFvcHRpb25zLnNraXBFeHRlcm5hbCkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBjc3NGaWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLnBhdGgsICd1dGYtOCcpO1xuICAgICAgICBhd2FpdCBjc3NQYXJzZXIuY29sbGVjdFZhcmlhYmxlc09ubHkoY29udGVudCwgZmlsZS5wYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gY29sbGVjdCB2YXJpYWJsZXMgZnJvbSAke2ZpbGUucGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBqc3hGaWxlcykge1xuICAgICAgaWYgKG9wdGlvbnMuc2tpcEludGVybmFsKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgYXdhaXQgY3NzUGFyc2VyLmNvbGxlY3RWYXJpYWJsZXNGcm9tSW50ZXJuYWxDU1MoY29udGVudCwgZmlsZS5wYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gY29sbGVjdCBpbnRlcm5hbCBDU1MgdmFyaWFibGVzIGZyb20gJHtmaWxlLnBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIudmVyYm9zZShgQ29sbGVjdGVkICR7c2hhcmVkVmFyaWFibGVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkVmFyaWFibGVzKCkubGVuZ3RofSB1bmlxdWUgQ1NTIHZhcmlhYmxlc2ApO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oJ1xcbvCflI0gUGhhc2UgMTogQW5hbHl6aW5nIENTUyBmaWxlcy4uLicpO1xuXG4gIGNvbnN0IGNzc0ZpbGVSZXN1bHRzOiBNYXA8c3RyaW5nLCBQcm9jZXNzZWRDU1NGaWxlPiA9IG5ldyBNYXAoKTtcblxuICBpZiAoIW9wdGlvbnMuc2tpcEV4dGVybmFsKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGNzc0ZpbGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNzc1BhcnNlci5wYXJzZShjb250ZW50LCBmaWxlLnBhdGgpO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsUnVsZXMgPSByZXN1bHQucnVsZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxseUNvbnZlcnRlZFJ1bGVzID0gcmVzdWx0LnJ1bGVzLmZpbHRlcihyID0+IHIuZnVsbHlDb252ZXJ0ZWQpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcGFydGlhbGx5Q29udmVydGVkUnVsZXMgPSByZXN1bHQucnVsZXMuZmlsdGVyKHIgPT4gci5wYXJ0aWFsQ29udmVyc2lvbikubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxseUNvbnZlcnRpYmxlID0gdG90YWxSdWxlcyA+IDAgJiYgdG90YWxSdWxlcyA9PT0gZnVsbHlDb252ZXJ0ZWRSdWxlcyAmJiBwYXJ0aWFsbHlDb252ZXJ0ZWRSdWxlcyA9PT0gMDtcblxuICAgICAgICByZXN1bHQucnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICBpZiAocnVsZS5pc0Rlc2NlbmRhbnQpIHtcbiAgICAgICAgICAgIGlmIChydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBhbGxEZXNjZW5kYW50UnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgc3RhdHMudXRpbGl0aWVzR2VuZXJhdGVkICs9IHJ1bGUuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuY2xhc3NOYW1lICYmIHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGNzc0NsYXNzTWFwW3J1bGUuY2xhc3NOYW1lXTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICBtZXJnZVJ1bGVJbnRvQ2xhc3NJbmZvKGV4aXN0aW5nLCBydWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNzc0NsYXNzTWFwW3J1bGUuY2xhc3NOYW1lXSA9IGJ1aWxkQ2xhc3NJbmZvRnJvbVJ1bGUocnVsZSwgZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlLmZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgIHN0YXRzLnV0aWxpdGllc0dlbmVyYXRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0cy51dGlsaXRpZXNHZW5lcmF0ZWQgKz0gcnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgUnVsZSAuJHtydWxlLmNsYXNzTmFtZX06IHBhcnRpYWwgY29udmVyc2lvbiAoJHtydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RofS8ke3J1bGUuZGVjbGFyYXRpb25zLmxlbmd0aH0gZGVjbGFyYXRpb25zKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3NzRmlsZVJlc3VsdHMuc2V0KGZpbGUucGF0aCwge1xuICAgICAgICAgIHBhdGg6IGZpbGUucGF0aCxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG5ld0NvbnRlbnQ6IHJlc3VsdC5jc3MsXG4gICAgICAgICAgcnVsZXM6IHJlc3VsdC5ydWxlcyxcbiAgICAgICAgICBjYW5EZWxldGU6IHJlc3VsdC5jYW5EZWxldGUsXG4gICAgICAgICAgaGFzQ2hhbmdlczogcmVzdWx0Lmhhc0NoYW5nZXMsXG4gICAgICAgICAgZnVsbHlDb252ZXJ0aWJsZSxcbiAgICAgICAgICB3YXJuaW5nczogcmVzdWx0Lndhcm5pbmdzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YXRzLndhcm5pbmdzICs9IHJlc3VsdC53YXJuaW5ncy5sZW5ndGg7XG5cbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYEFuYWx5emVkICR7ZmlsZS5wYXRofTpgKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBUb3RhbCBydWxlczogJHt0b3RhbFJ1bGVzfWApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIEZ1bGx5IGNvbnZlcnRlZCBydWxlczogJHtmdWxseUNvbnZlcnRlZFJ1bGVzfWApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIFBhcnRpYWxseSBjb252ZXJ0ZWQgcnVsZXM6ICR7cGFydGlhbGx5Q29udmVydGVkUnVsZXN9YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIC0gRnVsbHkgY29udmVydGlibGU6ICR7ZnVsbHlDb252ZXJ0aWJsZX1gKTtcblxuICAgICAgICByZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShg4pqg77iPICAke2ZpbGUucGF0aH06ICR7d2FybmluZ31gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gYW5hbHl6ZSAke2ZpbGUucGF0aH06YCwgZXJyb3IpO1xuICAgICAgICBjc3NGaWxlUmVzdWx0cy5zZXQoZmlsZS5wYXRoLCB7XG4gICAgICAgICAgcGF0aDogZmlsZS5wYXRoLFxuICAgICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICAgIG5ld0NvbnRlbnQ6ICcnLFxuICAgICAgICAgIHJ1bGVzOiBbXSxcbiAgICAgICAgICBjYW5EZWxldGU6IGZhbHNlLFxuICAgICAgICAgIGhhc0NoYW5nZXM6IGZhbHNlLFxuICAgICAgICAgIGZ1bGx5Q29udmVydGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmdzOiBbXSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0cy5lcnJvcnMrKztcbiAgICAgICAgc3RhdHMud2FybmluZ3MrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbygnXFxu4pqb77iPICBQaGFzZSAyOiBUcmFuc2Zvcm1pbmcgUmVhY3QgY29tcG9uZW50cy4uLicpO1xuXG4gIGNvbnN0IGpzeEZpbGVSZXN1bHRzOiBNYXA8c3RyaW5nLCBQcm9jZXNzZWRKU1hGaWxlPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YganN4RmlsZXMpIHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGNvbnRlbnQ7XG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgbGV0IGZpbGVXYXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCB1dGlsaXRpZXNHZW5lcmF0ZWQgPSAwO1xuICAgICAgbGV0IGNsYXNzZXNSZXBsYWNlZCA9IDA7XG5cbiAgICAgIGlmICghb3B0aW9ucy5za2lwSW5saW5lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganN4UmVzdWx0ID0ganN4UGFyc2VyLnBhcnNlKGNvbnRlbnQsIGZpbGUucGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGpzeFJlc3VsdC5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICBjb250ZW50ID0ganN4UmVzdWx0LmNvZGU7XG4gICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHV0aWxpdGllc0dlbmVyYXRlZCArPSBqc3hSZXN1bHQudHJhbnNmb3JtYXRpb25zLnJlZHVjZShcbiAgICAgICAgICAgICAgKHN1bSwgdCkgPT4gc3VtICsgdC5jbGFzc2VzLmxlbmd0aCwgMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpbGVXYXJuaW5ncy5wdXNoKC4uLmpzeFJlc3VsdC53YXJuaW5ncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgSlNYIGlubGluZSBzdHlsZXMgaW4gJHtmaWxlLnBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgICAgIGZpbGVXYXJuaW5ncy5wdXNoKGBKU1ggcGFyc2UgZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnNraXBJbnRlcm5hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGludGVybmFsUmVzdWx0ID0gYXdhaXQgY3NzUGFyc2VyLnBhcnNlSW50ZXJuYWxDU1MoY29udGVudCwgZmlsZS5wYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaW50ZXJuYWxSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICAgICAgY29udGVudCA9IGludGVybmFsUmVzdWx0Lmh0bWw7XG4gICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaW50ZXJuYWxSZXN1bHQucnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJ1bGUuaXNEZXNjZW5kYW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBhbGxEZXNjZW5kYW50UnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICAgIHV0aWxpdGllc0dlbmVyYXRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwICYmIHJ1bGUuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICBtZXJnZVJ1bGVJbnRvQ2xhc3NJbmZvKGV4aXN0aW5nLCBydWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY3NzQ2xhc3NNYXBbcnVsZS5jbGFzc05hbWVdID0gYnVpbGRDbGFzc0luZm9Gcm9tUnVsZShydWxlLCBmaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1dGlsaXRpZXNHZW5lcmF0ZWQgKz0gcnVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZmlsZVdhcm5pbmdzLnB1c2goLi4uaW50ZXJuYWxSZXN1bHQud2FybmluZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIGludGVybmFsIENTUyBpbiAke2ZpbGUucGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgZmlsZVdhcm5pbmdzLnB1c2goYEludGVybmFsIENTUyBwYXJzZSBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBqc3hGaWxlUmVzdWx0cy5zZXQoZmlsZS5wYXRoLCB7XG4gICAgICAgIHBhdGg6IGZpbGUucGF0aCxcbiAgICAgICAgY29udGVudDogb3JpZ2luYWxDb250ZW50LFxuICAgICAgICBuZXdDb250ZW50OiBjb250ZW50LFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICB3YXJuaW5nczogZmlsZVdhcm5pbmdzLFxuICAgICAgICB1dGlsaXRpZXNHZW5lcmF0ZWQsXG4gICAgICAgIGNsYXNzZXNSZXBsYWNlZFxuICAgICAgfSk7XG5cbiAgICAgIHN0YXRzLndhcm5pbmdzICs9IGZpbGVXYXJuaW5ncy5sZW5ndGg7XG5cbiAgICAgIGZpbGVXYXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgICBsb2dnZXIudmVyYm9zZShg4pqg77iPICAke2ZpbGUucGF0aH06ICR7d2FybmluZ31gKTtcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgJHtmaWxlLnBhdGh9OmAsIGVycm9yKTtcbiAgICAgIGpzeEZpbGVSZXN1bHRzLnNldChmaWxlLnBhdGgsIHtcbiAgICAgICAgcGF0aDogZmlsZS5wYXRoLFxuICAgICAgICBjb250ZW50OiAnJyxcbiAgICAgICAgbmV3Q29udGVudDogJycsXG4gICAgICAgIGhhc0NoYW5nZXM6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczogW10sXG4gICAgICAgIHV0aWxpdGllc0dlbmVyYXRlZDogMCxcbiAgICAgICAgY2xhc3Nlc1JlcGxhY2VkOiAwLFxuICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlXG4gICAgICB9KTtcbiAgICAgIHN0YXRzLmVycm9ycysrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhjc3NDbGFzc01hcCkubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci5pbmZvKCdcXG7wn5SEIFBoYXNlIDM6IFJlcGxhY2luZyBjbGFzc05hbWUgcmVmZXJlbmNlcy4uLicpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGpzeEZpbGVSZXN1bHRzKSB7XG4gICAgICBpZiAoZmlsZVJlc3VsdC5lcnJvcikgY29udGludWU7XG4gICAgICBcbiAgICAgIGxldCBjb250ZW50ID0gZmlsZVJlc3VsdC5uZXdDb250ZW50O1xuICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmaWxlUmVzdWx0Lmhhc0NoYW5nZXM7XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50UmVzdWx0ID0gcmVwbGFjZUNsYXNzTmFtZVJlZmVyZW5jZXMoY29udGVudCwgY3NzQ2xhc3NNYXApO1xuICAgICAgaWYgKHJlcGxhY2VtZW50UmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgY29udGVudCA9IHJlcGxhY2VtZW50UmVzdWx0LmNvZGU7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICBmaWxlUmVzdWx0LmNsYXNzZXNSZXBsYWNlZCArPSByZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHM7XG4gICAgICAgIHN0YXRzLmNsYXNzZXNSZXBsYWNlZCArPSByZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHM7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgJHtyZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHN9IGNsYXNzIHJlZmVyZW5jZXMgaW4gJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1gKTtcbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGVQYXRoLCB7XG4gICAgICAgIC4uLmZpbGVSZXN1bHQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxEZXNjZW5kYW50UnVsZXMubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci5pbmZvKCdcXG7wn4yzIFBoYXNlIDMuNTogQXBwbHlpbmcgZGVzY2VuZGFudCBzZWxlY3RvciBydWxlcy4uLicpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGpzeEZpbGVSZXN1bHRzKSB7XG4gICAgICBpZiAoZmlsZVJlc3VsdC5lcnJvcikgY29udGludWU7XG4gICAgICBcbiAgICAgIGxldCBjb250ZW50ID0gZmlsZVJlc3VsdC5uZXdDb250ZW50O1xuICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmaWxlUmVzdWx0Lmhhc0NoYW5nZXM7XG5cbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRSZXN1bHQgPSB0cmFuc2Zvcm1EZXNjZW5kYW50U2VsZWN0b3JzKGNvbnRlbnQsIGFsbERlc2NlbmRhbnRSdWxlcyk7XG4gICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5oYXNDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnRlbnQgPSBkZXNjZW5kYW50UmVzdWx0LmNvZGU7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICBmaWxlUmVzdWx0LmNsYXNzZXNSZXBsYWNlZCArPSBkZXNjZW5kYW50UmVzdWx0LnRyYW5zZm9ybWF0aW9ucztcbiAgICAgICAgc3RhdHMuY2xhc3Nlc1JlcGxhY2VkICs9IGRlc2NlbmRhbnRSZXN1bHQudHJhbnNmb3JtYXRpb25zO1xuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYEFwcGxpZWQgJHtkZXNjZW5kYW50UmVzdWx0LnRyYW5zZm9ybWF0aW9uc30gZGVzY2VuZGFudCB0cmFuc2Zvcm1hdGlvbnMgaW4gJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGF0cy53YXJuaW5ncyArPSBkZXNjZW5kYW50UmVzdWx0Lndhcm5pbmdzLmxlbmd0aDtcbiAgICAgICAgZGVzY2VuZGFudFJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGDimqDvuI8gICR7ZmlsZVBhdGh9OiAke3dhcm5pbmd9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBqc3hGaWxlUmVzdWx0cy5zZXQoZmlsZVBhdGgsIHtcbiAgICAgICAgLi4uZmlsZVJlc3VsdCxcbiAgICAgICAgbmV3Q29udGVudDogY29udGVudCxcbiAgICAgICAgaGFzQ2hhbmdlc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGpzeEZpbGVSZXN1bHRzKSB7XG4gICAgaWYgKGZpbGVSZXN1bHQuZXJyb3IpIHtcbiAgICAgIGZpbGVSZXN1bHRzLnB1c2goe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgb3JpZ2luYWxDb250ZW50OiBmaWxlUmVzdWx0LmNvbnRlbnQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGZpbGVSZXN1bHQubmV3Q29udGVudCxcbiAgICAgICAgaGFzQ2hhbmdlczogZmFsc2UsXG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgZXJyb3I6IGZpbGVSZXN1bHQuZXJyb3JcbiAgICAgIH0pO1xuICAgICAgc3RhdHMuZmlsZXNXaXRoRXJyb3IrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNDaGFuZ2VzID0gZmlsZVJlc3VsdC5uZXdDb250ZW50ICE9PSBmaWxlUmVzdWx0LmNvbnRlbnQ7XG4gICAgXG4gICAgZmlsZVJlc3VsdHMucHVzaCh7XG4gICAgICBmaWxlUGF0aCxcbiAgICAgIG9yaWdpbmFsQ29udGVudDogZmlsZVJlc3VsdC5jb250ZW50LFxuICAgICAgbmV3Q29udGVudDogZmlsZVJlc3VsdC5uZXdDb250ZW50LFxuICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgIHN0YXR1czogaGFzQ2hhbmdlcyA/ICdtb2RpZmllZCcgOiAndW5jaGFuZ2VkJyxcbiAgICAgIHRyYW5zZm9ybWF0aW9uczoge1xuICAgICAgICB1dGlsaXRpZXNHZW5lcmF0ZWQ6IGZpbGVSZXN1bHQudXRpbGl0aWVzR2VuZXJhdGVkLFxuICAgICAgICBjbGFzc2VzUmVwbGFjZWQ6IGZpbGVSZXN1bHQuY2xhc3Nlc1JlcGxhY2VkLFxuICAgICAgICBjb25mbGljdHNSZXNvbHZlZDogMFxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICBzdGF0cy5maWxlc01vZGlmaWVkKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRzLmZpbGVzVW5jaGFuZ2VkKys7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGNzc0ZpbGVSZXN1bHRzKSB7XG4gICAgaWYgKGZpbGVSZXN1bHQuZXJyb3IpIHtcbiAgICAgIGZpbGVSZXN1bHRzLnB1c2goe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgb3JpZ2luYWxDb250ZW50OiBmaWxlUmVzdWx0LmNvbnRlbnQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGZpbGVSZXN1bHQubmV3Q29udGVudCxcbiAgICAgICAgaGFzQ2hhbmdlczogZmFsc2UsXG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgZXJyb3I6IGZpbGVSZXN1bHQuZXJyb3JcbiAgICAgIH0pO1xuICAgICAgc3RhdHMuZmlsZXNXaXRoRXJyb3IrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNDaGFuZ2VzID0gZmlsZVJlc3VsdC5oYXNDaGFuZ2VzICYmIGZpbGVSZXN1bHQubmV3Q29udGVudCAhPT0gZmlsZVJlc3VsdC5jb250ZW50O1xuICAgIFxuICAgIGZpbGVSZXN1bHRzLnB1c2goe1xuICAgICAgZmlsZVBhdGgsXG4gICAgICBvcmlnaW5hbENvbnRlbnQ6IGZpbGVSZXN1bHQuY29udGVudCxcbiAgICAgIG5ld0NvbnRlbnQ6IGZpbGVSZXN1bHQubmV3Q29udGVudCxcbiAgICAgIGhhc0NoYW5nZXMsXG4gICAgICBzdGF0dXM6IGhhc0NoYW5nZXMgPyAnbW9kaWZpZWQnIDogJ3VuY2hhbmdlZCdcbiAgICB9KTtcbiAgICBcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgc3RhdHMuZmlsZXNNb2RpZmllZCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0cy5maWxlc1VuY2hhbmdlZCsrO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRzLnV0aWxpdGllc0dlbmVyYXRlZCA9IHN0YXRzLmNsYXNzZXNSZXBsYWNlZCArIHN0YXRzLnV0aWxpdGllc0dlbmVyYXRlZDtcblxuICByZXR1cm4geyBmaWxlUmVzdWx0cywgc3RhdHMgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc0luZm9Gcm9tUnVsZShydWxlOiBDU1NSdWxlLCBzb3VyY2VGaWxlOiBzdHJpbmcpOiBDbGFzc0luZm8ge1xuICByZXR1cm4ge1xuICAgIHV0aWxpdGllczogcnVsZS51dGlsaXRpZXMubWFwKHUgPT4gKHtcbiAgICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgICAgdmFyaWFudHM6IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4udS52YXJpYW50c10pLFxuICAgICAgY3NzUHJvcGVydHk6IHUuY3NzUHJvcGVydHksXG4gICAgICBzcGVjaWZpY2l0eTogdS5zcGVjaWZpY2l0eSxcbiAgICAgIHNvdXJjZU9yZGVyOiB1LnNvdXJjZU9yZGVyLFxuICAgICAgb3JpZ2luYWxTZWxlY3RvcjogcnVsZS5zZWxlY3RvclxuICAgIH0pKSxcbiAgICBzb3VyY2VGaWxlLFxuICAgIGZ1bGx5Q29udmVydGlibGU6IHJ1bGUuZnVsbHlDb252ZXJ0ZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VSdWxlSW50b0NsYXNzSW5mbyhpbmZvOiBDbGFzc0luZm8sIHJ1bGU6IENTU1J1bGUpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1dGlsaXR5IG9mIHJ1bGUudXRpbGl0aWVzKSB7XG4gICAgY29uc3QgdXRpbGl0eVdpdGhNZXRhOiBVdGlsaXR5V2l0aE1ldGEgPSB7XG4gICAgICB2YWx1ZTogdXRpbGl0eS52YWx1ZSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnV0aWxpdHkudmFyaWFudHNdKSxcbiAgICAgIGNzc1Byb3BlcnR5OiB1dGlsaXR5LmNzc1Byb3BlcnR5LFxuICAgICAgc3BlY2lmaWNpdHk6IHV0aWxpdHkuc3BlY2lmaWNpdHksXG4gICAgICBzb3VyY2VPcmRlcjogdXRpbGl0eS5zb3VyY2VPcmRlcixcbiAgICAgIG9yaWdpbmFsU2VsZWN0b3I6IHJ1bGUuc2VsZWN0b3JcbiAgICB9O1xuICAgIFxuICAgIGluZm8udXRpbGl0aWVzLnB1c2godXRpbGl0eVdpdGhNZXRhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlbWJsZVRhaWx3aW5kQ2xhc3NlcyhpbmZvOiBDbGFzc0luZm8pOiBzdHJpbmcge1xuICBjb25zdCB7IHJlc29sdmVkIH0gPSByZXNvbHZlQ29uZmxpY3RzKGluZm8udXRpbGl0aWVzLCBmYWxzZSk7XG4gIHJldHVybiByZXNvbHZlZFV0aWxpdGllc1RvU3RyaW5ncyhyZXNvbHZlZCkuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQ2xhc3NOYW1lUmVmZXJlbmNlcyhcbiAgY29kZTogc3RyaW5nLCBcbiAgY2xhc3NNYXA6IENTU0NsYXNzTWFwXG4pOiB7IFxuICBjb2RlOiBzdHJpbmc7IFxuICBoYXNDaGFuZ2VzOiBib29sZWFuOyBcbiAgcmVwbGFjZW1lbnRzOiBudW1iZXIgXG59IHtcbiAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgbGV0IHJlcGxhY2VtZW50cyA9IDA7XG4gIGxldCBtb2RpZmllZENvZGUgPSBjb2RlO1xuXG4gIE9iamVjdC5lbnRyaWVzKGNsYXNzTWFwKS5mb3JFYWNoKChbb2xkQ2xhc3MsIGluZm9dKSA9PiB7XG4gICAgaWYgKGluZm8udXRpbGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhaWx3aW5kQ2xhc3NTdHJpbmcgPSBhc3NlbWJsZVRhaWx3aW5kQ2xhc3NlcyhpbmZvKTtcbiAgICBcbiAgICBpZiAoaW5mby5mdWxseUNvbnZlcnRpYmxlKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuMSA9IG5ldyBSZWdFeHAoYGNsYXNzTmFtZT1cIiR7b2xkQ2xhc3N9XCJgLCAnZycpO1xuICAgICAgaWYgKHBhdHRlcm4xLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMSwgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiIHdpdGggXCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0dGVybjIgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XFxcXHtcIiR7b2xkQ2xhc3N9XCJcXFxcfWAsICdnJyk7XG4gICAgICBpZiAocGF0dGVybjIudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICAgIG1vZGlmaWVkQ29kZSA9IG1vZGlmaWVkQ29kZS5yZXBsYWNlKHBhdHRlcm4yLCBgY2xhc3NOYW1lPVwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlcGxhY2VkIGNsYXNzTmFtZT17XCIke29sZENsYXNzfVwifSB3aXRoIFwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4zID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVxcXFx7XFxgXFxcXHMqJHtvbGRDbGFzc31cXFxccypcXGBcXFxcfWAsICdnJyk7XG4gICAgICBpZiAocGF0dGVybjMudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICAgIG1vZGlmaWVkQ29kZSA9IG1vZGlmaWVkQ29kZS5yZXBsYWNlKHBhdHRlcm4zLCBgY2xhc3NOYW1lPVwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlcGxhY2VkIGNsYXNzTmFtZT17XFxgJHtvbGRDbGFzc31cXGB9IHdpdGggXCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tYmluZWRDbGFzc1N0cmluZyA9IGAke29sZENsYXNzfSAke3RhaWx3aW5kQ2xhc3NTdHJpbmd9YDtcbiAgICAgIFxuICAgICAgY29uc3QgcGF0dGVybjEgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiYCwgJ2cnKTtcbiAgICAgIGlmIChwYXR0ZXJuMS50ZXN0KG1vZGlmaWVkQ29kZSkpIHtcbiAgICAgICAgbW9kaWZpZWRDb2RlID0gbW9kaWZpZWRDb2RlLnJlcGxhY2UocGF0dGVybjEsIGBjbGFzc05hbWU9XCIke2NvbWJpbmVkQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHJlcGxhY2VtZW50cysrO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgQXBwZW5kZWQgdG8gY2xhc3NOYW1lPVwiJHtvbGRDbGFzc31cIiDihpIgXCIke2NvbWJpbmVkQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0dGVybjIgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XFxcXHtcIiR7b2xkQ2xhc3N9XCJcXFxcfWAsICdnJyk7XG4gICAgICBpZiAocGF0dGVybjIudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICAgIG1vZGlmaWVkQ29kZSA9IG1vZGlmaWVkQ29kZS5yZXBsYWNlKHBhdHRlcm4yLCBgY2xhc3NOYW1lPVwiJHtjb21iaW5lZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYEFwcGVuZGVkIHRvIGNsYXNzTmFtZT17XCIke29sZENsYXNzfVwifSDihpIgXCIke2NvbWJpbmVkQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0dGVybjMgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XFxcXHtcXGBcXFxccyoke29sZENsYXNzfVxcXFxzKlxcYFxcXFx9YCwgJ2cnKTtcbiAgICAgIGlmIChwYXR0ZXJuMy50ZXN0KG1vZGlmaWVkQ29kZSkpIHtcbiAgICAgICAgbW9kaWZpZWRDb2RlID0gbW9kaWZpZWRDb2RlLnJlcGxhY2UocGF0dGVybjMsIGBjbGFzc05hbWU9XCIke2NvbWJpbmVkQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHJlcGxhY2VtZW50cysrO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgQXBwZW5kZWQgdG8gY2xhc3NOYW1lPXtcXGAke29sZENsYXNzfVxcYH0g4oaSIFwiJHtjb21iaW5lZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBjb2RlOiBtb2RpZmllZENvZGUsIGhhc0NoYW5nZXMsIHJlcGxhY2VtZW50cyB9O1xufVxuIl19
@@ -0,0 +1,26 @@
1
+ export interface DiffLine {
2
+ type: 'context' | 'added' | 'removed';
3
+ content: string;
4
+ oldLineNumber?: number;
5
+ newLineNumber?: number;
6
+ }
7
+ export interface DiffHunk {
8
+ oldStart: number;
9
+ oldLines: number;
10
+ newStart: number;
11
+ newLines: number;
12
+ lines: DiffLine[];
13
+ }
14
+ export interface DiffResult {
15
+ hunks: DiffHunk[];
16
+ hasChanges: boolean;
17
+ }
18
+ export declare function computeUnifiedDiff(oldContent: string, newContent: string, contextLines?: number): DiffResult;
19
+ export declare function formatDiffHeader(filePath: string): string;
20
+ export declare function formatDiffHunk(hunk: DiffHunk): string;
21
+ export declare function formatDiff(filePath: string, diff: DiffResult): string;
22
+ export declare function computeAndFormatDiff(oldContent: string, newContent: string, filePath: string): string;
23
+ export declare function getChangeStats(diff: DiffResult): {
24
+ added: number;
25
+ removed: number;
26
+ };