@mnemonica/tactica 0.1.15 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -142,10 +142,10 @@ class TopologicaAnalyzer {
142
142
  const typeAliases = this.collectTypeAliases(sourceFile);
143
143
  // Find handler function and extract property assignments and constructor params
144
144
  const result = this.extractPropertiesFromSourceFile(sourceFile, properties, typeAliases);
145
- constructorParams = result.constructorParams;
145
+ ({ constructorParams } = result);
146
146
  // Use the handler function location if found
147
147
  if (result.handlerLocation) {
148
- handlerLocation = result.handlerLocation;
148
+ ({ handlerLocation } = result);
149
149
  }
150
150
  }
151
151
  catch (error) {
@@ -189,10 +189,11 @@ class TopologicaAnalyzer {
189
189
  constructorParams = this.extractConstructorParams(node, typeAliases);
190
190
  // Capture the function location
191
191
  const { line, character } = ts.getLineAndCharacterOfPosition(sourceFile, node.getStart(sourceFile));
192
+ // line and column are 1-based
192
193
  handlerLocation = {
193
194
  filePath: sourceFile.fileName,
194
- line: line + 1, // 1-based
195
- column: character + 1 // 1-based
195
+ line: line + 1,
196
+ column: character + 1
196
197
  };
197
198
  }
198
199
  }
@@ -205,10 +206,11 @@ class TopologicaAnalyzer {
205
206
  constructorParams = this.extractConstructorParams(node, typeAliases);
206
207
  // Capture the function location
207
208
  const { line, character } = ts.getLineAndCharacterOfPosition(sourceFile, node.getStart(sourceFile));
209
+ // line and column are 1-based
208
210
  handlerLocation = {
209
211
  filePath: sourceFile.fileName,
210
- line: line + 1, // 1-based
211
- column: character + 1 // 1-based
212
+ line: line + 1,
213
+ column: character + 1
212
214
  };
213
215
  }
214
216
  }
