@dollhousemcp/mcp-server 2.0.35 → 2.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  3. package/dist/elements/base/BaseElementManager.js +6 -2
  4. package/dist/elements/memories/Memory.d.ts.map +1 -1
  5. package/dist/elements/memories/Memory.js +9 -2
  6. package/dist/elements/memories/MemoryManager.d.ts +13 -0
  7. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  8. package/dist/elements/memories/MemoryManager.js +57 -44
  9. package/dist/elements/memories/constants.js +2 -2
  10. package/dist/elements/templates/Template.d.ts +2 -0
  11. package/dist/elements/templates/Template.d.ts.map +1 -1
  12. package/dist/elements/templates/Template.js +9 -1
  13. package/dist/generated/version.d.ts +2 -2
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
  16. package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
  17. package/dist/handlers/GitHubAuthHandler.js +303 -60
  18. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  19. package/dist/handlers/element-crud/editElement.js +24 -11
  20. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
  21. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
  23. package/dist/security/contentValidator.d.ts +32 -1
  24. package/dist/security/contentValidator.d.ts.map +1 -1
  25. package/dist/security/contentValidator.js +79 -33
  26. package/dist/security/secureYamlParser.d.ts.map +1 -1
  27. package/dist/security/secureYamlParser.js +5 -2
  28. package/dist/security/tokenManager.d.ts +1 -1
  29. package/dist/security/tokenManager.d.ts.map +1 -1
  30. package/dist/security/tokenManager.js +10 -7
  31. package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
  32. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  33. package/dist/storage/MemoryMetadataExtractor.js +7 -3
  34. package/dist/utils/pathSecurity.d.ts +3 -1
  35. package/dist/utils/pathSecurity.d.ts.map +1 -1
  36. package/dist/utils/pathSecurity.js +38 -2
  37. package/dist/web/routes/setupRoutes.d.ts +23 -7
  38. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  39. package/dist/web/routes/setupRoutes.js +138 -20
  40. package/oauth-helper.mjs +233 -92
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"editElement.d.ts","sourceRoot":"","sources":["../../../src/handlers/element-crud/editElement.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIhD,OAAO,EAAE,iBAAiB,EAA4B,MAAM,gDAAgD,CAAC;AA0B7G;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAyhBD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,eAAe,EACrB,iBAAiB,CAAC,EAAE,iBAAiB;;;;;GAqVtC"}
1
+ {"version":3,"file":"editElement.d.ts","sourceRoot":"","sources":["../../../src/handlers/element-crud/editElement.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIhD,OAAO,EAAE,iBAAiB,EAA4B,MAAM,gDAAgD,CAAC;AA0B7G;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAwiBD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,eAAe,EACrB,iBAAiB,CAAC,EAAE,iBAAiB;;;;;GA0VtC"}
@@ -19,6 +19,11 @@ const READ_ONLY_FIELDS = new Set([
19
19
  '_status',
20
20
  '_isDirty'
21
21
  ]);
22
+ function hasOwnRecordProperty(value, key) {
23
+ return typeof value === 'object' &&
24
+ value !== null &&
25
+ Object.hasOwn(value, key);
26
+ }
22
27
  function getMaxLengthForFieldType(fieldType) {
23
28
  switch (fieldType) {
24
29
  case 'name':
@@ -74,7 +79,7 @@ const FIELD_TYPE_RULES = {
74
79
  name: { expected: 'string', check: (v) => typeof v === 'string' },
75
80
  description: { expected: 'string', check: (v) => typeof v === 'string' },
76
81
  author: { expected: 'string', check: (v) => typeof v === 'string' },
77
- version: { expected: 'string', check: (v) => typeof v === 'string' || typeof v === 'number' },
82
+ version: { expected: 'string or number', check: (v) => typeof v === 'string' || typeof v === 'number' },
78
83
  category: { expected: 'string', check: (v) => typeof v === 'string' },
79
84
  domain: { expected: 'string', check: (v) => typeof v === 'string' },
80
85
  tone: { expected: 'string', check: (v) => typeof v === 'string' },
@@ -162,11 +167,14 @@ function validateFieldValue(validationService, field, value) {
162
167
  }
163
168
  return null; // Valid
164
169
  }
170
+ function appendTraversalKey(path, key) {
171
+ return key.length > 0 ? `${path}.${key}` : `${path}[""]`;
172
+ }
165
173
  function getTraversalEntries(value, path) {
166
174
  if (Array.isArray(value)) {
167
175
  return value.map((item, index) => [`${path}[${index}]`, item]);
168
176
  }
169
- return Object.entries(value).map(([key, item]) => [`${path}.${key}`, item]);
177
+ return Object.entries(value).map(([key, item]) => [appendTraversalKey(path, key), item]);
170
178
  }
171
179
  function getDescriptionMaxLengthForPath(fieldPath) {
172
180
  if (fieldPath === 'input.description' || fieldPath === 'input.metadata.description') {
@@ -362,6 +370,10 @@ function applyEnsembleElementsUpdate(elementsInput, element, updateObj, collecti
362
370
  updateObj.metadata.elements = mergeResult.elements;
363
371
  return null;
364
372
  }
373
+ function hasEnsembleElementsUpdate(input) {
374
+ return hasOwnRecordProperty(input, 'elements') ||
375
+ hasOwnRecordProperty(input.metadata, 'elements');
376
+ }
365
377
  /**
366
378
  * Sync ensemble elements from metadata after an update.
367
379
  *
@@ -376,10 +388,10 @@ function applyEnsembleElementsUpdate(elementsInput, element, updateObj, collecti
376
388
  * @param context - Element CRUD context with managers for type resolution
377
389
  */
378
390
  async function syncEnsembleElementsIfNeeded(element, input, context) {
379
- const hasElementsUpdate = input.elements || input.metadata?.elements;
391
+ const hasElementsUpdate = hasEnsembleElementsUpdate(input);
380
392
  if (hasElementsUpdate && element instanceof Ensemble) {
381
393
  // Issue #466: Resolve missing element_type via portfolio lookup before sync
382
- if (context && element.metadata.elements) {
394
+ if (context && Array.isArray(element.metadata.elements)) {
383
395
  const result = await resolveElementTypes(element.metadata.elements, {
384
396
  skillManager: context.skillManager,
385
397
  templateManager: context.templateManager,
@@ -473,6 +485,7 @@ export async function editElement(context, args, validationService) {
473
485
  const label = getElementTypeLabel(normalizedType);
474
486
  throw new ElementNotFoundError(label, name);
475
487
  }
488
+ const editableElement = element;
476
489
  // Check for unknown properties and generate warnings
477
490
  const unknownPropertyWarnings = detectUnknownMetadataProperties(normalizedType, input);
478
491
  // Also validate nested metadata sub-object (the top-level 'metadata' key is
@@ -572,7 +585,7 @@ export async function editElement(context, args, validationService) {
572
585
  const metaValue = value;
573
586
  // If metadata.elements is provided for an ensemble, extract and route through
574
587
  // the ensemble elements handler for proper validation/normalization/merge.
575
- if (normalizedType === ElementType.ENSEMBLE && metaValue.elements) {
588
+ if (normalizedType === ElementType.ENSEMBLE && hasOwnRecordProperty(metaValue, 'elements')) {
576
589
  const elemError = applyEnsembleElementsUpdate(metaValue.elements, element, updateObj, collectionWarnings);
577
590
  if (elemError)
578
591
  return error(elemError);
@@ -595,13 +608,13 @@ export async function editElement(context, args, validationService) {
595
608
  });
596
609
  const sanitizedInstructions = contentValidation.sanitizedContent || '';
597
610
  // Set instructions on the element directly (all types now have this property)
598
- element.instructions = sanitizedInstructions;
611
+ editableElement.instructions = sanitizedInstructions;
599
612
  // For agents, also update extensions.instructions for backward compat
600
613
  if (normalizedType === ElementType.AGENT) {
601
- if (!element.extensions) {
602
- element.extensions = {};
614
+ if (!editableElement.extensions) {
615
+ editableElement.extensions = {};
603
616
  }
604
- element.extensions.instructions = sanitizedInstructions;
617
+ editableElement.extensions.instructions = sanitizedInstructions;
605
618
  }
606
619
  }
607
620
  else if (key === 'content' && typeof value === 'string') {
@@ -612,7 +625,7 @@ export async function editElement(context, args, validationService) {
612
625
  });
613
626
  const sanitizedContent = contentValidation.sanitizedContent || '';
614
627
  // Set content on the element directly (all types now have this property)
615
- element.content = sanitizedContent;
628
+ editableElement.content = sanitizedContent;
616
629
  }
617
630
  else if (specialRouteFields.has(key)) {
618
631
  // Special route field — handled elsewhere, skip
@@ -836,4 +849,4 @@ function autoIncrementVersion(element) {
836
849
  logger.error('Failed to auto-increment version', { error });
837
850
  }
838
851
  }
839
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdEVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUtsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBNEIsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBRXBCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLCtCQUErQixFQUMvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEdBQ2xDLE1BQU0sY0FBYyxDQUFDO0FBaUN0QixnRUFBZ0U7QUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixJQUFJO0lBQ0osTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLFNBQThCO0lBQzlELFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxlQUFlLENBQUMsZUFBZSxDQUFDO1FBQ3pDLEtBQUssYUFBYTtZQUNoQixPQUFPLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQztRQUNoRCxLQUFLLFNBQVM7WUFDWixPQUFPLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQztRQUM1QyxLQUFLLFVBQVU7WUFDYixPQUFPLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGdCQUFnQixHQUlqQjtJQUNILHVDQUF1QztJQUN2QyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3RFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDMUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN6RSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUMvRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQy9FLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ25FLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzVELFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2xFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzlELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzdELHNFQUFzRTtJQUN0RSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtJQUM1SSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJ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QU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNraWxsIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvc2tpbGxzL1NraWxsLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlLmpzJztcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50LmpzJztcbmltcG9ydCB7IE1lbW9yeSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcyc7XG5pbXBvcnQgeyBFbnNlbWJsZSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuc2VtYmxlRWxlbWVudElucHV0IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZW5zZW1ibGVzL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRDcnVkQ29udGV4dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNZW1vcnlJZCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL3V0aWxzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVWZXJzaW9uIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvQmFzZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UsIHR5cGUgVmFsaWRhdGlvbkZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IGRlZXBNZXJnZSwgREFOR0VST1VTX1BST1BFUlRJRVMgfSBmcm9tICcuLi8uLi91dGlscy9kZWVwTWVyZ2UuanMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplRWxlbWVudFR5cGVJbnB1dCxcbiAgZm9ybWF0VmFsaWRFbGVtZW50VHlwZXNMaXN0LFxuICBnZXRFbGVtZW50RmlsZW5hbWUsXG4gIGdldEVsZW1lbnRUeXBlTGFiZWwsXG4gIHJlc29sdmVFbGVtZW50QnlOYW1lLFxuICBFbGVtZW50TWFuYWdlck9wZXJhdGlvbnMsXG4gIEtOT1dOX01FVEFEQVRBX1BST1BFUlRJRVMsXG4gIGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMsXG4gIGZvcm1hdFVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLFxuICBmb3JtYXRFbGVtZW50UmVzb2x1dGlvbldhcm5pbmdzLFxuICBjb2xsZWN0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyxcbiAgZm9ybWF0R2F0ZWtlZXBlclZhbGlkYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRWxlbWVudFR5cGVzUmVzdWx0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5cbnR5cGUgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8VD4gPSBFbGVtZW50TWFuYWdlck9wZXJhdGlvbnM8VD4gJiB7XG4gIHNhdmUoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIGRlbGV0ZT8oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIEdyYXBoUUwtYWxpZ25lZCBpbnB1dCBmb3IgZWRpdGluZyBlbGVtZW50cy5cbiAqIFVzZXMgbmVzdGVkIG9iamVjdHMgKGxpa2UgY3JlYXRlX2VsZW1lbnQpIGluc3RlYWQgb2YgTW9uZ29EQi1zdHlsZSBkb3Qgbm90YXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFVwZGF0ZSBkZXNjcmlwdGlvbiBhbmQgbmVzdGVkIG1ldGFkYXRhXG4gKiB7XG4gKiAgIG5hbWU6IFwibXktc2tpbGxcIixcbiAqICAgdHlwZTogXCJza2lsbHNcIixcbiAqICAgaW5wdXQ6IHtcbiAqICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGVkIGRlc2NyaXB0aW9uXCIsXG4gKiAgICAgbWV0YWRhdGE6IHtcbiAqICAgICAgIHRyaWdnZXJzOiBbXCJjb2RlXCIsIFwicmV2aWV3XCJdLFxuICogICAgICAgc2V0dGluZ3M6IHsgdGhlbWU6IFwiZGFya1wiIH1cbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0RWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgLyoqIE5lc3RlZCBpbnB1dCBvYmplY3QgLSBmaWVsZHMgYXJlIGRlZXAtbWVyZ2VkIHdpdGggZXhpc3RpbmcgZWxlbWVudCAqL1xuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vIFJlYWQtb25seSBmaWVsZHMgdGhhdCBjYW5ub3QgYmUgbW9kaWZpZWQgdGhyb3VnaCB0aGUgZWRpdCBBUElcbmNvbnN0IFJFQURfT05MWV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgJ2lkJyxcbiAgJ3R5cGUnLFxuICAnZmlsZVBhdGgnLFxuICAnZmlsZW5hbWUnLFxuICAnX3N0YXR1cycsXG4gICdfaXNEaXJ0eSdcbl0pO1xuXG5mdW5jdGlvbiBnZXRNYXhMZW5ndGhGb3JGaWVsZFR5cGUoZmllbGRUeXBlOiBWYWxpZGF0aW9uRmllbGRUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICBjYXNlICduYW1lJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIO1xuICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDtcbiAgICBjYXNlICdjb250ZW50JzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIO1xuICAgIGNhc2UgJ2ZpbGVuYW1lJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTU1BTkRfQVJHX0xFTkdUSDtcbiAgfVxufVxuXG4vKipcbiAqIElzc3VlICM2NjI6IFN5c3RlbWF0aWMgZmllbGQgdHlwZSB2YWxpZGF0aW9uIGF0IHRoZSBlZGl0RWxlbWVudCBib3VuZGFyeS5cbiAqXG4gKiBEZWZpbmVzIGV4cGVjdGVkIHR5cGVzIGZvciBrbm93biBtZXRhZGF0YSBmaWVsZHMgYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzLlxuICogUHJldmVudHMgc2lsZW50IGRhdGEgY29ycnVwdGlvbiB3aGVuIExMTXMgc2VuZCB3cm9uZyB0eXBlcyAoZS5nLiwgZGljdCBpbnN0ZWFkIG9mIGFycmF5KS5cbiAqXG4gKiBLZXk6IGZpZWxkIG5hbWUsIFZhbHVlOiB7IGV4cGVjdGVkOiB0eXBlIGRlc2NyaXB0aW9uLCBjaGVjazogdmFsaWRhdG9yIGZ1bmN0aW9uIH1cbiAqL1xuY29uc3QgRklFTERfVFlQRV9SVUxFUzogUmVjb3JkPHN0cmluZywge1xuICBleHBlY3RlZDogc3RyaW5nO1xuICBjaGVjazogKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBlbGVtZW50VHlwZXM/OiBFbGVtZW50VHlwZVtdO1xufT4gPSB7XG4gIC8vIEFycmF5IGZpZWxkcyAoYWNyb3NzIG11bHRpcGxlIHR5cGVzKVxuICB0YWdzOiB7IGV4cGVjdGVkOiAnYXJyYXkgb2Ygc3RyaW5ncycsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICB0cmlnZ2VyczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZG9tYWluczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZXhhbXBsZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBwcmVyZXF1aXNpdGVzOiB7IGV4cGVjdGVkOiAnYXJyYXkgb2Ygc3RyaW5ncycsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBjYXBhYmlsaXRpZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBnb2FsczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIGNvbnN0cmFpbnRzOiB7IGV4cGVjdGVkOiAnYXJyYXknLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgYWN0aW9uczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIHNraWxsczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIC8vIElzc3VlICM3MjQ6IGFjdGl2YXRlcyBhbmQgdG9vbHMgYXJlIG9iamVjdHMgZm9yIGFnZW50cyAobm90IGFycmF5cylcbiAgYWN0aXZhdGVzOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHRvb2xzOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHZhcmlhYmxlczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5URU1QTEFURV0gfSxcbiAgZW50cmllczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5NRU1PUlldIH0sXG4gIC8vIGVsZW1lbnRzIGhhbmRsZWQgc2VwYXJhdGVseSBieSB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHMgKGFjY2VwdHMgZGljdCB0b28pXG5cbiAgLy8gT2JqZWN0IGZpZWxkc1xuICBnb2FsOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIGF1dG9ub215OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHJlc2lsaWVuY2U6IHsgZXhwZWN0ZWQ6ICdvYmplY3QnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5BR0VOVF0gfSxcbiAgZ2F0ZWtlZXBlcjogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikgfSxcbiAgcmV0ZW50aW9uUG9saWN5OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuICByZXRlbnRpb25fcG9saWN5OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuXG4gIC8vIFN0cmluZyBmaWVsZHNcbiAgLy8gSXNzdWUgIzcyNDogc3lzdGVtUHJvbXB0IHdhcyBtaXNzaW5nIGZyb20gZmllbGQgdHlwZSBydWxlcy5cbiAgLy8gQm90aCBjYW1lbENhc2UgYW5kIHNuYWtlX2Nhc2UgdmFyaWFudHMgYWNjZXB0ZWQgYmVjYXVzZSBMTE1zIGZyZXF1ZW50bHlcbiAgLy8gcGFzcyBzbmFrZV9jYXNlIGtleXM7IG5vcm1hbGl6YXRpb24gdG8gY2FtZWxDYXNlIGhhcHBlbnMgZG93bnN0cmVhbSBpblxuICAvLyBBZ2VudE1hbmFnZXIucGFyc2VNZXRhZGF0YSgpIChJc3N1ZSAjNzIyKS5cbiAgc3lzdGVtUHJvbXB0OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBzeXN0ZW1fcHJvbXB0OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBuYW1lOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgZGVzY3JpcHRpb246IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuICBhdXRob3I6IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuICB2ZXJzaW9uOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHYgPT09ICdudW1iZXInIH0sXG4gIGNhdGVnb3J5OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgZG9tYWluOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgdG9uZTogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG5cbiAgLy8gTnVtYmVyIGZpZWxkc1xuICBtYXhFbnRyaWVzOiB7IGV4cGVjdGVkOiAnbnVtYmVyJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLk1FTU9SWV0gfSxcbiAgbWF4X2VudHJpZXM6IHsgZXhwZWN0ZWQ6ICdudW1iZXInLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJywgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuICBwcmlvcml0eTogeyBleHBlY3RlZDogJ251bWJlcicsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIH0sXG59O1xuXG4vKipcbiAqIElzc3VlICM2NjI6IFZhbGlkYXRlIGZpZWxkIHR5cGVzIGluIGlucHV0IGJlZm9yZSBhcHBseWluZyB0byBlbGVtZW50LlxuICpcbiAqIENoZWNrcyBlYWNoIGZpZWxkIGluIHRoZSBpbnB1dCBhZ2FpbnN0IGBGSUVMRF9UWVBFX1JVTEVTYC4gRmllbGRzIG5vdCBpbiB0aGVcbiAqIHJ1bGVzIG1hcCBhcmUgc2tpcHBlZCAodGhleSdsbCBiZSBjYXVnaHQgYnkgdW5rbm93bi1wcm9wZXJ0eSBkZXRlY3Rpb24gbGF0ZXIpLlxuICogRWxlbWVudC10eXBlLXNjb3BlZCBydWxlcyBvbmx5IGFwcGx5IHdoZW4gdGhlIHRhcmdldCB0eXBlIG1hdGNoZXMuXG4gKlxuICogQHBhcmFtIGlucHV0IC0gVGhlIGVkaXQgaW5wdXQgb2JqZWN0IGNvbnRhaW5pbmcgZmllbGRzIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gZWxlbWVudFR5cGUgLSBUaGUgbm9ybWFsaXplZCBlbGVtZW50IHR5cGUgYmVpbmcgZWRpdGVkXG4gKiBAcmV0dXJucyBBcnJheSBvZiBlcnJvciBtZXNzYWdlcyBmb3IgZmllbGRzIHdpdGggd3JvbmcgdHlwZXMgKGVtcHR5IGlmIGFsbCB2YWxpZClcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWVsZFR5cGVzKFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICBjb25zdCBydWxlID0gRklFTERfVFlQRV9SVUxFU1tmaWVsZF07XG4gICAgaWYgKCFydWxlKSBjb250aW51ZTtcblxuICAgIC8vIFNraXAgaWYgcnVsZSBkb2Vzbid0IGFwcGx5IHRvIHRoaXMgZWxlbWVudCB0eXBlXG4gICAgaWYgKHJ1bGUuZWxlbWVudFR5cGVzICYmICFydWxlLmVsZW1lbnRUeXBlcy5pbmNsdWRlcyhlbGVtZW50VHlwZSkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKCFydWxlLmNoZWNrKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnB1c2goYEZpZWxkICcke2ZpZWxkfScgZXhwZWN0cyAke3J1bGUuZXhwZWN0ZWR9LCBnb3QgJHtBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLy8gTWVyZ2Ugb3B0aW9ucyBmb3Igc2VjdXJlIGRlZXAgbWVyZ2luZ1xuY29uc3QgTUVSR0VfT1BUSU9OUyA9IHtcbiAgc2tpcFByb3BlcnRpZXM6IERBTkdFUk9VU19QUk9QRVJUSUVTLFxuICByZWFkT25seUZpZWxkczogUkVBRF9PTkxZX0ZJRUxEU1xufTtcblxuLyoqXG4gKiBNYXAgZmllbGQgbmFtZXMgdG8gdGhlaXIgYXBwcm9wcmlhdGUgdmFsaWRhdGlvbiBmaWVsZCB0eXBlcy5cbiAqIFRoaXMgZW5zdXJlcyBjb25zaXN0ZW50IHZhbGlkYXRpb24gYmV0d2VlbiBlZGl0IChpbnB1dCkgYW5kIGxvYWQgKG91dHB1dCkuXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkVHlwZUZvclZhbGlkYXRpb24oZmllbGROYW1lOiBzdHJpbmcpOiBWYWxpZGF0aW9uRmllbGRUeXBlIHwgbnVsbCB7XG4gIC8vIE5vcm1hbGl6ZSBmaWVsZCBuYW1lIChoYW5kbGUgYm90aCAnZGVzY3JpcHRpb24nIGFuZCAnbWV0YWRhdGEuZGVzY3JpcHRpb24nKVxuICBjb25zdCBub3JtYWxpemVkRmllbGQgPSBmaWVsZE5hbWUucmVwbGFjZSgvXm1ldGFkYXRhXFwuLywgJycpO1xuXG4gIHN3aXRjaCAobm9ybWFsaXplZEZpZWxkKSB7XG4gICAgY2FzZSAnbmFtZSc6XG4gICAgICByZXR1cm4gJ25hbWUnO1xuICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgIHJldHVybiAnZGVzY3JpcHRpb24nO1xuICAgIGNhc2UgJ2NvbnRlbnQnOlxuICAgICAgcmV0dXJuICdjb250ZW50JztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHNwZWNpYWwgdmFsaWRhdGlvbiBuZWVkZWRcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXQgb24gYW4gZWxlbWVudC5cbiAqIFJldHVybnMgbnVsbCBpZiB2YWxpZCwgb3IgYW4gZXJyb3IgbWVzc2FnZSBpZiBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSB2YWxpZGF0aW9uU2VydmljZSAtIEluamVjdGVkIHZhbGlkYXRpb24gc2VydmljZSBmb3IgdGVzdGFiaWxpdHlcbiAqIEBwYXJhbSBmaWVsZCAtIFRoZSBmaWVsZCBuYW1lIGJlaW5nIHZhbGlkYXRlZFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmllbGRWYWx1ZShcbiAgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93blxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIE9ubHkgdmFsaWRhdGUgc3RyaW5nIHZhbHVlcyBmb3IgdGV4dCBmaWVsZHNcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gTm9uLXN0cmluZyB2YWx1ZXMgKGFycmF5cywgb2JqZWN0cywgYm9vbGVhbnMsIG51bWJlcnMpIHNraXAgdGV4dCB2YWxpZGF0aW9uXG4gIH1cblxuICBjb25zdCBmaWVsZFR5cGUgPSBnZXRGaWVsZFR5cGVGb3JWYWxpZGF0aW9uKGZpZWxkKTtcbiAgaWYgKCFmaWVsZFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gTm8gdmFsaWRhdGlvbiBydWxlcyBmb3IgdGhpcyBmaWVsZFxuICB9XG5cbiAgY29uc3QgbWF4TGVuZ3RoID0gZ2V0TWF4TGVuZ3RoRm9yRmllbGRUeXBlKGZpZWxkVHlwZSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KHZhbHVlLCB7XG4gICAgbWF4TGVuZ3RoLFxuICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgIGZpZWxkVHlwZVxuICB9KTtcblxuICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJykgfHwgJ1ZhbGlkYXRpb24gZmFpbGVkJztcbiAgfVxuXG4gIHJldHVybiBudWxsOyAvLyBWYWxpZFxufVxuXG5pbnRlcmZhY2UgT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZCB7XG4gIHBhdGg6IHN0cmluZztcbiAgbGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG50eXBlIFRyYXZlcnNhbEVudHJ5ID0gcmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl07XG5cbmZ1bmN0aW9uIGdldFRyYXZlcnNhbEVudHJpZXModmFsdWU6IG9iamVjdCwgcGF0aDogc3RyaW5nKTogVHJhdmVyc2FsRW50cnlbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0sIGluZGV4KSA9PiBbYCR7cGF0aH1bJHtpbmRleH1dYCwgaXRlbV0gYXMgY29uc3QpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBbYCR7cGF0aH0uJHtrZXl9YCwgaXRlbV0gYXMgY29uc3QpO1xufVxuXG5mdW5jdGlvbiBnZXREZXNjcmlwdGlvbk1heExlbmd0aEZvclBhdGgoZmllbGRQYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoZmllbGRQYXRoID09PSAnaW5wdXQuZGVzY3JpcHRpb24nIHx8IGZpZWxkUGF0aCA9PT0gJ2lucHV0Lm1ldGFkYXRhLmRlc2NyaXB0aW9uJykge1xuICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDtcbiAgfVxuXG4gIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RPQ1VNRU5UQVRJT05fRklFTERfTEVOR1RIO1xufVxuXG5mdW5jdGlvbiBpc092ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGRQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgY29uc3QgbWF4TGVuZ3RoID0gZ2V0RGVzY3JpcHRpb25NYXhMZW5ndGhGb3JQYXRoKGZpZWxkUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZmllbGRQYXRoLmVuZHNXaXRoKCcuZGVzY3JpcHRpb24nKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0T3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZChmaWVsZDogT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZCk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgYCAg4oCiICR7ZmllbGQucGF0aH0gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiBgICtcbiAgICBgJHtmaWVsZC5tYXhMZW5ndGh9IGNoYXJhY3RlcnMgKCR7ZmllbGQubGVuZ3RofSlgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZpbmRPdmVyc2l6ZWREZXNjcmlwdGlvbkZpZWxkcyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHBhdGggPSAnaW5wdXQnLFxuICBzZWVuID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpLFxuKTogT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZFtdIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHNlZW4uYWRkKHZhbHVlKTtcblxuICBjb25zdCBvdmVyc2l6ZWQ6IE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWVsZFBhdGgsIGl0ZW1dIG9mIGdldFRyYXZlcnNhbEVudHJpZXModmFsdWUsIHBhdGgpKSB7XG4gICAgaWYgKGlzT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZChmaWVsZFBhdGgsIGl0ZW0pKSB7XG4gICAgICBvdmVyc2l6ZWQucHVzaCh7XG4gICAgICAgIHBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgbGVuZ3RoOiBpdGVtLmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBnZXREZXNjcmlwdGlvbk1heExlbmd0aEZvclBhdGgoZmllbGRQYXRoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvdmVyc2l6ZWQucHVzaCguLi5maW5kT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZHMoaXRlbSwgZmllbGRQYXRoLCBzZWVuKSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcnNpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBub3JtYWxpemUgZW5zZW1ibGUgZWxlbWVudHMgaW5wdXQuXG4gKlxuICogSXNzdWUgIzY1ODogTExNcyBvZnRlbiBzZW5kIGVsZW1lbnRzIGluIGRpY3Qta2V5ZWQgZm9ybWF0IGluc3RlYWQgb2YgYXJyYXkgZm9ybWF0LlxuICogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIGJvdGggZm9ybWF0cyB0byBhIHZhbGlkIGFycmF5IG9mIEVuc2VtYmxlRWxlbWVudC1saWtlIG9iamVjdHMuXG4gKlxuICogQWNjZXB0ZWQgZm9ybWF0czpcbiAqIC0gQXJyYXk6IFt7IGVsZW1lbnRfbmFtZTogXCJmb29cIiwgZWxlbWVudF90eXBlOiBcIm1lbW9yeVwiLCAuLi4gfV1cbiAqIC0gRGljdDogIHsgXCJmb29cIjogeyB0eXBlOiBcIm1lbW9yeVwiLCAuLi4gfSB9ICDihpIgY29udmVydGVkIHRvIGFycmF5XG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIGVsZW1lbnRzIGlucHV0IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBzdWNjZXNzIGZsYWcsIG5vcm1hbGl6ZWQgZWxlbWVudHMgYXJyYXksIGFuZCBvcHRpb25hbCBlcnJvclxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHModmFsdWU6IHVua25vd24pOiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdO1xuICBlcnJvcj86IHN0cmluZztcbn0ge1xuICAvLyBDYXNlIDE6IEFscmVhZHkgYW4gYXJyYXkg4oCUIHZhbGlkYXRlIGVhY2ggaXRlbVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgbm9ybWFsaXplZDogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHZhbHVlW2ldO1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBFbGVtZW50IGF0IGluZGV4ICR7aX0gbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBlbGVtZW50X25hbWUgYW5kIGVsZW1lbnRfdHlwZWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9iaiA9IGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBuYW1lID0gb2JqLmVsZW1lbnRfbmFtZSB8fCBvYmoubmFtZTtcbiAgICAgIGNvbnN0IHR5cGUgPSBvYmouZWxlbWVudF90eXBlIHx8IG9iai50eXBlO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBFbGVtZW50IGF0IGluZGV4ICR7aX0gaXMgbWlzc2luZyBlbGVtZW50X25hbWUgKG9yIG5hbWUpYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGUgX3JlbW92ZSBpcyBzdHJpY3RseSBib29sZWFuIGlmIHByZXNlbnRcbiAgICAgIGlmICgnX3JlbW92ZScgaW4gb2JqICYmIHR5cGVvZiBvYmouX3JlbW92ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBFbGVtZW50ICcke1N0cmluZyhuYW1lKX0nIGhhcyBpbnZhbGlkIF9yZW1vdmUgdmFsdWUg4oCUIG11c3QgYmUgYm9vbGVhbiB0cnVlLCBnb3QgJHt0eXBlb2Ygb2JqLl9yZW1vdmV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gTm9ybWFsaXplIHRvIHN0YW5kYXJkIGZpZWxkIG5hbWVzLCBvbmx5IGluY2x1ZGluZyBkZWZpbmVkIHZhbHVlc1xuICAgICAgY29uc3QgZW50cnk6IEVuc2VtYmxlRWxlbWVudElucHV0ID0geyAuLi5vYmosIGVsZW1lbnRfbmFtZTogU3RyaW5nKG5hbWUpIH07XG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBlbnRyeS5lbGVtZW50X3R5cGUgPSBTdHJpbmcodHlwZSk7XG4gICAgICB9XG4gICAgICBub3JtYWxpemVkLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVsZW1lbnRzOiBbXSwgZXJyb3I6IGVycm9ycy5qb2luKCc7ICcpIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVsZW1lbnRzOiBub3JtYWxpemVkIH07XG4gIH1cblxuICAvLyBDYXNlIDI6IERpY3Qta2V5ZWQgZm9ybWF0IOKAlCBjb252ZXJ0IHRvIGFycmF5XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGRpY3QgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZGljdCkpIHtcbiAgICAgIGlmICghdmFsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVsZW1lbnRzOiBbXSxcbiAgICAgICAgICBlcnJvcjogYEVsZW1lbnQgJyR7a2V5fScgaW4gZGljdCBmb3JtYXQgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBlbGVtZW50X3R5cGUgKG9yIHR5cGUpLiBgICtcbiAgICAgICAgICAgIGBFeHBlY3RlZDogeyBcIiR7a2V5fVwiOiB7IHR5cGU6IFwibWVtb3J5XCIsIHJvbGU6IFwic3VwcG9ydFwiLCAuLi4gfSB9YFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXIgPSB2YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBub3JtYWxpemVkLnB1c2goe1xuICAgICAgICAuLi5pbm5lcixcbiAgICAgICAgZWxlbWVudF9uYW1lOiBTdHJpbmcoaW5uZXIuZWxlbWVudF9uYW1lIHx8IGlubmVyLm5hbWUgfHwga2V5KSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBTdHJpbmcoaW5uZXIuZWxlbWVudF90eXBlIHx8IGlubmVyLnR5cGUpLFxuICAgICAgICByb2xlOiAoaW5uZXIucm9sZSBhcyBFbnNlbWJsZUVsZW1lbnRJbnB1dFsncm9sZSddKSB8fCAnc3VwcG9ydCcsXG4gICAgICAgIGFjdGl2YXRpb246IChpbm5lci5hY3RpdmF0aW9uIGFzIEVuc2VtYmxlRWxlbWVudElucHV0WydhY3RpdmF0aW9uJ10pIHx8ICdhbHdheXMnLFxuICAgICAgICBwcmlvcml0eTogKGlubmVyLnByaW9yaXR5IGFzIG51bWJlcikgPz8gNTAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZWxlbWVudHM6IG5vcm1hbGl6ZWQgfTtcbiAgfVxuXG4gIC8vIENhc2UgMzogSW52YWxpZCB0eXBlXG4gIHJldHVybiB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZWxlbWVudHM6IFtdLFxuICAgIGVycm9yOiBgJ2VsZW1lbnRzJyBtdXN0IGJlIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgYSBkaWN0LWtleWVkIG9iamVjdC4gR290OiAke3R5cGVvZiB2YWx1ZX1gXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW5jb21pbmcgZW5zZW1ibGUgZWxlbWVudHMgd2l0aCBleGlzdGluZyBlbGVtZW50cy5cbiAqXG4gKiBJc3N1ZSAjNjU4LyM2NjI6IFVuaWZpZWQgY29sbGVjdGlvbiBlZGl0aW5nIHNlbWFudGljcyDigJQgZWFjaCBpdGVtIGluIHRoZSBpbnB1dFxuICogZGVjbGFyZXMgaXRzIG93biBpbnRlbnQgdmlhIGl0cyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gRXhpc3RpbmcgZWxlbWVudCB3aXRoIHVwZGF0ZXMg4oaSIG1lcmdlIHByb3BlcnRpZXMgKGluY29taW5nIHdpbnMpXG4gKiAtIE5ldyBlbGVtZW50IChub3QgZm91bmQgYnkgbmFtZSkg4oaSIGFwcGVuZGVkXG4gKiAtIEVsZW1lbnQgd2l0aCBgX3JlbW92ZTogdHJ1ZWAg4oaSIGRyb3BwZWQgZnJvbSBjb2xsZWN0aW9uXG4gKiAtIEV4aXN0aW5nIGVsZW1lbnRzIG5vdCBpbiBpbmNvbWluZyDihpIgcHJlc2VydmVkIHVuY2hhbmdlZFxuICpcbiAqIFRoaXMgcGF0dGVybiBleHRlbmRzIHRvIGFueSBmdXR1cmUgZ3JvdXBpbmcgdHlwZSAod29ya2Zsb3dzLCBwaXBlbGluZXMsIHRlYW1zKS5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmcgLSBDdXJyZW50IGVsZW1lbnRzIGFycmF5IGZyb20gdGhlIGVuc2VtYmxlXG4gKiBAcGFyYW0gaW5jb21pbmcgLSBOZXcvdXBkYXRlZC9yZW1vdmVkIGVsZW1lbnRzIGZyb20gdGhlIGVkaXQgaW5wdXRcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIG1lcmdlZCBhcnJheSBhbmQgYW55IHdhcm5pbmdzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRW5zZW1ibGVFbGVtZW50cyhcbiAgZXhpc3Rpbmc6IEVuc2VtYmxlRWxlbWVudElucHV0W10sXG4gIGluY29taW5nOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdXG4pOiB7IGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdOyB3YXJuaW5nczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHJlc3VsdDogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSA9IGV4aXN0aW5nLm1hcChlID0+ICh7IC4uLmUgfSkpO1xuICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGluYyBvZiBpbmNvbWluZykge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoaW5jLmVsZW1lbnRfbmFtZSB8fCBpbmMubmFtZSB8fCAnJyk7XG4gICAgaWYgKCFuYW1lKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSByZXN1bHQuZmluZEluZGV4KFxuICAgICAgZSA9PiBTdHJpbmcoZS5lbGVtZW50X25hbWUgfHwgZS5uYW1lIHx8ICcnKSA9PT0gbmFtZVxuICAgICk7XG5cbiAgICAvLyBJc3N1ZSAjNjYyOiBfcmVtb3ZlIG1hcmtlciDigJQgZHJvcCBlbGVtZW50IGZyb20gY29sbGVjdGlvblxuICAgIGlmIChpbmMuX3JlbW92ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGV4aXN0aW5nSW5kZXgsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgRWxlbWVudCAnJHtuYW1lfScgbm90IGZvdW5kIGluIGVuc2VtYmxlIOKAlCBub3RoaW5nIHRvIHJlbW92ZWApO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgdHJhbnNpZW50L2FsaWFzIGZpZWxkcyB0aGF0IHNob3VsZG4ndCBiZSBwZXJzaXN0ZWRcbiAgICBjb25zdCB7IF9yZW1vdmU6IF9kaXNjYXJkUmVtb3ZlLCBuYW1lOiBfZGlzY2FyZE5hbWUsIHR5cGU6IF9kaXNjYXJkVHlwZSwgLi4ucGVyc2lzdGFibGUgfSA9IGluYztcblxuICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgIC8vIFVwc2VydDogbWVyZ2UgaW5jb21pbmcgcHJvcGVydGllcyBpbnRvIGV4aXN0aW5nIChpbmNvbWluZyB3aW5zKVxuICAgICAgcmVzdWx0W2V4aXN0aW5nSW5kZXhdID0geyAuLi5yZXN1bHRbZXhpc3RpbmdJbmRleF0sIC4uLnBlcnNpc3RhYmxlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBuZXcgZWxlbWVudFxuICAgICAgcmVzdWx0LnB1c2goeyAuLi5wZXJzaXN0YWJsZSB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBlbGVtZW50czogcmVzdWx0LCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlLCBub3JtYWxpemUsIGFuZCBtZXJnZSBlbnNlbWJsZSBlbGVtZW50cyBpbnRvIHRoZSB1cGRhdGUgb2JqZWN0LlxuICogRXh0cmFjdGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGJldHdlZW4gdGhlIHRvcC1sZXZlbCBgZWxlbWVudHNgIGtleSBoYW5kbGVyXG4gKiBhbmQgdGhlIGBtZXRhZGF0YS5lbGVtZW50c2Aga2V5IGhhbmRsZXIgKENsYXVkZSByZXZpZXcpLlxuICpcbiAqIEByZXR1cm5zIEFuIGVycm9yIHN0cmluZyBpZiB2YWxpZGF0aW9uIGZhaWxzLCBvciBudWxsIG9uIHN1Y2Nlc3NcbiAqL1xuZnVuY3Rpb24gaXNFbnNlbWJsZUVsZW1lbnRJbnB1dCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVuc2VtYmxlRWxlbWVudElucHV0IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhcHBseUVuc2VtYmxlRWxlbWVudHNVcGRhdGUoXG4gIGVsZW1lbnRzSW5wdXQ6IHVua25vd24sXG4gIGVsZW1lbnQ6IHVua25vd24sXG4gIHVwZGF0ZU9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbGxlY3Rpb25XYXJuaW5nczogc3RyaW5nW11cbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHMoZWxlbWVudHNJbnB1dCk7XG4gIGlmICghdmFsaWRhdGVkLnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gYEludmFsaWQgJ2VsZW1lbnRzJyBmb3JtYXQ6ICR7dmFsaWRhdGVkLmVycm9yfWA7XG4gIH1cbiAgY29uc3QgZWxlbWVudFJlY29yZCA9IGVsZW1lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG1ldGFkYXRhID0gZWxlbWVudFJlY29yZC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3RWxlbWVudHMgPSBtZXRhZGF0YT8uZWxlbWVudHM7XG4gIGNvbnN0IGV4aXN0aW5nVHlwZWQ6IEVuc2VtYmxlRWxlbWVudElucHV0W10gPSBBcnJheS5pc0FycmF5KHJhd0VsZW1lbnRzKVxuICAgID8gcmF3RWxlbWVudHMuZmlsdGVyKGlzRW5zZW1ibGVFbGVtZW50SW5wdXQpLm1hcChlID0+ICh7IC4uLmUgfSkpXG4gICAgOiBbXTtcbiAgY29uc3QgbWVyZ2VSZXN1bHQgPSBtZXJnZUVuc2VtYmxlRWxlbWVudHMoZXhpc3RpbmdUeXBlZCwgdmFsaWRhdGVkLmVsZW1lbnRzKTtcbiAgY29sbGVjdGlvbldhcm5pbmdzLnB1c2goLi4ubWVyZ2VSZXN1bHQud2FybmluZ3MpO1xuICBpZiAoIXVwZGF0ZU9iai5tZXRhZGF0YSkge1xuICAgIHVwZGF0ZU9iai5tZXRhZGF0YSA9IHt9O1xuICB9XG4gICh1cGRhdGVPYmoubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVsZW1lbnRzID0gbWVyZ2VSZXN1bHQuZWxlbWVudHM7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFN5bmMgZW5zZW1ibGUgZWxlbWVudHMgZnJvbSBtZXRhZGF0YSBhZnRlciBhbiB1cGRhdGUuXG4gKlxuICogRW5zZW1ibGVzIHN0b3JlIHRoZWlyIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiBtZXRhZGF0YS5lbGVtZW50cyxcbiAqIGFuZCBuZWVkIHRvIHN5bmMgdGhlIGludGVybmFsIGVsZW1lbnRzIGFycmF5IHdoZW4gdGhhdCBjaGFuZ2VzLlxuICpcbiAqIElzc3VlICM0NjY6IEJlZm9yZSBzeW5jaW5nLCByZXNvbHZlIGFueSBtaXNzaW5nIGVsZW1lbnRfdHlwZSBmaWVsZHNcbiAqIGJ5IHNlYXJjaGluZyB0aGUgcG9ydGZvbGlvIHZpYSB0aGUgY29udGV4dCBtYW5hZ2Vycy5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbnNlbWJsZSBlbGVtZW50IHRvIHN5bmNcbiAqIEBwYXJhbSBpbnB1dCAtIFRoZSBpbnB1dCBvYmplY3QgdG8gY2hlY2sgZm9yIGVsZW1lbnQgdXBkYXRlc1xuICogQHBhcmFtIGNvbnRleHQgLSBFbGVtZW50IENSVUQgY29udGV4dCB3aXRoIG1hbmFnZXJzIGZvciB0eXBlIHJlc29sdXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY0Vuc2VtYmxlRWxlbWVudHNJZk5lZWRlZChcbiAgZWxlbWVudDogdW5rbm93bixcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb250ZXh0PzogRWxlbWVudENydWRDb250ZXh0XG4pOiBQcm9taXNlPFJlc29sdmVFbGVtZW50VHlwZXNSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgaGFzRWxlbWVudHNVcGRhdGUgPSBpbnB1dC5lbGVtZW50cyB8fCAoaW5wdXQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5lbGVtZW50cztcblxuICBpZiAoaGFzRWxlbWVudHNVcGRhdGUgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEVuc2VtYmxlKSB7XG4gICAgLy8gSXNzdWUgIzQ2NjogUmVzb2x2ZSBtaXNzaW5nIGVsZW1lbnRfdHlwZSB2aWEgcG9ydGZvbGlvIGxvb2t1cCBiZWZvcmUgc3luY1xuICAgIGlmIChjb250ZXh0ICYmIGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVFbGVtZW50VHlwZXMoXG4gICAgICAgIGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMsXG4gICAgICAgIHtcbiAgICAgICAgICBza2lsbE1hbmFnZXI6IGNvbnRleHQuc2tpbGxNYW5hZ2VyLFxuICAgICAgICAgIHRlbXBsYXRlTWFuYWdlcjogY29udGV4dC50ZW1wbGF0ZU1hbmFnZXIsXG4gICAgICAgICAgYWdlbnRNYW5hZ2VyOiBjb250ZXh0LmFnZW50TWFuYWdlcixcbiAgICAgICAgICBtZW1vcnlNYW5hZ2VyOiBjb250ZXh0Lm1lbW9yeU1hbmFnZXIsXG4gICAgICAgICAgcGVyc29uYU1hbmFnZXI6IGNvbnRleHQucGVyc29uYU1hbmFnZXIsXG4gICAgICAgICAgZW5zZW1ibGVNYW5hZ2VyOiBjb250ZXh0LmVuc2VtYmxlTWFuYWdlcixcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMgPSByZXN1bHQucmVzb2x2ZWQ7XG4gICAgICBlbGVtZW50LnN5bmNFbGVtZW50c0Zyb21NZXRhZGF0YSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnN5bmNFbGVtZW50c0Zyb21NZXRhZGF0YSgpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGFuZGxlIG1lbW9yeSBlbnRyeSB1cGRhdGVzIHdpdGggdmFsaWRhdGlvbiBhbmQgbm9ybWFsaXphdGlvbi5cbiAqXG4gKiBNZW1vcnkgZW50cmllcyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgYmVjYXVzZSB0aGV5OlxuICogLSBOZWVkIElEIGdlbmVyYXRpb24gaWYgbWlzc2luZ1xuICogLSBSZXF1aXJlIHRpbWVzdGFtcCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uXG4gKiAtIFVzZSBhIE1hcCBzdHJ1Y3R1cmUgaW50ZXJuYWxseVxuICpcbiAqIEBwYXJhbSBlbnRyaWVzIC0gQXJyYXkgb2YgbWVtb3J5IGVudHJpZXMgZnJvbSBpbnB1dFxuICogQHJldHVybnMgUmVzdWx0IHdpdGggc3VjY2VzcyBzdGF0dXMsIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UsIGFuZCBub3JtYWxpemVkIGVudHJpZXMgbWFwXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU1lbW9yeUVudHJ5VXBkYXRlKGVudHJpZXM6IHVua25vd25bXSk6IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgZW50cmllc01hcDogTWFwPHN0cmluZywgdW5rbm93bj47XG59IHtcbiAgY29uc3QgZW50cmllc01hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXTtcbiAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBFbnRyeSBhdCBpbmRleCAke2l9IGlzIG5vdCBhIHZhbGlkIG9iamVjdGApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnlPYmogPSBlbnRyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBlbnRyeUlkID0gZW50cnlPYmouaWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnlJZCkge1xuICAgICAgZW50cnlPYmouaWQgPSBnZW5lcmF0ZU1lbW9yeUlkKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGVudHJ5T2JqLnRpbWVzdGFtcCA/IG5ldyBEYXRlKGVudHJ5T2JqLnRpbWVzdGFtcCBhcyBzdHJpbmcpIDogbmV3IERhdGUoKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odGltZXN0YW1wLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRpbWVzdGFtcCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkRW50cnkgPSB7XG4gICAgICAgIC4uLmVudHJ5T2JqLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkoZW50cnlPYmoudGFncykgPyBlbnRyeU9iai50YWdzIDogW10sXG4gICAgICAgIG1ldGFkYXRhOiB0eXBlb2YgZW50cnlPYmoubWV0YWRhdGEgPT09ICdvYmplY3QnICYmIGVudHJ5T2JqLm1ldGFkYXRhICE9PSBudWxsID8gZW50cnlPYmoubWV0YWRhdGEgOiB7fVxuICAgICAgfTtcblxuICAgICAgZW50cmllc01hcC5zZXQoZW50cnlPYmouaWQsIG5vcm1hbGl6ZWRFbnRyeSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBlcnJvcnMucHVzaChgRW50cnkgJyR7ZW50cnlPYmouaWR9JyBoYXMgaW52YWxpZCB0aW1lc3RhbXBgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3JzLmpvaW4oJ1xcbicpLCBlbnRyaWVzTWFwIH07XG4gIH1cblxuICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbnRyaWVzTWFwIH07XG59XG5cbi8qKlxuICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBFbGVtZW50IENSVUQgY29udGV4dCB3aXRoIG1hbmFnZXJzXG4gKiBAcGFyYW0gYXJncyAtIEVkaXQgYXJndW1lbnRzIChuYW1lLCB0eXBlLCBpbnB1dClcbiAqIEBwYXJhbSB2YWxpZGF0aW9uU2VydmljZSAtIE9wdGlvbmFsIHZhbGlkYXRpb24gc2VydmljZSBmb3IgREkgKGNyZWF0ZXMgZGVmYXVsdCBpZiBub3QgcHJvdmlkZWQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0RWxlbWVudChcbiAgY29udGV4dDogRWxlbWVudENydWRDb250ZXh0LFxuICBhcmdzOiBFZGl0RWxlbWVudEFyZ3MsXG4gIHZhbGlkYXRpb25TZXJ2aWNlPzogVmFsaWRhdGlvblNlcnZpY2Vcbikge1xuICBhd2FpdCBjb250ZXh0LmVuc3VyZUluaXRpYWxpemVkKCk7XG5cbiAgLy8gVXNlIGluamVjdGVkIHZhbGlkYXRpb24gc2VydmljZSBvciBjcmVhdGUgZGVmYXVsdFxuICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0aW9uU2VydmljZSA/PyBuZXcgVmFsaWRhdGlvblNlcnZpY2UoKTtcblxuICBjb25zdCB7IG5hbWUsIHR5cGUsIGlucHV0IH0gPSBhcmdzO1xuXG4gIC8vIFZhbGlkYXRlIGlucHV0IGlzIHByb3ZpZGVkXG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBlcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGlucHV0IG9iamVjdC4gUHJvdmlkZSBmaWVsZHMgdG8gdXBkYXRlIGFzIGEgbmVzdGVkIG9iamVjdC4nKTtcbiAgfVxuXG4gIGNvbnN0IHsgdHlwZTogbm9ybWFsaXplZFR5cGUgfSA9IG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQodHlwZSk7XG5cbiAgaWYgKCFub3JtYWxpemVkVHlwZSkge1xuICAgIHJldHVybiBlcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtmb3JtYXRWYWxpZEVsZW1lbnRUeXBlc0xpc3QoKX1gKTtcbiAgfVxuXG4gIGNvbnN0IG1hbmFnZXIgPSBnZXRNYW5hZ2VyRm9yVHlwZShjb250ZXh0LCBub3JtYWxpemVkVHlwZSk7XG4gIGlmICghbWFuYWdlcikge1xuICAgIGNvbnN0IGxhYmVsUGx1cmFsID0gZ2V0RWxlbWVudFR5cGVMYWJlbChub3JtYWxpemVkVHlwZSwgeyBwbHVyYWw6IHRydWUgfSk7XG4gICAgcmV0dXJuIGVycm9yKGBFbGVtZW50IHR5cGUgJyR7bGFiZWxQbHVyYWx9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZWRpdGluZ2ApO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHJlc29sdmVFbGVtZW50QnlOYW1lKG1hbmFnZXIsIG5vcm1hbGl6ZWRUeXBlLCBuYW1lKTtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlKTtcbiAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IobGFiZWwsIG5hbWUpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHVua25vd24gcHJvcGVydGllcyBhbmQgZ2VuZXJhdGUgd2FybmluZ3NcbiAgY29uc3QgdW5rbm93blByb3BlcnR5V2FybmluZ3MgPSBkZXRlY3RVbmtub3duTWV0YWRhdGFQcm9wZXJ0aWVzKFxuICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgIGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk7XG5cbiAgLy8gQWxzbyB2YWxpZGF0ZSBuZXN0ZWQgbWV0YWRhdGEgc3ViLW9iamVjdCAodGhlIHRvcC1sZXZlbCAnbWV0YWRhdGEnIGtleSBpc1xuICAvLyBza2lwcGVkIGJ5IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMgYXMgYSBzcGVjaWFsIHJvdXRlIGZpZWxkLCBzb1xuICAvLyBkYW5nZXJvdXMvdW5rbm93biBwcm9wZXJ0aWVzIGluc2lkZSBpdCB3b3VsZCBnbyB1bmNoZWNrZWQgb3RoZXJ3aXNlKVxuICBpZiAoaW5wdXQubWV0YWRhdGEgJiYgdHlwZW9mIGlucHV0Lm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXRhZGF0YSkpIHtcbiAgICBjb25zdCBuZXN0ZWRXYXJuaW5ncyA9IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMoXG4gICAgICBub3JtYWxpemVkVHlwZSxcbiAgICAgIGlucHV0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICB1bmtub3duUHJvcGVydHlXYXJuaW5ncy5wdXNoKC4uLm5lc3RlZFdhcm5pbmdzKTtcbiAgfVxuXG4gIGNvbnN0IHdhcm5pbmdUZXh0ID0gZm9ybWF0VW5rbm93blByb3BlcnR5V2FybmluZ3ModW5rbm93blByb3BlcnR5V2FybmluZ3MpO1xuXG4gIGlmICh1bmtub3duUHJvcGVydHlXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gVW5rbm93biBwcm9wZXJ0aWVzIGRldGVjdGVkYCwge1xuICAgICAgZWxlbWVudFR5cGU6IG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICB3YXJuaW5nQ291bnQ6IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLmxlbmd0aCxcbiAgICAgIHVua25vd25Qcm9wZXJ0aWVzOiB1bmtub3duUHJvcGVydHlXYXJuaW5ncy5tYXAodyA9PiAoe1xuICAgICAgICBwcm9wZXJ0eTogdy5wcm9wZXJ0eSxcbiAgICAgICAgc3VnZ2VzdGlvbjogdy5zdWdnZXN0aW9uXG4gICAgICB9KSlcbiAgICB9KTtcbiAgfVxuXG4gIC8vIElzc3VlICMxNTkxOiBWYWxpZGF0ZSBlbGVtZW50LXNwZWNpZmljIGNvbnN0cmFpbnRzIGJlZm9yZSBhdHRlbXB0aW5nIGVkaXRzXG4gIC8vIE1lbW9yeSBjb250ZW50IGlzIHJlYWQtb25seSAoYXBwZW5kLW9ubHkgYXJjaGl0ZWN0dXJlKSAtIHJlamVjdCBhdHRlbXB0cyB0byBlZGl0IGl0XG4gIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZICYmICdjb250ZW50JyBpbiBpbnB1dCkge1xuICAgIHJldHVybiBlcnJvcihcbiAgICAgIGBNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIGVkaXRfZWxlbWVudC4gYCArXG4gICAgICBgTWVtb3J5IHVzZXMgYW4gYXBwZW5kLW9ubHkgYXJjaGl0ZWN0dXJlLiBgICtcbiAgICAgIGBVc2UgdGhlICdhZGRFbnRyeScgb3BlcmF0aW9uIHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGlzIG1lbW9yeS5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIElzc3VlICM2NjI6IFZhbGlkYXRlIGZpZWxkIHR5cGVzIGJlZm9yZSBhcHBseWluZyAocHJldmVudHMgc2lsZW50IGRhdGEgY29ycnVwdGlvbilcbiAgY29uc3QgdHlwZUVycm9ycyA9IHZhbGlkYXRlRmllbGRUeXBlcyhpbnB1dCwgbm9ybWFsaXplZFR5cGUpO1xuICBpZiAodHlwZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGVycm9yKGBGaWVsZCB0eXBlIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7dHlwZUVycm9ycy5tYXAoZSA9PiBgICDigKIgJHtlfWApLmpvaW4oJ1xcbicpfWApO1xuICB9XG5cbiAgY29uc3QgZ2F0ZWtlZXBlckVycm9ycyA9IGNvbGxlY3RHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKGlucHV0LCBpbnB1dC5tZXRhZGF0YSk7XG4gIGlmIChnYXRla2VlcGVyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoZm9ybWF0R2F0ZWtlZXBlclZhbGlkYXRpb25NZXNzYWdlKGdhdGVrZWVwZXJFcnJvcnMpKTtcbiAgfVxuXG4gIGNvbnN0IG92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzID0gZmluZE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzKGlucHV0KTtcbiAgaWYgKG92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoXG4gICAgICBgRGVzY3JpcHRpb24gbGVuZ3RoIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7b3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZHMubWFwKGZpZWxkID0+XG4gICAgICAgIGZvcm1hdE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGQpXG4gICAgICApLmpvaW4oJ1xcbicpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc3RyaW5nIGZpZWxkIHZhbHVlcyB1c2luZyBpbmplY3RlZCB2YWxpZGF0b3JcbiAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVGaWVsZFZhbHVlKHZhbGlkYXRvciwgZmllbGQsIHZhbHVlKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciAnJHtmaWVsZH0nOiAke3ZhbGlkYXRpb25FcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgdXBkYXRlIG9iamVjdCwgbWFwcGluZyB0b3AtbGV2ZWwgZmllbGRzIHRvIG1ldGFkYXRhIHdoZXJlIGFwcHJvcHJpYXRlXG4gIC8vIElzc3VlICM1NjU6IFVzZSB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHByb3BlcnRpZXMgZnJvbSBhdXRob3JpdGF0aXZlIHNvdXJjZVxuICBjb25zdCBtZXRhZGF0YUZpZWxkcyA9IEtOT1dOX01FVEFEQVRBX1BST1BFUlRJRVNbbm9ybWFsaXplZFR5cGVdID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IHVucmVjb2duaXplZEZpZWxkV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNvbGxlY3Rpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYXBwbGllZEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpcHBlZEZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBGaWVsZHMgaGFuZGxlZCBieSBkZWRpY2F0ZWQgYnJhbmNoZXMgKG5vdCBtZXRhZGF0YSByb3V0aW5nKVxuICBjb25zdCBzcGVjaWFsUm91dGVGaWVsZHMgPSBuZXcgU2V0KFsnaW5zdHJ1Y3Rpb25zJywgJ2NvbnRlbnQnLCAnZWxlbWVudHMnLCAnbWV0YWRhdGEnLCAnZW50cmllcycsICd2ZXJzaW9uJ10pO1xuXG4gIC8vIENvbnRlbnQgY29udGV4dCBtYXAgc2hhcmVkIGJ5IGluc3RydWN0aW9ucyBhbmQgY29udGVudCB2YWxpZGF0aW9uIGJyYW5jaGVzXG4gIGNvbnN0IGNvbnRlbnRDb250ZXh0TWFwOiBSZWNvcmQ8c3RyaW5nLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLkFHRU5UXTogJ2FnZW50JyxcbiAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnc2tpbGwnLFxuICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICd0ZW1wbGF0ZScsXG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIC8vIFNraXAgZGFuZ2Vyb3VzIHByb3BlcnRpZXNcbiAgICBpZiAoREFOR0VST1VTX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgc2tpcHBlZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIHJlYWQtb25seSBmaWVsZHNcbiAgICBpZiAoUkVBRF9PTkxZX0ZJRUxEUy5oYXMoa2V5KSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gU2tpcHBpbmcgcmVhZC1vbmx5IGZpZWxkOiAke2tleX1gKTtcbiAgICAgIHNraXBwZWRGaWVsZHMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgYnJhbmNoIGJlbG93IGFwcGxpZXMgdGhlIGZpZWxkIOKAlCB0cmFjayBvbmNlIGF0IHRoZSBlbmRcbiAgICBsZXQgZmllbGRBcHBsaWVkID0gdHJ1ZTtcblxuICAgIC8vIE1hcCBrbm93biBtZXRhZGF0YSBmaWVsZHMgYXV0b21hdGljYWxseSAodHlwZS1zcGVjaWZpYylcbiAgICBpZiAobWV0YWRhdGFGaWVsZHMuaGFzKGtleSkgJiYgIXNwZWNpYWxSb3V0ZUZpZWxkcy5oYXMoa2V5KSkge1xuICAgICAgaWYgKCF1cGRhdGVPYmoubWV0YWRhdGEpIHtcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICAodXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdlbGVtZW50cycgJiYgbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAvLyBJc3N1ZSAjNjU4OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGVsZW1lbnRzIGlucHV0IChhcnJheSBvciBkaWN0IGZvcm1hdClcbiAgICAgIGNvbnN0IGVsZW1FcnJvciA9IGFwcGx5RW5zZW1ibGVFbGVtZW50c1VwZGF0ZSh2YWx1ZSwgZWxlbWVudCwgdXBkYXRlT2JqLCBjb2xsZWN0aW9uV2FybmluZ3MpO1xuICAgICAgaWYgKGVsZW1FcnJvcikgcmV0dXJuIGVycm9yKGVsZW1FcnJvcik7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdtZXRhZGF0YScgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVZhbHVlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIElmIG1ldGFkYXRhLmVsZW1lbnRzIGlzIHByb3ZpZGVkIGZvciBhbiBlbnNlbWJsZSwgZXh0cmFjdCBhbmQgcm91dGUgdGhyb3VnaFxuICAgICAgLy8gdGhlIGVuc2VtYmxlIGVsZW1lbnRzIGhhbmRsZXIgZm9yIHByb3BlciB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24vbWVyZ2UuXG4gICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFICYmIG1ldGFWYWx1ZS5lbGVtZW50cykge1xuICAgICAgICBjb25zdCBlbGVtRXJyb3IgPSBhcHBseUVuc2VtYmxlRWxlbWVudHNVcGRhdGUobWV0YVZhbHVlLmVsZW1lbnRzLCBlbGVtZW50LCB1cGRhdGVPYmosIGNvbGxlY3Rpb25XYXJuaW5ncyk7XG4gICAgICAgIGlmIChlbGVtRXJyb3IpIHJldHVybiBlcnJvcihlbGVtRXJyb3IpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIHZhbHVlIGJlZm9yZSBkZWVwIG1lcmdlIHRvIGF2b2lkIGRvdWJsZS1wcm9jZXNzaW5nXG4gICAgICAgIGNvbnN0IHsgZWxlbWVudHM6IF9leHRyYWN0ZWQsIC4uLnJlc3RNZXRhZGF0YSB9ID0gbWV0YVZhbHVlO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzdE1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0gZGVlcE1lcmdlKFxuICAgICAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgcmVzdE1ldGFkYXRhLFxuICAgICAgICAgICAgTUVSR0VfT1BUSU9OU1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1lcmdlIG5lc3RlZCBtZXRhZGF0YSB3aXRoIHNlY3VyaXR5IG9wdGlvbnNcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0gZGVlcE1lcmdlKFxuICAgICAgICAgICh1cGRhdGVPYmoubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIG1ldGFWYWx1ZSxcbiAgICAgICAgICBNRVJHRV9PUFRJT05TXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdpbnN0cnVjdGlvbnMnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM2MDIgcmVzb2x2ZWQ6ICdpbnN0cnVjdGlvbnMnIGlzIGEgZmlyc3QtY2xhc3MgZmllbGQgKGJlaGF2aW9yYWwgZGlyZWN0aXZlcylcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICAgICAgY29udGVudENvbnRleHQ6IGNvbnRlbnRDb250ZXh0TWFwW25vcm1hbGl6ZWRUeXBlXVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuICAgICAgLy8gU2V0IGluc3RydWN0aW9ucyBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcbiAgICAgIC8vIEZvciBhZ2VudHMsIGFsc28gdXBkYXRlIGV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAoZWxlbWVudCBhcyBhbnkpLmV4dGVuc2lvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICAoZWxlbWVudCBhcyBhbnkpLmV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSXNzdWUgIzU4NS8jNjAyOiBIYW5kbGUgY29udGVudCB1cGRhdGVzIChyZWZlcmVuY2UgbWF0ZXJpYWwpXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgICAgIGNvbnRlbnRDb250ZXh0OiBjb250ZW50Q29udGV4dE1hcFtub3JtYWxpemVkVHlwZV1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICAvLyBTZXQgY29udGVudCBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmNvbnRlbnQgPSBzYW5pdGl6ZWRDb250ZW50O1xuICAgIH0gZWxzZSBpZiAoc3BlY2lhbFJvdXRlRmllbGRzLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTcGVjaWFsIHJvdXRlIGZpZWxkIOKAlCBoYW5kbGVkIGVsc2V3aGVyZSwgc2tpcFxuICAgICAgZmllbGRBcHBsaWVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICM1NjU6IEZpZWxkIG5vdCBpbiB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHNldCBhbmQgbm90IGEgc3BlY2lhbCByb3V0ZSDigJRcbiAgICAgIC8vIHN0aWxsIHJvdXRlIHRvIHVwZGF0ZU9iaiBmb3IgYmFja3dhcmQgY29tcGF0LCBidXQgd2FybiB0aGF0IGl0IG1heSBub3QgcGVyc2lzdFxuICAgICAgdXBkYXRlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIHVucmVjb2duaXplZEZpZWxkV2FybmluZ3MucHVzaChcbiAgICAgICAgYEZpZWxkICcke2tleX0nIGlzIG5vdCBhIHJlY29nbml6ZWQgbWV0YWRhdGEgcHJvcGVydHkgZm9yICR7Z2V0RWxlbWVudFR5cGVMYWJlbChub3JtYWxpemVkVHlwZSl9IOKAlCBpdCBtYXkgbm90IHBlcnNpc3QgYWZ0ZXIgc2F2ZS5gXG4gICAgICApO1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gVW5yZWNvZ25pemVkIGZpZWxkICcke2tleX0nIGZvciAke25vcm1hbGl6ZWRUeXBlfSwgcm91dGluZyB0byBlbGVtZW50IG9iamVjdGAsIHtcbiAgICAgICAgZWxlbWVudFR5cGU6IG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChmaWVsZEFwcGxpZWQpIHtcbiAgICAgIGFwcGxpZWRGaWVsZHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZXAgbWVyZ2UgdGhlIHVwZGF0ZSBpbnRvIHRoZSBlbGVtZW50IHdpdGggc2VjdXJpdHkgb3B0aW9uc1xuICBjb25zdCBlbGVtZW50RGF0YSA9IGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbWVyZ2VkRGF0YSA9IGRlZXBNZXJnZShlbGVtZW50RGF0YSwgdXBkYXRlT2JqLCBNRVJHRV9PUFRJT05TKTtcblxuICAvLyBBcHBseSBtZXJnZWQgZGF0YSBiYWNrIHRvIGVsZW1lbnRcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWVyZ2VkRGF0YSkpIHtcbiAgICBpZiAoa2V5ICE9PSAnbWV0YWRhdGEnKSB7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgbWV0YWRhdGEgc2VwYXJhdGVseSB0byBwcmVzZXJ2ZSBlbGVtZW50IHN0cnVjdHVyZVxuICBpZiAobWVyZ2VkRGF0YS5tZXRhZGF0YSAmJiBlbGVtZW50Lm1ldGFkYXRhKSB7XG4gICAgT2JqZWN0LmFzc2lnbihlbGVtZW50Lm1ldGFkYXRhLCBtZXJnZWREYXRhLm1ldGFkYXRhKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBtZW1vcnkgZW50cmllcyBzcGVjaWFsbHkgKGV4dHJhY3RlZCBmb3IgY2xhcml0eSlcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkgJiYgaW5wdXQuZW50cmllcyAmJiBBcnJheS5pc0FycmF5KGlucHV0LmVudHJpZXMpKSB7XG4gICAgY29uc3QgbWVtb3J5UmVzdWx0ID0gaGFuZGxlTWVtb3J5RW50cnlVcGRhdGUoaW5wdXQuZW50cmllcyk7XG4gICAgaWYgKCFtZW1vcnlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIGVycm9yKGBNZW1vcnkgZW50cnkgdmFsaWRhdGlvbiBlcnJvcnM6XFxuJHttZW1vcnlSZXN1bHQubWVzc2FnZX1cXG5cXG5WYWxpZCBlbnRyaWVzIHdlcmUgc2F2ZWQuYCk7XG4gICAgfVxuICAgIChlbGVtZW50IGFzIGFueSkuZW50cmllcyA9IG1lbW9yeVJlc3VsdC5lbnRyaWVzTWFwO1xuICB9XG5cbiAgLy8gU3luYyBlbnNlbWJsZSBlbGVtZW50cyBmcm9tIG1ldGFkYXRhIChleHRyYWN0ZWQgZm9yIGNsYXJpdHkpXG4gIC8vIElzc3VlICM0NjY6IFJlc29sdmUgZWxlbWVudF90eXBlIHZpYSBwb3J0Zm9saW8gbG9va3VwIGJlZm9yZSBzeW5jLCBzdXJmYWNlIHdhcm5pbmdzXG4gIGxldCByZXNvbHV0aW9uV2FybmluZ1RleHQgPSAnJztcbiAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSkge1xuICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBhd2FpdCBzeW5jRW5zZW1ibGVFbGVtZW50c0lmTmVlZGVkKGVsZW1lbnQsIGlucHV0LCBjb250ZXh0KTtcbiAgICBpZiAocmVzb2x1dGlvblJlc3VsdCkge1xuICAgICAgcmVzb2x1dGlvbldhcm5pbmdUZXh0ID0gZm9ybWF0RWxlbWVudFJlc29sdXRpb25XYXJuaW5ncyhyZXNvbHV0aW9uUmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICAvLyBGaXggIzkxMTogTm9ybWFsaXplIG1ldGFkYXRhIGFmdGVyIG1lcmdlIHRvIGVuc3VyZSBzdHJ1Y3R1cmFsIGNvbnNpc3RlbmN5LlxuICAvLyBCYXNlRWxlbWVudCBjb25zdHJ1Y3RvciBydW5zIG5vcm1hbGl6ZU1ldGFkYXRhIG9uIGNyZWF0ZS9sb2FkLCBidXQgdGhlIGVkaXQgcGF0aFxuICAvLyBtb2RpZmllcyBtZXRhZGF0YSBpbi1wbGFjZS4gVGhpcyBlbnN1cmVzIGVzc2VudGlhbCBkZWZhdWx0cyBzdXJ2aXZlIGVkaXRzLlxuICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgIGVsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz89ICcnO1xuICAgIGVsZW1lbnQubWV0YWRhdGEudGFncyA/Pz0gW107XG4gICAgLy8gVXBkYXRlIG1vZGlmaWVkIHRpbWVzdGFtcFxuICAgIGVsZW1lbnQubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgdmVyc2lvbiB1cGRhdGVzXG4gIGlmIChpbnB1dC52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVWZXJzaW9uRXhwbGljaXQoZWxlbWVudCwgU3RyaW5nKGlucHV0LnZlcnNpb24pKTtcbiAgICBpZiAoIXVwZGF0ZS5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gZXJyb3IodXBkYXRlLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbicpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhdXRvSW5jcmVtZW50VmVyc2lvbihlbGVtZW50KTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBmaWxlIHBhdGggZm9yIHNhdmluZ1xuICBjb25zdCBmaWxlUGF0aENhbmRpZGF0ZSA9IHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLmdldEZpbGVQYXRoID09PSAnZnVuY3Rpb24nXG4gICAgPyAoZWxlbWVudCBhcyBhbnkpLmdldEZpbGVQYXRoKClcbiAgICA6ICgoZWxlbWVudCBhcyBhbnkpLmZpbGVQYXRoIHx8IChlbGVtZW50IGFzIGFueSkuZmlsZW5hbWUpO1xuICBjb25zdCBmaWxlbmFtZSA9IHR5cGVvZiBmaWxlUGF0aENhbmRpZGF0ZSA9PT0gJ3N0cmluZycgJiYgZmlsZVBhdGhDYW5kaWRhdGUubGVuZ3RoID4gMFxuICAgID8gZmlsZVBhdGhDYW5kaWRhdGVcbiAgICA6IGdldEVsZW1lbnRGaWxlbmFtZShub3JtYWxpemVkVHlwZSwgZWxlbWVudC5tZXRhZGF0YT8ubmFtZSB8fCBuYW1lKTtcblxuICB0cnkge1xuICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShlbGVtZW50LCBmaWxlbmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBlcnJvcihgRmFpbGVkIHRvIHNhdmUgZWxlbWVudDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlKTtcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBlbGVtZW50Lm1ldGFkYXRhPy5uYW1lIHx8IG5hbWU7XG4gIGNvbnN0IHVwZGF0ZWRGaWVsZHMgPSBhcHBsaWVkRmllbGRzLmpvaW4oJywgJyk7XG5cbiAgLy8gSXNzdWUgIzE2NTY6IElmIGFsbCBmaWVsZHMgd2VyZSBzaWxlbnRseSBza2lwcGVkLCByZXBvcnQgaG9uZXN0bHlcbiAgaWYgKGFwcGxpZWRGaWVsZHMubGVuZ3RoID09PSAwICYmIHNraXBwZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHRleHQ6IGDimqDvuI8gTm8gZmllbGRzIGFwcGxpZWQgdG8gJHtsYWJlbH0gJyR7ZGlzcGxheU5hbWV9Jy4gYCArXG4gICAgICAgICAgYFNraXBwZWQ6ICR7c2tpcHBlZEZpZWxkcy5qb2luKCcsICcpfSAoZGFuZ2Vyb3VzIG9yIHJlYWQtb25seSBmaWVsZHMgYXJlIG5vdCBlZGl0YWJsZSkuYFxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gSXNzdWUgIzU2NTogSW5jbHVkZSB3YXJuaW5ncyBmb3IgdW5yZWNvZ25pemVkIGZpZWxkcyBpbiByZXNwb25zZVxuICBsZXQgdW5yZWNvZ25pemVkV2FybmluZ1RleHQgPSAnJztcbiAgaWYgKHVucmVjb2duaXplZEZpZWxkV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmVzID0gWyfimqDvuI8gKipVbnJlY29nbml6ZWQgRmllbGQgV2FybmluZ3M6KionXTtcbiAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2YgdW5yZWNvZ25pemVkRmllbGRXYXJuaW5ncykge1xuICAgICAgbGluZXMucHVzaChgICAg4oCiICR7d2FybmluZ31gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgdW5yZWNvZ25pemVkV2FybmluZ1RleHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8vIElzc3VlICM2NjI6IEluY2x1ZGUgY29sbGVjdGlvbiBvcGVyYXRpb24gd2FybmluZ3NcbiAgbGV0IGNvbGxlY3Rpb25XYXJuaW5nVGV4dCA9ICcnO1xuICBpZiAoY29sbGVjdGlvbldhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5lcyA9IFsn4pqg77iPICoqQ29sbGVjdGlvbiBXYXJuaW5nczoqKiddO1xuICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBjb2xsZWN0aW9uV2FybmluZ3MpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgIOKAoiAke3dhcm5pbmd9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGNvbGxlY3Rpb25XYXJuaW5nVGV4dCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8gSXNzdWUgIzE2NTY6IFJlcG9ydCBza2lwcGVkIGZpZWxkcyBzbyBMTE1zIGRvbid0IGFzc3VtZSB0aGV5IHdlcmUgYXBwbGllZFxuICBjb25zdCBza2lwcGVkVGV4dCA9IHNraXBwZWRGaWVsZHMubGVuZ3RoID4gMFxuICAgID8gYFxcbuKaoO+4jyBTa2lwcGVkOiAke3NraXBwZWRGaWVsZHMuam9pbignLCAnKX0gKGRhbmdlcm91cyBvciByZWFkLW9ubHkpYFxuICAgIDogJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdGV4dDogYCR7d2FybmluZ1RleHR9JHtyZXNvbHV0aW9uV2FybmluZ1RleHR9JHt1bnJlY29nbml6ZWRXYXJuaW5nVGV4dH0ke2NvbGxlY3Rpb25XYXJuaW5nVGV4dH3inIUgVXBkYXRlZCAke2xhYmVsfSAnJHtkaXNwbGF5TmFtZX0nIC0gZmllbGRzOiAke3VwZGF0ZWRGaWVsZHN9JHtza2lwcGVkVGV4dH1gXG4gICAgfV1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogW3tcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHRleHQ6IGDinYwgJHttZXNzYWdlfWBcbiAgICB9XVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyRm9yVHlwZShjb250ZXh0OiBFbGVtZW50Q3J1ZENvbnRleHQsIHR5cGU6IEVsZW1lbnRUeXBlKTogRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8YW55PiB8IG51bGwge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICByZXR1cm4gY29udGV4dC5wZXJzb25hTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxhbnk+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICByZXR1cm4gY29udGV4dC5za2lsbE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8U2tpbGw+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICByZXR1cm4gY29udGV4dC50ZW1wbGF0ZU1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8VGVtcGxhdGU+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICByZXR1cm4gY29udGV4dC5hZ2VudE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8QWdlbnQ+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOlxuICAgICAgcmV0dXJuIGNvbnRleHQubWVtb3J5TWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxNZW1vcnk+O1xuICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6XG4gICAgICByZXR1cm4gY29udGV4dC5lbnNlbWJsZU1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJXaXRoUGVyc2lzdGVuY2U8YW55PjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkV4cGxpY2l0KGVsZW1lbnQ6IGFueSwgdmVyc2lvblN0cmluZzogc3RyaW5nKSB7XG4gIGNvbnN0IGlzVmFsaWQgPSAvXihcXGQrKShcXC5cXGQrKT8oXFwuXFxkKyk/KC1bYS16QS1aMC05Li1dKyk/JC8udGVzdCh2ZXJzaW9uU3RyaW5nKTtcbiAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogYEludmFsaWQgdmVyc2lvbiBmb3JtYXQ6ICcke3ZlcnNpb25TdHJpbmd9Jy4gUGxlYXNlIHVzZSBmb3JtYXQgbGlrZSAxLjAuMCwgMS4wLCBvciAxYFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGVsZW1lbnQudmVyc2lvbiA9IHZlcnNpb25TdHJpbmc7XG4gICAgaWYgKGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbiA9IHZlcnNpb25TdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbicsIHsgZXJyb3IgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdXRvSW5jcmVtZW50VmVyc2lvbihlbGVtZW50OiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBpZiAoZWxlbWVudC52ZXJzaW9uKSB7XG4gICAgICAvLyBGaXJzdCBub3JtYWxpemUgdGhlIHZlcnNpb24gdG8gMy1wYXJ0IGZvcm1hdCAoaGFuZGxlcyBsZWdhY3kgMi1wYXJ0IHZlcnNpb25zKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKGVsZW1lbnQudmVyc2lvbikpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnNcbiAgICAgIGNvbnN0IHByZVJlbGVhc2VNYXRjaCA9IG5vcm1hbGl6ZWQubWF0Y2goL14oXFxkK1xcLlxcZCtcXC5cXGQrKSgtKFthLXpBLVowLTkuLV0rKSk/JC8pO1xuXG4gICAgICBpZiAocHJlUmVsZWFzZU1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VWZXJzaW9uID0gcHJlUmVsZWFzZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBwcmVSZWxlYXNlVGFnID0gcHJlUmVsZWFzZU1hdGNoWzNdO1xuXG4gICAgICAgIGlmIChwcmVSZWxlYXNlVGFnKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHByZS1yZWxlYXNlIHZlcnNpb24gKGUuZy4sIFwiMS4wLjAtYmV0YS4xXCIg4oaSIFwiMS4wLjAtYmV0YS4yXCIpXG4gICAgICAgICAgY29uc3QgcHJlUmVsZWFzZU51bWJlck1hdGNoID0gcHJlUmVsZWFzZVRhZy5tYXRjaCgvXihbYS16QS1aXSspXFwuPyhcXGQrKT8kLyk7XG4gICAgICAgICAgaWYgKHByZVJlbGVhc2VOdW1iZXJNYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgcHJlUmVsZWFzZVR5cGUgPSBwcmVSZWxlYXNlTnVtYmVyTWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlTnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHByZVJlbGVhc2VOdW1iZXJNYXRjaFsyXSB8fCAnMCcpICsgMTtcbiAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9IGAke2Jhc2VWZXJzaW9ufS0ke3ByZVJlbGVhc2VUeXBlfS4ke3ByZVJlbGVhc2VOdW1iZXJ9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gcHJlLXJlbGVhc2UgbnVtYmVyLCBidW1wIHBhdGNoXG4gICAgICAgICAgICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBiYXNlVmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0YW5kYXJkIHZlcnNpb24sIGJ1bXAgcGF0Y2ggKGUuZy4sIFwiMS4wLjBcIiDihpIgXCIxLjAuMVwiKVxuICAgICAgICAgIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IGJhc2VWZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNob3VsZG4ndCByZWFjaCBoZXJlIGFmdGVyIG5vcm1hbGl6YXRpb24sIGJ1dCBmYWxsYmFjayB0byBzYWZlIGRlZmF1bHRcbiAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gJzEuMC4xJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gdmVyc2lvbiwgc3RhcnQgYXQgMS4wLjBcbiAgICAgIGVsZW1lbnQudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgfVxuXG4gICAgLy8gU3luYyB2ZXJzaW9uIHRvIG1ldGFkYXRhXG4gICAgaWYgKGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICAgIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbiA9IGVsZW1lbnQudmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYXV0by1pbmNyZW1lbnQgdmVyc2lvbicsIHsgZXJyb3IgfSk7XG4gIH1cbn1cbiJdfQ==
852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdEVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUtsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBNEIsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBRXBCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLCtCQUErQixFQUMvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEdBQ2xDLE1BQU0sY0FBYyxDQUFDO0FBaUN0QixnRUFBZ0U7QUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixJQUFJO0lBQ0osTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCxTQUFTLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxHQUFXO0lBQ3ZELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUTtRQUM5QixLQUFLLEtBQUssSUFBSTtRQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLFNBQThCO0lBQzlELFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxlQUFlLENBQUMsZUFBZSxDQUFDO1FBQ3pDLEtBQUssYUFBYTtZQUNoQixPQUFPLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQztRQUNoRCxLQUFLLFNBQVM7WUFDWixPQUFPLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQztRQUM1QyxLQUFLLFVBQVU7WUFDYixPQUFPLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGdCQUFnQixHQUlqQjtJQUNILHVDQUF1QztJQUN2QyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3RFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDMUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN6RSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUMvRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQy9FLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ25FLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzVELFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2xFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzlELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzdELHNFQUFzRTtJQUN0RSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlB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SSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNyRCxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTix5REFBeUQ7b0JBQ3pELE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqRSxPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04seUVBQXlFO2dCQUN6RSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTiw2QkFBNkI7WUFDN0IsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDNUIsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3NraWxscy9Ta2lsbC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9BZ2VudC5qcyc7XG5pbXBvcnQgeyBNZW1vcnkgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnO1xuaW1wb3J0IHsgRW5zZW1ibGUgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFbnNlbWJsZUVsZW1lbnRJbnB1dCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Q3J1ZENvbnRleHQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWVtb3J5SWQgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy91dGlscy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplVmVyc2lvbiB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlLCB0eXBlIFZhbGlkYXRpb25GaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIERBTkdFUk9VU19QUk9QRVJUSUVTIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGVlcE1lcmdlLmpzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQsXG4gIGZvcm1hdFZhbGlkRWxlbWVudFR5cGVzTGlzdCxcbiAgZ2V0RWxlbWVudEZpbGVuYW1lLFxuICBnZXRFbGVtZW50VHlwZUxhYmVsLFxuICByZXNvbHZlRWxlbWVudEJ5TmFtZSxcbiAgRWxlbWVudE1hbmFnZXJPcGVyYXRpb25zLFxuICBLTk9XTl9NRVRBREFUQV9QUk9QRVJUSUVTLFxuICBkZXRlY3RVbmtub3duTWV0YWRhdGFQcm9wZXJ0aWVzLFxuICBmb3JtYXRVbmtub3duUHJvcGVydHlXYXJuaW5ncyxcbiAgZm9ybWF0RWxlbWVudFJlc29sdXRpb25XYXJuaW5ncyxcbiAgY29sbGVjdEdhdGVrZWVwZXJBdXRob3JpbmdFcnJvcnMsXG4gIGZvcm1hdEdhdGVrZWVwZXJWYWxpZGF0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZUVsZW1lbnRUeXBlc1Jlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuXG50eXBlIEVsZW1lbnRNYW5hZ2VyV2l0aFBlcnNpc3RlbmNlPFQ+ID0gRWxlbWVudE1hbmFnZXJPcGVyYXRpb25zPFQ+ICYge1xuICBzYXZlKGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBkZWxldGU/KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuLyoqXG4gKiBHcmFwaFFMLWFsaWduZWQgaW5wdXQgZm9yIGVkaXRpbmcgZWxlbWVudHMuXG4gKiBVc2VzIG5lc3RlZCBvYmplY3RzIChsaWtlIGNyZWF0ZV9lbGVtZW50KSBpbnN0ZWFkIG9mIE1vbmdvREItc3R5bGUgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVcGRhdGUgZGVzY3JpcHRpb24gYW5kIG5lc3RlZCBtZXRhZGF0YVxuICoge1xuICogICBuYW1lOiBcIm15LXNraWxsXCIsXG4gKiAgIHR5cGU6IFwic2tpbGxzXCIsXG4gKiAgIGlucHV0OiB7XG4gKiAgICAgZGVzY3JpcHRpb246IFwiVXBkYXRlZCBkZXNjcmlwdGlvblwiLFxuICogICAgIG1ldGFkYXRhOiB7XG4gKiAgICAgICB0cmlnZ2VyczogW1wiY29kZVwiLCBcInJldmlld1wiXSxcbiAqICAgICAgIHNldHRpbmdzOiB7IHRoZW1lOiBcImRhcmtcIiB9XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEVsZW1lbnRBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBOZXN0ZWQgaW5wdXQgb2JqZWN0IC0gZmllbGRzIGFyZSBkZWVwLW1lcmdlZCB3aXRoIGV4aXN0aW5nIGVsZW1lbnQgKi9cbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBSZWFkLW9ubHkgZmllbGRzIHRoYXQgY2Fubm90IGJlIG1vZGlmaWVkIHRocm91Z2ggdGhlIGVkaXQgQVBJXG5jb25zdCBSRUFEX09OTFlfRklFTERTID0gbmV3IFNldChbXG4gICdpZCcsXG4gICd0eXBlJyxcbiAgJ2ZpbGVQYXRoJyxcbiAgJ2ZpbGVuYW1lJyxcbiAgJ19zdGF0dXMnLFxuICAnX2lzRGlydHknXG5dKTtcblxuZnVuY3Rpb24gaGFzT3duUmVjb3JkUHJvcGVydHkodmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBPYmplY3QuaGFzT3duKHZhbHVlLCBrZXkpO1xufVxuXG5mdW5jdGlvbiBnZXRNYXhMZW5ndGhGb3JGaWVsZFR5cGUoZmllbGRUeXBlOiBWYWxpZGF0aW9uRmllbGRUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICBjYXNlICduYW1lJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIO1xuICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDtcbiAgICBjYXNlICdjb250ZW50JzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIO1xuICAgIGNhc2UgJ2ZpbGVuYW1lJzpcbiAgICAgIHJldHVybiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTU1BTkRfQVJHX0xFTkdUSDtcbiAgfVxufVxuXG4vKipcbiAqIElzc3VlICM2NjI6IFN5c3RlbWF0aWMgZmllbGQgdHlwZSB2YWxpZGF0aW9uIGF0IHRoZSBlZGl0RWxlbWVudCBib3VuZGFyeS5cbiAqXG4gKiBEZWZpbmVzIGV4cGVjdGVkIHR5cGVzIGZvciBrbm93biBtZXRhZGF0YSBmaWVsZHMgYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzLlxuICogUHJldmVudHMgc2lsZW50IGRhdGEgY29ycnVwdGlvbiB3aGVuIExMTXMgc2VuZCB3cm9uZyB0eXBlcyAoZS5nLiwgZGljdCBpbnN0ZWFkIG9mIGFycmF5KS5cbiAqXG4gKiBLZXk6IGZpZWxkIG5hbWUsIFZhbHVlOiB7IGV4cGVjdGVkOiB0eXBlIGRlc2NyaXB0aW9uLCBjaGVjazogdmFsaWRhdG9yIGZ1bmN0aW9uIH1cbiAqL1xuY29uc3QgRklFTERfVFlQRV9SVUxFUzogUmVjb3JkPHN0cmluZywge1xuICBleHBlY3RlZDogc3RyaW5nO1xuICBjaGVjazogKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBlbGVtZW50VHlwZXM/OiBFbGVtZW50VHlwZVtdO1xufT4gPSB7XG4gIC8vIEFycmF5IGZpZWxkcyAoYWNyb3NzIG11bHRpcGxlIHR5cGVzKVxuICB0YWdzOiB7IGV4cGVjdGVkOiAnYXJyYXkgb2Ygc3RyaW5ncycsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICB0cmlnZ2VyczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZG9tYWluczogeyBleHBlY3RlZDogJ2FycmF5IG9mIHN0cmluZ3MnLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgZXhhbXBsZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBwcmVyZXF1aXNpdGVzOiB7IGV4cGVjdGVkOiAnYXJyYXkgb2Ygc3RyaW5ncycsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBjYXBhYmlsaXRpZXM6IHsgZXhwZWN0ZWQ6ICdhcnJheScsIGNoZWNrOiAodikgPT4gQXJyYXkuaXNBcnJheSh2KSB9LFxuICBnb2FsczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIGNvbnN0cmFpbnRzOiB7IGV4cGVjdGVkOiAnYXJyYXknLCBjaGVjazogKHYpID0+IEFycmF5LmlzQXJyYXkodikgfSxcbiAgYWN0aW9uczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIHNraWxsczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpIH0sXG4gIC8vIElzc3VlICM3MjQ6IGFjdGl2YXRlcyBhbmQgdG9vbHMgYXJlIG9iamVjdHMgZm9yIGFnZW50cyAobm90IGFycmF5cylcbiAgYWN0aXZhdGVzOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHRvb2xzOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHZhcmlhYmxlczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5URU1QTEFURV0gfSxcbiAgZW50cmllczogeyBleHBlY3RlZDogJ2FycmF5JywgY2hlY2s6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5NRU1PUlldIH0sXG4gIC8vIGVsZW1lbnRzIGhhbmRsZWQgc2VwYXJhdGVseSBieSB2YWxpZGF0ZUFuZE5vcm1hbGl6ZUVuc2VtYmxlRWxlbWVudHMgKGFjY2VwdHMgZGljdCB0b28pXG5cbiAgLy8gT2JqZWN0IGZpZWxkc1xuICBnb2FsOiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIGF1dG9ub215OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuQUdFTlRdIH0sXG4gIHJlc2lsaWVuY2U6IHsgZXhwZWN0ZWQ6ICdvYmplY3QnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5BR0VOVF0gfSxcbiAgZ2F0ZWtlZXBlcjogeyBleHBlY3RlZDogJ29iamVjdCcsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikgfSxcbiAgcmV0ZW50aW9uUG9saWN5OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuICByZXRlbnRpb25fcG9saWN5OiB7IGV4cGVjdGVkOiAnb2JqZWN0JywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSwgZWxlbWVudFR5cGVzOiBbRWxlbWVudFR5cGUuTUVNT1JZXSB9LFxuXG4gIC8vIFN0cmluZyBmaWVsZHNcbiAgLy8gSXNzdWUgIzcyNDogc3lzdGVtUHJvbXB0IHdhcyBtaXNzaW5nIGZyb20gZmllbGQgdHlwZSBydWxlcy5cbiAgLy8gQm90aCBjYW1lbENhc2UgYW5kIHNuYWtlX2Nhc2UgdmFyaWFudHMgYWNjZXB0ZWQgYmVjYXVzZSBMTE1zIGZyZXF1ZW50bHlcbiAgLy8gcGFzcyBzbmFrZV9jYXNlIGtleXM7IG5vcm1hbGl6YXRpb24gdG8gY2FtZWxDYXNlIGhhcHBlbnMgZG93bnN0cmVhbSBpblxuICAvLyBBZ2VudE1hbmFnZXIucGFyc2VNZXRhZGF0YSgpIChJc3N1ZSAjNzIyKS5cbiAgc3lzdGVtUHJvbXB0OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBzeXN0ZW1fcHJvbXB0OiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLkFHRU5UXSB9LFxuICBuYW1lOiB7IGV4cGVjdGVkOiAnc3RyaW5nJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgfSxcbiAgZGVzY3JpcHRpb246IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuICBhdXRob3I6IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuICB2ZXJzaW9uOiB7IGV4cGVjdGVkOiAnc3RyaW5nIG9yIG51bWJlcicsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2ID09PSAnbnVtYmVyJyB9LFxuICBjYXRlZ29yeTogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG4gIGRvbWFpbjogeyBleHBlY3RlZDogJ3N0cmluZycsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnIH0sXG4gIHRvbmU6IHsgZXhwZWN0ZWQ6ICdzdHJpbmcnLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyB9LFxuXG4gIC8vIE51bWJlciBmaWVsZHNcbiAgbWF4RW50cmllczogeyBleHBlY3RlZDogJ251bWJlcicsIGNoZWNrOiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInLCBlbGVtZW50VHlwZXM6IFtFbGVtZW50VHlwZS5NRU1PUlldIH0sXG4gIG1heF9lbnRyaWVzOiB7IGV4cGVjdGVkOiAnbnVtYmVyJywgY2hlY2s6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicsIGVsZW1lbnRUeXBlczogW0VsZW1lbnRUeXBlLk1FTU9SWV0gfSxcbiAgcHJpb3JpdHk6IHsgZXhwZWN0ZWQ6ICdudW1iZXInLCBjaGVjazogKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyB9LFxufTtcblxuLyoqXG4gKiBJc3N1ZSAjNjYyOiBWYWxpZGF0ZSBmaWVsZCB0eXBlcyBpbiBpbnB1dCBiZWZvcmUgYXBwbHlpbmcgdG8gZWxlbWVudC5cbiAqXG4gKiBDaGVja3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgYWdhaW5zdCBgRklFTERfVFlQRV9SVUxFU2AuIEZpZWxkcyBub3QgaW4gdGhlXG4gKiBydWxlcyBtYXAgYXJlIHNraXBwZWQgKHRoZXknbGwgYmUgY2F1Z2h0IGJ5IHVua25vd24tcHJvcGVydHkgZGV0ZWN0aW9uIGxhdGVyKS5cbiAqIEVsZW1lbnQtdHlwZS1zY29wZWQgcnVsZXMgb25seSBhcHBseSB3aGVuIHRoZSB0YXJnZXQgdHlwZSBtYXRjaGVzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCAtIFRoZSBlZGl0IGlucHV0IG9iamVjdCBjb250YWluaW5nIGZpZWxkcyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVGhlIG5vcm1hbGl6ZWQgZWxlbWVudCB0eXBlIGJlaW5nIGVkaXRlZFxuICogQHJldHVybnMgQXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgZm9yIGZpZWxkcyB3aXRoIHdyb25nIHR5cGVzIChlbXB0eSBpZiBhbGwgdmFsaWQpXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmllbGRUeXBlcyhcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGVcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcnVsZSA9IEZJRUxEX1RZUEVfUlVMRVNbZmllbGRdO1xuICAgIGlmICghcnVsZSkgY29udGludWU7XG5cbiAgICAvLyBTa2lwIGlmIHJ1bGUgZG9lc24ndCBhcHBseSB0byB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIGlmIChydWxlLmVsZW1lbnRUeXBlcyAmJiAhcnVsZS5lbGVtZW50VHlwZXMuaW5jbHVkZXMoZWxlbWVudFR5cGUpKSBjb250aW51ZTtcblxuICAgIGlmICghcnVsZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBGaWVsZCAnJHtmaWVsZH0nIGV4cGVjdHMgJHtydWxlLmV4cGVjdGVkfSwgZ290ICR7QXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogdHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8vIE1lcmdlIG9wdGlvbnMgZm9yIHNlY3VyZSBkZWVwIG1lcmdpbmdcbmNvbnN0IE1FUkdFX09QVElPTlMgPSB7XG4gIHNraXBQcm9wZXJ0aWVzOiBEQU5HRVJPVVNfUFJPUEVSVElFUyxcbiAgcmVhZE9ubHlGaWVsZHM6IFJFQURfT05MWV9GSUVMRFNcbn07XG5cbi8qKlxuICogTWFwIGZpZWxkIG5hbWVzIHRvIHRoZWlyIGFwcHJvcHJpYXRlIHZhbGlkYXRpb24gZmllbGQgdHlwZXMuXG4gKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCB2YWxpZGF0aW9uIGJldHdlZW4gZWRpdCAoaW5wdXQpIGFuZCBsb2FkIChvdXRwdXQpLlxuICovXG5mdW5jdGlvbiBnZXRGaWVsZFR5cGVGb3JWYWxpZGF0aW9uKGZpZWxkTmFtZTogc3RyaW5nKTogVmFsaWRhdGlvbkZpZWxkVHlwZSB8IG51bGwge1xuICAvLyBOb3JtYWxpemUgZmllbGQgbmFtZSAoaGFuZGxlIGJvdGggJ2Rlc2NyaXB0aW9uJyBhbmQgJ21ldGFkYXRhLmRlc2NyaXB0aW9uJylcbiAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gZmllbGROYW1lLnJlcGxhY2UoL15tZXRhZGF0YVxcLi8sICcnKTtcblxuICBzd2l0Y2ggKG5vcm1hbGl6ZWRGaWVsZCkge1xuICAgIGNhc2UgJ25hbWUnOlxuICAgICAgcmV0dXJuICduYW1lJztcbiAgICBjYXNlICdkZXNjcmlwdGlvbic6XG4gICAgICByZXR1cm4gJ2Rlc2NyaXB0aW9uJztcbiAgICBjYXNlICdjb250ZW50JzpcbiAgICAgIHJldHVybiAnY29udGVudCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsOyAvLyBObyBzcGVjaWFsIHZhbGlkYXRpb24gbmVlZGVkXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGZpZWxkIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGl0IG9uIGFuIGVsZW1lbnQuXG4gKiBSZXR1cm5zIG51bGwgaWYgdmFsaWQsIG9yIGFuIGVycm9yIG1lc3NhZ2UgaWYgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0gdmFsaWRhdGlvblNlcnZpY2UgLSBJbmplY3RlZCB2YWxpZGF0aW9uIHNlcnZpY2UgZm9yIHRlc3RhYmlsaXR5XG4gKiBAcGFyYW0gZmllbGQgLSBUaGUgZmllbGQgbmFtZSBiZWluZyB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZpZWxkVmFsdWUoXG4gIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd25cbik6IHN0cmluZyB8IG51bGwge1xuICAvLyBPbmx5IHZhbGlkYXRlIHN0cmluZyB2YWx1ZXMgZm9yIHRleHQgZmllbGRzXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIE5vbi1zdHJpbmcgdmFsdWVzIChhcnJheXMsIG9iamVjdHMsIGJvb2xlYW5zLCBudW1iZXJzKSBza2lwIHRleHQgdmFsaWRhdGlvblxuICB9XG5cbiAgY29uc3QgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlRm9yVmFsaWRhdGlvbihmaWVsZCk7XG4gIGlmICghZmllbGRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIE5vIHZhbGlkYXRpb24gcnVsZXMgZm9yIHRoaXMgZmllbGRcbiAgfVxuXG4gIGNvbnN0IG1heExlbmd0aCA9IGdldE1heExlbmd0aEZvckZpZWxkVHlwZShmaWVsZFR5cGUpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dCh2YWx1ZSwge1xuICAgIG1heExlbmd0aCxcbiAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICBmaWVsZFR5cGVcbiAgfSk7XG5cbiAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgIHJldHVybiByZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpIHx8ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gIH1cblxuICByZXR1cm4gbnVsbDsgLy8gVmFsaWRcbn1cblxuaW50ZXJmYWNlIE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGQge1xuICBwYXRoOiBzdHJpbmc7XG4gIGxlbmd0aDogbnVtYmVyO1xuICBtYXhMZW5ndGg6IG51bWJlcjtcbn1cblxudHlwZSBUcmF2ZXJzYWxFbnRyeSA9IHJlYWRvbmx5IFtzdHJpbmcsIHVua25vd25dO1xuXG5mdW5jdGlvbiBhcHBlbmRUcmF2ZXJzYWxLZXkocGF0aDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBrZXkubGVuZ3RoID4gMCA/IGAke3BhdGh9LiR7a2V5fWAgOiBgJHtwYXRofVtcIlwiXWA7XG59XG5cbmZ1bmN0aW9uIGdldFRyYXZlcnNhbEVudHJpZXModmFsdWU6IG9iamVjdCwgcGF0aDogc3RyaW5nKTogVHJhdmVyc2FsRW50cnlbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0sIGluZGV4KSA9PiBbYCR7cGF0aH1bJHtpbmRleH1dYCwgaXRlbV0gYXMgY29uc3QpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBbYXBwZW5kVHJhdmVyc2FsS2V5KHBhdGgsIGtleSksIGl0ZW1dIGFzIGNvbnN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb25NYXhMZW5ndGhGb3JQYXRoKGZpZWxkUGF0aDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKGZpZWxkUGF0aCA9PT0gJ2lucHV0LmRlc2NyaXB0aW9uJyB8fCBmaWVsZFBhdGggPT09ICdpbnB1dC5tZXRhZGF0YS5kZXNjcmlwdGlvbicpIHtcbiAgICByZXR1cm4gU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEg7XG4gIH1cblxuICByZXR1cm4gU0VDVVJJVFlfTElNSVRTLk1BWF9ET0NVTUVOVEFUSU9OX0ZJRUxEX0xFTkdUSDtcbn1cblxuZnVuY3Rpb24gaXNPdmVyc2l6ZWREZXNjcmlwdGlvbkZpZWxkKGZpZWxkUGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIGNvbnN0IG1heExlbmd0aCA9IGdldERlc2NyaXB0aW9uTWF4TGVuZ3RoRm9yUGF0aChmaWVsZFBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZpZWxkUGF0aC5lbmRzV2l0aCgnLmRlc2NyaXB0aW9uJykgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgdmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGQ6IE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGQpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGAgIOKAoiAke2ZpZWxkLnBhdGh9IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgYCArXG4gICAgYCR7ZmllbGQubWF4TGVuZ3RofSBjaGFyYWN0ZXJzICgke2ZpZWxkLmxlbmd0aH0pYFxuICApO1xufVxuXG5mdW5jdGlvbiBmaW5kT3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBwYXRoID0gJ2lucHV0JyxcbiAgc2VlbiA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKSxcbik6IE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRbXSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBzZWVuLmFkZCh2YWx1ZSk7XG5cbiAgY29uc3Qgb3ZlcnNpemVkOiBPdmVyc2l6ZWREZXNjcmlwdGlvbkZpZWxkW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmllbGRQYXRoLCBpdGVtXSBvZiBnZXRUcmF2ZXJzYWxFbnRyaWVzKHZhbHVlLCBwYXRoKSkge1xuICAgIGlmIChpc092ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGRQYXRoLCBpdGVtKSkge1xuICAgICAgb3ZlcnNpemVkLnB1c2goe1xuICAgICAgICBwYXRoOiBmaWVsZFBhdGgsXG4gICAgICAgIGxlbmd0aDogaXRlbS5sZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogZ2V0RGVzY3JpcHRpb25NYXhMZW5ndGhGb3JQYXRoKGZpZWxkUGF0aCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgb3ZlcnNpemVkLnB1c2goLi4uZmluZE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzKGl0ZW0sIGZpZWxkUGF0aCwgc2VlbikpO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJzaXplZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGVuc2VtYmxlIGVsZW1lbnRzIGlucHV0LlxuICpcbiAqIElzc3VlICM2NTg6IExMTXMgb2Z0ZW4gc2VuZCBlbGVtZW50cyBpbiBkaWN0LWtleWVkIGZvcm1hdCBpbnN0ZWFkIG9mIGFycmF5IGZvcm1hdC5cbiAqIFRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyBib3RoIGZvcm1hdHMgdG8gYSB2YWxpZCBhcnJheSBvZiBFbnNlbWJsZUVsZW1lbnQtbGlrZSBvYmplY3RzLlxuICpcbiAqIEFjY2VwdGVkIGZvcm1hdHM6XG4gKiAtIEFycmF5OiBbeyBlbGVtZW50X25hbWU6IFwiZm9vXCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgLi4uIH1dXG4gKiAtIERpY3Q6ICB7IFwiZm9vXCI6IHsgdHlwZTogXCJtZW1vcnlcIiwgLi4uIH0gfSAg4oaSIGNvbnZlcnRlZCB0byBhcnJheVxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBlbGVtZW50cyBpbnB1dCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggc3VjY2VzcyBmbGFnLCBub3JtYWxpemVkIGVsZW1lbnRzIGFycmF5LCBhbmQgb3B0aW9uYWwgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBbmROb3JtYWxpemVFbnNlbWJsZUVsZW1lbnRzKHZhbHVlOiB1bmtub3duKToge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlbGVtZW50czogRW5zZW1ibGVFbGVtZW50SW5wdXRbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG59IHtcbiAgLy8gQ2FzZSAxOiBBbHJlYWR5IGFuIGFycmF5IOKAlCB2YWxpZGF0ZSBlYWNoIGl0ZW1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IEVuc2VtYmxlRWxlbWVudElucHV0W10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcbiAgICAgIGlmICghaXRlbSB8fCB0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBlcnJvcnMucHVzaChgRWxlbWVudCBhdCBpbmRleCAke2l9IG11c3QgYmUgYW4gb2JqZWN0IHdpdGggZWxlbWVudF9uYW1lIGFuZCBlbGVtZW50X3R5cGVgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBvYmogPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgbmFtZSA9IG9iai5lbGVtZW50X25hbWUgfHwgb2JqLm5hbWU7XG4gICAgICBjb25zdCB0eXBlID0gb2JqLmVsZW1lbnRfdHlwZSB8fCBvYmoudHlwZTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBlcnJvcnMucHVzaChgRWxlbWVudCBhdCBpbmRleCAke2l9IGlzIG1pc3NpbmcgZWxlbWVudF9uYW1lIChvciBuYW1lKWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIF9yZW1vdmUgaXMgc3RyaWN0bHkgYm9vbGVhbiBpZiBwcmVzZW50XG4gICAgICBpZiAoJ19yZW1vdmUnIGluIG9iaiAmJiB0eXBlb2Ygb2JqLl9yZW1vdmUgIT09ICdib29sZWFuJykge1xuICAgICAgICBlcnJvcnMucHVzaChgRWxlbWVudCAnJHtTdHJpbmcobmFtZSl9JyBoYXMgaW52YWxpZCBfcmVtb3ZlIHZhbHVlIOKAlCBtdXN0IGJlIGJvb2xlYW4gdHJ1ZSwgZ290ICR7dHlwZW9mIG9iai5fcmVtb3ZlfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIE5vcm1hbGl6ZSB0byBzdGFuZGFyZCBmaWVsZCBuYW1lcywgb25seSBpbmNsdWRpbmcgZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGNvbnN0IGVudHJ5OiBFbnNlbWJsZUVsZW1lbnRJbnB1dCA9IHsgLi4ub2JqLCBlbGVtZW50X25hbWU6IFN0cmluZyhuYW1lKSB9O1xuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgZW50cnkuZWxlbWVudF90eXBlID0gU3RyaW5nKHR5cGUpO1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZC5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlbGVtZW50czogW10sIGVycm9yOiBlcnJvcnMuam9pbignOyAnKSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbGVtZW50czogbm9ybWFsaXplZCB9O1xuICB9XG5cbiAgLy8gQ2FzZSAyOiBEaWN0LWtleWVkIGZvcm1hdCDigJQgY29udmVydCB0byBhcnJheVxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBkaWN0ID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgbm9ybWFsaXplZDogRW5zZW1ibGVFbGVtZW50SW5wdXRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QpKSB7XG4gICAgICBpZiAoIXZhbCB8fCB0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlbGVtZW50czogW10sXG4gICAgICAgICAgZXJyb3I6IGBFbGVtZW50ICcke2tleX0nIGluIGRpY3QgZm9ybWF0IG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgZWxlbWVudF90eXBlIChvciB0eXBlKS4gYCArXG4gICAgICAgICAgICBgRXhwZWN0ZWQ6IHsgXCIke2tleX1cIjogeyB0eXBlOiBcIm1lbW9yeVwiLCByb2xlOiBcInN1cHBvcnRcIiwgLi4uIH0gfWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlubmVyID0gdmFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgICAgLi4uaW5uZXIsXG4gICAgICAgIGVsZW1lbnRfbmFtZTogU3RyaW5nKGlubmVyLmVsZW1lbnRfbmFtZSB8fCBpbm5lci5uYW1lIHx8IGtleSksXG4gICAgICAgIGVsZW1lbnRfdHlwZTogU3RyaW5nKGlubmVyLmVsZW1lbnRfdHlwZSB8fCBpbm5lci50eXBlKSxcbiAgICAgICAgcm9sZTogKGlubmVyLnJvbGUgYXMgRW5zZW1ibGVFbGVtZW50SW5wdXRbJ3JvbGUnXSkgfHwgJ3N1cHBvcnQnLFxuICAgICAgICBhY3RpdmF0aW9uOiAoaW5uZXIuYWN0aXZhdGlvbiBhcyBFbnNlbWJsZUVsZW1lbnRJbnB1dFsnYWN0aXZhdGlvbiddKSB8fCAnYWx3YXlzJyxcbiAgICAgICAgcHJpb3JpdHk6IChpbm5lci5wcmlvcml0eSBhcyBudW1iZXIpID8/IDUwLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVsZW1lbnRzOiBub3JtYWxpemVkIH07XG4gIH1cblxuICAvLyBDYXNlIDM6IEludmFsaWQgdHlwZVxuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVsZW1lbnRzOiBbXSxcbiAgICBlcnJvcjogYCdlbGVtZW50cycgbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIG9yIGEgZGljdC1rZXllZCBvYmplY3QuIEdvdDogJHt0eXBlb2YgdmFsdWV9YFxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGluY29taW5nIGVuc2VtYmxlIGVsZW1lbnRzIHdpdGggZXhpc3RpbmcgZWxlbWVudHMuXG4gKlxuICogSXNzdWUgIzY1OC8jNjYyOiBVbmlmaWVkIGNvbGxlY3Rpb24gZWRpdGluZyBzZW1hbnRpY3Mg4oCUIGVhY2ggaXRlbSBpbiB0aGUgaW5wdXRcbiAqIGRlY2xhcmVzIGl0cyBvd24gaW50ZW50IHZpYSBpdHMgcHJvcGVydGllczpcbiAqXG4gKiAtIEV4aXN0aW5nIGVsZW1lbnQgd2l0aCB1cGRhdGVzIOKGkiBtZXJnZSBwcm9wZXJ0aWVzIChpbmNvbWluZyB3aW5zKVxuICogLSBOZXcgZWxlbWVudCAobm90IGZvdW5kIGJ5IG5hbWUpIOKGkiBhcHBlbmRlZFxuICogLSBFbGVtZW50IHdpdGggYF9yZW1vdmU6IHRydWVgIOKGkiBkcm9wcGVkIGZyb20gY29sbGVjdGlvblxuICogLSBFeGlzdGluZyBlbGVtZW50cyBub3QgaW4gaW5jb21pbmcg4oaSIHByZXNlcnZlZCB1bmNoYW5nZWRcbiAqXG4gKiBUaGlzIHBhdHRlcm4gZXh0ZW5kcyB0byBhbnkgZnV0dXJlIGdyb3VwaW5nIHR5cGUgKHdvcmtmbG93cywgcGlwZWxpbmVzLCB0ZWFtcykuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIC0gQ3VycmVudCBlbGVtZW50cyBhcnJheSBmcm9tIHRoZSBlbnNlbWJsZVxuICogQHBhcmFtIGluY29taW5nIC0gTmV3L3VwZGF0ZWQvcmVtb3ZlZCBlbGVtZW50cyBmcm9tIHRoZSBlZGl0IGlucHV0XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBtZXJnZWQgYXJyYXkgYW5kIGFueSB3YXJuaW5nc1xuICovXG5mdW5jdGlvbiBtZXJnZUVuc2VtYmxlRWxlbWVudHMoXG4gIGV4aXN0aW5nOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdLFxuICBpbmNvbWluZzogRW5zZW1ibGVFbGVtZW50SW5wdXRbXVxuKTogeyBlbGVtZW50czogRW5zZW1ibGVFbGVtZW50SW5wdXRbXTsgd2FybmluZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCByZXN1bHQ6IEVuc2VtYmxlRWxlbWVudElucHV0W10gPSBleGlzdGluZy5tYXAoZSA9PiAoeyAuLi5lIH0pKTtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBpbmMgb2YgaW5jb21pbmcpIHtcbiAgICBjb25zdCBuYW1lID0gU3RyaW5nKGluYy5lbGVtZW50X25hbWUgfHwgaW5jLm5hbWUgfHwgJycpO1xuICAgIGlmICghbmFtZSkgY29udGludWU7XG5cbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gcmVzdWx0LmZpbmRJbmRleChcbiAgICAgIGUgPT4gU3RyaW5nKGUuZWxlbWVudF9uYW1lIHx8IGUubmFtZSB8fCAnJykgPT09IG5hbWVcbiAgICApO1xuXG4gICAgLy8gSXNzdWUgIzY2MjogX3JlbW92ZSBtYXJrZXIg4oCUIGRyb3AgZWxlbWVudCBmcm9tIGNvbGxlY3Rpb25cbiAgICBpZiAoaW5jLl9yZW1vdmUgPT09IHRydWUpIHtcbiAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShleGlzdGluZ0luZGV4LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEVsZW1lbnQgJyR7bmFtZX0nIG5vdCBmb3VuZCBpbiBlbnNlbWJsZSDigJQgbm90aGluZyB0byByZW1vdmVgKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIHRyYW5zaWVudC9hbGlhcyBmaWVsZHMgdGhhdCBzaG91bGRuJ3QgYmUgcGVyc2lzdGVkXG4gICAgY29uc3QgeyBfcmVtb3ZlOiBfZGlzY2FyZFJlbW92ZSwgbmFtZTogX2Rpc2NhcmROYW1lLCB0eXBlOiBfZGlzY2FyZFR5cGUsIC4uLnBlcnNpc3RhYmxlIH0gPSBpbmM7XG5cbiAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAvLyBVcHNlcnQ6IG1lcmdlIGluY29taW5nIHByb3BlcnRpZXMgaW50byBleGlzdGluZyAoaW5jb21pbmcgd2lucylcbiAgICAgIHJlc3VsdFtleGlzdGluZ0luZGV4XSA9IHsgLi4ucmVzdWx0W2V4aXN0aW5nSW5kZXhdLCAuLi5wZXJzaXN0YWJsZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgbmV3IGVsZW1lbnRcbiAgICAgIHJlc3VsdC5wdXNoKHsgLi4ucGVyc2lzdGFibGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZWxlbWVudHM6IHJlc3VsdCwgd2FybmluZ3MgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSwgbm9ybWFsaXplLCBhbmQgbWVyZ2UgZW5zZW1ibGUgZWxlbWVudHMgaW50byB0aGUgdXBkYXRlIG9iamVjdC5cbiAqIEV4dHJhY3RlZCB0byBhdm9pZCBkdXBsaWNhdGlvbiBiZXR3ZWVuIHRoZSB0b3AtbGV2ZWwgYGVsZW1lbnRzYCBrZXkgaGFuZGxlclxuICogYW5kIHRoZSBgbWV0YWRhdGEuZWxlbWVudHNgIGtleSBoYW5kbGVyIChDbGF1ZGUgcmV2aWV3KS5cbiAqXG4gKiBAcmV0dXJucyBBbiBlcnJvciBzdHJpbmcgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgbnVsbCBvbiBzdWNjZXNzXG4gKi9cbmZ1bmN0aW9uIGlzRW5zZW1ibGVFbGVtZW50SW5wdXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFbnNlbWJsZUVsZW1lbnRJbnB1dCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFbnNlbWJsZUVsZW1lbnRzVXBkYXRlKFxuICBlbGVtZW50c0lucHV0OiB1bmtub3duLFxuICBlbGVtZW50OiB1bmtub3duLFxuICB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb2xsZWN0aW9uV2FybmluZ3M6IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVBbmROb3JtYWxpemVFbnNlbWJsZUVsZW1lbnRzKGVsZW1lbnRzSW5wdXQpO1xuICBpZiAoIXZhbGlkYXRlZC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIGBJbnZhbGlkICdlbGVtZW50cycgZm9ybWF0OiAke3ZhbGlkYXRlZC5lcnJvcn1gO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRSZWNvcmQgPSBlbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnRSZWNvcmQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhd0VsZW1lbnRzID0gbWV0YWRhdGE/LmVsZW1lbnRzO1xuICBjb25zdCBleGlzdGluZ1R5cGVkOiBFbnNlbWJsZUVsZW1lbnRJbnB1dFtdID0gQXJyYXkuaXNBcnJheShyYXdFbGVtZW50cylcbiAgICA/IHJhd0VsZW1lbnRzLmZpbHRlcihpc0Vuc2VtYmxlRWxlbWVudElucHV0KS5tYXAoZSA9PiAoeyAuLi5lIH0pKVxuICAgIDogW107XG4gIGNvbnN0IG1lcmdlUmVzdWx0ID0gbWVyZ2VFbnNlbWJsZUVsZW1lbnRzKGV4aXN0aW5nVHlwZWQsIHZhbGlkYXRlZC5lbGVtZW50cyk7XG4gIGNvbGxlY3Rpb25XYXJuaW5ncy5wdXNoKC4uLm1lcmdlUmVzdWx0Lndhcm5pbmdzKTtcbiAgaWYgKCF1cGRhdGVPYmoubWV0YWRhdGEpIHtcbiAgICB1cGRhdGVPYmoubWV0YWRhdGEgPSB7fTtcbiAgfVxuICAodXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lbGVtZW50cyA9IG1lcmdlUmVzdWx0LmVsZW1lbnRzO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzRW5zZW1ibGVFbGVtZW50c1VwZGF0ZShpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc093blJlY29yZFByb3BlcnR5KGlucHV0LCAnZWxlbWVudHMnKSB8fFxuICAgIGhhc093blJlY29yZFByb3BlcnR5KGlucHV0Lm1ldGFkYXRhLCAnZWxlbWVudHMnKTtcbn1cblxuLyoqXG4gKiBTeW5jIGVuc2VtYmxlIGVsZW1lbnRzIGZyb20gbWV0YWRhdGEgYWZ0ZXIgYW4gdXBkYXRlLlxuICpcbiAqIEVuc2VtYmxlcyBzdG9yZSB0aGVpciBlbGVtZW50IHJlZmVyZW5jZXMgaW4gbWV0YWRhdGEuZWxlbWVudHMsXG4gKiBhbmQgbmVlZCB0byBzeW5jIHRoZSBpbnRlcm5hbCBlbGVtZW50cyBhcnJheSB3aGVuIHRoYXQgY2hhbmdlcy5cbiAqXG4gKiBJc3N1ZSAjNDY2OiBCZWZvcmUgc3luY2luZywgcmVzb2x2ZSBhbnkgbWlzc2luZyBlbGVtZW50X3R5cGUgZmllbGRzXG4gKiBieSBzZWFyY2hpbmcgdGhlIHBvcnRmb2xpbyB2aWEgdGhlIGNvbnRleHQgbWFuYWdlcnMuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZW5zZW1ibGUgZWxlbWVudCB0byBzeW5jXG4gKiBAcGFyYW0gaW5wdXQgLSBUaGUgaW5wdXQgb2JqZWN0IHRvIGNoZWNrIGZvciBlbGVtZW50IHVwZGF0ZXNcbiAqIEBwYXJhbSBjb250ZXh0IC0gRWxlbWVudCBDUlVEIGNvbnRleHQgd2l0aCBtYW5hZ2VycyBmb3IgdHlwZSByZXNvbHV0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmNFbnNlbWJsZUVsZW1lbnRzSWZOZWVkZWQoXG4gIGVsZW1lbnQ6IHVua25vd24sXG4gIGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29udGV4dD86IEVsZW1lbnRDcnVkQ29udGV4dFxuKTogUHJvbWlzZTxSZXNvbHZlRWxlbWVudFR5cGVzUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGhhc0VsZW1lbnRzVXBkYXRlID0gaGFzRW5zZW1ibGVFbGVtZW50c1VwZGF0ZShpbnB1dCk7XG5cbiAgaWYgKGhhc0VsZW1lbnRzVXBkYXRlICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFbnNlbWJsZSkge1xuICAgIC8vIElzc3VlICM0NjY6IFJlc29sdmUgbWlzc2luZyBlbGVtZW50X3R5cGUgdmlhIHBvcnRmb2xpbyBsb29rdXAgYmVmb3JlIHN5bmNcbiAgICBpZiAoY29udGV4dCAmJiBBcnJheS5pc0FycmF5KGVsZW1lbnQubWV0YWRhdGEuZWxlbWVudHMpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlRWxlbWVudFR5cGVzKFxuICAgICAgICBlbGVtZW50Lm1ldGFkYXRhLmVsZW1lbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgc2tpbGxNYW5hZ2VyOiBjb250ZXh0LnNraWxsTWFuYWdlcixcbiAgICAgICAgICB0ZW1wbGF0ZU1hbmFnZXI6IGNvbnRleHQudGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgICAgIGFnZW50TWFuYWdlcjogY29udGV4dC5hZ2VudE1hbmFnZXIsXG4gICAgICAgICAgbWVtb3J5TWFuYWdlcjogY29udGV4dC5tZW1vcnlNYW5hZ2VyLFxuICAgICAgICAgIHBlcnNvbmFNYW5hZ2VyOiBjb250ZXh0LnBlcnNvbmFNYW5hZ2VyLFxuICAgICAgICAgIGVuc2VtYmxlTWFuYWdlcjogY29udGV4dC5lbnNlbWJsZU1hbmFnZXIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBlbGVtZW50Lm1ldGFkYXRhLmVsZW1lbnRzID0gcmVzdWx0LnJlc29sdmVkO1xuICAgICAgZWxlbWVudC5zeW5jRWxlbWVudHNGcm9tTWV0YWRhdGEoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZWxlbWVudC5zeW5jRWxlbWVudHNGcm9tTWV0YWRhdGEoKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEhhbmRsZSBtZW1vcnkgZW50cnkgdXBkYXRlcyB3aXRoIHZhbGlkYXRpb24gYW5kIG5vcm1hbGl6YXRpb24uXG4gKlxuICogTWVtb3J5IGVudHJpZXMgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIGJlY2F1c2UgdGhleTpcbiAqIC0gTmVlZCBJRCBnZW5lcmF0aW9uIGlmIG1pc3NpbmdcbiAqIC0gUmVxdWlyZSB0aW1lc3RhbXAgcGFyc2luZyBhbmQgdmFsaWRhdGlvblxuICogLSBVc2UgYSBNYXAgc3RydWN0dXJlIGludGVybmFsbHlcbiAqXG4gKiBAcGFyYW0gZW50cmllcyAtIEFycmF5IG9mIG1lbW9yeSBlbnRyaWVzIGZyb20gaW5wdXRcbiAqIEByZXR1cm5zIFJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLCBvcHRpb25hbCBlcnJvciBtZXNzYWdlLCBhbmQgbm9ybWFsaXplZCBlbnRyaWVzIG1hcFxuICovXG5mdW5jdGlvbiBoYW5kbGVNZW1vcnlFbnRyeVVwZGF0ZShlbnRyaWVzOiB1bmtub3duW10pOiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIGVudHJpZXNNYXA6IE1hcDxzdHJpbmcsIHVua25vd24+O1xufSB7XG4gIGNvbnN0IGVudHJpZXNNYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcnMucHVzaChgRW50cnkgYXQgaW5kZXggJHtpfSBpcyBub3QgYSB2YWxpZCBvYmplY3RgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5T2JqID0gZW50cnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgZW50cnlJZCA9IGVudHJ5T2JqLmlkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWVudHJ5SWQpIHtcbiAgICAgIGVudHJ5T2JqLmlkID0gZ2VuZXJhdGVNZW1vcnlJZCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBlbnRyeU9iai50aW1lc3RhbXAgPyBuZXcgRGF0ZShlbnRyeU9iai50aW1lc3RhbXAgYXMgc3RyaW5nKSA6IG5ldyBEYXRlKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHRpbWVzdGFtcC5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0aW1lc3RhbXAnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZEVudHJ5ID0ge1xuICAgICAgICAuLi5lbnRyeU9iaixcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICB0YWdzOiBBcnJheS5pc0FycmF5KGVudHJ5T2JqLnRhZ3MpID8gZW50cnlPYmoudGFncyA6IFtdLFxuICAgICAgICBtZXRhZGF0YTogdHlwZW9mIGVudHJ5T2JqLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiBlbnRyeU9iai5tZXRhZGF0YSAhPT0gbnVsbCA/IGVudHJ5T2JqLm1ldGFkYXRhIDoge31cbiAgICAgIH07XG5cbiAgICAgIGVudHJpZXNNYXAuc2V0KGVudHJ5T2JqLmlkLCBub3JtYWxpemVkRW50cnkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgZXJyb3JzLnB1c2goYEVudHJ5ICcke2VudHJ5T2JqLmlkfScgaGFzIGludmFsaWQgdGltZXN0YW1wYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9ycy5qb2luKCdcXG4nKSwgZW50cmllc01hcCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50cmllc01hcCB9O1xufVxuXG4vKipcbiAqIEVkaXQgYW4gZXhpc3RpbmcgZWxlbWVudCB1c2luZyBHcmFwaFFMLWFsaWduZWQgbmVzdGVkIGlucHV0LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gRWxlbWVudCBDUlVEIGNvbnRleHQgd2l0aCBtYW5hZ2Vyc1xuICogQHBhcmFtIGFyZ3MgLSBFZGl0IGFyZ3VtZW50cyAobmFtZSwgdHlwZSwgaW5wdXQpXG4gKiBAcGFyYW0gdmFsaWRhdGlvblNlcnZpY2UgLSBPcHRpb25hbCB2YWxpZGF0aW9uIHNlcnZpY2UgZm9yIERJIChjcmVhdGVzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEVsZW1lbnQoXG4gIGNvbnRleHQ6IEVsZW1lbnRDcnVkQ29udGV4dCxcbiAgYXJnczogRWRpdEVsZW1lbnRBcmdzLFxuICB2YWxpZGF0aW9uU2VydmljZT86IFZhbGlkYXRpb25TZXJ2aWNlXG4pIHtcbiAgYXdhaXQgY29udGV4dC5lbnN1cmVJbml0aWFsaXplZCgpO1xuXG4gIC8vIFVzZSBpbmplY3RlZCB2YWxpZGF0aW9uIHNlcnZpY2Ugb3IgY3JlYXRlIGRlZmF1bHRcbiAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdGlvblNlcnZpY2UgPz8gbmV3IFZhbGlkYXRpb25TZXJ2aWNlKCk7XG5cbiAgY29uc3QgeyBuYW1lLCB0eXBlLCBpbnB1dCB9ID0gYXJncztcblxuICAvLyBWYWxpZGF0ZSBpbnB1dCBpcyBwcm92aWRlZFxuICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBpbnB1dCBvYmplY3QuIFByb3ZpZGUgZmllbGRzIHRvIHVwZGF0ZSBhcyBhIG5lc3RlZCBvYmplY3QuJyk7XG4gIH1cblxuICBjb25zdCB7IHR5cGU6IG5vcm1hbGl6ZWRUeXBlIH0gPSBub3JtYWxpemVFbGVtZW50VHlwZUlucHV0KHR5cGUpO1xuXG4gIGlmICghbm9ybWFsaXplZFR5cGUpIHtcbiAgICByZXR1cm4gZXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlICcke3R5cGV9Jy4gVmFsaWQgdHlwZXM6ICR7Zm9ybWF0VmFsaWRFbGVtZW50VHlwZXNMaXN0KCl9YCk7XG4gIH1cblxuICBjb25zdCBtYW5hZ2VyID0gZ2V0TWFuYWdlckZvclR5cGUoY29udGV4dCwgbm9ybWFsaXplZFR5cGUpO1xuICBpZiAoIW1hbmFnZXIpIHtcbiAgICBjb25zdCBsYWJlbFBsdXJhbCA9IGdldEVsZW1lbnRUeXBlTGFiZWwobm9ybWFsaXplZFR5cGUsIHsgcGx1cmFsOiB0cnVlIH0pO1xuICAgIHJldHVybiBlcnJvcihgRWxlbWVudCB0eXBlICcke2xhYmVsUGx1cmFsfScgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGVkaXRpbmdgKTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCByZXNvbHZlRWxlbWVudEJ5TmFtZShtYW5hZ2VyLCBub3JtYWxpemVkVHlwZSwgbmFtZSk7XG4gIGlmICghZWxlbWVudCkge1xuICAgIGNvbnN0IGxhYmVsID0gZ2V0RWxlbWVudFR5cGVMYWJlbChub3JtYWxpemVkVHlwZSk7XG4gICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKGxhYmVsLCBuYW1lKTtcbiAgfVxuICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSBlbGVtZW50IGFzIHR5cGVvZiBlbGVtZW50ICYge1xuICAgIGluc3RydWN0aW9uczogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH07XG5cbiAgLy8gQ2hlY2sgZm9yIHVua25vd24gcHJvcGVydGllcyBhbmQgZ2VuZXJhdGUgd2FybmluZ3NcbiAgY29uc3QgdW5rbm93blByb3BlcnR5V2FybmluZ3MgPSBkZXRlY3RVbmtub3duTWV0YWRhdGFQcm9wZXJ0aWVzKFxuICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgIGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk7XG5cbiAgLy8gQWxzbyB2YWxpZGF0ZSBuZXN0ZWQgbWV0YWRhdGEgc3ViLW9iamVjdCAodGhlIHRvcC1sZXZlbCAnbWV0YWRhdGEnIGtleSBpc1xuICAvLyBza2lwcGVkIGJ5IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMgYXMgYSBzcGVjaWFsIHJvdXRlIGZpZWxkLCBzb1xuICAvLyBkYW5nZXJvdXMvdW5rbm93biBwcm9wZXJ0aWVzIGluc2lkZSBpdCB3b3VsZCBnbyB1bmNoZWNrZWQgb3RoZXJ3aXNlKVxuICBpZiAoaW5wdXQubWV0YWRhdGEgJiYgdHlwZW9mIGlucHV0Lm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXRhZGF0YSkpIHtcbiAgICBjb25zdCBuZXN0ZWRXYXJuaW5ncyA9IGRldGVjdFVua25vd25NZXRhZGF0YVByb3BlcnRpZXMoXG4gICAgICBub3JtYWxpemVkVHlwZSxcbiAgICAgIGlucHV0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICB1bmtub3duUHJvcGVydHlXYXJuaW5ncy5wdXNoKC4uLm5lc3RlZFdhcm5pbmdzKTtcbiAgfVxuXG4gIGNvbnN0IHdhcm5pbmdUZXh0ID0gZm9ybWF0VW5rbm93blByb3BlcnR5V2FybmluZ3ModW5rbm93blByb3BlcnR5V2FybmluZ3MpO1xuXG4gIGlmICh1bmtub3duUHJvcGVydHlXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gVW5rbm93biBwcm9wZXJ0aWVzIGRldGVjdGVkYCwge1xuICAgICAgZWxlbWVudFR5cGU6IG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICB3YXJuaW5nQ291bnQ6IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLmxlbmd0aCxcbiAgICAgIHVua25vd25Qcm9wZXJ0aWVzOiB1bmtub3duUHJvcGVydHlXYXJuaW5ncy5tYXAodyA9PiAoe1xuICAgICAgICBwcm9wZXJ0eTogdy5wcm9wZXJ0eSxcbiAgICAgICAgc3VnZ2VzdGlvbjogdy5zdWdnZXN0aW9uXG4gICAgICB9KSlcbiAgICB9KTtcbiAgfVxuXG4gIC8vIElzc3VlICMxNTkxOiBWYWxpZGF0ZSBlbGVtZW50LXNwZWNpZmljIGNvbnN0cmFpbnRzIGJlZm9yZSBhdHRlbXB0aW5nIGVkaXRzXG4gIC8vIE1lbW9yeSBjb250ZW50IGlzIHJlYWQtb25seSAoYXBwZW5kLW9ubHkgYXJjaGl0ZWN0dXJlKSAtIHJlamVjdCBhdHRlbXB0cyB0byBlZGl0IGl0XG4gIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZICYmICdjb250ZW50JyBpbiBpbnB1dCkge1xuICAgIHJldHVybiBlcnJvcihcbiAgICAgIGBNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIGVkaXRfZWxlbWVudC4gYCArXG4gICAgICBgTWVtb3J5IHVzZXMgYW4gYXBwZW5kLW9ubHkgYXJjaGl0ZWN0dXJlLiBgICtcbiAgICAgIGBVc2UgdGhlICdhZGRFbnRyeScgb3BlcmF0aW9uIHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGlzIG1lbW9yeS5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIElzc3VlICM2NjI6IFZhbGlkYXRlIGZpZWxkIHR5cGVzIGJlZm9yZSBhcHBseWluZyAocHJldmVudHMgc2lsZW50IGRhdGEgY29ycnVwdGlvbilcbiAgY29uc3QgdHlwZUVycm9ycyA9IHZhbGlkYXRlRmllbGRUeXBlcyhpbnB1dCwgbm9ybWFsaXplZFR5cGUpO1xuICBpZiAodHlwZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGVycm9yKGBGaWVsZCB0eXBlIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7dHlwZUVycm9ycy5tYXAoZSA9PiBgICDigKIgJHtlfWApLmpvaW4oJ1xcbicpfWApO1xuICB9XG5cbiAgY29uc3QgZ2F0ZWtlZXBlckVycm9ycyA9IGNvbGxlY3RHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKGlucHV0LCBpbnB1dC5tZXRhZGF0YSk7XG4gIGlmIChnYXRla2VlcGVyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoZm9ybWF0R2F0ZWtlZXBlclZhbGlkYXRpb25NZXNzYWdlKGdhdGVrZWVwZXJFcnJvcnMpKTtcbiAgfVxuXG4gIGNvbnN0IG92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzID0gZmluZE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzKGlucHV0KTtcbiAgaWYgKG92ZXJzaXplZERlc2NyaXB0aW9uRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZXJyb3IoXG4gICAgICBgRGVzY3JpcHRpb24gbGVuZ3RoIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7b3ZlcnNpemVkRGVzY3JpcHRpb25GaWVsZHMubWFwKGZpZWxkID0+XG4gICAgICAgIGZvcm1hdE92ZXJzaXplZERlc2NyaXB0aW9uRmllbGQoZmllbGQpXG4gICAgICApLmpvaW4oJ1xcbicpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc3RyaW5nIGZpZWxkIHZhbHVlcyB1c2luZyBpbmplY3RlZCB2YWxpZGF0b3JcbiAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVGaWVsZFZhbHVlKHZhbGlkYXRvciwgZmllbGQsIHZhbHVlKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciAnJHtmaWVsZH0nOiAke3ZhbGlkYXRpb25FcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgdXBkYXRlIG9iamVjdCwgbWFwcGluZyB0b3AtbGV2ZWwgZmllbGRzIHRvIG1ldGFkYXRhIHdoZXJlIGFwcHJvcHJpYXRlXG4gIC8vIElzc3VlICM1NjU6IFVzZSB0eXBlLXNwZWNpZmljIG1ldGFkYXRhIHByb3BlcnRpZXMgZnJvbSBhdXRob3JpdGF0aXZlIHNvdXJjZVxuICBjb25zdCBtZXRhZGF0YUZpZWxkcyA9IEtOT1dOX01FVEFEQVRBX1BST1BFUlRJRVNbbm9ybWFsaXplZFR5cGVdID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IHVucmVjb2duaXplZEZpZWxkV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNvbGxlY3Rpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYXBwbGllZEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpcHBlZEZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBGaWVsZHMgaGFuZGxlZCBieSBkZWRpY2F0ZWQgYnJhbmNoZXMgKG5vdCBtZXRhZGF0YSByb3V0aW5nKVxuICBjb25zdCBzcGVjaWFsUm91dGVGaWVsZHMgPSBuZXcgU2V0KFsnaW5zdHJ1Y3Rpb25zJywgJ2NvbnRlbnQnLCAnZWxlbWVudHMnLCAnbWV0YWRhdGEnLCAnZW50cmllcycsICd2ZXJzaW9uJ10pO1xuXG4gIC8vIENvbnRlbnQgY29udGV4dCBtYXAgc2hhcmVkIGJ5IGluc3RydWN0aW9ucyBhbmQgY29udGVudCB2YWxpZGF0aW9uIGJyYW5jaGVzXG4gIGNvbnN0IGNvbnRlbnRDb250ZXh0TWFwOiBSZWNvcmQ8c3RyaW5nLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLkFHRU5UXTogJ2FnZW50JyxcbiAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnc2tpbGwnLFxuICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICd0ZW1wbGF0ZScsXG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIC8vIFNraXAgZGFuZ2Vyb3VzIHByb3BlcnRpZXNcbiAgICBpZiAoREFOR0VST1VTX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgc2tpcHBlZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIHJlYWQtb25seSBmaWVsZHNcbiAgICBpZiAoUkVBRF9PTkxZX0ZJRUxEUy5oYXMoa2V5KSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtlZGl0RWxlbWVudF0gU2tpcHBpbmcgcmVhZC1vbmx5IGZpZWxkOiAke2tleX1gKTtcbiAgICAgIHNraXBwZWRGaWVsZHMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgYnJhbmNoIGJlbG93IGFwcGxpZXMgdGhlIGZpZWxkIOKAlCB0cmFjayBvbmNlIGF0IHRoZSBlbmRcbiAgICBsZXQgZmllbGRBcHBsaWVkID0gdHJ1ZTtcblxuICAgIC8vIE1hcCBrbm93biBtZXRhZGF0YSBmaWVsZHMgYXV0b21hdGljYWxseSAodHlwZS1zcGVjaWZpYylcbiAgICBpZiAobWV0YWRhdGFGaWVsZHMuaGFzKGtleSkgJiYgIXNwZWNpYWxSb3V0ZUZpZWxkcy5oYXMoa2V5KSkge1xuICAgICAgaWYgKCF1cGRhdGVPYmoubWV0YWRhdGEpIHtcbiAgICAgICAgdXBkYXRlT2JqLm1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICAodXBkYXRlT2JqLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdlbGVtZW50cycgJiYgbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAvLyBJc3N1ZSAjNjU4OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGVsZW1lbnRzIGlucHV0IChhcnJheSBvciBkaWN0IGZvcm1hdClcbiAgICAgIGNvbnN0IGVsZW1FcnJvciA9IGFwcGx5RW5zZW1ibGVFbGVtZW50c1VwZGF0ZSh2YWx1ZSwgZWxlbWVudCwgdXBkYXRlT2JqLCBjb2xsZWN0aW9uV2FybmluZ3MpO1xuICAgICAgaWYgKGVsZW1FcnJvcikgcmV0dXJuIGVycm9yKGVsZW1FcnJvcik7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdtZXRhZGF0YScgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVZhbHVlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIElmIG1ldGFkYXRhLmVsZW1lbnRzIGlzIHByb3ZpZGVkIGZvciBhbiBlbnNlbWJsZSwgZXh0cmFjdCBhbmQgcm91dGUgdGhyb3VnaFxuICAgICAgLy8gdGhlIGVuc2VtYmxlIGVsZW1lbnRzIGhhbmRsZXIgZm9yIHByb3BlciB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24vbWVyZ2UuXG4gICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFICYmIGhhc093blJlY29yZFByb3BlcnR5KG1ldGFWYWx1ZSwgJ2VsZW1lbnRzJykpIHtcbiAgICAgICAgY29uc3QgZWxlbUVycm9yID0gYXBwbHlFbnNlbWJsZUVsZW1lbnRzVXBkYXRlKG1ldGFWYWx1ZS5lbGVtZW50cywgZWxlbWVudCwgdXBkYXRlT2JqLCBjb2xsZWN0aW9uV2FybmluZ3MpO1xuICAgICAgICBpZiAoZWxlbUVycm9yKSByZXR1cm4gZXJyb3IoZWxlbUVycm9yKTtcblxuICAgICAgICAvLyBSZW1vdmUgZWxlbWVudHMgZnJvbSBtZXRhZGF0YSB2YWx1ZSBiZWZvcmUgZGVlcCBtZXJnZSB0byBhdm9pZCBkb3VibGUtcHJvY2Vzc2luZ1xuICAgICAgICBjb25zdCB7IGVsZW1lbnRzOiBfZXh0cmFjdGVkLCAuLi5yZXN0TWV0YWRhdGEgfSA9IG1ldGFWYWx1ZTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3RNZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHVwZGF0ZU9iai5tZXRhZGF0YSA9IGRlZXBNZXJnZShcbiAgICAgICAgICAgIHVwZGF0ZU9iai5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIHJlc3RNZXRhZGF0YSxcbiAgICAgICAgICAgIE1FUkdFX09QVElPTlNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNZXJnZSBuZXN0ZWQgbWV0YWRhdGEgd2l0aCBzZWN1cml0eSBvcHRpb25zXG4gICAgICAgIHVwZGF0ZU9iai5tZXRhZGF0YSA9IGRlZXBNZXJnZShcbiAgICAgICAgICAodXBkYXRlT2JqLm1ldGFkYXRhIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICBtZXRhVmFsdWUsXG4gICAgICAgICAgTUVSR0VfT1BUSU9OU1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaW5zdHJ1Y3Rpb25zJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJc3N1ZSAjNjAyIHJlc29sdmVkOiAnaW5zdHJ1Y3Rpb25zJyBpcyBhIGZpcnN0LWNsYXNzIGZpZWxkIChiZWhhdmlvcmFsIGRpcmVjdGl2ZXMpXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgICAgIGNvbnRlbnRDb250ZXh0OiBjb250ZW50Q29udGV4dE1hcFtub3JtYWxpemVkVHlwZV1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJztcbiAgICAgIC8vIFNldCBpbnN0cnVjdGlvbnMgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgKGFsbCB0eXBlcyBub3cgaGF2ZSB0aGlzIHByb3BlcnR5KVxuICAgICAgZWRpdGFibGVFbGVtZW50Lmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcbiAgICAgIC8vIEZvciBhZ2VudHMsIGFsc28gdXBkYXRlIGV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgICAgaWYgKCFlZGl0YWJsZUVsZW1lbnQuZXh0ZW5zaW9ucykge1xuICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC5leHRlbnNpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWRpdGFibGVFbGVtZW50LmV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSXNzdWUgIzU4NS8jNjAyOiBIYW5kbGUgY29udGVudCB1cGRhdGVzIChyZWZlcmVuY2UgbWF0ZXJpYWwpXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgICAgIGNvbnRlbnRDb250ZXh0OiBjb250ZW50Q29udGV4dE1hcFtub3JtYWxpemVkVHlwZV1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICAvLyBTZXQgY29udGVudCBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSAoYWxsIHR5cGVzIG5vdyBoYXZlIHRoaXMgcHJvcGVydHkpXG4gICAgICBlZGl0YWJsZUVsZW1lbnQuY29udGVudCA9IHNhbml0aXplZENvbnRlbnQ7XG4gICAgfSBlbHNlIGlmIChzcGVjaWFsUm91dGVGaWVsZHMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNwZWNpYWwgcm91dGUgZmllbGQg4oCUIGhhbmRsZWQgZWxzZXdoZXJlLCBza2lwXG4gICAgICBmaWVsZEFwcGxpZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSXNzdWUgIzU2NTogRmllbGQgbm90IGluIHR5cGUtc3BlY2lmaWMgbWV0YWRhdGEgc2V0IGFuZCBub3QgYSBzcGVjaWFsIHJvdXRlIOKAlFxuICAgICAgLy8gc3RpbGwgcm91dGUgdG8gdXBkYXRlT2JqIGZvciBiYWNrd2FyZCBjb21wYXQsIGJ1dCB3YXJuIHRoYXQgaXQgbWF5IG5vdCBwZXJzaXN0XG4gICAgICB1cGRhdGVPYmpba2V5XSA9IHZhbHVlO1xuICAgICAgdW5yZWNvZ25pemVkRmllbGRXYXJuaW5ncy5wdXNoKFxuICAgICAgICBgRmllbGQgJyR7a2V5fScgaXMgbm90IGEgcmVjb2duaXplZCBtZXRhZGF0YSBwcm9wZXJ0eSBmb3IgJHtnZXRFbGVtZW50VHlwZUxhYmVsKG5vcm1hbGl6ZWRUeXBlKX0g4oCUIGl0IG1heSBub3QgcGVyc2lzdCBhZnRlciBzYXZlLmBcbiAgICAgICk7XG4gICAgICBsb2dnZXIud2FybihgW2VkaXRFbGVtZW50XSBVbnJlY29nbml6ZWQgZmllbGQgJyR7a2V5fScgZm9yICR7bm9ybWFsaXplZFR5cGV9LCByb3V0aW5nIHRvIGVsZW1lbnQgb2JqZWN0YCwge1xuICAgICAgICBlbGVtZW50VHlwZTogbm9ybWFsaXplZFR5cGUsXG4gICAgICAgIGVsZW1lbnROYW1lOiBuYW1lLFxuICAgICAgICBmaWVsZDoga2V5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkQXBwbGllZCkge1xuICAgICAgYXBwbGllZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVlcCBtZXJnZSB0aGUgdXBkYXRlIGludG8gdGhlIGVsZW1lbnQgd2l0aCBzZWN1cml0eSBvcHRpb25zXG4gIGNvbnN0IGVsZW1lbnREYXRhID0gZWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBtZXJnZWREYXRhID0gZGVlcE1lcmdlKGVsZW1lbnREYXRhLCB1cGRhdGVPYmosIE1FUkdFX09QVElPTlMpO1xuXG4gIC8vIEFwcGx5IG1lcmdlZCBkYXRhIGJhY2sgdG8gZWxlbWVudFxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXJnZWREYXRhKSkge1xuICAgIGlmIChrZXkgIT09ICdtZXRhZGF0YScpIHtcbiAgICAgIChlbGVtZW50IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBtZXRhZGF0YSBzZXBhcmF0ZWx5IHRvIHByZXNlcnZlIGVsZW1lbnQgc3RydWN0dXJlXG4gIGlmIChtZXJnZWREYXRhLm1ldGFkYXRhICYmIGVsZW1lbnQubWV0YWRhdGEpIHtcbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQubWV0YWRhdGEsIG1lcmdlZERhdGEubWV0YWRhdGEpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG1lbW9yeSBlbnRyaWVzIHNwZWNpYWxseSAoZXh0cmFjdGVkIGZvciBjbGFyaXR5KVxuICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSAmJiBpbnB1dC5lbnRyaWVzICYmIEFycmF5LmlzQXJyYXkoaW5wdXQuZW50cmllcykpIHtcbiAgICBjb25zdCBtZW1vcnlSZXN1bHQgPSBoYW5kbGVNZW1vcnlFbnRyeVVwZGF0ZShpbnB1dC5lbnRyaWVzKTtcbiAgICBpZiAoIW1lbW9yeVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gZXJyb3IoYE1lbW9yeSBlbnRyeSB2YWxpZGF0aW9uIGVycm9yczpcXG4ke21lbW9yeVJlc3VsdC5tZXNzYWdlfVxcblxcblZhbGlkIGVudHJpZXMgd2VyZSBzYXZlZC5gKTtcbiAgICB9XG4gICAgKGVsZW1lbnQgYXMgYW55KS5lbnRyaWVzID0gbWVtb3J5UmVzdWx0LmVudHJpZXNNYXA7XG4gIH1cblxuICAvLyBTeW5jIGVuc2VtYmxlIGVsZW1lbnRzIGZyb20gbWV0YWRhdGEgKGV4dHJhY3RlZCBmb3IgY2xhcml0eSlcbiAgLy8gSXNzdWUgIzQ2NjogUmVzb2x2ZSBlbGVtZW50X3R5cGUgdmlhIHBvcnRmb2xpbyBsb29rdXAgYmVmb3JlIHN5bmMsIHN1cmZhY2Ugd2FybmluZ3NcbiAgbGV0IHJlc29sdXRpb25XYXJuaW5nVGV4dCA9ICcnO1xuICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgY29uc3QgcmVzb2x1dGlvblJlc3VsdCA9IGF3YWl0IHN5bmNFbnNlbWJsZUVsZW1lbnRzSWZOZWVkZWQoZWxlbWVudCwgaW5wdXQsIGNvbnRleHQpO1xuICAgIGlmIChyZXNvbHV0aW9uUmVzdWx0KSB7XG4gICAgICByZXNvbHV0aW9uV2FybmluZ1RleHQgPSBmb3JtYXRFbGVtZW50UmVzb2x1dGlvbldhcm5pbmdzKHJlc29sdXRpb25SZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpeCAjOTExOiBOb3JtYWxpemUgbWV0YWRhdGEgYWZ0ZXIgbWVyZ2UgdG8gZW5zdXJlIHN0cnVjdHVyYWwgY29uc2lzdGVuY3kuXG4gIC8vIEJhc2VFbGVtZW50IGNvbnN0cnVjdG9yIHJ1bnMgbm9ybWFsaXplTWV0YWRhdGEgb24gY3JlYXRlL2xvYWQsIGJ1dCB0aGUgZWRpdCBwYXRoXG4gIC8vIG1vZGlmaWVzIG1ldGFkYXRhIGluLXBsYWNlLiBUaGlzIGVuc3VyZXMgZXNzZW50aWFsIGRlZmF1bHRzIHN1cnZpdmUgZWRpdHMuXG4gIGlmIChlbGVtZW50Lm1ldGFkYXRhKSB7XG4gICAgZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/Pz0gJyc7XG4gICAgZWxlbWVudC5tZXRhZGF0YS50YWdzID8/PSBbXTtcbiAgICAvLyBVcGRhdGUgbW9kaWZpZWQgdGltZXN0YW1wXG4gICAgZWxlbWVudC5tZXRhZGF0YS5tb2RpZmllZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSB2ZXJzaW9uIHVwZGF0ZXNcbiAgaWYgKGlucHV0LnZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHVwZGF0ZVZlcnNpb25FeHBsaWNpdChlbGVtZW50LCBTdHJpbmcoaW5wdXQudmVyc2lvbikpO1xuICAgIGlmICghdXBkYXRlLnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiBlcnJvcih1cGRhdGUubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGF1dG9JbmNyZW1lbnRWZXJzaW9uKGVsZW1lbnQpO1xuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIGZpbGUgcGF0aCBmb3Igc2F2aW5nXG4gIGNvbnN0IGZpbGVQYXRoQ2FuZGlkYXRlID0gdHlwZW9mIChlbGVtZW50IGFzIGFueSkuZ2V0RmlsZVBhdGggPT09ICdmdW5jdGlvbidcbiAgICA/IChlbGVtZW50IGFzIGFueSkuZ2V0RmlsZVBhdGgoKVxuICAgIDogKChlbGVtZW50IGFzIGFueSkuZmlsZVBhdGggfHwgKGVsZW1lbnQgYXMgYW55KS5maWxlbmFtZSk7XG4gIGNvbnN0IGZpbGVuYW1lID0gdHlwZW9mIGZpbGVQYXRoQ2FuZGlkYXRlID09PSAnc3RyaW5nJyAmJiBmaWxlUGF0aENhbmRpZGF0ZS5sZW5ndGggPiAwXG4gICAgPyBmaWxlUGF0aENhbmRpZGF0ZVxuICAgIDogZ2V0RWxlbWVudEZpbGVuYW1lKG5vcm1hbGl6ZWRUeXBlLCBlbGVtZW50Lm1ldGFkYXRhPy5uYW1lIHx8IG5hbWUpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWFuYWdlci5zYXZlKGVsZW1lbnQsIGZpbGVuYW1lKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yKGBGYWlsZWQgdG8gc2F2ZSBlbGVtZW50OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gIH1cblxuICBjb25zdCBsYWJlbCA9IGdldEVsZW1lbnRUeXBlTGFiZWwobm9ybWFsaXplZFR5cGUpO1xuICBjb25zdCBkaXNwbGF5TmFtZSA9IGVsZW1lbnQubWV0YWRhdGE/Lm5hbWUgfHwgbmFtZTtcbiAgY29uc3QgdXBkYXRlZEZpZWxkcyA9IGFwcGxpZWRGaWVsZHMuam9pbignLCAnKTtcblxuICAvLyBJc3N1ZSAjMTY1NjogSWYgYWxsIGZpZWxkcyB3ZXJlIHNpbGVudGx5IHNraXBwZWQsIHJlcG9ydCBob25lc3RseVxuICBpZiAoYXBwbGllZEZpZWxkcy5sZW5ndGggPT09IDAgJiYgc2tpcHBlZEZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgdGV4dDogYOKaoO+4jyBObyBmaWVsZHMgYXBwbGllZCB0byAke2xhYmVsfSAnJHtkaXNwbGF5TmFtZX0nLiBgICtcbiAgICAgICAgICBgU2tpcHBlZDogJHtza2lwcGVkRmllbGRzLmpvaW4oJywgJyl9IChkYW5nZXJvdXMgb3IgcmVhZC1vbmx5IGZpZWxkcyBhcmUgbm90IGVkaXRhYmxlKS5gXG4gICAgICB9XVxuICAgIH07XG4gIH1cblxuICAvLyBJc3N1ZSAjNTY1OiBJbmNsdWRlIHdhcm5pbmdzIGZvciB1bnJlY29nbml6ZWQgZmllbGRzIGluIHJlc3BvbnNlXG4gIGxldCB1bnJlY29nbml6ZWRXYXJuaW5nVGV4dCA9ICcnO1xuICBpZiAodW5yZWNvZ25pemVkRmllbGRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGluZXMgPSBbJ+KaoO+4jyAqKlVucmVjb2duaXplZCBGaWVsZCBXYXJuaW5nczoqKiddO1xuICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiB1bnJlY29nbml6ZWRGaWVsZFdhcm5pbmdzKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICDigKIgJHt3YXJuaW5nfWApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB1bnJlY29nbml6ZWRXYXJuaW5nVGV4dCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8gSXNzdWUgIzY2MjogSW5jbHVkZSBjb2xsZWN0aW9uIG9wZXJhdGlvbiB3YXJuaW5nc1xuICBsZXQgY29sbGVjdGlvbldhcm5pbmdUZXh0ID0gJyc7XG4gIGlmIChjb2xsZWN0aW9uV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmVzID0gWyfimqDvuI8gKipDb2xsZWN0aW9uIFdhcm5pbmdzOioqJ107XG4gICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIGNvbGxlY3Rpb25XYXJuaW5ncykge1xuICAgICAgbGluZXMucHVzaChgICAg4oCiICR7d2FybmluZ31gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgY29sbGVjdGlvbldhcm5pbmdUZXh0ID0gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyBJc3N1ZSAjMTY1NjogUmVwb3J0IHNraXBwZWQgZmllbGRzIHNvIExMTXMgZG9uJ3QgYXNzdW1lIHRoZXkgd2VyZSBhcHBsaWVkXG4gIGNvbnN0IHNraXBwZWRUZXh0ID0gc2tpcHBlZEZpZWxkcy5sZW5ndGggPiAwXG4gICAgPyBgXFxu4pqg77iPIFNraXBwZWQ6ICR7c2tpcHBlZEZpZWxkcy5qb2luKCcsICcpfSAoZGFuZ2Vyb3VzIG9yIHJlYWQtb25seSlgXG4gICAgOiAnJztcblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IFt7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICB0ZXh0OiBgJHt3YXJuaW5nVGV4dH0ke3Jlc29sdXRpb25XYXJuaW5nVGV4dH0ke3VucmVjb2duaXplZFdhcm5pbmdUZXh0fSR7Y29sbGVjdGlvbldhcm5pbmdUZXh0feKchSBVcGRhdGVkICR7bGFiZWx9ICcke2Rpc3BsYXlOYW1lfScgLSBmaWVsZHM6ICR7dXBkYXRlZEZpZWxkc30ke3NraXBwZWRUZXh0fWBcbiAgICB9XVxuICB9O1xufVxuXG5mdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdGV4dDogYOKdjCAke21lc3NhZ2V9YFxuICAgIH1dXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZXJGb3JUeXBlKGNvbnRleHQ6IEVsZW1lbnRDcnVkQ29udGV4dCwgdHlwZTogRWxlbWVudFR5cGUpOiBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxhbnk+IHwgbnVsbCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgIHJldHVybiBjb250ZXh0LnBlcnNvbmFNYW5hZ2VyIGFzIEVsZW1lbnRNYW5hZ2VyV2l0aFBlcnNpc3RlbmNlPGFueT47XG4gICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgIHJldHVybiBjb250ZXh0LnNraWxsTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxTa2lsbD47XG4gICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURTpcbiAgICAgIHJldHVybiBjb250ZXh0LnRlbXBsYXRlTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxUZW1wbGF0ZT47XG4gICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDpcbiAgICAgIHJldHVybiBjb250ZXh0LmFnZW50TWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxBZ2VudD47XG4gICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6XG4gICAgICByZXR1cm4gY29udGV4dC5tZW1vcnlNYW5hZ2VyIGFzIEVsZW1lbnRNYW5hZ2VyV2l0aFBlcnNpc3RlbmNlPE1lbW9yeT47XG4gICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTpcbiAgICAgIHJldHVybiBjb250ZXh0LmVuc2VtYmxlTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlcldpdGhQZXJzaXN0ZW5jZTxhbnk+O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uRXhwbGljaXQoZWxlbWVudDogYW55LCB2ZXJzaW9uU3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3QgaXNWYWxpZCA9IC9eKFxcZCspKFxcLlxcZCspPyhcXC5cXGQrKT8oLVthLXpBLVowLTkuLV0rKT8kLy50ZXN0KHZlcnNpb25TdHJpbmcpO1xuICBpZiAoIWlzVmFsaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBtZXNzYWdlOiBgSW52YWxpZCB2ZXJzaW9uIGZvcm1hdDogJyR7dmVyc2lvblN0cmluZ30nLiBQbGVhc2UgdXNlIGZvcm1hdCBsaWtlIDEuMC4wLCAxLjAsIG9yIDFgXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgZWxlbWVudC52ZXJzaW9uID0gdmVyc2lvblN0cmluZztcbiAgICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgICAgZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uID0gdmVyc2lvblN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uJywgeyBlcnJvciB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGF1dG9JbmNyZW1lbnRWZXJzaW9uKGVsZW1lbnQ6IGFueSkge1xuICB0cnkge1xuICAgIGlmIChlbGVtZW50LnZlcnNpb24pIHtcbiAgICAgIC8vIEZpcnN0IG5vcm1hbGl6ZSB0aGUgdmVyc2lvbiB0byAzLXBhcnQgZm9ybWF0IChoYW5kbGVzIGxlZ2FjeSAyLXBhcnQgdmVyc2lvbnMpXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmVyc2lvbihTdHJpbmcoZWxlbWVudC52ZXJzaW9uKSk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9uc1xuICAgICAgY29uc3QgcHJlUmVsZWFzZU1hdGNoID0gbm9ybWFsaXplZC5tYXRjaCgvXihcXGQrXFwuXFxkK1xcLlxcZCspKC0oW2EtekEtWjAtOS4tXSspKT8kLyk7XG5cbiAgICAgIGlmIChwcmVSZWxlYXNlTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgYmFzZVZlcnNpb24gPSBwcmVSZWxlYXNlTWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IHByZVJlbGVhc2VUYWcgPSBwcmVSZWxlYXNlTWF0Y2hbM107XG5cbiAgICAgICAgaWYgKHByZVJlbGVhc2VUYWcpIHtcbiAgICAgICAgICAvLyBJbmNyZW1lbnQgcHJlLXJlbGVhc2UgdmVyc2lvbiAoZS5nLiwgXCIxLjAuMC1iZXRhLjFcIiDihpIgXCIxLjAuMC1iZXRhLjJcIilcbiAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlTnVtYmVyTWF0Y2ggPSBwcmVSZWxlYXNlVGFnLm1hdGNoKC9eKFthLXpBLVpdKylcXC4/KFxcZCspPyQvKTtcbiAgICAgICAgICBpZiAocHJlUmVsZWFzZU51bWJlck1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlVHlwZSA9IHByZVJlbGVhc2VOdW1iZXJNYXRjaFsxXTtcbiAgICAgICAgICAgIGNvbnN0IHByZVJlbGVhc2VOdW1iZXIgPSBOdW1iZXIucGFyc2VJbnQocHJlUmVsZWFzZU51bWJlck1hdGNoWzJdIHx8ICcwJykgKyAxO1xuICAgICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7YmFzZVZlcnNpb259LSR7cHJlUmVsZWFzZVR5cGV9LiR7cHJlUmVsZWFzZU51bWJlcn1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBwcmUtcmVsZWFzZSBudW1iZXIsIGJ1bXAgcGF0Y2hcbiAgICAgICAgICAgIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IGJhc2VWZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaCArIDF9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RhbmRhcmQgdmVyc2lvbiwgYnVtcCBwYXRjaCAoZS5nLiwgXCIxLjAuMFwiIOKGkiBcIjEuMC4xXCIpXG4gICAgICAgICAgY29uc3QgW21ham9yLCBtaW5vciwgcGF0Y2hdID0gYmFzZVZlcnNpb24uc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaCArIDF9YDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2hvdWxkbid0IHJlYWNoIGhlcmUgYWZ0ZXIgbm9ybWFsaXphdGlvbiwgYnV0IGZhbGxiYWNrIHRvIHNhZmUgZGVmYXVsdFxuICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjEnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyB2ZXJzaW9uLCBzdGFydCBhdCAxLjAuMFxuICAgICAgZWxlbWVudC52ZXJzaW9uID0gJzEuMC4wJztcbiAgICB9XG5cbiAgICAvLyBTeW5jIHZlcnNpb24gdG8gbWV0YWRhdGFcbiAgICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgICAgZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uID0gZWxlbWVudC52ZXJzaW9uO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBhdXRvLWluY3JlbWVudCB2ZXJzaW9uJywgeyBlcnJvciB9KTtcbiAgfVxufVxuIl19