@dollhousemcp/mcp-server 2.0.12-rc.9 → 2.0.13

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 (69) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +4 -4
  3. package/README.md.backup +5 -5
  4. package/README.npm.md +4 -4
  5. package/dist/di/Container.d.ts +14 -0
  6. package/dist/di/Container.d.ts.map +1 -1
  7. package/dist/di/Container.js +43 -26
  8. package/dist/elements/agents/AgentManager.d.ts +11 -4
  9. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  10. package/dist/elements/agents/AgentManager.js +38 -11
  11. package/dist/elements/base/BaseElementManager.d.ts +10 -0
  12. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  13. package/dist/elements/base/BaseElementManager.js +26 -1
  14. package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
  15. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  16. package/dist/elements/ensembles/EnsembleManager.js +13 -2
  17. package/dist/elements/templates/Template.d.ts +33 -1
  18. package/dist/elements/templates/Template.d.ts.map +1 -1
  19. package/dist/elements/templates/Template.js +74 -15
  20. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  21. package/dist/elements/templates/TemplateManager.js +8 -1
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.d.ts.map +1 -1
  24. package/dist/generated/version.js +3 -3
  25. package/dist/handlers/element-crud/createElement.js +2 -2
  26. package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
  27. package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
  28. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
  29. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
  30. package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
  31. package/dist/index.js +19 -13
  32. package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
  33. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  34. package/dist/portfolio/DefaultElementProvider.js +43 -1
  35. package/dist/security/contentValidator.d.ts +15 -0
  36. package/dist/security/contentValidator.d.ts.map +1 -1
  37. package/dist/security/contentValidator.js +40 -2
  38. package/dist/utils/TemplateRenderer.d.ts +9 -0
  39. package/dist/utils/TemplateRenderer.d.ts.map +1 -1
  40. package/dist/utils/TemplateRenderer.js +21 -1
  41. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  42. package/dist/web/console/IngestRoutes.js +193 -59
  43. package/dist/web/console/SessionNames.d.ts +18 -5
  44. package/dist/web/console/SessionNames.d.ts.map +1 -1
  45. package/dist/web/console/SessionNames.js +63 -8
  46. package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
  47. package/dist/web/console/StaleProcessRecovery.js +5 -4
  48. package/dist/web/console/UnifiedConsole.js +3 -3
  49. package/dist/web/console/consoleToken.js +3 -3
  50. package/dist/web/portDiscovery.d.ts +1 -1
  51. package/dist/web/portDiscovery.d.ts.map +1 -1
  52. package/dist/web/portDiscovery.js +2 -2
  53. package/dist/web/public/app.js +65 -11
  54. package/dist/web/public/index.html +2 -0
  55. package/dist/web/public/logs.js +24 -2
  56. package/dist/web/public/metrics.js +22 -4
  57. package/dist/web/public/sessions.js +55 -8
  58. package/dist/web/public/setup.js +11 -2
  59. package/dist/web/public/styles.css +12 -0
  60. package/dist/web/routes/permissionRoutes.js +2 -2
  61. package/dist/web/routes/setupRoutes.d.ts +67 -1
  62. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  63. package/dist/web/routes/setupRoutes.js +298 -6
  64. package/dist/web/routes.d.ts.map +1 -1
  65. package/dist/web/routes.js +4 -2
  66. package/dist/web/server.d.ts.map +1 -1
  67. package/dist/web/server.js +14 -5
  68. package/package.json +5 -3
  69. package/server.json +2 -2