@@ -268,7 +270,7 @@ class TopologicaAnalyzer {
268
270
  const objName = ts.isIdentifier(expr.expression) ? expr.expression.text : null;
269
271
  const methodName = expr.name.text;
270
272
  if (objName === 'Object' && methodName === 'assign') {
271
- const firstArg = callExpr.arguments[0];
273
+ const [firstArg] = callExpr.arguments;
272
274
  if (firstArg && firstArg.kind === ts.SyntaxKind.ThisKeyword) {
273
275
  return true;
274
276
  }
@@ -280,7 +282,7 @@ class TopologicaAnalyzer {
280
282
  */
281
283
  extractFromObjectAssign(callExpr, properties) {
282
284
  // Look for the data argument (second argument)
283
- const dataArg = callExpr.arguments[1];
285
+ const [, dataArg] = callExpr.arguments;
284
286
  if (!dataArg)
285
287
  return;
286
288
  // If it's an object literal, extract properties
@@ -448,7 +450,8 @@ class TopologicaAnalyzer {
448
450
  if (ts.isIdentifier(expr)) {
449
451
  switch (expr.text) {
450
452
  case 'Date':
451
- return 'number'; // Date.now() returns number
453
+ // Date.now() returns number
454
+ return 'number';
452
455
  case 'Array':
453
456
  return 'Array<any>';
454
457
  case 'Map':
@@ -506,4 +509,4 @@ class TopologicaAnalyzer {
506
509
  }
507
510
  }
508
511
  exports.TopologicaAnalyzer = TopologicaAnalyzer;
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wb2xvZ2ljYS1hbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90b3BvbG9naWNhLWFuYWx5emVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwrQ0FBaUM7QUFJakMsbUNBQXdDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQWEsa0JBQWtCO0lBQS9CO1FBQ1MsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixVQUFLLEdBQUcsSUFBSSxxQkFBYSxFQUFFLENBQUM7SUF5aUJyQyxDQUFDO0lBdmlCQTs7T0FFRztJQUNILGdCQUFnQixDQUFFLGFBQXFCO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDL0QsT0FBTyxFQUFFLEtBQUssRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5RCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFh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LENBQUM7Z0JBQ2pCLEtBQUssU0FBUztvQkFDYixPQUFPLFNBQVMsQ0FBQztZQUNsQixDQUFDO1FBQ0YsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BCLENBQUM7Q0FDRDtBQTNpQkQsZ0RBMmlCQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHtcblx0VHlwZU5vZGUsIFByb3BlcnR5SW5mbywgQ29uc3RydWN0b3JQYXJhbUluZm8gXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVHlwZUdyYXBoSW1wbCB9IGZyb20gJy4vZ3JhcGgnO1xuXG4vKipcbiAqIEFuYWx5emVyIGZvciBUb3BvbG9naWNhIGRpcmVjdG9yeS1iYXNlZCB0eXBlIGRlZmluaXRpb25zXG4gKiBTY2FucyBkaXJlY3Rvcnkgc3RydWN0dXJlcyB0byBjcmVhdGUgdHlwZSBoaWVyYXJjaGllcyBsaWtlOlxuICogYWktdHlwZXMvU2VudGllbmNlL0NvbnNjaW91c25lc3MvRW1wYXRoeS9HcmF0aXR1ZGUvXG4gKiBcbiAqIE5vdyB3aXRoIEFTVC1iYXNlZCBwcm9wZXJ0eSBleHRyYWN0aW9uIGZyb20gVHlwZVNjcmlwdC9KYXZhU2NyaXB0IGZpbGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3BvbG9naWNhQW5hbHl6ZXIge1xuXHRwcml2YXRlIGVycm9yczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBncmFwaCA9IG5ldyBUeXBlR3JhcGhJbXBsKCk7XG5cblx0LyoqXG5cdCAqIEFuYWx5emUgYSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciB0b3BvbG9naWNhIHR5cGUgZGVmaW5pdGlvbnNcblx0ICovXG5cdGFuYWx5emVEaXJlY3RvcnkgKGRpcmVjdG9yeVBhdGg6IHN0cmluZyk6IHsgdHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVOb2RlPiwgZXJyb3JzOiBzdHJpbmdbXSB9IHtcblx0XHR0aGlzLmVycm9ycyA9IFtdO1xuXHRcdFxuXHRcdGlmICghZnMuZXhpc3RzU3luYyhkaXJlY3RvcnlQYXRoKSkge1xuXHRcdFx0dGhpcy5lcnJvcnMucHVzaChgRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke2RpcmVjdG9yeVBhdGh9YCk7XG5cdFx0XHRyZXR1cm4geyB0eXBlcyA6IHRoaXMuZ3JhcGguYWxsVHlwZXMsIGVycm9ycyA6IHRoaXMuZXJyb3JzIH07XG5cdFx0fVxuXG5cdFx0aWYgKCFmcy5zdGF0U3luYyhkaXJlY3RvcnlQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0XHR0aGlzLmVycm9ycy5wdXNoKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeTogJHtkaXJlY3RvcnlQYXRofWApO1xuXHRcdFx0cmV0dXJuIHsgdHlwZXMgOiB0aGlzLmdyYXBoLmFsbFR5cGVzLCBlcnJvcnMgOiB0aGlzLmVycm9ycyB9O1xuXHRcdH1cblxuXHRcdHRoaXMuc2NhbkRpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCB1bmRlZmluZWQsIGRpcmVjdG9yeVBhdGgpO1xuXHRcdFxuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlcyAgOiB0aGlzLmdyYXBoLmFsbFR5cGVzLFxuXHRcdFx0ZXJyb3JzIDogdGhpcy5lcnJvcnMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWN1cnNpdmVseSBzY2FuIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gYnVpbGQgdHlwZSBoaWVyYXJjaHlcblx0ICovXG5cdHByaXZhdGUgc2NhbkRpcmVjdG9yeSAoY3VycmVudFBhdGg6IHN0cmluZywgcGFyZW50Tm9kZTogVHlwZU5vZGUgfCB1bmRlZmluZWQsIHJvb3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRQYXRoLCB7IHdpdGhGaWxlVHlwZXMgOiB0cnVlIH0pO1xuXHRcdFx0XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRcdFx0aWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcblx0XHRcdFx0XHQvLyBDcmVhdGUgdHlwZSBub2RlIGZvciB0aGlzIGRpcmVjdG9yeVxuXHRcdFx0XHRcdGNvbnN0IHR5cGVOYW1lID0gZW50cnkubmFtZTtcblx0XHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IHBhcmVudE5vZGUgPyBgJHtwYXJlbnROb2RlLmZ1bGxQYXRofS4ke3R5cGVOYW1lfWAgOiB0eXBlTmFtZTtcblx0XHRcdFx0XHRjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCBlbnRyeS5uYW1lKTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBFeHRyYWN0IHByb3BlcnRpZXMgYW5kIGNvbnN0cnVjdG9yIHBhcmFtcyBmcm9tIHRoZSBoYW5kbGVyIGZpbGUgaWYgaXQgZXhpc3RzXG5cdFx0XHRcdFx0Y29uc3Qge1xuXHRcdFx0XHRcdFx0cHJvcGVydGllcywgY29uc3RydWN0b3JQYXJhbXMsIGhhbmRsZXJMb2NhdGlvbiBcblx0XHRcdFx0XHR9ID0gdGhpcy5leHRyYWN0UHJvcGVydGllc0Zyb21EaXIoZGlyUGF0aCk7XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSB0eXBlIG5vZGUgd2l0aCBwcm9wZXIgc291cmNlIGxvY2F0aW9uIGZvciBHbyB0byBEZWZpbml0aW9uXG5cdFx0XHRcdFx0Y29uc3QgdHlwZU5vZGU6IFR5cGVOb2RlID0ge1xuXHRcdFx0XHRcdFx0bmFtZSAgICAgICAgICAgICAgOiB0eXBlTmFtZSxcblx0XHRcdFx0XHRcdGZ1bGxQYXRoICAgICAgICAgIDogZnVsbFBhdGgsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzICAgICAgICA6IHByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3RvclBhcmFtcyA6IGNvbnN0cnVjdG9yUGFyYW1zLFxuXHRcdFx0XHRcdFx0cGFyZW50ICAgICAgICAgICAgOiBwYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0Y2hpbGRyZW4gICAgICAgICAgOiBuZXcgTWFwKCksXG5cdFx0XHRcdFx0XHRzb3VyY2VGaWxlICAgICAgICA6IGhhbmRsZXJMb2NhdGlvbj8uZmlsZVBhdGggfHwgZGlyUGF0aCxcblx0XHRcdFx0XHRcdGxpbmUgICAgICAgICAgICAgIDogaGFuZGxlckxvY2F0aW9uPy5saW5lIHx8IDAsXG5cdFx0XHRcdFx0XHRjb2x1bW4gICAgICAgICAgICA6IGhhbmRsZXJMb2NhdGlvbj8uY29sdW1uIHx8IDAsXG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvck5hbWUgICA6IHR5cGVOYW1lXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBBZGQgdG8gZ3JhcGhcblx0XHRcdFx0XHRpZiAocGFyZW50Tm9kZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5ncmFwaC5hZGRDaGlsZChwYXJlbnROb2RlLCB0eXBlTm9kZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEFkZCBhcyByb290IHR5cGVcblx0XHRcdFx0XHRcdHRoaXMuZ3JhcGguYWRkUm9vdCh0eXBlTm9kZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vIFNjYW4gY2hpbGRyZW4gb2YgdGhpcyBkaXJlY3Rvcnlcblx0XHRcdFx0XHR0aGlzLnNjYW5EaXJlY3RvcnkoZGlyUGF0aCwgdHlwZU5vZGUsIHJvb3RQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmVycm9ycy5wdXNoKGBFcnJvciBzY2FubmluZyBkaXJlY3RvcnkgJHtjdXJyZW50UGF0aH06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0IHByb3BlcnRpZXMgZnJvbSBhIGRpcmVjdG9yeSdzIGluZGV4IGZpbGVcblx0ICogU3VwcG9ydHMgYm90aCAudHMgYW5kIC5qcyBmaWxlc1xuXHQgKi9cblx0cHJpdmF0ZSBleHRyYWN0UHJvcGVydGllc0Zyb21EaXIgKGRpclBhdGg6IHN0cmluZyk6IHtcblx0XHRwcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBQcm9wZXJ0eUluZm8+O1xuXHRcdGNvbnN0cnVjdG9yUGFyYW1zPzogQ29uc3RydWN0b3JQYXJhbUluZm9bXTtcblx0XHRoYW5kbGVyTG9jYXRpb24/OiB7IGZpbGVQYXRoOiBzdHJpbmc7IGxpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXIgfTtcblx0fSB7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9wZXJ0eUluZm8+KCk7XG5cdFx0bGV0IGNvbnN0cnVjdG9yUGFyYW1zOiBDb25zdHJ1Y3RvclBhcmFtSW5mb1tdIHwgdW5kZWZpbmVkO1xuXHRcdFxuXHRcdC8vIENoZWNrIGZvciBUeXBlU2NyaXB0IGZpbGUgZmlyc3QsIHRoZW4gSmF2YVNjcmlwdFxuXHRcdGNvbnN0IHRzRmlsZSA9IHBhdGguam9pbihkaXJQYXRoLCAnaW5kZXgudHMnKTtcblx0XHRjb25zdCBqc0ZpbGUgPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2luZGV4LmpzJyk7XG5cdFx0XG5cdFx0bGV0IHRhcmdldEZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcblx0XHRpZiAoZnMuZXhpc3RzU3luYyh0c0ZpbGUpKSB7XG5cdFx0XHR0YXJnZXRGaWxlID0gdHNGaWxlO1xuXHRcdH0gZWxzZSBpZiAoZnMuZXhpc3RzU3luYyhqc0ZpbGUpKSB7XG5cdFx0XHR0YXJnZXRGaWxlID0ganNGaWxlO1xuXHRcdH1cblx0XHRcblx0XHRpZiAoIXRhcmdldEZpbGUpIHtcblx0XHRcdHJldHVybiB7IHByb3BlcnRpZXMgfTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gRGVmYXVsdCBsb2NhdGlvbiBwb2ludHMgdG8gdGhlIGluZGV4IGZpbGUgKHdpbGwgYmUgdXBkYXRlZCBpZiBoYW5kbGVyIGZvdW5kKVxuXHRcdGxldCBoYW5kbGVyTG9jYXRpb246IHsgZmlsZVBhdGg6IHN0cmluZzsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuXHRcdFxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRhcmdldEZpbGUsICd1dGYtOCcpO1xuXHRcdFx0Y29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG5cdFx0XHRcdHRhcmdldEZpbGUsXG5cdFx0XHRcdGNvbnRlbnQsXG5cdFx0XHRcdHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG5cdFx0XHRcdHRydWVcblx0XHRcdCk7XG5cdFx0XHRcblx0XHRcdC8vIENvbGxlY3QgdHlwZSBhbGlhc2VzIGZyb20gdGhlIGZpbGUgKGUuZy4sIFNlbnRpZW5jZURhdGEgPSB7IC4uLiB9KVxuXHRcdFx0Y29uc3QgdHlwZUFsaWFzZXMgPSB0aGlzLmNvbGxlY3RUeXBlQWxpYXNlcyhzb3VyY2VGaWxlKTtcblx0XHRcdFxuXHRcdFx0Ly8gRmluZCBoYW5kbGVyIGZ1bmN0aW9uIGFuZCBleHRyYWN0IHByb3BlcnR5IGFzc2lnbm1lbnRzIGFuZCBjb25zdHJ1Y3RvciBwYXJhbXNcblx0XHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMuZXh0cmFjdFByb3BlcnRpZXNGcm9tU291cmNlRmlsZShzb3VyY2VGaWxlLCBwcm9wZXJ0aWVzLCB0eXBlQWxpYXNlcyk7XG5cdFx0XHRjb25zdHJ1Y3RvclBhcmFtcyA9IHJlc3VsdC5jb25zdHJ1Y3RvclBhcmFtcztcblx0XHRcdFxuXHRcdFx0Ly8gVXNlIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGxvY2F0aW9uIGlmIGZvdW5kXG5cdFx0XHRpZiAocmVzdWx0LmhhbmRsZXJMb2NhdGlvbikge1xuXHRcdFx0XHRoYW5kbGVyTG9jYXRpb24gPSByZXN1bHQuaGFuZGxlckxvY2F0aW9uO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZXJyb3JzLnB1c2goYEVycm9yIHBhcnNpbmcgJHt0YXJnZXRGaWxlfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiB7IHByb3BlcnRpZXMsIGNvbnN0cnVjdG9yUGFyYW1zLCBoYW5kbGVyTG9jYXRpb24gfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb2xsZWN0IHR5cGUgYWxpYXNlcyBmcm9tIHNvdXJjZSBmaWxlXG5cdCAqIGUuZy4sIGV4cG9ydCB0eXBlIFNlbnRpZW5jZURhdGEgPSB7IGF3YXJlbmVzcz86IHN0cmluZzsgfVxuXHQgKi9cblx0cHJpdmF0ZSBjb2xsZWN0VHlwZUFsaWFzZXMgKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBNYXA8c3RyaW5nLCB0cy5UeXBlTm9kZT4ge1xuXHRcdGNvbnN0IHR5cGVBbGlhc2VzID0gbmV3IE1hcDxzdHJpbmcsIHRzLlR5cGVOb2RlPigpO1xuXHRcdFxuXHRcdGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcblx0XHRcdC8vIExvb2sgZm9yIHR5cGUgYWxpYXMgZGVjbGFyYXRpb25zOiBleHBvcnQgdHlwZSBOYW1lID0gVHlwZTtcblx0XHRcdGlmICh0cy5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBub2RlLm5hbWUudGV4dDtcblx0XHRcdFx0dHlwZUFsaWFzZXMuc2V0KG5hbWUsIG5vZGUudHlwZSk7XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG5cdFx0fTtcblx0XHRcblx0XHR2aXNpdChzb3VyY2VGaWxlKTtcblx0XHRyZXR1cm4gdHlwZUFsaWFzZXM7XG5cdH1cblxuXHQvKipcblx0ICogRXh0cmFjdCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBmcm9tIGEgc291cmNlIGZpbGVcblx0ICogUmV0dXJucyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGFuZCBoYW5kbGVyIGxvY2F0aW9uIGlmIGZvdW5kXG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RQcm9wZXJ0aWVzRnJvbVNvdXJjZUZpbGUgKFxuXHRcdHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG5cdFx0cHJvcGVydGllczogTWFwPHN0cmluZywgUHJvcGVydHlJbmZvPixcblx0XHR0eXBlQWxpYXNlcz86IE1hcDxzdHJpbmcsIHRzLlR5cGVOb2RlPlxuXHQpOiB7XG5cdFx0Y29uc3RydWN0b3JQYXJhbXM/OiBDb25zdHJ1Y3RvclBhcmFtSW5mb1tdO1xuXHRcdGhhbmRsZXJMb2NhdGlvbj86IHsgZmlsZVBhdGg6IHN0cmluZzsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9O1xuXHR9IHtcblx0XHRsZXQgY29uc3RydWN0b3JQYXJhbXM6IENvbnN0cnVjdG9yUGFyYW1JbmZvW10gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGhhbmRsZXJMb2NhdGlvbjogeyBmaWxlUGF0aDogc3RyaW5nOyBsaW5lOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cdFx0XG5cdFx0Y29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuXHRcdFx0Ly8gTG9vayBmb3IgZXhwb3J0ZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zICh0b3BvbG9naWNhIGNvbnZlbnRpb246IG9uZSBleHBvcnRlZCBmdW5jdGlvbiBwZXIgZmlsZSlcblx0XHRcdGlmICh0cy5pc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSkgJiYgbm9kZS5uYW1lKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIGl0J3MgZXhwb3J0ZWRcblx0XHRcdFx0Y29uc3QgaXNFeHBvcnRlZCA9IG5vZGUubW9kaWZpZXJzPy5zb21lKG0gPT4gbS5raW5kID09PSB0cy5TeW50YXhLaW5kLkV4cG9ydEtleXdvcmQpO1xuXHRcdFx0XHRcblx0XHRcdFx0aWYgKGlzRXhwb3J0ZWQpIHtcblx0XHRcdFx0XHR0aGlzLmV4dHJhY3RUaGlzUHJvcGVydGllcyhub2RlLCBwcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHQvLyBFeHRyYWN0IGNvbnN0cnVjdG9yIHBhcmFtcyBhbmQgbG9jYXRpb24gZnJvbSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25cblx0XHRcdFx0XHRpZiAoIWNvbnN0cnVjdG9yUGFyYW1zKSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3RvclBhcmFtcyA9IHRoaXMuZXh0cmFjdENvbnN0cnVjdG9yUGFyYW1zKG5vZGUsIHR5cGVBbGlhc2VzKTtcblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGZ1bmN0aW9uIGxvY2F0aW9uXG5cdFx0XHRcdFx0XHRjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID0gdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUZpbGUsXG5cdFx0XHRcdFx0XHRcdG5vZGUuZ2V0U3RhcnQoc291cmNlRmlsZSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRoYW5kbGVyTG9jYXRpb24gPSB7XG5cdFx0XHRcdFx0XHRcdGZpbGVQYXRoIDogc291cmNlRmlsZS5maWxlTmFtZSxcblx0XHRcdFx0XHRcdFx0bGluZSAgICAgOiBsaW5lICsgMSwgLy8gMS1iYXNlZFxuXHRcdFx0XHRcdFx0XHRjb2x1bW4gICA6IGNoYXJhY3RlciArIDEgLy8gMS1iYXNlZFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIEFsc28gY2hlY2sgZnVuY3Rpb24gZXhwcmVzc2lvbnMvYXJyb3cgZnVuY3Rpb25zIGFzc2lnbmVkIHRvIGV4cG9ydHNcblx0XHRcdGVsc2UgaWYgKHRzLmlzRnVuY3Rpb25FeHByZXNzaW9uKG5vZGUpIHx8IHRzLmlzQXJyb3dGdW5jdGlvbihub2RlKSkge1xuXHRcdFx0XHR0aGlzLmV4dHJhY3RUaGlzUHJvcGVydGllcyhub2RlLCBwcm9wZXJ0aWVzKTtcblx0XHRcdFx0Ly8gRXh0cmFjdCBjb25zdHJ1Y3RvciBwYXJhbXMgZnJvbSBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIHRvb1xuXHRcdFx0XHRpZiAoIWNvbnN0cnVjdG9yUGFyYW1zKSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3JQYXJhbXMgPSB0aGlzLmV4dHJhY3RDb25zdHJ1Y3RvclBhcmFtcyhub2RlLCB0eXBlQWxpYXNlcyk7XG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgZnVuY3Rpb24gbG9jYXRpb25cblx0XHRcdFx0XHRjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID0gdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oXG5cdFx0XHRcdFx0XHRzb3VyY2VGaWxlLFxuXHRcdFx0XHRcdFx0bm9kZS5nZXRTdGFydChzb3VyY2VGaWxlKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aGFuZGxlckxvY2F0aW9uID0ge1xuXHRcdFx0XHRcdFx0ZmlsZVBhdGggOiBzb3VyY2VGaWxlLmZpbGVOYW1lLFxuXHRcdFx0XHRcdFx0bGluZSAgICAgOiBsaW5lICsgMSwgLy8gMS1iYXNlZFxuXHRcdFx0XHRcdFx0Y29sdW1uICAgOiBjaGFyYWN0ZXIgKyAxIC8vIDEtYmFzZWRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG5cdFx0fTtcblx0XHRcblx0XHR2aXNpdChzb3VyY2VGaWxlKTtcblx0XHRyZXR1cm4geyBjb25zdHJ1Y3RvclBhcmFtcywgaGFuZGxlckxvY2F0aW9uIH07XG5cdH1cblxuXHQvKipcblx0ICogRXh0cmFjdCBgdGhpcy5wcm9wZXJ0eSA9IHZhbHVlYCBhc3NpZ25tZW50cyBmcm9tIGEgZnVuY3Rpb24gYm9keVxuXHQgKi9cblx0cHJpdmF0ZSBleHRyYWN0VGhpc1Byb3BlcnRpZXMgKFxuXHRcdGZ1bmM6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCB0cy5GdW5jdGlvbkV4cHJlc3Npb24gfCB0cy5BcnJvd0Z1bmN0aW9uLFxuXHRcdHByb3BlcnRpZXM6IE1hcDxzdHJpbmcsIFByb3BlcnR5SW5mbz5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgeyBib2R5IH0gPSBmdW5jO1xuXHRcdGlmICghYm9keSkgcmV0dXJuO1xuXHRcdFxuXHRcdGNvbnN0IHZpc2l0U3RhdGVtZW50cyA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBIYW5kbGUgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzXG5cdFx0XHRpZiAodHMuaXNFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUpKSB7XG5cdFx0XHRcdGNvbnN0IGV4cHIgPSBub2RlLmV4cHJlc3Npb247XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBDaGVjayBmb3IgdGhpcy5wcm9wID0gdmFsdWVcblx0XHRcdFx0aWYgKHRzLmlzQmluYXJ5RXhwcmVzc2lvbihleHByKSAmJiBcblx0XHRcdFx0ICAgIGV4cHIub3BlcmF0b3JUb2tlbi5raW5kID09PSB0cy5TeW50YXhLaW5kLkVxdWFsc1Rva2VuKSB7XG5cdFx0XHRcdFx0Y29uc3QgeyBsZWZ0IH0gPSBleHByO1xuXHRcdFx0XHRcdGNvbnN0IHsgcmlnaHQgfSA9IGV4cHI7XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgbGVmdCBzaWRlIGlzIHRoaXMucHJvcGVydHlcblx0XHRcdFx0XHRpZiAodHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obGVmdCkgJiZcblx0XHRcdFx0XHQgICAgbGVmdC5leHByZXNzaW9uLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVGhpc0tleXdvcmQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHByb3BOYW1lID0gbGVmdC5uYW1lLnRleHQ7XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wVHlwZSA9IHRoaXMuaW5mZXJUeXBlKHJpZ2h0KTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0cHJvcGVydGllcy5zZXQocHJvcE5hbWUsIHtcblx0XHRcdFx0XHRcdFx0bmFtZSAgICAgOiBwcm9wTmFtZSxcblx0XHRcdFx0XHRcdFx0dHlwZSAgICAgOiBwcm9wVHlwZSxcblx0XHRcdFx0XHRcdFx0b3B0aW9uYWwgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cmVhZG9ubHkgOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBDaGVjayBmb3IgT2JqZWN0LmFzc2lnbih0aGlzLCB7Li4ufSlcblx0XHRcdFx0aWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcikpIHtcblx0XHRcdFx0XHRjb25zdCBjYWxsRXhwciA9IGV4cHI7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNPYmplY3RBc3NpZ25DYWxsKGNhbGxFeHByKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5leHRyYWN0RnJvbU9iamVjdEFzc2lnbihjYWxsRXhwciwgcHJvcGVydGllcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdFN0YXRlbWVudHMpO1xuXHRcdH07XG5cdFx0XG5cdFx0dmlzaXRTdGF0ZW1lbnRzKGJvZHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgY2FsbCBleHByZXNzaW9uIGlzIE9iamVjdC5hc3NpZ24odGhpcywgLi4uKVxuXHQgKi9cblx0cHJpdmF0ZSBpc09iamVjdEFzc2lnbkNhbGwgKGNhbGxFeHByOiB0cy5DYWxsRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGV4cHIgPSBjYWxsRXhwci5leHByZXNzaW9uO1xuXHRcdGlmICghdHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24oZXhwcikpIHJldHVybiBmYWxzZTtcblx0XHRcblx0XHRjb25zdCBvYmpOYW1lID0gdHMuaXNJZGVudGlmaWVyKGV4cHIuZXhwcmVzc2lvbikgPyBleHByLmV4cHJlc3Npb24udGV4dCA6IG51bGw7XG5cdFx0Y29uc3QgbWV0aG9kTmFtZSA9IGV4cHIubmFtZS50ZXh0O1xuXHRcdFxuXHRcdGlmIChvYmpOYW1lID09PSAnT2JqZWN0JyAmJiBtZXRob2ROYW1lID09PSAnYXNzaWduJykge1xuXHRcdFx0Y29uc3QgZmlyc3RBcmcgPSBjYWxsRXhwci5hcmd1bWVudHNbIDAgXTtcblx0XHRcdGlmIChmaXJzdEFyZyAmJiBmaXJzdEFyZy5raW5kID09PSB0cy5TeW50YXhLaW5kLlRoaXNLZXl3b3JkKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRXh0cmFjdCBwcm9wZXJ0aWVzIGZyb20gT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKSBwYXR0ZXJuXG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RGcm9tT2JqZWN0QXNzaWduIChcblx0XHRjYWxsRXhwcjogdHMuQ2FsbEV4cHJlc3Npb24sXG5cdFx0cHJvcGVydGllczogTWFwPHN0cmluZywgUHJvcGVydHlJbmZvPlxuXHQpOiB2b2lkIHtcblx0XHQvLyBMb29rIGZvciB0aGUgZGF0YSBhcmd1bWVudCAoc2Vjb25kIGFyZ3VtZW50KVxuXHRcdGNvbnN0IGRhdGFBcmcgPSBjYWxsRXhwci5hcmd1bWVudHNbIDEgXTtcblx0XHRpZiAoIWRhdGFBcmcpIHJldHVybjtcblx0XHRcblx0XHQvLyBJZiBpdCdzIGFuIG9iamVjdCBsaXRlcmFsLCBleHRyYWN0IHByb3BlcnRpZXNcblx0XHRpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkYXRhQXJnKSkge1xuXHRcdFx0Zm9yIChjb25zdCBwcm9wIG9mIGRhdGFBcmcucHJvcGVydGllcykge1xuXHRcdFx0XHRpZiAodHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcCkgJiYgdHMuaXNJZGVudGlmaWVyKHByb3AubmFtZSkpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wTmFtZSA9IHByb3AubmFtZS50ZXh0O1xuXHRcdFx0XHRcdGNvbnN0IHByb3BUeXBlID0gdGhpcy5pbmZlclR5cGUocHJvcC5pbml0aWFsaXplcik7XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0cHJvcGVydGllcy5zZXQocHJvcE5hbWUsIHtcblx0XHRcdFx0XHRcdG5hbWUgICAgIDogcHJvcE5hbWUsXG5cdFx0XHRcdFx0XHR0eXBlICAgICA6IHByb3BUeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9uYWwgOiBmYWxzZSxcblx0XHRcdFx0XHRcdHJlYWRvbmx5IDogZmFsc2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0IGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZnJvbSBhIGZ1bmN0aW9uXG5cdCAqIFNpbWlsYXIgdG8gbWFpbiBhbmFseXplciAtIHNraXBzIGB0aGlzYCBwYXJhbWV0ZXIgYW5kIGV4cGFuZHMgZGF0YSB0eXBlc1xuXHQgKi9cblx0cHJpdmF0ZSBleHRyYWN0Q29uc3RydWN0b3JQYXJhbXMgKFxuXHRcdGZ1bmM6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCB0cy5GdW5jdGlvbkV4cHJlc3Npb24gfCB0cy5BcnJvd0Z1bmN0aW9uLFxuXHRcdHR5cGVBbGlhc2VzPzogTWFwPHN0cmluZywgdHMuVHlwZU5vZGU+XG5cdCk6IENvbnN0cnVjdG9yUGFyYW1JbmZvW10gfCB1bmRlZmluZWQge1xuXHRcdGlmICghZnVuYy5wYXJhbWV0ZXJzIHx8IGZ1bmMucGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyYW1zOiBDb25zdHJ1Y3RvclBhcmFtSW5mb1tdID0gW107XG5cdFx0XG5cdFx0Ly8gU2tpcCBgdGhpc2AgcGFyYW1ldGVyIChmaXJzdCBwYXJhbSkgYW5kIGV4dHJhY3QgZGF0YSBwYXJhbWV0ZXJzXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmdW5jLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHBhcmFtID0gZnVuYy5wYXJhbWV0ZXJzWyBpIF07XG5cdFx0XHRcblx0XHRcdC8vIFNraXAgYHRoaXNgIHBhcmFtZXRlciAoZmlyc3QgcGFyYW0pXG5cdFx0XHRpZiAoaSA9PT0gMCAmJiBwYXJhbS5uYW1lLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuSWRlbnRpZmllciAmJlxuXHRcdFx0ICAgIChwYXJhbS5uYW1lIGFzIHRzLklkZW50aWZpZXIpLnRleHQgPT09ICd0aGlzJykge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0aWYgKCFwYXJhbS50eXBlKSBjb250aW51ZTtcblx0XHRcdFxuXHRcdFx0Y29uc3QgcGFyYW1OYW1lID0gdHMuaXNJZGVudGlmaWVyKHBhcmFtLm5hbWUpID8gcGFyYW0ubmFtZS50ZXh0IDogJ2FyZyc7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IHBhcmFtLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCB8fCBwYXJhbS5pbml0aWFsaXplciAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0XG5cdFx0XHQvLyBFeHBhbmQgdHlwZSB0byBvYmplY3QgbGl0ZXJhbCBpZiBwb3NzaWJsZVxuXHRcdFx0Y29uc3QgZXhwYW5kZWRUeXBlID0gdGhpcy5leHBhbmRUeXBlVG9PYmplY3QocGFyYW0udHlwZSwgdHlwZUFsaWFzZXMpO1xuXHRcdFx0Y29uc3QgcGFyYW1UeXBlID0gZXhwYW5kZWRUeXBlIHx8IHRoaXMudHlwZU5vZGVUb1NpbXBsZVN0cmluZyhwYXJhbS50eXBlKTtcblx0XHRcdFxuXHRcdFx0cGFyYW1zLnB1c2goe1xuXHRcdFx0XHRuYW1lICAgICA6IHBhcmFtTmFtZSxcblx0XHRcdFx0dHlwZSAgICAgOiBwYXJhbVR5cGUsXG5cdFx0XHRcdG9wdGlvbmFsIDogb3B0aW9uYWxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gcGFyYW1zLmxlbmd0aCA+IDAgPyBwYXJhbXMgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogRXhwYW5kIGEgdHlwZSBub2RlIHRvIGl0cyBvYmplY3QgbGl0ZXJhbCByZXByZXNlbnRhdGlvblxuXHQgKiBTaW1pbGFyIHRvIG1haW4gYW5hbHl6ZXIncyByZXNvbHZlVHlwZUFuZEV4dHJhY3Rcblx0ICovXG5cdHByaXZhdGUgZXhwYW5kVHlwZVRvT2JqZWN0IChcblx0XHR0eXBlTm9kZTogdHMuVHlwZU5vZGUsXG5cdFx0dHlwZUFsaWFzZXM/OiBNYXA8c3RyaW5nLCB0cy5UeXBlTm9kZT5cblx0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHQvLyBEaXJlY3QgaW5saW5lIHR5cGUgbGl0ZXJhbDogeyBwcm9wOiB0eXBlIH1cblx0XHRpZiAodHMuaXNUeXBlTGl0ZXJhbE5vZGUodHlwZU5vZGUpKSB7XG5cdFx0XHRjb25zdCBwcm9wczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgbWVtYmVyIG9mIHR5cGVOb2RlLm1lbWJlcnMpIHtcblx0XHRcdFx0aWYgKHRzLmlzUHJvcGVydHlTaWduYXR1cmUobWVtYmVyKSAmJiB0cy5pc0lkZW50aWZpZXIobWVtYmVyLm5hbWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcE5hbWUgPSBtZW1iZXIubmFtZS50ZXh0O1xuXHRcdFx0XHRcdGNvbnN0IG9wdCA9IG1lbWJlci5xdWVzdGlvblRva2VuID8gJz8nIDogJyc7XG5cdFx0XHRcdFx0Y29uc3QgdHlwZSA9IHRoaXMudHlwZU5vZGVUb1NpbXBsZVN0cmluZyhtZW1iZXIudHlwZSk7XG5cdFx0XHRcdFx0cHJvcHMucHVzaChgJHtwcm9wTmFtZX0ke29wdH06ICR7dHlwZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGB7ICR7cHJvcHMuam9pbignOyAnKX0gfWA7XG5cdFx0fVxuXG5cdFx0Ly8gVHlwZSByZWZlcmVuY2U6IFNlbnRpZW5jZURhdGEsIGV0Yy4gLSB0cnkgdG8gZXhwYW5kIGZyb20gdHlwZSBhbGlhc2VzXG5cdFx0aWYgKHRzLmlzVHlwZVJlZmVyZW5jZU5vZGUodHlwZU5vZGUpICYmIHRzLmlzSWRlbnRpZmllcih0eXBlTm9kZS50eXBlTmFtZSkpIHtcblx0XHRcdGNvbnN0IHR5cGVOYW1lID0gdHlwZU5vZGUudHlwZU5hbWUudGV4dDtcblx0XHRcdFxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSB0eXBlIGFsaWFzZXMsIHRyeSB0byBleHBhbmQgdGhlIHJlZmVyZW5jZWQgdHlwZVxuXHRcdFx0aWYgKHR5cGVBbGlhc2VzKSB7XG5cdFx0XHRcdGNvbnN0IGFsaWFzZWRUeXBlID0gdHlwZUFsaWFzZXMuZ2V0KHR5cGVOYW1lKTtcblx0XHRcdFx0aWYgKGFsaWFzZWRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZFR5cGVUb09iamVjdChhbGlhc2VkVHlwZSwgdHlwZUFsaWFzZXMpO1xuXHRcdFx0XHRcdGlmIChleHBhbmRlZCkgcmV0dXJuIGV4cGFuZGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdC8vIElmIG5vdCBhbiBvYmplY3QgdHlwZSBhbGlhcywgcmV0dXJuIHRoZSB0eXBlIG5hbWVcblx0XHRcdHJldHVybiB0eXBlTmFtZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgYSBUeXBlU2NyaXB0IHR5cGUgbm9kZSB0byBhIHNpbXBsZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHByaXZhdGUgdHlwZU5vZGVUb1NpbXBsZVN0cmluZyAodHlwZU5vZGU6IHRzLlR5cGVOb2RlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcblx0XHRpZiAoIXR5cGVOb2RlKSByZXR1cm4gJ2FueSc7XG5cdFx0XG5cdFx0c3dpdGNoICh0eXBlTm9kZS5raW5kKSB7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG5cdFx0XHRyZXR1cm4gJ3N0cmluZyc7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLk51bWJlcktleXdvcmQ6XG5cdFx0XHRyZXR1cm4gJ251bWJlcic7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkOlxuXHRcdFx0cmV0dXJuICdib29sZWFuJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuQW55S2V5d29yZDpcblx0XHRcdHJldHVybiAnYW55Jztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOlxuXHRcdFx0cmV0dXJuICdBcnJheTxhbnk+Jztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZToge1xuXHRcdFx0Y29uc3QgdHlwZVJlZiA9IHR5cGVOb2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuXHRcdFx0aWYgKHRzLmlzSWRlbnRpZmllcih0eXBlUmVmLnR5cGVOYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHlwZVJlZi50eXBlTmFtZS50ZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICdhbnknO1xuXHRcdH1cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuICdhbnknO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBJbmZlciBUeXBlU2NyaXB0IHR5cGUgZnJvbSBhbiBleHByZXNzaW9uXG5cdCAqL1xuXHRwcml2YXRlIGluZmVyVHlwZSAobm9kZTogdHMuRXhwcmVzc2lvbik6IHN0cmluZyB7XG5cdFx0c3dpdGNoIChub2RlLmtpbmQpIHtcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDpcblx0XHRcdHJldHVybiAnc3RyaW5nJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWw6XG5cdFx0XHRyZXR1cm4gJ251bWJlcic7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLlRydWVLZXl3b3JkOlxuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5GYWxzZUtleXdvcmQ6XG5cdFx0XHRyZXR1cm4gJ2Jvb2xlYW4nO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcblx0XHRcdHJldHVybiAnbnVsbCc7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQ6XG5cdFx0XHRyZXR1cm4gJ3VuZGVmaW5lZCc7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb246XG5cdFx0XHRyZXR1cm4gJ0FycmF5PGFueT4nO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjpcblx0XHRcdHJldHVybiAnb2JqZWN0Jztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuTmV3RXhwcmVzc2lvbjpcblx0XHRcdHJldHVybiB0aGlzLmluZmVyTmV3RXhwcmVzc2lvblR5cGUobm9kZSBhcyB0cy5OZXdFeHByZXNzaW9uKTtcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuQ29uZGl0aW9uYWxFeHByZXNzaW9uOlxuXHRcdFx0cmV0dXJuIHRoaXMuaW5mZXJUeXBlKChub2RlIGFzIHRzLkNvbmRpdGlvbmFsRXhwcmVzc2lvbikud2hlblRydWUpO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5CaW5hcnlFeHByZXNzaW9uOiB7XG5cdFx0XHRjb25zdCBiaW5FeHByID0gbm9kZSBhcyB0cy5CaW5hcnlFeHByZXNzaW9uO1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIGxvZ2ljYWwgT1IgcGF0dGVybjogdmFsdWUgfHwgZGVmYXVsdFxuXHRcdFx0aWYgKGJpbkV4cHIub3BlcmF0b3JUb2tlbi5raW5kID09PSB0cy5TeW50YXhLaW5kLkJhckJhclRva2VuKSB7XG5cdFx0XHRcdC8vIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmlnaHQgc2lkZSAodGhlIGRlZmF1bHQgdmFsdWUpXG5cdFx0XHRcdHJldHVybiB0aGlzLmluZmVyVHlwZShiaW5FeHByLnJpZ2h0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAnYW55Jztcblx0XHR9XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbjoge1xuXHRcdFx0Y29uc3QgcHJvcEFjY2VzcyA9IG5vZGUgYXMgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uO1xuXHRcdFx0Ly8gSGFuZGxlIGRhdGE/LnByb3BlcnR5IHBhdHRlcm5zXG5cdFx0XHRyZXR1cm4gdGhpcy5pbmZlclR5cGUocHJvcEFjY2Vzcyk7XG5cdFx0fVxuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbjoge1xuXHRcdFx0Y29uc3QgY2FsbEV4cHIgPSBub2RlIGFzIHRzLkNhbGxFeHByZXNzaW9uO1xuXHRcdFx0cmV0dXJuIHRoaXMuaW5mZXJDYWxsRXhwcmVzc2lvblR5cGUoY2FsbEV4cHIpO1xuXHRcdH1cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuICdhbnknO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBJbmZlciB0eXBlIGZyb20gbmV3IGV4cHJlc3Npb25zIGxpa2UgbmV3IERhdGUoKSwgbmV3IEFycmF5KCksIGV0Yy5cblx0ICovXG5cdHByaXZhdGUgaW5mZXJOZXdFeHByZXNzaW9uVHlwZSAobm9kZTogdHMuTmV3RXhwcmVzc2lvbik6IHN0cmluZyB7XG5cdFx0Y29uc3QgZXhwciA9IG5vZGUuZXhwcmVzc2lvbjtcblx0XHRpZiAodHMuaXNJZGVudGlmaWVyKGV4cHIpKSB7XG5cdFx0XHRzd2l0Y2ggKGV4cHIudGV4dCkge1xuXHRcdFx0Y2FzZSAnRGF0ZSc6XG5cdFx0XHRcdHJldHVybiAnbnVtYmVyJzsgLy8gRGF0ZS5ub3coKSByZXR1cm5zIG51bWJlclxuXHRcdFx0Y2FzZSAnQXJyYXknOlxuXHRcdFx0XHRyZXR1cm4gJ0FycmF5PGFueT4nO1xuXHRcdFx0Y2FzZSAnTWFwJzpcblx0XHRcdFx0cmV0dXJuICdNYXA8YW55LCBhbnk+Jztcblx0XHRcdGNhc2UgJ1NldCc6XG5cdFx0XHRcdHJldHVybiAnU2V0PGFueT4nO1xuXHRcdFx0Y2FzZSAnUmVnRXhwJzpcblx0XHRcdFx0cmV0dXJuICdSZWdFeHAnO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGV4cHIudGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICdhbnknO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZmVyIHR5cGUgZnJvbSBjYWxsIGV4cHJlc3Npb25zIGxpa2UgRGF0ZS5ub3coKSwgcGFyc2VJbnQoKSwgZXRjLlxuXHQgKi9cblx0cHJpdmF0ZSBpbmZlckNhbGxFeHByZXNzaW9uVHlwZSAobm9kZTogdHMuQ2FsbEV4cHJlc3Npb24pOiBzdHJpbmcge1xuXHRcdGNvbnN0IGV4cHIgPSBub2RlLmV4cHJlc3Npb247XG5cdFx0XG5cdFx0Ly8gSGFuZGxlIERhdGUubm93KClcblx0XHRpZiAodHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24oZXhwcikpIHtcblx0XHRcdGNvbnN0IG9iaiA9IGV4cHIuZXhwcmVzc2lvbjtcblx0XHRcdGNvbnN0IG1ldGhvZCA9IGV4cHIubmFtZS50ZXh0O1xuXHRcdFx0XG5cdFx0XHRpZiAodHMuaXNJZGVudGlmaWVyKG9iaikgJiYgb2JqLnRleHQgPT09ICdEYXRlJyAmJiBtZXRob2QgPT09ICdub3cnKSB7XG5cdFx0XHRcdHJldHVybiAnbnVtYmVyJztcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gSGFuZGxlIHBhcnNlSW50LCBwYXJzZUZsb2F0LCBTdHJpbmcoKSwgTnVtYmVyKCksIEJvb2xlYW4oKVxuXHRcdGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcikpIHtcblx0XHRcdHN3aXRjaCAoZXhwci50ZXh0KSB7XG5cdFx0XHRjYXNlICdwYXJzZUludCc6XG5cdFx0XHRjYXNlICdwYXJzZUZsb2F0Jzpcblx0XHRcdFx0cmV0dXJuICdudW1iZXInO1xuXHRcdFx0Y2FzZSAnU3RyaW5nJzpcblx0XHRcdFx0cmV0dXJuICdzdHJpbmcnO1xuXHRcdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdFx0cmV0dXJuICdudW1iZXInO1xuXHRcdFx0Y2FzZSAnQm9vbGVhbic6XG5cdFx0XHRcdHJldHVybiAnYm9vbGVhbic7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiAnYW55Jztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHR5cGUgZ3JhcGhcblx0ICovXG5cdGdldEdyYXBoICgpOiBUeXBlR3JhcGhJbXBsIHtcblx0XHRyZXR1cm4gdGhpcy5ncmFwaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgY29sbGVjdGVkIGVycm9yc1xuXHQgKi9cblx0Z2V0RXJyb3JzICgpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXJyb3JzO1xuXHR9XG59XG4iXX0=
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wb2xvZ2ljYS1hbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90b3BvbG9naWNhLWFuYWx5emVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwrQ0FBaUM7QUFJakMsbUNBQXdDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQWEsa0JBQWtCO0lBQS9CO1FBQ1MsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixVQUFLLEdBQUcsSUFBSSxxQkFBYSxFQUFFLENBQUM7SUE0aUJyQyxDQUFDO0lBMWlCQTs7T0FFRztJQUNILGdCQUFnQixDQUFFLGFBQXFCO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDL0QsT0FBTyxFQUFFLEtBQUssRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5RCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFh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QUFPLFFBQVEsQ0FBQztnQkFDakIsS0FBSyxTQUFTO29CQUNiLE9BQU8sU0FBUyxDQUFDO1lBQ2xCLENBQUM7UUFDRixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDcEIsQ0FBQztDQUNEO0FBOWlCRCxnREE4aUJDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge1xuXHRUeXBlTm9kZSwgUHJvcGVydHlJbmZvLCBDb25zdHJ1Y3RvclBhcmFtSW5mbyBcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBUeXBlR3JhcGhJbXBsIH0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogQW5hbHl6ZXIgZm9yIFRvcG9sb2dpY2EgZGlyZWN0b3J5LWJhc2VkIHR5cGUgZGVmaW5pdGlvbnNcbiAqIFNjYW5zIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHRvIGNyZWF0ZSB0eXBlIGhpZXJhcmNoaWVzIGxpa2U6XG4gKiBhaS10eXBlcy9TZW50aWVuY2UvQ29uc2Npb3VzbmVzcy9FbXBhdGh5L0dyYXRpdHVkZS9cbiAqIFxuICogTm93IHdpdGggQVNULWJhc2VkIHByb3BlcnR5IGV4dHJhY3Rpb24gZnJvbSBUeXBlU2NyaXB0L0phdmFTY3JpcHQgZmlsZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFRvcG9sb2dpY2FBbmFseXplciB7XG5cdHByaXZhdGUgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIGdyYXBoID0gbmV3IFR5cGVHcmFwaEltcGwoKTtcblxuXHQvKipcblx0ICogQW5hbHl6ZSBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHRvcG9sb2dpY2EgdHlwZSBkZWZpbml0aW9uc1xuXHQgKi9cblx0YW5hbHl6ZURpcmVjdG9yeSAoZGlyZWN0b3J5UGF0aDogc3RyaW5nKTogeyB0eXBlczogTWFwPHN0cmluZywgVHlwZU5vZGU+LCBlcnJvcnM6IHN0cmluZ1tdIH0ge1xuXHRcdHRoaXMuZXJyb3JzID0gW107XG5cdFx0XG5cdFx0aWYgKCFmcy5leGlzdHNTeW5jKGRpcmVjdG9yeVBhdGgpKSB7XG5cdFx0XHR0aGlzLmVycm9ycy5wdXNoKGBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7ZGlyZWN0b3J5UGF0aH1gKTtcblx0XHRcdHJldHVybiB7IHR5cGVzIDogdGhpcy5ncmFwaC5hbGxUeXBlcywgZXJyb3JzIDogdGhpcy5lcnJvcnMgfTtcblx0XHR9XG5cblx0XHRpZiAoIWZzLnN0YXRTeW5jKGRpcmVjdG9yeVBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcblx0XHRcdHRoaXMuZXJyb3JzLnB1c2goYFBhdGggaXMgbm90IGEgZGlyZWN0b3J5OiAke2RpcmVjdG9yeVBhdGh9YCk7XG5cdFx0XHRyZXR1cm4geyB0eXBlcyA6IHRoaXMuZ3JhcGguYWxsVHlwZXMsIGVycm9ycyA6IHRoaXMuZXJyb3JzIH07XG5cdFx0fVxuXG5cdFx0dGhpcy5zY2FuRGlyZWN0b3J5KGRpcmVjdG9yeVBhdGgsIHVuZGVmaW5lZCwgZGlyZWN0b3J5UGF0aCk7XG5cdFx0XG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGVzICA6IHRoaXMuZ3JhcGguYWxsVHlwZXMsXG5cdFx0XHRlcnJvcnMgOiB0aGlzLmVycm9ycyxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlY3Vyc2l2ZWx5IHNjYW4gZGlyZWN0b3J5IHN0cnVjdHVyZSB0byBidWlsZCB0eXBlIGhpZXJhcmNoeVxuXHQgKi9cblx0cHJpdmF0ZSBzY2FuRGlyZWN0b3J5IChjdXJyZW50UGF0aDogc3RyaW5nLCBwYXJlbnROb2RlOiBUeXBlTm9kZSB8IHVuZGVmaW5lZCwgcm9vdFBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudFBhdGgsIHsgd2l0aEZpbGVUeXBlcyA6IHRydWUgfSk7XG5cdFx0XHRcblx0XHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0XHRpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0XHRcdC8vIENyZWF0ZSB0eXBlIG5vZGUgZm9yIHRoaXMgZGlyZWN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgdHlwZU5hbWUgPSBlbnRyeS5uYW1lO1xuXHRcdFx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gcGFyZW50Tm9kZSA/IGAke3BhcmVudE5vZGUuZnVsbFBhdGh9LiR7dHlwZU5hbWV9YCA6IHR5cGVOYW1lO1xuXHRcdFx0XHRcdGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vIEV4dHJhY3QgcHJvcGVydGllcyBhbmQgY29uc3RydWN0b3IgcGFyYW1zIGZyb20gdGhlIGhhbmRsZXIgZmlsZSBpZiBpdCBleGlzdHNcblx0XHRcdFx0XHRjb25zdCB7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzLCBjb25zdHJ1Y3RvclBhcmFtcywgaGFuZGxlckxvY2F0aW9uIFxuXHRcdFx0XHRcdH0gPSB0aGlzLmV4dHJhY3RQcm9wZXJ0aWVzRnJvbURpcihkaXJQYXRoKTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBDcmVhdGUgdGhlIHR5cGUgbm9kZSB3aXRoIHByb3BlciBzb3VyY2UgbG9jYXRpb24gZm9yIEdvIHRvIERlZmluaXRpb25cblx0XHRcdFx0XHRjb25zdCB0eXBlTm9kZTogVHlwZU5vZGUgPSB7XG5cdFx0XHRcdFx0XHRuYW1lICAgICAgICAgICAgICA6IHR5cGVOYW1lLFxuXHRcdFx0XHRcdFx0ZnVsbFBhdGggICAgICAgICAgOiBmdWxsUGF0aCxcblx0XHRcdFx0XHRcdHByb3BlcnRpZXMgICAgICAgIDogcHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yUGFyYW1zIDogY29uc3RydWN0b3JQYXJhbXMsXG5cdFx0XHRcdFx0XHRwYXJlbnQgICAgICAgICAgICA6IHBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRjaGlsZHJlbiAgICAgICAgICA6IG5ldyBNYXAoKSxcblx0XHRcdFx0XHRcdHNvdXJjZUZpbGUgICAgICAgIDogaGFuZGxlckxvY2F0aW9uPy5maWxlUGF0aCB8fCBkaXJQYXRoLFxuXHRcdFx0XHRcdFx0bGluZSAgICAgICAgICAgICAgOiBoYW5kbGVyTG9jYXRpb24/LmxpbmUgfHwgMCxcblx0XHRcdFx0XHRcdGNvbHVtbiAgICAgICAgICAgIDogaGFuZGxlckxvY2F0aW9uPy5jb2x1bW4gfHwgMCxcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yTmFtZSAgIDogdHlwZU5hbWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vIEFkZCB0byBncmFwaFxuXHRcdFx0XHRcdGlmIChwYXJlbnROb2RlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmdyYXBoLmFkZENoaWxkKHBhcmVudE5vZGUsIHR5cGVOb2RlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIGFzIHJvb3QgdHlwZVxuXHRcdFx0XHRcdFx0dGhpcy5ncmFwaC5hZGRSb290KHR5cGVOb2RlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8gU2NhbiBjaGlsZHJlbiBvZiB0aGlzIGRpcmVjdG9yeVxuXHRcdFx0XHRcdHRoaXMuc2NhbkRpcmVjdG9yeShkaXJQYXRoLCB0eXBlTm9kZSwgcm9vdFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZXJyb3JzLnB1c2goYEVycm9yIHNjYW5uaW5nIGRpcmVjdG9yeSAke2N1cnJlbnRQYXRofTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4dHJhY3QgcHJvcGVydGllcyBmcm9tIGEgZGlyZWN0b3J5J3MgaW5kZXggZmlsZVxuXHQgKiBTdXBwb3J0cyBib3RoIC50cyBhbmQgLmpzIGZpbGVzXG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RQcm9wZXJ0aWVzRnJvbURpciAoZGlyUGF0aDogc3RyaW5nKToge1xuXHRcdHByb3BlcnRpZXM6IE1hcDxzdHJpbmcsIFByb3BlcnR5SW5mbz47XG5cdFx0Y29uc3RydWN0b3JQYXJhbXM/OiBDb25zdHJ1Y3RvclBhcmFtSW5mb1tdO1xuXHRcdGhhbmRsZXJMb2NhdGlvbj86IHsgZmlsZVBhdGg6IHN0cmluZzsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9O1xuXHR9IHtcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIFByb3BlcnR5SW5mbz4oKTtcblx0XHRsZXQgY29uc3RydWN0b3JQYXJhbXM6IENvbnN0cnVjdG9yUGFyYW1JbmZvW10gfCB1bmRlZmluZWQ7XG5cdFx0XG5cdFx0Ly8gQ2hlY2sgZm9yIFR5cGVTY3JpcHQgZmlsZSBmaXJzdCwgdGhlbiBKYXZhU2NyaXB0XG5cdFx0Y29uc3QgdHNGaWxlID0gcGF0aC5qb2luKGRpclBhdGgsICdpbmRleC50cycpO1xuXHRcdGNvbnN0IGpzRmlsZSA9IHBhdGguam9pbihkaXJQYXRoLCAnaW5kZXguanMnKTtcblx0XHRcblx0XHRsZXQgdGFyZ2V0RmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFxuXHRcdGlmIChmcy5leGlzdHNTeW5jKHRzRmlsZSkpIHtcblx0XHRcdHRhcmdldEZpbGUgPSB0c0ZpbGU7XG5cdFx0fSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKGpzRmlsZSkpIHtcblx0XHRcdHRhcmdldEZpbGUgPSBqc0ZpbGU7XG5cdFx0fVxuXHRcdFxuXHRcdGlmICghdGFyZ2V0RmlsZSkge1xuXHRcdFx0cmV0dXJuIHsgcHJvcGVydGllcyB9O1xuXHRcdH1cblx0XHRcblx0XHQvLyBEZWZhdWx0IGxvY2F0aW9uIHBvaW50cyB0byB0aGUgaW5kZXggZmlsZSAod2lsbCBiZSB1cGRhdGVkIGlmIGhhbmRsZXIgZm91bmQpXG5cdFx0bGV0IGhhbmRsZXJMb2NhdGlvbjogeyBmaWxlUGF0aDogc3RyaW5nOyBsaW5lOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cdFx0XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0RmlsZSwgJ3V0Zi04Jyk7XG5cdFx0XHRjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcblx0XHRcdFx0dGFyZ2V0RmlsZSxcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdFx0dHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KTtcblx0XHRcdFxuXHRcdFx0Ly8gQ29sbGVjdCB0eXBlIGFsaWFzZXMgZnJvbSB0aGUgZmlsZSAoZS5nLiwgU2VudGllbmNlRGF0YSA9IHsgLi4uIH0pXG5cdFx0XHRjb25zdCB0eXBlQWxpYXNlcyA9IHRoaXMuY29sbGVjdFR5cGVBbGlhc2VzKHNvdXJjZUZpbGUpO1xuXHRcdFx0XG5cdFx0XHQvLyBGaW5kIGhhbmRsZXIgZnVuY3Rpb24gYW5kIGV4dHJhY3QgcHJvcGVydHkgYXNzaWdubWVudHMgYW5kIGNvbnN0cnVjdG9yIHBhcmFtc1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5leHRyYWN0UHJvcGVydGllc0Zyb21Tb3VyY2VGaWxlKHNvdXJjZUZpbGUsIHByb3BlcnRpZXMsIHR5cGVBbGlhc2VzKTtcblx0XHRcdCggeyBjb25zdHJ1Y3RvclBhcmFtcyB9ID0gcmVzdWx0ICk7XG5cblx0XHRcdC8vIFVzZSB0aGUgaGFuZGxlciBmdW5jdGlvbiBsb2NhdGlvbiBpZiBmb3VuZFxuXHRcdFx0aWYgKHJlc3VsdC5oYW5kbGVyTG9jYXRpb24pIHtcblx0XHRcdFx0KCB7IGhhbmRsZXJMb2NhdGlvbiB9ID0gcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5lcnJvcnMucHVzaChgRXJyb3IgcGFyc2luZyAke3RhcmdldEZpbGV9OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIHsgcHJvcGVydGllcywgY29uc3RydWN0b3JQYXJhbXMsIGhhbmRsZXJMb2NhdGlvbiB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbGxlY3QgdHlwZSBhbGlhc2VzIGZyb20gc291cmNlIGZpbGVcblx0ICogZS5nLiwgZXhwb3J0IHR5cGUgU2VudGllbmNlRGF0YSA9IHsgYXdhcmVuZXNzPzogc3RyaW5nOyB9XG5cdCAqL1xuXHRwcml2YXRlIGNvbGxlY3RUeXBlQWxpYXNlcyAoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IE1hcDxzdHJpbmcsIHRzLlR5cGVOb2RlPiB7XG5cdFx0Y29uc3QgdHlwZUFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgdHMuVHlwZU5vZGU+KCk7XG5cdFx0XG5cdFx0Y29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuXHRcdFx0Ly8gTG9vayBmb3IgdHlwZSBhbGlhcyBkZWNsYXJhdGlvbnM6IGV4cG9ydCB0eXBlIE5hbWUgPSBUeXBlO1xuXHRcdFx0aWYgKHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSkpIHtcblx0XHRcdFx0Y29uc3QgbmFtZSA9IG5vZGUubmFtZS50ZXh0O1xuXHRcdFx0XHR0eXBlQWxpYXNlcy5zZXQobmFtZSwgbm9kZS50eXBlKTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0dHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcblx0XHR9O1xuXHRcdFxuXHRcdHZpc2l0KHNvdXJjZUZpbGUpO1xuXHRcdHJldHVybiB0eXBlQWxpYXNlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0IHByb3BlcnR5IGFzc2lnbm1lbnRzIGZyb20gYSBzb3VyY2UgZmlsZVxuXHQgKiBSZXR1cm5zIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYW5kIGhhbmRsZXIgbG9jYXRpb24gaWYgZm91bmRcblx0ICovXG5cdHByaXZhdGUgZXh0cmFjdFByb3BlcnRpZXNGcm9tU291cmNlRmlsZSAoXG5cdFx0c291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcblx0XHRwcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBQcm9wZXJ0eUluZm8+LFxuXHRcdHR5cGVBbGlhc2VzPzogTWFwPHN0cmluZywgdHMuVHlwZU5vZGU+XG5cdCk6IHtcblx0XHRjb25zdHJ1Y3RvclBhcmFtcz86IENvbnN0cnVjdG9yUGFyYW1JbmZvW107XG5cdFx0aGFuZGxlckxvY2F0aW9uPzogeyBmaWxlUGF0aDogc3RyaW5nOyBsaW5lOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyIH07XG5cdH0ge1xuXHRcdGxldCBjb25zdHJ1Y3RvclBhcmFtczogQ29uc3RydWN0b3JQYXJhbUluZm9bXSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgaGFuZGxlckxvY2F0aW9uOiB7IGZpbGVQYXRoOiBzdHJpbmc7IGxpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcblx0XHRcblx0XHRjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBMb29rIGZvciBleHBvcnRlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKHRvcG9sb2dpY2EgY29udmVudGlvbjogb25lIGV4cG9ydGVkIGZ1bmN0aW9uIHBlciBmaWxlKVxuXHRcdFx0aWYgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLm5hbWUpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBleHBvcnRlZFxuXHRcdFx0XHRjb25zdCBpc0V4cG9ydGVkID0gbm9kZS5tb2RpZmllcnM/LnNvbWUobSA9PiBtLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCk7XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiAoaXNFeHBvcnRlZCkge1xuXHRcdFx0XHRcdHRoaXMuZXh0cmFjdFRoaXNQcm9wZXJ0aWVzKG5vZGUsIHByb3BlcnRpZXMpO1xuXHRcdFx0XHRcdC8vIEV4dHJhY3QgY29uc3RydWN0b3IgcGFyYW1zIGFuZCBsb2NhdGlvbiBmcm9tIHRoZSBleHBvcnRlZCBmdW5jdGlvblxuXHRcdFx0XHRcdGlmICghY29uc3RydWN0b3JQYXJhbXMpIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yUGFyYW1zID0gdGhpcy5leHRyYWN0Q29uc3RydWN0b3JQYXJhbXMobm9kZSwgdHlwZUFsaWFzZXMpO1xuXHRcdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgZnVuY3Rpb24gbG9jYXRpb25cblx0XHRcdFx0XHRcdGNvbnN0IHsgbGluZSwgY2hhcmFjdGVyIH0gPSB0cy5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihcblx0XHRcdFx0XHRcdFx0c291cmNlRmlsZSxcblx0XHRcdFx0XHRcdFx0bm9kZS5nZXRTdGFydChzb3VyY2VGaWxlKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdC8vIGxpbmUgYW5kIGNvbHVtbiBhcmUgMS1iYXNlZFxuXHRcdFx0XHRcdFx0aGFuZGxlckxvY2F0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHRmaWxlUGF0aCA6IHNvdXJjZUZpbGUuZmlsZU5hbWUsXG5cdFx0XHRcdFx0XHRcdGxpbmUgICAgIDogbGluZSArIDEsXG5cdFx0XHRcdFx0XHRcdGNvbHVtbiAgIDogY2hhcmFjdGVyICsgMVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIEFsc28gY2hlY2sgZnVuY3Rpb24gZXhwcmVzc2lvbnMvYXJyb3cgZnVuY3Rpb25zIGFzc2lnbmVkIHRvIGV4cG9ydHNcblx0XHRcdGVsc2UgaWYgKHRzLmlzRnVuY3Rpb25FeHByZXNzaW9uKG5vZGUpIHx8IHRzLmlzQXJyb3dGdW5jdGlvbihub2RlKSkge1xuXHRcdFx0XHR0aGlzLmV4dHJhY3RUaGlzUHJvcGVydGllcyhub2RlLCBwcm9wZXJ0aWVzKTtcblx0XHRcdFx0Ly8gRXh0cmFjdCBjb25zdHJ1Y3RvciBwYXJhbXMgZnJvbSBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIHRvb1xuXHRcdFx0XHRpZiAoIWNvbnN0cnVjdG9yUGFyYW1zKSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3JQYXJhbXMgPSB0aGlzLmV4dHJhY3RDb25zdHJ1Y3RvclBhcmFtcyhub2RlLCB0eXBlQWxpYXNlcyk7XG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgZnVuY3Rpb24gbG9jYXRpb25cblx0XHRcdFx0XHRjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID0gdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oXG5cdFx0XHRcdFx0XHRzb3VyY2VGaWxlLFxuXHRcdFx0XHRcdFx0bm9kZS5nZXRTdGFydChzb3VyY2VGaWxlKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Ly8gbGluZSBhbmQgY29sdW1uIGFyZSAxLWJhc2VkXG5cdFx0XHRcdFx0aGFuZGxlckxvY2F0aW9uID0ge1xuXHRcdFx0XHRcdFx0ZmlsZVBhdGggOiBzb3VyY2VGaWxlLmZpbGVOYW1lLFxuXHRcdFx0XHRcdFx0bGluZSAgICAgOiBsaW5lICsgMSxcblx0XHRcdFx0XHRcdGNvbHVtbiAgIDogY2hhcmFjdGVyICsgMVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0dHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcblx0XHR9O1xuXHRcdFxuXHRcdHZpc2l0KHNvdXJjZUZpbGUpO1xuXHRcdHJldHVybiB7IGNvbnN0cnVjdG9yUGFyYW1zLCBoYW5kbGVyTG9jYXRpb24gfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0IGB0aGlzLnByb3BlcnR5ID0gdmFsdWVgIGFzc2lnbm1lbnRzIGZyb20gYSBmdW5jdGlvbiBib2R5XG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RUaGlzUHJvcGVydGllcyAoXG5cdFx0ZnVuYzogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IHRzLkZ1bmN0aW9uRXhwcmVzc2lvbiB8IHRzLkFycm93RnVuY3Rpb24sXG5cdFx0cHJvcGVydGllczogTWFwPHN0cmluZywgUHJvcGVydHlJbmZvPlxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCB7IGJvZHkgfSA9IGZ1bmM7XG5cdFx0aWYgKCFib2R5KSByZXR1cm47XG5cdFx0XG5cdFx0Y29uc3QgdmlzaXRTdGF0ZW1lbnRzID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcblx0XHRcdC8vIEhhbmRsZSBleHByZXNzaW9uIHN0YXRlbWVudHNcblx0XHRcdGlmICh0cy5pc0V4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkpIHtcblx0XHRcdFx0Y29uc3QgZXhwciA9IG5vZGUuZXhwcmVzc2lvbjtcblx0XHRcdFx0XG5cdFx0XHRcdC8vIENoZWNrIGZvciB0aGlzLnByb3AgPSB2YWx1ZVxuXHRcdFx0XHRpZiAodHMuaXNCaW5hcnlFeHByZXNzaW9uKGV4cHIpICYmIFxuXHRcdFx0XHQgICAgZXhwci5vcGVyYXRvclRva2VuLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRXF1YWxzVG9rZW4pIHtcblx0XHRcdFx0XHRjb25zdCB7IGxlZnQgfSA9IGV4cHI7XG5cdFx0XHRcdFx0Y29uc3QgeyByaWdodCB9ID0gZXhwcjtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBDaGVjayBpZiBsZWZ0IHNpZGUgaXMgdGhpcy5wcm9wZXJ0eVxuXHRcdFx0XHRcdGlmICh0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihsZWZ0KSAmJlxuXHRcdFx0XHRcdCAgICBsZWZ0LmV4cHJlc3Npb24ua2luZCA9PT0gdHMuU3ludGF4S2luZC5UaGlzS2V5d29yZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJvcE5hbWUgPSBsZWZ0Lm5hbWUudGV4dDtcblx0XHRcdFx0XHRcdGNvbnN0IHByb3BUeXBlID0gdGhpcy5pbmZlclR5cGUocmlnaHQpO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzLnNldChwcm9wTmFtZSwge1xuXHRcdFx0XHRcdFx0XHRuYW1lICAgICA6IHByb3BOYW1lLFxuXHRcdFx0XHRcdFx0XHR0eXBlICAgICA6IHByb3BUeXBlLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25hbCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRyZWFkb25seSA6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRcdC8vIENoZWNrIGZvciBPYmplY3QuYXNzaWduKHRoaXMsIHsuLi59KVxuXHRcdFx0XHRpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihleHByKSkge1xuXHRcdFx0XHRcdGNvbnN0IGNhbGxFeHByID0gZXhwcjtcblx0XHRcdFx0XHRpZiAodGhpcy5pc09iamVjdEFzc2lnbkNhbGwoY2FsbEV4cHIpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4dHJhY3RGcm9tT2JqZWN0QXNzaWduKGNhbGxFeHByLCBwcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0dHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0U3RhdGVtZW50cyk7XG5cdFx0fTtcblx0XHRcblx0XHR2aXNpdFN0YXRlbWVudHMoYm9keSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBjYWxsIGV4cHJlc3Npb24gaXMgT2JqZWN0LmFzc2lnbih0aGlzLCAuLi4pXG5cdCAqL1xuXHRwcml2YXRlIGlzT2JqZWN0QXNzaWduQ2FsbCAoY2FsbEV4cHI6IHRzLkNhbGxFeHByZXNzaW9uKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZXhwciA9IGNhbGxFeHByLmV4cHJlc3Npb247XG5cdFx0aWYgKCF0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihleHByKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFxuXHRcdGNvbnN0IG9iak5hbWUgPSB0cy5pc0lkZW50aWZpZXIoZXhwci5leHByZXNzaW9uKSA/IGV4cHIuZXhwcmVzc2lvbi50ZXh0IDogbnVsbDtcblx0XHRjb25zdCBtZXRob2ROYW1lID0gZXhwci5uYW1lLnRleHQ7XG5cdFx0XG5cdFx0aWYgKG9iak5hbWUgPT09ICdPYmplY3QnICYmIG1ldGhvZE5hbWUgPT09ICdhc3NpZ24nKSB7XG5cdFx0XHRjb25zdCBbIGZpcnN0QXJnIF0gPSBjYWxsRXhwci5hcmd1bWVudHM7XG5cdFx0XHRpZiAoZmlyc3RBcmcgJiYgZmlyc3RBcmcua2luZCA9PT0gdHMuU3ludGF4S2luZC5UaGlzS2V5d29yZCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4dHJhY3QgcHJvcGVydGllcyBmcm9tIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSkgcGF0dGVyblxuXHQgKi9cblx0cHJpdmF0ZSBleHRyYWN0RnJvbU9iamVjdEFzc2lnbiAoXG5cdFx0Y2FsbEV4cHI6IHRzLkNhbGxFeHByZXNzaW9uLFxuXHRcdHByb3BlcnRpZXM6IE1hcDxzdHJpbmcsIFByb3BlcnR5SW5mbz5cblx0KTogdm9pZCB7XG5cdFx0Ly8gTG9vayBmb3IgdGhlIGRhdGEgYXJndW1lbnQgKHNlY29uZCBhcmd1bWVudClcblx0XHRjb25zdCBbICwgZGF0YUFyZyBdID0gY2FsbEV4cHIuYXJndW1lbnRzO1xuXHRcdGlmICghZGF0YUFyZykgcmV0dXJuO1xuXHRcdFxuXHRcdC8vIElmIGl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIGV4dHJhY3QgcHJvcGVydGllc1xuXHRcdGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRhdGFBcmcpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHByb3Agb2YgZGF0YUFyZy5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGlmICh0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wKSAmJiB0cy5pc0lkZW50aWZpZXIocHJvcC5uYW1lKSkge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BOYW1lID0gcHJvcC5uYW1lLnRleHQ7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcFR5cGUgPSB0aGlzLmluZmVyVHlwZShwcm9wLmluaXRpYWxpemVyKTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRwcm9wZXJ0aWVzLnNldChwcm9wTmFtZSwge1xuXHRcdFx0XHRcdFx0bmFtZSAgICAgOiBwcm9wTmFtZSxcblx0XHRcdFx0XHRcdHR5cGUgICAgIDogcHJvcFR5cGUsXG5cdFx0XHRcdFx0XHRvcHRpb25hbCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0cmVhZG9ubHkgOiBmYWxzZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4dHJhY3QgY29uc3RydWN0b3IgcGFyYW1ldGVycyBmcm9tIGEgZnVuY3Rpb25cblx0ICogU2ltaWxhciB0byBtYWluIGFuYWx5emVyIC0gc2tpcHMgYHRoaXNgIHBhcmFtZXRlciBhbmQgZXhwYW5kcyBkYXRhIHR5cGVzXG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RDb25zdHJ1Y3RvclBhcmFtcyAoXG5cdFx0ZnVuYzogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IHRzLkZ1bmN0aW9uRXhwcmVzc2lvbiB8IHRzLkFycm93RnVuY3Rpb24sXG5cdFx0dHlwZUFsaWFzZXM/OiBNYXA8c3RyaW5nLCB0cy5UeXBlTm9kZT5cblx0KTogQ29uc3RydWN0b3JQYXJhbUluZm9bXSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCFmdW5jLnBhcmFtZXRlcnMgfHwgZnVuYy5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJhbXM6IENvbnN0cnVjdG9yUGFyYW1JbmZvW10gPSBbXTtcblx0XHRcblx0XHQvLyBTa2lwIGB0aGlzYCBwYXJhbWV0ZXIgKGZpcnN0IHBhcmFtKSBhbmQgZXh0cmFjdCBkYXRhIHBhcmFtZXRlcnNcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZ1bmMucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgcGFyYW0gPSBmdW5jLnBhcmFtZXRlcnNbIGkgXTtcblx0XHRcdFxuXHRcdFx0Ly8gU2tpcCBgdGhpc2AgcGFyYW1ldGVyIChmaXJzdCBwYXJhbSlcblx0XHRcdGlmIChpID09PSAwICYmIHBhcmFtLm5hbWUua2luZCA9PT0gdHMuU3ludGF4S2luZC5JZGVudGlmaWVyICYmXG5cdFx0XHQgICAgKHBhcmFtLm5hbWUgYXMgdHMuSWRlbnRpZmllcikudGV4dCA9PT0gJ3RoaXMnKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRpZiAoIXBhcmFtLnR5cGUpIGNvbnRpbnVlO1xuXHRcdFx0XG5cdFx0XHRjb25zdCBwYXJhbU5hbWUgPSB0cy5pc0lkZW50aWZpZXIocGFyYW0ubmFtZSkgPyBwYXJhbS5uYW1lLnRleHQgOiAnYXJnJztcblx0XHRcdGNvbnN0IG9wdGlvbmFsID0gcGFyYW0ucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRcblx0XHRcdC8vIEV4cGFuZCB0eXBlIHRvIG9iamVjdCBsaXRlcmFsIGlmIHBvc3NpYmxlXG5cdFx0XHRjb25zdCBleHBhbmRlZFR5cGUgPSB0aGlzLmV4cGFuZFR5cGVUb09iamVjdChwYXJhbS50eXBlLCB0eXBlQWxpYXNlcyk7XG5cdFx0XHRjb25zdCBwYXJhbVR5cGUgPSBleHBhbmRlZFR5cGUgfHwgdGhpcy50eXBlTm9kZVRvU2ltcGxlU3RyaW5nKHBhcmFtLnR5cGUpO1xuXHRcdFx0XG5cdFx0XHRwYXJhbXMucHVzaCh7XG5cdFx0XHRcdG5hbWUgICAgIDogcGFyYW1OYW1lLFxuXHRcdFx0XHR0eXBlICAgICA6IHBhcmFtVHlwZSxcblx0XHRcdFx0b3B0aW9uYWwgOiBvcHRpb25hbFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiBwYXJhbXMubGVuZ3RoID4gMCA/IHBhcmFtcyA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHBhbmQgYSB0eXBlIG5vZGUgdG8gaXRzIG9iamVjdCBsaXRlcmFsIHJlcHJlc2VudGF0aW9uXG5cdCAqIFNpbWlsYXIgdG8gbWFpbiBhbmFseXplcidzIHJlc29sdmVUeXBlQW5kRXh0cmFjdFxuXHQgKi9cblx0cHJpdmF0ZSBleHBhbmRUeXBlVG9PYmplY3QgKFxuXHRcdHR5cGVOb2RlOiB0cy5UeXBlTm9kZSxcblx0XHR0eXBlQWxpYXNlcz86IE1hcDxzdHJpbmcsIHRzLlR5cGVOb2RlPlxuXHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdC8vIERpcmVjdCBpbmxpbmUgdHlwZSBsaXRlcmFsOiB7IHByb3A6IHR5cGUgfVxuXHRcdGlmICh0cy5pc1R5cGVMaXRlcmFsTm9kZSh0eXBlTm9kZSkpIHtcblx0XHRcdGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBtZW1iZXIgb2YgdHlwZU5vZGUubWVtYmVycykge1xuXHRcdFx0XHRpZiAodHMuaXNQcm9wZXJ0eVNpZ25hdHVyZShtZW1iZXIpICYmIHRzLmlzSWRlbnRpZmllcihtZW1iZXIubmFtZSkpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wTmFtZSA9IG1lbWJlci5uYW1lLnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb3B0ID0gbWVtYmVyLnF1ZXN0aW9uVG9rZW4gPyAnPycgOiAnJztcblx0XHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy50eXBlTm9kZVRvU2ltcGxlU3RyaW5nKG1lbWJlci50eXBlKTtcblx0XHRcdFx0XHRwcm9wcy5wdXNoKGAke3Byb3BOYW1lfSR7b3B0fTogJHt0eXBlfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYHsgJHtwcm9wcy5qb2luKCc7ICcpfSB9YDtcblx0XHR9XG5cblx0XHQvLyBUeXBlIHJlZmVyZW5jZTogU2VudGllbmNlRGF0YSwgZXRjLiAtIHRyeSB0byBleHBhbmQgZnJvbSB0eXBlIGFsaWFzZXNcblx0XHRpZiAodHMuaXNUeXBlUmVmZXJlbmNlTm9kZSh0eXBlTm9kZSkgJiYgdHMuaXNJZGVudGlmaWVyKHR5cGVOb2RlLnR5cGVOYW1lKSkge1xuXHRcdFx0Y29uc3QgdHlwZU5hbWUgPSB0eXBlTm9kZS50eXBlTmFtZS50ZXh0O1xuXHRcdFx0XG5cdFx0XHQvLyBJZiB3ZSBoYXZlIHR5cGUgYWxpYXNlcywgdHJ5IHRvIGV4cGFuZCB0aGUgcmVmZXJlbmNlZCB0eXBlXG5cdFx0XHRpZiAodHlwZUFsaWFzZXMpIHtcblx0XHRcdFx0Y29uc3QgYWxpYXNlZFR5cGUgPSB0eXBlQWxpYXNlcy5nZXQodHlwZU5hbWUpO1xuXHRcdFx0XHRpZiAoYWxpYXNlZFR5cGUpIHtcblx0XHRcdFx0XHRjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kVHlwZVRvT2JqZWN0KGFsaWFzZWRUeXBlLCB0eXBlQWxpYXNlcyk7XG5cdFx0XHRcdFx0aWYgKGV4cGFuZGVkKSByZXR1cm4gZXhwYW5kZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gSWYgbm90IGFuIG9iamVjdCB0eXBlIGFsaWFzLCByZXR1cm4gdGhlIHR5cGUgbmFtZVxuXHRcdFx0cmV0dXJuIHR5cGVOYW1lO1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydCBhIFR5cGVTY3JpcHQgdHlwZSBub2RlIHRvIGEgc2ltcGxlIHN0cmluZyByZXByZXNlbnRhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSB0eXBlTm9kZVRvU2ltcGxlU3RyaW5nICh0eXBlTm9kZTogdHMuVHlwZU5vZGUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRcdGlmICghdHlwZU5vZGUpIHJldHVybiAnYW55Jztcblx0XHRcblx0XHRzd2l0Y2ggKHR5cGVOb2RlLmtpbmQpIHtcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuU3RyaW5nS2V5d29yZDpcblx0XHRcdHJldHVybiAnc3RyaW5nJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcblx0XHRcdHJldHVybiAnbnVtYmVyJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG5cdFx0XHRyZXR1cm4gJ2Jvb2xlYW4nO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkOlxuXHRcdFx0cmV0dXJuICdhbnknO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6XG5cdFx0XHRyZXR1cm4gJ0FycmF5PGFueT4nO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOiB7XG5cdFx0XHRjb25zdCB0eXBlUmVmID0gdHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGU7XG5cdFx0XHRpZiAodHMuaXNJZGVudGlmaWVyKHR5cGVSZWYudHlwZU5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlUmVmLnR5cGVOYW1lLnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJ2FueSc7XG5cdFx0fVxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gJ2FueSc7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEluZmVyIFR5cGVTY3JpcHQgdHlwZSBmcm9tIGFuIGV4cHJlc3Npb25cblx0ICovXG5cdHByaXZhdGUgaW5mZXJUeXBlIChub2RlOiB0cy5FeHByZXNzaW9uKTogc3RyaW5nIHtcblx0XHRzd2l0Y2ggKG5vZGUua2luZCkge1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsOlxuXHRcdFx0cmV0dXJuICdzdHJpbmcnO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5OdW1lcmljTGl0ZXJhbDpcblx0XHRcdHJldHVybiAnbnVtYmVyJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQ6XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZDpcblx0XHRcdHJldHVybiAnYm9vbGVhbic7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuXHRcdFx0cmV0dXJuICdudWxsJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcblx0XHRcdHJldHVybiAndW5kZWZpbmVkJztcblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjpcblx0XHRcdHJldHVybiAnQXJyYXk8YW55Pic7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uOlxuXHRcdFx0cmV0dXJuICdvYmplY3QnO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5OZXdFeHByZXNzaW9uOlxuXHRcdFx0cmV0dXJuIHRoaXMuaW5mZXJOZXdFeHByZXNzaW9uVHlwZShub2RlIGFzIHRzLk5ld0V4cHJlc3Npb24pO1xuXHRcdGNhc2UgdHMuU3ludGF4S2luZC5Db25kaXRpb25hbEV4cHJlc3Npb246XG5cdFx0XHRyZXR1cm4gdGhpcy5pbmZlclR5cGUoKG5vZGUgYXMgdHMuQ29uZGl0aW9uYWxFeHByZXNzaW9uKS53aGVuVHJ1ZSk7XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLkJpbmFyeUV4cHJlc3Npb246IHtcblx0XHRcdGNvbnN0IGJpbkV4cHIgPSBub2RlIGFzIHRzLkJpbmFyeUV4cHJlc3Npb247XG5cdFx0XHQvLyBDaGVjayBmb3IgbG9naWNhbCBPUiBwYXR0ZXJuOiB2YWx1ZSB8fCBkZWZhdWx0XG5cdFx0XHRpZiAoYmluRXhwci5vcGVyYXRvclRva2VuLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuQmFyQmFyVG9rZW4pIHtcblx0XHRcdFx0Ly8gUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSByaWdodCBzaWRlICh0aGUgZGVmYXVsdCB2YWx1ZSlcblx0XHRcdFx0cmV0dXJuIHRoaXMuaW5mZXJUeXBlKGJpbkV4cHIucmlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICdhbnknO1xuXHRcdH1cblx0XHRjYXNlIHRzLlN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uOiB7XG5cdFx0XHRjb25zdCBwcm9wQWNjZXNzID0gbm9kZSBhcyB0cy5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb247XG5cdFx0XHQvLyBIYW5kbGUgZGF0YT8ucHJvcGVydHkgcGF0dGVybnNcblx0XHRcdHJldHVybiB0aGlzLmluZmVyVHlwZShwcm9wQWNjZXNzKTtcblx0XHR9XG5cdFx0Y2FzZSB0cy5TeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uOiB7XG5cdFx0XHRjb25zdCBjYWxsRXhwciA9IG5vZGUgYXMgdHMuQ2FsbEV4cHJlc3Npb247XG5cdFx0XHRyZXR1cm4gdGhpcy5pbmZlckNhbGxFeHByZXNzaW9uVHlwZShjYWxsRXhwcik7XG5cdFx0fVxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gJ2FueSc7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEluZmVyIHR5cGUgZnJvbSBuZXcgZXhwcmVzc2lvbnMgbGlrZSBuZXcgRGF0ZSgpLCBuZXcgQXJyYXkoKSwgZXRjLlxuXHQgKi9cblx0cHJpdmF0ZSBpbmZlck5ld0V4cHJlc3Npb25UeXBlIChub2RlOiB0cy5OZXdFeHByZXNzaW9uKTogc3RyaW5nIHtcblx0XHRjb25zdCBleHByID0gbm9kZS5leHByZXNzaW9uO1xuXHRcdGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcikpIHtcblx0XHRcdHN3aXRjaCAoZXhwci50ZXh0KSB7XG5cdFx0XHRjYXNlICdEYXRlJzpcblx0XHRcdFx0Ly8gRGF0ZS5ub3coKSByZXR1cm5zIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gJ251bWJlcic7XG5cdFx0XHRjYXNlICdBcnJheSc6XG5cdFx0XHRcdHJldHVybiAnQXJyYXk8YW55Pic7XG5cdFx0XHRjYXNlICdNYXAnOlxuXHRcdFx0XHRyZXR1cm4gJ01hcDxhbnksIGFueT4nO1xuXHRcdFx0Y2FzZSAnU2V0Jzpcblx0XHRcdFx0cmV0dXJuICdTZXQ8YW55Pic7XG5cdFx0XHRjYXNlICdSZWdFeHAnOlxuXHRcdFx0XHRyZXR1cm4gJ1JlZ0V4cCc7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZXhwci50ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gJ2FueSc7XG5cdH1cblxuXHQvKipcblx0ICogSW5mZXIgdHlwZSBmcm9tIGNhbGwgZXhwcmVzc2lvbnMgbGlrZSBEYXRlLm5vdygpLCBwYXJzZUludCgpLCBldGMuXG5cdCAqL1xuXHRwcml2YXRlIGluZmVyQ2FsbEV4cHJlc3Npb25UeXBlIChub2RlOiB0cy5DYWxsRXhwcmVzc2lvbik6IHN0cmluZyB7XG5cdFx0Y29uc3QgZXhwciA9IG5vZGUuZXhwcmVzc2lvbjtcblx0XHRcblx0XHQvLyBIYW5kbGUgRGF0ZS5ub3coKVxuXHRcdGlmICh0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihleHByKSkge1xuXHRcdFx0Y29uc3Qgb2JqID0gZXhwci5leHByZXNzaW9uO1xuXHRcdFx0Y29uc3QgbWV0aG9kID0gZXhwci5uYW1lLnRleHQ7XG5cdFx0XHRcblx0XHRcdGlmICh0cy5pc0lkZW50aWZpZXIob2JqKSAmJiBvYmoudGV4dCA9PT0gJ0RhdGUnICYmIG1ldGhvZCA9PT0gJ25vdycpIHtcblx0XHRcdFx0cmV0dXJuICdudW1iZXInO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHQvLyBIYW5kbGUgcGFyc2VJbnQsIHBhcnNlRmxvYXQsIFN0cmluZygpLCBOdW1iZXIoKSwgQm9vbGVhbigpXG5cdFx0aWYgKHRzLmlzSWRlbnRpZmllcihleHByKSkge1xuXHRcdFx0c3dpdGNoIChleHByLnRleHQpIHtcblx0XHRcdGNhc2UgJ3BhcnNlSW50Jzpcblx0XHRcdGNhc2UgJ3BhcnNlRmxvYXQnOlxuXHRcdFx0XHRyZXR1cm4gJ251bWJlcic7XG5cdFx0XHRjYXNlICdTdHJpbmcnOlxuXHRcdFx0XHRyZXR1cm4gJ3N0cmluZyc7XG5cdFx0XHRjYXNlICdOdW1iZXInOlxuXHRcdFx0XHRyZXR1cm4gJ251bWJlcic7XG5cdFx0XHRjYXNlICdCb29sZWFuJzpcblx0XHRcdFx0cmV0dXJuICdib29sZWFuJztcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuICdhbnknO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdHlwZSBncmFwaFxuXHQgKi9cblx0Z2V0R3JhcGggKCk6IFR5cGVHcmFwaEltcGwge1xuXHRcdHJldHVybiB0aGlzLmdyYXBoO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBjb2xsZWN0ZWQgZXJyb3JzXG5cdCAqL1xuXHRnZXRFcnJvcnMgKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gdGhpcy5lcnJvcnM7XG5cdH1cbn1cbiJdfQ==
package/lib/types.d.ts CHANGED
@@ -113,6 +113,18 @@ export interface UsageInfo {
113
113
  kind: 'instantiation' | 'typeAnnotation' | 'propertyAccess' | 'lookup' | 'reference';
114
114
  /** Code snippet */
115
115
  code: string;
116
+ /**
117
+ * Scope holding this usage (LocalScopeWalker scopeId: module scope is the
118
+ * file path, function scopes are file:line:col). Additive; absent when the
119
+ * usage sits outside tracked files.
120
+ */
121
+ holderScopeId?: string;
122
+ /**
123
+ * Constructor expression text at an instantiation site ('Thing',
124
+ * 'user.AdminEntity', 'T2' for a lookup alias). Additive; set only on
125
+ * kind 'instantiation'. Feeds CreationAnchor.constructorText (Phase 3).
126
+ */
127
+ constructorText?: string;
116
128
  }
117
129
  /**
118
130
  * JSON output for definitions.json
@@ -152,6 +164,19 @@ export interface EDSInfo {
152
164
  via?: string;
153
165
  /** Mnemonica type fullPaths instantiated inside the wrapped body — guaranteed path hits */
154
166
  createsTypes?: string[];
167
+ /** Label string literal passed to wrap(fn, …, 'label') when statically visible */
168
+ label?: string;
169
+ /** scopeId (scopes.json) of the wrapped callback's own scope — joins to the creation graph */
170
+ callbackScopeId?: string;
171
+ /** Identifier passed as the instance/context argument ('user'), when it is one */
172
+ instanceArg?: string;
173
+ /** scopeId of the scope holding the wrap call site — joins to the creation graph */
174
+ scopeId?: string;
175
+ /** Mnemonica fullPath of the instance argument, resolved through scope variables */
176
+ wrapsTypePath?: string;
177
+ /** Wrap-family function name ('wrap' | 'wrapConstructorArg' | …) — joins the
178
+ * call site to dive's engine knot in graph consumers */
179
+ fn?: string;
155
180
  }
156
181
  /**
157
182
  * JSON output for eds.json
@@ -161,6 +186,63 @@ export interface EDSJson {
161
186
  generatedAt: string;
162
187
  eds: Record<string, EDSInfo[]>;
163
188
  }
189
+ /**
190
+ * Instrumentation kind for framework lifecycle crossroads
191
+ */
192
+ export type InstrumentationKind = 'interceptor' | 'guard' | 'pipe' | 'filter' | 'middleware';
193
+ /**
194
+ * Instrumentation scope: where the point attaches.
195
+ * 'global' for provider-token registrations, 'module' for middleware wired
196
+ * via consumer.apply() AND for bare heritage declarations whose attachment
197
+ * is statically unknown, `controller:Name` / `method:Class.method` for
198
+ * decorator-scoped attachments.
199
+ */
200
+ export type InstrumentationScope = 'global' | 'module' | `controller:${string}` | `method:${string}`;
201
+ /**
202
+ * Instrumentation point: a framework lifecycle crossroad (interceptor,
203
+ * guard, pipe, filter, middleware) detected syntactically. The vocabulary
204
+ * that turns a syntactic shape into a point comes from plugins — with no
205
+ * plugin loaded, no points are collected.
206
+ *
207
+ * Dedupe/scope decision: points are keyed by (kind, className, location,
208
+ * scope) and duplicates merge their `targets`. A class detected both by
209
+ * heritage (a plugin-listed `implements` interface) and by a decorator
210
+ * site yields SEPARATE entries — the class-declaration point keeps scope
211
+ * 'module' (attachment unknown) while each registration site carries its
212
+ * own scope. One point serving multiple scopes via merged scope lists was
213
+ * rejected: consumers (mnemographica diamonds) key off a single scope per
214
+ * point, and separate entries keep that contract simple.
215
+ */
216
+ export interface InstrumentationPoint {
217
+ /** Kind of lifecycle crossroad */
218
+ kind: InstrumentationKind;
219
+ /** Class providing the instrumentation (e.g., "AuthGuard") */
220
+ className: string;
221
+ /** Location in source: file.ts:Line:Col (class declaration when declared in-project, else the registration site) */
222
+ location: string;
223
+ /** Code snippet: signature / first line, like EDS `code` */
224
+ code: string;
225
+ /** Where the point attaches */
226
+ scope: InstrumentationScope;
227
+ /** Controller/provider names the point attaches to; empty for global points */
228
+ targets: string[];
229
+ }
230
+ /**
231
+ * JSON output for instrumentation.json
232
+ */
233
+ export interface InstrumentationJson {
234
+ /** Schema version: 2 adds the optional creationGraph key (Phase 3) */
235
+ version: number;
236
+ generatedAt: string;
237
+ points: InstrumentationPoint[];
238
+ /**
239
+ * Inside-out creation walk (instrumentation walker plan, Phase 3): which
240
+ * scopes create mnemonica instances and who calls them, walked outward to
241
+ * the starters. Absent when the writer is called without creation-graph
242
+ * data (direct library use); always present from the CLI.
243
+ */
244
+ creationGraph?: CreationGraph;
245
+ }
164
246
  /**
165
247
  * Flow kind for tracking native instance usage patterns
166
248
  */
@@ -190,6 +272,244 @@ export interface FlowJson {
190
272
  generatedAt: string;
191
273
  flow: Record<string, FlowInfo[]>;
192
274
  }
275
+ /**
276
+ * What a module-level binding is. Variables are classified as 'const'
277
+ * regardless of let/var — mutability (reassignment tracking) is the
278
+ * local-scope walker's concern (Phase 2), not the module graph's.
279
+ */
280
+ export type ModuleBindingKind = 'function' | 'class' | 'const' | 'type' | 'unknown';
281
+ /**
282
+ * How a binding enters a module
283
+ */
284
+ export type ModuleImportKind = 'named' | 'default' | 'namespace' | 'require';
285
+ /**
286
+ * A generic module-level binding (export, import, or re-export).
287
+ *
288
+ * `name` is always the name this module presents: the local identifier for
289
+ * imports, the exported name for exports. `importAlias` carries the original
290
+ * name in the source module when it differs (`import { X as Y }` → name 'Y',
291
+ * importAlias 'X'; `export { X as Y } from …` → name 'Y', importAlias 'X').
292
+ * For default imports name is the local identifier and the source lookup key
293
+ * is 'default' (implied by importKind); for namespace imports/exports name is
294
+ * the namespace alias ('*' for bare `export * from …`).
295
+ */
296
+ export interface ModuleBinding {
297
+ /** Name as presented in this module (local name for imports, exported name for exports) */
298
+ name: string;
299
+ /** What the binding is; backfilled from the origin module when resolvable */
300
+ kind: ModuleBindingKind;
301
+ /**
302
+ * Resolved absolute file path of the source module (the module itself for
303
+ * local declarations; the raw specifier when resolution fails)
304
+ */
305
+ sourceModule: string;
306
+ /** How the binding enters the module (absent on plain local exports) */
307
+ importKind?: ModuleImportKind;
308
+ /** Original name in the source module when aliased */
309
+ importAlias?: string;
310
+ /** True for `export { X } from './y'` / `export * from './y'` (barrels) */
311
+ isReExport: boolean;
312
+ /**
313
+ * True when the specifier resolved into node_modules
314
+ * (ts.resolveModuleName's isExternalLibraryImport). External bindings are
315
+ * recorded for reference but never enter `dependencies` and are never walked.
316
+ * Node.js builtins are not recorded as bindings at all — see
317
+ * ModuleInfo.builtinSpecifiers.
318
+ */
319
+ external?: boolean;
320
+ }
321
+ /**
322
+ * Per-module record of the cross-file graph (modules.json)
323
+ */
324
+ export interface ModuleInfo {
325
+ /** Absolute file path (map key) */
326
+ filePath: string;
327
+ /** Mnemonica type fullPaths defined in this module */
328
+ definedTypes: string[];
329
+ /** Everything this module exports (local declarations and re-exports) */
330
+ exportedBindings: ModuleBinding[];
331
+ /** Everything this module imports (re-exports appear here too, marked isReExport) */
332
+ importedBindings: ModuleBinding[];
333
+ /** Absolute paths of analyzed project modules this module imports from */
334
+ dependencies: string[];
335
+ /** Import specifiers that module resolution could not resolve (node builtins excluded — see builtinSpecifiers) */
336
+ unresolvedSpecifiers: string[];
337
+ /**
338
+ * Node.js builtin specifiers this module imports ('path', 'node:fs', …),
339
+ * matched against node:module's builtinModules in both bare and
340
+ * `node:`-prefixed forms. Recorded for honesty only: builtins produce no
341
+ * bindings, never enter `dependencies`/`unresolvedSpecifiers`, and never
342
+ * produce edges.
343
+ */
344
+ builtinSpecifiers: string[];
345
+ }
346
+ /**
347
+ * A cross-module usage of a mnemonica type: usageModule imports a binding
348
+ * whose origin module defines the type.
349
+ */
350
+ export interface CrossModuleUsage {
351
+ /** Matched mnemonica type fullPath (or the imported name when unmatched) */
352
+ typePath: string;
353
+ /** Absolute path of the module where the type is defined (re-export chains chased to the origin) */
354
+ definitionModule: string;
355
+ /** Absolute path of the importing module */
356
+ usageModule: string;
357
+ /** Import site: file.ts:Line:Col */
358
+ usageLocation: string;
359
+ }
360
+ /**
361
+ * The full module graph
362
+ */
363
+ export interface ModuleGraph {
364
+ /** Keyed by absolute file path */
365
+ modules: Map<string, ModuleInfo>;
366
+ edges: CrossModuleUsage[];
367
+ /**
368
+ * Circular import chains (each an array of absolute paths). Recorded, not
369
+ * an error — mnemonica strictChain:false permits non-linear construction
370
+ */
371
+ cycles: string[][];
372
+ }
373
+ /**
374
+ * JSON output for modules.json
375
+ */
376
+ export interface ModulesJson {
377
+ version: string;
378
+ generatedAt: string;
379
+ modules: Record<string, ModuleInfo>;
380
+ edges: CrossModuleUsage[];
381
+ cycles: string[][];
382
+ }
383
+ /**
384
+ * What a tracked scope is. Decision 5 (resolved 2026-09-03): function,
385
+ * method, and arrow scopes ONLY — no block scopes. 'module' is the synthetic
386
+ * per-file root scope so module-level instance creations are labeled, not
387
+ * dropped (walker plan: "recorded as a rooted instance").
388
+ */
389
+ export type ScopeKind = 'module' | 'function' | 'method' | 'arrow';
390
+ /**
391
+ * One tracked scope (scopes.json)
392
+ */
393
+ export interface ScopeInfo {
394
+ /** Unique id: module scope is the file path; function scopes are file:line:col of the scope node */
395
+ scopeId: string;
396
+ /** Decision 8 labeling: function/method name ('Class.method' for methods), file:line for anonymous holders */
397
+ name: string;
398
+ kind: ScopeKind;
399
+ /** Nearest enclosing scope (undefined on module scopes) */
400
+ parentScopeId?: string;
401
+ /** Absolute file path */
402
+ filePath: string;
403
+ /** Scope start: file.ts:Line:Col (module scope: file:1:1) */
404
+ location: string;
405
+ }
406
+ /**
407
+ * One tracked variable (scopes.json)
408
+ */
409
+ export interface ScopeVariable {
410
+ name: string;
411
+ /** Owning scope */
412
+ scopeId: string;
413
+ /** Mnemonica type fullPath when known (new X() on a known type, new inst.Sub() chaining, or a known annotation) */
414
+ typePath?: string;
415
+ /** Cheap textual type: annotation text or tiny initializer classification */
416
+ inferredType?: string;
417
+ /** Declaration site: file.ts:Line:Col */
418
+ declaration: string;
419
+ isParameter: boolean;
420
+ /** const = false; let/var and parameters = true (parameters are reassignable) */
421
+ isMutable: boolean;
422
+ /**
423
+ * Reassignment sites (file.ts:Line:Col) of this binding — flow-termination
424
+ * points (decision 6): the Phase 3 walker stops following the binding there
425
+ */
426
+ reassignments: string[];
427
+ }
428
+ /**
429
+ * The full local-scope analysis
430
+ */
431
+ export interface ScopeAnalysis {
432
+ /** Keyed by scopeId */
433
+ scopes: Map<string, ScopeInfo>;
434
+ /** Keyed by `${scopeId}#${name}` */
435
+ variables: Map<string, ScopeVariable>;
436
+ }
437
+ /**
438
+ * JSON output for scopes.json
439
+ */
440
+ export interface ScopesJson {
441
+ version: string;
442
+ generatedAt: string;
443
+ scopes: Record<string, ScopeInfo>;
444
+ variables: ScopeVariable[];
445
+ }
446
+ /**
447
+ * One node of the creation graph (instrumentation walker plan, Phase 3):
448
+ * a scope that creates mnemonica instances, or one sitting on a call path
449
+ * to a creator.
450
+ */
451
+ export interface CreationGraphNode {
452
+ /** LocalScopeWalker scopeId (module scope = file path; function scopes = file:line:col) */
453
+ scopeId: string;
454
+ /** Decision 8 label: function/method name ('Class.method'), file:line for anonymous holders */
455
+ name: string;
456
+ kind: ScopeKind;
457
+ /** Absolute file path */
458
+ filePath: string;
459
+ /** Scope start: file.ts:Line:Col */
460
+ location: string;
461
+ /** True when the walk found no callers — an application entry point */
462
+ starter: boolean;
463
+ }
464
+ /**
465
+ * One edge of the creation graph: the caller scope invokes or references the
466
+ * callee scope. Direction is inside-out: caller → callee, where the callee is
467
+ * closer to the creation site.
468
+ */
469
+ export interface CreationGraphEdge {
470
+ /** Calling scope's scopeId */
471
+ caller: string;
472
+ /** Called (holder) scope's scopeId */
473
+ callee: string;
474
+ }
475
+ /**
476
+ * An instantiation anchor: one mnemonica creation site pinned to its holder
477
+ * scope.
478
+ *
479
+ * `variable`/`terminatedAt` are a documented heuristic: the variable declared
480
+ * in the holder scope on the SAME line as the creation, whose typePath (when
481
+ * known) matches the created type. `terminatedAt` is that variable's first
482
+ * reassignment site — the decision 6 flow-termination point where the walker
483
+ * stops following the binding.
484
+ */
485
+ export interface CreationAnchor {
486
+ /** Creation site: file.ts:Line:Col (the usages.json location) */
487
+ location: string;
488
+ /** Scope holding the creation (scopes.json scopeId) */
489
+ holderScopeId: string;
490
+ /** Mnemonica type fullPath being created */
491
+ typePath: string;
492
+ /** Constructor expression text ('Thing', 'user.AdminEntity', a lookup alias name) */
493
+ constructorText?: string;
494
+ /**
495
+ * True when the holder is the module scope — a rooted instance (plan:
496
+ * legitimate root or developer error; labeled, not policed)
497
+ */
498
+ rooted?: boolean;
499
+ /** Variable the fresh instance was bound to (same-line heuristic) */
500
+ variable?: string;
501
+ /** First reassignment site of that variable: file.ts:Line:Col */
502
+ terminatedAt?: string;
503
+ }
504
+ /**
505
+ * The creation graph: everything that leads to mnemonica instances being
506
+ * created. Emitted as the `creationGraph` key of instrumentation.json v2.
507
+ */
508
+ export interface CreationGraph {
509
+ nodes: CreationGraphNode[];
510
+ edges: CreationGraphEdge[];
511
+ anchors: CreationAnchor[];
512
+ }
193
513
  /**
194
514
  * JSON output for hierarchy.json
195
515
  */