@@ -669,6 +669,10 @@ export class EnsembleManager extends BaseElementManager {
669
669
  * @returns Activation result with success status and message
670
670
  */
671
671
  async activateEnsemble(identifier) {
672
+ // Evict stale cache before lookup so external file edits are picked up (#1895).
673
+ // findByName() hits the LRU cache first and never calls list(), so without this
674
+ // the scan cooldown prevents mtime-based eviction from running.
675
+ await this.scanAndEvict();
672
676
  // PERFORMANCE FIX: Use findByName() instead of list()
673
677
  const ensemble = await this.findByName(identifier);
674
678
  if (!ensemble) {
@@ -706,6 +710,12 @@ export class EnsembleManager extends BaseElementManager {
706
710
  * @returns Deactivation result with success status and message
707
711
  */
708
712
  async deactivateEnsemble(identifier) {
713
+ // No scanAndEvict() here — intentional. Deactivation only needs the ensemble's
714
+ // name (to remove from activeEnsembleNames) and calls deactivate() which sets
715
+ // a status flag. It does not consume the elements list, so stale cached element
716
+ // data has no effect on correctness. Compare with activateEnsemble(), which
717
+ // ingests the full element list to orchestrate sub-element loading and must
718
+ // therefore see the latest on-disk definition. (#1895)
709
719
  // PERFORMANCE FIX: Use findByName() instead of list()
710
720
  const ensemble = await this.findByName(identifier);
711
721
  if (!ensemble) {
@@ -727,7 +737,8 @@ export class EnsembleManager extends BaseElementManager {
727
737
  return {
728
738
  success: true,
729
739
  // CONSISTENCY FIX: Use standardized success message format
730
- message: ElementMessages.deactivated(ElementType.ENSEMBLE, ensemble.metadata.name)
740
+ message: ElementMessages.deactivated(ElementType.ENSEMBLE, ensemble.metadata.name),
741
+ ensemble
731
742
  };
732
743
  }
733
744
  /**
@@ -815,4 +826,4 @@ export class EnsembleManager extends BaseElementManager {
815
826
  }
816
827
  }
817
828
  }
818
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxD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QUUsQ0FDakUsQ0FBQztnQkFFRixlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSw2Q0FBNkM7b0JBQ3JELE9BQU8sRUFBRSxXQUFXLE9BQU8sbUNBQW1DO29CQUM5RCxjQUFjLEVBQUU7d0JBQ2QsWUFBWSxFQUFFLE9BQU87d0JBQ3JCLFdBQVcsRUFBRSxPQUFPO3dCQUNwQixVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQ2xDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFakUsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsNkNBQTZDO2dCQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTthQUNyRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnNlbWJsZU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIEVuc2VtYmxlIGVsZW1lbnRzXG4gKlxuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBlbnNlbWJsZXMgaW1wbGVtZW50aW5nIElFbGVtZW50XG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBFeHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlciBmb3IgdW5pZmllZCBlbGVtZW50IG1hbmFnZW1lbnRcbiAqIC0gRm9sbG93cyB0ZW1wbGF0ZSBtZXRob2QgcGF0dGVybiAocGFyc2VNZXRhZGF0YSwgY3JlYXRlRWxlbWVudCBob29rcylcbiAqIC0gUHVyZSBtYW5hZ2VyIGxheWVyIC0gZGVsZWdhdGVzIGJ1c2luZXNzIGxvZ2ljIHRvIEVuc2VtYmxlIGNsYXNzXG4gKiAtIFVzZXMgREkgZm9yIGRlcGVuZGVuY2llcyAoUG9ydGZvbGlvTWFuYWdlciwgRmlsZUxvY2tNYW5hZ2VyKVxuICpcbiAqIFNFQ1VSSVRZOlxuICogLSBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICogLSBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAtIElucHV0IHNhbml0aXphdGlvbiBmb3IgYWxsIHVzZXIgZGF0YVxuICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbHNcbiAqIC0gU2VjdXJlWWFtbFBhcnNlciBmb3Igc2FmZSBZQU1MIHBhcnNpbmdcbiAqL1xuXG5pbXBvcnQgeyBFbnNlbWJsZSwgRW5zZW1ibGVNZXRhZGF0YSwgRW5zZW1ibGVFbGVtZW50IH0gZnJvbSAnLi9FbnNlbWJsZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IHRvU2luZ3VsYXJMYWJlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBFTlNFTUJMRV9ERUZBVUxUUyxcbiAgRU5TRU1CTEVfTElNSVRTLFxuICBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMsXG4gIEVOU0VNQkxFX0VSUk9SUyxcbiAgQUNUSVZBVElPTl9TVFJBVEVHSUVTLFxuICBDT05GTElDVF9TVFJBVEVHSUVTLFxuICBFTEVNRU5UX1JPTEVTLFxuICBBQ1RJVkFUSU9OX01PREVTXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdGlvblN0cmF0ZWd5LCBDb25mbGljdFJlc29sdXRpb25TdHJhdGVneSwgRWxlbWVudFJvbGUsIEFjdGl2YXRpb25Nb2RlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgVkFMSURBVElPTl9QQVRURVJOUywgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxuLy8gSXNzdWUgIzgzOiBDZW50cmFsaXplZCBhY3RpdmUgZWxlbWVudCBsaW1pdHMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMpXG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcsIGdldE1heEFjdGl2ZUxpbWl0IH0gZnJvbSAnLi4vLi4vY29uZmlnL2FjdGl2ZS1lbGVtZW50LWxpbWl0cy5qcyc7XG5cbi8vIElzc3VlICM0NjY6IFNoYXJlZCBlbGVtZW50IHR5cGUgcmVzb2x2ZXIg4oCUIHJlLWV4cG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5pbXBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5leHBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzLCB0eXBlIEVsZW1lbnRNYW5hZ2Vyc0ZvclJlc29sdXRpb24gfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcblxuLyoqIEBkZXByZWNhdGVkIFVzZSByZXNvbHZlRWxlbWVudFR5cGVzIGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVuc2VtYmxlRWxlbWVudFR5cGVzID0gcmVzb2x2ZUVsZW1lbnRUeXBlcztcblxuLyoqXG4gKiBFbnNlbWJsZU1hbmFnZXIgLSBNYW5hZ2VzIGVuc2VtYmxlIGVsZW1lbnQgbGlmZWN5Y2xlXG4gKlxuICogRXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXIgdG8gcHJvdmlkZSBlbnNlbWJsZS1zcGVjaWZpYyBvcGVyYXRpb25zOlxuICogLSBZQU1MIHBhcnNpbmcgd2l0aCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSBzdXBwb3J0XG4gKiAtIEVuc2VtYmxlIGNyZWF0aW9uIGFuZCB2YWxpZGF0aW9uXG4gKiAtIEVsZW1lbnQgcmVmZXJlbmNlIG1hbmFnZW1lbnRcbiAqIC0gSW1wb3J0L2V4cG9ydCBpbiBtdWx0aXBsZSBmb3JtYXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnNlbWJsZU1hbmFnZXIgZXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXI8RW5zZW1ibGU+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnNlbWJsZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIGFjdGl2ZUVuc2VtYmxlTmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBwb3J0Zm9saW9NYW5hZ2VyLCBmaWxlTG9ja01hbmFnZXIsIHsgZmlsZVdhdGNoU2VydmljZSwgbWVtb3J5QnVkZ2V0LCBiYWNrdXBTZXJ2aWNlIH0sIGZpbGVPcGVyYXRpb25zU2VydmljZSwgdmFsaWRhdGlvblJlZ2lzdHJ5KTtcbiAgICB0aGlzLmVuc2VtYmxlc0RpciA9IHRoaXMuZWxlbWVudERpcjtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZSA9IHNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZW5zZW1ibGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlclxuICAgKlxuICAgKiBOQU1JTkcgQ09OVkVOVElPTiBTVVBQT1JUOlxuICAgKiAtIFR5cGVTY3JpcHQgaW50ZXJmYWNlcyB1c2UgY2FtZWxDYXNlIChhY3RpdmF0aW9uU3RyYXRlZ3ksIGNvbmZsaWN0UmVzb2x1dGlvbilcbiAgICogLSBZQU1MIGZpbGVzIGNhbiB1c2Ugc25ha2VfY2FzZSAoYWN0aXZhdGlvbl9zdHJhdGVneSwgY29uZmxpY3RfcmVzb2x1dGlvbilcbiAgICogLSBUaGlzIG1ldGhvZCBtYXBzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSBmb3IgdXNlciBjb252ZW5pZW5jZVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFJhdyBZQU1MIGRhdGEgZnJvbSBmcm9udG1hdHRlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgRW5zZW1ibGVNZXRhZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxFbnNlbWJsZU1ldGFkYXRhPiB7XG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIHZhbGlkYXRlTWV0YWRhdGFGaWVsZCBmb3IgZmllbGQtYXdhcmUgZXJyb3IgbWVzc2FnZXMgKCMzNjUpXG4gICAgY29uc3QgbmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCduYW1lJywgZGF0YS5uYW1lLCB7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSFxuICAgIH0pO1xuICAgIGlmICghbmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke25hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcblxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBtZXRhZGF0YSBtdXN0IGluY2x1ZGUgYSBuYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIHZhbGlkYXRlTWV0YWRhdGFGaWVsZCBmb3IgZmllbGQtYXdhcmUgZXJyb3IgbWVzc2FnZXMgKCMzNjUpXG4gICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlTWV0YWRhdGFGaWVsZCgnZGVzY3JpcHRpb24nLCBkYXRhLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgcGF0dGVybjogVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0RFU0NSSVBUSU9OXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZGVzY1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBkZXNjcmlwdGlvbiA9IGRlc2NSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBhY3RpdmF0aW9uIHN0cmF0ZWd5IChzdXBwb3J0IGJvdGggc25ha2VfY2FzZSBhbmQgY2FtZWxDYXNlKVxuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneVJhdyA9IGRhdGEuYWN0aXZhdGlvbl9zdHJhdGVneSB8fCBkYXRhLmFjdGl2YXRpb25TdHJhdGVneSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5BQ1RJVkFUSU9OX1NUUkFURUdZO1xuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhhY3RpdmF0aW9uU3RyYXRlZ3lSYXcpLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWFjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWN0aXZhdGlvbiBzdHJhdGVneTogJHthY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3kgPSBhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghQUNUSVZBVElPTl9TVFJBVEVHSUVTLmluY2x1ZGVzKGFjdGl2YXRpb25TdHJhdGVneSBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfU1RSQVRFR1l9OiAke2FjdGl2YXRpb25TdHJhdGVneX1gKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbmZsaWN0IHJlc29sdXRpb24gc3RyYXRlZ3lcbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb25SYXcgPSBkYXRhLmNvbmZsaWN0X3Jlc29sdXRpb24gfHwgZGF0YS5jb25mbGljdFJlc29sdXRpb24gfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09ORkxJQ1RfUkVTT0xVVElPTjtcbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoY29uZmxpY3RSZXNvbHV0aW9uUmF3KSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFjb25mbGljdFJlc29sdXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmZsaWN0IHJlc29sdXRpb24gc3RyYXRlZ3k6ICR7Y29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uID0gY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIUNPTkZMSUNUX1NUUkFURUdJRVMuaW5jbHVkZXMoY29uZmxpY3RSZXNvbHV0aW9uIGFzIGFueSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9DT05GTElDVF9SRVNPTFVUSU9OfTogJHtjb25mbGljdFJlc29sdXRpb259YCk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb250ZXh0IHNoYXJpbmcgbW9kZVxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nUmF3ID0gZGF0YS5jb250ZXh0X3NoYXJpbmcgfHwgZGF0YS5jb250ZXh0U2hhcmluZyB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05URVhUX1NIQVJJTkc7XG5cbiAgICAvLyBGSVg6IEhhbmRsZSBib29sZWFuIHZhbHVlcyAodHJ1ZSAtPiAnZnVsbCcsIGZhbHNlIC0+ICdub25lJylcbiAgICBsZXQgY29udGV4dFNoYXJpbmdWYWx1ZTogc3RyaW5nO1xuICAgIGlmICh0eXBlb2YgY29udGV4dFNoYXJpbmdSYXcgPT09ICdib29sZWFuJykge1xuICAgICAgY29udGV4dFNoYXJpbmdWYWx1ZSA9IGNvbnRleHRTaGFyaW5nUmF3ID8gJ2Z1bGwnIDogJ25vbmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0U2hhcmluZ1ZhbHVlID0gU3RyaW5nKGNvbnRleHRTaGFyaW5nUmF3KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0U2hhcmluZ1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KGNvbnRleHRTaGFyaW5nVmFsdWUsIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghY29udGV4dFNoYXJpbmdSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRleHQgc2hhcmluZyBtb2RlOiAke2NvbnRleHRTaGFyaW5nUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dFNoYXJpbmcgPSBjb250ZXh0U2hhcmluZ1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFbJ25vbmUnLCAnc2VsZWN0aXZlJywgJ2Z1bGwnXS5pbmNsdWRlcyhjb250ZXh0U2hhcmluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IHNoYXJpbmcgbW9kZTogJHtjb250ZXh0U2hhcmluZ31gKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSByZXNvdXJjZSBsaW1pdHMgKHN1cHBvcnQgc25ha2VfY2FzZSlcbiAgICBjb25zdCByZXNvdXJjZUxpbWl0c1JhdyA9IGRhdGEucmVzb3VyY2VfbGltaXRzIHx8IGRhdGEucmVzb3VyY2VMaW1pdHM7XG4gICAgbGV0IHJlc291cmNlTGltaXRzO1xuXG4gICAgaWYgKHJlc291cmNlTGltaXRzUmF3KSB7XG4gICAgICByZXNvdXJjZUxpbWl0cyA9IHtcbiAgICAgICAgbWF4QWN0aXZlRWxlbWVudHM6IHJlc291cmNlTGltaXRzUmF3Lm1heF9hY3RpdmVfZWxlbWVudHMgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4QWN0aXZlRWxlbWVudHMgfHwgRU5TRU1CTEVfTElNSVRTLk1BWF9FTEVNRU5UUyxcbiAgICAgICAgbWF4TWVtb3J5TWI6IHJlc291cmNlTGltaXRzUmF3Lm1heF9tZW1vcnlfbWIgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4TWVtb3J5TWIsXG4gICAgICAgIG1heEV4ZWN1dGlvblRpbWVNczogcmVzb3VyY2VMaW1pdHNSYXcubWF4X2V4ZWN1dGlvbl90aW1lX21zIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heEV4ZWN1dGlvblRpbWVNcyB8fCBFTlNFTUJMRV9MSU1JVFMuTUFYX0FDVElWQVRJT05fVElNRVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBlbGVtZW50cyBhcnJheVxuICAgIGNvbnN0IGVsZW1lbnRzUmF3ID0gZGF0YS5lbGVtZW50cyB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHNSYXcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIGVsZW1lbnRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10gPSBlbGVtZW50c1Jhdy5tYXAoKGVsZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IG5hbWVcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X25hbWUgKG5ldyBzdGFuZGFyZCkgYW5kIG5hbWUgKGxlZ2FjeSkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCByYXdFbGVtZW50TmFtZSA9IGVsZW0uZWxlbWVudF9uYW1lIHx8IGVsZW0ubmFtZTtcbiAgICAgIGlmICghcmF3RWxlbWVudE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IG11c3QgaGF2ZSBlbGVtZW50X25hbWUgKG9yIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KWApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICduYW1lJyBmaWVsZFxuICAgICAgaWYgKGVsZW0ubmFtZSAmJiAhZWxlbS5lbGVtZW50X25hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICduYW1lJyBmaWVsZC4gVXNlICdlbGVtZW50X25hbWUnIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50TmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcocmF3RWxlbWVudE5hbWUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCwgYWxsb3dTcGFjZXM6IHRydWUgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudE5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBuYW1lIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnROYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgdHlwZVxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfdHlwZSAobmV3IHN0YW5kYXJkKSBhbmQgdHlwZSAobGVnYWN5KSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlIHx8ICdza2lsbCc7XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ3R5cGUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS50eXBlICYmICFlbGVtLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ3R5cGUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfdHlwZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhyYXdFbGVtZW50VHlwZSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50VHlwZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudFR5cGVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCByb2xlXG4gICAgICBjb25zdCBlbGVtZW50Um9sZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcoZWxlbS5yb2xlIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkVMRU1FTlRfUk9MRSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudFJvbGVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCByb2xlIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRSb2xlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRSb2xlID0gZWxlbWVudFJvbGVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgICBpZiAoIUVMRU1FTlRfUk9MRVMuaW5jbHVkZXMoZWxlbWVudFJvbGUgYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfRUxFTUVOVF9ST0xFfTogJHtlbGVtZW50Um9sZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IGFjdGl2YXRpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRBY3RpdmF0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhlbGVtLmFjdGl2YXRpb24gfHwgJ2Fsd2F5cycpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgYWN0aXZhdGlvbiBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50QWN0aXZhdGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50QWN0aXZhdGlvbiA9IGVsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgICAgaWYgKCFBQ1RJVkFUSU9OX01PREVTLmluY2x1ZGVzKGVsZW1lbnRBY3RpdmF0aW9uIGFzIGFueSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0FDVElWQVRJT05fTU9ERX06ICR7ZWxlbWVudEFjdGl2YXRpb259YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHByaW9yaXR5ICgwLTEwMCwgZGVmYXVsdCA1MClcbiAgICAgIGxldCBwcmlvcml0eSA9IGVsZW0ucHJpb3JpdHkgPz8gRU5TRU1CTEVfREVGQVVMVFMuUFJJT1JJVFk7XG4gICAgICBpZiAodHlwZW9mIHByaW9yaXR5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBwcmlvcml0eSA9IHBhcnNlSW50KHByaW9yaXR5LCAxMCk7XG4gICAgICB9XG4gICAgICBwcmlvcml0eSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgcHJpb3JpdHkpKTtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb25kaXRpb24gKGlmIGNvbmRpdGlvbmFsIGFjdGl2YXRpb24pXG4gICAgICAvLyBDb25kaXRpb25zIG5lZWQgc3BlY2lhbCBoYW5kbGluZyAtIHRoZXkgY2FuIGNvbnRhaW4gb3BlcmF0b3JzIGxpa2UgPT0sICE9LCAmJiwgfHxcbiAgICAgIC8vIFNvIHdlIHVzZSBhIGN1c3RvbSBwYXR0ZXJuIHRoYXQgYWxsb3dzIHRoZXNlIGNoYXJhY3RlcnNcbiAgICAgIGxldCBjb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtZW50QWN0aXZhdGlvbiA9PT0gJ2NvbmRpdGlvbmFsJyAmJiBlbGVtLmNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgICBTdHJpbmcoZWxlbS5jb25kaXRpb24pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heExlbmd0aDogRU5TRU1CTEVfTElNSVRTLk1BWF9DT05ESVRJT05fTEVOR1RILFxuICAgICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgICAgICBjdXN0b21QYXR0ZXJuOiAvXlthLXpBLVowLTlcXHNcXC1fLj0hJnw8PigpXSskLyAgLy8gQWxsb3cgY29tcGFyaXNvbi9sb2dpY2FsIG9wZXJhdG9yc1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb25kaXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25kaXRpb24gYXQgaW5kZXggJHtpbmRleH06ICR7Y29uZGl0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZGVwZW5kZW5jaWVzXG4gICAgICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtLmRlcGVuZGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGVsZW0uZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGVsZW0uZGVwZW5kZW5jaWVzLnNsaWNlKDAsIEVOU0VNQkxFX0xJTUlUUy5NQVhfREVQRU5ERU5DSUVTKSkge1xuICAgICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhkZXApLCB7XG4gICAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghZGVwUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXBlbmRlbmN5IFwiJHtkZXB9XCIgYXQgaW5kZXggJHtpbmRleH06ICR7ZGVwUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsaWRhdGVkRGVwZW5kZW5jaWVzLnB1c2goZGVwUmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICAgIH1cbiAgICAgICAgZGVwZW5kZW5jaWVzID0gdmFsaWRhdGVkRGVwZW5kZW5jaWVzO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHB1cnBvc2VcbiAgICAgIGxldCBwdXJwb3NlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbS5wdXJwb3NlKSB7XG4gICAgICAgIGNvbnN0IHB1cnBvc2VSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoZWxlbS5wdXJwb3NlKSwge1xuICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nICAvLyBBbGxvdyBmdWxsIGRlc2NyaXB0aW9uIHB1bmN0dWF0aW9uIChjb21tYXMsIGVtLWRhc2hlcywgZXRjLilcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHVycG9zZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1cnBvc2UgYXQgaW5kZXggJHtpbmRleH06ICR7cHVycG9zZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcHVycG9zZSA9IHB1cnBvc2VSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHJvbGU6IGVsZW1lbnRSb2xlIGFzIEVsZW1lbnRSb2xlLFxuICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbWVudEFjdGl2YXRpb24gYXMgQWN0aXZhdGlvbk1vZGUsXG4gICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBwdXJwb3NlXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgZWxlbWVudCBjb3VudFxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiBFTlNFTUJMRV9MSU1JVFMuTUFYX0VMRU1FTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRU5TRU1CTEVfRVJST1JTLlRPT19NQU5ZX0VMRU1FTlRTKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBuZXN0aW5nIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBhbGxvd05lc3RlZCA9IGRhdGEuYWxsb3dfbmVzdGVkICE9PSB1bmRlZmluZWQgP1xuICAgICAgQm9vbGVhbihkYXRhLmFsbG93X25lc3RlZCkgOlxuICAgICAgKGRhdGEuYWxsb3dOZXN0ZWQgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4oZGF0YS5hbGxvd05lc3RlZCkgOiBFTlNFTUJMRV9ERUZBVUxUUy5BTExPV19ORVNURUQpO1xuXG4gICAgY29uc3QgbWF4TmVzdGluZ0RlcHRoID0gZGF0YS5tYXhfbmVzdGluZ19kZXB0aCB8fCBkYXRhLm1heE5lc3RpbmdEZXB0aCB8fCBFTlNFTUJMRV9ERUZBVUxUUy5NQVhfTkVTVElOR19ERVBUSDtcblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgdGFncyBhcnJheVxuICAgIGxldCB0YWdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEudGFncykpIHtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRhdGEudGFncykge1xuICAgICAgICBjb25zdCB0YWdSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcodGFnKSwge1xuICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9UQUdfTEVOR1RILFxuICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRhZ1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhZyBcIiR7dGFnfVwiOiAke3RhZ1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGFncy5wdXNoKHRhZ1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIG1ldGFkYXRhIG9iamVjdCAoY2FtZWxDYXNlKVxuICAgIGNvbnN0IG1ldGFkYXRhOiBFbnNlbWJsZU1ldGFkYXRhID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IGRhdGEuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3MsXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IGFjdGl2YXRpb25TdHJhdGVneSBhcyBBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IGNvbmZsaWN0UmVzb2x1dGlvbiBhcyBDb25mbGljdFJlc29sdXRpb25TdHJhdGVneSxcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBjb250ZXh0U2hhcmluZyBhcyAnbm9uZScgfCAnc2VsZWN0aXZlJyB8ICdmdWxsJyxcbiAgICAgIHJlc291cmNlTGltaXRzLFxuICAgICAgYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGgsXG4gICAgICBlbGVtZW50cyxcbiAgICAgIGdhdGVrZWVwZXI6IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeShkYXRhLmdhdGVrZWVwZXIsIG5hbWUsICdlbnNlbWJsZScpLCAgLy8gSXNzdWUgIzUyNFxuICAgIH07XG5cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEVuc2VtYmxlIGluc3RhbmNlIGZyb20gcGFyc2VkIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFZhbGlkYXRlZCBlbnNlbWJsZSBtZXRhZGF0YVxuICAgKiBAcGFyYW0gY29udGVudCAtIE1hcmtkb3duIGNvbnRlbnQgKGVuc2VtYmxlIGluc3RydWN0aW9ucy9kb2N1bWVudGF0aW9uKVxuICAgKiBAcmV0dXJucyBOZXcgRW5zZW1ibGUgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBFbnNlbWJsZU1ldGFkYXRhLCBfY29udGVudDogc3RyaW5nKTogRW5zZW1ibGUge1xuICAgIGRlbGV0ZSAobWV0YWRhdGEgYXMgYW55KS5mb3JtYXRfdmVyc2lvbjsgIC8vIEZpeCAjOTEyOiBTdHJpcCBtYXJrZXIgZnJvbSBydW50aW1lIG1ldGFkYXRhXG4gICAgY29uc3QgZW5zZW1ibGUgPSBuZXcgRW5zZW1ibGUobWV0YWRhdGEsIG1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgLy8gRXh0cmFjdCBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSBpZiBwcmVzZW50ICh2MiBkdWFsLWZpZWxkKVxuICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGVuc2VtYmxlLmluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBlbnNlbWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYW4gZW5zZW1ibGUgdG8gZmlsZSBjb250ZW50XG4gICAqXG4gICAqIEZvcm1hdDogTWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gICAqIC0gRnJvbnRtYXR0ZXI6IEVuc2VtYmxlIG1ldGFkYXRhICsgZWxlbWVudCByZWZlcmVuY2VzXG4gICAqIC0gQ29udGVudDogSW5zdHJ1Y3Rpb25zL2RvY3VtZW50YXRpb24gZm9yIHRoZSBlbnNlbWJsZVxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJucyBGaWxlIGNvbnRlbnQgKG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBFbnNlbWJsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50Lm1ldGFkYXRhO1xuXG4gICAgLy8gQnVpbGQgZnJvbnRtYXR0ZXIgZGF0YSAodXNpbmcgY2FtZWxDYXNlKVxuICAgIGNvbnN0IGZyb250bWF0dGVyOiBhbnkgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgdHlwZTogdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLkVOU0VNQkxFKSxcbiAgICAgIGZvcm1hdF92ZXJzaW9uOiAndjInLCAgLy8gRml4ICM5MTI6IEV4cGxpY2l0IGZvcm1hdCBtYXJrZXJcbiAgICAgIHVuaXF1ZV9pZDogZWxlbWVudC5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IG1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhLmNyZWF0ZWQsXG4gICAgICBtb2RpZmllZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFnczogbWV0YWRhdGEudGFncyB8fCBbXSxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogbWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBtZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb24sXG4gICAgICBjb250ZXh0U2hhcmluZzogbWV0YWRhdGEuY29udGV4dFNoYXJpbmcsXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aFxuICAgIH07XG5cbiAgICAvLyB2Mi4wIGR1YWwtZmllbGQ6IHdyaXRlIGluc3RydWN0aW9ucyB0byBZQU1MIGZyb250bWF0dGVyIGlmIHByZXNlbnRcbiAgICBpZiAoZWxlbWVudC5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGZyb250bWF0dGVyLmluc3RydWN0aW9ucyA9IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cblxuICAgIC8vIEluY2x1ZGUgcmVzb3VyY2UgbGltaXRzIGlmIHNwZWNpZmllZFxuICAgIGlmIChtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cykge1xuICAgICAgZnJvbnRtYXR0ZXIucmVzb3VyY2VMaW1pdHMgPSBtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNTI0IOKAlCBHYXRla2VlcGVyIHBvbGljeSAoYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIGZyb250bWF0dGVyLmdhdGVrZWVwZXIgPSBtZXRhZGF0YS5nYXRla2VlcGVyO1xuICAgIH1cblxuICAgIC8vIEluY2x1ZGUgZWxlbWVudHMgYXJyYXkgKHVzaW5nIGVsZW1lbnRfbmFtZS9lbGVtZW50X3R5cGUgZm9yIEFQSSBjb25zaXN0ZW5jeSlcbiAgICBmcm9udG1hdHRlci5lbGVtZW50cyA9IG1ldGFkYXRhLmVsZW1lbnRzLm1hcChlbGVtID0+IHtcbiAgICAgIGNvbnN0IGVsZW1EYXRhOiBhbnkgPSB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbS5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbS5lbGVtZW50X3R5cGUsXG4gICAgICAgIHJvbGU6IGVsZW0ucm9sZSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW0ucHJpb3JpdHksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW0uYWN0aXZhdGlvblxuICAgICAgfTtcblxuICAgICAgaWYgKGVsZW0uY29uZGl0aW9uKSB7XG4gICAgICAgIGVsZW1EYXRhLmNvbmRpdGlvbiA9IGVsZW0uY29uZGl0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbS5kZXBlbmRlbmNpZXMgJiYgZWxlbS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBlbGVtRGF0YS5kZXBlbmRlbmNpZXMgPSBlbGVtLmRlcGVuZGVuY2llcztcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW0ucHVycG9zZSkge1xuICAgICAgICBlbGVtRGF0YS5wdXJwb3NlID0gZWxlbS5wdXJwb3NlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWxlbURhdGE7XG4gICAgfSk7XG5cbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIGNyZWF0aW9uXG4gICAgLy8gVXNlIENPUkVfU0NIRU1BIHRvIHN1cHBvcnQgbnVtYmVycyAocHJpb3JpdHkpIGFuZCBib29sZWFucyAoYWxsb3dOZXN0ZWQpXG4gICAgY29uc3QgYm9keSA9IGVsZW1lbnQuY29udGVudCB8fCB0aGlzLmJ1aWxkRGVmYXVsdEJvZHkoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuY3JlYXRlRnJvbnRtYXR0ZXIoZnJvbnRtYXR0ZXIsIGJvZHksIHtcbiAgICAgIG1ldGhvZDogJ21hbnVhbCcsXG4gICAgICBzY2hlbWE6ICdqc29uJywgIC8vIEZpeCAjOTE0OiBzdGFuZGFyZGl6ZSBvbiBKU09OIHNjaGVtYSBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAgICBjbGVhbk1ldGFkYXRhOiB0cnVlLCAgLy8gRml4ICM5MTM6IHN0YW5kYXJkaXplIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsXG4gICAgICBzb3J0S2V5czogdHJ1ZSxcbiAgICAgIGxpbmVXaWR0aDogMTAwLFxuICAgICAgc2tpcEludmFsaWQ6IGZhbHNlICAvLyBEb24ndCBza2lwIGludmFsaWQgLSB3ZSB3YW50IHRvIGNhdGNoIGVycm9yc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRCb2R5KGVsZW1lbnQ6IEVuc2VtYmxlKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGVsZW1lbnQubWV0YWRhdGEubmFtZSA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGVsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGluZXMucHVzaChgIyAke25hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBsaW5lcy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWxlIGV4dGVuc2lvbiBmb3IgZW5zZW1ibGUgZmlsZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy5tZCc7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGVuc2VtYmxlIGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqXG4gICAqIFN1cHBvcnRzOlxuICAgKiAtIFlBTUw6IEZyb250bWF0dGVyLXN0eWxlIG1ldGFkYXRhIHdpdGggb3B0aW9uYWwgbWFya2Rvd24gY29udGVudFxuICAgKiAtIEpTT046IERpcmVjdCBlbnNlbWJsZSBzdHJ1Y3R1cmVcbiAgICogLSBNYXJrZG93bjogWUFNTCBmcm9udG1hdHRlciArIG1hcmtkb3duIGNvbnRlbnRcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTdHJpbmcgY29udGFpbmluZyBlbnNlbWJsZSBkYXRhXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBGb3JtYXQgb2YgdGhlIGRhdGEgKGpzb24sIHlhbWwsIG1hcmtkb3duKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBpbXBvcnRlZCBFbnNlbWJsZVxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgaW1wb3J0RWxlbWVudChcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJ1xuICApOiBQcm9taXNlPEVuc2VtYmxlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXJzZWQ6IGFueTtcblxuICAgICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHBhcnNlZCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VKc29uKGRhdGEsIHtcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQYXJzZSBZQU1ML01hcmtkb3duIHVzaW5nIFNlcmlhbGl6YXRpb25TZXJ2aWNlXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IDUwMDAwLCAvLyA1MEtCIGxpbWl0IGZvciBlbnNlbWJsZSBmaWxlc1xuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFyc2VkID0gcmVzdWx0LmRhdGE7XG4gICAgICAgIC8vIENvbnRlbnQgaXMgcGFyc2VkIGJ1dCBub3QgdXNlZCBpbiBlbnNlbWJsZSBjcmVhdGlvblxuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkKTtcblxuICAgICAgLy8gQ3JlYXRlIGVuc2VtYmxlXG4gICAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShtZXRhZGF0YSwgbWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgaW1wb3J0XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5JTVBPUlRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBJbXBvcnRlZCBlbnNlbWJsZTogJHttZXRhZGF0YS5uYW1lfSB3aXRoICR7bWV0YWRhdGEuZWxlbWVudHMubGVuZ3RofSBlbGVtZW50c2BcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZW5zZW1ibGU7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuSU1QT1JURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGltcG9ydCBlbnNlbWJsZTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGltcG9ydCBlbnNlbWJsZTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGVuc2VtYmxlIHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIGV4cG9ydFxuICAgKiBAcGFyYW0gZm9ybWF0IC0gT3V0cHV0IGZvcm1hdCAoanNvbiwgeWFtbCwgbWFya2Rvd24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHNlcmlhbGl6ZWQgc3RyaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleHBvcnRFbGVtZW50KFxuICAgIGVsZW1lbnQ6IEVuc2VtYmxlLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bidcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIC8vIEZvciBZQU1MIGFuZCBNYXJrZG93biwgdXNlIHRoZSBzYW1lIGZvcm1hdCAoZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVuc2VtYmxlIHdpdGggbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gUGFydGlhbCBtZXRhZGF0YSBmb3IgdGhlIGVuc2VtYmxlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG5ldyBFbnNlbWJsZSBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEVuc2VtYmxlTWV0YWRhdGE+ICYgeyBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmcgfSk6IFByb21pc2U8RW5zZW1ibGU+IHtcbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBpbnB1dCB2YWxpZGF0aW9uXG4gICAgLy8gTm90ZTogZWxlbWVudF90eXBlIHJlc29sdXRpb24gaXMgaGFuZGxlZCBieSB0aGUgaGFuZGxlciBsYXllciBiZWZvcmUgY2FsbGluZyBjcmVhdGUoKS5cbiAgICAvLyBFbGVtZW50cyBzaG91bGQgYWxyZWFkeSBoYXZlIGVsZW1lbnRfdHlwZSBzZXQgd2hlbiB0aGV5IGFycml2ZSBoZXJlLlxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSh7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZWxlbWVudHM6IG1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGhcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCFtZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICB9XG5cbiAgICBsZXQgcmF3RWxlbWVudHMgPSBtZXRhZGF0YS5lbGVtZW50cyB8fCBbXTtcblxuICAgIC8vIE1pZ3JhdGUgbGVnYWN5IGVsZW1lbnQgZmllbGRzIChuYW1lIC0+IGVsZW1lbnRfbmFtZSwgdHlwZSAtPiBlbGVtZW50X3R5cGUpXG4gICAgLy8gVGhpcyBlbnN1cmVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggQVBJIGNhbGxzIHVzaW5nIG9sZCBmaWVsZCBuYW1lc1xuICAgIGNvbnN0IG1pZ3JhdGVkRWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudFtdID0gcmF3RWxlbWVudHMubWFwKChlbGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X25hbWUgKG5ldyBzdGFuZGFyZCkgYW5kIG5hbWUgKGxlZ2FjeSlcbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbS5lbGVtZW50X25hbWUgfHwgZWxlbS5uYW1lO1xuICAgICAgaWYgKCFlbGVtZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gbXVzdCBoYXZlIGVsZW1lbnRfbmFtZSAob3IgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpYCk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ25hbWUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS5uYW1lICYmICFlbGVtLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ25hbWUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfbmFtZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfdHlwZSAobmV3IHN0YW5kYXJkKSBhbmQgdHlwZSAobGVnYWN5KVxuICAgICAgLy8gSXNzdWUgIzQ2NjogTm8gbG9uZ2VyIGRlZmF1bHRzIHRvICdza2lsbCcg4oCUIGNhbGxlcnMgbXVzdCBwcm92aWRlIHR5cGVcbiAgICAgIC8vIG9yIHBhc3MgbWFuYWdlcnMgZm9yIHBvcnRmb2xpbyByZXNvbHV0aW9uXG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW0uZWxlbWVudF90eXBlIHx8IGVsZW0udHlwZTtcbiAgICAgIGlmICghZWxlbWVudFR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgYXQgaW5kZXggJHtpbmRleH0gaGFzIG5vIGVsZW1lbnRfdHlwZS4gYCArXG4gICAgICAgICAgYFByb3ZpZGUgZWxlbWVudF90eXBlIGV4cGxpY2l0bHkgb3IgZW5zdXJlIHRoZSBlbGVtZW50IGV4aXN0cyBpbiB0aGUgcG9ydGZvbGlvLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAndHlwZScgZmllbGRcbiAgICAgIGlmIChlbGVtLnR5cGUgJiYgIWVsZW0uZWxlbWVudF90eXBlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAndHlwZScgZmllbGQuIFVzZSAnZWxlbWVudF90eXBlJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICByb2xlOiBlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uIHx8ICdhbHdheXMnLFxuICAgICAgICBjb25kaXRpb246IGVsZW0uY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IGVsZW0uZGVwZW5kZW5jaWVzLFxuICAgICAgICBwdXJwb3NlOiBlbGVtLnB1cnBvc2VcbiAgICAgIH0gYXMgRW5zZW1ibGVFbGVtZW50O1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzIGZvciBvcHRpb25hbCBmaWVsZHNcbiAgICBjb25zdCBmdWxsTWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YS5jcmVhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBtZXRhZGF0YS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgKG1ldGFkYXRhIGFzIGFueSkuYWN0aXZhdGlvbl9zdHJhdGVneSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5BQ1RJVkFUSU9OX1NUUkFURUdZLFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBtZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb24gfHwgKG1ldGFkYXRhIGFzIGFueSkuY29uZmxpY3RfcmVzb2x1dGlvbiB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05GTElDVF9SRVNPTFVUSU9OLFxuICAgICAgY29udGV4dFNoYXJpbmc6IG1ldGFkYXRhLmNvbnRleHRTaGFyaW5nIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTlRFWFRfU0hBUklORyxcbiAgICAgIHJlc291cmNlTGltaXRzOiBtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCA/PyBFTlNFTUJMRV9ERUZBVUxUUy5BTExPV19ORVNURUQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aCB8fCBFTlNFTUJMRV9ERUZBVUxUUy5NQVhfTkVTVElOR19ERVBUSCxcbiAgICAgIGVsZW1lbnRzOiBtaWdyYXRlZEVsZW1lbnRzLFxuICAgICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKHN5bW1ldHJpYyB3aXRoIGJ1aWxkTWV0YWRhdGEgZGVzZXJpYWxpemF0aW9uKVxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KChtZXRhZGF0YSBhcyBhbnkpLmdhdGVrZWVwZXIsIG1ldGFkYXRhLm5hbWUhLCAnZW5zZW1ibGUnKSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIGluaGVyaXRlZCBnZXRFbGVtZW50RmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBub3JtYWxpemF0aW9uXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShmdWxsTWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBJc3N1ZSAjNjEzOiBDaGVjayBtZXRhZGF0YSBuYW1lIHVuaXF1ZW5lc3MgKG5vdCBqdXN0IGZpbGVuYW1lKVxuICAgIGNvbnN0IGV4aXN0aW5nRW5zZW1ibGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdFbnNlbWJsZXMuZmluZChlID0+XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZnVsbE1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBlbnNlbWJsZSBuYW1lZCBcIiR7ZnVsbE1ldGFkYXRhLm5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShmdWxsTWV0YWRhdGEsIGZ1bGxNZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gU2V0IGluc3RydWN0aW9ucyBhbmQgY29udGVudCBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBlbnNlbWJsZS5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5jb250ZW50KSB7XG4gICAgICBlbnNlbWJsZS5jb250ZW50ID0gbWV0YWRhdGEuY29udGVudDtcbiAgICB9XG5cbiAgICAvLyBTYXZlIHRvIGRpc2tcbiAgICBhd2FpdCB0aGlzLnNhdmUoZW5zZW1ibGUsIGZpbGVuYW1lKTtcbiAgICAvLyBOb3RlOiBObyByZWxvYWQoKSBoZXJlIOKAlCBzYXZlKCkgY2FjaGVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgIC8vIExvZyBjcmVhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5TQVZFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYENyZWF0ZWQgZW5zZW1ibGU6ICR7ZnVsbE1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVuc2VtYmxlXG4gICAqIERlbGVnYXRlcyB0byBlbnNlbWJsZSdzIG93biB2YWxpZGF0ZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgb3ZlcnJpZGUgdmFsaWRhdGUoZWxlbWVudDogRW5zZW1ibGUpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBzYXZlIHRvIHZhbGlkYXRlIGJlZm9yZSBwZXJzaXN0aW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzYXZlKGVsZW1lbnQ6IEVuc2VtYmxlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmFsaWRhdGUgZW5zZW1ibGUgYmVmb3JlIHNhdmluZ1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRlKGVsZW1lbnQpO1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKSB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCBlbnNlbWJsZTogJHtlcnJvcnN9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgYXdhaXQgc3VwZXIuc2F2ZShlbGVtZW50LCBmaWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIGFkZCBlbnNlbWJsZS1zcGVjaWZpYyBsb2dnaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5ERUxFVEVELFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgRGVsZXRpbmcgZW5zZW1ibGU6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKGZpbGVQYXRoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5ERUxFVEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZW5zZW1ibGU6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGxpc3QgdG8gYXBwbHkgYWN0aXZlIHN0YXR1cyBiYXNlZCBvbiBhY3RpdmVFbnNlbWJsZU5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEVuc2VtYmxlW10+IHtcbiAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBBcHBseSBBQ1RJVkUgc3RhdHVzIHRvIGVuc2VtYmxlcyBpbiB0aGUgYWN0aXZlRW5zZW1ibGVOYW1lcyBzZXRcbiAgICBmb3IgKGNvbnN0IGVuc2VtYmxlIG9mIGVuc2VtYmxlcykge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5oYXMoZW5zZW1ibGUubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgLy8gQ2FsbCBhY3RpdmF0ZSgpIHRvIHNldCBzdGF0dXMgdG8gQUNUSVZFXG4gICAgICAgIGF3YWl0IGVuc2VtYmxlLmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuc2VtYmxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBlbnNlbWJsZSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbnNlbWJsZSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgQWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVFbnNlbWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBlbnNlbWJsZT86IEVuc2VtYmxlIH0+IHtcbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghZW5zZW1ibGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBNRU1PUlkgTEVBSyBGSVg6IENoZWNrIGlmIGNsZWFudXAgaXMgbmVlZGVkIGJlZm9yZSBhZGRpbmdcbiAgICB0aGlzLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpO1xuXG4gICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmFkZChlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFNldCBlbnNlbWJsZSBzdGF0dXMgdG8gYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmFjdGl2YXRlRW5zZW1ibGUnLFxuICAgICAgZGV0YWlsczogYEVuc2VtYmxlIGFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpLFxuICAgICAgZW5zZW1ibGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gZW5zZW1ibGUgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRW5zZW1ibGUgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIERlYWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgZGVhY3RpdmF0ZUVuc2VtYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5kZWxldGUoZW5zZW1ibGUubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBTZXQgZW5zZW1ibGUgc3RhdHVzIHRvIGluYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVhY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSBkZWFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGVuc2VtYmxlc1xuICAgKlxuICAgKiBAcmV0dXJucyBMaXN0IG9mIGFjdGl2ZSBlbnNlbWJsZXNcbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZUVuc2VtYmxlcygpOiBQcm9taXNlPEVuc2VtYmxlW10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBFbnNlbWJsZVtdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcykge1xuICAgICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICBpZiAoZW5zZW1ibGUpIHJlc3VsdHMucHVzaChlbnNlbWJsZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFjdGl2ZSBzZXQgY2xlYW51cCBpcyBuZWVkZWQgYW5kIHBlcmZvcm0gY2xlYW51cCBpZiBuZWNlc3NhcnlcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdlbnNlbWJsZXMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBlbnNlbWJsZXMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGVuc2VtYmxlcyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0VOU0VNQkxFUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGVuc2VtYmxlcyBsaW1pdCByZWFjaGVkOiAke3RoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplfS8ke21heH1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBlbnNlbWJsZXMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplO1xuICAgICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0Vuc2VtYmxlTmFtZXMgPSBuZXcgU2V0KGVuc2VtYmxlcy5tYXAoZSA9PiBlLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0Vuc2VtYmxlTmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBlbnNlbWJsZSByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgZW5zZW1ibGVzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2Vuc2VtYmxlcycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGVuc2VtYmxlIHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGVuc2VtYmxlczonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
829
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxD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TUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUVwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FDVCxjQUFjLE9BQU8sdUNBQXVDO29CQUM1RCxxQkFBcUIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQ2pFLENBQUM7Z0JBRUYsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsaUJBQWlCO29CQUN2QixRQUFRLEVBQUUsS0FBSztvQkFDZixNQUFNLEVBQUUsNkNBQTZDO29CQUNyRCxPQUFPLEVBQUUsV0FBVyxPQUFPLG1DQUFtQztvQkFDOUQsY0FBYyxFQUFFO3dCQUNkLFlBQVksRUFBRSxPQUFPO3dCQUNyQixXQUFXLEVBQUUsT0FBTzt3QkFDcEIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNsQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWpFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDZDQUE2QztnQkFDckQsT0FBTyxFQUFFLG1CQUFtQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDckYsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5zZW1ibGVNYW5hZ2VyIC0gSW1wbGVtZW50YXRpb24gb2YgSUVsZW1lbnRNYW5hZ2VyIGZvciBFbnNlbWJsZSBlbGVtZW50c1xuICpcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgZW5zZW1ibGVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICpcbiAqIEFSQ0hJVEVDVFVSRTpcbiAqIC0gRXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXIgZm9yIHVuaWZpZWQgZWxlbWVudCBtYW5hZ2VtZW50XG4gKiAtIEZvbGxvd3MgdGVtcGxhdGUgbWV0aG9kIHBhdHRlcm4gKHBhcnNlTWV0YWRhdGEsIGNyZWF0ZUVsZW1lbnQgaG9va3MpXG4gKiAtIFB1cmUgbWFuYWdlciBsYXllciAtIGRlbGVnYXRlcyBidXNpbmVzcyBsb2dpYyB0byBFbnNlbWJsZSBjbGFzc1xuICogLSBVc2VzIERJIGZvciBkZXBlbmRlbmNpZXMgKFBvcnRmb2xpb01hbmFnZXIsIEZpbGVMb2NrTWFuYWdlcilcbiAqXG4gKiBTRUNVUklUWTpcbiAqIC0gVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAqIC0gUGF0aCB2YWxpZGF0aW9uIHByZXZlbnRzIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrc1xuICogLSBJbnB1dCBzYW5pdGl6YXRpb24gZm9yIGFsbCB1c2VyIGRhdGFcbiAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZyBmb3IgYXVkaXQgdHJhaWxzXG4gKiAtIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gKi9cblxuaW1wb3J0IHsgRW5zZW1ibGUsIEVuc2VtYmxlTWV0YWRhdGEsIEVuc2VtYmxlRWxlbWVudCB9IGZyb20gJy4vRW5zZW1ibGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgRU5TRU1CTEVfREVGQVVMVFMsXG4gIEVOU0VNQkxFX0xJTUlUUyxcbiAgRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLFxuICBFTlNFTUJMRV9FUlJPUlMsXG4gIEFDVElWQVRJT05fU1RSQVRFR0lFUyxcbiAgQ09ORkxJQ1RfU1RSQVRFR0lFUyxcbiAgRUxFTUVOVF9ST0xFUyxcbiAgQUNUSVZBVElPTl9NT0RFU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRpb25TdHJhdGVneSwgQ29uZmxpY3RSZXNvbHV0aW9uU3RyYXRlZ3ksIEVsZW1lbnRSb2xlLCBBY3RpdmF0aW9uTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRWxlbWVudE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudE1lc3NhZ2VzLmpzJztcbmltcG9ydCB7IFZBTElEQVRJT05fUEFUVEVSTlMsIFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG4vLyBJc3N1ZSAjNDY2OiBTaGFyZWQgZWxlbWVudCB0eXBlIHJlc29sdmVyIOKAlCByZS1leHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuaW1wb3J0IHsgcmVzb2x2ZUVsZW1lbnRUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVsZW1lbnRUeXBlcywgdHlwZSBFbGVtZW50TWFuYWdlcnNGb3JSZXNvbHV0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgcmVzb2x2ZUVsZW1lbnRUeXBlcyBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJyAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVFbnNlbWJsZUVsZW1lbnRUeXBlcyA9IHJlc29sdmVFbGVtZW50VHlwZXM7XG5cbi8qKlxuICogRW5zZW1ibGVNYW5hZ2VyIC0gTWFuYWdlcyBlbnNlbWJsZSBlbGVtZW50IGxpZmVjeWNsZVxuICpcbiAqIEV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyIHRvIHByb3ZpZGUgZW5zZW1ibGUtc3BlY2lmaWMgb3BlcmF0aW9uczpcbiAqIC0gWUFNTCBwYXJzaW5nIHdpdGggYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2Ugc3VwcG9ydFxuICogLSBFbnNlbWJsZSBjcmVhdGlvbiBhbmQgdmFsaWRhdGlvblxuICogLSBFbGVtZW50IHJlZmVyZW5jZSBtYW5hZ2VtZW50XG4gKiAtIEltcG9ydC9leHBvcnQgaW4gbXVsdGlwbGUgZm9ybWF0c1xuICovXG5leHBvcnQgY2xhc3MgRW5zZW1ibGVNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPEVuc2VtYmxlPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5zZW1ibGVzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBhY3RpdmVFbnNlbWJsZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5FTlNFTUJMRSwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5lbnNlbWJsZXNEaXIgPSB0aGlzLmVsZW1lbnREaXI7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICpcbiAgICogTkFNSU5HIENPTlZFTlRJT04gU1VQUE9SVDpcbiAgICogLSBUeXBlU2NyaXB0IGludGVyZmFjZXMgdXNlIGNhbWVsQ2FzZSAoYWN0aXZhdGlvblN0cmF0ZWd5LCBjb25mbGljdFJlc29sdXRpb24pXG4gICAqIC0gWUFNTCBmaWxlcyBjYW4gdXNlIHNuYWtlX2Nhc2UgKGFjdGl2YXRpb25fc3RyYXRlZ3ksIGNvbmZsaWN0X3Jlc29sdXRpb24pXG4gICAqIC0gVGhpcyBtZXRob2QgbWFwcyBzbmFrZV9jYXNlIOKGkiBjYW1lbENhc2UgZm9yIHVzZXIgY29udmVuaWVuY2VcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgWUFNTCBkYXRhIGZyb20gZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIEVuc2VtYmxlTWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8RW5zZW1ibGVNZXRhZGF0YT4ge1xuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSB2YWxpZGF0ZU1ldGFkYXRhRmllbGQgZm9yIGZpZWxkLWF3YXJlIGVycm9yIG1lc3NhZ2VzICgjMzY1KVxuICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlTWV0YWRhdGFGaWVsZCgnbmFtZScsIGRhdGEubmFtZSwge1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEhcbiAgICB9KTtcbiAgICBpZiAoIW5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtuYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbWV0YWRhdGEgbXVzdCBpbmNsdWRlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSB2YWxpZGF0ZU1ldGFkYXRhRmllbGQgZm9yIGZpZWxkLWF3YXJlIGVycm9yIG1lc3NhZ2VzICgjMzY1KVxuICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBkZXNjUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZU1ldGFkYXRhRmllbGQoJ2Rlc2NyaXB0aW9uJywgZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgIHBhdHRlcm46IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9ERVNDUklQVElPTlxuICAgICAgfSk7XG4gICAgICBpZiAoIWRlc2NSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke2Rlc2NSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgZGVzY3JpcHRpb24gPSBkZXNjUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgYWN0aXZhdGlvbiBzdHJhdGVneSAoc3VwcG9ydCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSlcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3lSYXcgPSBkYXRhLmFjdGl2YXRpb25fc3RyYXRlZ3kgfHwgZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgRU5TRU1CTEVfREVGQVVMVFMuQUNUSVZBVElPTl9TVFJBVEVHWTtcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoYWN0aXZhdGlvblN0cmF0ZWd5UmF3KSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFjdGl2YXRpb24gc3RyYXRlZ3k6ICR7YWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5ID0gYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIUFDVElWQVRJT05fU1RSQVRFR0lFUy5pbmNsdWRlcyhhY3RpdmF0aW9uU3RyYXRlZ3kgYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX1NUUkFURUdZfTogJHthY3RpdmF0aW9uU3RyYXRlZ3l9YCk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uUmF3ID0gZGF0YS5jb25mbGljdF9yZXNvbHV0aW9uIHx8IGRhdGEuY29uZmxpY3RSZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT047XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGNvbmZsaWN0UmVzb2x1dGlvblJhdyksIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5OiAke2NvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvbiA9IGNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmluY2x1ZGVzKGNvbmZsaWN0UmVzb2x1dGlvbiBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQ09ORkxJQ1RfUkVTT0xVVElPTn06ICR7Y29uZmxpY3RSZXNvbHV0aW9ufWApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29udGV4dCBzaGFyaW5nIG1vZGVcbiAgICBjb25zdCBjb250ZXh0U2hhcmluZ1JhdyA9IGRhdGEuY29udGV4dF9zaGFyaW5nIHx8IGRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HO1xuXG4gICAgLy8gRklYOiBIYW5kbGUgYm9vbGVhbiB2YWx1ZXMgKHRydWUgLT4gJ2Z1bGwnLCBmYWxzZSAtPiAnbm9uZScpXG4gICAgbGV0IGNvbnRleHRTaGFyaW5nVmFsdWU6IHN0cmluZztcbiAgICBpZiAodHlwZW9mIGNvbnRleHRTaGFyaW5nUmF3ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGNvbnRleHRTaGFyaW5nVmFsdWUgPSBjb250ZXh0U2hhcmluZ1JhdyA/ICdmdWxsJyA6ICdub25lJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dFNoYXJpbmdWYWx1ZSA9IFN0cmluZyhjb250ZXh0U2hhcmluZ1Jhdyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dFNoYXJpbmdSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChjb250ZXh0U2hhcmluZ1ZhbHVlLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWNvbnRleHRTaGFyaW5nUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IHNoYXJpbmcgbW9kZTogJHtjb250ZXh0U2hhcmluZ1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nID0gY29udGV4dFNoYXJpbmdSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghWydub25lJywgJ3NlbGVjdGl2ZScsICdmdWxsJ10uaW5jbHVkZXMoY29udGV4dFNoYXJpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udGV4dCBzaGFyaW5nIG1vZGU6ICR7Y29udGV4dFNoYXJpbmd9YCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgcmVzb3VyY2UgbGltaXRzIChzdXBwb3J0IHNuYWtlX2Nhc2UpXG4gICAgY29uc3QgcmVzb3VyY2VMaW1pdHNSYXcgPSBkYXRhLnJlc291cmNlX2xpbWl0cyB8fCBkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIGxldCByZXNvdXJjZUxpbWl0cztcblxuICAgIGlmIChyZXNvdXJjZUxpbWl0c1Jhdykge1xuICAgICAgcmVzb3VyY2VMaW1pdHMgPSB7XG4gICAgICAgIG1heEFjdGl2ZUVsZW1lbnRzOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfYWN0aXZlX2VsZW1lbnRzIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heEFjdGl2ZUVsZW1lbnRzIHx8IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMsXG4gICAgICAgIG1heE1lbW9yeU1iOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfbWVtb3J5X21iIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heE1lbW9yeU1iLFxuICAgICAgICBtYXhFeGVjdXRpb25UaW1lTXM6IHJlc291cmNlTGltaXRzUmF3Lm1heF9leGVjdXRpb25fdGltZV9tcyB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhFeGVjdXRpb25UaW1lTXMgfHwgRU5TRU1CTEVfTElNSVRTLk1BWF9BQ1RJVkFUSU9OX1RJTUVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgZWxlbWVudHMgYXJyYXlcbiAgICBjb25zdCBlbGVtZW50c1JhdyA9IGRhdGEuZWxlbWVudHMgfHwgW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBlbGVtZW50cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudFtdID0gZWxlbWVudHNSYXcubWFwKChlbGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCBuYW1lXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF9uYW1lIChuZXcgc3RhbmRhcmQpIGFuZCBuYW1lIChsZWdhY3kpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgcmF3RWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIXJhd0VsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAnbmFtZScgZmllbGQuIFVzZSAnZWxlbWVudF9uYW1lJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudE5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKHJhd0VsZW1lbnROYW1lKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsIGFsbG93U3BhY2VzOiB0cnVlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnROYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgbmFtZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50TmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IHR5cGVcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X3R5cGUgKG5ldyBzdGFuZGFyZCkgYW5kIHR5cGUgKGxlZ2FjeSkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCByYXdFbGVtZW50VHlwZSA9IGVsZW0uZWxlbWVudF90eXBlIHx8IGVsZW0udHlwZSB8fCAnc2tpbGwnO1xuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICd0eXBlJyBmaWVsZFxuICAgICAgaWYgKGVsZW0udHlwZSAmJiAhZWxlbS5lbGVtZW50X3R5cGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICd0eXBlJyBmaWVsZC4gVXNlICdlbGVtZW50X3R5cGUnIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcocmF3RWxlbWVudFR5cGUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9UQUdfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudFR5cGVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRUeXBlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgcm9sZVxuICAgICAgY29uc3QgZWxlbWVudFJvbGVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKGVsZW0ucm9sZSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5FTEVNRU5UX1JPTEUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRSb2xlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgcm9sZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50Um9sZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50Um9sZSA9IGVsZW1lbnRSb2xlUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgICAgaWYgKCFFTEVNRU5UX1JPTEVTLmluY2x1ZGVzKGVsZW1lbnRSb2xlIGFzIGFueSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0VMRU1FTlRfUk9MRX06ICR7ZWxlbWVudFJvbGV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCBhY3RpdmF0aW9uXG4gICAgICBjb25zdCBlbGVtZW50QWN0aXZhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcoZWxlbS5hY3RpdmF0aW9uIHx8ICdhbHdheXMnKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50QWN0aXZhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IGFjdGl2YXRpb24gYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudEFjdGl2YXRpb24gPSBlbGVtZW50QWN0aXZhdGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICAgIGlmICghQUNUSVZBVElPTl9NT0RFUy5pbmNsdWRlcyhlbGVtZW50QWN0aXZhdGlvbiBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9BQ1RJVkFUSU9OX01PREV9OiAke2VsZW1lbnRBY3RpdmF0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBwcmlvcml0eSAoMC0xMDAsIGRlZmF1bHQgNTApXG4gICAgICBsZXQgcHJpb3JpdHkgPSBlbGVtLnByaW9yaXR5ID8/IEVOU0VNQkxFX0RFRkFVTFRTLlBSSU9SSVRZO1xuICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcHJpb3JpdHkgPSBwYXJzZUludChwcmlvcml0eSwgMTApO1xuICAgICAgfVxuICAgICAgcHJpb3JpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIHByaW9yaXR5KSk7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29uZGl0aW9uIChpZiBjb25kaXRpb25hbCBhY3RpdmF0aW9uKVxuICAgICAgLy8gQ29uZGl0aW9ucyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgLSB0aGV5IGNhbiBjb250YWluIG9wZXJhdG9ycyBsaWtlID09LCAhPSwgJiYsIHx8XG4gICAgICAvLyBTbyB3ZSB1c2UgYSBjdXN0b20gcGF0dGVybiB0aGF0IGFsbG93cyB0aGVzZSBjaGFyYWN0ZXJzXG4gICAgICBsZXQgY29uZGl0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbWVudEFjdGl2YXRpb24gPT09ICdjb25kaXRpb25hbCcgJiYgZWxlbS5jb25kaXRpb24pIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgICAgU3RyaW5nKGVsZW0uY29uZGl0aW9uKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhMZW5ndGg6IEVOU0VNQkxFX0xJTUlUUy5NQVhfQ09ORElUSU9OX0xFTkdUSCxcbiAgICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICAgICAgY3VzdG9tUGF0dGVybjogL15bYS16QS1aMC05XFxzXFwtXy49ISZ8PD4oKV0rJC8gIC8vIEFsbG93IGNvbXBhcmlzb24vbG9naWNhbCBvcGVyYXRvcnNcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29uZGl0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZGl0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke2NvbmRpdGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlcGVuZGVuY2llc1xuICAgICAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbS5kZXBlbmRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShlbGVtLmRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBlbGVtLmRlcGVuZGVuY2llcy5zbGljZSgwLCBFTlNFTUJMRV9MSU1JVFMuTUFYX0RFUEVOREVOQ0lFUykpIHtcbiAgICAgICAgICBjb25zdCBkZXBSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoZGVwKSwge1xuICAgICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILFxuICAgICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWRlcFJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiIGF0IGluZGV4ICR7aW5kZXh9OiAke2RlcFJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRlZERlcGVuZGVuY2llcy5wdXNoKGRlcFJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEpO1xuICAgICAgICB9XG4gICAgICAgIGRlcGVuZGVuY2llcyA9IHZhbGlkYXRlZERlcGVuZGVuY2llcztcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBwdXJwb3NlXG4gICAgICBsZXQgcHVycG9zZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW0ucHVycG9zZSkge1xuICAgICAgICBjb25zdCBwdXJwb3NlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGVsZW0ucHVycG9zZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICAgIGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJyAgLy8gQWxsb3cgZnVsbCBkZXNjcmlwdGlvbiBwdW5jdHVhdGlvbiAoY29tbWFzLCBlbS1kYXNoZXMsIGV0Yy4pXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXB1cnBvc2VSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwdXJwb3NlIGF0IGluZGV4ICR7aW5kZXh9OiAke3B1cnBvc2VSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHB1cnBvc2UgPSBwdXJwb3NlUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICByb2xlOiBlbGVtZW50Um9sZSBhcyBFbGVtZW50Um9sZSxcbiAgICAgICAgcHJpb3JpdHksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW1lbnRBY3RpdmF0aW9uIGFzIEFjdGl2YXRpb25Nb2RlLFxuICAgICAgICBjb25kaXRpb24sXG4gICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgcHVycG9zZVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgY291bnRcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gRU5TRU1CTEVfTElNSVRTLk1BWF9FTEVNRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEVOU0VNQkxFX0VSUk9SUy5UT09fTUFOWV9FTEVNRU5UUyk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgbmVzdGluZyBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgYWxsb3dOZXN0ZWQgPSBkYXRhLmFsbG93X25lc3RlZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgIEJvb2xlYW4oZGF0YS5hbGxvd19uZXN0ZWQpIDpcbiAgICAgIChkYXRhLmFsbG93TmVzdGVkICE9PSB1bmRlZmluZWQgPyBCb29sZWFuKGRhdGEuYWxsb3dOZXN0ZWQpIDogRU5TRU1CTEVfREVGQVVMVFMuQUxMT1dfTkVTVEVEKTtcblxuICAgIGNvbnN0IG1heE5lc3RpbmdEZXB0aCA9IGRhdGEubWF4X25lc3RpbmdfZGVwdGggfHwgZGF0YS5tYXhOZXN0aW5nRGVwdGggfHwgRU5TRU1CTEVfREVGQVVMVFMuTUFYX05FU1RJTkdfREVQVEg7XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHRhZ3MgYXJyYXlcbiAgICBsZXQgdGFnczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnRhZ3MpKSB7XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkYXRhLnRhZ3MpIHtcbiAgICAgICAgY29uc3QgdGFnUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKHRhZyksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0YWdSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWcgXCIke3RhZ31cIjogJHt0YWdSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHRhZ3MucHVzaCh0YWdSZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdWlsZCBtZXRhZGF0YSBvYmplY3QgKGNhbWVsQ2FzZSlcbiAgICBjb25zdCBtZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBkYXRhLmNyZWF0ZWQsXG4gICAgICBtb2RpZmllZDogZGF0YS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBhY3RpdmF0aW9uU3RyYXRlZ3kgYXMgQWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBjb25mbGljdFJlc29sdXRpb24gYXMgQ29uZmxpY3RSZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgICBjb250ZXh0U2hhcmluZzogY29udGV4dFNoYXJpbmcgYXMgJ25vbmUnIHwgJ3NlbGVjdGl2ZScgfCAnZnVsbCcsXG4gICAgICByZXNvdXJjZUxpbWl0cyxcbiAgICAgIGFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoLFxuICAgICAgZWxlbWVudHMsXG4gICAgICBnYXRla2VlcGVyOiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koZGF0YS5nYXRla2VlcGVyLCBuYW1lLCAnZW5zZW1ibGUnKSwgIC8vIElzc3VlICM1MjRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFbnNlbWJsZSBpbnN0YW5jZSBmcm9tIHBhcnNlZCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBWYWxpZGF0ZWQgZW5zZW1ibGUgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNYXJrZG93biBjb250ZW50IChlbnNlbWJsZSBpbnN0cnVjdGlvbnMvZG9jdW1lbnRhdGlvbilcbiAgICogQHJldHVybnMgTmV3IEVuc2VtYmxlIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSwgX2NvbnRlbnQ6IHN0cmluZyk6IEVuc2VtYmxlIHtcbiAgICBkZWxldGUgKG1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247ICAvLyBGaXggIzkxMjogU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKG1ldGFkYXRhLCBtZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEV4dHJhY3QgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEgaWYgcHJlc2VudCAodjIgZHVhbC1maWVsZClcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBlbnNlbWJsZS5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gZW5zZW1ibGU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIGFuIGVuc2VtYmxlIHRvIGZpbGUgY29udGVudFxuICAgKlxuICAgKiBGb3JtYXQ6IE1hcmtkb3duIHdpdGggWUFNTCBmcm9udG1hdHRlclxuICAgKiAtIEZyb250bWF0dGVyOiBFbnNlbWJsZSBtZXRhZGF0YSArIGVsZW1lbnQgcmVmZXJlbmNlc1xuICAgKiAtIENvbnRlbnQ6IEluc3RydWN0aW9ucy9kb2N1bWVudGF0aW9uIGZvciB0aGUgZW5zZW1ibGVcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMgRmlsZSBjb250ZW50IChtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogRW5zZW1ibGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZWxlbWVudC5tZXRhZGF0YTtcblxuICAgIC8vIEJ1aWxkIGZyb250bWF0dGVyIGRhdGEgKHVzaW5nIGNhbWVsQ2FzZSlcbiAgICBjb25zdCBmcm9udG1hdHRlcjogYW55ID0ge1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5FTlNFTUJMRSksXG4gICAgICBmb3JtYXRfdmVyc2lvbjogJ3YyJywgIC8vIEZpeCAjOTEyOiBFeHBsaWNpdCBmb3JtYXQgbWFya2VyXG4gICAgICB1bmlxdWVfaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MgfHwgW10sXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IG1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogbWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uLFxuICAgICAgY29udGV4dFNoYXJpbmc6IG1ldGFkYXRhLmNvbnRleHRTaGFyaW5nLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGhcbiAgICB9O1xuXG4gICAgLy8gdjIuMCBkdWFsLWZpZWxkOiB3cml0ZSBpbnN0cnVjdGlvbnMgdG8gWUFNTCBmcm9udG1hdHRlciBpZiBwcmVzZW50XG4gICAgaWYgKGVsZW1lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBmcm9udG1hdHRlci5pbnN0cnVjdGlvbnMgPSBlbGVtZW50Lmluc3RydWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBJbmNsdWRlIHJlc291cmNlIGxpbWl0cyBpZiBzcGVjaWZpZWRcbiAgICBpZiAobWV0YWRhdGEucmVzb3VyY2VMaW1pdHMpIHtcbiAgICAgIGZyb250bWF0dGVyLnJlc291cmNlTGltaXRzID0gbWV0YWRhdGEucmVzb3VyY2VMaW1pdHM7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKGFsbCBlbGVtZW50IHR5cGVzKVxuICAgIGlmIChtZXRhZGF0YS5nYXRla2VlcGVyKSB7XG4gICAgICBmcm9udG1hdHRlci5nYXRla2VlcGVyID0gbWV0YWRhdGEuZ2F0ZWtlZXBlcjtcbiAgICB9XG5cbiAgICAvLyBJbmNsdWRlIGVsZW1lbnRzIGFycmF5ICh1c2luZyBlbGVtZW50X25hbWUvZWxlbWVudF90eXBlIGZvciBBUEkgY29uc2lzdGVuY3kpXG4gICAgZnJvbnRtYXR0ZXIuZWxlbWVudHMgPSBtZXRhZGF0YS5lbGVtZW50cy5tYXAoZWxlbSA9PiB7XG4gICAgICBjb25zdCBlbGVtRGF0YTogYW55ID0ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW0uZWxlbWVudF9uYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW0uZWxlbWVudF90eXBlLFxuICAgICAgICByb2xlOiBlbGVtLnJvbGUsXG4gICAgICAgIHByaW9yaXR5OiBlbGVtLnByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtLmFjdGl2YXRpb25cbiAgICAgIH07XG5cbiAgICAgIGlmIChlbGVtLmNvbmRpdGlvbikge1xuICAgICAgICBlbGVtRGF0YS5jb25kaXRpb24gPSBlbGVtLmNvbmRpdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW0uZGVwZW5kZW5jaWVzICYmIGVsZW0uZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZWxlbURhdGEuZGVwZW5kZW5jaWVzID0gZWxlbS5kZXBlbmRlbmNpZXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtLnB1cnBvc2UpIHtcbiAgICAgICAgZWxlbURhdGEucHVycG9zZSA9IGVsZW0ucHVycG9zZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZW1EYXRhO1xuICAgIH0pO1xuXG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBmcm9udG1hdHRlciBjcmVhdGlvblxuICAgIC8vIFVzZSBDT1JFX1NDSEVNQSB0byBzdXBwb3J0IG51bWJlcnMgKHByaW9yaXR5KSBhbmQgYm9vbGVhbnMgKGFsbG93TmVzdGVkKVxuICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKGZyb250bWF0dGVyLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogc3RhbmRhcmRpemUgb24gSlNPTiBzY2hlbWEgYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSwgIC8vIEZpeCAjOTEzOiBzdGFuZGFyZGl6ZSBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAgICBjbGVhbmluZ1N0cmF0ZWd5OiAncmVtb3ZlLWJvdGgnLFxuICAgICAgc29ydEtleXM6IHRydWUsXG4gICAgICBsaW5lV2lkdGg6IDEwMCxcbiAgICAgIHNraXBJbnZhbGlkOiBmYWxzZSAgLy8gRG9uJ3Qgc2tpcCBpbnZhbGlkIC0gd2Ugd2FudCB0byBjYXRjaCBlcnJvcnNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0Qm9keShlbGVtZW50OiBFbnNlbWJsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IChlbGVtZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYCMgJHtuYW1lfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgbGluZXMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmlsZSBleHRlbnNpb24gZm9yIGVuc2VtYmxlIGZpbGVzXG4gICAqL1xuICBvdmVycmlkZSBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcubWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBlbnNlbWJsZSBmcm9tIGV4dGVybmFsIGZvcm1hdFxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBZQU1MOiBGcm9udG1hdHRlci1zdHlsZSBtZXRhZGF0YSB3aXRoIG9wdGlvbmFsIG1hcmtkb3duIGNvbnRlbnRcbiAgICogLSBKU09OOiBEaXJlY3QgZW5zZW1ibGUgc3RydWN0dXJlXG4gICAqIC0gTWFya2Rvd246IFlBTUwgZnJvbnRtYXR0ZXIgKyBtYXJrZG93biBjb250ZW50XG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gU3RyaW5nIGNvbnRhaW5pbmcgZW5zZW1ibGUgZGF0YVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gRm9ybWF0IG9mIHRoZSBkYXRhIChqc29uLCB5YW1sLCBtYXJrZG93bilcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gaW1wb3J0ZWQgRW5zZW1ibGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGltcG9ydEVsZW1lbnQoXG4gICAgZGF0YTogc3RyaW5nLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bidcbiAgKTogUHJvbWlzZTxFbnNlbWJsZT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyc2VkOiBhbnk7XG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBwYXJzZWQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlSnNvbihkYXRhLCB7XG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUGFyc2UgWUFNTC9NYXJrZG93biB1c2luZyBTZXJpYWxpemF0aW9uU2VydmljZVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiA1MDAwMCwgLy8gNTBLQiBsaW1pdCBmb3IgZW5zZW1ibGUgZmlsZXNcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhcnNlZCA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAvLyBDb250ZW50IGlzIHBhcnNlZCBidXQgbm90IHVzZWQgaW4gZW5zZW1ibGUgY3JlYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbnNlbWJsZVxuICAgICAgY29uc3QgZW5zZW1ibGUgPSBuZXcgRW5zZW1ibGUobWV0YWRhdGEsIG1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIGltcG9ydFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuSU1QT1JURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgSW1wb3J0ZWQgZW5zZW1ibGU6ICR7bWV0YWRhdGEubmFtZX0gd2l0aCAke21ldGFkYXRhLmVsZW1lbnRzLmxlbmd0aH0gZWxlbWVudHNgXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGVuc2VtYmxlO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLklNUE9SVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBpbXBvcnQgZW5zZW1ibGU6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgZW5zZW1ibGU6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbnNlbWJsZSB0byBleHRlcm5hbCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byBleHBvcnRcbiAgICogQHBhcmFtIGZvcm1hdCAtIE91dHB1dCBmb3JtYXQgKGpzb24sIHlhbWwsIG1hcmtkb3duKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBzZXJpYWxpemVkIHN0cmluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZXhwb3J0RWxlbWVudChcbiAgICBlbGVtZW50OiBFbnNlbWJsZSxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5zZXJpYWxpemVUb0pTT04oKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgWUFNTCBhbmQgTWFya2Rvd24sIHVzZSB0aGUgc2FtZSBmb3JtYXQgKGZyb250bWF0dGVyICsgY29udGVudClcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnNlbWJsZSB3aXRoIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFBhcnRpYWwgbWV0YWRhdGEgZm9yIHRoZSBlbnNlbWJsZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBuZXcgRW5zZW1ibGUgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxFbnNlbWJsZU1ldGFkYXRhPiAmIHsgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nIH0pOiBQcm9taXNlPEVuc2VtYmxlPiB7XG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvblxuICAgIC8vIE5vdGU6IGVsZW1lbnRfdHlwZSByZXNvbHV0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGhhbmRsZXIgbGF5ZXIgYmVmb3JlIGNhbGxpbmcgY3JlYXRlKCkuXG4gICAgLy8gRWxlbWVudHMgc2hvdWxkIGFscmVhZHkgaGF2ZSBlbGVtZW50X3R5cGUgc2V0IHdoZW4gdGhleSBhcnJpdmUgaGVyZS5cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGVsZW1lbnRzOiBtZXRhZGF0YS5lbGVtZW50cyB8fCBbXSxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBjcmVhdGlvbiB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHJlcXVpcmVkIGZpZWxkc1xuICAgIGlmICghbWV0YWRhdGEubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgfVxuXG4gICAgbGV0IHJhd0VsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMgfHwgW107XG5cbiAgICAvLyBNaWdyYXRlIGxlZ2FjeSBlbGVtZW50IGZpZWxkcyAobmFtZSAtPiBlbGVtZW50X25hbWUsIHR5cGUgLT4gZWxlbWVudF90eXBlKVxuICAgIC8vIFRoaXMgZW5zdXJlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEFQSSBjYWxscyB1c2luZyBvbGQgZmllbGQgbmFtZXNcbiAgICBjb25zdCBtaWdyYXRlZEVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IHJhd0VsZW1lbnRzLm1hcCgoZWxlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF9uYW1lIChuZXcgc3RhbmRhcmQpIGFuZCBuYW1lIChsZWdhY3kpXG4gICAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW0uZWxlbWVudF9uYW1lIHx8IGVsZW0ubmFtZTtcbiAgICAgIGlmICghZWxlbWVudE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IG11c3QgaGF2ZSBlbGVtZW50X25hbWUgKG9yIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KWApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICduYW1lJyBmaWVsZFxuICAgICAgaWYgKGVsZW0ubmFtZSAmJiAhZWxlbS5lbGVtZW50X25hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICduYW1lJyBmaWVsZC4gVXNlICdlbGVtZW50X25hbWUnIGluc3RlYWQuYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X3R5cGUgKG5ldyBzdGFuZGFyZCkgYW5kIHR5cGUgKGxlZ2FjeSlcbiAgICAgIC8vIElzc3VlICM0NjY6IE5vIGxvbmdlciBkZWZhdWx0cyB0byAnc2tpbGwnIOKAlCBjYWxsZXJzIG11c3QgcHJvdmlkZSB0eXBlXG4gICAgICAvLyBvciBwYXNzIG1hbmFnZXJzIGZvciBwb3J0Zm9saW8gcmVzb2x1dGlvblxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtLmVsZW1lbnRfdHlwZSB8fCBlbGVtLnR5cGU7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGF0IGluZGV4ICR7aW5kZXh9IGhhcyBubyBlbGVtZW50X3R5cGUuIGAgK1xuICAgICAgICAgIGBQcm92aWRlIGVsZW1lbnRfdHlwZSBleHBsaWNpdGx5IG9yIGVuc3VyZSB0aGUgZWxlbWVudCBleGlzdHMgaW4gdGhlIHBvcnRmb2xpby5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ3R5cGUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS50eXBlICYmICFlbGVtLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ3R5cGUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfdHlwZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcm9sZTogZWxlbS5yb2xlIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkVMRU1FTlRfUk9MRSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW0ucHJpb3JpdHkgPz8gRU5TRU1CTEVfREVGQVVMVFMuUFJJT1JJVFksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW0uYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyxcbiAgICAgICAgY29uZGl0aW9uOiBlbGVtLmNvbmRpdGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBlbGVtLmRlcGVuZGVuY2llcyxcbiAgICAgICAgcHVycG9zZTogZWxlbS5wdXJwb3NlXG4gICAgICB9IGFzIEVuc2VtYmxlRWxlbWVudDtcbiAgICB9KTtcblxuICAgIC8vIFNldCBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgZmllbGRzXG4gICAgY29uc3QgZnVsbE1ldGFkYXRhOiBFbnNlbWJsZU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIHZlcnNpb246IG1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGEuY3JlYXRlZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogbWV0YWRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFnczogbWV0YWRhdGEudGFncyB8fCBbXSxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogbWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5IHx8IChtZXRhZGF0YSBhcyBhbnkpLmFjdGl2YXRpb25fc3RyYXRlZ3kgfHwgRU5TRU1CTEVfREVGQVVMVFMuQUNUSVZBVElPTl9TVFJBVEVHWSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogbWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uIHx8IChtZXRhZGF0YSBhcyBhbnkpLmNvbmZsaWN0X3Jlc29sdXRpb24gfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09ORkxJQ1RfUkVTT0xVVElPTixcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05URVhUX1NIQVJJTkcsXG4gICAgICByZXNvdXJjZUxpbWl0czogbWV0YWRhdGEucmVzb3VyY2VMaW1pdHMsXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQgPz8gRU5TRU1CTEVfREVGQVVMVFMuQUxMT1dfTkVTVEVELFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGggfHwgRU5TRU1CTEVfREVGQVVMVFMuTUFYX05FU1RJTkdfREVQVEgsXG4gICAgICBlbGVtZW50czogbWlncmF0ZWRFbGVtZW50cyxcbiAgICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChzeW1tZXRyaWMgd2l0aCBidWlsZE1ldGFkYXRhIGRlc2VyaWFsaXphdGlvbilcbiAgICAgIGdhdGVrZWVwZXI6IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeSgobWV0YWRhdGEgYXMgYW55KS5nYXRla2VlcGVyLCBtZXRhZGF0YS5uYW1lISwgJ2Vuc2VtYmxlJyksXG4gICAgfTtcblxuICAgIC8vIFVzZSBpbmhlcml0ZWQgZ2V0RWxlbWVudEZpbGVuYW1lKCkgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgbm9ybWFsaXphdGlvblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoZnVsbE1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gSXNzdWUgIzYxMzogQ2hlY2sgbWV0YWRhdGEgbmFtZSB1bmlxdWVuZXNzIChub3QganVzdCBmaWxlbmFtZSlcbiAgICBjb25zdCBleGlzdGluZ0Vuc2VtYmxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGV4aXN0aW5nRW5zZW1ibGVzLmZpbmQoZSA9PlxuICAgICAgZS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGZ1bGxNZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQW4gZW5zZW1ibGUgbmFtZWQgXCIke2Z1bGxNZXRhZGF0YS5uYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuc2VtYmxlXG4gICAgY29uc3QgZW5zZW1ibGUgPSBuZXcgRW5zZW1ibGUoZnVsbE1ldGFkYXRhLCBmdWxsTWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIFNldCBpbnN0cnVjdGlvbnMgYW5kIGNvbnRlbnQgaWYgcHJvdmlkZWQgKHYyLjAgZHVhbC1maWVsZCBhcmNoaXRlY3R1cmUpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgZW5zZW1ibGUuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGEuY29udGVudCkge1xuICAgICAgZW5zZW1ibGUuY29udGVudCA9IG1ldGFkYXRhLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSB0byBkaXNrXG4gICAgYXdhaXQgdGhpcy5zYXZlKGVuc2VtYmxlLCBmaWxlbmFtZSk7XG4gICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgc2F2ZSgpIGNhY2hlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuXG4gICAgLy8gU2VlIElzc3VlICM0OTEgZm9yIHdoeSBQZXJzb25hTWFuYWdlcidzIHJlbG9hZC1hZnRlci1jcmVhdGUgd2FzIHJlbW92ZWQuXG5cbiAgICAvLyBMb2cgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuU0FWRUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY3JlYXRlJyxcbiAgICAgIGRldGFpbHM6IGBDcmVhdGVkIGVuc2VtYmxlOiAke2Z1bGxNZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiBlbnNlbWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbnNlbWJsZVxuICAgKiBEZWxlZ2F0ZXMgdG8gZW5zZW1ibGUncyBvd24gdmFsaWRhdGUgbWV0aG9kXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIHZhbGlkYXRlKGVsZW1lbnQ6IEVuc2VtYmxlKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiBlbGVtZW50LnZhbGlkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgc2F2ZSB0byB2YWxpZGF0ZSBiZWZvcmUgcGVyc2lzdGluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2F2ZShlbGVtZW50OiBFbnNlbWJsZSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFZhbGlkYXRlIGVuc2VtYmxlIGJlZm9yZSBzYXZpbmdcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0ZShlbGVtZW50KTtcbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJykgfHwgJ1Vua25vd24gdmFsaWRhdGlvbiBlcnJvcic7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzYXZlIGludmFsaWQgZW5zZW1ibGU6ICR7ZXJyb3JzfWApO1xuICAgIH1cblxuICAgIC8vIENhbGwgYmFzZSBpbXBsZW1lbnRhdGlvblxuICAgIGF3YWl0IHN1cGVyLnNhdmUoZWxlbWVudCwgZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byBhZGQgZW5zZW1ibGUtc3BlY2lmaWMgbG9nZ2luZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuREVMRVRFRCxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYERlbGV0aW5nIGVuc2VtYmxlOiAke2ZpbGVQYXRofWBcbiAgICB9KTtcblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZShmaWxlUGF0aCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuREVMRVRFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBkZWxldGVkIGVuc2VtYmxlOiAke2ZpbGVQYXRofWBcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlRW5zZW1ibGVOYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxFbnNlbWJsZVtdPiB7XG4gICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgQUNUSVZFIHN0YXR1cyB0byBlbnNlbWJsZXMgaW4gdGhlIGFjdGl2ZUVuc2VtYmxlTmFtZXMgc2V0XG4gICAgZm9yIChjb25zdCBlbnNlbWJsZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuaGFzKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIENhbGwgYWN0aXZhdGUoKSB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBlbnNlbWJsZS5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnNlbWJsZXM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gZW5zZW1ibGUgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRW5zZW1ibGUgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIEFjdGl2YXRpb24gcmVzdWx0IHdpdGggc3VjY2VzcyBzdGF0dXMgYW5kIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlRW5zZW1ibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgZW5zZW1ibGU/OiBFbnNlbWJsZSB9PiB7XG4gICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgYmVmb3JlIGxvb2t1cCBzbyBleHRlcm5hbCBmaWxlIGVkaXRzIGFyZSBwaWNrZWQgdXAgKCMxODk1KS5cbiAgICAvLyBmaW5kQnlOYW1lKCkgaGl0cyB0aGUgTFJVIGNhY2hlIGZpcnN0IGFuZCBuZXZlciBjYWxscyBsaXN0KCksIHNvIHdpdGhvdXQgdGhpc1xuICAgIC8vIHRoZSBzY2FuIGNvb2xkb3duIHByZXZlbnRzIG10aW1lLWJhc2VkIGV2aWN0aW9uIGZyb20gcnVubmluZy5cbiAgICBhd2FpdCB0aGlzLnNjYW5BbmRFdmljdCgpO1xuXG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWVuc2VtYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTUVNT1JZIExFQUsgRklYOiBDaGVjayBpZiBjbGVhbnVwIGlzIG5lZWRlZCBiZWZvcmUgYWRkaW5nXG4gICAgdGhpcy5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTtcblxuICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5hZGQoZW5zZW1ibGUubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBTZXQgZW5zZW1ibGUgc3RhdHVzIHRvIGFjdGl2ZVxuICAgIGF3YWl0IGVuc2VtYmxlLmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5hY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSBhY3RpdmF0ZWQ6ICR7ZW5zZW1ibGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIGVuc2VtYmxlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIGFuIGVuc2VtYmxlIGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVuc2VtYmxlIG5hbWUgb3IgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyBEZWFjdGl2YXRpb24gcmVzdWx0IHdpdGggc3VjY2VzcyBzdGF0dXMgYW5kIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVFbnNlbWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBlbnNlbWJsZT86IEVuc2VtYmxlIH0+IHtcbiAgICAvLyBObyBzY2FuQW5kRXZpY3QoKSBoZXJlIOKAlCBpbnRlbnRpb25hbC4gRGVhY3RpdmF0aW9uIG9ubHkgbmVlZHMgdGhlIGVuc2VtYmxlJ3NcbiAgICAvLyBuYW1lICh0byByZW1vdmUgZnJvbSBhY3RpdmVFbnNlbWJsZU5hbWVzKSBhbmQgY2FsbHMgZGVhY3RpdmF0ZSgpIHdoaWNoIHNldHNcbiAgICAvLyBhIHN0YXR1cyBmbGFnLiBJdCBkb2VzIG5vdCBjb25zdW1lIHRoZSBlbGVtZW50cyBsaXN0LCBzbyBzdGFsZSBjYWNoZWQgZWxlbWVudFxuICAgIC8vIGRhdGEgaGFzIG5vIGVmZmVjdCBvbiBjb3JyZWN0bmVzcy4gQ29tcGFyZSB3aXRoIGFjdGl2YXRlRW5zZW1ibGUoKSwgd2hpY2hcbiAgICAvLyBpbmdlc3RzIHRoZSBmdWxsIGVsZW1lbnQgbGlzdCB0byBvcmNoZXN0cmF0ZSBzdWItZWxlbWVudCBsb2FkaW5nIGFuZCBtdXN0XG4gICAgLy8gdGhlcmVmb3JlIHNlZSB0aGUgbGF0ZXN0IG9uLWRpc2sgZGVmaW5pdGlvbi4gKCMxODk1KVxuXG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWVuc2VtYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmRlbGV0ZShlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFNldCBlbnNlbWJsZSBzdGF0dXMgdG8gaW5hY3RpdmVcbiAgICBhd2FpdCBlbnNlbWJsZS5kZWFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5kZWFjdGl2YXRlRW5zZW1ibGUnLFxuICAgICAgZGV0YWlsczogYEVuc2VtYmxlIGRlYWN0aXZhdGVkOiAke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmRlYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIGVuc2VtYmxlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBlbnNlbWJsZXNcbiAgICpcbiAgICogQHJldHVybnMgTGlzdCBvZiBhY3RpdmUgZW5zZW1ibGVzXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVFbnNlbWJsZXMoKTogUHJvbWlzZTxFbnNlbWJsZVtdPiB7XG4gICAgY29uc3QgcmVzdWx0czogRW5zZW1ibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMpIHtcbiAgICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKG5hbWUpO1xuICAgICAgaWYgKGVuc2VtYmxlKSByZXN1bHRzLnB1c2goZW5zZW1ibGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhY3RpdmUgc2V0IGNsZWFudXAgaXMgbmVlZGVkIGFuZCBwZXJmb3JtIGNsZWFudXAgaWYgbmVjZXNzYXJ5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBtYXgsIGNsZWFudXBUaHJlc2hvbGQgfSA9IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZygnZW5zZW1ibGVzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemUgPCBjbGVhbnVwVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgbWF4IOKAlCB3YXJuIGJlZm9yZSBjbGVhbnVwXG4gICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplID49IG1heCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBBY3RpdmUgZW5zZW1ibGVzIGxpbWl0IHJlYWNoZWQgKCR7bWF4fSkuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgZGVhY3RpdmF0aW5nIHVudXNlZCBlbnNlbWJsZXMgb3Igc2V0dGluZyBET0xMSE9VU0VfTUFYX0FDVElWRV9FTlNFTUJMRVMgdG8gYSBoaWdoZXIgdmFsdWUuYFxuICAgICAgKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0JyxcbiAgICAgICAgZGV0YWlsczogYEFjdGl2ZSBlbnNlbWJsZXMgbGltaXQgcmVhY2hlZDogJHt0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZX0vJHttYXh9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdm9pZCB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgZW5zZW1ibGVzIHNldFxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbnNlbWJsZU5hbWVzID0gbmV3IFNldChlbnNlbWJsZXMubWFwKGUgPT4gZS5tZXRhZGF0YS5uYW1lKSk7XG5cbiAgICAgIGNvbnN0IHN0YWxlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZU5hbWUgb2YgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdFbnNlbWJsZU5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5kZWxldGUoYWN0aXZlTmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZFNpemUgPSB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBzdGFydFNpemUgLSBlbmRTaXplO1xuXG4gICAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsZWFuZWQgdXAgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgZW5zZW1ibGUgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIGVuc2VtYmxlczogJHtlbmRTaXplfS8ke2dldE1heEFjdGl2ZUxpbWl0KCdlbnNlbWJsZXMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBlbnNlbWJsZSByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZU5hbWVzOiBzdGFsZU5hbWVzLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjbGVhbnVwIHN0YWxlIGFjdGl2ZSBlbnNlbWJsZXM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMnLFxuICAgICAgICBkZXRhaWxzOiBgQ2xlYW51cCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -63,7 +63,7 @@ export declare class Template extends BaseElement implements IElement {
63
63
  private compiledTemplate?;
64
64
  private parsedSections?;
65
65
  private readonly MAX_TEMPLATE_SIZE;
66
- private readonly MAX_VARIABLE_COUNT;
66
+ private static readonly MAX_VARIABLE_COUNT;
67
67
  private readonly MAX_INCLUDE_DEPTH;
68
68
  private readonly MAX_STRING_LENGTH;
69
69
  constructor(metadata: Partial<TemplateMetadata>, content: string | undefined, metadataService: MetadataService);
@@ -94,6 +94,38 @@ export declare class Template extends BaseElement implements IElement {
94
94
  * Used by TemplateRenderer to serve section-specific render results.
95
95
  */
96
96
  getSections(): TemplateSections;
97
+ /**
98
+ * Scan `content` for `{{placeholder}}` patterns and return a merged variable
99
+ * list. Existing entries are preserved unchanged (user-set descriptions,
100
+ * types, required flags, etc.); new placeholders are added with defaults:
101
+ * `type: 'string'`, `required: false`. (#1896)
102
+ *
103
+ * Respects section mode — only the `<template>` section is scanned,
104
+ * matching the substitution engine's scope.
105
+ *
106
+ * **Performance:** Single-pass regex scan — O(n) in content length.
107
+ * Called by `TemplateManager.save()` on every create/edit, so content
108
+ * is already validated and size-bounded (≤ 100 KB) before reaching here.
109
+ *
110
+ * @param content - Raw template content (may include section tags)
111
+ * @param existingVariables - Already-declared variables; never overwritten
112
+ * @returns Merged variable list: existing entries first, new entries appended
113
+ *
114
+ * @example
115
+ * // New template — empty schema gets fully populated
116
+ * deriveVariablesFromContent('Hello {{name}}, score: {{score}}')
117
+ * // → [{ name: 'name', type: 'string', required: false },
118
+ * // { name: 'score', type: 'string', required: false }]
119
+ *
120
+ * @example
121
+ * // Existing entry preserved; only the missing placeholder is added
122
+ * deriveVariablesFromContent('{{name}} earns {{points}}', [
123
+ * { name: 'name', type: 'string', required: true, description: 'Display name' }
124
+ * ])
125
+ * // → [{ name: 'name', type: 'string', required: true, description: 'Display name' },
126
+ * // { name: 'points', type: 'string', required: false }]
127
+ */
128
+ static deriveVariablesFromContent(content: string, existingVariables?: TemplateVariable[]): TemplateVariable[];
97
129
  private compile;
98
130
  /**
99
131
  * Render the template with provided variables
@@ -1 +1 @@
1
- {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../../src/elements/templates/Template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../../src/elements/templates/Template.ts"],"names":[],"mappings":"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"}