@dollhousemcp/mcp-server 2.0.40 → 2.0.41

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 (44) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/di/Container.d.ts.map +1 -1
  3. package/dist/di/Container.js +10 -7
  4. package/dist/elements/agents/AgentManager.d.ts +25 -6
  5. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  6. package/dist/elements/agents/AgentManager.js +127 -21
  7. package/dist/elements/base/BaseElementManager.d.ts +18 -2
  8. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  9. package/dist/elements/base/BaseElementManager.js +36 -3
  10. package/dist/generated/version.d.ts +2 -2
  11. package/dist/generated/version.js +3 -3
  12. package/dist/handlers/ElementCRUDHandler.d.ts +36 -8
  13. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  14. package/dist/handlers/ElementCRUDHandler.js +227 -96
  15. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  16. package/dist/handlers/mcp-aql/MCPAQLHandler.js +3 -3
  17. package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
  18. package/dist/handlers/strategies/AgentActivationStrategy.js +5 -2
  19. package/dist/handlers/strategies/ElementActivationStrategy.d.ts +2 -0
  20. package/dist/handlers/strategies/ElementActivationStrategy.d.ts.map +1 -1
  21. package/dist/handlers/strategies/ElementActivationStrategy.js +1 -1
  22. package/dist/index.d.ts +7 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/services/ActivationStore.d.ts +5 -4
  25. package/dist/services/ActivationStore.d.ts.map +1 -1
  26. package/dist/services/ActivationStore.js +35 -9
  27. package/dist/services/PolicyExportService.d.ts +8 -2
  28. package/dist/services/PolicyExportService.d.ts.map +1 -1
  29. package/dist/services/PolicyExportService.js +37 -6
  30. package/dist/storage/ElementStorageLayer.d.ts +3 -3
  31. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  32. package/dist/storage/ElementStorageLayer.js +33 -7
  33. package/dist/storage/IStorageLayer.d.ts +8 -1
  34. package/dist/storage/IStorageLayer.d.ts.map +1 -1
  35. package/dist/storage/IStorageLayer.js +1 -1
  36. package/dist/storage/MemoryStorageLayer.d.ts +4 -3
  37. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  38. package/dist/storage/MemoryStorageLayer.js +43 -13
  39. package/dist/storage/types.d.ts +7 -0
  40. package/dist/storage/types.d.ts.map +1 -1
  41. package/dist/storage/types.js +17 -2
  42. package/oauth-helper.mjs +19 -26
  43. package/package.json +1 -1
  44. package/server.json +2 -2
@@ -25,6 +25,7 @@ import { ElementNotFoundError } from '../../utils/ErrorHandler.js';
25
25
  import { normalizeElementStorageIdentity } from '../../utils/filesystem.js';
26
26
  import { sanitizeGatekeeperPolicy } from '../../handlers/mcp-aql/policies/ElementPolicies.js';
27
27
  import { SECURITY_LIMITS } from '../../security/constants.js';
28
+ import { ElementStatus } from '../../types/elements/IElement.js';
28
29
  const AGENT_FILE_EXTENSION = '.md';
29
30
  const STATE_DIRECTORY = '.state';
30
31
  const STATE_FILE_EXTENSION = '.state.yaml';
@@ -45,8 +46,11 @@ export class AgentManager extends BaseElementManager {
45
46
  metadataService;
46
47
  /** Per-agent tokens retained only while execution or recovery is in flight. */
47
48
  executionGenerations = new Map();
48
- // Track active agents by name (stable identifier)
49
+ // Fallback identities for agents without attached storage metadata.
49
50
  activeAgentNames = new Set();
51
+ // Stable filename -> name used at activation. Filenames are authoritative;
52
+ // the retained name remains a valid deactivation alias after metadata edits.
53
+ activeAgentsByFilename = new Map();
50
54
  // Static resolver for element manager lookup (DI pattern)
51
55
  // This allows Agent instances to resolve managers without tight coupling
52
56
  static elementManagerResolver;
@@ -664,9 +668,11 @@ export class AgentManager extends BaseElementManager {
664
668
  */
665
669
  async list() {
666
670
  const agents = await super.list();
667
- // Apply active status to agents that are in the active set (by name)
671
+ // Apply active status by display name or, when available, stable filename.
668
672
  for (const agent of agents) {
669
- if (this.activeAgentNames.has(agent.metadata.name)) {
673
+ const filename = this.getStableFilename(agent);
674
+ if ((filename && this.activeAgentsByFilename.has(filename)) ||
675
+ this.activeAgentNames.has(agent.metadata.name)) {
670
676
  // Activate the agent to set status to ACTIVE
671
677
  await agent.activate();
672
678
  }
@@ -683,6 +689,17 @@ export class AgentManager extends BaseElementManager {
683
689
  async activateAgent(identifier) {
684
690
  // PERFORMANCE FIX: Use findByName() instead of list()
685
691
  const agent = await this.findByName(identifier);
692
+ return this.activateResolvedAgent(agent, identifier);
693
+ }
694
+ /**
695
+ * Activate an agent through its authoritative storage filename.
696
+ * Used for persisted activation restore when metadata.name may have changed.
697
+ */
698
+ async activateAgentByFilename(filename) {
699
+ const agent = await this.findByFilename(filename);
700
+ return this.activateResolvedAgent(agent, filename);
701
+ }
702
+ async activateResolvedAgent(agent, identifier) {
686
703
  if (!agent) {
687
704
  return {
688
705
  success: false,
@@ -692,8 +709,15 @@ export class AgentManager extends BaseElementManager {
692
709
  }
693
710
  // MEMORY LEAK FIX: Check if cleanup is needed before adding
694
711
  this.checkAndCleanupActiveSet();
695
- // Add to active set (by name, which is stable across reloads)
696
- this.activeAgentNames.add(agent.metadata.name);
712
+ // Prefer stable storage identity so external display-name edits cannot
713
+ // collapse or orphan active agents.
714
+ const filename = this.getStableFilename(agent);
715
+ if (filename) {
716
+ this.activeAgentsByFilename.set(filename, agent.metadata.name);
717
+ }
718
+ else {
719
+ this.activeAgentNames.add(agent.metadata.name);
720
+ }
697
721
  // Update agent status in memory
698
722
  await agent.activate();
699
723
  SecurityMonitor.logSecurityEvent({
@@ -718,6 +742,14 @@ export class AgentManager extends BaseElementManager {
718
742
  agent
719
743
  };
720
744
  }
745
+ /**
746
+ * Resolve the stable storage identity used to persist an agent activation.
747
+ * The filename remains unchanged when metadata.name is edited externally.
748
+ */
749
+ async getStableActivationFilename(identifier) {
750
+ const agent = await this.findByName(identifier);
751
+ return agent ? this.getStableFilename(agent) : undefined;
752
+ }
721
753
  /**
722
754
  * Deactivate an agent by name or identifier
723
755
  *
@@ -725,8 +757,23 @@ export class AgentManager extends BaseElementManager {
725
757
  * Issue #24 (LOW PRIORITY): Consistent error messages using ElementMessages
726
758
  */
727
759
  async deactivateAgent(identifier) {
728
- // PERFORMANCE FIX: Use findByName() instead of list()
729
- const agent = await this.findByName(identifier);
760
+ // Deactivation is a security-sensitive lifecycle change. Refresh first,
761
+ // then fall back to stable active filenames when external metadata edits
762
+ // have made the current display name diverge from its storage path.
763
+ await this.scanAndEvict({ freshAfterInFlight: true });
764
+ let agent;
765
+ const normalizedIdentifier = identifier.toLowerCase();
766
+ for (const [filename, activationName] of this.activeAgentsByFilename) {
767
+ const candidate = await this.findByFilename(filename);
768
+ if (filename.toLowerCase() === normalizedIdentifier ||
769
+ activationName.toLowerCase() === normalizedIdentifier ||
770
+ candidate?.metadata.name.toLowerCase() === normalizedIdentifier) {
771
+ agent = candidate;
772
+ if (agent)
773
+ break;
774
+ }
775
+ }
776
+ agent ??= await this.findByName(identifier);
730
777
  if (!agent) {
731
778
  return {
732
779
  success: false,
@@ -734,8 +781,11 @@ export class AgentManager extends BaseElementManager {
734
781
  message: ElementMessages.notFound(ElementType.AGENT, identifier)
735
782
  };
736
783
  }
737
- // Remove from active set
738
- this.activeAgentNames.delete(agent.metadata.name);
784
+ const filename = this.getStableFilename(agent);
785
+ // Remove the current display name and any pre-rename key that points at
786
+ // the same stable file, so explicit deactivation cannot be undone by a
787
+ // later policy refresh.
788
+ this.removeActiveAgentIdentity(agent, identifier);
739
789
  // Update agent status in memory
740
790
  await agent.deactivate();
741
791
  SecurityMonitor.logSecurityEvent({
@@ -754,15 +804,60 @@ export class AgentManager extends BaseElementManager {
754
804
  return {
755
805
  success: true,
756
806
  // CONSISTENCY FIX: Use standardized success message format
757
- message: ElementMessages.deactivated(ElementType.AGENT, agent.metadata.name)
807
+ message: ElementMessages.deactivated(ElementType.AGENT, agent.metadata.name),
808
+ ...(filename ? { filename } : {}),
758
809
  };
759
810
  }
760
811
  /**
761
812
  * Get all active agents
762
813
  */
763
- async getActiveAgents() {
764
- const agents = await this.list();
765
- return agents.filter(a => this.activeAgentNames.has(a.metadata.name));
814
+ async getActiveAgents(options = {}) {
815
+ await this.scanAndEvict(options);
816
+ const agents = [];
817
+ // Stable filenames remain distinct even if externally edited metadata
818
+ // names collide, so every active agent continues contributing policy.
819
+ for (const filename of Array.from(this.activeAgentsByFilename.keys())) {
820
+ const agent = await this.findByFilename(filename);
821
+ if (agent) {
822
+ // scanAndEvict() can discard an externally modified active agent. Its
823
+ // replacement starts inactive, so restore the lifecycle state once.
824
+ // Avoid reactivating unchanged instances: Agent.activate() advances
825
+ // session tracking and must not run on every policy/status poll.
826
+ if (agent.getStatus() !== ElementStatus.ACTIVE) {
827
+ await agent.activate();
828
+ }
829
+ agents.push(agent);
830
+ }
831
+ }
832
+ // Compatibility fallback for synthetic or legacy instances that did not
833
+ // have filename metadata when activated.
834
+ for (const name of Array.from(this.activeAgentNames)) {
835
+ const agent = await this.findByName(name);
836
+ if (!agent)
837
+ continue;
838
+ if (agent.getStatus() !== ElementStatus.ACTIVE) {
839
+ await agent.activate();
840
+ }
841
+ agents.push(agent);
842
+ }
843
+ return agents;
844
+ }
845
+ getStableFilename(agent) {
846
+ const filename = agent.filename;
847
+ return typeof filename === 'string' && filename.trim() !== ''
848
+ ? filename
849
+ : undefined;
850
+ }
851
+ removeActiveAgentIdentity(agent, identifier) {
852
+ const filename = this.getStableFilename(agent);
853
+ this.activeAgentNames.delete(agent.metadata.name);
854
+ this.activeAgentNames.delete(identifier);
855
+ if (filename) {
856
+ this.activeAgentsByFilename.delete(filename);
857
+ }
858
+ }
859
+ getActiveAgentCount() {
860
+ return this.activeAgentsByFilename.size + this.activeAgentNames.size;
766
861
  }
767
862
  /**
768
863
  * Execute an agent with goal parameters
@@ -1401,22 +1496,26 @@ export class AgentManager extends BaseElementManager {
1401
1496
  checkAndCleanupActiveSet() {
1402
1497
  const { max, cleanupThreshold } = getActiveElementLimitConfig('agents');
1403
1498
  // Below threshold — no action needed
1404
- if (this.activeAgentNames.size < cleanupThreshold) {
1499
+ const activeCount = this.getActiveAgentCount();
1500
+ if (activeCount < cleanupThreshold) {
1405
1501
  return;
1406
1502
  }
1407
1503
  // At or above max — warn before cleanup
1408
- if (this.activeAgentNames.size >= max) {
1504
+ if (activeCount >= max) {
1409
1505
  logger.warn(`Active agents limit reached (${max}). ` +
1410
1506
  `Consider deactivating unused agents or setting DOLLHOUSE_MAX_ACTIVE_AGENTS to a higher value.`);
1411
1507
  SecurityMonitor.logSecurityEvent({
1412
1508
  type: 'AGENT_ACTIVATED',
1413
1509
  severity: 'MEDIUM',
1414
1510
  source: 'AgentManager.checkAndCleanupActiveSet',
1415
- details: `Active agents limit reached (${this.activeAgentNames.size}/${max})`,
1511
+ details: `Active agents limit reached (${activeCount}/${max})`,
1416
1512
  additionalData: {
1417
- activeCount: this.activeAgentNames.size,
1513
+ activeCount,
1418
1514
  maxAllowed: max,
1419
- activeAgentNames: Array.from(this.activeAgentNames),
1515
+ activeAgentNames: [
1516
+ ...this.activeAgentsByFilename.values(),
1517
+ ...this.activeAgentNames,
1518
+ ],
1420
1519
  }
1421
1520
  });
1422
1521
  }
@@ -1430,17 +1529,24 @@ export class AgentManager extends BaseElementManager {
1430
1529
  */
1431
1530
  async cleanupStaleActiveAgents() {
1432
1531
  try {
1433
- const startSize = this.activeAgentNames.size;
1532
+ const startSize = this.getActiveAgentCount();
1434
1533
  const agents = await this.list();
1435
1534
  const existingAgentNames = new Set(agents.map(a => a.metadata.name));
1535
+ const existingAgentFilenames = new Set(agents.map(agent => this.getStableFilename(agent)).filter((filename) => Boolean(filename)));
1436
1536
  const staleNames = [];
1537
+ for (const [filename, activationName] of this.activeAgentsByFilename) {
1538
+ if (!existingAgentFilenames.has(filename)) {
1539
+ this.activeAgentsByFilename.delete(filename);
1540
+ staleNames.push(activationName);
1541
+ }
1542
+ }
1437
1543
  for (const activeName of this.activeAgentNames) {
1438
1544
  if (!existingAgentNames.has(activeName)) {
1439
1545
  this.activeAgentNames.delete(activeName);
1440
1546
  staleNames.push(activeName);
1441
1547
  }
1442
1548
  }
1443
- const endSize = this.activeAgentNames.size;
1549
+ const endSize = this.getActiveAgentCount();
1444
1550
  const removed = startSize - endSize;
1445
1551
  if (removed > 0) {
1446
1552
  logger.info(`Cleaned up ${removed} stale active agent reference(s). ` +
@@ -2700,4 +2806,4 @@ export class AgentManager extends BaseElementManager {
2700
2806
  return suggestions;
2701
2807
  }
2702
2808
  }
2703
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QmFzZUVsZW1lbnRNYW5hZ2VyXG4gKiBNYW5hZ2VzIGFnZW50IENSVUQgb3BlcmF0aW9ucywgbWV0YWRhdGEgc2FuaXRpemF0aW9uLCBhbmQgc3RhdGUgcGVyc2lzdGVuY2UuXG4gKi9cblxuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQge1xuICBDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT04sXG4gIEFHRU5UX0xJTUlUUyxcbiAgUklTS19UT0xFUkFOQ0VfTEVWRUxTLFxuICBTVEVQX0xJTUlUX0FDVElPTlMsXG4gIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMsXG4gIEJBQ0tPRkZfU1RSQVRFR0lFUyxcbiAgaXNPbmVPZixcbiAgbm9ybWFsaXplQXV0b25vbXlLZXlzLFxuICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyxcbiAgbm9ybWFsaXplR29hbEtleXMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIEFnZW50TWV0YWRhdGEsXG4gIEFnZW50U3RhdGUsXG4gIEV4ZWN1dGVBZ2VudFJlc3VsdCxcbiAgQWdlbnRHb2FsQ29uZmlnLFxuICBBZ2VudEdvYWxQYXJhbWV0ZXIsXG4gIEFnZW50TWV0YWRhdGFWMixcbiAgQWdlbnRHb2FsLFxuICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEF1dG9ub215RGlyZWN0aXZlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEdhdGhlcmVkRGF0YSwgdHlwZSBHYXRoZXJlZERhdGEgfSBmcm9tICcuL2dhdGhlcmVkRGF0YS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUF1dG9ub215IH0gZnJvbSAnLi9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQge1xuICBpc1YxQWdlbnQsXG4gIGNvbnZlcnRWMVRvVjIsXG59IGZyb20gJy4vdjFUb1YyQ29udmVydGVyLmpzJztcbmltcG9ydCB7XG4gIGRldGVybWluZVNhZmV0eVRpZXIsXG4gIGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZSxcbiAgY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdCxcbiAgY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbixcbiAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnLi9zYWZldHlUaWVyU2VydmljZS5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5wdXROb3JtYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXROb3JtYWxpemVyLmpzJztcbmltcG9ydCB7IFNhZmVSZWdleCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Rvc1Byb3RlY3Rpb24uanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuXG5jb25zdCBBR0VOVF9GSUxFX0VYVEVOU0lPTiA9ICcubWQnO1xuY29uc3QgU1RBVEVfRElSRUNUT1JZID0gJy5zdGF0ZSc7XG5jb25zdCBTVEFURV9GSUxFX0VYVEVOU0lPTiA9ICcuc3RhdGUueWFtbCc7XG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0O1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7XG5cbi8qKiBNYXRjaCB0aGUgc2FuaXRpemVkIHN0b3JhZ2UgaWRlbnRpdHkgdXNlZCBieSBhZ2VudCBkZWZpbml0aW9uIGxvb2t1cC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBZ2VudEV4ZWN1dGlvbklkZW50aXR5KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5KHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG59XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlbGVtZW50PzogQWdlbnQ7XG59XG5cbmludGVyZmFjZSBQYXJzZWRBZ2VudEZpbGUge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRmxleGlibGVSZWFkQ2FuZGlkYXRlIHtcbiAgYWdlbnQ6IEFnZW50O1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRmxleGlibGVSZWFkQ2FuZGlkYXRlcyB7XG4gIGNhbmRpZGF0ZXM6IEZsZXhpYmxlUmVhZENhbmRpZGF0ZVtdO1xuICBsb2FkRmFpbHVyZXM6IHVua25vd25bXTtcbn1cblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeSB7XG4gIHRva2VuOiBvYmplY3Q7XG4gIGFjdGl2ZUV4ZWN1dGlvbnM6IG51bWJlcjtcbiAgb2JzZXJ2ZXJzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uR2VuZXJhdGlvbk9ic2VydmF0aW9uIHtcbiAgdG9rZW46IG9iamVjdDtcbiAgcmVsZWFzZTogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBBZ2VudENyZWF0ZU1ldGFkYXRhID0gKFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4gJiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pICYge1xuICBjb250ZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIEFnZW50TWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxBZ2VudD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZTtcbiAgLyoqIFBlci1hZ2VudCB0b2tlbnMgcmV0YWluZWQgb25seSB3aGlsZSBleGVjdXRpb24gb3IgcmVjb3ZlcnkgaXMgaW4gZmxpZ2h0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvbkdlbmVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeT4oKTtcbiAgLy8gVHJhY2sgYWN0aXZlIGFnZW50cyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcilcbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVBZ2VudE5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTdGF0aWMgcmVzb2x2ZXIgZm9yIGVsZW1lbnQgbWFuYWdlciBsb29rdXAgKERJIHBhdHRlcm4pXG4gIC8vIFRoaXMgYWxsb3dzIEFnZW50IGluc3RhbmNlcyB0byByZXNvbHZlIG1hbmFnZXJzIHdpdGhvdXQgdGlnaHQgY291cGxpbmdcbiAgcHJpdmF0ZSBzdGF0aWMgZWxlbWVudE1hbmFnZXJSZXNvbHZlcj86IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgLy8gSXNzdWUgIzQwMjogU3RhdGljIHJlc29sdmVyIGZvciBEYW5nZXJab25lRW5mb3JjZXIgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIGRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPzogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXI7XG5cbiAgLy8gSXNzdWUgIzE0MjogU3RhdGljIHJlc29sdmVyIGZvciBWZXJpZmljYXRpb25TdG9yZSAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgdmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj86ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGJhc2VEaXI6IHN0cmluZyxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnREaXJPdmVycmlkZSA9IHBhdGguam9pbihiYXNlRGlyLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuQUdFTlQsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBlbGVtZW50RGlyT3ZlcnJpZGUsIGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5zdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgICB0aGlzLm1ldGFkYXRhU2VydmljZSA9IG1ldGFkYXRhU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FnZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBmb3IgZWxlbWVudC1hZ25vc3RpYyBhY3RpdmF0aW9uXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBNZW1vcnkuY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlciBGdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFuYWdlciBuYW1lIGFuZCByZXR1cm5zIHRoZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM0MDI6IFNldCBEYW5nZXJab25lRW5mb3JjZXIgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXREYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXIpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMTQyOiBTZXQgVmVyaWZpY2F0aW9uU3RvcmUgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRWZXJpZmljYXRpb25TdG9yZVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH0pOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk6ICgobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYWdlbnRzIGFuZCBzdGF0ZSBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmVsZW1lbnREaXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFnZW50IG9uIGRpc2suXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogQWdlbnRDcmVhdGVNZXRhZGF0YVxuICApOiBQcm9taXNlPEVsZW1lbnRDcmVhdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgICAgLy8gTm9ybWFsaXplIGdvYWwgaW5wdXQgYmVmb3JlIHZhbGlkYXRpb24gLSBMTE1zIG1heSBwYXNzIHN0cmluZyBvciBvYmplY3RcbiAgICAgIC8vIFN0cmlwICdjb250ZW50JyBmcm9tIG1ldGFkYXRhIHRvIHByZXZlbnQgaXQgZnJvbSBvdmVyd3JpdGluZyB0aGUgcG9zaXRpb25hbFxuICAgICAgLy8gY29udGVudCBwYXJhbSAod2hpY2ggaXMgdGhlIGFnZW50J3MgaW5zdHJ1Y3Rpb25zIHRleHQpIGluIHRoZSB2YWxpZGF0aW9uIGNhbGwuXG4gICAgICBjb25zdCB7IGNvbnRlbnQ6IHJlZmVyZW5jZUNvbnRlbnQsIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnQgfSA9IG1ldGFkYXRhID8/IHt9O1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gPSB7XG4gICAgICAgIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnRcbiAgICAgIH07XG4gICAgICBpZiAobWV0YWRhdGE/LmdvYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3JtYWxpemVkTWV0YWRhdGEuZ29hbCA9IHRoaXMubm9ybWFsaXplR29hbElucHV0KFxuICAgICAgICAgIG1ldGFkYXRhLmdvYWwgYXMgc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb24uXG4gICAgICAvLyBBZ2VudHMgc3VwcG9ydCBkdWFsLWZpZWxkIGNyZWF0aW9uOiBiZWhhdmlvcmFsIGluc3RydWN0aW9ucyBhbmQgb3B0aW9uYWxcbiAgICAgIC8vIHJlZmVyZW5jZSBjb250ZW50LiBWYWxpZGF0aW9uIHByZWZlcnMgYmVoYXZpb3JhbCBpbnN0cnVjdGlvbnMgd2hlbiBib3RoXG4gICAgICAvLyBmaWVsZHMgYXJlIHByZXNlbnQgc28gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24tZmlyc3QgYWdlbnRzIGtlZXAgdGhlaXJcbiAgICAgIC8vIGN1cnJlbnQgc2VtYW50aWNzIHdoaWxlIGNvbnRlbnQtb25seSBhZ2VudHMgc3RpbGwgdmFsaWRhdGUgY29ycmVjdGx5LlxuICAgICAgY29uc3QgdmFsaWRhdGlvbklucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIC4uLm5vcm1hbGl6ZWRNZXRhZGF0YVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByaW1hcnlUZXh0ID0gdGhpcy5nZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudCwgcmVmZXJlbmNlQ29udGVudCk7XG4gICAgICB2YWxpZGF0aW9uSW5wdXQuY29udGVudCA9IHByaW1hcnlUZXh0ID8/ICcnO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHZhbGlkYXRpb25JbnB1dCk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgaW5wdXRzIGZvciBlbGVtZW50IGNyZWF0aW9uXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCk7XG4gICAgICAvLyBVc2UgQ29udGVudFZhbGlkYXRvciBmb3IgbXVsdGktbGluZSBjb250ZW50IHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgKG5ld2xpbmVzLCB0YWJzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgZGV0ZWN0aW5nIHByb21wdCBpbmplY3Rpb24gYXR0YWNrc1xuICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJztcblxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBhZ2VudCBuYW1lLiBVc2Ugb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICAgIC4uLm5vcm1hbGl6ZWRNZXRhZGF0YSxcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgICB9LCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAgIGFnZW50Lm1ldGFkYXRhLmF1dGhvciA9IG5vcm1hbGl6ZWRNZXRhZGF0YT8uYXV0aG9yID8/IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBub3JtYWxpemVkTWV0YWRhdGE/LnNwZWNpYWxpemF0aW9ucyA/PyBhZ2VudC5leHRlbnNpb25zPy5zcGVjaWFsaXphdGlvbnMgPz8gW10sXG4gICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiBub3JtYWxpemVkTWV0YWRhdGE/LmRlY2lzaW9uRnJhbWV3b3JrID8/IGFnZW50LmV4dGVuc2lvbnM/LmRlY2lzaW9uRnJhbWV3b3JrLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiBub3JtYWxpemVkTWV0YWRhdGE/LnJpc2tUb2xlcmFuY2UgPz8gYWdlbnQuZXh0ZW5zaW9ucz8ucmlza1RvbGVyYW5jZSxcbiAgICAgICAgbGVhcm5pbmdFbmFibGVkOiBub3JtYWxpemVkTWV0YWRhdGE/LmxlYXJuaW5nRW5hYmxlZCA/PyBhZ2VudC5leHRlbnNpb25zPy5sZWFybmluZ0VuYWJsZWQsXG4gICAgICB9O1xuICAgICAgLy8gUHJvbW90ZSBpbnN0cnVjdGlvbnMgdG8gZmlyc3QtY2xhc3MgcHJvcGVydHkgKG5vIGxvbmdlciBpbiBleHRlbnNpb25zKVxuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgLy8gQWxzbyBrZWVwIGluIGV4dGVuc2lvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdCBkdXJpbmcgdHJhbnNpdGlvblxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG5cbiAgICAgIC8vIFNldCByZWZlcmVuY2UgY29udGVudCBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlQ29udGVudCA9PT0gJ3N0cmluZycgJiYgcmVmZXJlbmNlQ29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShcbiAgICAgICAgICByZWZlcmVuY2VDb250ZW50LFxuICAgICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29udGVudFZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBWYWxpZGF0aW9uIGZhaWxlZDogJHsoY29udGVudFZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucyB8fCBbJ0NvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQnXSkuam9pbignLCAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBhZ2VudC5jb250ZW50ID0gY29udGVudFZhbGlkYXRpb25SZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCAnJztcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzcyNzogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBWMiBmaWVsZHMgQkVGT1JFIGFzc2lnbm1lbnQuXG4gICAgICAvLyBUaGlzIGlzIHRoZSBTRUNPTkQgdmFsaWRhdGlvbiBsYXllciDigJQgQWdlbnRFbGVtZW50VmFsaWRhdG9yIChjYWxsZWQgYWJvdmUgdmlhXG4gICAgICAvLyB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSkgaXMgdGhlIGZpcnN0LiBUaGUgdmFsaWRhdG9yIGNhdGNoZXMgY2FtZWxDYXNlXG4gICAgICAvLyBpbnZhbGlkIHZhbHVlczsgdGhpcyBtZXRob2QgYWxzbyBub3JtYWxpemVzIHNuYWtlX2Nhc2Uga2V5cyAod2hpY2ggdGhlIHZhbGlkYXRvclxuICAgICAgLy8gZG9lc24ndCBzZWUpIGFuZCB2YWxpZGF0ZXMgdGhlbS4gQm90aCBsYXllcnMgYXJlIG5lZWRlZC4gU2VlIElzc3VlICM3MzAuXG4gICAgICBjb25zdCBtZXRhZGF0YVYyID0gbm9ybWFsaXplZE1ldGFkYXRhIGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtZXRhZGF0YVYyKSB7XG4gICAgICAgIGNvbnN0IHYyRXJyb3JzID0gdGhpcy52YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhVjIpO1xuICAgICAgICBpZiAodjJFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBWMiBmaWVsZCB2YWxpZGF0aW9uIGZhaWxlZDogJHt2MkVycm9ycy5qb2luKCc7ICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFYyIEZJRUxEUzogU3RvcmUgVjItc3BlY2lmaWMgZmllbGRzIGluIGFnZW50IG1ldGFkYXRhIChub3QganVzdCBleHRlbnNpb25zKVxuICAgICAgLy8gVGhpcyBlbmFibGVzIFYyIGFnZW50IGNyZWF0aW9uIHZpYSBNQ1AtQVFMIGNyZWF0ZV9lbGVtZW50IG9wZXJhdGlvblxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmdvYWwpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5hY3RpdmF0ZXMpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYWN0aXZhdGVzID0gbWV0YWRhdGFWMi5hY3RpdmF0ZXM7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8udG9vbHMpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikudG9vbHMgPSBtZXRhZGF0YVYyLnRvb2xzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnN5c3RlbVByb21wdCkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5hdXRvbm9teSkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5hdXRvbm9teSA9IG1ldGFkYXRhVjIuYXV0b25vbXk7XG4gICAgICB9XG4gICAgICAvLyBJc3N1ZSAjNDQ5OiBQZXJzaXN0IGdhdGVrZWVwZXIgcG9saWN5IGZvciBHYXRla2VlcGVyIGVuZm9yY2VtZW50IGR1cmluZyBleGVjdXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nYXRla2VlcGVyKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdhdGVrZWVwZXIgPSBtZXRhZGF0YVYyLmdhdGVrZWVwZXI7XG4gICAgICB9XG4gICAgICAvLyBJc3N1ZSAjNzIyOiBQZXJzaXN0IHJlc2lsaWVuY2UgcG9saWN5ICh3YXMgbWlzc2luZyBmcm9tIFYyIGZpZWxkIGFzc2lnbm1lbnRzKVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnJlc2lsaWVuY2UpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikucmVzaWxpZW5jZSA9IG1ldGFkYXRhVjIucmVzaWxpZW5jZTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzYxMzogQ2hlY2sgbWV0YWRhdGEgbmFtZSB1bmlxdWVuZXNzIChub3QganVzdCBmaWxlbmFtZSlcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ0FnZW50cy5maW5kKGEgPT5cbiAgICAgICAgYS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHNhbml0aXplZE5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJpYWxpemUgdGhlIGFnZW50IGNvbnRlbnQgZmlyc3RcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRDb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGFnZW50KTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG5cbiAgICAgIC8vIFVzZSBhdG9taWMgZmlsZSBjcmVhdGlvbiB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGNoZWNrLXRoZW4td3JpdGUgcGF0dGVybiB3aXRoIGEgc2luZ2xlIGF0b21pYyBvcGVyYXRpb25cbiAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZUZpbGVFeGNsdXNpdmUoYWJzb2x1dGVQYXRoLCBzZXJpYWxpemVkQ29udGVudCwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENhY2hlIHRoZSBlbGVtZW50IGFmdGVyIHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGFnZW50LCBmaWxlbmFtZSk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChmaWxlbmFtZSwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIGNhY2hlRWxlbWVudCgpIHN0b3JlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuXG4gICAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBjcmVhdGVkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgYWdlbnRJZDogYWdlbnQuaWQgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGDwn6SWICoqJHtzYW5pdGl6ZWROYW1lfSoqIGJ5ICR7YWdlbnQubWV0YWRhdGEuYXV0aG9yIHx8ICdhbm9ueW1vdXMnfWAsXG4gICAgICAgIGVsZW1lbnQ6IGFnZW50XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYWdlbnQgYnkgbmFtZSAod2l0aG91dCBleHRlbnNpb24pLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFnZW50IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKiBAcmV0dXJucyBBZ2VudCBpbnN0YW5jZSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgYXN5bmMgcmVhZChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRXaXRoU3RhdGVQb2xpY3kobmFtZSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYWdlbnQgd2hpbGUgc2VsZWN0aW5nIHdoZXRoZXIgc3RhdGUtc3RvcmFnZSBmYWlsdXJlcyBhcmUgZmF0YWwuXG4gICAqIFNlY3VyaXR5LXNlbnNpdGl2ZSBjYWxsZXJzIHVzZSBzdHJpY3Qgc3RhdGUgcmVhZHMgc28gdW5hdmFpbGFibGUgZHVyYWJsZVxuICAgKiBzdGF0ZSBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIGFuIGFnZW50IHdpdGggbm8gYWN0aXZlIGdvYWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkV2l0aFN0YXRlUG9saWN5KG5hbWU6IHN0cmluZywgc3RyaWN0U3RhdGVFcnJvcnM6IGJvb2xlYW4pOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZEFnZW50RmlsZShmaWxlbmFtZSwgdHJ1ZSwgc3RyaWN0U3RhdGVFcnJvcnMsICFzdHJpY3RTdGF0ZUVycm9ycyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBGYWxsYmFjazogZmxleGlibGUgbWF0Y2hpbmcgdmlhIGxpc3Qgc2NhbiAoIzYwNylcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZsZXhpYmx5KG5hbWUsIHN0cmljdFN0YXRlRXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayBmb3IgcmVhZCgpIHdoZW4gZGlyZWN0IGZpbGUgbG9va3VwIGZhaWxzLlxuICAgKiBTZWFyY2hlcyBsb2FkZWQgYWdlbnRzIGJ5IG1ldGFkYXRhIG5hbWUgdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgc2x1ZyBtYXRjaGluZy5cbiAgICogTG9ncyBhIHdhcm5pbmcgd2hlbiBhIG1hdGNoIGlzIGZvdW5kIChpbmRpY2F0ZXMgZmlsZW5hbWUvbmFtZSBtaXNtYXRjaCBuZWVkaW5nIGNsZWFudXApLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGaWxlIG9uIGRpc2s6IFwibGVnYWN5LXBvc3Rlci1hZ2VudC5tZFwiXG4gICAqIC8vIE1ldGFkYXRhIG5hbWU6IFwibGVnYWN5LXBvc3RlclwiXG4gICAqIC8vIERpcmVjdCBsb29rdXAgZm9yIFwibGVnYWN5LXBvc3Rlci5tZFwiIGZhaWxzIChFTk9FTlQpXG4gICAqIC8vIEZsZXhpYmxlIGZhbGxiYWNrIG1hdGNoZXMgdmlhIG1ldGFkYXRhIG5hbWU6XG4gICAqIGNvbnN0IGFnZW50ID0gYXdhaXQgcmVhZChcImxlZ2FjeS1wb3N0ZXJcIik7IC8vIHJlc29sdmVzIHZpYSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkRmxleGlibHkobmFtZTogc3RyaW5nLCBzdHJpY3RTdGF0ZUVycm9ycyA9IGZhbHNlKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBjYW5kaWRhdGVzLCBsb2FkRmFpbHVyZXMgfSA9IGF3YWl0IHRoaXMubGlzdEZvckZsZXhpYmxlUmVhZChzdHJpY3RTdGF0ZUVycm9ycyk7XG5cbiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgc2VhcmNoU2x1ZyA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG5cbiAgICAgIC8vIFBhc3MgMTogZXhhY3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBvbiBtZXRhZGF0YSBuYW1lXG4gICAgICBsZXQgbWF0Y2ggPSBjYW5kaWRhdGVzLmZpbmQoXG4gICAgICAgICh7IGFnZW50IH0pID0+IGFnZW50Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gY2FuZGlkYXRlcy5maW5kKCh7IGFnZW50IH0pID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhZ2VudC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gc2x1ZyA9PT0gc2VhcmNoU2x1ZyB8fCBzbHVnID09PSBzZWFyY2hMb3dlcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAvLyBTdHJpY3QgcmVjb3ZlcnkgdmVyaWZpZXMgdGhlIGNhbGxlci1yZXF1ZXN0ZWQgaWRlbnRpdHkuIE9yZGluYXJ5IGxlZ2FjeVxuICAgICAgICAvLyByZWFkcyBwcmVzZXJ2ZSB0aGUgc3RhdGUgaWRlbnRpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXRjaGVkIGZpbGUuXG4gICAgICAgIGNvbnN0IHN0YXRlSWRlbnRpdHkgPSBzdHJpY3RTdGF0ZUVycm9ycyA/IG5hbWUgOiB0aGlzLnN0cmlwRXh0ZW5zaW9uKG1hdGNoLmZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkU3RhdGVGb3VuZCA9IGF3YWl0IHRoaXMuaHlkcmF0ZUFnZW50U3RhdGUoXG4gICAgICAgICAgbWF0Y2guYWdlbnQsXG4gICAgICAgICAgc3RhdGVJZGVudGl0eSxcbiAgICAgICAgICBzdHJpY3RTdGF0ZUVycm9ycyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0cmljdFN0YXRlRXJyb3JzICYmICFyZXF1ZXN0ZWRTdGF0ZUZvdW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCB2ZXJpZnkgZHVyYWJsZSBzdGF0ZSBmb3IgZmxleGlibHkgbWF0Y2hlZCBhZ2VudCBcIiR7bmFtZX1cIiB1bmRlciBpdHMgcmVxdWVzdGVkIGlkZW50aXR5YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFnZW50IFwiJHtuYW1lfVwiIHJlc29sdmVkIHZpYSBmbGV4aWJsZSBtYXRjaGluZyB0byBmaWxlIHdpdGggbWV0YWRhdGEgbmFtZSBcIiR7bWF0Y2guYWdlbnQubWV0YWRhdGEubmFtZX1cIi4gYCArXG4gICAgICAgICAgYENvbnNpZGVyIHJlbmFtaW5nIHRoZSBmaWxlIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBjb252ZW50aW9uICgjNjA3KS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtYXRjaC5hZ2VudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvYWRGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IGxvYWRGYWlsdXJlc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCAobG9va3VwRXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bG9va3VwRXJyb3J9YCk7XG4gICAgICB0aHJvdyBsb29rdXBFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW51bWVyYXRlIGZhbGxiYWNrIGNhbmRpZGF0ZXMgd2l0aG91dCBjcmVhdGluZyBtaXNzaW5nIHN0b3JhZ2UuIFN0cmljdFxuICAgKiByZWNvdmVyeSBwcm9wYWdhdGVzIGxpc3RpbmcgZmFpbHVyZXM7IG9yZGluYXJ5IHJlYWRzIHJldGFpbiB0aGUgcG9ydGZvbGlvXG4gICAqIEFQSSdzIGVtcHR5LWRpcmVjdG9yeSBhbmQgdW5hdmFpbGFibGUtZGlyZWN0b3J5IGNvbXBhdGliaWxpdHkgYmVoYXZpb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RGb3JGbGV4aWJsZVJlYWQoc3RyaWN0U3RhdGVFcnJvcnM6IGJvb2xlYW4pOiBQcm9taXNlPEZsZXhpYmxlUmVhZENhbmRpZGF0ZXM+IHtcbiAgICBjb25zdCBmaWxlcyA9IHN0cmljdFN0YXRlRXJyb3JzXG4gICAgICA/IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoRWxlbWVudFR5cGUuQUdFTlQsIHsgdGhyb3dPbkZpbGVzeXN0ZW1FcnJvcjogdHJ1ZSB9KVxuICAgICAgOiBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKEVsZW1lbnRUeXBlLkFHRU5UKTtcbiAgICAvLyBMb2FkIGRlZmluaXRpb25zIHdpdGhvdXQgY2FuZGlkYXRlLWZpbGVuYW1lIHN0YXRlLiBPbmNlIGEgbWF0Y2ggaXMga25vd24sXG4gICAgLy8gcmVhZEZsZXhpYmx5KCkgaHlkcmF0ZXMgaXQgdXNpbmcgdGhlIHJlcXVlc3RlZCBsb2dpY2FsIGlkZW50aXR5LlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBmaWxlcy5tYXAoZmlsZSA9PiB0aGlzLmxvYWRBZ2VudEZpbGUoZmlsZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpXG4gICAgKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzOiBGbGV4aWJsZVJlYWRDYW5kaWRhdGVzID0ge1xuICAgICAgY2FuZGlkYXRlczogW10sXG4gICAgICBsb2FkRmFpbHVyZXM6IFtdXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCByZXN1bHRdIG9mIHJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5jYW5kaWRhdGVzLnB1c2goeyBhZ2VudDogcmVzdWx0LnZhbHVlLCBmaWxlUGF0aDogZmlsZXNbaW5kZXhdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5sb2FkRmFpbHVyZXMucHVzaChyZXN1bHQucmVhc29uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWV0YWRhdGEvY29udGVudCBmb3IgYW4gZXhpc3RpbmcgYWdlbnQuXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4sXG4gICAgY29udGVudD86IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHNhbml0aXplZE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCBub3QgZm91bmQgZm9yIHVwZGF0ZTogJHtuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGVkaXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUVkaXQoYWdlbnQsIHtcbiAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICBjb250ZW50XG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBBZ2VudCB1cGRhdGUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgQWdlbnQgdXBkYXRlIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoXG4gICAgICAgIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVwZGF0ZXMuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICA1MDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogdXBkYXRlcy5zcGVjaWFsaXphdGlvbnMubWFwKGl0ZW0gPT4gc2FuaXRpemVJbnB1dChpdGVtLCA1MCkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiB1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgcmlza1RvbGVyYW5jZTogdXBkYXRlcy5yaXNrVG9sZXJhbmNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmxlYXJuaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLm1heENvbmN1cnJlbnRHb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5tZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSB1cGRhdGVzLm1heENvbmN1cnJlbnRHb2FscztcbiAgICB9XG5cbiAgICBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpKTtcbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgdXBkYXRlZDogJHtzYW5pdGl6ZWROYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcHJvdmlkZWQgYWdlbnQgbmFtZS5cbiAgICovXG4gIHZhbGlkYXRlTmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgYmUgZW1wdHknIH07XG4gICAgfVxuXG4gICAgaWYgKG5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gYWdlbnQgZnJvbSBzZXJpYWxpemVkIGNvbnRlbnQuXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VKc29uKGRhdGEsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHBhcnNlZC5tZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgICAgaWYgKHBhcnNlZC5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShwYXJzZWQpKTtcbiAgICAgIH1cbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogcGFyc2VkLmluc3RydWN0aW9ucyB8fCAnJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG5cbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChyZXN1bHQuZGF0YSBhcyBBZ2VudE1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBhZ2VudCB0byBKU09OIG9yIG1hcmtkb3duIChkZWZhdWx0KS5cbiAgICovXG4gIGFzeW5jIGV4cG9ydEVsZW1lbnQoYWdlbnQ6IEFnZW50LCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBhZ2VudC5zZXJpYWxpemVUb0pTT04oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVFbGVtZW50KGFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGFnZW50IGZpbGUsIGVuZm9yY2luZyBzaXplIGFuZCBmb3JtYXQgY2hlY2tzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRBZ2VudEZpbGUoZmlsZVBhdGgsIHRydWUsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50RmlsZShcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGh5ZHJhdGVTdGF0ZTogYm9vbGVhbixcbiAgICBzdHJpY3RTdGF0ZUVycm9yczogYm9vbGVhbixcbiAgICBjYWNoZUxvYWRlZEVsZW1lbnQgPSB0cnVlLFxuICApOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgaWYgKGh5ZHJhdGVTdGF0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKFxuICAgICAgICAgIGFnZW50LFxuICAgICAgICAgIHRoaXMuc3RyaXBFeHRlbnNpb24ocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgICBzdHJpY3RTdGF0ZUVycm9ycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYWNoZUxvYWRlZEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGAsXG4gICAgICAgIGRldGFpbHM6IGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gbG9hZGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgZnJvbSAke2Z1bGxQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgQmFzZUVsZW1lbnRNYW5hZ2VyLnNhdmUgdG8gcGVyc2lzdCBzdGF0ZSB3aGVuIHJlcXVpcmVkLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2F2ZShhZ2VudDogQWdlbnQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcbiAgICBhd2FpdCBzdXBlci5zYXZlKGFnZW50LCBzYW5pdGl6ZWRQYXRoKTtcblxuICAgIGlmIChhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUodGhpcy5zdHJpcEV4dGVuc2lvbihzYW5pdGl6ZWRQYXRoKSwgYWdlbnQuZ2V0U3RhdGUoKSk7XG4gICAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pOyAgLy8gU3luYyBhZ2VudCdzIGludGVybmFsIHZlcnNpb24gKElzc3VlICMxMjMgZml4KVxuICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYWdlbnQgc3RhdGUgdG8gZGlzayAocHVibGljIEFQSSBmb3IgZXh0ZXJuYWwgY2FsbGVycykuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBwcm9wZXIgd2F5IGZvciBleHRlcm5hbCBjb2RlIChzdHJhdGVnaWVzLCBoYW5kbGVycykgdG9cbiAgICogdHJpZ2dlciBzdGF0ZSBwZXJzaXN0ZW5jZS4gSXQgaW1wbGVtZW50cyB0aGUgT3B0aW9uIEMgcGF0dGVybiBmcm9tIElzc3VlICMxMjM6XG4gICAqIHN0YXRlVmVyc2lvbiBpcyBvbmx5IGluY3JlbWVudGVkIG9uIHN1Y2Nlc3NmdWwgc2F2ZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBBZ2VudCBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj4gLSBUcnVlIGlmIHN0YXRlIHdhcyBwZXJzaXN0ZWQsIGZhbHNlIGlmIG5vdCBuZWVkZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBhZ2VudCBub3QgZm91bmQgb3Igc2F2ZSBmYWlsc1xuICAgKi9cbiAgYXN5bmMgcGVyc2lzdFN0YXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgbm90IGZvdW5kOiAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKG5hbWUsIGFnZW50LmdldFN0YXRlKCkpO1xuICAgIGFnZW50W0NPTU1JVF9QRVJTSVNURURfVkVSU0lPTl0obmV3VmVyc2lvbik7XG4gICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIHJlbW92ZSBhc3NvY2lhdGVkIHN0YXRlIGZpbGUuXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIHRvIGVuc3VyZSBzdGF0ZSBmaWxlIGRlbGV0aW9uIG1hdGNoZXNcbiAgICogdGhlIG5vcm1hbGl6ZWQgZmlsZW5hbWUgdXNlZCBmb3Igc3RhdGUgZmlsZSBjcmVhdGlvbi9sb2FkaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5zdHJpcEV4dGVuc2lvbihzYW5pdGl6ZWRQYXRoKTtcbiAgICBhd2FpdCBzdXBlci5kZWxldGUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgZGVsZXRpb25cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhY2sgdXAgdGhlIHN0YXRlIGZpbGUgYmVmb3JlIGRlbGV0aW5nIGl0XG4gICAgICBpZiAodGhpcy5iYWNrdXBTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVEZWxldGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm1vdmVkT3JpZ2luYWwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZSAoc3RhdGUgZmlsZSknXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShzdGF0ZVBhdGgsIEVsZW1lbnRUeXBlLkFHRU5ULCB7XG4gICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZSAoc3RhdGUgZmlsZSknXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgY2FjaGUgY2xlYW51cFxuICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSlcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAxMDApKTtcbiAgICByZXR1cm4gc3VwZXIuZXhpc3RzKHNhbml0aXplZFBhdGgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmFsaWRhdGVQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0YXJnZXRQYXRoLmluY2x1ZGVzKCcuLicpIHx8IHRhcmdldFBhdGguaW5jbHVkZXMoJ34nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0UGF0aC5zdGFydHNXaXRoKCcvJykgfHwgL15bQS1aYS16XTovLnRlc3QodGFyZ2V0UGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFHRU5UX0ZJTEVfRVhURU5TSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGxpc3QgdG8gYXBwbHkgYWN0aXZlIHN0YXR1cyBiYXNlZCBvbiBhY3RpdmVBZ2VudE5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBBcHBseSBhY3RpdmUgc3RhdHVzIHRvIGFnZW50cyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldCAoYnkgbmFtZSlcbiAgICBmb3IgKGNvbnN0IGFnZW50IG9mIGFnZW50cykge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5oYXMoYWdlbnQubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGFnZW50IHRvIHNldCBzdGF0dXMgdG8gQUNUSVZFXG4gICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBhZ2VudCBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgYWdlbnQ/OiBBZ2VudCB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTUVNT1JZIExFQUsgRklYOiBDaGVjayBpZiBjbGVhbnVwIGlzIG5lZWRlZCBiZWZvcmUgYWRkaW5nXG4gICAgdGhpcy5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTtcblxuICAgIC8vIEFkZCB0byBhY3RpdmUgc2V0IChieSBuYW1lLCB3aGljaCBpcyBzdGFibGUgYWNyb3NzIHJlbG9hZHMpXG4gICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmFkZChhZ2VudC5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBhZ2VudCBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgYWdlbnQuYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmFjdGl2YXRlQWdlbnQnLFxuICAgICAgZGV0YWlsczogYEFnZW50IGFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGdvYWxDb3VudDogKGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuZ29hbD8ucGFyYW1ldGVycz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogYWdlbnQubWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IGFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSksXG4gICAgICBhZ2VudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhbiBhZ2VudCBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVBZ2VudChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkFHRU5ULCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBhY3RpdmUgc2V0XG4gICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhZ2VudC5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBhZ2VudCBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0FHRU5UX0RFQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWFjdGl2YXRlQWdlbnQnLFxuICAgICAgZGV0YWlsczogYEFnZW50IGRlYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmRlYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkFHRU5ULCBhZ2VudC5tZXRhZGF0YS5uYW1lKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgYWdlbnRzXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maWx0ZXIoYSA9PiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGEubWV0YWRhdGEubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYW4gYWdlbnQgd2l0aCBnb2FsIHBhcmFtZXRlcnNcbiAgICpcbiAgICogUmV0dXJucyBjb250ZXh0IGZvciBMTE0gdG8gZHJpdmUgdGhlIGFnZW50aWMgbG9vcC5cbiAgICogVGhpcyBtZXRob2Q6XG4gICAqIDEuIExvYWRzIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uXG4gICAqIDIuIFZhbGlkYXRlcyBhbmQgcmVuZGVycyB0aGUgZ29hbCB0ZW1wbGF0ZSB3aXRoIHBhcmFtZXRlcnNcbiAgICogMy4gQWN0aXZhdGVzIGNvbmZpZ3VyZWQgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIDQuIEV2YWx1YXRlcyBwcm9ncmFtbWF0aWMgY29uc3RyYWludHMgYW5kIHJpc2tcbiAgICogNS4gUmV0dXJucyBzdHJ1Y3R1cmVkIGNvbnRleHQgZm9yIExMTVxuICAgKlxuICAgKiBUaGUgTExNIHRoZW4gZHJpdmVzIHRoZSBhZ2VudGljIGxvb3AgdXNpbmcgdGhpcyBjb250ZXh0LlxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBleGVjdXRlQWdlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC8vIFRocmVhZCB0aGUgdHJpZ2dlcmluZyBNQ1AgbGlmZWN5Y2xlIG9wIHRocm91Z2ggdmFsaWRhdGlvbiBzbyBlcnJvciBtZXNzYWdlc1xuICAgIC8vIGNhbiBkaXN0aW5ndWlzaCBhIGZyZXNoIGV4ZWN1dGVfYWdlbnQgY2FsbCBmcm9tIGEgbWlzdXNlZCBjb250aW51ZV9leGVjdXRpb24uXG4gICAgY29udGV4dDoge1xuICAgICAgb3BlcmF0aW9uTmFtZT86ICdleGVjdXRlX2FnZW50JyB8ICdjb250aW51ZV9leGVjdXRpb24nO1xuICAgIH0gPSB7fVxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIC8vIE11c3QgaGFwcGVuIGJlZm9yZSBhbnkgYXdhaXQgc28gcmVjb3Zlcnkgc2VlcyBzdGFydHMgZnJvbSBNQ1AtQVFMLCBsZWdhY3lcbiAgICAvLyB0b29scywgYW5kIGFueSBmdXR1cmUgY2FsbGVyIHRoYXQgdXNlcyB0aGUgc2hhcmVkIG1hbmFnZXIgZW50cnkgcG9pbnQuXG4gICAgdGhpcy5iZWdpbkV4ZWN1dGlvbkF0dGVtcHQobmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IG1ldGFkYXRhIGFzIHYyIChtYXkgaGF2ZSBnb2FsIGNvbmZpZylcbiAgICAgIGxldCBtZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHYyLjAgYWdlbnQgd2l0aCBnb2FsIGNvbmZpZ3VyYXRpb25cbiAgICAgIC8vIElmIG5vdCwgYXV0by1jb252ZXJ0IFYxIHRvIFYyIGluIHBsYWNlIChJc3N1ZSAjNTg3KVxuICAgICAgaWYgKCFtZXRhZGF0YS5nb2FsIHx8ICFtZXRhZGF0YS5nb2FsLnRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChpc1YxQWdlbnQobWV0YWRhdGEpKSB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYWdlbnQuZXh0ZW5zaW9ucz8uaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHQgPSBjb252ZXJ0VjFUb1YyKG1ldGFkYXRhLCBpbnN0cnVjdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKGNvbnZlcnNpb25SZXN1bHQuY29udmVydGVkKSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBjb252ZXJ0ZWQgbWV0YWRhdGEgb250byB0aGUgZXhpc3RpbmcgYWdlbnQgKGluLXBsYWNlKVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGFnZW50Lm1ldGFkYXRhLCBjb252ZXJzaW9uUmVzdWx0Lm1ldGFkYXRhKTtcblxuICAgICAgICAgICAgLy8gTG9nIGNvbnZlcnNpb24gd2FybmluZ3NcbiAgICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyBhdXRvLWNvbnZlcnRlZCBmcm9tIFYxIHRvIFYyIGluIHBsYWNlYCwge1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBjb252ZXJzaW9uUmVzdWx0Lndhcm5pbmdzLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdXBncmFkZWQgYWdlbnQgYmFjayB0byBpdHMgb3JpZ2luYWwgZmlsZVxuICAgICAgICAgICAgY29uc3QgdXBncmFkZWRGaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChuYW1lLCAxMDApKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdXBncmFkZWRGaWxlbmFtZSk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgQWdlbnQgJyR7bmFtZX0nIGNvbnZlcnRlZCBmcm9tIFYxIHRvIFYyIGFuZCBzYXZlZCBpbiBwbGFjZWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBZ2VudCAnJHtuYW1lfScgY2Fubm90IGJlIGV4ZWN1dGVkOiBtaXNzaW5nIGdvYWwudGVtcGxhdGUgYW5kIGNvbnZlcnNpb24gZmFpbGVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtuYW1lfScgaXMgbm90IGEgdjIuMCBhZ2VudC4gTWlzc2luZyBnb2FsLnRlbXBsYXRlIGNvbmZpZ3VyYXRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2xvbmUgcGFyYW1ldGVycyB0byBwcmV2ZW50IG11dGF0aW9uIG9mIGNhbGxlcidzIG9iamVjdCAoSXNzdWUgIzExOClcbiAgICAgIGNvbnN0IGNsb25lZFBhcmFtZXRlcnMgPSBzdHJ1Y3R1cmVkQ2xvbmUocGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDJiLiBTZWN1cml0eSB2YWxpZGF0aW9uIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgKElzc3VlICMxMDMpXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1ldGVyU2VjdXJpdHkoY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDMuIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsLnBhcmFtZXRlcnMgc2NoZW1hXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1ldGVycyhtZXRhZGF0YS5nb2FsLCBjbG9uZWRQYXJhbWV0ZXJzLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogY29udGV4dC5vcGVyYXRpb25OYW1lID8/ICdleGVjdXRlX2FnZW50JyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyA0LiBSZW5kZXIgZ29hbCB0ZW1wbGF0ZSBieSByZXBsYWNpbmcge3BhcmFtZXRlcn0gcGxhY2Vob2xkZXJzXG4gICAgICBjb25zdCByZW5kZXJlZEdvYWwgPSB0aGlzLnJlbmRlckdvYWxUZW1wbGF0ZShtZXRhZGF0YS5nb2FsLnRlbXBsYXRlLCBjbG9uZWRQYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gNGIuIERldGVjdCB1bm1hdGNoZWQgcGxhY2Vob2xkZXJzIGFmdGVyIHJlbmRlcmluZyAoSXNzdWUgIzEyNilcbiAgICAgIGNvbnN0IHVubWF0Y2hlZFBsYWNlaG9sZGVycyA9IHRoaXMuZGV0ZWN0VW5tYXRjaGVkUGxhY2Vob2xkZXJzKHJlbmRlcmVkR29hbCk7XG4gICAgICBpZiAodW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1VubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnMgZGV0ZWN0ZWQgYWZ0ZXIgcmVuZGVyaW5nJywge1xuICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICB1bm1hdGNoZWQ6IHVubWF0Y2hlZFBsYWNlaG9sZGVycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIENyZWF0ZSBleGVjdXRpb24gY29udGV4dCBCRUZPUkUgYWN0aXZhdGluZyBlbGVtZW50cyAoSXNzdWUgIzEwOSAtIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uKVxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQobmFtZSk7XG5cbiAgICAgIC8vIDViLiBTdGF0aWMgYWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gKElzc3VlICMzNzQpXG4gICAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzPy5hZ2VudHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjeWNsZVBhdGggPSBhd2FpdCB0aGlzLmRldGVjdEFjdGl2YXRpb25DeWNsZXMobmFtZSwgbWV0YWRhdGEuYWN0aXZhdGVzLmFnZW50cyk7XG4gICAgICAgIGlmIChjeWNsZVBhdGgpIHtcbiAgICAgICAgICBjb25zdCBjeWNsZVN0YXJ0ID0gY3ljbGVQYXRoLmluZGV4T2YoY3ljbGVQYXRoW2N5Y2xlUGF0aC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgY29uc3QgY3ljbGUgPSBjeWNsZVBhdGguc2xpY2UoY3ljbGVTdGFydCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEFnZW50TWFuYWdlci5mb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIEFjdGl2YXRlIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHM6IFJlY29yZDxzdHJpbmcsIEFycmF5PHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4+ID0ge307XG4gICAgICBjb25zdCBhY3RpdmF0aW9uV2FybmluZ3M6IEFycmF5PHsgZWxlbWVudFR5cGU6IHN0cmluZzsgZWxlbWVudE5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2VsZW1lbnRUeXBlLCBlbGVtZW50TmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnROYW1lcyB8fCBlbGVtZW50TmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudE5hbWUgb2YgZWxlbWVudE5hbWVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudENvbnRlbnQoZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBleGVjdXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudHNbZWxlbWVudFR5cGVdLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnRDb250ZW50XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSElHSC0xOiBSZS10aHJvdyBjaXJjdWxhciBhY3RpdmF0aW9uIGVycm9ycyBpbW1lZGlhdGVseSAoSXNzdWUgIzEwOSlcbiAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2lyY3VsYXIgYWdlbnQgYWN0aXZhdGlvbiBkZXRlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3MucHVzaCh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TmFtZSwgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JzogZmFpbGVkIHRvIGFjdGl2YXRlICR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScg4oCUICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGVsZW1lbnRzIHJhdGhlciB0aGFuIGZhaWxpbmcgY29tcGxldGVseVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA3LiBCdWlsZCB0aGUgcmVzdWx0IHdpdGggYWxsIGNvbnRleHQgKGluaXRpYWxpemUgd2l0aCBkZWZhdWx0IHNhZmV0eSB0aWVyKVxuICAgICAgY29uc3QgcmVzdWx0OiBFeGVjdXRlQWdlbnRSZXN1bHQgPSB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgZ29hbDogcmVuZGVyZWRHb2FsLFxuICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgYWN0aXZhdGlvbldhcm5pbmdzOiBhY3RpdmF0aW9uV2FybmluZ3MubGVuZ3RoID4gMCA/IGFjdGl2YXRpb25XYXJuaW5ncyA6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gSXNzdWUgIzEyNjogV2FybiBhYm91dCB1bm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXJzXG4gICAgICAgIHRlbXBsYXRlV2FybmluZ3M6IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB1bm1hdGNoZWRQbGFjZWhvbGRlcnMubWFwKHAgPT4gYFVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcjogeyR7cH19YClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhaWxhYmxlVG9vbHM6IG1ldGFkYXRhLnRvb2xzPy5hbGxvd2VkIHx8IFtdLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhIHx8IFtdLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IG1ldGFkYXRhLnN5c3RlbVByb21wdCxcbiAgICAgICAgc2FmZXR5VGllcjogJ2Fkdmlzb3J5JywgLy8gRGVmYXVsdCwgd2lsbCBiZSB1cGRhdGVkIGJlbG93XG4gICAgICB9O1xuXG4gICAgICAvLyA4LiBDcmVhdGUgYW5kIHBlcnNpc3QgdGhlIGdvYWwgZm9yIExMTSB0cmFja2luZ1xuICAgICAgLy8gVGhpcyBhbGxvd3MgcmVjb3JkX2FnZW50X3N0ZXAgdG8gZmluZCBhbmQgdXBkYXRlIHRoZSBnb2FsXG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZ29hbCB1c2luZyBhZ2VudC5hZGRHb2FsKCkgd2hpY2ggaGFuZGxlcyB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb25cbiAgICAgIGNvbnN0IG5ld0dvYWwgPSBhZ2VudC5hZGRHb2FsKHtcbiAgICAgICAgZGVzY3JpcHRpb246IHJlbmRlcmVkR29hbCxcbiAgICAgICAgcHJpb3JpdHk6ICdtZWRpdW0nLFxuICAgICAgICBpbXBvcnRhbmNlOiA1LFxuICAgICAgICB1cmdlbmN5OiA1LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBnb2FsIHN0YXR1cyB0byBpbl9wcm9ncmVzcyBzaW5jZSBleGVjdXRpb24gaGFzIHN0YXJ0ZWRcbiAgICAgIG5ld0dvYWwuc3RhdHVzID0gJ2luX3Byb2dyZXNzJztcblxuICAgICAgY29uc3QgZXhlY1Nhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoZXhlY1Nhbml0aXplZE5hbWUpKTtcblxuICAgICAgLy8gU3RvcmUgZ29hbElkIGluIHJlc3VsdCBmb3IgTExNIHRvIHVzZSB3aXRoIHJlY29yZF9hZ2VudF9zdGVwXG4gICAgICByZXN1bHQuZ29hbElkID0gbmV3R29hbC5pZDtcblxuICAgICAgLy8gRml4ICM0NDU6IEluY2x1ZGUgc3RhdGVWZXJzaW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIGRvIHZlcnNpb24tYXdhcmUgb3BlcmF0aW9uc1xuICAgICAgY29uc3QgcG9zdFNhdmVTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgICByZXN1bHQuc3RhdGVWZXJzaW9uID0gcG9zdFNhdmVTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMTtcblxuICAgICAgLy8gQ2FsbCB2YWxpZGF0ZUdvYWxTZWN1cml0eSBhbmQgYWRkIHdhcm5pbmdzIHRvIHJlc3VsdFxuICAgICAgY29uc3Qgc2VjdXJpdHlWYWxpZGF0aW9uID0gYWdlbnQudmFsaWRhdGVHb2FsU2VjdXJpdHkocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmIChzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MgJiYgc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LnNlY3VyaXR5V2FybmluZ3MgPSBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3M7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgZXZhbHVhdGVDb25zdHJhaW50cyBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LmNvbnN0cmFpbnRzID0gYWdlbnQuZXZhbHVhdGVDb25zdHJhaW50cyhuZXdHb2FsKTtcblxuICAgICAgLy8gQ2FsbCBhc3Nlc3NSaXNrIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQgPSBhZ2VudC5hc3Nlc3NSaXNrKCdleGVjdXRlJywgbmV3R29hbCwge30pO1xuXG4gICAgICAvLyBDYWxsIGNhbGN1bGF0ZVByaW9yaXR5U2NvcmUgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5wcmlvcml0eVNjb3JlID0gYWdlbnQuY2FsY3VsYXRlUHJpb3JpdHlTY29yZShuZXdHb2FsKTtcblxuICAgICAgLy8gOS4gRGV0ZXJtaW5lIHNhZmV0eSB0aWVyIGJhc2VkIG9uIHJpc2sgYXNzZXNzbWVudCBhbmQgc2VjdXJpdHkgd2FybmluZ3NcbiAgICAgIC8vIChOb3RlOiBleGVjdXRpb25Db250ZXh0IGFscmVhZHkgY3JlYXRlZCBlYXJsaWVyIGZvciBjaXJjdWxhciBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBzYWZldHlUaWVyUmVzdWx0ID0gZGV0ZXJtaW5lU2FmZXR5VGllcihcbiAgICAgICAgcmVzdWx0LnJpc2tBc3Nlc3NtZW50Py5zY29yZSB8fCAwLFxuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyB8fCBbXSxcbiAgICAgICAgcmVuZGVyZWRHb2FsLFxuICAgICAgICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHRcbiAgICAgICk7XG5cbiAgICAgIC8vIDEwLiBTZXQgc2FmZXR5IHRpZXIgYW5kIHJlbGF0ZWQgZmllbGRzXG4gICAgICByZXN1bHQuc2FmZXR5VGllciA9IHNhZmV0eVRpZXJSZXN1bHQudGllcjtcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyUmVzdWx0ID0gc2FmZXR5VGllclJlc3VsdDtcbiAgICAgIHJlc3VsdC5leGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgLy8gMTEuIEFkZCB0aWVyLXNwZWNpZmljIHJlc3BvbnNlc1xuICAgICAgc3dpdGNoIChzYWZldHlUaWVyUmVzdWx0LnRpZXIpIHtcbiAgICAgICAgY2FzZSAnY29uZmlybSc6XG4gICAgICAgICAgcmVzdWx0LmNvbmZpcm1hdGlvblJlcXVpcmVkID0gY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdChcbiAgICAgICAgICAgICdPcGVyYXRpb24gcmVxdWlyZXMgY29uZmlybWF0aW9uJyxcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAndmVyaWZ5JzpcbiAgICAgICAgICByZXN1bHQudmVyaWZpY2F0aW9uUmVxdWlyZWQgPSBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UoXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgICdkaXNwbGF5X2NvZGUnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdkYW5nZXJfem9uZSc6XG4gICAgICAgICAgcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkID0gY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbihcbiAgICAgICAgICAgICdhZ2VudF9leGVjdXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzLmpvaW4oJzsgJyksXG4gICAgICAgICAgICBERUZBVUxUX1NBRkVUWV9DT05GSUcuZGFuZ2VyWm9uZS5lbmFibGVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBbHNvIGFkZCB2ZXJpZmljYXRpb24gaWYgbm90IGJsb2NrZWRcbiAgICAgICAgICBpZiAoIXJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC5ibG9ja2VkKSB7XG4gICAgICAgICAgICByZXN1bHQudmVyaWZpY2F0aW9uUmVxdWlyZWQgPSByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQudmVyaWZpY2F0aW9uUmVxdWlyZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fkdmlzb3J5JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIGFjdGlvbiBuZWVkZWQgZm9yIGFkdmlzb3J5IHRpZXJcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfRVhFQ1VURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5leGVjdXRlQWdlbnQnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgZXhlY3V0ZWQ6ICR7bmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9IChzYWZldHk6ICR7c2FmZXR5VGllclJlc3VsdC50aWVyfSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICAgIHNhZmV0eVRpZXI6IHNhZmV0eVRpZXJSZXN1bHQudGllcixcbiAgICAgICAgICByaXNrU2NvcmU6IHNhZmV0eVRpZXJSZXN1bHQucmlza1Njb3JlLFxuICAgICAgICAgIHBhcmFtZXRlcktleXM6IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMgfHwge30pLFxuICAgICAgICAgIGdvYWxDb3VudDogKG1ldGFkYXRhIGFzIGFueSkuZ29hbD8ucGFyYW1ldGVycz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBleGVjdXRlIGFnZW50ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lbmRFeGVjdXRpb25BdHRlbXB0KG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBIb2xkIGEgYm91bmRlZCBvYnNlcnZhdGlvbiBsZWFzZSB3aGlsZSBzdGFsZS1wb2xpY3kgcmVjb3ZlcnkgaXMgaW4gZmxpZ2h0LiAqL1xuICBvYnNlcnZlRXhlY3V0aW9uR2VuZXJhdGlvbihuYW1lOiBzdHJpbmcpOiBFeGVjdXRpb25HZW5lcmF0aW9uT2JzZXJ2YXRpb24ge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmdldE9yQ3JlYXRlRXhlY3V0aW9uR2VuZXJhdGlvbihrZXkpO1xuICAgIGVudHJ5Lm9ic2VydmVycyArPSAxO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiBlbnRyeS50b2tlbixcbiAgICAgIHJlbGVhc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKHJlbGVhc2VkKSByZXR1cm47XG4gICAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgZW50cnkub2JzZXJ2ZXJzIC09IDE7XG4gICAgICAgIHRoaXMuY2xlYW51cEV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5LCBlbnRyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBoYXNFeGVjdXRpb25HZW5lcmF0aW9uQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9ic2VydmVkVG9rZW46IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5leGVjdXRpb25HZW5lcmF0aW9ucy5nZXQobm9ybWFsaXplQWdlbnRFeGVjdXRpb25JZGVudGl0eShuYW1lKSk7XG4gICAgcmV0dXJuICFlbnRyeSB8fCBlbnRyeS5hY3RpdmVFeGVjdXRpb25zID4gMCB8fCBlbnRyeS50b2tlbiAhPT0gb2JzZXJ2ZWRUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5FeGVjdXRpb25BdHRlbXB0KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmdldE9yQ3JlYXRlRXhlY3V0aW9uR2VuZXJhdGlvbihrZXkpO1xuICAgIGVudHJ5LnRva2VuID0ge307XG4gICAgZW50cnkuYWN0aXZlRXhlY3V0aW9ucyArPSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRFeGVjdXRpb25BdHRlbXB0KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmV4ZWN1dGlvbkdlbmVyYXRpb25zLmdldChrZXkpO1xuICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICBlbnRyeS5hY3RpdmVFeGVjdXRpb25zID0gTWF0aC5tYXgoMCwgZW50cnkuYWN0aXZlRXhlY3V0aW9ucyAtIDEpO1xuICAgIHRoaXMuY2xlYW51cEV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5LCBlbnRyeSk7XG4gIH1cblxuICBwcml2YXRlIGdldE9yQ3JlYXRlRXhlY3V0aW9uR2VuZXJhdGlvbihrZXk6IHN0cmluZyk6IEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeSB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5leGVjdXRpb25HZW5lcmF0aW9ucy5nZXQoa2V5KTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBlbnRyeSA9IHsgdG9rZW46IHt9LCBhY3RpdmVFeGVjdXRpb25zOiAwLCBvYnNlcnZlcnM6IDAgfTtcbiAgICAgIHRoaXMuZXhlY3V0aW9uR2VuZXJhdGlvbnMuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBFeGVjdXRpb25HZW5lcmF0aW9uKGtleTogc3RyaW5nLCBlbnRyeTogRXhlY3V0aW9uR2VuZXJhdGlvbkVudHJ5KTogdm9pZCB7XG4gICAgaWYgKGVudHJ5LmFjdGl2ZUV4ZWN1dGlvbnMgPT09IDAgJiYgZW50cnkub2JzZXJ2ZXJzID09PSAwKSB7XG4gICAgICB0aGlzLmV4ZWN1dGlvbkdlbmVyYXRpb25zLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNIaWdoT3JDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb250ZXh0OiB7XG4gICAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBvcGVyYXRpb25OYW1lPzogJ2V4ZWN1dGVfYWdlbnQnIHwgJ2NvbnRpbnVlX2V4ZWN1dGlvbic7XG4gICAgfSA9IHt9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtRGVmcyA9IGdvYWxDb25maWcucGFyYW1ldGVycyB8fCBbXTtcbiAgICBjb25zdCByZXF1aXJlZFBhcmFtTmFtZXMgPSBwYXJhbURlZnNcbiAgICAgIC5maWx0ZXIocGFyYW1EZWYgPT4gcGFyYW1EZWYucmVxdWlyZWQpXG4gICAgICAubWFwKHBhcmFtRGVmID0+IHBhcmFtRGVmLm5hbWUpO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcbiAgICBjb25zdCBtaXNzaW5nUmVxdWlyZWQgPSByZXF1aXJlZFBhcmFtTmFtZXMuZmlsdGVyKHBhcmFtTmFtZSA9PiAhKHBhcmFtTmFtZSBpbiBwYXJhbWV0ZXJzKSk7XG4gICAgaWYgKG1pc3NpbmdSZXF1aXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHRoaXMuZm9ybWF0TWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyc0Vycm9yKFxuICAgICAgICAgIG1pc3NpbmdSZXF1aXJlZCxcbiAgICAgICAgICByZXF1aXJlZFBhcmFtTmFtZXMsXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFR5cGUgY2hlY2sgcHJvdmlkZWQgcGFyYW1ldGVyc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICBjb25zdCBwYXJhbURlZiA9IHBhcmFtRGVmcy5maW5kKHAgPT4gcC5uYW1lID09PSBrZXkpO1xuICAgICAgaWYgKCFwYXJhbURlZikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBwYXJhbWV0ZXIgJyR7a2V5fScgcHJvdmlkZWQgdG8gYWdlbnRgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUgdmFsaWRhdGlvblxuICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnc3RyaW5nJyAmJiBhY3R1YWxUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnbnVtYmVyJyAmJiBhY3R1YWxUeXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgbnVtYmVyLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnYm9vbGVhbicgJiYgYWN0dWFsVHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWR2aXNvcnkgbGVuZ3RoIHdhcm5pbmcgZm9yIHN0cmluZyB2YWx1ZXMgKGRlZmVuc2UtaW4tZGVwdGgsIGRvZXMgbm90IHRocm93KVxuICAgICAgaWYgKGFjdHVhbFR5cGUgPT09ICdzdHJpbmcnICYmICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1BhcmFtZXRlciBzdHJpbmcgdmFsdWUgZXhjZWVkcyBNQVhfR09BTF9MRU5HVEggKGFkdmlzb3J5KScsIHtcbiAgICAgICAgICBwYXJhbU5hbWU6IGtleSxcbiAgICAgICAgICB2YWx1ZUxlbmd0aDogKHZhbHVlIGFzIHN0cmluZykubGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIHBhcmFtZXRlcnMgbm90IHByb3ZpZGVkXG4gICAgZm9yIChjb25zdCBwYXJhbURlZiBvZiBwYXJhbURlZnMpIHtcbiAgICAgIGlmICghcGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpICYmIHBhcmFtRGVmLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbWV0ZXJzW3BhcmFtRGVmLm5hbWVdID0gcGFyYW1EZWYuZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gYWN0aW9uYWJsZSBtaXNzaW5nLXBhcmFtZXRlciBlcnJvciBmb3IgZXhlY3V0ZS9jb250aW51ZSBjYWxscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyc0Vycm9yKFxuICAgIG1pc3NpbmdSZXF1aXJlZDogc3RyaW5nW10sXG4gICAgcmVxdWlyZWRQYXJhbU5hbWVzOiBzdHJpbmdbXSxcbiAgICBjb250ZXh0OiB7XG4gICAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBvcGVyYXRpb25OYW1lPzogJ2V4ZWN1dGVfYWdlbnQnIHwgJ2NvbnRpbnVlX2V4ZWN1dGlvbic7XG4gICAgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50U3VmZml4ID0gY29udGV4dC5hZ2VudE5hbWUgPyBgIGZvciBhZ2VudCAnJHtjb250ZXh0LmFnZW50TmFtZX0nYCA6ICcnO1xuICAgIGxldCBtZXNzYWdlID1cbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMke2FnZW50U3VmZml4fTogJHttaXNzaW5nUmVxdWlyZWQuam9pbignLCAnKX0uYDtcblxuICAgIGlmIChyZXF1aXJlZFBhcmFtTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWVzc2FnZSArPSBgIFJlcXVpcmVkIGdvYWwgcGFyYW1ldGVyczogJHtyZXF1aXJlZFBhcmFtTmFtZXMuam9pbignLCAnKX0uYDtcbiAgICB9XG5cbiAgICBtZXNzYWdlICs9ICcgRGlzY292ZXIgdGhlIGZ1bGwgZXhlY3V0aW9uIGNvbnRyYWN0IHZpYSBtY3BfYXFsX3JlYWQgaW50cm9zcGVjdDogJyArXG4gICAgICAneyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH0uJztcblxuICAgIGlmIChjb250ZXh0Lm9wZXJhdGlvbk5hbWUgPT09ICdjb250aW51ZV9leGVjdXRpb24nKSB7XG4gICAgICBtZXNzYWdlICs9ICcgSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvZ3Jlc3MgYWZ0ZXIgZXhlY3V0ZV9hZ2VudCwgdXNlICcgK1xuICAgICAgICAnbWNwX2FxbF9jcmVhdGUgcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIGluc3RlYWQuIGNvbnRpbnVlX2V4ZWN1dGlvbiBpcyBvbmx5ICcgK1xuICAgICAgICAnZm9yIHJlc3VtaW5nIGEgcHJldmlvdXNseSBwYXVzZWQgZXhlY3V0aW9uIGFuZCBzdGlsbCByZXF1aXJlcyB0aGUgc2FtZSAnICtcbiAgICAgICAgJ2dvYWwgcGFyYW1ldGVycyBhcyBleGVjdXRlX2FnZW50Lic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGdvYWwgdGVtcGxhdGUgYnkgcmVwbGFjaW5nIHtwYXJhbWV0ZXJ9IHBsYWNlaG9sZGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJHb2FsVGVtcGxhdGUoXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBzdHJpbmcge1xuICAgIGxldCByZW5kZXJlZCA9IHRlbXBsYXRlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICAvLyBFc2NhcGUga2V5IHRvIHByZXZlbnQgcmVnZXggbWV0YWNoYXJhY3RlcnMgZnJvbSBjYXVzaW5nIFJlRG9TIChJc3N1ZSAjMTAzKVxuICAgICAgY29uc3QgZXNjYXBlZEtleSA9IFNhZmVSZWdleC5lc2NhcGUoa2V5KTtcbiAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxceyR7ZXNjYXBlZEtleX1cXFxcfWAsICdnJyksIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8vIENhcCByZW5kZXJlZCBnb2FsIGxlbmd0aCB0byBwcmV2ZW50IG92ZXJzaXplZCBwYXlsb2Fkc1xuICAgIGlmIChyZW5kZXJlZC5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RIKSB7XG4gICAgICBsb2dnZXIud2FybignUmVuZGVyZWQgZ29hbCBleGNlZWRzIE1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCwgdHJ1bmNhdGluZycsIHtcbiAgICAgICAgcmVuZGVyZWRMZW5ndGg6IHJlbmRlcmVkLmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RILFxuICAgICAgfSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnN1YnN0cmluZygwLCBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RIKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHVubWF0Y2hlZCB7cGxhY2Vob2xkZXJ9IHBhdHRlcm5zIHJlbWFpbmluZyBhZnRlciB0ZW1wbGF0ZSByZW5kZXJpbmcuXG4gICAqIFJldHVybnMgYXJyYXkgb2YgcGxhY2Vob2xkZXIgbmFtZXMgZm91bmQgaW4gdGhlIHJlbmRlcmVkIHN0cmluZy5cbiAgICogSXNzdWUgIzEyNjogV2FybiB3aGVuIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFVubWF0Y2hlZFBsYWNlaG9sZGVycyhyZW5kZXJlZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUGF0dGVybiA9IC9cXHsoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXH0vZztcbiAgICBjb25zdCB1bm1hdGNoZWQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIHdoaWxlICgobWF0Y2ggPSBwbGFjZWhvbGRlclBhdHRlcm4uZXhlYyhyZW5kZXJlZCkpICE9PSBudWxsKSB7XG4gICAgICB1bm1hdGNoZWQucHVzaChtYXRjaFsxXSk7XG4gICAgfVxuICAgIHJldHVybiB1bm1hdGNoZWQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZSBmb3IgY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24uXG4gICAqIFVzZWQgYnkgYm90aCB0aGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgYW5kIHRoZSBydW50aW1lIGNoYWluIGNoZWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGVQYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgYWdlbnROYW1lID0gY3ljbGVQYXRoW2N5Y2xlUGF0aC5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gKFxuICAgICAgYENpcmN1bGFyIGFnZW50IGFjdGl2YXRpb24gZGV0ZWN0ZWQgKGN5Y2xlIG9mICR7Y3ljbGVQYXRoLmxlbmd0aCAtIDF9KTogYCArXG4gICAgICBgJHtjeWNsZVBhdGguam9pbignIOKGkiAnKX0uIGAgK1xuICAgICAgYEFnZW50ICcke2FnZW50TmFtZX0nIGNhbm5vdCBhY3RpdmF0ZSBpdHNlbGYgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTYWZldHkgbGltaXRzIGZvciBhY3RpdmF0aW9uIGdyYXBoIHRyYXZlcnNhbCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQUNUSVZBVElPTl9ERVBUSCA9IDEwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTk9ERVNfVklTSVRFRCA9IDEwMDtcblxuICAvKipcbiAgICogU3RhdGljIGFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIOKAlCBMYXllciAxIG9mIGR1YWwtZGV0ZWN0aW9uIHN0cmF0ZWd5IChJc3N1ZSAjMzc0KVxuICAgKlxuICAgKiBQZXJmb3JtcyBhc3luYyBERlMgb24gdGhlIGFjdGl2YXRpb24gZ3JhcGggdG8gZGV0ZWN0IGN5Y2xlcyBCRUZPUkUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICogVGhpcyBpcyBhIHByZS1mbGlnaHQgY2hlY2sgdGhhdCBwcmV2ZW50cyBjaXJjdWxhciBhY3RpdmF0aW9uIGNoYWlucyBmcm9tIGJlaW5nIGF0dGVtcHRlZC5cbiAgICpcbiAgICogTGF5ZXIgMSAodGhpcyBtZXRob2QpOiBTdGF0aWMgZ3JhcGggYW5hbHlzaXMg4oCUIHdhbGtzIHRoZSBhY3RpdmF0aW9uIGdyYXBoIGZyb20gdGhlIHJvb3RcbiAgICogYWdlbnQsIGxvYWRpbmcgZWFjaCBhZ2VudCdzIGBhY3RpdmF0ZXMuYWdlbnRzYCBtZXRhZGF0YS4gQ2F0Y2hlcyBhbGwgY3ljbGVzIHJlYWNoYWJsZVxuICAgKiBmcm9tIHRoZSByb290IHdpdGhvdXQgZXhlY3V0aW5nIGFueSBhZ2VudHMuIEJvdW5kZWQgYnkgTUFYX0FDVElWQVRJT05fREVQVEggYW5kXG4gICAqIE1BWF9OT0RFU19WSVNJVEVEIHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvbiBmcm9tIGxhcmdlIGFjeWNsaWMgZ3JhcGhzLlxuICAgKlxuICAgKiBMYXllciAyIChnZXRFbGVtZW50Q29udGVudCBydW50aW1lIGNoZWNrKTogRGVmZW5zZS1pbi1kZXB0aCDigJQgZ3VhcmRzIGFnYWluc3QgZWRnZSBjYXNlc1xuICAgKiBsaWtlIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICogY2hlY2sgYW5kIGFjdHVhbCBleGVjdXRpb24uIFNlZSBnZXRFbGVtZW50Q29udGVudCBmb3IgZGV0YWlscy5cbiAgICpcbiAgICogQHBhcmFtIHJvb3ROYW1lIC0gVGhlIHJvb3QgYWdlbnQgbmFtZSBpbml0aWF0aW5nIHRoZSBhY3RpdmF0aW9uIGNoYWluXG4gICAqIEBwYXJhbSBhY3RpdmF0ZWRBZ2VudHMgLSBUaGUgaW1tZWRpYXRlIGFnZW50cyBhY3RpdmF0ZWQgYnkgdGhlIHJvb3RcbiAgICogQHJldHVybnMgVGhlIGN5Y2xlIHBhdGggYXJyYXkgaWYgYSBjeWNsZSBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdEFjdGl2YXRpb25DeWNsZXMoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICBhY3RpdmF0ZWRBZ2VudHM6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgLy8gQ2FjaGUgbG9hZGVkIGFnZW50cyB0byBhdm9pZCByZWR1bmRhbnQgSS9PIGR1cmluZyBERlNcbiAgICBjb25zdCBhZ2VudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdIHwgbnVsbD4oKTtcblxuICAgIC8vIEhlbHBlcjogbG9hZCBhbiBhZ2VudCdzIGFjdGl2YXRlcy5hZ2VudHMgbGlzdCAoY2FjaGVkKVxuICAgIGNvbnN0IGdldEFjdGl2YXRlZEFnZW50cyA9IGFzeW5jIChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChhZ2VudENhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIGFnZW50Q2FjaGUuZ2V0KGNhY2hlS2V5KSB8fCBbXTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyByZWZlcmVuY2VkIGluIGFjdGl2YXRlcy5hZ2VudHMgY291bGQgbm90IGJlIHJlc29sdmVkIGR1cmluZyBjeWNsZSBkZXRlY3Rpb25gKTtcbiAgICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgIGNvbnN0IGFnZW50cyA9IG1ldGEuYWN0aXZhdGVzPy5hZ2VudHMgfHwgW107XG4gICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBhZ2VudHMpO1xuICAgICAgICByZXR1cm4gYWdlbnRzO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBUcmFja3Mgbm9kZXMgd2hvc2UgZW50aXJlIHN1YnRyZWUgaGFzIGJlZW4gZXhwbG9yZWQgd2l0aG91dCBmaW5kaW5nIGEgY3ljbGUuXG4gICAgLy8gUHJldmVudHMgZXhwb25lbnRpYWwgcmUtZXhwbG9yYXRpb24gaW4gZGlhbW9uZC9jb252ZXJnZW50IGdyYXBocy5cbiAgICBjb25zdCBmdWxseUV4cGxvcmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IG5vZGVzVmlzaXRlZCA9IDA7XG5cbiAgICAvLyBERlMg4oCUIHN0YWNrIGVudHJpZXM6IFtjdXJyZW50QWdlbnQsIHBhdGhTb0ZhciwgcGF0aFNldExvd2VyXVxuICAgIC8vIHBhdGhTZXRMb3dlciBpcyBhIFNldDxzdHJpbmc+IG9mIGxvd2VyY2FzZWQgbmFtZXMgZm9yIE8oMSkgY3ljbGUgY2hlY2tzXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFtzdHJpbmcsIHN0cmluZ1tdLCBTZXQ8c3RyaW5nPl0+ID0gW107XG5cbiAgICBjb25zdCByb290TG93ZXIgPSByb290TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgYWN0aXZhdGVkQWdlbnRzKSB7XG4gICAgICAvLyBTZWxmLWxvb3A6IGFnZW50IGRpcmVjdGx5IGFjdGl2YXRlcyBpdHNlbGZcbiAgICAgIGlmIChjaGlsZC50b0xvd2VyQ2FzZSgpID09PSByb290TG93ZXIpIHtcbiAgICAgICAgcmV0dXJuIFtyb290TmFtZSwgY2hpbGRdO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aFNldCA9IG5ldyBTZXQ8c3RyaW5nPihbcm9vdExvd2VyLCBjaGlsZC50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICBzdGFjay5wdXNoKFtjaGlsZCwgW3Jvb3ROYW1lLCBjaGlsZF0sIHBhdGhTZXRdKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW2N1cnJlbnQsIGN1cnJlbnRQYXRoLCBwYXRoU2V0XSA9IHN0YWNrLnBvcCgpITtcblxuICAgICAgbm9kZXNWaXNpdGVkKys7XG4gICAgICBpZiAobm9kZXNWaXNpdGVkID4gQWdlbnRNYW5hZ2VyLk1BWF9OT0RFU19WSVNJVEVEKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBhYm9ydGVkOiBleGNlZWRlZCAke0FnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRH0gbm9kZXMgdmlzaXRlZC4gYCArXG4gICAgICAgICAgYFRoZSBhY3RpdmF0aW9uIGdyYXBoIG1heSBiZSB0b28gbGFyZ2UuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA+IEFnZW50TWFuYWdlci5NQVhfQUNUSVZBVElPTl9ERVBUSCArIDEpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIGZvciAnJHtyb290TmFtZX0nIGhpdCBkZXB0aCBsaW1pdCBvZiAke0FnZW50TWFuYWdlci5NQVhfQUNUSVZBVElPTl9ERVBUSH0uIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBkZWVwZXIgYnJhbmNoZXMuYFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudExvd2VyID0gY3VycmVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZ1bGx5RXhwbG9yZWQuaGFzKGN1cnJlbnRMb3dlcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhpcyBhZ2VudCdzIGFjdGl2YXRpb25zXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IGdldEFjdGl2YXRlZEFnZW50cyhjdXJyZW50KTtcblxuICAgICAgbGV0IGZvdW5kQ3ljbGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgY2hpbGRMb3dlciA9IGNoaWxkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xlOiBkb2VzIHRoaXMgY2hpbGQgYXBwZWFyIGVhcmxpZXIgaW4gdGhlIHBhdGg/XG4gICAgICAgIGlmIChwYXRoU2V0LmhhcyhjaGlsZExvd2VyKSkge1xuICAgICAgICAgIHJldHVybiBbLi4uY3VycmVudFBhdGgsIGNoaWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZnVsbHlFeHBsb3JlZC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICBjb25zdCBuZXdQYXRoU2V0ID0gbmV3IFNldChwYXRoU2V0KTtcbiAgICAgICAgICBuZXdQYXRoU2V0LmFkZChjaGlsZExvd2VyKTtcbiAgICAgICAgICBzdGFjay5wdXNoKFtjaGlsZCwgWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF0sIG5ld1BhdGhTZXRdKTtcbiAgICAgICAgICBmb3VuZEN5Y2xlID0gdHJ1ZTsgLy8gaGFzIGNoaWxkcmVuIHRvIGV4cGxvcmUsIG5vdCBmdWxseSBleHBsb3JlZCB5ZXRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyB1bmV4cGxvcmVkIGNoaWxkcmVuLCB0aGlzIG5vZGUncyBzdWJ0cmVlIGlzIGN5Y2xlLWZyZWVcbiAgICAgIGlmICghZm91bmRDeWNsZSkge1xuICAgICAgICBmdWxseUV4cGxvcmVkLmFkZChjdXJyZW50TG93ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb250ZW50IGZyb20gYW4gZWxlbWVudCAoZWxlbWVudC1hZ25vc3RpYylcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RWxlbWVudENvbnRlbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBFeGVjdXRpb25Db250ZXh0XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gR2V0IHRoZSBzdGF0aWMgcmVzb2x2ZXJcbiAgICBjb25zdCByZXNvbHZlciA9IEFnZW50TWFuYWdlci5nZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk7XG4gICAgaWYgKCFyZXNvbHZlcikge1xuICAgICAgbG9nZ2VyLndhcm4oYEVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCAtIGNhbm5vdCBhY3RpdmF0ZSAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfWApO1xuICAgICAgcmV0dXJuIGBbRWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkIGZvciAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfV1gO1xuICAgIH1cblxuICAgIC8vIExheWVyIDIgKGRlZmVuc2UtaW4tZGVwdGgpOiBSdW50aW1lIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uIChJc3N1ZSAjMTA5KVxuICAgIC8vIFRoZSBzdGF0aWMgcHJlLWZsaWdodCBjaGVjayAoZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcywgbGF5ZXIgMSkgY2F0Y2hlcyBtb3N0IGN5Y2xlc1xuICAgIC8vIGJlZm9yZSBleGVjdXRpb24gYmVnaW5zLiBUaGlzIHJ1bnRpbWUgY2hlY2sgZ3VhcmRzIGFnYWluc3QgZWRnZSBjYXNlcyBzdWNoIGFzXG4gICAgLy8gZHluYW1pY2FsbHktY29uc3RydWN0ZWQgYWN0aXZhdGlvbiBjaGFpbnMgb3IgYWdlbnRzIG1vZGlmaWVkIGJldHdlZW4gdGhlIHN0YXRpY1xuICAgIC8vIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBVc2VzIGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiB3aGljaCB0cmFja3MgdGhlXG4gICAgLy8gY3VycmVudCBleGVjdXRpb24gcGF0aCDigJQgZWZmZWN0aXZlIGZvciBkaXJlY3QgYW5kIG11bHRpLWhvcCBjaGFpbnMgd2l0aGluIGFcbiAgICAvLyBzaW5nbGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSAnYWdlbnRzJyAmJiBleGVjdXRpb25Db250ZXh0Py5hZ2VudENoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblNldCA9IG5ldyBTZXQoZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluLm1hcChuYW1lID0+IG5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBlbGVtZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoY2hhaW5TZXQuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgICBjb25zdCBjeWNsZVBhdGggPSBbLi4uZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluLCBlbGVtZW50TmFtZV07XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihBZ2VudE1hbmFnZXIuZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE1hcCBwbHVyYWwgZWxlbWVudCB0eXBlcyB0byBtYW5hZ2VyIG5hbWVzXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgcGVyc29uYXM6ICdQZXJzb25hTWFuYWdlcicsXG4gICAgICAgIHNraWxsczogJ1NraWxsTWFuYWdlcicsXG4gICAgICAgIG1lbW9yaWVzOiAnTWVtb3J5TWFuYWdlcicsXG4gICAgICAgIHRlbXBsYXRlczogJ1RlbXBsYXRlTWFuYWdlcicsXG4gICAgICAgIGVuc2VtYmxlczogJ0Vuc2VtYmxlTWFuYWdlcicsXG4gICAgICAgIGFnZW50czogJ0FnZW50TWFuYWdlcidcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmFnZXJOYW1lID0gbWFuYWdlck5hbWVNYXBbZWxlbWVudFR5cGVdO1xuICAgICAgaWYgKCFtYW5hZ2VyTmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIHJldHVybiBgW1Vua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYW5hZ2VyID0gcmVzb2x2ZXIobWFuYWdlck5hbWUpO1xuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBNYW5hZ2VyIG5vdCBmb3VuZCBmb3IgZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtNYW5hZ2VyIG5vdCBmb3VuZDogJHttYW5hZ2VyTmFtZX1dYDtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGFsbCBlbGVtZW50cyBvZiB0aGlzIHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG4gICAgICAvLyBJc3N1ZSAjMjQzMjogYWN0aXZhdGVzOiByZWZlcmVuY2VzIHVzZSBjYW5vbmljYWwgZmlsZW5hbWUgc2x1Z3MgKGUuZy5cbiAgICAgIC8vICdzZWN1cml0eS1hbmFseXN0JywgJ2J1Zy1yZXBvcnQnKSB3aGlsZSBlbGVtZW50IG1ldGFkYXRhIGNhcnJpZXMgZGlzcGxheVxuICAgICAgLy8gbmFtZXMgKCdTZWN1cml0eSBBbmFseXN0JywgJ0J1Z1JlcG9ydCcpLiBFeGFjdC1uYW1lIG1hdGNoZXMgd2luIGFjcm9zcyB0aGVcbiAgICAgIC8vIGZ1bGwgbGlzdDsgb3RoZXJ3aXNlIGJvdGggc2lkZXMgbWFwIHRocm91Z2ggdGhlIHNhbWUgc2x1ZyBkZXJpdmF0aW9uXG4gICAgICAvLyBnZXRFbGVtZW50RmlsZW5hbWUoKSB1c2VzIHdoZW4gc2F2aW5nIOKAlCBub3JtYWxpemVGaWxlbmFtZSB3aXRoIGl0c1xuICAgICAgLy8gZW1wdHktcmVzdWx0ICd1bm5hbWVkJyBmYWxsYmFjayDigJQgc28gYSByZWZlcmVuY2UgcmVzb2x2ZXMgZXhhY3RseSB3aGVuIGl0XG4gICAgICAvLyBtYXRjaGVzIHRoZSBlbGVtZW50J3Mgb24tZGlzayBmaWxlbmFtZSAoaW5jbHVkaW5nIGNhbWVsQ2FzZSBzcGxpdHMgYW5kXG4gICAgICAvLyBzZXBhcmF0b3Itb25seSBuYW1lcyBsaWtlICctLS0nIHRoYXQgc2F2ZSBhcyB1bm5hbWVkLm1kKS5cbiAgICAgIGNvbnN0IGNhbm9uaWNhbFNsdWcgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkgfHwgJ3VubmFtZWQnO1xuICAgICAgLy8gVGhlICd1bm5hbWVkJyBmYWxsYmFjayBhcHBsaWVzIG9ubHkgdG8gY2FuZGlkYXRlIGVsZW1lbnRzIChtaXJyb3JpbmcgaG93XG4gICAgICAvLyB0aGV5IHdlcmUgc2F2ZWQpLiBBIHJlZmVyZW5jZSB0aGF0IGlzIGVtcHR5IG9yIG5vcm1hbGl6ZXMgdG8gbm90aGluZ1xuICAgICAgLy8gKCcnLCAnICAgJywgJy0tLScpIGNhbiBuZXZlciBuYW1lIGEgc2F2ZWQgZmlsZSDigJQgdmFsaWRhdGVBY3RpdmF0ZXMoKSBvbmx5XG4gICAgICAvLyB3YXJucyBvbiBzdWNoIGVudHJpZXMsIHNvIGV4Y2x1ZGUgdGhlbSBoZXJlIG9yIHRoZXkgd291bGQgcmlkZSB0aGVcbiAgICAgIC8vIGZhbGxiYWNrIG9udG8gYXJiaXRyYXJ5IHNlcGFyYXRvci1vbmx5LW5hbWVkIGVsZW1lbnRzLlxuICAgICAgY29uc3QgdHJpbW1lZFJlZmVyZW5jZSA9IGVsZW1lbnROYW1lLnRyaW0oKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSB0cmltbWVkUmVmZXJlbmNlID8gdGhpcy5ub3JtYWxpemVGaWxlbmFtZSh0cmltbWVkUmVmZXJlbmNlKSA6ICcnO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBlbGVtZW50TmFtZSkgPz9cbiAgICAgICAgKG5vcm1hbGl6ZWRUYXJnZXRcbiAgICAgICAgICA/IGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT5cbiAgICAgICAgICAgICAgdHlwZW9mIGUubWV0YWRhdGEubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgY2Fub25pY2FsU2x1ZyhlLm1ldGFkYXRhLm5hbWUpID09PSBub3JtYWxpemVkVGFyZ2V0XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWQpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gYXBwcm9wcmlhdGUgY29udGVudCBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnQgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5pbnN0cnVjdGlvbnMgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnbWVtb3JpZXMnOiB7XG4gICAgICAgICAgY29uc3QgZW50cmllcyA9IGVsZW1lbnQuZ2V0RW50cmllcygpO1xuICAgICAgICAgIHJldHVybiBgTWVtb3J5ICcke2VsZW1lbnROYW1lfScgd2l0aCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3RlbXBsYXRlcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdlbnNlbWJsZXMnOiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudExpc3QgPSBPYmplY3QuZW50cmllcyhlbGVtZW50LmVsZW1lbnRzIHx8IHt9KVxuICAgICAgICAgICAgLm1hcCgoW3R5cGUsIG5hbWVzXSkgPT4gYCR7dHlwZX06ICR7QXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcy5qb2luKCcsICcpIDogU3RyaW5nKG5hbWVzKX1gKVxuICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgcmV0dXJuIGBFbnNlbWJsZSAnJHtlbGVtZW50TmFtZX0nIGFjdGl2YXRlczogJHtlbGVtZW50TGlzdH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYWdlbnRzJzoge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGVsZW1lbnQuZXh0ZW5zaW9ucz8uaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBgW0NvbnRlbnQgbm90IGF2YWlsYWJsZSBmb3IgJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBnZXR0aW5nIGNvbnRlbnQgZm9yICR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFjdGl2ZSBzZXQgY2xlYW51cCBpcyBuZWVkZWQgYW5kIHBlcmZvcm0gY2xlYW51cCBpZiBuZWNlc3NhcnlcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdhZ2VudHMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBhZ2VudHMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGFnZW50cyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0FHRU5UUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke3RoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplfS8ke21heH0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhY3RpdmVDb3VudDogdGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUsXG4gICAgICAgICAgbWF4QWxsb3dlZDogbWF4LFxuICAgICAgICAgIGFjdGl2ZUFnZW50TmFtZXM6IEFycmF5LmZyb20odGhpcy5hY3RpdmVBZ2VudE5hbWVzKSxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdm9pZCB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgYWdlbnRzIHNldFxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudE5hbWVzID0gbmV3IFNldChhZ2VudHMubWFwKGEgPT4gYS5tZXRhZGF0YS5uYW1lKSk7XG5cbiAgICAgIGNvbnN0IHN0YWxlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZU5hbWUgb2YgdGhpcy5hY3RpdmVBZ2VudE5hbWVzKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdBZ2VudE5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWN0aXZlTmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZFNpemUgPSB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBzdGFydFNpemUgLSBlbmRTaXplO1xuXG4gICAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsZWFuZWQgdXAgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgYWdlbnQgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIGFnZW50czogJHtlbmRTaXplfS8ke2dldE1heEFjdGl2ZUxpbWl0KCdhZ2VudHMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZU5hbWVzOiBzdGFsZU5hbWVzLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjbGVhbnVwIHN0YWxlIGFjdGl2ZSBhZ2VudHM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICBkZXRhaWxzOiBgQ2xlYW51cCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFuIGFnZW50IHN0YXRlIGZpbGUgKFlBTUwpLlxuICAgKlxuICAgKiBJTVBST1ZFTUVOVDogT3B0aW1pc3RpYyBsb2NraW5nIHdpdGggdmVyc2lvbiBjaGVja2luZyAoSXNzdWUgIzI0KVxuICAgKiBQcmV2ZW50cyBzdGF0ZSBjb3JydXB0aW9uIGZyb20gY29uY3VycmVudCB1cGRhdGVzIGJ5IGNvbXBhcmluZyB2ZXJzaW9uc1xuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIG5hbWluZ1xuICAgKiBUaGlzIGVuc3VyZXMgc3RhdGUgZmlsZXMgdXNlIGtlYmFiLWNhc2UgKGUuZy4sIFwiY3J1ZHYtYWdlbnQtZGVsdGEuc3RhdGUueWFtbFwiKVxuICAgKiByZWdhcmRsZXNzIG9mIGlucHV0IG5hbWUgZm9ybWF0IChlLmcuLCBcIkNSVURWLUFnZW50LURlbHRhXCIpXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IFdyYXAgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIGluIGZpbGUgbG9ja1xuICAgKiB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbiBmcm9tIGNvbmN1cnJlbnQgYWdlbnQgZXhlY3V0aW9uc1xuICAgKlxuICAgKiBGSVggKElzc3VlICMxMjMpOiBWZXJzaW9uIGluY3JlbWVudHMgb24gc3VjY2Vzc2Z1bCBzYXZlLCBub3QgZHVyaW5nIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5ldyBzdGF0ZSB2ZXJzaW9uIGFmdGVyIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgKiBAcHJvdGVjdGVkIE9ubHkgYWNjZXNzaWJsZSBieSBzdWJjbGFzc2VzIChlLmcuLCBUZXN0YWJsZUFnZW50TWFuYWdlciBmb3IgdGVzdGluZylcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlQWdlbnRTdGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGU6IEFnZW50U3RhdGUsXG4gICAgc3RyaWN0RXhpc3RpbmdTdGF0ZUVycm9ycyA9IGZhbHNlLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChzdHJpY3RFeGlzdGluZ1N0YXRlRXJyb3JzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFzc2VydFN0YXRlRGlyZWN0b3J5QXZhaWxhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcbiAgICB9XG5cbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5KG5hbWUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YCk7XG5cbiAgICAvLyBGSVggKElzc3VlICMxMDcgLSBDUklULTIpOiBBY3F1aXJlIGZpbGUgbG9jayB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvblxuICAgIC8vIFRoZSBsb2NrIGNvdmVycyB0aGUgZW50aXJlIHJlYWQtY29tcGFyZS13cml0ZSBzZXF1ZW5jZSB0byBlbnN1cmUgYXRvbWljaXR5XG4gICAgYXdhaXQgdGhpcy5maWxlTG9ja01hbmFnZXIud2l0aExvY2soYGFnZW50LXN0YXRlOiR7bm9ybWFsaXplZE5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gRklYOiBPcHRpbWlzdGljIGxvY2tpbmcgY2hlY2sgKElzc3VlICMyNClcbiAgICAgIC8vIExvYWQgZXhpc3Rpbmcgc3RhdGUgdG8gY29tcGFyZSB2ZXJzaW9ucyBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUsIHN0cmljdEV4aXN0aW5nU3RhdGVFcnJvcnMpO1xuICAgICAgaWYgKHN0cmljdEV4aXN0aW5nU3RhdGVFcnJvcnMgJiYgIWV4aXN0aW5nU3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZ2VudCBzdGF0ZSBkaXNhcHBlYXJlZCB3aGlsZSBjb21wbGV0aW5nIGdvYWwgZm9yICcke25hbWV9J2ApO1xuICAgICAgfVxuICAgICAgaWYgKGV4aXN0aW5nU3RhdGUgJiYgZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDaGVjayBpZiBvdXIgc3RhdGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmVyc2lvblxuICAgICAgICAvLyBJZiB2ZXJzaW9ucyBkb24ndCBtYXRjaCwgaXQgbWVhbnMgYW5vdGhlciBwcm9jZXNzIHVwZGF0ZWQgdGhlIHN0YXRlXG4gICAgICAgIGlmIChleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiA+IHN0YXRlLnN0YXRlVmVyc2lvbikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0IGRldGVjdGVkIGZvciBhZ2VudCAke25hbWV9YCwge1xuICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uOiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgICAgIGF0dGVtcHRlZFZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ01FTU9SWV9TQVZFX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuc2F2ZUFnZW50U3RhdGUnLFxuICAgICAgICAgICAgZGV0YWlsczogYFN0YXRlIHZlcnNpb24gY29uZmxpY3Q6IGF0dGVtcHRlZCB0byBzYXZlIHN0YWxlIHN0YXRlYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uOiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogY3VycmVudCB2ZXJzaW9uIGlzICR7ZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb259LCBgICtcbiAgICAgICAgICAgIGBidXQgYXR0ZW1wdGVkIHRvIHNhdmUgdmVyc2lvbiAke3N0YXRlLnN0YXRlVmVyc2lvbn0uIGAgK1xuICAgICAgICAgICAgYFN0YXRlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgY29uY3VycmVudGx5LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IEluY3JlbWVudCB2ZXJzaW9uIEJFRk9SRSBzZXJpYWxpemF0aW9uLCBub3QgZHVyaW5nIG9wZXJhdGlvbnNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB2ZXJzaW9uIG9ubHkgaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IChzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMCkgKyAxO1xuXG4gICAgICBjb25zdCBzZXJpYWxpemVkU3RhdGUgPSB0aGlzLnByZXBhcmVTdGF0ZUZvclNlcmlhbGl6YXRpb24oc3RhdGUpO1xuXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuZHVtcFlhbWwoc2VyaWFsaXplZFN0YXRlLCB7XG4gICAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IGZhaWxzYWZlIGNvcnJ1cHRzIGJvb2xlYW5zL251bWJlcnMgaW4gYWdlbnQgc3RhdGVcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpemVcbiAgICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UudmFsaWRhdGVTaXplKHlhbWxDb250ZW50LCBNQVhfWUFNTF9TSVpFLCAnQWdlbnQgc3RhdGUnKTtcblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgLy8gRklYOiBVc2Ugbm9ybWFsaXplZCBuYW1lIGFzIGNhY2hlIGtleSBmb3IgY29uc2lzdGVudCBsb29rdXBzXG4gICAgICB0aGlzLnN0YXRlQ2FjaGUuc2V0KG5vcm1hbGl6ZWROYW1lLCBzdGF0ZSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWdlbnQgc3RhdGUgc2F2ZWQgc3VjY2Vzc2Z1bGx5YCwge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgZ29hbENvdW50OiBzdGF0ZS5nb2Fscz8ubGVuZ3RoID8/IDBcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgdmVyc2lvbiBmb3IgY2FsbGVyIHRvIHN5bmMgYWdlbnQncyBpbnRlcm5hbCBzdGF0ZVxuICAgIC8vIHN0YXRlVmVyc2lvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbnVtYmVyIGFmdGVyIHRoZSBpbmNyZW1lbnQgYWJvdmVcbiAgICByZXR1cm4gc3RhdGUuc3RhdGVWZXJzaW9uITtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5OiBlbnN1cmUgYC5tZGAgZXh0ZW5zaW9uIG9uIHJlcXVlc3RlZCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEV4dGVuc2lvbihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IGZpbGVQYXRoLnNsaWNlKDAsIC1BR0VOVF9GSUxFX0VYVEVOU0lPTi5sZW5ndGgpXG4gICAgICA6IGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoeWRyYXRlQWdlbnRTdGF0ZShcbiAgICBhZ2VudDogQWdlbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmljdFN0YXRlRXJyb3JzID0gZmFsc2UsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShuYW1lLCBzdHJpY3RTdGF0ZUVycm9ycyk7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnBhcnNlKGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpKTtcbiAgICBzZXJpYWxpemVkLnN0YXRlID0gc3RhdGU7XG4gICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCkpO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcsIHN0cmljdFN0YXRlRXJyb3JzID0gZmFsc2UpOiBQcm9taXNlPEFnZW50U3RhdGUgfCBudWxsPiB7XG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGxvb2t1cHNcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUVsZW1lbnRTdG9yYWdlSWRlbnRpdHkobmFtZSk7XG5cbiAgICAvLyBTZWN1cml0eS1zZW5zaXRpdmUgc3RhdGUgY2hlY2tzIG11c3QgcmUtcmVhZCBkdXJhYmxlIHN0b3JhZ2UgcmF0aGVyIHRoYW5cbiAgICAvLyB0cnVzdGluZyBhIHBvc3NpYmx5IHN0YWxlIHByb2Nlc3MgY2FjaGUuXG4gICAgaWYgKCFzdHJpY3RTdGF0ZUVycm9ycyAmJiB0aGlzLnN0YXRlQ2FjaGUuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQobm9ybWFsaXplZE5hbWUpITtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShzdGF0ZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgWUFNTCBwYXJzaW5nXG4gICAgICAvLyBTdGF0ZSBmaWxlcyBhcmUgcHVyZSBZQU1MIGJ1dCBwYXJzZUZyb250bWF0dGVyIGhhbmRsZXMgYm90aCBmb3JtYXRzXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIubG9hZEFnZW50U3RhdGUnXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSByZXN1bHQuZGF0YSBhcyBBZ2VudFN0YXRlO1xuICAgICAgdGhpcy5ub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIGlmICghc3RyaWN0U3RhdGVFcnJvcnMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgaWYgKHN0cmljdFN0YXRlRXJyb3JzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRTdGF0ZURpcmVjdG9yeUF2YWlsYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5ndWlzaCBhIGxlZ2l0aW1hdGVseSBhYnNlbnQgcGVyLWFnZW50IHN0YXRlIGZpbGUgZnJvbSB1bmF2YWlsYWJsZVxuICAgKiBzdGF0ZSBzdG9yYWdlLiBTdHJpY3QgcmVjb3ZlcnkgbWF5IHRyZWF0IG9ubHkgdGhlIGZvcm1lciBhcyBlbXB0eSBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0U3RhdGVEaXJlY3RvcnlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KHRoaXMuc3RhdGVEaXIpO1xuICAgICAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWdlbnQgc3RhdGUgc3RvcmFnZSBwYXRoIGlzIG5vdCBhIGRpcmVjdG9yeScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IHN0YXRlIGRpcmVjdG9yeSB1bmF2YWlsYWJsZTogJHtyZWFzb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcsIG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgb24gbG9hZCDigJQgc3RydWN0dXJhbCBjaGVja3MsIHN0cmlwIG1hbGZvcm1lZCBkYXRhLlxuICAgIC8vIEZhaWwtb3BlbjogY29ycnVwdGVkIGZpZWxkcyBhcmUgcmVtb3ZlZCBhbmQgbG9nZ2VkLCBub3QgdGhyb3duLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gYmFkIGRhdGEgZnJvbSByZWFjaGluZyBleGVjdXRpb24gdGltZSB3aGlsZSBrZWVwaW5nIHRoZSBhZ2VudCBsb2FkYWJsZS5cbiAgICBjb25zdCBhZ2VudE5hbWUgPSBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgIC8vIElzc3VlICM2OTc6IE5vcm1hbGl6ZSBgZ29hbHNgIChwbHVyYWwpIOKGkiBgZ29hbGAgKHNpbmd1bGFyKVxuICAgIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhLmdvYWxzO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogbWlncmF0ZWQgJ2dvYWxzJyAocGx1cmFsKSB0byAnZ29hbCdgKTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGBnb2FsYCBhbHJlYWR5IHNldCDigJQgZHJvcCB0aGUgcmVkdW5kYW50IHBsdXJhbCBmb3JtXG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmdvYWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1ldGFkYXRhLmdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkc1xuICAgICAgICBub3JtYWxpemVHb2FsS2V5cyhtZXRhZGF0YS5nb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnBhcmFtZXRlcnMgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHN1Y2Nlc3NDcml0ZXJpYSBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gZ29hbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlIOKAlCBhbnl0aGluZyBlbHNlIGlzIGludmFsaWRcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbCBpcyBtYWxmb3JtZWQgKG5vIHRlbXBsYXRlKSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRWFjaCBrZXkgc2hvdWxkIG1hcCB0byBhIHN0cmluZyBhcnJheVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMuJHtrZXl9IGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5hbGxvd2VkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nIHRvb2xzYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhcCAzOiBWYWxpZGF0ZSB0b29scy5kZW5pZWQgaXMgYW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmRlbmllZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scy5kZW5pZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc3lzdGVtX3Byb21wdCDihpIgc3lzdGVtUHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFueU1ldGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cbiAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBzeXN0ZW1Qcm9tcHQgaXMgbm90IGEgc3RyaW5nLCBzdHJpcHBpbmdgKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY5NzogUHJvbW90ZSByb290LWxldmVsIFYxIGF1dG9ub215IGZpZWxkcyBpbnRvIHRoZSBgYXV0b25vbXlgIGJsb2NrLlxuICAgIC8vIFYxIGFnZW50cyBzdG9yZWQgcmlza1RvbGVyYW5jZSBhbmQgbWF4QXV0b25vbW91c1N0ZXBzIGF0IHRoZSBtZXRhZGF0YSByb290LlxuICAgIC8vIFYyIG5lc3RzIHRoZW0gdW5kZXIgYGF1dG9ub215YC4gVGhpcyBwcm9tb3Rpb24gZW5zdXJlcyBkb3duc3RyZWFtIGNvZGUgb25seVxuICAgIC8vIGNoZWNrcyBvbmUgbG9jYXRpb24uIFRoZSBleGlzdGluZyBhdXRvbm9teSB2YWxpZGF0aW9uIGJlbG93IHZhbGlkYXRlcyB2YWx1ZXMuXG4gICAgLy8gUHJlY2VkZW5jZTogY2FtZWxDYXNlIHZhcmlhbnRzIGFyZSBsaXN0ZWQgYmVmb3JlIHNuYWtlX2Nhc2Uvc2hvcnQgZm9ybXMsIHNvXG4gICAgLy8gZS5nLiBgcmlza1RvbGVyYW5jZWAgd2lucyBvdmVyIGByaXNrX3RvbGVyYW5jZWAgaWYgYm90aCBhcHBlYXIgYXQgcm9vdC5cbiAgICB7XG4gICAgICBjb25zdCByb290QXV0b25vbXlGaWVsZHM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICAgIFsncmlza1RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsncmlza190b2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ21heEF1dG9ub21vdXNTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhfYXV0b25vbW91c19zdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgIF0gYXMgY29uc3Q7XG4gICAgICBsZXQgcHJvbW90ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgW3Jvb3RLZXksIGF1dG9ub215S2V5XSBvZiByb290QXV0b25vbXlGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFueU1ldGFbcm9vdEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFCbG9jayA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhQmxvY2tbYXV0b25vbXlLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFCbG9ja1thdXRvbm9teUtleV0gPSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICAgICAgcHJvbW90ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb21vdGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHByb21vdGVkIHJvb3QtbGV2ZWwgYXV0b25vbXkgZmllbGRzIGludG8gYXV0b25vbXkgYmxvY2tgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215IGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYXV0b25vbXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIGZpZWxkc1xuICAgICAgICAvLyBHYXAgNDogVmFsaWRhdGUgcmlza1RvbGVyYW5jZSBlbnVtICh1c2VzIHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJpc2tUb2xlcmFuY2UgJyR7YS5yaXNrVG9sZXJhbmNlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmlza1RvbGVyYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmVxdWlyZXNBcHByb3ZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LmF1dG9BcHByb3ZlIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEuYXV0b0FwcHJvdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5yZXNpbGllbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gSXNzdWUgIzcyNzogVXNlIHNoYXJlZCBlbnVtIGNvbnN0YW50cyBmb3IgcmVzaWxpZW5jZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25TdGVwTGltaXRSZWFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uRXhlY3V0aW9uRmFpbHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhSZXRyaWVzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4UmV0cmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4Q29udGludWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBHYXAgNTogVmFsaWRhdGUgcmV0cnlCYWNrb2ZmIGVudW0gYW5kIHByZXNlcnZlU3RhdGUgYm9vbGVhbiAoc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmICcke3IucmV0cnlCYWNrb2ZmfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucmV0cnlCYWNrb2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIGlzIG5vdCBhIGJvb2xlYW4sIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnByZXNlcnZlU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWdzOiB2YWxpZGF0ZSBhcyBzdHJpbmcgYXJyYXkgKGNvbW1vbiBmaWVsZCwgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRhZ3MgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGEudGFncy5maWx0ZXIoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogQWdlbnRNZXRhZGF0YSwgYm9keUNvbnRlbnQ6IHN0cmluZyk6IEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgYWdlbnQuY29udGVudCA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBhZ2VudC5jb250ZW50ID0gJyc7XG4gICAgfVxuICAgIC8vIEtlZXAgZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBhZ2VudC5pbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGFnZW50OiBBZ2VudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU3RhcnQgd2l0aCBiYXNlIG1ldGFkYXRhIGZpZWxkcyAoYWx3YXlzIHByZXNlbnQpXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5BR0VOVCksXG4gICAgICB1bmlxdWVfaWQ6IGFnZW50LmlkLFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIH07XG5cbiAgICAvLyBDYXN0IHRvIGNoZWNrIGZvciB2MiBmaWVsZHNcbiAgICBjb25zdCBtZXRhZGF0YVYyID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gQWRkIHYyIGZpZWxkcyBpZiBwcmVzZW50IChnb2FsIGlzIHJlcXVpcmVkIGluIHYyLCBvdGhlcnMgb3B0aW9uYWwpXG4gICAgaWYgKG1ldGFkYXRhVjIuZ29hbCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYWN0aXZhdGVzKSB7XG4gICAgICBtZXRhZGF0YS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudG9vbHMpIHtcbiAgICAgIG1ldGFkYXRhLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0KSB7XG4gICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYXV0b25vbXkpIHtcbiAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzQ0OTogU2VyaWFsaXplIGdhdGVrZWVwZXIgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTI2OiBTZXJpYWxpemUgcmVzaWxpZW5jZSBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnJlc2lsaWVuY2UpIHtcbiAgICAgIG1ldGFkYXRhLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogT25seSBzZXJpYWxpemUgdjEgZmllbGRzIGZvciBhZ2VudHMgV0lUSE9VVCBhIGdvYWwgKGxlZ2FjeSB2MSBhZ2VudHMpLlxuICAgIC8vIFYyIGFnZW50cyAod2l0aCBnb2FsKSBzaG91bGQgbm90IGNhcnJ5IGRlcHJlY2F0ZWQgdjEgYmFnZ2FnZSBsaWtlXG4gICAgLy8gZGVjaXNpb25GcmFtZXdvcmssIHJpc2tUb2xlcmFuY2UsIGxlYXJuaW5nRW5hYmxlZCwgbWF4Q29uY3VycmVudEdvYWxzLlxuICAgIC8vIFRoZSBBZ2VudCBjb25zdHJ1Y3RvciBzdGlsbCBhcHBsaWVzIHRoZXNlIGRlZmF1bHRzIGF0IHJ1bnRpbWUgZm9yIGJhY2t3YXJkXG4gICAgLy8gY29tcGF0IHdoZW4gcmVhZGluZyBvbGQgZmlsZXMg4oCUIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtIGludG8gbmV3IHYyIGFnZW50cy5cbiAgICBjb25zdCBpc1YyQWdlbnQgPSAhIW1ldGFkYXRhVjIuZ29hbDtcbiAgICBpZiAoIWlzVjJBZ2VudCkge1xuICAgICAgaWYgKG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcmspIHtcbiAgICAgICAgbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgPSBtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZSkge1xuICAgICAgICBtZXRhZGF0YS5yaXNrVG9sZXJhbmNlID0gbWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID0gbWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSBtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3BlY2lhbGl6YXRpb25zIGlzIG5vdCBhIGRlcHJlY2F0ZWQgdjEgZmllbGQg4oCUIGFsd2F5cyBzZXJpYWxpemVcbiAgICBpZiAobWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNzIyOiBTZXJpYWxpemUgdGFncyBhbmQgdHJpZ2dlcnMgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YVYyLnRhZ3MpICYmIG1ldGFkYXRhVjIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGFWMi50YWdzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50cmlnZ2Vycykge1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBtZXRhZGF0YVYyLnRyaWdnZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWcgPSBtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gdjIuMCBmb3JtYXQ6IGluc3RydWN0aW9ucyBpbiBZQU1MIGZyb250bWF0dGVyLCBjb250ZW50IGFzIGJvZHlcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5pbnN0cnVjdGlvbnMgfHxcbiAgICAgIChhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgdGhpcy5idWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQpO1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGFnZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGFnZW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBVc2UgSlNPTiBzY2hlbWEgdG8gcHJlc2VydmUgYm9vbGVhbnMvbnVtYmVycyBpbiB2MiBtZXRhZGF0YVxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsICAvLyBSZW1vdmUgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVIZWFkZXIgPSBhZ2VudC5tZXRhZGF0YS5uYW1lID8gYCMgJHthZ2VudC5tZXRhZGF0YS5uYW1lfVxcblxcbmAgOiAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIHJldHVybiBgJHtuYW1lSGVhZGVyfSR7ZGVzY3JpcHRpb259YC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGFnZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSB0ZXh0IHRoYXQgc2hvdWxkIHNhdGlzZnkgY3JlYXRlLXRpbWUgY29udGVudCB2YWxpZGF0aW9uLlxuICAgKiBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyByZW1haW4gdGhlIHByaW1hcnkgc291cmNlLCB3aGlsZSByZWZlcmVuY2UgY29udGVudFxuICAgKiBhY3RzIGFzIHRoZSBmYWxsYmFjayBmb3IgY29udGVudC1vbmx5IGFnZW50IGNyZWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudDogc3RyaW5nLCByZWZlcmVuY2VDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2VDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3Mjc6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBhdCB3cml0ZSB0aW1lLlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSAoc2FtZSBhcyBwYXJzZU1ldGFkYXRhKSBhbmQgdGhlbiB2YWxpZGF0ZXNcbiAgICogc3RydWN0dXJhbCBjb25zdHJhaW50cy4gVW5saWtlIHBhcnNlTWV0YWRhdGEgKHdoaWNoIHNpbGVudGx5IHN0cmlwcyBmb3JcbiAgICogYmFja3dhcmQgY29tcGF0KSwgdGhpcyByZXR1cm5zIGVycm9ycyBzbyB0aGUgY2FsbGVyIGNhbiByZWplY3QgdGhlIGNyZWF0ZS5cbiAgICpcbiAgICogTXV0YXRlcyB0aGUgbWV0YWRhdGEgaW4gcGxhY2UgKG5vcm1hbGl6YXRpb24pLCByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gLS0tIHRvb2xzIC0tLVxuICAgIGlmIChtZXRhZGF0YS50b29scyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSB8fCBtZXRhZGF0YS50b29scyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGxvd2VkL2RlbmllZCBhcnJheXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5hbGxvd2VkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5kZW5pZWQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gc3lzdGVtUHJvbXB0IC0tLVxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbVByb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIC8vIHNuYWtlX2Nhc2UgdmFyaWFudCAoSXNzdWUgIzcyNTogbm9ybWFsaXplZCBhdCBkaXNwYXRjaGVyIGxldmVsIGV2ZW50dWFsbHkpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdCBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCgnc3lzdGVtX3Byb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cblxuICAgIC8vIC0tLSBhdXRvbm9teSAtLS1cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkgfHwgbWV0YWRhdGEuYXV0b25vbXkgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYGF1dG9ub215LnJpc2tUb2xlcmFuY2UgbXVzdCBiZSBvbmUgb2Y6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9IChnb3QgJyR7YS5yaXNrVG9sZXJhbmNlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5hdXRvQXBwcm92ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSByZXNpbGllbmNlIC0tLVxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSB8fCBtZXRhZGF0YS5yZXNpbGllbmNlID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgbXVzdCBiZSBvbmUgb2Y6ICR7U1RFUF9MSU1JVF9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlIG11c3QgYmUgb25lIG9mOiAke0VYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heFJldHJpZXMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLnJldHJ5QmFja29mZiBtdXN0IGJlIG9uZSBvZjogJHtCQUNLT0ZGX1NUUkFURUdJRVMuam9pbignLCAnKX0gKGdvdCAnJHtyLnJldHJ5QmFja29mZn0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gYWN0aXZhdGVzIC0tLVxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSB8fCBtZXRhZGF0YS5hY3RpdmF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2FjdGl2YXRlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHNraWxscy9wZXJzb25hcy9tZW1vcmllcy90ZW1wbGF0ZXMvZW5zZW1ibGVzIGFycmF5cycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGdvYWwgaW5wdXQgdG8gVjIgZm9ybWF0LlxuICAgKiBMTE1zIG1heSBwYXNzIGdvYWwgYXMgYSBzaW1wbGUgc3RyaW5nIG9yIGFzIGEgVjIgY29uZmlnIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVyIFYyIHN0cnVjdHVyZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdvYWwgLSBFaXRoZXIgYSBzdHJpbmcgZ29hbCBvciBhIFYyIGdvYWwgY29uZmlnIG9iamVjdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFYyIGdvYWwgY29uZmlnLCBvciB1bmRlZmluZWQgaWYgbm8gZ29hbCBwcm92aWRlZFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVHb2FsSW5wdXQoZ29hbDogc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+IHwgdW5kZWZpbmVkKTogQWdlbnRHb2FsQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgY29udmVydCB0byBWMiBmb3JtYXRcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbnZlcnRpbmcgc3RyaW5nIGdvYWwgdG8gVjIgZm9ybWF0JywgeyBnb2FsIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSwgbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdvYmplY3QnICYmICd0ZW1wbGF0ZScgaW4gZ29hbCAmJiB0eXBlb2YgZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkcyBiZWZvcmUgYWNjZXNzaW5nXG4gICAgICBub3JtYWxpemVHb2FsS2V5cyhnb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICBjb25zdCB2YWxpZFBhcmFtVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zOiBBZ2VudEdvYWxQYXJhbWV0ZXJbXSA9IChnb2FsLnBhcmFtZXRlcnMgfHwgW10pLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwLm5hbWUgPT09ICdzdHJpbmcnID8gcC5uYW1lIDogYHBhcmFtXyR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkUGFyYW1UeXBlcy5pbmNsdWRlcyhwLnR5cGUgYXMgdHlwZW9mIHZhbGlkUGFyYW1UeXBlc1tudW1iZXJdKVxuICAgICAgICAgID8gcC50eXBlIGFzICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbidcbiAgICAgICAgICA6ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiBwLnJlcXVpcmVkID09PSAnYm9vbGVhbicgPyBwLnJlcXVpcmVkIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkOiBBZ2VudEdvYWxQYXJhbWV0ZXIgPSB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkIH07XG4gICAgICAgIGlmICh0eXBlb2YgcC5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgcC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdGVkLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChwLmRlc2NyaXB0aW9uLCBTRUNVUklUWV9MSU1JVFMuTUFYX0RPQ1VNRU5UQVRJT05fRklFTERfTEVOR1RIKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZGVmYXVsdHMgdG8gcHJldmVudCBpbmplY3Rpb24gd2hlbiB1c2VkIGluIGdvYWwgcmVuZGVyaW5nXG4gICAgICAgICAgaWYgKHR5cGVvZiBwLmRlZmF1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHNhbml0aXplSW5wdXQocC5kZWZhdWx0LCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHAuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogZ29hbC50ZW1wbGF0ZSxcbiAgICAgICAgcGFyYW1ldGVyczogdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE9iamVjdCB3aXRob3V0IHRlbXBsYXRlIC0gY2Fubm90IGNvbnZlcnRcbiAgICBsb2dnZXIud2FybignR29hbCBvYmplY3QgbWlzc2luZyB0ZW1wbGF0ZSBmaWVsZCwgY2Fubm90IGNvbnZlcnQgdG8gVjInLCB7IGdvYWwgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogUGFyc2VkQWdlbnRGaWxlIHtcbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnBhcnNlQWdlbnRGaWxlJ1xuICAgIH0pO1xuXG4gICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UgZW5zdXJlcyBmcm9udG1hdHRlciBleGlzdHMsIG9yIHRocm93cyBlcnJvclxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGVuYW1lIGZvciBhbiBhZ2VudCBlbGVtZW50LlxuICAgKlxuICAgKiBVc2VzIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZyb20gQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciBjb25zaXN0ZW50XG4gICAqIGZpbGVuYW1lIGZvcm1hdHRpbmcgYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICBcIkNyZWF0aXZlIFdyaXRlclwiIC0+IFwiY3JlYXRpdmUtd3JpdGVyLm1kXCJcbiAgICogICBcIkNSVURWLUFnZW50LURlbHRhXCIgLT4gXCJjcnVkdi1hZ2VudC1kZWx0YS5tZFwiXG4gICAqICAgXCJNdWx0aV9Hb2FsX0FnZW50XCIgLT4gXCJtdWx0aS1nb2FsLWFnZW50Lm1kXCJcbiAgICogICBcIkNhbWVsQ2FzZU5hbWVcIiAtPiBcImNhbWVsLWNhc2UtbmFtZS5tZFwiXG4gICAqL1xuICBwcml2YXRlIGdldEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZvciB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eW2EtekEtWjAtOV8tXSskLy50ZXN0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgZm9yIGF0dHJpYnV0aW9uXG4gICAqIFJFRkFDVE9SRUQ6IERlbGVnYXRlcyB0byBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgdXNlciBhdHRyaWJ1dGlvbiBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZTogQWdlbnRTdGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlIGluc3RhbmNlb2YgRGF0ZSA/IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSA6IHN0YXRlLmxhc3RBY3RpdmUsXG4gICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQgPz8gMCksXG4gICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbikgOiAnMScsICAvLyBJbmNsdWRlIHZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZ1xuICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgIC4uLmdvYWwsXG4gICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQ6IGdvYWwuY29tcGxldGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jb21wbGV0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jb21wbGV0ZWRBdCxcbiAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSA6IHVuZGVmaW5lZFxuICAgICAgfSkpLFxuICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgIC4uLmRlY2lzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZTogQWdlbnRTdGF0ZSk6IHZvaWQge1xuICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IERlZmF1bHQgbWlzc2luZyBhcnJheXMgdG8gcHJldmVudCBUeXBlRXJyb3JcbiAgICAvLyBJZiBzdGF0ZSBmaWxlIGlzIG1pc3NpbmcgZ29hbHMvZGVjaXNpb25zL2NvbnRleHQsIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXlzL29iamVjdHNcbiAgICBpZiAoIXN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2FscyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuY29udGV4dCkge1xuICAgICAgc3RhdGUuY29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc2Vzc2lvbkNvdW50ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2Ugc3RhdGVWZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmcgKElzc3VlICMyNClcbiAgICBpZiAoc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZlcnNpb24gMSBpZiBub3QgcHJlc2VudCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5sYXN0QWN0aXZlKSB7XG4gICAgICBzdGF0ZS5sYXN0QWN0aXZlID0gbmV3IERhdGUoc3RhdGUubGFzdEFjdGl2ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmltcG9ydGFuY2UgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLnVyZ2VuY3kgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwudXJnZW5jeSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jcmVhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNyZWF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXBkYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLnVwZGF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jb21wbGV0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKGRlY2lzaW9uID0+IHtcbiAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2lzaW9uLmNvbmZpZGVuY2UgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpc2lvbi50aW1lc3RhbXApIHtcbiAgICAgICAgICBkZWNpc2lvbi50aW1lc3RhbXAgPSBuZXcgRGF0ZShkZWNpc2lvbi50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgc3RlcCBpbiBhZ2VudCBleGVjdXRpb25cbiAgICogV3JhcHMgQWdlbnQucmVjb3JkRGVjaXNpb24oKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyByZWNvcmRBZ2VudFN0ZXAocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RlcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIC8qKiBPcHRpb25hbCBmaW5kaW5ncyBvciByZXN1bHRzIGZyb20gdGhpcyBzdGVwICovXG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICAvKiogT3B0aW9uYWwgaGludCBhYm91dCB3aGF0IHRoZSBMTE0gcGxhbnMgdG8gZG8gbmV4dCAoZm9yIHByb2FjdGl2ZSByaXNrIGV2YWx1YXRpb24pICovXG4gICAgbmV4dEFjdGlvbkhpbnQ/OiBzdHJpbmc7XG4gICAgLyoqIE9wdGlvbmFsIHJpc2sgc2NvcmUgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKDAtMTAwKSAqL1xuICAgIHJpc2tTY29yZT86IG51bWJlcjtcbiAgICAvKiogUnVudGltZSBvdmVycmlkZSBmb3IgbWF4QXV0b25vbW91c1N0ZXBzIChJc3N1ZSAjNDQ3KSAqL1xuICAgIG1heFN0ZXBzT3ZlcnJpZGU/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZWNpc2lvbjoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGdvYWxJZDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqIEF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gY29udGludWUgb3IgcGF1c2UgKi9cbiAgICBhdXRvbm9teTogQXV0b25vbXlEaXJlY3RpdmU7XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZSB0byBmaW5kIGFjdGl2ZSBnb2Fsc1xuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBhY3RpdmVHb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcblxuICAgIGlmICghYWN0aXZlR29hbCkge1xuICAgICAgY29uc3QgZ29hbFN0YXR1c2VzID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gYCR7Zy5pZH06ICR7Zy5zdGF0dXN9YCkuam9pbignLCAnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGFjdGl2ZSBnb2FsIGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke2dvYWxTdGF0dXNlcyB8fCAnbm9uZSd9LiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwgZmlyc3QuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDYWxsIEFnZW50LnJlY29yZERlY2lzaW9uKCkgdG8gcGVyc2lzdCB0aGUgc3RlcFxuICAgIGNvbnN0IGRlY2lzaW9uID0gYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgICAgZGVjaXNpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5maW5kaW5ncyA/PyAnJyxcbiAgICAgIGNvbmZpZGVuY2U6IHBhcmFtcy5jb25maWRlbmNlID8/IDAuOCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNS4gR2V0IHVwZGF0ZWQgc3RhdGUgZm9yIHN0ZXAgY291bnQgYW5kIGF1dG9ub215IGV2YWx1YXRpb25cbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gNi4gQ2FsY3VsYXRlIHN0ZXAgY291bnQgZm9yIHRoaXMgZ29hbFxuICAgIC8vIHN0ZXBDb3VudCA9IG51bWJlciBvZiBzdGVwcyBjb21wbGV0ZWQgKGluY2x1ZGluZyB0aGUgb25lIGp1c3QgcmVjb3JkZWQpXG4gICAgLy8gVGhlIGV2YWx1YXRvciB1c2VzIHRoaXMgdG8gY2hlY2sgaWYgd2UndmUgaGl0IG1heEF1dG9ub21vdXNTdGVwc1xuICAgIC8vIGFuZCB0byBjb21wdXRlIHN0ZXBzUmVtYWluaW5nIGZvciB0aGUgYXV0b25vbXkgZGlyZWN0aXZlLlxuICAgIGNvbnN0IGdvYWxEZWNpc2lvbnMgPSB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQuZ29hbElkID09PSBhY3RpdmVHb2FsLmlkKTtcbiAgICBjb25zdCBzdGVwQ291bnQgPSBnb2FsRGVjaXNpb25zLmxlbmd0aDtcblxuICAgIC8vIDcuIEdldCBhZ2VudCBtZXRhZGF0YSBmb3IgYXV0b25vbXkgY29uZmlnXG4gICAgY29uc3QgYWdlbnRNZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgIC8vIDguIEV2YWx1YXRlIGF1dG9ub215IC0gc2hvdWxkIHdlIGNvbnRpbnVlIG9yIHBhdXNlP1xuICAgIC8vIElzc3VlICM0MDI6IFBhc3MgREktaW5qZWN0ZWQgRGFuZ2VyWm9uZUVuZm9yY2VyIHZpYSBjb250ZXh0XG4gICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgcHJvdmlkZWRcbiAgICBjb25zdCBhdXRvbm9teUNvbmZpZyA9IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlICE9PSB1bmRlZmluZWRcbiAgICAgID8geyAuLi5hZ2VudE1ldGFkYXRhLmF1dG9ub215LCBtYXhBdXRvbm9tb3VzU3RlcHM6IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlIH1cbiAgICAgIDogYWdlbnRNZXRhZGF0YS5hdXRvbm9teTtcblxuICAgIGNvbnN0IGF1dG9ub215RGlyZWN0aXZlID0gZXZhbHVhdGVBdXRvbm9teSh7XG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBhdXRvbm9teUNvbmZpZyxcbiAgICAgIHN0ZXBDb3VudCxcbiAgICAgIGN1cnJlbnRTdGVwRGVzY3JpcHRpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICBjdXJyZW50U3RlcE91dGNvbWU6IHBhcmFtcy5vdXRjb21lLFxuICAgICAgbmV4dEFjdGlvbkhpbnQ6IHBhcmFtcy5uZXh0QWN0aW9uSGludCxcbiAgICAgIHJpc2tTY29yZTogcGFyYW1zLnJpc2tTY29yZSxcbiAgICAgIGRhbmdlclpvbmVFbmZvcmNlcjogQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPy4oKSxcbiAgICAgIHZlcmlmaWNhdGlvblN0b3JlOiBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj8uKCksXG4gICAgICBnb2FsRGVzY3JpcHRpb246IGFjdGl2ZUdvYWwuZGVzY3JpcHRpb24sXG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgfSk7XG5cbiAgICAvLyA5LiBSZXR1cm4gZGVjaXNpb24sIHN0YXRlIHN1bW1hcnksIGFuZCBhdXRvbm9teSBkaXJlY3RpdmVcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTdGVwIHJlY29yZGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgLFxuICAgICAgZGVjaXNpb246IHtcbiAgICAgICAgaWQ6IGRlY2lzaW9uLmlkLFxuICAgICAgICBnb2FsSWQ6IGRlY2lzaW9uLmdvYWxJZCxcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmRlY2lzaW9uLFxuICAgICAgICByZWFzb25pbmc6IGRlY2lzaW9uLnJlYXNvbmluZyxcbiAgICAgICAgZnJhbWV3b3JrOiBkZWNpc2lvbi5mcmFtZXdvcmssXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UsXG4gICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBhdXRvbm9teTogYXV0b25vbXlEaXJlY3RpdmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGFuIGFnZW50IGdvYWxcbiAgICogV3JhcHMgQWdlbnQuY29tcGxldGVHb2FsKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0pIHtcbiAgICByZXR1cm4gdGhpcy5jb21wbGV0ZUFnZW50R29hbFdpdGhTdGF0ZVBvbGljeShwYXJhbXMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBDb21wbGV0ZSBhbiBleGFjdCBkdXJhYmxlIGdvYWwgd2l0aG91dCBjb25zdWx0aW5nIG9yZGluYXJ5IHN0YXRlIGNhY2hlcy4gKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWxGb3JSZWNvdmVyeShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ6IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVBZ2VudEdvYWxXaXRoU3RhdGVQb2xpY3kocGFyYW1zLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVBZ2VudEdvYWxXaXRoU3RhdGVQb2xpY3kocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0sIHN0cmljdFN0YXRlRXJyb3JzOiBib29sZWFuKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZ29hbDoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiO1xuICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICBjb21wbGV0ZWRBdDogc3RyaW5nO1xuICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgYWN0dWFsRWZmb3J0PzogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0cmljczoge1xuICAgICAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgICAgIGdvYWxzQ29tcGxldGVkOiBudW1iZXI7XG4gICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG51bWJlcjtcbiAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbnVtYmVyO1xuICAgIH07XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxDb3VudDogbnVtYmVyO1xuICAgICAgZGVjaXNpb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gc3RyaWN0U3RhdGVFcnJvcnNcbiAgICAgID8gYXdhaXQgdGhpcy5yZWFkV2l0aFN0YXRlUG9saWN5KHBhcmFtcy5hZ2VudE5hbWUsIHRydWUpXG4gICAgICA6IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEZpbmQgZ29hbCB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBsZXQgZ29hbDogQWdlbnRHb2FsIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHBhcmFtcy5nb2FsSWQpIHtcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gcGFyYW1zLmdvYWxJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgbW9zdCByZWNlbnQgaW4tcHJvZ3Jlc3MgZ29hbFxuICAgICAgZ29hbCA9IHN0YXRlLmdvYWxzXG4gICAgICAgIC5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY3JlYXRlZEF0LmdldFRpbWUoKSAtIGEuY3JlYXRlZEF0LmdldFRpbWUoKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHBhcmFtcy5nb2FsSWRcbiAgICAgICAgICA/IGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmRgXG4gICAgICAgICAgOiBgTm8gaW4tcHJvZ3Jlc3MgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0cmljdFN0YXRlRXJyb3JzICYmIGdvYWwuc3RhdHVzICE9PSAnaW5fcHJvZ3Jlc3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBHb2FsICcke2dvYWwuaWR9JyBjaGFuZ2VkIHdoaWxlIGFib3J0aW5nIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVjb3JkIGZpbmFsIGRlY2lzaW9uIHdpdGggc3VtbWFyeVxuICAgIGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogZ29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiAnZ29hbF9jb21wbGV0ZScsXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5zdW1tYXJ5LFxuICAgICAgY29uZmlkZW5jZTogMS4wLFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIENhbGwgQWdlbnQuY29tcGxldGVHb2FsKClcbiAgICBhZ2VudC5jb21wbGV0ZUdvYWwoZ29hbC5pZCwgcGFyYW1zLm91dGNvbWUpO1xuXG4gICAgLy8gNS4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA2LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3QgY29tcGxldGVTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycykge1xuICAgICAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUoXG4gICAgICAgIGNvbXBsZXRlU2FuaXRpemVkTmFtZSxcbiAgICAgICAgYWdlbnQuZ2V0U3RhdGUoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShjb21wbGV0ZVNhbml0aXplZE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyA3LiBSZXR1cm4gZ29hbCwgbWV0cmljcywgYW5kIHN0YXRlXG4gICAgY29uc3QgdXBkYXRlZFN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBjb21wbGV0ZWRHb2FsID0gdXBkYXRlZFN0YXRlLmdvYWxzLmZpbmQoZyA9PiBnLmlkID09PSBnb2FsLmlkKSE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBHb2FsIGNvbXBsZXRlZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nIHdpdGggb3V0Y29tZTogJHtwYXJhbXMub3V0Y29tZX1gLFxuICAgICAgZ29hbDoge1xuICAgICAgICBpZDogY29tcGxldGVkR29hbC5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGNvbXBsZXRlZEdvYWwuZGVzY3JpcHRpb24sXG4gICAgICAgIHN0YXR1czogY29tcGxldGVkR29hbC5zdGF0dXMgYXMgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIsXG4gICAgICAgIGNyZWF0ZWRBdDogY29tcGxldGVkR29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29tcGxldGVkQXQ6IGNvbXBsZXRlZEdvYWwuY29tcGxldGVkQXQhLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGVzdGltYXRlZEVmZm9ydDogY29tcGxldGVkR29hbC5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICAgIGFjdHVhbEVmZm9ydDogY29tcGxldGVkR29hbC5hY3R1YWxFZmZvcnRcbiAgICAgIH0sXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBtZXRyaWNzLnN1Y2Nlc3NSYXRlLFxuICAgICAgICBnb2Fsc0NvbXBsZXRlZDogbWV0cmljcy5nb2Fsc0NvbXBsZXRlZCxcbiAgICAgICAgZ29hbHNJblByb2dyZXNzOiBtZXRyaWNzLmdvYWxzSW5Qcm9ncmVzcyxcbiAgICAgICAgZGVjaXNpb25BY2N1cmFjeTogbWV0cmljcy5kZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG1ldHJpY3MuYXZlcmFnZUNvbXBsZXRpb25UaW1lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKiBXcmFwcyBBZ2VudC5nZXRTdGF0ZSgpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGdldEFnZW50U3RhdGUocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWdlbnRTdGF0ZVdpdGhQb2xpY3kocGFyYW1zLCBmYWxzZSk7XG4gIH1cblxuICAvKiogU3RyaWN0IGR1cmFibGUtc3RhdGUgdmFyaWFudCByZXNlcnZlZCBmb3Igc3RhbGUtcG9saWN5IHJlY292ZXJ5LiAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlRm9yUmVjb3ZlcnkocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWdlbnRTdGF0ZVdpdGhQb2xpY3kocGFyYW1zLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWdlbnRTdGF0ZVdpdGhQb2xpY3kocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9LCBzdHJpY3RTdGF0ZUVycm9yczogYm9vbGVhbik6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBpbXBvcnRhbmNlOiBudW1iZXI7XG4gICAgICAgIHVyZ2VuY3k6IG51bWJlcjtcbiAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50Pzogc3RyaW5nO1xuICAgICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgICAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgcmlza0xldmVsPzogc3RyaW5nO1xuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICAgICAgbm90ZXM/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIGRlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgIGtleXM6IHN0cmluZ1tdO1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWRXaXRoU3RhdGVQb2xpY3kocGFyYW1zLmFnZW50TmFtZSwgc3RyaWN0U3RhdGVFcnJvcnMpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gMy4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA0LiBGaWx0ZXIgZGVjaXNpb25zIGJhc2VkIG9uIGluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICBjb25zdCBkZWNpc2lvbnMgPSBwYXJhbXMuaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgICAgPyBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIDogc3RhdGUuZGVjaXNpb25zLnNsaWNlKC0xMCk7IC8vIExhc3QgMTAgZGVjaXNpb25zXG5cbiAgICAvLyA1LiBCdWlsZCBjb250ZXh0IHN1bW1hcnlcbiAgICBjb25zdCBjb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLmNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHRTaXplID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29udGV4dCkubGVuZ3RoO1xuXG4gICAgLy8gNi4gUmV0dXJuIHN0YXRlIGFuZCBtZXRyaWNzXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgICAgICBpZDogZy5pZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmlvcml0eTogZy5wcmlvcml0eSxcbiAgICAgICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgICAgIGltcG9ydGFuY2U6IGcuaW1wb3J0YW5jZSxcbiAgICAgICAgICB1cmdlbmN5OiBnLnVyZ2VuY3ksXG4gICAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50OiBnLmVpc2VuaG93ZXJRdWFkcmFudCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGcuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdXBkYXRlZEF0OiBnLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnLmNvbXBsZXRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVuY2llczogZy5kZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmlza0xldmVsOiBnLnJpc2tMZXZlbCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGcuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICAgIGFjdHVhbEVmZm9ydDogZy5hY3R1YWxFZmZvcnQsXG4gICAgICAgICAgbm90ZXM6IGcubm90ZXNcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9ucy5tYXAoZCA9PiAoe1xuICAgICAgICAgIGlkOiBkLmlkLFxuICAgICAgICAgIGdvYWxJZDogZC5nb2FsSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICAgICAgZnJhbWV3b3JrOiBkLmZyYW1ld29yayxcbiAgICAgICAgICBjb25maWRlbmNlOiBkLmNvbmZpZGVuY2UsXG4gICAgICAgICAgb3V0Y29tZTogZC5vdXRjb21lXG4gICAgICAgIH0pKSxcbiAgICAgICAgY29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0ID8gc3RhdGUuY29udGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFN1bW1hcnk6IHtcbiAgICAgICAgICBrZXlzOiBjb250ZXh0S2V5cyxcbiAgICAgICAgICBzaXplOiBjb250ZXh0U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdhdGhlcmVkIGRhdGEgZm9yIGEgc3BlY2lmaWMgZ29hbCBleGVjdXRpb24uXG4gICAqXG4gICAqIEFnZ3JlZ2F0ZXMgZGVjaXNpb24gaGlzdG9yeSwgZ29hbCBzdGF0ZSwgYW5kIHN1bW1hcnkgc3RhdGlzdGljc1xuICAgKiBpbnRvIGEgc3RydWN0dXJlZCBHYXRoZXJlZERhdGEgb2JqZWN0LiBUaGlzIGlzIGEgcmVhZC1zaWRlIHZpZXdcbiAgICogb3ZlciBleGlzdGluZyBhZ2VudCBzdGF0ZSBkYXRhLlxuICAgKlxuICAgKiBJc3N1ZSAjNjg6IEdhdGhlcmVkRGF0YUVudHJ5IGZvciBzdGF0ZSByZWNvcmRpbmdcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBDb21wbGV0aW9uIChFcGljICMzODApXG4gICAqL1xuICBhc3luYyBnZXRHYXRoZXJlZERhdGEocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEdhdGhlcmVkRGF0YT4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2F0aGVyZWQgPSBnZXRHYXRoZXJlZERhdGEocGFyYW1zLmFnZW50TmFtZSwgcGFyYW1zLmdvYWxJZCwgc3RhdGUpO1xuXG4gICAgaWYgKCFnYXRoZXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke3N0YXRlLmdvYWxzLm1hcChnID0+IGcuaWQpLmpvaW4oJywgJykgfHwgJ25vbmUnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqIENvbWJpbmVzIGV4ZWN1dGVBZ2VudCB3aXRoIHN0YXRlIGNvbnRleHRcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29udGludWVBZ2VudEV4ZWN1dGlvbihwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQgJiB7XG4gICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgZ29hbHM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgICByZWNlbnREZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICAgIG91dGNvbWU/OiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBzZXNzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgY29udGludWF0aW9uOiB7XG4gICAgICBpc1Jlc3VtaW5nOiBib29sZWFuO1xuICAgICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzPzogc3RyaW5nW107XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGN1cnJlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgYWN0aXZlR29hbCA9IHN0YXRlLmdvYWxzLmZpbmQoZ29hbCA9PiBnb2FsLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG5cbiAgICBpZiAoIWFjdGl2ZUdvYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNvbnRpbnVlX2V4ZWN1dGlvbiByZXF1aXJlcyBhbiBpbi1wcm9ncmVzcyBnb2FsIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZ29hbC4gSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvZ3Jlc3MgZm9yIGAgK1xuICAgICAgICBgdGhlIGN1cnJlbnQgZ29hbCwgdXNlIG1jcF9hcWxfY3JlYXRlIHJlY29yZF9leGVjdXRpb25fc3RlcC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUdvYWxEZWNpc2lvbnMgPSBzdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGRlY2lzaW9uID0+IGRlY2lzaW9uLmdvYWxJZCA9PT0gYWN0aXZlR29hbC5pZCk7XG4gICAgaWYgKGFjdGl2ZUdvYWxEZWNpc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjb250aW51ZV9leGVjdXRpb24gaXMgb25seSBmb3IgcmVzdW1pbmcgYSBwYXVzZWQgZXhlY3V0aW9uIGFmdGVyIGF0IGxlYXN0IGAgK1xuICAgICAgICBgb25lIHJlY29yZGVkIHN0ZXAgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gQWZ0ZXIgZXhlY3V0ZV9hZ2VudCwgdGhlIGAgK1xuICAgICAgICBgbmV4dCBsaWZlY3ljbGUgY2FsbCBpcyBtY3BfYXFsX2NyZWF0ZSByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDaGVjayBpZiBhZ2VudCBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmVcbiAgICBjb25zdCBpc1Jlc3VtaW5nID0gc3RhdGUuc2Vzc2lvbkNvdW50ID4gMCB8fCBzdGF0ZS5kZWNpc2lvbnMubGVuZ3RoID4gMDtcblxuICAgIC8vIDQuIEV4ZWN1dGUgYWdlbnQgbm9ybWFsbHkgKHRoaXMgYWN0aXZhdGVzIGVsZW1lbnRzIGFuZCBnZXRzIGNvbnRleHQpXG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0gcGFyYW1zLnBhcmFtZXRlcnMgfHwge307XG5cbiAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBZ2VudChcbiAgICAgIHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBleGVjdXRpb25QYXJhbXMsXG4gICAgICB7IG9wZXJhdGlvbk5hbWU6ICdjb250aW51ZV9leGVjdXRpb24nIH1cbiAgICApO1xuXG4gICAgLy8gNS4gQnVpbGQgcHJldmlvdXMgc3RhdGUgc3VtbWFyeVxuICAgIGNvbnN0IHJlY2VudERlY2lzaW9ucyA9IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtNSkubWFwKGQgPT4gKHtcbiAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgIG91dGNvbWU6IGQub3V0Y29tZSxcbiAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGdvYWxTdW1tYXJ5ID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgIGlkOiBnLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgcHJvZ3Jlc3M6IHVuZGVmaW5lZCAvLyBDb3VsZCBhZGQgcHJvZ3Jlc3MgdHJhY2tpbmcgaW4gZnV0dXJlXG4gICAgfSkpO1xuXG4gICAgLy8gNi4gR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gc3RhdGVcbiAgICBjb25zdCBzdWdnZXN0ZWROZXh0U3RlcHMgPSB0aGlzLmdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlKTtcblxuICAgIC8vIDcuIE1lcmdlIGV4ZWN1dGlvbiByZXN1bHQgd2l0aCBjb250aW51YXRpb24gY29udGV4dFxuICAgIHJldHVybiB7XG4gICAgICAvLyBJbmNsdWRlIGFsbCBmaWVsZHMgZnJvbSBleGVjdXRlX2FnZW50IHJlc3VsdFxuICAgICAgLi4uZXhlY3V0aW9uUmVzdWx0LFxuXG4gICAgICAvLyBBZGQgcHJldmlvdXMgc3RhdGUgaW5mb3JtYXRpb25cbiAgICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IGdvYWxTdW1tYXJ5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnMsXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFkZCBjb250aW51YXRpb24gY29udGV4dFxuICAgICAgY29udGludWF0aW9uOiB7XG4gICAgICAgIGlzUmVzdW1pbmcsXG4gICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCxcbiAgICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlOiBBZ2VudFN0YXRlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgZ29hbHNcbiAgICBjb25zdCBwZW5kaW5nR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKTtcbiAgICBpZiAocGVuZGluZ0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFN0YXJ0IHdvcmsgb24gJHtwZW5kaW5nR29hbHMubGVuZ3RofSBwZW5kaW5nIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW4tcHJvZ3Jlc3MgZ29hbHNcbiAgICBjb25zdCBpblByb2dyZXNzR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG4gICAgaWYgKGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBDb250aW51ZSAke2luUHJvZ3Jlc3NHb2Fscy5sZW5ndGh9IGluLXByb2dyZXNzIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYmxvY2tlZCBnb2FscyAoZGVwZW5kZW5jaWVzKVxuICAgIGNvbnN0IGJsb2NrZWRHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+XG4gICAgICBnLmRlcGVuZGVuY2llcyAmJiBnLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwICYmIGcuc3RhdHVzID09PSAncGVuZGluZydcbiAgICApO1xuICAgIGlmIChibG9ja2VkR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yICR7YmxvY2tlZEdvYWxzLmxlbmd0aH0gYmxvY2tlZCBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZGVjaXNpb24gaGlzdG9yeSBmb3IgZmFpbHVyZXNcbiAgICBjb25zdCByZWNlbnRGYWlsdXJlcyA9IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgLnNsaWNlKC0xMClcbiAgICAgIC5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdmYWlsdXJlJyk7XG4gICAgaWYgKHJlY2VudEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJldmlldyBhbmQgYWRkcmVzcyAke3JlY2VudEZhaWx1cmVzLmxlbmd0aH0gcmVjZW50IGZhaWx1cmUocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gIH1cbn1cbiJdfQ==
2809
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDMUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQ3RFLENBQUM7UUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsWUFBWSxDQUFDLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTO2FBQ25DLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLGNBQWMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50TWFuYWdlciAtIFJlZmFjdG9yZWQgdG8gZXh0ZW5kIEJhc2VFbGVtZW50TWFuYWdlclxuICogTWFuYWdlcyBhZ2VudCBDUlVEIG9wZXJhdGlvbnMsIG1ldGFkYXRhIHNhbml0aXphdGlvbiwgYW5kIHN0YXRlIHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4vQWdlbnQuanMnO1xuaW1wb3J0IHtcbiAgQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OLFxuICBBR0VOVF9MSU1JVFMsXG4gIFJJU0tfVE9MRVJBTkNFX0xFVkVMUyxcbiAgU1RFUF9MSU1JVF9BQ1RJT05TLFxuICBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLFxuICBCQUNLT0ZGX1NUUkFURUdJRVMsXG4gIGlzT25lT2YsXG4gIG5vcm1hbGl6ZUF1dG9ub215S2V5cyxcbiAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMsXG4gIG5vcm1hbGl6ZUdvYWxLZXlzLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBBZ2VudE1ldGFkYXRhLFxuICBBZ2VudFN0YXRlLFxuICBFeGVjdXRlQWdlbnRSZXN1bHQsXG4gIEFnZW50R29hbENvbmZpZyxcbiAgQWdlbnRHb2FsUGFyYW1ldGVyLFxuICBBZ2VudE1ldGFkYXRhVjIsXG4gIEFnZW50R29hbCxcbiAgREVGQVVMVF9TQUZFVFlfQ09ORklHLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBBdXRvbm9teURpcmVjdGl2ZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRoZXJlZERhdGEsIHR5cGUgR2F0aGVyZWREYXRhIH0gZnJvbSAnLi9nYXRoZXJlZERhdGEuanMnO1xuaW1wb3J0IHsgZXZhbHVhdGVBdXRvbm9teSB9IGZyb20gJy4vYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHtcbiAgaXNWMUFnZW50LFxuICBjb252ZXJ0VjFUb1YyLFxufSBmcm9tICcuL3YxVG9WMkNvbnZlcnRlci5qcyc7XG5pbXBvcnQge1xuICBkZXRlcm1pbmVTYWZldHlUaWVyLFxuICBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UsXG4gIGNyZWF0ZUNvbmZpcm1hdGlvblJlcXVlc3QsXG4gIGNyZWF0ZURhbmdlclpvbmVPcGVyYXRpb24sXG4gIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gJy4vc2FmZXR5VGllclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IElucHV0Tm9ybWFsaXplciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0Tm9ybWFsaXplci5qcyc7XG5pbXBvcnQgeyBTYWZlUmVnZXggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9kb3NQcm90ZWN0aW9uLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgRWxlbWVudE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplRWxlbWVudFN0b3JhZ2VJZGVudGl0eSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGVzeXN0ZW0uanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IEVsZW1lbnRTdGF0dXMgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5cbmNvbnN0IEFHRU5UX0ZJTEVfRVhURU5TSU9OID0gJy5tZCc7XG5jb25zdCBTVEFURV9ESVJFQ1RPUlkgPSAnLnN0YXRlJztcbmNvbnN0IFNUQVRFX0ZJTEVfRVhURU5TSU9OID0gJy5zdGF0ZS55YW1sJztcbmNvbnN0IE1BWF9ZQU1MX1NJWkUgPSA2NCAqIDEwMjQ7XG5jb25zdCBNQVhfRklMRV9TSVpFID0gMTAwICogMTAyNDtcblxuLyoqIE1hdGNoIHRoZSBzYW5pdGl6ZWQgc3RvcmFnZSBpZGVudGl0eSB1c2VkIGJ5IGFnZW50IGRlZmluaXRpb24gbG9va3VwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUVsZW1lbnRTdG9yYWdlSWRlbnRpdHkoc2FuaXRpemVJbnB1dChuYW1lLCAxMDApKTtcbn1cblxuLy8gSXNzdWUgIzgzOiBDZW50cmFsaXplZCBhY3RpdmUgZWxlbWVudCBsaW1pdHMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMpXG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcsIGdldE1heEFjdGl2ZUxpbWl0IH0gZnJvbSAnLi4vLi4vY29uZmlnL2FjdGl2ZS1lbGVtZW50LWxpbWl0cy5qcyc7XG5cbmludGVyZmFjZSBFbGVtZW50Q3JlYXRpb25SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGVsZW1lbnQ/OiBBZ2VudDtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZEFnZW50RmlsZSB7XG4gIG1ldGFkYXRhOiBBZ2VudE1ldGFkYXRhO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGbGV4aWJsZVJlYWRDYW5kaWRhdGUge1xuICBhZ2VudDogQWdlbnQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGbGV4aWJsZVJlYWRDYW5kaWRhdGVzIHtcbiAgY2FuZGlkYXRlczogRmxleGlibGVSZWFkQ2FuZGlkYXRlW107XG4gIGxvYWRGYWlsdXJlczogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uR2VuZXJhdGlvbkVudHJ5IHtcbiAgdG9rZW46IG9iamVjdDtcbiAgYWN0aXZlRXhlY3V0aW9uczogbnVtYmVyO1xuICBvYnNlcnZlcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25HZW5lcmF0aW9uT2JzZXJ2YXRpb24ge1xuICB0b2tlbjogb2JqZWN0O1xuICByZWxlYXNlOiAoKSA9PiB2b2lkO1xufVxuXG50eXBlIEFnZW50Q3JlYXRlTWV0YWRhdGEgPSAoUGFydGlhbDxBZ2VudE1ldGFkYXRhPiAmIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPikgJiB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIEFnZW50QWN0aXZhdGlvblJlc3VsdCA9IHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBhZ2VudD86IEFnZW50IH07XG5cbmV4cG9ydCBjbGFzcyBBZ2VudE1hbmFnZXIgZXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXI8QWdlbnQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZURpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlQ2FjaGU6IE1hcDxzdHJpbmcsIEFnZW50U3RhdGU+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTogVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2U7XG4gIC8qKiBQZXItYWdlbnQgdG9rZW5zIHJldGFpbmVkIG9ubHkgd2hpbGUgZXhlY3V0aW9uIG9yIHJlY292ZXJ5IGlzIGluIGZsaWdodC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25HZW5lcmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBFeGVjdXRpb25HZW5lcmF0aW9uRW50cnk+KCk7XG4gIC8vIEZhbGxiYWNrIGlkZW50aXRpZXMgZm9yIGFnZW50cyB3aXRob3V0IGF0dGFjaGVkIHN0b3JhZ2UgbWV0YWRhdGEuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlQWdlbnROYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8vIFN0YWJsZSBmaWxlbmFtZSAtPiBuYW1lIHVzZWQgYXQgYWN0aXZhdGlvbi4gRmlsZW5hbWVzIGFyZSBhdXRob3JpdGF0aXZlO1xuICAvLyB0aGUgcmV0YWluZWQgbmFtZSByZW1haW5zIGEgdmFsaWQgZGVhY3RpdmF0aW9uIGFsaWFzIGFmdGVyIG1ldGFkYXRhIGVkaXRzLlxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZUFnZW50c0J5RmlsZW5hbWU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gU3RhdGljIHJlc29sdmVyIGZvciBlbGVtZW50IG1hbmFnZXIgbG9va3VwIChESSBwYXR0ZXJuKVxuICAvLyBUaGlzIGFsbG93cyBBZ2VudCBpbnN0YW5jZXMgdG8gcmVzb2x2ZSBtYW5hZ2VycyB3aXRob3V0IHRpZ2h0IGNvdXBsaW5nXG4gIHByaXZhdGUgc3RhdGljIGVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXI/OiAobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55O1xuXG4gIC8vIElzc3VlICM0MDI6IFN0YXRpYyByZXNvbHZlciBmb3IgRGFuZ2VyWm9uZUVuZm9yY2VyIChESSBwYXR0ZXJuKVxuICBwcml2YXRlIHN0YXRpYyBkYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcj86ICgpID0+IGltcG9ydCgnLi90eXBlcy5qcycpLkRhbmdlclpvbmVCbG9ja2VyO1xuXG4gIC8vIElzc3VlICMxNDI6IFN0YXRpYyByZXNvbHZlciBmb3IgVmVyaWZpY2F0aW9uU3RvcmUgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIHZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXI/OiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBiYXNlRGlyOiBzdHJpbmcsXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBjb25zdCBlbGVtZW50RGlyT3ZlcnJpZGUgPSBwYXRoLmpvaW4oYmFzZURpciwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgIHN1cGVyKEVsZW1lbnRUeXBlLkFHRU5ULCBwb3J0Zm9saW9NYW5hZ2VyLCBmaWxlTG9ja01hbmFnZXIsIHsgZWxlbWVudERpck92ZXJyaWRlLCBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMuc3RhdGVEaXIgPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBTVEFURV9ESVJFQ1RPUlkpO1xuICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gICAgdGhpcy5tZXRhZGF0YVNlcnZpY2UgPSBtZXRhZGF0YVNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdhZ2VudCc7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBlbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgZm9yIGVsZW1lbnQtYWdub3N0aWMgYWN0aXZhdGlvblxuICAgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBpbml0aWFsaXphdGlvblxuICAgKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgTWVtb3J5LmNvbmZpZ3VyZU1lbW9yeU1hbmFnZXJSZXNvbHZlclxuICAgKlxuICAgKiBAcGFyYW0gcmVzb2x2ZXIgRnVuY3Rpb24gdGhhdCB0YWtlcyBhIG1hbmFnZXIgbmFtZSBhbmQgcmV0dXJucyB0aGUgbWFuYWdlciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKHJlc29sdmVyOiAobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNDAyOiBTZXQgRGFuZ2VyWm9uZUVuZm9yY2VyIHJlc29sdmVyIGZvciBESSBpbmplY3Rpb24uXG4gICAqIENhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0RGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IGltcG9ydCgnLi90eXBlcy5qcycpLkRhbmdlclpvbmVCbG9ja2VyKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzE0MjogU2V0IFZlcmlmaWNhdGlvblN0b3JlIHJlc29sdmVyIGZvciBESSBpbmplY3Rpb24uXG4gICAqIENhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4geyBzZXQ6IChpZDogc3RyaW5nLCBjaGFsbGVuZ2U6IHsgY29kZTogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfSkgPT4gdm9pZCB9KTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpOiAoKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueSkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBzdGF0aWMgcmVzb2x2ZXJzIChmb3IgdGVzdCBjbGVhbnVwKVxuICAgKiBDYWxsIHRoaXMgaW4gYWZ0ZXJFYWNoIGhvb2tzIHRvIHByZXZlbnQgdGVzdCBpc29sYXRpb24gaXNzdWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc2V0UmVzb2x2ZXJzKCk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGFnZW50cyBhbmQgc3RhdGUgZmlsZXMuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5zdGF0ZURpcik7XG4gICAgbG9nZ2VyLmluZm8oJ0FnZW50TWFuYWdlciBpbml0aWFsaXplZCcsIHsgcGF0aDogdGhpcy5lbGVtZW50RGlyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBhZ2VudCBvbiBkaXNrLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IEFnZW50Q3JlYXRlTWV0YWRhdGFcbiAgKTogUHJvbWlzZTxFbGVtZW50Q3JlYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBnb2FsIGlucHV0IGJlZm9yZSB2YWxpZGF0aW9uIC0gTExNcyBtYXkgcGFzcyBzdHJpbmcgb3Igb2JqZWN0XG4gICAgICAvLyBTdHJpcCAnY29udGVudCcgZnJvbSBtZXRhZGF0YSB0byBwcmV2ZW50IGl0IGZyb20gb3ZlcndyaXRpbmcgdGhlIHBvc2l0aW9uYWxcbiAgICAgIC8vIGNvbnRlbnQgcGFyYW0gKHdoaWNoIGlzIHRoZSBhZ2VudCdzIGluc3RydWN0aW9ucyB0ZXh0KSBpbiB0aGUgdmFsaWRhdGlvbiBjYWxsLlxuICAgICAgY29uc3QgeyBjb250ZW50OiByZWZlcmVuY2VDb250ZW50LCAuLi5tZXRhZGF0YVdpdGhvdXRDb250ZW50IH0gPSBtZXRhZGF0YSA/PyB7fTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+ID0ge1xuICAgICAgICAuLi5tZXRhZGF0YVdpdGhvdXRDb250ZW50XG4gICAgICB9O1xuICAgICAgaWYgKG1ldGFkYXRhPy5nb2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9ybWFsaXplZE1ldGFkYXRhLmdvYWwgPSB0aGlzLm5vcm1hbGl6ZUdvYWxJbnB1dChcbiAgICAgICAgICBtZXRhZGF0YS5nb2FsIGFzIHN0cmluZyB8IFBhcnRpYWw8QWdlbnRHb2FsQ29uZmlnPlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBpbnB1dCB2YWxpZGF0aW9uLlxuICAgICAgLy8gQWdlbnRzIHN1cHBvcnQgZHVhbC1maWVsZCBjcmVhdGlvbjogYmVoYXZpb3JhbCBpbnN0cnVjdGlvbnMgYW5kIG9wdGlvbmFsXG4gICAgICAvLyByZWZlcmVuY2UgY29udGVudC4gVmFsaWRhdGlvbiBwcmVmZXJzIGJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIHdoZW4gYm90aFxuICAgICAgLy8gZmllbGRzIGFyZSBwcmVzZW50IHNvIGV4aXN0aW5nIGluc3RydWN0aW9uLWZpcnN0IGFnZW50cyBrZWVwIHRoZWlyXG4gICAgICAvLyBjdXJyZW50IHNlbWFudGljcyB3aGlsZSBjb250ZW50LW9ubHkgYWdlbnRzIHN0aWxsIHZhbGlkYXRlIGNvcnJlY3RseS5cbiAgICAgIGNvbnN0IHZhbGlkYXRpb25JbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAuLi5ub3JtYWxpemVkTWV0YWRhdGFcbiAgICAgIH07XG4gICAgICBjb25zdCBwcmltYXJ5VGV4dCA9IHRoaXMuZ2V0UHJpbWFyeVZhbGlkYXRpb25UZXh0KGNvbnRlbnQsIHJlZmVyZW5jZUNvbnRlbnQpO1xuICAgICAgdmFsaWRhdGlvbklucHV0LmNvbnRlbnQgPSBwcmltYXJ5VGV4dCA/PyAnJztcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSh2YWxpZGF0aW9uSW5wdXQpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCBjcmVhdGlvbiB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbml0aXplIGlucHV0cyBmb3IgZWxlbWVudCBjcmVhdGlvblxuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApO1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGNvbnN0IHNhbml0aXplZEluc3RydWN0aW9ucyA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKHNhbml0aXplZE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgYWdlbnQgbmFtZS4gVXNlIG9ubHkgbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzLidcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgICAuLi5ub3JtYWxpemVkTWV0YWRhdGEsXG4gICAgICAgIG5hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZWREZXNjcmlwdGlvblxuICAgICAgfSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICBhZ2VudC5tZXRhZGF0YS5hdXRob3IgPSBub3JtYWxpemVkTWV0YWRhdGE/LmF1dGhvciA/PyB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogbm9ybWFsaXplZE1ldGFkYXRhPy5zcGVjaWFsaXphdGlvbnMgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uc3BlY2lhbGl6YXRpb25zID8/IFtdLFxuICAgICAgICBkZWNpc2lvbkZyYW1ld29yazogbm9ybWFsaXplZE1ldGFkYXRhPy5kZWNpc2lvbkZyYW1ld29yayA/PyBhZ2VudC5leHRlbnNpb25zPy5kZWNpc2lvbkZyYW1ld29yayxcbiAgICAgICAgcmlza1RvbGVyYW5jZTogbm9ybWFsaXplZE1ldGFkYXRhPy5yaXNrVG9sZXJhbmNlID8/IGFnZW50LmV4dGVuc2lvbnM/LnJpc2tUb2xlcmFuY2UsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogbm9ybWFsaXplZE1ldGFkYXRhPy5sZWFybmluZ0VuYWJsZWQgPz8gYWdlbnQuZXh0ZW5zaW9ucz8ubGVhcm5pbmdFbmFibGVkLFxuICAgICAgfTtcbiAgICAgIC8vIFByb21vdGUgaW5zdHJ1Y3Rpb25zIHRvIGZpcnN0LWNsYXNzIHByb3BlcnR5IChubyBsb25nZXIgaW4gZXh0ZW5zaW9ucylcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcbiAgICAgIC8vIEFsc28ga2VlcCBpbiBleHRlbnNpb25zIGZvciBiYWNrd2FyZCBjb21wYXQgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgIGFnZW50LmV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuXG4gICAgICAvLyBTZXQgcmVmZXJlbmNlIGNvbnRlbnQgaWYgcHJvdmlkZWQgKHYyLjAgZHVhbC1maWVsZCBhcmNoaXRlY3R1cmUpXG4gICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoXG4gICAgICAgICAgcmVmZXJlbmNlQ29udGVudCxcbiAgICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7KGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnMgfHwgWydDb250ZW50IHZhbGlkYXRpb24gZmFpbGVkJ10pLmpvaW4oJywgJyl9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYWdlbnQuY29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3Mjc6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgVjIgZmllbGRzIEJFRk9SRSBhc3NpZ25tZW50LlxuICAgICAgLy8gVGhpcyBpcyB0aGUgU0VDT05EIHZhbGlkYXRpb24gbGF5ZXIg4oCUIEFnZW50RWxlbWVudFZhbGlkYXRvciAoY2FsbGVkIGFib3ZlIHZpYVxuICAgICAgLy8gdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUpIGlzIHRoZSBmaXJzdC4gVGhlIHZhbGlkYXRvciBjYXRjaGVzIGNhbWVsQ2FzZVxuICAgICAgLy8gaW52YWxpZCB2YWx1ZXM7IHRoaXMgbWV0aG9kIGFsc28gbm9ybWFsaXplcyBzbmFrZV9jYXNlIGtleXMgKHdoaWNoIHRoZSB2YWxpZGF0b3JcbiAgICAgIC8vIGRvZXNuJ3Qgc2VlKSBhbmQgdmFsaWRhdGVzIHRoZW0uIEJvdGggbGF5ZXJzIGFyZSBuZWVkZWQuIFNlZSBJc3N1ZSAjNzMwLlxuICAgICAgY29uc3QgbWV0YWRhdGFWMiA9IG5vcm1hbGl6ZWRNZXRhZGF0YSBhcyBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobWV0YWRhdGFWMikge1xuICAgICAgICBjb25zdCB2MkVycm9ycyA9IHRoaXMudmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YVYyKTtcbiAgICAgICAgaWYgKHYyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVjIgZmllbGQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7djJFcnJvcnMuam9pbignOyAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWMiBGSUVMRFM6IFN0b3JlIFYyLXNwZWNpZmljIGZpZWxkcyBpbiBhZ2VudCBtZXRhZGF0YSAobm90IGp1c3QgZXh0ZW5zaW9ucylcbiAgICAgIC8vIFRoaXMgZW5hYmxlcyBWMiBhZ2VudCBjcmVhdGlvbiB2aWEgTUNQLUFRTCBjcmVhdGVfZWxlbWVudCBvcGVyYXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nb2FsKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdvYWwgPSBtZXRhZGF0YVYyLmdvYWw7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYWN0aXZhdGVzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnRvb2xzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuc3lzdGVtUHJvbXB0ID0gbWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYXV0b25vbXkpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzQ0OTogUGVyc2lzdCBnYXRla2VlcGVyIHBvbGljeSBmb3IgR2F0ZWtlZXBlciBlbmZvcmNlbWVudCBkdXJpbmcgZXhlY3V0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzcyMjogUGVyc2lzdCByZXNpbGllbmNlIHBvbGljeSAod2FzIG1pc3NpbmcgZnJvbSBWMiBmaWVsZCBhc3NpZ25tZW50cylcbiAgICAgIGlmIChtZXRhZGF0YVYyPy5yZXNpbGllbmNlKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdBZ2VudHMuZmluZChhID0+XG4gICAgICAgIGEubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyaWFsaXplIHRoZSBhZ2VudCBjb250ZW50IGZpcnN0XG4gICAgICBjb25zdCBzZXJpYWxpemVkQ29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChhZ2VudCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpO1xuXG4gICAgICAvLyBVc2UgYXRvbWljIGZpbGUgY3JlYXRpb24gdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBjaGVjay10aGVuLXdyaXRlIHBhdHRlcm4gd2l0aCBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uXG4gICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVGaWxlRXhjbHVzaXZlKGFic29sdXRlUGF0aCwgc2VyaWFsaXplZENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgZWxlbWVudCBhZnRlciBzdWNjZXNzZnVsIGNyZWF0aW9uXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChhZ2VudCwgZmlsZW5hbWUpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQoZmlsZW5hbWUsIGFic29sdXRlUGF0aCk7XG4gICAgICAvLyBOb3RlOiBObyByZWxvYWQoKSBoZXJlIOKAlCBjYWNoZUVsZW1lbnQoKSBzdG9yZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgICAgLy8gU2VlIElzc3VlICM0OTEgZm9yIHdoeSBQZXJzb25hTWFuYWdlcidzIHJlbG9hZC1hZnRlci1jcmVhdGUgd2FzIHJlbW92ZWQuXG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgY3JlYXRlZGAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGFnZW50SWQ6IGFnZW50LmlkIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBg8J+kliAqKiR7c2FuaXRpemVkTmFtZX0qKiBieSAke2FnZW50Lm1ldGFkYXRhLmF1dGhvciB8fCAnYW5vbnltb3VzJ31gLFxuICAgICAgICBlbGVtZW50OiBhZ2VudFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGFnZW50JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGFuIGFnZW50IGJ5IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBBZ2VudCBuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcbiAgICogQHJldHVybnMgQWdlbnQgaW5zdGFuY2Ugb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIHJlYWQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZWFkV2l0aFN0YXRlUG9saWN5KG5hbWUsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGFuIGFnZW50IHdoaWxlIHNlbGVjdGluZyB3aGV0aGVyIHN0YXRlLXN0b3JhZ2UgZmFpbHVyZXMgYXJlIGZhdGFsLlxuICAgKiBTZWN1cml0eS1zZW5zaXRpdmUgY2FsbGVycyB1c2Ugc3RyaWN0IHN0YXRlIHJlYWRzIHNvIHVuYXZhaWxhYmxlIGR1cmFibGVcbiAgICogc3RhdGUgY2Fubm90IGJlIG1pc3Rha2VuIGZvciBhbiBhZ2VudCB3aXRoIG5vIGFjdGl2ZSBnb2Fscy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZFdpdGhTdGF0ZVBvbGljeShuYW1lOiBzdHJpbmcsIHN0cmljdFN0YXRlRXJyb3JzOiBib29sZWFuKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRBZ2VudEZpbGUoZmlsZW5hbWUsIHRydWUsIHN0cmljdFN0YXRlRXJyb3JzLCAhc3RyaWN0U3RhdGVFcnJvcnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IGZsZXhpYmxlIG1hdGNoaW5nIHZpYSBsaXN0IHNjYW4gKCM2MDcpXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGbGV4aWJseShuYW1lLCBzdHJpY3RTdGF0ZUVycm9ycyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgZm9yIHJlYWQoKSB3aGVuIGRpcmVjdCBmaWxlIGxvb2t1cCBmYWlscy5cbiAgICogU2VhcmNoZXMgbG9hZGVkIGFnZW50cyBieSBtZXRhZGF0YSBuYW1lIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNsdWcgbWF0Y2hpbmcuXG4gICAqIExvZ3MgYSB3YXJuaW5nIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCAoaW5kaWNhdGVzIGZpbGVuYW1lL25hbWUgbWlzbWF0Y2ggbmVlZGluZyBjbGVhbnVwKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRmlsZSBvbiBkaXNrOiBcImxlZ2FjeS1wb3N0ZXItYWdlbnQubWRcIlxuICAgKiAvLyBNZXRhZGF0YSBuYW1lOiBcImxlZ2FjeS1wb3N0ZXJcIlxuICAgKiAvLyBEaXJlY3QgbG9va3VwIGZvciBcImxlZ2FjeS1wb3N0ZXIubWRcIiBmYWlscyAoRU5PRU5UKVxuICAgKiAvLyBGbGV4aWJsZSBmYWxsYmFjayBtYXRjaGVzIHZpYSBtZXRhZGF0YSBuYW1lOlxuICAgKiBjb25zdCBhZ2VudCA9IGF3YWl0IHJlYWQoXCJsZWdhY3ktcG9zdGVyXCIpOyAvLyByZXNvbHZlcyB2aWEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZsZXhpYmx5KG5hbWU6IHN0cmluZywgc3RyaWN0U3RhdGVFcnJvcnMgPSBmYWxzZSk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgY2FuZGlkYXRlcywgbG9hZEZhaWx1cmVzIH0gPSBhd2FpdCB0aGlzLmxpc3RGb3JGbGV4aWJsZVJlYWQoc3RyaWN0U3RhdGVFcnJvcnMpO1xuXG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgICAvLyBQYXNzIDE6IGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb24gbWV0YWRhdGEgbmFtZVxuICAgICAgbGV0IG1hdGNoID0gY2FuZGlkYXRlcy5maW5kKFxuICAgICAgICAoeyBhZ2VudCB9KSA9PiBhZ2VudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHNlYXJjaExvd2VyXG4gICAgICApO1xuXG4gICAgICAvLyBQYXNzIDI6IHNsdWcgbWF0Y2ggKGhhbmRsZXMgZGFzaGVzLCB1bmRlcnNjb3JlcywgY2FzaW5nIGRpZmZlcmVuY2VzKVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBtYXRjaCA9IGNhbmRpZGF0ZXMuZmluZCgoeyBhZ2VudCB9KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2x1ZyA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoYWdlbnQubWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHNsdWcgPT09IHNlYXJjaFNsdWcgfHwgc2x1ZyA9PT0gc2VhcmNoTG93ZXI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgLy8gU3RyaWN0IHJlY292ZXJ5IHZlcmlmaWVzIHRoZSBjYWxsZXItcmVxdWVzdGVkIGlkZW50aXR5LiBPcmRpbmFyeSBsZWdhY3lcbiAgICAgICAgLy8gcmVhZHMgcHJlc2VydmUgdGhlIHN0YXRlIGlkZW50aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0Y2hlZCBmaWxlLlxuICAgICAgICBjb25zdCBzdGF0ZUlkZW50aXR5ID0gc3RyaWN0U3RhdGVFcnJvcnMgPyBuYW1lIDogdGhpcy5zdHJpcEV4dGVuc2lvbihtYXRjaC5maWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFN0YXRlRm91bmQgPSBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKFxuICAgICAgICAgIG1hdGNoLmFnZW50LFxuICAgICAgICAgIHN0YXRlSWRlbnRpdHksXG4gICAgICAgICAgc3RyaWN0U3RhdGVFcnJvcnMsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycyAmJiAhcmVxdWVzdGVkU3RhdGVGb3VuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgdmVyaWZ5IGR1cmFibGUgc3RhdGUgZm9yIGZsZXhpYmx5IG1hdGNoZWQgYWdlbnQgXCIke25hbWV9XCIgdW5kZXIgaXRzIHJlcXVlc3RlZCBpZGVudGl0eWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bmFtZX1cIiByZXNvbHZlZCB2aWEgZmxleGlibGUgbWF0Y2hpbmcgdG8gZmlsZSB3aXRoIG1ldGFkYXRhIG5hbWUgXCIke21hdGNoLmFnZW50Lm1ldGFkYXRhLm5hbWV9XCIuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciByZW5hbWluZyB0aGUgZmlsZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udmVudGlvbiAoIzYwNykuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWF0Y2guYWdlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2FkRmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBsb2FkRmFpbHVyZXNbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKGxvb2t1cEVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZsZXhpYmxlIGFnZW50IGxvb2t1cCBmYWlsZWQgZm9yIFwiJHtuYW1lfVwiOiAke2xvb2t1cEVycm9yfWApO1xuICAgICAgdGhyb3cgbG9va3VwRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVudW1lcmF0ZSBmYWxsYmFjayBjYW5kaWRhdGVzIHdpdGhvdXQgY3JlYXRpbmcgbWlzc2luZyBzdG9yYWdlLiBTdHJpY3RcbiAgICogcmVjb3ZlcnkgcHJvcGFnYXRlcyBsaXN0aW5nIGZhaWx1cmVzOyBvcmRpbmFyeSByZWFkcyByZXRhaW4gdGhlIHBvcnRmb2xpb1xuICAgKiBBUEkncyBlbXB0eS1kaXJlY3RvcnkgYW5kIHVuYXZhaWxhYmxlLWRpcmVjdG9yeSBjb21wYXRpYmlsaXR5IGJlaGF2aW9yLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0Rm9yRmxleGlibGVSZWFkKHN0cmljdFN0YXRlRXJyb3JzOiBib29sZWFuKTogUHJvbWlzZTxGbGV4aWJsZVJlYWRDYW5kaWRhdGVzPiB7XG4gICAgY29uc3QgZmlsZXMgPSBzdHJpY3RTdGF0ZUVycm9yc1xuICAgICAgPyBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKEVsZW1lbnRUeXBlLkFHRU5ULCB7IHRocm93T25GaWxlc3lzdGVtRXJyb3I6IHRydWUgfSlcbiAgICAgIDogYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyhFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgLy8gTG9hZCBkZWZpbml0aW9ucyB3aXRob3V0IGNhbmRpZGF0ZS1maWxlbmFtZSBzdGF0ZS4gT25jZSBhIG1hdGNoIGlzIGtub3duLFxuICAgIC8vIHJlYWRGbGV4aWJseSgpIGh5ZHJhdGVzIGl0IHVzaW5nIHRoZSByZXF1ZXN0ZWQgbG9naWNhbCBpZGVudGl0eS5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgZmlsZXMubWFwKGZpbGUgPT4gdGhpcy5sb2FkQWdlbnRGaWxlKGZpbGUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKVxuICAgICk7XG4gICAgY29uc3QgY2FuZGlkYXRlczogRmxleGlibGVSZWFkQ2FuZGlkYXRlcyA9IHtcbiAgICAgIGNhbmRpZGF0ZXM6IFtdLFxuICAgICAgbG9hZEZhaWx1cmVzOiBbXVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzdWx0XSBvZiByZXN1bHRzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMuY2FuZGlkYXRlcy5wdXNoKHsgYWdlbnQ6IHJlc3VsdC52YWx1ZSwgZmlsZVBhdGg6IGZpbGVzW2luZGV4XSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbmRpZGF0ZXMubG9hZEZhaWx1cmVzLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXM7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGFkYXRhL2NvbnRlbnQgZm9yIGFuIGV4aXN0aW5nIGFnZW50LlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGE+LFxuICAgIGNvbnRlbnQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChzYW5pdGl6ZWROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICBsb2dnZXIud2FybihgQWdlbnQgbm90IGZvdW5kIGZvciB1cGRhdGU6ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBlZGl0IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVFZGl0KGFnZW50LCB7XG4gICAgICAuLi51cGRhdGVzLFxuICAgICAgY29udGVudFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQWdlbnQgdXBkYXRlIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IHVwZGF0ZSB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFxuICAgICAgICBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1cGRhdGVzLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgNTAwXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLnNwZWNpYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zLm1hcChpdGVtID0+IHNhbml0aXplSW5wdXQoaXRlbSwgNTApKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5kZWNpc2lvbkZyYW1ld29yayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBkZWNpc2lvbkZyYW1ld29yazogdXBkYXRlcy5kZWNpc2lvbkZyYW1ld29ya1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IHVwZGF0ZXMucmlza1RvbGVyYW5jZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5sZWFybmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgbGVhcm5pbmdFbmFibGVkOiB1cGRhdGVzLmxlYXJuaW5nRW5hYmxlZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQubWV0YWRhdGEubWF4Q29uY3VycmVudEdvYWxzID0gdXBkYXRlcy5tYXhDb25jdXJyZW50R29hbHM7XG4gICAgfVxuXG4gICAgYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBVc2UgQ29udGVudFZhbGlkYXRvciBmb3IgbXVsdGktbGluZSBjb250ZW50IHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgKG5ld2xpbmVzLCB0YWJzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgZGV0ZWN0aW5nIHByb21wdCBpbmplY3Rpb24gYXR0YWNrc1xuICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH0pO1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKSk7XG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IHVwZGF0ZWQ6ICR7c2FuaXRpemVkTmFtZX1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIHByb3ZpZGVkIGFnZW50IG5hbWUuXG4gICAqL1xuICB2YWxpZGF0ZU5hbWUobmFtZTogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGJlIGVtcHR5JyB9O1xuICAgIH1cblxuICAgIGlmIChuYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShuYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05hbWUgY2FuIG9ubHkgY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGFnZW50IGZyb20gc2VyaWFsaXplZCBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgaW1wb3J0RWxlbWVudChkYXRhOiBzdHJpbmcsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlSnNvbihkYXRhLCB7XG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgfSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChwYXJzZWQubWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAgIGlmIChwYXJzZWQuc3RhdGUpIHtcbiAgICAgICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkocGFyc2VkKSk7XG4gICAgICB9XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IHBhcnNlZC5pbnN0cnVjdGlvbnMgfHwgJydcbiAgICAgIH07XG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfVxuXG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBmcm9udG1hdHRlciBwYXJzaW5nXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiByZXN1bHQuY29udGVudC50cmltKClcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gYWdlbnQgdG8gSlNPTiBvciBtYXJrZG93biAoZGVmYXVsdCkuXG4gICAqL1xuICBhc3luYyBleHBvcnRFbGVtZW50KGFnZW50OiBBZ2VudCwgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICByZXR1cm4gYWdlbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRWxlbWVudChhZ2VudCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBhZ2VudCBmaWxlLCBlbmZvcmNpbmcgc2l6ZSBhbmQgZm9ybWF0IGNoZWNrcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkQWdlbnRGaWxlKGZpbGVQYXRoLCB0cnVlLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRBZ2VudEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBoeWRyYXRlU3RhdGU6IGJvb2xlYW4sXG4gICAgc3RyaWN0U3RhdGVFcnJvcnM6IGJvb2xlYW4sXG4gICAgY2FjaGVMb2FkZWRFbGVtZW50ID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGNvbnN0IHNhbml0aXplZElucHV0ID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBzYW5pdGl6ZWRJbnB1dC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gc2FuaXRpemVkSW5wdXRcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KHNhbml0aXplZElucHV0LCAxMDApKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBhdGgocmVsYXRpdmVQYXRoLCB0aGlzLmVsZW1lbnREaXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEludmFsaWQgYWdlbnQgcGF0aDogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCd9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShmdWxsUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IGZpbGUgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfRklMRV9TSVpFfSBieXRlc2ApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGNvbnRlbnQpO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkLm1ldGFkYXRhKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIGlmIChoeWRyYXRlU3RhdGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oeWRyYXRlQWdlbnRTdGF0ZShcbiAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICB0aGlzLnN0cmlwRXh0ZW5zaW9uKHJlbGF0aXZlUGF0aCksXG4gICAgICAgICAgc3RyaWN0U3RhdGVFcnJvcnMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY2FjaGVMb2FkZWRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGFnZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgLFxuICAgICAgICBkZXRhaWxzOiBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIEJhc2VFbGVtZW50TWFuYWdlci5zYXZlIHRvIHBlcnNpc3Qgc3RhdGUgd2hlbiByZXF1aXJlZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoYWdlbnQ6IEFnZW50LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgYXdhaXQgc3VwZXIuc2F2ZShhZ2VudCwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCksIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTsgIC8vIFN5bmMgYWdlbnQncyBpbnRlcm5hbCB2ZXJzaW9uIChJc3N1ZSAjMTIzIGZpeClcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50IHN0YXRlIHRvIGRpc2sgKHB1YmxpYyBBUEkgZm9yIGV4dGVybmFsIGNhbGxlcnMpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgcHJvcGVyIHdheSBmb3IgZXh0ZXJuYWwgY29kZSAoc3RyYXRlZ2llcywgaGFuZGxlcnMpIHRvXG4gICAqIHRyaWdnZXIgc3RhdGUgcGVyc2lzdGVuY2UuIEl0IGltcGxlbWVudHMgdGhlIE9wdGlvbiBDIHBhdHRlcm4gZnJvbSBJc3N1ZSAjMTIzOlxuICAgKiBzdGF0ZVZlcnNpb24gaXMgb25seSBpbmNyZW1lbnRlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gVHJ1ZSBpZiBzdGF0ZSB3YXMgcGVyc2lzdGVkLCBmYWxzZSBpZiBub3QgbmVlZGVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYWdlbnQgbm90IGZvdW5kIG9yIHNhdmUgZmFpbHNcbiAgICovXG4gIGFzeW5jIHBlcnNpc3RTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byByZW1vdmUgYXNzb2NpYXRlZCBzdGF0ZSBmaWxlLlxuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSB0byBlbnN1cmUgc3RhdGUgZmlsZSBkZWxldGlvbiBtYXRjaGVzXG4gICAqIHRoZSBub3JtYWxpemVkIGZpbGVuYW1lIHVzZWQgZm9yIHN0YXRlIGZpbGUgY3JlYXRpb24vbG9hZGluZy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCk7XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGRlbGV0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBCYWNrIHVwIHRoZSBzdGF0ZSBmaWxlIGJlZm9yZSBkZWxldGluZyBpdFxuICAgICAgaWYgKHRoaXMuYmFja3VwU2VydmljZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tb3ZlZE9yaWdpbmFsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWROYW1lKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgcmV0dXJuIHN1cGVyLmV4aXN0cyhzYW5pdGl6ZWRQYXRoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0UGF0aC5pbmNsdWRlcygnLi4nKSB8fCB0YXJnZXRQYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IC9eW0EtWmEtel06Ly50ZXN0KHRhcmdldFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBBR0VOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlQWdlbnROYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgYWN0aXZlIHN0YXR1cyBieSBkaXNwbGF5IG5hbWUgb3IsIHdoZW4gYXZhaWxhYmxlLCBzdGFibGUgZmlsZW5hbWUuXG4gICAgZm9yIChjb25zdCBhZ2VudCBvZiBhZ2VudHMpIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRTdGFibGVGaWxlbmFtZShhZ2VudCk7XG4gICAgICBpZiAoXG4gICAgICAgIChmaWxlbmFtZSAmJiB0aGlzLmFjdGl2ZUFnZW50c0J5RmlsZW5hbWUuaGFzKGZpbGVuYW1lKSkgfHxcbiAgICAgICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhZ2VudC5tZXRhZGF0YS5uYW1lKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudCB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2VudHM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8QWdlbnRBY3RpdmF0aW9uUmVzdWx0PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVSZXNvbHZlZEFnZW50KGFnZW50LCBpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBhZ2VudCB0aHJvdWdoIGl0cyBhdXRob3JpdGF0aXZlIHN0b3JhZ2UgZmlsZW5hbWUuXG4gICAqIFVzZWQgZm9yIHBlcnNpc3RlZCBhY3RpdmF0aW9uIHJlc3RvcmUgd2hlbiBtZXRhZGF0YS5uYW1lIG1heSBoYXZlIGNoYW5nZWQuXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50QnlGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudEFjdGl2YXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuZmluZEJ5RmlsZW5hbWUoZmlsZW5hbWUpO1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRlUmVzb2x2ZWRBZ2VudChhZ2VudCwgZmlsZW5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY3RpdmF0ZVJlc29sdmVkQWdlbnQoYWdlbnQ6IEFnZW50IHwgdW5kZWZpbmVkLCBpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50QWN0aXZhdGlvblJlc3VsdD4ge1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkFHRU5ULCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBNRU1PUlkgTEVBSyBGSVg6IENoZWNrIGlmIGNsZWFudXAgaXMgbmVlZGVkIGJlZm9yZSBhZGRpbmdcbiAgICB0aGlzLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpO1xuXG4gICAgLy8gUHJlZmVyIHN0YWJsZSBzdG9yYWdlIGlkZW50aXR5IHNvIGV4dGVybmFsIGRpc3BsYXktbmFtZSBlZGl0cyBjYW5ub3RcbiAgICAvLyBjb2xsYXBzZSBvciBvcnBoYW4gYWN0aXZlIGFnZW50cy5cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0U3RhYmxlRmlsZW5hbWUoYWdlbnQpO1xuICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgdGhpcy5hY3RpdmVBZ2VudHNCeUZpbGVuYW1lLnNldChmaWxlbmFtZSwgYWdlbnQubWV0YWRhdGEubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5hZGQoYWdlbnQubWV0YWRhdGEubmFtZSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGFnZW50IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuYWN0aXZhdGVBZ2VudCcsXG4gICAgICBkZXRhaWxzOiBgQWdlbnQgYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgZ29hbENvdW50OiAoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBhZ2VudC5tZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkFHRU5ULCBhZ2VudC5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIGFnZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBzdGFibGUgc3RvcmFnZSBpZGVudGl0eSB1c2VkIHRvIHBlcnNpc3QgYW4gYWdlbnQgYWN0aXZhdGlvbi5cbiAgICogVGhlIGZpbGVuYW1lIHJlbWFpbnMgdW5jaGFuZ2VkIHdoZW4gbWV0YWRhdGEubmFtZSBpcyBlZGl0ZWQgZXh0ZXJuYWxseS5cbiAgICovXG4gIGFzeW5jIGdldFN0YWJsZUFjdGl2YXRpb25GaWxlbmFtZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuICAgIHJldHVybiBhZ2VudCA/IHRoaXMuZ2V0U3RhYmxlRmlsZW5hbWUoYWdlbnQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgZmlsZW5hbWU/OiBzdHJpbmcgfT4ge1xuICAgIC8vIERlYWN0aXZhdGlvbiBpcyBhIHNlY3VyaXR5LXNlbnNpdGl2ZSBsaWZlY3ljbGUgY2hhbmdlLiBSZWZyZXNoIGZpcnN0LFxuICAgIC8vIHRoZW4gZmFsbCBiYWNrIHRvIHN0YWJsZSBhY3RpdmUgZmlsZW5hbWVzIHdoZW4gZXh0ZXJuYWwgbWV0YWRhdGEgZWRpdHNcbiAgICAvLyBoYXZlIG1hZGUgdGhlIGN1cnJlbnQgZGlzcGxheSBuYW1lIGRpdmVyZ2UgZnJvbSBpdHMgc3RvcmFnZSBwYXRoLlxuICAgIGF3YWl0IHRoaXMuc2NhbkFuZEV2aWN0KHsgZnJlc2hBZnRlckluRmxpZ2h0OiB0cnVlIH0pO1xuICAgIGxldCBhZ2VudDogQWdlbnQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIGFjdGl2YXRpb25OYW1lXSBvZiB0aGlzLmFjdGl2ZUFnZW50c0J5RmlsZW5hbWUpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGF3YWl0IHRoaXMuZmluZEJ5RmlsZW5hbWUoZmlsZW5hbWUpO1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgICBhY3RpdmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgICBjYW5kaWRhdGU/Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXJcbiAgICAgICkge1xuICAgICAgICBhZ2VudCA9IGNhbmRpZGF0ZTtcbiAgICAgICAgaWYgKGFnZW50KSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYWdlbnQgPz89IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkFHRU5ULCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0U3RhYmxlRmlsZW5hbWUoYWdlbnQpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IGRpc3BsYXkgbmFtZSBhbmQgYW55IHByZS1yZW5hbWUga2V5IHRoYXQgcG9pbnRzIGF0XG4gICAgLy8gdGhlIHNhbWUgc3RhYmxlIGZpbGUsIHNvIGV4cGxpY2l0IGRlYWN0aXZhdGlvbiBjYW5ub3QgYmUgdW5kb25lIGJ5IGFcbiAgICAvLyBsYXRlciBwb2xpY3kgcmVmcmVzaC5cbiAgICB0aGlzLnJlbW92ZUFjdGl2ZUFnZW50SWRlbnRpdHkoYWdlbnQsIGlkZW50aWZpZXIpO1xuXG4gICAgLy8gVXBkYXRlIGFnZW50IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBhZ2VudC5kZWFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfREVBQ1RJVkFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlYWN0aXZhdGVBZ2VudCcsXG4gICAgICBkZXRhaWxzOiBgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IGRlYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuZGVhY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpLFxuICAgICAgLi4uKGZpbGVuYW1lID8geyBmaWxlbmFtZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgYWdlbnRzXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVBZ2VudHMob3B0aW9uczogeyBmcmVzaEFmdGVySW5GbGlnaHQ/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbkFuZEV2aWN0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGFnZW50czogQWdlbnRbXSA9IFtdO1xuICAgIC8vIFN0YWJsZSBmaWxlbmFtZXMgcmVtYWluIGRpc3RpbmN0IGV2ZW4gaWYgZXh0ZXJuYWxseSBlZGl0ZWQgbWV0YWRhdGFcbiAgICAvLyBuYW1lcyBjb2xsaWRlLCBzbyBldmVyeSBhY3RpdmUgYWdlbnQgY29udGludWVzIGNvbnRyaWJ1dGluZyBwb2xpY3kuXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlQWdlbnRzQnlGaWxlbmFtZS5rZXlzKCkpKSB7XG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuZmluZEJ5RmlsZW5hbWUoZmlsZW5hbWUpO1xuICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgIC8vIHNjYW5BbmRFdmljdCgpIGNhbiBkaXNjYXJkIGFuIGV4dGVybmFsbHkgbW9kaWZpZWQgYWN0aXZlIGFnZW50LiBJdHNcbiAgICAgICAgLy8gcmVwbGFjZW1lbnQgc3RhcnRzIGluYWN0aXZlLCBzbyByZXN0b3JlIHRoZSBsaWZlY3ljbGUgc3RhdGUgb25jZS5cbiAgICAgICAgLy8gQXZvaWQgcmVhY3RpdmF0aW5nIHVuY2hhbmdlZCBpbnN0YW5jZXM6IEFnZW50LmFjdGl2YXRlKCkgYWR2YW5jZXNcbiAgICAgICAgLy8gc2Vzc2lvbiB0cmFja2luZyBhbmQgbXVzdCBub3QgcnVuIG9uIGV2ZXJ5IHBvbGljeS9zdGF0dXMgcG9sbC5cbiAgICAgICAgaWYgKGFnZW50LmdldFN0YXR1cygpICE9PSBFbGVtZW50U3RhdHVzLkFDVElWRSkge1xuICAgICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYWdlbnRzLnB1c2goYWdlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbXBhdGliaWxpdHkgZmFsbGJhY2sgZm9yIHN5bnRoZXRpYyBvciBsZWdhY3kgaW5zdGFuY2VzIHRoYXQgZGlkIG5vdFxuICAgIC8vIGhhdmUgZmlsZW5hbWUgbWV0YWRhdGEgd2hlbiBhY3RpdmF0ZWQuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIEFycmF5LmZyb20odGhpcy5hY3RpdmVBZ2VudE5hbWVzKSkge1xuICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICBpZiAoIWFnZW50KSBjb250aW51ZTtcbiAgICAgIGlmIChhZ2VudC5nZXRTdGF0dXMoKSAhPT0gRWxlbWVudFN0YXR1cy5BQ1RJVkUpIHtcbiAgICAgICAgYXdhaXQgYWdlbnQuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIGFnZW50cy5wdXNoKGFnZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGFnZW50cztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhYmxlRmlsZW5hbWUoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IChhZ2VudCBhcyBBZ2VudCAmIHsgZmlsZW5hbWU/OiB1bmtub3duIH0pLmZpbGVuYW1lO1xuICAgIHJldHVybiB0eXBlb2YgZmlsZW5hbWUgPT09ICdzdHJpbmcnICYmIGZpbGVuYW1lLnRyaW0oKSAhPT0gJydcbiAgICAgID8gZmlsZW5hbWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBY3RpdmVBZ2VudElkZW50aXR5KGFnZW50OiBBZ2VudCwgaWRlbnRpZmllcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldFN0YWJsZUZpbGVuYW1lKGFnZW50KTtcbiAgICB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuZGVsZXRlKGFnZW50Lm1ldGFkYXRhLm5hbWUpO1xuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICB0aGlzLmFjdGl2ZUFnZW50c0J5RmlsZW5hbWUuZGVsZXRlKGZpbGVuYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZUFnZW50Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVBZ2VudHNCeUZpbGVuYW1lLnNpemUgKyB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3AuXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBMb2FkcyB0aGUgYWdlbnQgY29uZmlndXJhdGlvblxuICAgKiAyLiBWYWxpZGF0ZXMgYW5kIHJlbmRlcnMgdGhlIGdvYWwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzXG4gICAqIDMuIEFjdGl2YXRlcyBjb25maWd1cmVkIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgKiA0LiBFdmFsdWF0ZXMgcHJvZ3JhbW1hdGljIGNvbnN0cmFpbnRzIGFuZCByaXNrXG4gICAqIDUuIFJldHVybnMgc3RydWN0dXJlZCBjb250ZXh0IGZvciBMTE1cbiAgICpcbiAgICogVGhlIExMTSB0aGVuIGRyaXZlcyB0aGUgYWdlbnRpYyBsb29wIHVzaW5nIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAvLyBUaHJlYWQgdGhlIHRyaWdnZXJpbmcgTUNQIGxpZmVjeWNsZSBvcCB0aHJvdWdoIHZhbGlkYXRpb24gc28gZXJyb3IgbWVzc2FnZXNcbiAgICAvLyBjYW4gZGlzdGluZ3Vpc2ggYSBmcmVzaCBleGVjdXRlX2FnZW50IGNhbGwgZnJvbSBhIG1pc3VzZWQgY29udGludWVfZXhlY3V0aW9uLlxuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbk5hbWU/OiAnZXhlY3V0ZV9hZ2VudCcgfCAnY29udGludWVfZXhlY3V0aW9uJztcbiAgICB9ID0ge31cbiAgKTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQ+IHtcbiAgICAvLyBNdXN0IGhhcHBlbiBiZWZvcmUgYW55IGF3YWl0IHNvIHJlY292ZXJ5IHNlZXMgc3RhcnRzIGZyb20gTUNQLUFRTCwgbGVnYWN5XG4gICAgLy8gdG9vbHMsIGFuZCBhbnkgZnV0dXJlIGNhbGxlciB0aGF0IHVzZXMgdGhlIHNoYXJlZCBtYW5hZ2VyIGVudHJ5IHBvaW50LlxuICAgIHRoaXMuYmVnaW5FeGVjdXRpb25BdHRlbXB0KG5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBtZXRhZGF0YSBhcyB2MiAobWF5IGhhdmUgZ29hbCBjb25maWcpXG4gICAgICBsZXQgbWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2Mi4wIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBJZiBub3QsIGF1dG8tY29udmVydCBWMSB0byBWMiBpbiBwbGFjZSAoSXNzdWUgIzU4NylcbiAgICAgIGlmICghbWV0YWRhdGEuZ29hbCB8fCAhbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoaXNWMUFnZW50KG1ldGFkYXRhKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0ID0gY29udmVydFYxVG9WMihtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0LmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgLy8gTWVyZ2UgY29udmVydGVkIG1ldGFkYXRhIG9udG8gdGhlIGV4aXN0aW5nIGFnZW50IChpbi1wbGFjZSlcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZ2VudC5tZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIExvZyBjb252ZXJzaW9uIHdhcm5pbmdzXG4gICAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgYXV0by1jb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBpbiBwbGFjZWAsIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogY29udmVyc2lvblJlc3VsdC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZ3JhZGVkIGFnZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHVwZ3JhZGVkRmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHVwZ3JhZGVkRmlsZW5hbWUpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFnZW50ICcke25hbWV9JyBjb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBhbmQgc2F2ZWQgaW4gcGxhY2VgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGNhbm5vdCBiZSBleGVjdXRlZDogbWlzc2luZyBnb2FsLnRlbXBsYXRlIGFuZCBjb252ZXJzaW9uIGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGlzIG5vdCBhIHYyLjAgYWdlbnQuIE1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENsb25lIHBhcmFtZXRlcnMgdG8gcHJldmVudCBtdXRhdGlvbiBvZiBjYWxsZXIncyBvYmplY3QgKElzc3VlICMxMTgpXG4gICAgICBjb25zdCBjbG9uZWRQYXJhbWV0ZXJzID0gc3RydWN0dXJlZENsb25lKHBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAyYi4gU2VjdXJpdHkgdmFsaWRhdGlvbiBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbC5wYXJhbWV0ZXJzIHNjaGVtYVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlcnMobWV0YWRhdGEuZ29hbCwgY2xvbmVkUGFyYW1ldGVycywge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGNvbnRleHQub3BlcmF0aW9uTmFtZSA/PyAnZXhlY3V0ZV9hZ2VudCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gNC4gUmVuZGVyIGdvYWwgdGVtcGxhdGUgYnkgcmVwbGFjaW5nIHtwYXJhbWV0ZXJ9IHBsYWNlaG9sZGVyc1xuICAgICAgY29uc3QgcmVuZGVyZWRHb2FsID0gdGhpcy5yZW5kZXJHb2FsVGVtcGxhdGUobWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSwgY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDRiLiBEZXRlY3QgdW5tYXRjaGVkIHBsYWNlaG9sZGVycyBhZnRlciByZW5kZXJpbmcgKElzc3VlICMxMjYpXG4gICAgICBjb25zdCB1bm1hdGNoZWRQbGFjZWhvbGRlcnMgPSB0aGlzLmRldGVjdFVubWF0Y2hlZFBsYWNlaG9sZGVycyhyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHVubWF0Y2hlZFBsYWNlaG9sZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdVbm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXJzIGRldGVjdGVkIGFmdGVyIHJlbmRlcmluZycsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgICAgdW5tYXRjaGVkOiB1bm1hdGNoZWRQbGFjZWhvbGRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHQgQkVGT1JFIGFjdGl2YXRpbmcgZWxlbWVudHMgKElzc3VlICMxMDkgLSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KG5hbWUpO1xuXG4gICAgICAvLyA1Yi4gU3RhdGljIGFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIChJc3N1ZSAjMzc0KVxuICAgICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcz8uYWdlbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gYXdhaXQgdGhpcy5kZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKG5hbWUsIG1ldGFkYXRhLmFjdGl2YXRlcy5hZ2VudHMpO1xuICAgICAgICBpZiAoY3ljbGVQYXRoKSB7XG4gICAgICAgICAgY29uc3QgY3ljbGVTdGFydCA9IGN5Y2xlUGF0aC5pbmRleE9mKGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgIGNvbnN0IGN5Y2xlID0gY3ljbGVQYXRoLnNsaWNlKGN5Y2xlU3RhcnQpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihBZ2VudE1hbmFnZXIuZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBBY3RpdmF0ZSBlbGVtZW50cyAoZWxlbWVudC1hZ25vc3RpYylcbiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+PiA9IHt9O1xuICAgICAgY29uc3QgYWN0aXZhdGlvbldhcm5pbmdzOiBBcnJheTx7IGVsZW1lbnRUeXBlOiBzdHJpbmc7IGVsZW1lbnROYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcblxuICAgICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcykge1xuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZWxlbWVudE5hbWVzXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50TmFtZXMgfHwgZWxlbWVudE5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHNbZWxlbWVudFR5cGVdID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnROYW1lIG9mIGVsZW1lbnROYW1lcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZWxlbWVudENvbnRlbnQgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRDb250ZW50KGVsZW1lbnRUeXBlLCBlbGVtZW50TmFtZSwgZXhlY3V0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50Q29udGVudFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIEhJR0gtMTogUmUtdGhyb3cgY2lyY3VsYXIgYWN0aXZhdGlvbiBlcnJvcnMgaW1tZWRpYXRlbHkgKElzc3VlICMxMDkpXG4gICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0NpcmN1bGFyIGFnZW50IGFjdGl2YXRpb24gZGV0ZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgYWN0aXZhdGlvbldhcm5pbmdzLnB1c2goeyBlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfSc6IGZhaWxlZCB0byBhY3RpdmF0ZSAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nIOKAlCAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciBlbGVtZW50cyByYXRoZXIgdGhhbiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNy4gQnVpbGQgdGhlIHJlc3VsdCB3aXRoIGFsbCBjb250ZXh0IChpbml0aWFsaXplIHdpdGggZGVmYXVsdCBzYWZldHkgdGllcilcbiAgICAgIGNvbnN0IHJlc3VsdDogRXhlY3V0ZUFnZW50UmVzdWx0ID0ge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIGdvYWw6IHJlbmRlcmVkR29hbCxcbiAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgIGFjdGl2YXRpb25XYXJuaW5nczogYWN0aXZhdGlvbldhcm5pbmdzLmxlbmd0aCA+IDAgPyBhY3RpdmF0aW9uV2FybmluZ3MgOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIElzc3VlICMxMjY6IFdhcm4gYWJvdXQgdW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyc1xuICAgICAgICB0ZW1wbGF0ZVdhcm5pbmdzOiB1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gdW5tYXRjaGVkUGxhY2Vob2xkZXJzLm1hcChwID0+IGBVbm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXI6IHske3B9fWApXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzOiBtZXRhZGF0YS50b29scz8uYWxsb3dlZCB8fCBbXSxcbiAgICAgICAgc3VjY2Vzc0NyaXRlcmlhOiBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSB8fCBbXSxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQsXG4gICAgICAgIHNhZmV0eVRpZXI6ICdhZHZpc29yeScsIC8vIERlZmF1bHQsIHdpbGwgYmUgdXBkYXRlZCBiZWxvd1xuICAgICAgfTtcblxuICAgICAgLy8gOC4gQ3JlYXRlIGFuZCBwZXJzaXN0IHRoZSBnb2FsIGZvciBMTE0gdHJhY2tpbmdcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHJlY29yZF9hZ2VudF9zdGVwIHRvIGZpbmQgYW5kIHVwZGF0ZSB0aGUgZ29hbFxuXG4gICAgICAvLyBDcmVhdGUgdGhlIGdvYWwgdXNpbmcgYWdlbnQuYWRkR29hbCgpIHdoaWNoIGhhbmRsZXMgdmFsaWRhdGlvbiBhbmQgc2FuaXRpemF0aW9uXG4gICAgICBjb25zdCBuZXdHb2FsID0gYWdlbnQuYWRkR29hbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIHByaW9yaXR5OiAnbWVkaXVtJyxcbiAgICAgICAgaW1wb3J0YW5jZTogNSxcbiAgICAgICAgdXJnZW5jeTogNSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgZ29hbCBzdGF0dXMgdG8gaW5fcHJvZ3Jlc3Mgc2luY2UgZXhlY3V0aW9uIGhhcyBzdGFydGVkXG4gICAgICBuZXdHb2FsLnN0YXR1cyA9ICdpbl9wcm9ncmVzcyc7XG5cbiAgICAgIGNvbnN0IGV4ZWNTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKGV4ZWNTYW5pdGl6ZWROYW1lKSk7XG5cbiAgICAgIC8vIFN0b3JlIGdvYWxJZCBpbiByZXN1bHQgZm9yIExMTSB0byB1c2Ugd2l0aCByZWNvcmRfYWdlbnRfc3RlcFxuICAgICAgcmVzdWx0LmdvYWxJZCA9IG5ld0dvYWwuaWQ7XG5cbiAgICAgIC8vIEZpeCAjNDQ1OiBJbmNsdWRlIHN0YXRlVmVyc2lvbiBzbyBzdWJzZXF1ZW50IGNhbGxzIGNhbiBkbyB2ZXJzaW9uLWF3YXJlIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHBvc3RTYXZlU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgICAgcmVzdWx0LnN0YXRlVmVyc2lvbiA9IHBvc3RTYXZlU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDE7XG5cbiAgICAgIC8vIENhbGwgdmFsaWRhdGVHb2FsU2VjdXJpdHkgYW5kIGFkZCB3YXJuaW5ncyB0byByZXN1bHRcbiAgICAgIGNvbnN0IHNlY3VyaXR5VmFsaWRhdGlvbiA9IGFnZW50LnZhbGlkYXRlR29hbFNlY3VyaXR5KHJlbmRlcmVkR29hbCk7XG4gICAgICBpZiAoc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzICYmIHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzID0gc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGV2YWx1YXRlQ29uc3RyYWludHMgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5jb25zdHJhaW50cyA9IGFnZW50LmV2YWx1YXRlQ29uc3RyYWludHMobmV3R29hbCk7XG5cbiAgICAgIC8vIENhbGwgYXNzZXNzUmlzayBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnJpc2tBc3Nlc3NtZW50ID0gYWdlbnQuYXNzZXNzUmlzaygnZXhlY3V0ZScsIG5ld0dvYWwsIHt9KTtcblxuICAgICAgLy8gQ2FsbCBjYWxjdWxhdGVQcmlvcml0eVNjb3JlIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQucHJpb3JpdHlTY29yZSA9IGFnZW50LmNhbGN1bGF0ZVByaW9yaXR5U2NvcmUobmV3R29hbCk7XG5cbiAgICAgIC8vIDkuIERldGVybWluZSBzYWZldHkgdGllciBiYXNlZCBvbiByaXNrIGFzc2Vzc21lbnQgYW5kIHNlY3VyaXR5IHdhcm5pbmdzXG4gICAgICAvLyAoTm90ZTogZXhlY3V0aW9uQ29udGV4dCBhbHJlYWR5IGNyZWF0ZWQgZWFybGllciBmb3IgY2lyY3VsYXIgZGV0ZWN0aW9uKVxuICAgICAgY29uc3Qgc2FmZXR5VGllclJlc3VsdCA9IGRldGVybWluZVNhZmV0eVRpZXIoXG4gICAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudD8uc2NvcmUgfHwgMCxcbiAgICAgICAgcmVzdWx0LnNlY3VyaXR5V2FybmluZ3MgfHwgW10sXG4gICAgICAgIHJlbmRlcmVkR29hbCxcbiAgICAgICAgREVGQVVMVF9TQUZFVFlfQ09ORklHLFxuICAgICAgICBleGVjdXRpb25Db250ZXh0XG4gICAgICApO1xuXG4gICAgICAvLyAxMC4gU2V0IHNhZmV0eSB0aWVyIGFuZCByZWxhdGVkIGZpZWxkc1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXIgPSBzYWZldHlUaWVyUmVzdWx0LnRpZXI7XG4gICAgICByZXN1bHQuc2FmZXR5VGllclJlc3VsdCA9IHNhZmV0eVRpZXJSZXN1bHQ7XG4gICAgICByZXN1bHQuZXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG5cbiAgICAgIC8vIDExLiBBZGQgdGllci1zcGVjaWZpYyByZXNwb25zZXNcbiAgICAgIHN3aXRjaCAoc2FmZXR5VGllclJlc3VsdC50aWVyKSB7XG4gICAgICAgIGNhc2UgJ2NvbmZpcm0nOlxuICAgICAgICAgIHJlc3VsdC5jb25maXJtYXRpb25SZXF1aXJlZCA9IGNyZWF0ZUNvbmZpcm1hdGlvblJlcXVlc3QoXG4gICAgICAgICAgICAnT3BlcmF0aW9uIHJlcXVpcmVzIGNvbmZpcm1hdGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3ZlcmlmeSc6XG4gICAgICAgICAgcmVzdWx0LnZlcmlmaWNhdGlvblJlcXVpcmVkID0gY3JlYXRlVmVyaWZpY2F0aW9uQ2hhbGxlbmdlKFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzLmpvaW4oJzsgJyksXG4gICAgICAgICAgICAnZGlzcGxheV9jb2RlJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZGFuZ2VyX3pvbmUnOlxuICAgICAgICAgIHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZCA9IGNyZWF0ZURhbmdlclpvbmVPcGVyYXRpb24oXG4gICAgICAgICAgICAnYWdlbnRfZXhlY3V0aW9uJyxcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgREVGQVVMVF9TQUZFVFlfQ09ORklHLmRhbmdlclpvbmUuZW5hYmxlZFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQWxzbyBhZGQgdmVyaWZpY2F0aW9uIGlmIG5vdCBibG9ja2VkXG4gICAgICAgICAgaWYgKCFyZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQuYmxvY2tlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnZlcmlmaWNhdGlvblJlcXVpcmVkID0gcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLnZlcmlmaWNhdGlvblJlcXVpcmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhZHZpc29yeSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gTm8gYWRkaXRpb25hbCBhY3Rpb24gbmVlZGVkIGZvciBhZHZpc29yeSB0aWVyXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50JyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50IGV4ZWN1dGVkOiAke25hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfSAoc2FmZXR5OiAke3NhZmV0eVRpZXJSZXN1bHQudGllcn0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICBzYWZldHlUaWVyOiBzYWZldHlUaWVyUmVzdWx0LnRpZXIsXG4gICAgICAgICAgcmlza1Njb3JlOiBzYWZldHlUaWVyUmVzdWx0LnJpc2tTY29yZSxcbiAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzIHx8IHt9KSxcbiAgICAgICAgICBnb2FsQ291bnQ6IChtZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudCAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZW5kRXhlY3V0aW9uQXR0ZW1wdChuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKiogSG9sZCBhIGJvdW5kZWQgb2JzZXJ2YXRpb24gbGVhc2Ugd2hpbGUgc3RhbGUtcG9saWN5IHJlY292ZXJ5IGlzIGluIGZsaWdodC4gKi9cbiAgb2JzZXJ2ZUV4ZWN1dGlvbkdlbmVyYXRpb24obmFtZTogc3RyaW5nKTogRXhlY3V0aW9uR2VuZXJhdGlvbk9ic2VydmF0aW9uIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpemVBZ2VudEV4ZWN1dGlvbklkZW50aXR5KG5hbWUpO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXRPckNyZWF0ZUV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5KTtcbiAgICBlbnRyeS5vYnNlcnZlcnMgKz0gMTtcbiAgICBsZXQgcmVsZWFzZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogZW50cnkudG9rZW4sXG4gICAgICByZWxlYXNlOiAoKSA9PiB7XG4gICAgICAgIGlmIChyZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgICByZWxlYXNlZCA9IHRydWU7XG4gICAgICAgIGVudHJ5Lm9ic2VydmVycyAtPSAxO1xuICAgICAgICB0aGlzLmNsZWFudXBFeGVjdXRpb25HZW5lcmF0aW9uKGtleSwgZW50cnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaGFzRXhlY3V0aW9uR2VuZXJhdGlvbkNoYW5nZWQobmFtZTogc3RyaW5nLCBvYnNlcnZlZFRva2VuOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZXhlY3V0aW9uR2VuZXJhdGlvbnMuZ2V0KG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHkobmFtZSkpO1xuICAgIHJldHVybiAhZW50cnkgfHwgZW50cnkuYWN0aXZlRXhlY3V0aW9ucyA+IDAgfHwgZW50cnkudG9rZW4gIT09IG9ic2VydmVkVG9rZW47XG4gIH1cblxuICBwcml2YXRlIGJlZ2luRXhlY3V0aW9uQXR0ZW1wdChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpemVBZ2VudEV4ZWN1dGlvbklkZW50aXR5KG5hbWUpO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXRPckNyZWF0ZUV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5KTtcbiAgICBlbnRyeS50b2tlbiA9IHt9O1xuICAgIGVudHJ5LmFjdGl2ZUV4ZWN1dGlvbnMgKz0gMTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kRXhlY3V0aW9uQXR0ZW1wdChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpemVBZ2VudEV4ZWN1dGlvbklkZW50aXR5KG5hbWUpO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5leGVjdXRpb25HZW5lcmF0aW9ucy5nZXQoa2V5KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgZW50cnkuYWN0aXZlRXhlY3V0aW9ucyA9IE1hdGgubWF4KDAsIGVudHJ5LmFjdGl2ZUV4ZWN1dGlvbnMgLSAxKTtcbiAgICB0aGlzLmNsZWFudXBFeGVjdXRpb25HZW5lcmF0aW9uKGtleSwgZW50cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZUV4ZWN1dGlvbkdlbmVyYXRpb24oa2V5OiBzdHJpbmcpOiBFeGVjdXRpb25HZW5lcmF0aW9uRW50cnkge1xuICAgIGxldCBlbnRyeSA9IHRoaXMuZXhlY3V0aW9uR2VuZXJhdGlvbnMuZ2V0KGtleSk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgZW50cnkgPSB7IHRva2VuOiB7fSwgYWN0aXZlRXhlY3V0aW9uczogMCwgb2JzZXJ2ZXJzOiAwIH07XG4gICAgICB0aGlzLmV4ZWN1dGlvbkdlbmVyYXRpb25zLnNldChrZXksIGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRXhlY3V0aW9uR2VuZXJhdGlvbihrZXk6IHN0cmluZywgZW50cnk6IEV4ZWN1dGlvbkdlbmVyYXRpb25FbnRyeSk6IHZvaWQge1xuICAgIGlmIChlbnRyeS5hY3RpdmVFeGVjdXRpb25zID09PSAwICYmIGVudHJ5Lm9ic2VydmVycyA9PT0gMCkge1xuICAgICAgdGhpcy5leGVjdXRpb25HZW5lcmF0aW9ucy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VjdXJpdHkgdmFsaWRhdGlvbiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAoSXNzdWUgIzEwMykuXG4gICAqIENoZWNrcyBmb3IgcHJvdG90eXBlIHBvbGx1dGlvbiwgVW5pY29kZSBpbmplY3Rpb24sIGFuZCBvdmVyc2l6ZWQgcGF5bG9hZHMuXG4gICAqIE11c3QgYmUgY2FsbGVkIEJFRk9SRSB0ZW1wbGF0ZSByZW5kZXJpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGFyYW1ldGVyU2VjdXJpdHkocGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyAxLiBQcm90b3R5cGUgcG9sbHV0aW9uIGNoZWNrIOKAlCByZWplY3QgZGFuZ2Vyb3VzIGtleXNcbiAgICBjb25zdCBGT1JCSURERU5fS0VZUyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpKSB7XG4gICAgICBpZiAoRk9SQklEREVOX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIudmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eScsXG4gICAgICAgICAgZGV0YWlsczogYFByb3RvdHlwZSBwb2xsdXRpb24gYXR0ZW1wdCB2aWEgcGFyYW1ldGVyIGtleTogJyR7a2V5fSdgLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3JiaWRkZW4gcGFyYW1ldGVyIGtleTogJyR7a2V5fScgKHBvdGVudGlhbCBwcm90b3R5cGUgcG9sbHV0aW9uKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIExpbWl0IHBhcmFtZXRlciBjb3VudCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb25cbiAgICBjb25zdCBNQVhfUEFSQU1FVEVSUyA9IDUwO1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGggPiBNQVhfUEFSQU1FVEVSUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb28gbWFueSBwYXJhbWV0ZXJzOiAke09iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mICR7TUFYX1BBUkFNRVRFUlN9YCk7XG4gICAgfVxuXG4gICAgLy8gMy4gVW5pY29kZSBub3JtYWxpemF0aW9uIHZpYSBJbnB1dE5vcm1hbGl6ZXJcbiAgICBjb25zdCBub3JtYWxpemVkID0gSW5wdXROb3JtYWxpemVyLm5vcm1hbGl6ZShwYXJhbWV0ZXJzLCAnJC5wYXJhbWV0ZXJzJyk7XG4gICAgaWYgKG5vcm1hbGl6ZWQuaGFzSGlnaE9yQ3JpdGljYWxJc3N1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRlbXBsYXRlIHBhcmFtZXRlciBzZWN1cml0eSB2YWxpZGF0aW9uIGZhaWxlZDogJHtub3JtYWxpemVkLmVycm9ycy5qb2luKCc7ICcpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgbm9ybWFsaXplZCB2YWx1ZXMgYmFjayAoaW4tcGxhY2UsIHNpbmNlIHdlIGFscmVhZHkgY2xvbmVkKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gbm9ybWFsaXplZC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWREYXRhKSkge1xuICAgICAgcGFyYW1ldGVyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1RlbXBsYXRlIHBhcmFtZXRlciBub3JtYWxpemF0aW9uIHdhcm5pbmdzJywge1xuICAgICAgICB3YXJuaW5nczogbm9ybWFsaXplZC53YXJuaW5ncyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbCBwYXJhbWV0ZXIgc2NoZW1hXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGFyYW1ldGVycyhcbiAgICBnb2FsQ29uZmlnOiBBZ2VudEdvYWxDb25maWcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29udGV4dDoge1xuICAgICAgYWdlbnROYW1lPzogc3RyaW5nO1xuICAgICAgb3BlcmF0aW9uTmFtZT86ICdleGVjdXRlX2FnZW50JyB8ICdjb250aW51ZV9leGVjdXRpb24nO1xuICAgIH0gPSB7fVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbURlZnMgPSBnb2FsQ29uZmlnLnBhcmFtZXRlcnMgfHwgW107XG4gICAgY29uc3QgcmVxdWlyZWRQYXJhbU5hbWVzID0gcGFyYW1EZWZzXG4gICAgICAuZmlsdGVyKHBhcmFtRGVmID0+IHBhcmFtRGVmLnJlcXVpcmVkKVxuICAgICAgLm1hcChwYXJhbURlZiA9PiBwYXJhbURlZi5uYW1lKTtcblxuICAgIC8vIENoZWNrIGFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50XG4gICAgY29uc3QgbWlzc2luZ1JlcXVpcmVkID0gcmVxdWlyZWRQYXJhbU5hbWVzLmZpbHRlcihwYXJhbU5hbWUgPT4gIShwYXJhbU5hbWUgaW4gcGFyYW1ldGVycykpO1xuICAgIGlmIChtaXNzaW5nUmVxdWlyZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICB0aGlzLmZvcm1hdE1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlcnNFcnJvcihcbiAgICAgICAgICBtaXNzaW5nUmVxdWlyZWQsXG4gICAgICAgICAgcmVxdWlyZWRQYXJhbU5hbWVzLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUeXBlIGNoZWNrIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgY29uc3QgcGFyYW1EZWYgPSBwYXJhbURlZnMuZmluZChwID0+IHAubmFtZSA9PT0ga2V5KTtcbiAgICAgIGlmICghcGFyYW1EZWYpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gcGFyYW1ldGVyICcke2tleX0nIHByb3ZpZGVkIHRvIGFnZW50YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgYWN0dWFsVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ251bWJlcicgJiYgYWN0dWFsVHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIG51bWJlciwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGFjdHVhbFR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkdmlzb3J5IGxlbmd0aCB3YXJuaW5nIGZvciBzdHJpbmcgdmFsdWVzIChkZWZlbnNlLWluLWRlcHRoLCBkb2VzIG5vdCB0aHJvdylcbiAgICAgIGlmIChhY3R1YWxUeXBlID09PSAnc3RyaW5nJyAmJiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RIKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIGV4Y2VlZHMgTUFYX0dPQUxfTEVOR1RIIChhZHZpc29yeSknLCB7XG4gICAgICAgICAgcGFyYW1OYW1lOiBrZXksXG4gICAgICAgICAgdmFsdWVMZW5ndGg6ICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAoIXBhcmFtRGVmLnJlcXVpcmVkICYmICEocGFyYW1EZWYubmFtZSBpbiBwYXJhbWV0ZXJzKSAmJiBwYXJhbURlZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1ldGVyc1twYXJhbURlZi5uYW1lXSA9IHBhcmFtRGVmLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIGFjdGlvbmFibGUgbWlzc2luZy1wYXJhbWV0ZXIgZXJyb3IgZm9yIGV4ZWN1dGUvY29udGludWUgY2FsbHMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlcnNFcnJvcihcbiAgICBtaXNzaW5nUmVxdWlyZWQ6IHN0cmluZ1tdLFxuICAgIHJlcXVpcmVkUGFyYW1OYW1lczogc3RyaW5nW10sXG4gICAgY29udGV4dDoge1xuICAgICAgYWdlbnROYW1lPzogc3RyaW5nO1xuICAgICAgb3BlcmF0aW9uTmFtZT86ICdleGVjdXRlX2FnZW50JyB8ICdjb250aW51ZV9leGVjdXRpb24nO1xuICAgIH1cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBhZ2VudFN1ZmZpeCA9IGNvbnRleHQuYWdlbnROYW1lID8gYCBmb3IgYWdlbnQgJyR7Y29udGV4dC5hZ2VudE5hbWV9J2AgOiAnJztcbiAgICBsZXQgbWVzc2FnZSA9XG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXJzJHthZ2VudFN1ZmZpeH06ICR7bWlzc2luZ1JlcXVpcmVkLmpvaW4oJywgJyl9LmA7XG5cbiAgICBpZiAocmVxdWlyZWRQYXJhbU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1lc3NhZ2UgKz0gYCBSZXF1aXJlZCBnb2FsIHBhcmFtZXRlcnM6ICR7cmVxdWlyZWRQYXJhbU5hbWVzLmpvaW4oJywgJyl9LmA7XG4gICAgfVxuXG4gICAgbWVzc2FnZSArPSAnIERpc2NvdmVyIHRoZSBmdWxsIGV4ZWN1dGlvbiBjb250cmFjdCB2aWEgbWNwX2FxbF9yZWFkIGludHJvc3BlY3Q6ICcgK1xuICAgICAgJ3sgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJleGVjdXRlX2FnZW50XCIgfSB9Lic7XG5cbiAgICBpZiAoY29udGV4dC5vcGVyYXRpb25OYW1lID09PSAnY29udGludWVfZXhlY3V0aW9uJykge1xuICAgICAgbWVzc2FnZSArPSAnIElmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2dyZXNzIGFmdGVyIGV4ZWN1dGVfYWdlbnQsIHVzZSAnICtcbiAgICAgICAgJ21jcF9hcWxfY3JlYXRlIHJlY29yZF9leGVjdXRpb25fc3RlcCBpbnN0ZWFkLiBjb250aW51ZV9leGVjdXRpb24gaXMgb25seSAnICtcbiAgICAgICAgJ2ZvciByZXN1bWluZyBhIHByZXZpb3VzbHkgcGF1c2VkIGV4ZWN1dGlvbiBhbmQgc3RpbGwgcmVxdWlyZXMgdGhlIHNhbWUgJyArXG4gICAgICAgICdnb2FsIHBhcmFtZXRlcnMgYXMgZXhlY3V0ZV9hZ2VudC4nO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyR29hbFRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVuZGVyZWQgPSB0ZW1wbGF0ZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgLy8gRXNjYXBlIGtleSB0byBwcmV2ZW50IHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZyb20gY2F1c2luZyBSZURvUyAoSXNzdWUgIzEwMylcbiAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBTYWZlUmVnZXguZXNjYXBlKGtleSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHske2VzY2FwZWRLZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBDYXAgcmVuZGVyZWQgZ29hbCBsZW5ndGggdG8gcHJldmVudCBvdmVyc2l6ZWQgcGF5bG9hZHNcbiAgICBpZiAocmVuZGVyZWQubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbmRlcmVkIGdvYWwgZXhjZWVkcyBNQVhfUkVOREVSRURfR09BTF9MRU5HVEgsIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIHJlbmRlcmVkTGVuZ3RoOiByZW5kZXJlZC5sZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5zdWJzdHJpbmcoMCwgQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCB1bm1hdGNoZWQge3BsYWNlaG9sZGVyfSBwYXR0ZXJucyByZW1haW5pbmcgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nLlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIHBsYWNlaG9sZGVyIG5hbWVzIGZvdW5kIGluIHRoZSByZW5kZXJlZCBzdHJpbmcuXG4gICAqIElzc3VlICMxMjY6IFdhcm4gd2hlbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlclBhdHRlcm4gPSAvXFx7KFthLXpBLVpfXVthLXpBLVowLTlfXSopXFx9L2c7XG4gICAgY29uc3QgdW5tYXRjaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcGxhY2Vob2xkZXJQYXR0ZXJuLmV4ZWMocmVuZGVyZWQpKSAhPT0gbnVsbCkge1xuICAgICAgdW5tYXRjaGVkLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uLlxuICAgKiBVc2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIGFuZCB0aGUgcnVudGltZSBjaGFpbiBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50TmFtZSA9IGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIChcbiAgICAgIGBDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkIChjeWNsZSBvZiAke2N5Y2xlUGF0aC5sZW5ndGggLSAxfSk6IGAgK1xuICAgICAgYCR7Y3ljbGVQYXRoLmpvaW4oJyDihpIgJyl9LiBgICtcbiAgICAgIGBBZ2VudCAnJHthZ2VudE5hbWV9JyBjYW5ub3QgYWN0aXZhdGUgaXRzZWxmIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuYFxuICAgICk7XG4gIH1cblxuICAvKiogU2FmZXR5IGxpbWl0cyBmb3IgYWN0aXZhdGlvbiBncmFwaCB0cmF2ZXJzYWwgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0FDVElWQVRJT05fREVQVEggPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX05PREVTX1ZJU0lURUQgPSAxMDA7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiDigJQgTGF5ZXIgMSBvZiBkdWFsLWRldGVjdGlvbiBzdHJhdGVneSAoSXNzdWUgIzM3NClcbiAgICpcbiAgICogUGVyZm9ybXMgYXN5bmMgREZTIG9uIHRoZSBhY3RpdmF0aW9uIGdyYXBoIHRvIGRldGVjdCBjeWNsZXMgQkVGT1JFIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAqIFRoaXMgaXMgYSBwcmUtZmxpZ2h0IGNoZWNrIHRoYXQgcHJldmVudHMgY2lyY3VsYXIgYWN0aXZhdGlvbiBjaGFpbnMgZnJvbSBiZWluZyBhdHRlbXB0ZWQuXG4gICAqXG4gICAqIExheWVyIDEgKHRoaXMgbWV0aG9kKTogU3RhdGljIGdyYXBoIGFuYWx5c2lzIOKAlCB3YWxrcyB0aGUgYWN0aXZhdGlvbiBncmFwaCBmcm9tIHRoZSByb290XG4gICAqIGFnZW50LCBsb2FkaW5nIGVhY2ggYWdlbnQncyBgYWN0aXZhdGVzLmFnZW50c2AgbWV0YWRhdGEuIENhdGNoZXMgYWxsIGN5Y2xlcyByZWFjaGFibGVcbiAgICogZnJvbSB0aGUgcm9vdCB3aXRob3V0IGV4ZWN1dGluZyBhbnkgYWdlbnRzLiBCb3VuZGVkIGJ5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIIGFuZFxuICAgKiBNQVhfTk9ERVNfVklTSVRFRCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBsYXJnZSBhY3ljbGljIGdyYXBocy5cbiAgICpcbiAgICogTGF5ZXIgMiAoZ2V0RWxlbWVudENvbnRlbnQgcnVudGltZSBjaGVjayk6IERlZmVuc2UtaW4tZGVwdGgg4oCUIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXNcbiAgICogbGlrZSBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAqIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBTZWUgZ2V0RWxlbWVudENvbnRlbnQgZm9yIGRldGFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSByb290TmFtZSAtIFRoZSByb290IGFnZW50IG5hbWUgaW5pdGlhdGluZyB0aGUgYWN0aXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQWdlbnRzIC0gVGhlIGltbWVkaWF0ZSBhZ2VudHMgYWN0aXZhdGVkIGJ5IHRoZSByb290XG4gICAqIEByZXR1cm5zIFRoZSBjeWNsZSBwYXRoIGFycmF5IGlmIGEgY3ljbGUgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZhdGVkQWdlbnRzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIC8vIENhY2hlIGxvYWRlZCBhZ2VudHMgdG8gYXZvaWQgcmVkdW5kYW50IEkvTyBkdXJpbmcgREZTXG4gICAgY29uc3QgYWdlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXSB8IG51bGw+KCk7XG5cbiAgICAvLyBIZWxwZXI6IGxvYWQgYW4gYWdlbnQncyBhY3RpdmF0ZXMuYWdlbnRzIGxpc3QgKGNhY2hlZClcbiAgICBjb25zdCBnZXRBY3RpdmF0ZWRBZ2VudHMgPSBhc3luYyAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoYWdlbnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiBhZ2VudENhY2hlLmdldChjYWNoZUtleSkgfHwgW107XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuICAgICAgICBjb25zdCBhZ2VudHMgPSBtZXRhLmFjdGl2YXRlcz8uYWdlbnRzIHx8IFtdO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgYWdlbnRzKTtcbiAgICAgICAgcmV0dXJuIGFnZW50cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVHJhY2tzIG5vZGVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGhhcyBiZWVuIGV4cGxvcmVkIHdpdGhvdXQgZmluZGluZyBhIGN5Y2xlLlxuICAgIC8vIFByZXZlbnRzIGV4cG9uZW50aWFsIHJlLWV4cGxvcmF0aW9uIGluIGRpYW1vbmQvY29udmVyZ2VudCBncmFwaHMuXG4gICAgY29uc3QgZnVsbHlFeHBsb3JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBub2Rlc1Zpc2l0ZWQgPSAwO1xuXG4gICAgLy8gREZTIOKAlCBzdGFjayBlbnRyaWVzOiBbY3VycmVudEFnZW50LCBwYXRoU29GYXIsIHBhdGhTZXRMb3dlcl1cbiAgICAvLyBwYXRoU2V0TG93ZXIgaXMgYSBTZXQ8c3RyaW5nPiBvZiBsb3dlcmNhc2VkIG5hbWVzIGZvciBPKDEpIGN5Y2xlIGNoZWNrc1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxbc3RyaW5nLCBzdHJpbmdbXSwgU2V0PHN0cmluZz5dPiA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdExvd2VyID0gcm9vdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGFjdGl2YXRlZEFnZW50cykge1xuICAgICAgLy8gU2VsZi1sb29wOiBhZ2VudCBkaXJlY3RseSBhY3RpdmF0ZXMgaXRzZWxmXG4gICAgICBpZiAoY2hpbGQudG9Mb3dlckNhc2UoKSA9PT0gcm9vdExvd2VyKSB7XG4gICAgICAgIHJldHVybiBbcm9vdE5hbWUsIGNoaWxkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGhTZXQgPSBuZXcgU2V0PHN0cmluZz4oW3Jvb3RMb3dlciwgY2hpbGQudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFtyb290TmFtZSwgY2hpbGRdLCBwYXRoU2V0XSk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtjdXJyZW50LCBjdXJyZW50UGF0aCwgcGF0aFNldF0gPSBzdGFjay5wb3AoKSE7XG5cbiAgICAgIG5vZGVzVmlzaXRlZCsrO1xuICAgICAgaWYgKG5vZGVzVmlzaXRlZCA+IEFnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgYWJvcnRlZDogZXhjZWVkZWQgJHtBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUR9IG5vZGVzIHZpc2l0ZWQuIGAgK1xuICAgICAgICAgIGBUaGUgYWN0aXZhdGlvbiBncmFwaCBtYXkgYmUgdG9vIGxhcmdlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPiBBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEggKyAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBoaXQgZGVwdGggbGltaXQgb2YgJHtBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEh9LiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgZGVlcGVyIGJyYW5jaGVzLmBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRMb3dlciA9IGN1cnJlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmdWxseUV4cGxvcmVkLmhhcyhjdXJyZW50TG93ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoaXMgYWdlbnQncyBhY3RpdmF0aW9uc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRBY3RpdmF0ZWRBZ2VudHMoY3VycmVudCk7XG5cbiAgICAgIGxldCBmb3VuZEN5Y2xlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTG93ZXIgPSBjaGlsZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsZTogZG9lcyB0aGlzIGNoaWxkIGFwcGVhciBlYXJsaWVyIGluIHRoZSBwYXRoP1xuICAgICAgICBpZiAocGF0aFNldC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZ1bGx5RXhwbG9yZWQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3UGF0aFNldCA9IG5ldyBTZXQocGF0aFNldCk7XG4gICAgICAgICAgbmV3UGF0aFNldC5hZGQoY2hpbGRMb3dlcik7XG4gICAgICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdLCBuZXdQYXRoU2V0XSk7XG4gICAgICAgICAgZm91bmRDeWNsZSA9IHRydWU7IC8vIGhhcyBjaGlsZHJlbiB0byBleHBsb3JlLCBub3QgZnVsbHkgZXhwbG9yZWQgeWV0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gdW5leHBsb3JlZCBjaGlsZHJlbiwgdGhpcyBub2RlJ3Mgc3VidHJlZSBpcyBjeWNsZS1mcmVlXG4gICAgICBpZiAoIWZvdW5kQ3ljbGUpIHtcbiAgICAgICAgZnVsbHlFeHBsb3JlZC5hZGQoY3VycmVudExvd2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVsZW1lbnRDb250ZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBleGVjdXRpb25Db250ZXh0PzogRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEdldCB0aGUgc3RhdGljIHJlc29sdmVyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBBZ2VudE1hbmFnZXIuZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgLSBjYW5ub3QgYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1gKTtcbiAgICAgIHJldHVybiBgW0VsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCBmb3IgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1dYDtcbiAgICB9XG5cbiAgICAvLyBMYXllciAyIChkZWZlbnNlLWluLWRlcHRoKTogUnVudGltZSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbiAoSXNzdWUgIzEwOSlcbiAgICAvLyBUaGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgKGRldGVjdEFjdGl2YXRpb25DeWNsZXMsIGxheWVyIDEpIGNhdGNoZXMgbW9zdCBjeWNsZXNcbiAgICAvLyBiZWZvcmUgZXhlY3V0aW9uIGJlZ2lucy4gVGhpcyBydW50aW1lIGNoZWNrIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXMgc3VjaCBhc1xuICAgIC8vIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICAvLyBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gVXNlcyBleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4gd2hpY2ggdHJhY2tzIHRoZVxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGgg4oCUIGVmZmVjdGl2ZSBmb3IgZGlyZWN0IGFuZCBtdWx0aS1ob3AgY2hhaW5zIHdpdGhpbiBhXG4gICAgLy8gc2luZ2xlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gJ2FnZW50cycgJiYgZXhlY3V0aW9uQ29udGV4dD8uYWdlbnRDaGFpbikge1xuICAgICAgY29uc3QgY2hhaW5TZXQgPSBuZXcgU2V0KGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbi5tYXAobmFtZSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGNoYWluU2V0Lmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLmV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiwgZWxlbWVudE5hbWVdO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBNYXAgcGx1cmFsIGVsZW1lbnQgdHlwZXMgdG8gbWFuYWdlciBuYW1lc1xuICAgICAgY29uc3QgbWFuYWdlck5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHBlcnNvbmFzOiAnUGVyc29uYU1hbmFnZXInLFxuICAgICAgICBza2lsbHM6ICdTa2lsbE1hbmFnZXInLFxuICAgICAgICBtZW1vcmllczogJ01lbW9yeU1hbmFnZXInLFxuICAgICAgICB0ZW1wbGF0ZXM6ICdUZW1wbGF0ZU1hbmFnZXInLFxuICAgICAgICBlbnNlbWJsZXM6ICdFbnNlbWJsZU1hbmFnZXInLFxuICAgICAgICBhZ2VudHM6ICdBZ2VudE1hbmFnZXInXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZSA9IG1hbmFnZXJOYW1lTWFwW2VsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghbWFuYWdlck5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFuYWdlciA9IHJlc29sdmVyKG1hbmFnZXJOYW1lKTtcbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICBsb2dnZXIud2FybihgTWFuYWdlciBub3QgZm91bmQgZm9yIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbTWFuYWdlciBub3QgZm91bmQ6ICR7bWFuYWdlck5hbWV9XWA7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgb2YgdGhpcyB0eXBlXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuICAgICAgLy8gSXNzdWUgIzI0MzI6IGFjdGl2YXRlczogcmVmZXJlbmNlcyB1c2UgY2Fub25pY2FsIGZpbGVuYW1lIHNsdWdzIChlLmcuXG4gICAgICAvLyAnc2VjdXJpdHktYW5hbHlzdCcsICdidWctcmVwb3J0Jykgd2hpbGUgZWxlbWVudCBtZXRhZGF0YSBjYXJyaWVzIGRpc3BsYXlcbiAgICAgIC8vIG5hbWVzICgnU2VjdXJpdHkgQW5hbHlzdCcsICdCdWdSZXBvcnQnKS4gRXhhY3QtbmFtZSBtYXRjaGVzIHdpbiBhY3Jvc3MgdGhlXG4gICAgICAvLyBmdWxsIGxpc3Q7IG90aGVyd2lzZSBib3RoIHNpZGVzIG1hcCB0aHJvdWdoIHRoZSBzYW1lIHNsdWcgZGVyaXZhdGlvblxuICAgICAgLy8gZ2V0RWxlbWVudEZpbGVuYW1lKCkgdXNlcyB3aGVuIHNhdmluZyDigJQgbm9ybWFsaXplRmlsZW5hbWUgd2l0aCBpdHNcbiAgICAgIC8vIGVtcHR5LXJlc3VsdCAndW5uYW1lZCcgZmFsbGJhY2sg4oCUIHNvIGEgcmVmZXJlbmNlIHJlc29sdmVzIGV4YWN0bHkgd2hlbiBpdFxuICAgICAgLy8gbWF0Y2hlcyB0aGUgZWxlbWVudCdzIG9uLWRpc2sgZmlsZW5hbWUgKGluY2x1ZGluZyBjYW1lbENhc2Ugc3BsaXRzIGFuZFxuICAgICAgLy8gc2VwYXJhdG9yLW9ubHkgbmFtZXMgbGlrZSAnLS0tJyB0aGF0IHNhdmUgYXMgdW5uYW1lZC5tZCkuXG4gICAgICBjb25zdCBjYW5vbmljYWxTbHVnID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpIHx8ICd1bm5hbWVkJztcbiAgICAgIC8vIFRoZSAndW5uYW1lZCcgZmFsbGJhY2sgYXBwbGllcyBvbmx5IHRvIGNhbmRpZGF0ZSBlbGVtZW50cyAobWlycm9yaW5nIGhvd1xuICAgICAgLy8gdGhleSB3ZXJlIHNhdmVkKS4gQSByZWZlcmVuY2UgdGhhdCBpcyBlbXB0eSBvciBub3JtYWxpemVzIHRvIG5vdGhpbmdcbiAgICAgIC8vICgnJywgJyAgICcsICctLS0nKSBjYW4gbmV2ZXIgbmFtZSBhIHNhdmVkIGZpbGUg4oCUIHZhbGlkYXRlQWN0aXZhdGVzKCkgb25seVxuICAgICAgLy8gd2FybnMgb24gc3VjaCBlbnRyaWVzLCBzbyBleGNsdWRlIHRoZW0gaGVyZSBvciB0aGV5IHdvdWxkIHJpZGUgdGhlXG4gICAgICAvLyBmYWxsYmFjayBvbnRvIGFyYml0cmFyeSBzZXBhcmF0b3Itb25seS1uYW1lZCBlbGVtZW50cy5cbiAgICAgIGNvbnN0IHRyaW1tZWRSZWZlcmVuY2UgPSBlbGVtZW50TmFtZS50cmltKCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0ID0gdHJpbW1lZFJlZmVyZW5jZSA/IHRoaXMubm9ybWFsaXplRmlsZW5hbWUodHJpbW1lZFJlZmVyZW5jZSkgOiAnJztcbiAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICBlbGVtZW50cy5maW5kKChlOiBhbnkpID0+IGUubWV0YWRhdGEubmFtZSA9PT0gZWxlbWVudE5hbWUpID8/XG4gICAgICAgIChub3JtYWxpemVkVGFyZ2V0XG4gICAgICAgICAgPyBlbGVtZW50cy5maW5kKChlOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiBlLm1ldGFkYXRhLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgIGNhbm9uaWNhbFNsdWcoZS5tZXRhZGF0YS5uYW1lKSA9PT0gbm9ybWFsaXplZFRhcmdldFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdW5kZWZpbmVkKTtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyBub3QgZm91bmRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGFwcHJvcHJpYXRlIGNvbnRlbnQgYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ21lbW9yaWVzJzoge1xuICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBlbGVtZW50LmdldEVudHJpZXMoKTtcbiAgICAgICAgICByZXR1cm4gYE1lbW9yeSAnJHtlbGVtZW50TmFtZX0nIHdpdGggJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllc2A7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICd0ZW1wbGF0ZXMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnQgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnZW5zZW1ibGVzJzoge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRMaXN0ID0gT2JqZWN0LmVudHJpZXMoZWxlbWVudC5lbGVtZW50cyB8fCB7fSlcbiAgICAgICAgICAgIC5tYXAoKFt0eXBlLCBuYW1lc10pID0+IGAke3R5cGV9OiAke0FycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMuam9pbignLCAnKSA6IFN0cmluZyhuYW1lcyl9YClcbiAgICAgICAgICAgIC5qb2luKCc7ICcpO1xuICAgICAgICAgIHJldHVybiBgRW5zZW1ibGUgJyR7ZWxlbWVudE5hbWV9JyBhY3RpdmF0ZXM6ICR7ZWxlbWVudExpc3R9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2FnZW50cyc6IHtcbiAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBlbGVtZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYFtDb250ZW50IG5vdCBhdmFpbGFibGUgZm9yICR7ZWxlbWVudFR5cGV9XWA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgZ2V0dGluZyBjb250ZW50IGZvciAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhY3RpdmUgc2V0IGNsZWFudXAgaXMgbmVlZGVkIGFuZCBwZXJmb3JtIGNsZWFudXAgaWYgbmVjZXNzYXJ5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBtYXgsIGNsZWFudXBUaHJlc2hvbGQgfSA9IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZygnYWdlbnRzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBjb25zdCBhY3RpdmVDb3VudCA9IHRoaXMuZ2V0QWN0aXZlQWdlbnRDb3VudCgpO1xuICAgIGlmIChhY3RpdmVDb3VudCA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAoYWN0aXZlQ291bnQgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBhZ2VudHMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGFnZW50cyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0FHRU5UUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke2FjdGl2ZUNvdW50fS8ke21heH0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhY3RpdmVDb3VudCxcbiAgICAgICAgICBtYXhBbGxvd2VkOiBtYXgsXG4gICAgICAgICAgYWN0aXZlQWdlbnROYW1lczogW1xuICAgICAgICAgICAgLi4udGhpcy5hY3RpdmVBZ2VudHNCeUZpbGVuYW1lLnZhbHVlcygpLFxuICAgICAgICAgICAgLi4udGhpcy5hY3RpdmVBZ2VudE5hbWVzLFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGFsZSBlbnRyaWVzIGZyb20gYWN0aXZlIGFnZW50cyBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5nZXRBY3RpdmVBZ2VudENvdW50KCk7XG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWdlbnROYW1lcyA9IG5ldyBTZXQoYWdlbnRzLm1hcChhID0+IGEubWV0YWRhdGEubmFtZSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudEZpbGVuYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIGFnZW50cy5tYXAoYWdlbnQgPT4gdGhpcy5nZXRTdGFibGVGaWxlbmFtZShhZ2VudCkpLmZpbHRlcigoZmlsZW5hbWUpOiBmaWxlbmFtZSBpcyBzdHJpbmcgPT4gQm9vbGVhbihmaWxlbmFtZSkpLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBhY3RpdmF0aW9uTmFtZV0gb2YgdGhpcy5hY3RpdmVBZ2VudHNCeUZpbGVuYW1lKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdBZ2VudEZpbGVuYW1lcy5oYXMoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2VudHNCeUZpbGVuYW1lLmRlbGV0ZShmaWxlbmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2YXRpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlQWdlbnROYW1lcykge1xuICAgICAgICBpZiAoIWV4aXN0aW5nQWdlbnROYW1lcy5oYXMoYWN0aXZlTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5nZXRBY3RpdmVBZ2VudENvdW50KCk7XG4gICAgICBjb25zdCByZW1vdmVkID0gc3RhcnRTaXplIC0gZW5kU2l6ZTtcblxuICAgICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDbGVhbmVkIHVwICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZShzKS4gYCArXG4gICAgICAgICAgYEFjdGl2ZSBhZ2VudHM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgnYWdlbnRzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgYWdlbnQgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgYWdlbnRzOicsIGVycm9yKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCBhbiBhZ2VudCBzdGF0ZSBmaWxlIChZQU1MKS5cbiAgICpcbiAgICogSU1QUk9WRU1FTlQ6IE9wdGltaXN0aWMgbG9ja2luZyB3aXRoIHZlcnNpb24gY2hlY2tpbmcgKElzc3VlICMyNClcbiAgICogUHJldmVudHMgc3RhdGUgY29ycnVwdGlvbiBmcm9tIGNvbmN1cnJlbnQgdXBkYXRlcyBieSBjb21wYXJpbmcgdmVyc2lvbnNcbiAgICpcbiAgICogRklYOiBVc2VzIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICogVGhpcyBlbnN1cmVzIHN0YXRlIGZpbGVzIHVzZSBrZWJhYi1jYXNlIChlLmcuLCBcImNydWR2LWFnZW50LWRlbHRhLnN0YXRlLnlhbWxcIilcbiAgICogcmVnYXJkbGVzcyBvZiBpbnB1dCBuYW1lIGZvcm1hdCAoZS5nLiwgXCJDUlVEVi1BZ2VudC1EZWx0YVwiKVxuICAgKlxuICAgKiBGSVggKElzc3VlICMxMDcgLSBDUklULTIpOiBXcmFwIHJlYWQtY29tcGFyZS13cml0ZSBzZXF1ZW5jZSBpbiBmaWxlIGxvY2tcbiAgICogdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb24gZnJvbSBjb25jdXJyZW50IGFnZW50IGV4ZWN1dGlvbnNcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTIzKTogVmVyc2lvbiBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZSwgbm90IGR1cmluZyBvcGVyYXRpb25zXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGUgdmVyc2lvbiBhZnRlciBzdWNjZXNzZnVsIHNhdmVcbiAgICogQHByb3RlY3RlZCBPbmx5IGFjY2Vzc2libGUgYnkgc3ViY2xhc3NlcyAoZS5nLiwgVGVzdGFibGVBZ2VudE1hbmFnZXIgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUFnZW50U3RhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YXRlOiBBZ2VudFN0YXRlLFxuICAgIHN0cmljdEV4aXN0aW5nU3RhdGVFcnJvcnMgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoc3RyaWN0RXhpc3RpbmdTdGF0ZUVycm9ycykge1xuICAgICAgYXdhaXQgdGhpcy5hc3NlcnRTdGF0ZURpcmVjdG9yeUF2YWlsYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgfVxuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIG5hbWluZ1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplRWxlbWVudFN0b3JhZ2VJZGVudGl0eShuYW1lKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuXG4gICAgLy8gRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogQWNxdWlyZSBmaWxlIGxvY2sgdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25cbiAgICAvLyBUaGUgbG9jayBjb3ZlcnMgdGhlIGVudGlyZSByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgdG8gZW5zdXJlIGF0b21pY2l0eVxuICAgIGF3YWl0IHRoaXMuZmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBhZ2VudC1zdGF0ZToke25vcm1hbGl6ZWROYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEZJWDogT3B0aW1pc3RpYyBsb2NraW5nIGNoZWNrIChJc3N1ZSAjMjQpXG4gICAgICAvLyBMb2FkIGV4aXN0aW5nIHN0YXRlIHRvIGNvbXBhcmUgdmVyc2lvbnMgYmVmb3JlIG92ZXJ3cml0aW5nXG4gICAgICBjb25zdCBleGlzdGluZ1N0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShuYW1lLCBzdHJpY3RFeGlzdGluZ1N0YXRlRXJyb3JzKTtcbiAgICAgIGlmIChzdHJpY3RFeGlzdGluZ1N0YXRlRXJyb3JzICYmICFleGlzdGluZ1N0YXRlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgc3RhdGUgZGlzYXBwZWFyZWQgd2hpbGUgY29tcGxldGluZyBnb2FsIGZvciAnJHtuYW1lfSdgKTtcbiAgICAgIH1cbiAgICAgIGlmIChleGlzdGluZ1N0YXRlICYmIGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgb3VyIHN0YXRlIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb25cbiAgICAgICAgLy8gSWYgdmVyc2lvbnMgZG9uJ3QgbWF0Y2gsIGl0IG1lYW5zIGFub3RoZXIgcHJvY2VzcyB1cGRhdGVkIHRoZSBzdGF0ZVxuICAgICAgICBpZiAoZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24gPiBzdGF0ZS5zdGF0ZVZlcnNpb24pIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgU3RhdGUgdmVyc2lvbiBjb25mbGljdCBkZXRlY3RlZCBmb3IgYWdlbnQgJHtuYW1lfWAsIHtcbiAgICAgICAgICAgIGV4aXN0aW5nVmVyc2lvbjogZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24sXG4gICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdNRU1PUllfU0FWRV9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnNhdmVBZ2VudFN0YXRlJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBhdHRlbXB0ZWQgdG8gc2F2ZSBzdGFsZSBzdGF0ZWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGV4aXN0aW5nVmVyc2lvbjogZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24sXG4gICAgICAgICAgICAgIGF0dGVtcHRlZFZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFN0YXRlIHZlcnNpb24gY29uZmxpY3Q6IGN1cnJlbnQgdmVyc2lvbiBpcyAke2V4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9ufSwgYCArXG4gICAgICAgICAgICBgYnV0IGF0dGVtcHRlZCB0byBzYXZlIHZlcnNpb24gJHtzdGF0ZS5zdGF0ZVZlcnNpb259LiBgICtcbiAgICAgICAgICAgIGBTdGF0ZSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGNvbmN1cnJlbnRseS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGSVggKElzc3VlICMxMjMpOiBJbmNyZW1lbnQgdmVyc2lvbiBCRUZPUkUgc2VyaWFsaXphdGlvbiwgbm90IGR1cmluZyBvcGVyYXRpb25zXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdmVyc2lvbiBvbmx5IGluY3JlbWVudHMgb24gc3VjY2Vzc2Z1bCBzYXZlXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAoc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDApICsgMTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0gdGhpcy5wcmVwYXJlU3RhdGVGb3JTZXJpYWxpemF0aW9uKHN0YXRlKTtcblxuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmR1bXBZYW1sKHNlcmlhbGl6ZWRTdGF0ZSwge1xuICAgICAgICBzY2hlbWE6ICdqc29uJywgIC8vIEZpeCAjOTE0OiBmYWlsc2FmZSBjb3JydXB0cyBib29sZWFucy9udW1iZXJzIGluIGFnZW50IHN0YXRlXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgc29ydEtleXM6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzaXplXG4gICAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnZhbGlkYXRlU2l6ZSh5YW1sQ29udGVudCwgTUFYX1lBTUxfU0laRSwgJ0FnZW50IHN0YXRlJyk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sQ29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYEFnZW50IHN0YXRlIHNhdmVkIHN1Y2Nlc3NmdWxseWAsIHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBub3JtYWxpemVkTmFtZSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24sXG4gICAgICAgIGdvYWxDb3VudDogc3RhdGUuZ29hbHM/Lmxlbmd0aCA/PyAwXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFJldHVybiB0aGUgbmV3IHZlcnNpb24gZm9yIGNhbGxlciB0byBzeW5jIGFnZW50J3MgaW50ZXJuYWwgc3RhdGVcbiAgICAvLyBzdGF0ZVZlcnNpb24gaXMgZ3VhcmFudGVlZCB0byBiZSBhIG51bWJlciBhZnRlciB0aGUgaW5jcmVtZW50IGFib3ZlXG4gICAgcmV0dXJuIHN0YXRlLnN0YXRlVmVyc2lvbiE7XG4gIH1cblxuICAvKipcbiAgICogVXRpbGl0eTogZW5zdXJlIGAubWRgIGV4dGVuc2lvbiBvbiByZXF1ZXN0ZWQgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgc3RyaXBFeHRlbnNpb24oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBmaWxlUGF0aC5zbGljZSgwLCAtQUdFTlRfRklMRV9FWFRFTlNJT04ubGVuZ3RoKVxuICAgICAgOiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaHlkcmF0ZUFnZW50U3RhdGUoXG4gICAgYWdlbnQ6IEFnZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJpY3RTdGF0ZUVycm9ycyA9IGZhbHNlLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSwgc3RyaWN0U3RhdGVFcnJvcnMpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSk7XG4gICAgc2VyaWFsaXplZC5zdGF0ZSA9IHN0YXRlO1xuICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nLCBzdHJpY3RTdGF0ZUVycm9ycyA9IGZhbHNlKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBsb29rdXBzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5KG5hbWUpO1xuXG4gICAgLy8gU2VjdXJpdHktc2Vuc2l0aXZlIHN0YXRlIGNoZWNrcyBtdXN0IHJlLXJlYWQgZHVyYWJsZSBzdG9yYWdlIHJhdGhlciB0aGFuXG4gICAgLy8gdHJ1c3RpbmcgYSBwb3NzaWJseSBzdGFsZSBwcm9jZXNzIGNhY2hlLlxuICAgIGlmICghc3RyaWN0U3RhdGVFcnJvcnMgJiYgdGhpcy5zdGF0ZUNhY2hlLmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlQ2FjaGUuZ2V0KG5vcm1hbGl6ZWROYW1lKSE7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVGaWxlbmFtZSA9IGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICBjb25zdCBzdGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgc3RhdGVGaWxlbmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc3RhdGVQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIFlBTUwgcGFyc2luZ1xuICAgICAgLy8gU3RhdGUgZmlsZXMgYXJlIHB1cmUgWUFNTCBidXQgcGFyc2VGcm9udG1hdHRlciBoYW5kbGVzIGJvdGggZm9ybWF0c1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGNvbnRlbnQsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmxvYWRBZ2VudFN0YXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gcmVzdWx0LmRhdGEgYXMgQWdlbnRTdGF0ZTtcbiAgICAgIHRoaXMubm9ybWFsaXplTG9hZGVkU3RhdGUoc3RhdGUpO1xuICAgICAgLy8gRklYOiBVc2Ugbm9ybWFsaXplZCBuYW1lIGFzIGNhY2hlIGtleSBmb3IgY29uc2lzdGVudCBsb29rdXBzXG4gICAgICBpZiAoIXN0cmljdFN0YXRlRXJyb3JzKSB7XG4gICAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0U3RhdGVEaXJlY3RvcnlBdmFpbGFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgc3RhdGU6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICBpZiAoc3RyaWN0U3RhdGVFcnJvcnMpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzdGluZ3Vpc2ggYSBsZWdpdGltYXRlbHkgYWJzZW50IHBlci1hZ2VudCBzdGF0ZSBmaWxlIGZyb20gdW5hdmFpbGFibGVcbiAgICogc3RhdGUgc3RvcmFnZS4gU3RyaWN0IHJlY292ZXJ5IG1heSB0cmVhdCBvbmx5IHRoZSBmb3JtZXIgYXMgZW1wdHkgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFzc2VydFN0YXRlRGlyZWN0b3J5QXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuc3RhdCh0aGlzLnN0YXRlRGlyKTtcbiAgICAgIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FnZW50IHN0YXRlIHN0b3JhZ2UgcGF0aCBpcyBub3QgYSBkaXJlY3RvcnknKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZ2VudCBzdGF0ZSBkaXJlY3RvcnkgdW5hdmFpbGFibGU6ICR7cmVhc29ufWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5zdGF0ZURpcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPEFnZW50TWV0YWRhdGE+IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHsgLi4uKGRhdGEgYXMgYW55KSB9O1xuXG4gICAgLy8gLS0tIFNUQVJUOiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IEZpeCBmb3IgTGVnYWN5IEFnZW50IFR5cGVzIC0tLVxuICAgIC8vIExlZ2FjeSBhZ2VudCBkZWZpbml0aW9uIGZpbGVzIG1pZ2h0IHVzZSAnYWdlbnQnIChzaW5ndWxhcikgaW5zdGVhZCBvZlxuICAgIC8vIEVsZW1lbnRUeXBlLkFHRU5UICgnYWdlbnRzJykuIFRoaXMgY29udmVydHMgdGhlIHNpbmd1bGFyIGZvcm0gdG8gdGhlXG4gICAgLy8gY29ycmVjdCBwbHVyYWwgZW51bSB2YWx1ZSB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICBpZiAobWV0YWRhdGEudHlwZSA9PT0gJ2FnZW50Jykge1xuICAgICAgbWV0YWRhdGEudHlwZSA9IEVsZW1lbnRUeXBlLkFHRU5UO1xuICAgIH1cbiAgICAvLyAtLS0gRU5EOiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IEZpeCAtLS1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHR5cGUgaXMgbm93IEVsZW1lbnRUeXBlLkFHRU5UIChwbHVyYWwpXG4gICAgaWYgKG1ldGFkYXRhLnR5cGUgJiYgbWV0YWRhdGEudHlwZSAhPT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGU6IGV4cGVjdGVkICcke0VsZW1lbnRUeXBlLkFHRU5UfScsIGdvdCAnJHttZXRhZGF0YS50eXBlfSdgKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIG5hbWUgdmFsaWRhdGlvblxuICAgIGlmIChtZXRhZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQobWV0YWRhdGEubmFtZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGlmICghbmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBuYW1lOiAke25hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgbWV0YWRhdGEubmFtZSA9IG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBkZXNjcmlwdGlvbiB2YWxpZGF0aW9uXG4gICAgLy8gRklYOiBNdXN0IHNwZWNpZnkgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nIHRvIGFsbG93IHB1bmN0dWF0aW9uIGxpa2UgY29sb25zLCBzZW1pY29sb25zLCBldGMuXG4gICAgaWYgKG1ldGFkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBkZXNjUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQobWV0YWRhdGEuZGVzY3JpcHRpb24sIHtcbiAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgIGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJ1xuICAgICAgfSk7XG4gICAgICBpZiAoIWRlc2NSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWdlbnQgZGVzY3JpcHRpb246ICR7ZGVzY1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGRlc2NSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBzcGVjaWFsaXphdGlvbnMgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcodmFsdWUpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3BlY2lhbGl6YXRpb24gXCIke3ZhbHVlfVwiOiAke3Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVkU3BlY2lhbGl6YXRpb25zLnB1c2gocmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMgPSB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gS0VFUDogVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIChhbHJlYWR5IHVzaW5nIHNlcnZpY2UgcGF0dGVybilcbiAgICBpZiAobWV0YWRhdGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZVRyaWdnZXJzKFxuICAgICAgICBtZXRhZGF0YS50cmlnZ2VycyxcbiAgICAgICAgRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICAgIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nXG4gICAgICApO1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY3NjogU2FuaXRpemUgZ2F0ZWtlZXBlciBwb2xpY3kgb24gbG9hZCB0byBwcmV2ZW50IHByb21wdC1pbmplY3Rpb24gYXR0YWNrc1xuICAgIC8vIE1hbGZvcm1lZCBwb2xpY2llcyBhcmUgc3RyaXBwZWQgYW5kIGxvZ2dlZCBhcyBzZWN1cml0eSBldmVudHMgKG5ldmVyIHJlYWNoIGVuZm9yY2VtZW50KVxuICAgIGlmIChtZXRhZGF0YS5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhLmdhdGVrZWVwZXIsIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nLCAnYWdlbnQnLCBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogVmFsaWRhdGUgVjIgYWdlbnQgZmllbGRzIG9uIGxvYWQg4oCUIHN0cnVjdHVyYWwgY2hlY2tzLCBzdHJpcCBtYWxmb3JtZWQgZGF0YS5cbiAgICAvLyBGYWlsLW9wZW46IGNvcnJ1cHRlZCBmaWVsZHMgYXJlIHJlbW92ZWQgYW5kIGxvZ2dlZCwgbm90IHRocm93bi4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIGJhZCBkYXRhIGZyb20gcmVhY2hpbmcgZXhlY3V0aW9uIHRpbWUgd2hpbGUga2VlcGluZyB0aGUgYWdlbnQgbG9hZGFibGUuXG4gICAgY29uc3QgYWdlbnROYW1lID0gbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bic7XG5cbiAgICAvLyBJc3N1ZSAjNjk3OiBOb3JtYWxpemUgYGdvYWxzYCAocGx1cmFsKSDihpIgYGdvYWxgIChzaW5ndWxhcilcbiAgICBpZiAobWV0YWRhdGEuZ29hbHMgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5nb2FsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLmdvYWwgPSBtZXRhZGF0YS5nb2FscztcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FscztcbiAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IG1pZ3JhdGVkICdnb2FscycgKHBsdXJhbCkgdG8gJ2dvYWwnYCk7XG4gICAgfSBlbHNlIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBgZ29hbGAgYWxyZWFkeSBzZXQg4oCUIGRyb3AgdGhlIHJlZHVuZGFudCBwbHVyYWwgZm9ybVxuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5nb2FsKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLmdvYWwgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtZXRhZGF0YS5nb2FsLnRlbXBsYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc25ha2VfY2FzZSBnb2FsIHN1Yi1maWVsZHNcbiAgICAgICAgbm9ybWFsaXplR29hbEtleXMobWV0YWRhdGEuZ29hbCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFycmF5IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycyAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbC5wYXJhbWV0ZXJzIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBzdWNjZXNzQ3JpdGVyaWEgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbC5zdWNjZXNzQ3JpdGVyaWEgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1ldGFkYXRhLmdvYWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIGdvYWwgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSDigJQgYW55dGhpbmcgZWxzZSBpcyBpbnZhbGlkXG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwgaXMgbWFsZm9ybWVkIChubyB0ZW1wbGF0ZSksIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLmFjdGl2YXRlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGFjdGl2YXRlcyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmFjdGl2YXRlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEVhY2gga2V5IHNob3VsZCBtYXAgdG8gYSBzdHJpbmcgYXJyYXlcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzLiR7a2V5fSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmFjdGl2YXRlc1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS50b29scykge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS50b29scyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdG9vbHMgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuYWxsb3dlZCkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdG9vbHMuYWxsb3dlZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZyB0b29sc2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudG9vbHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHYXAgMzogVmFsaWRhdGUgdG9vbHMuZGVuaWVkIGlzIGFuIGFycmF5IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKG1ldGFkYXRhLnRvb2xzLmRlbmllZCAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmRlbmllZCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5kZW5pZWQgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEudG9vbHMuZGVuaWVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyNTogTm9ybWFsaXplIHN5c3RlbV9wcm9tcHQg4oaSIHN5c3RlbVByb21wdCAoTExNcyBjb21tb25seSB1c2Ugc25ha2VfY2FzZSlcbiAgICBjb25zdCBhbnlNZXRhID0gbWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGFueU1ldGEuc3lzdGVtX3Byb21wdCAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbnlNZXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdDtcbiAgICB9XG4gICAgZGVsZXRlIGFueU1ldGEuc3lzdGVtX3Byb21wdDtcblxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9Jzogc3lzdGVtUHJvbXB0IGlzIG5vdCBhIHN0cmluZywgc3RyaXBwaW5nYCk7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuc3lzdGVtUHJvbXB0O1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2OTc6IFByb21vdGUgcm9vdC1sZXZlbCBWMSBhdXRvbm9teSBmaWVsZHMgaW50byB0aGUgYGF1dG9ub215YCBibG9jay5cbiAgICAvLyBWMSBhZ2VudHMgc3RvcmVkIHJpc2tUb2xlcmFuY2UgYW5kIG1heEF1dG9ub21vdXNTdGVwcyBhdCB0aGUgbWV0YWRhdGEgcm9vdC5cbiAgICAvLyBWMiBuZXN0cyB0aGVtIHVuZGVyIGBhdXRvbm9teWAuIFRoaXMgcHJvbW90aW9uIGVuc3VyZXMgZG93bnN0cmVhbSBjb2RlIG9ubHlcbiAgICAvLyBjaGVja3Mgb25lIGxvY2F0aW9uLiBUaGUgZXhpc3RpbmcgYXV0b25vbXkgdmFsaWRhdGlvbiBiZWxvdyB2YWxpZGF0ZXMgdmFsdWVzLlxuICAgIC8vIFByZWNlZGVuY2U6IGNhbWVsQ2FzZSB2YXJpYW50cyBhcmUgbGlzdGVkIGJlZm9yZSBzbmFrZV9jYXNlL3Nob3J0IGZvcm1zLCBzb1xuICAgIC8vIGUuZy4gYHJpc2tUb2xlcmFuY2VgIHdpbnMgb3ZlciBgcmlza190b2xlcmFuY2VgIGlmIGJvdGggYXBwZWFyIGF0IHJvb3QuXG4gICAge1xuICAgICAgY29uc3Qgcm9vdEF1dG9ub215RmllbGRzOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+ID0gW1xuICAgICAgICBbJ3Jpc2tUb2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ3Jpc2tfdG9sZXJhbmNlJywgJ3Jpc2tUb2xlcmFuY2UnXSxcbiAgICAgICAgWydtYXhBdXRvbm9tb3VzU3RlcHMnLCAnbWF4QXV0b25vbW91c1N0ZXBzJ10sXG4gICAgICAgIFsnbWF4X2F1dG9ub21vdXNfc3RlcHMnLCAnbWF4QXV0b25vbW91c1N0ZXBzJ10sXG4gICAgICAgIFsnbWF4U3RlcHMnLCAnbWF4QXV0b25vbW91c1N0ZXBzJ10sXG4gICAgICBdIGFzIGNvbnN0O1xuICAgICAgbGV0IHByb21vdGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IFtyb290S2V5LCBhdXRvbm9teUtleV0gb2Ygcm9vdEF1dG9ub215RmllbGRzKSB7XG4gICAgICAgIGlmIChhbnlNZXRhW3Jvb3RLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmF1dG9ub215KSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hdXRvbm9teSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhQmxvY2sgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBpZiAoYUJsb2NrW2F1dG9ub215S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhQmxvY2tbYXV0b25vbXlLZXldID0gYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgICAgIHByb21vdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFueU1ldGFbcm9vdEtleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9tb3RlZCkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBwcm9tb3RlZCByb290LWxldmVsIGF1dG9ub215IGZpZWxkcyBpbnRvIGF1dG9ub215IGJsb2NrYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmF1dG9ub215KSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLmF1dG9ub215ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmF1dG9ub215KSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teSBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmF1dG9ub215O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBzcGVjaWZpYyBmaWVsZHNcbiAgICAgICAgLy8gR2FwIDQ6IFZhbGlkYXRlIHJpc2tUb2xlcmFuY2UgZW51bSAodXNlcyBzaGFyZWQgY29uc3RhbnRzIGZyb20gSXNzdWUgIzcyNylcbiAgICAgICAgaWYgKGEucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihhLnJpc2tUb2xlcmFuY2UsIFJJU0tfVE9MRVJBTkNFX0xFVkVMUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yaXNrVG9sZXJhbmNlICcke2Eucmlza1RvbGVyYW5jZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLnJpc2tUb2xlcmFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5tYXhBdXRvbm9tb3VzU3RlcHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEucmVxdWlyZXNBcHByb3ZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkucmVxdWlyZXNBcHByb3ZhbCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLnJlcXVpcmVzQXBwcm92YWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoYS5hdXRvQXBwcm92ZSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5hdXRvQXBwcm92ZSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLmF1dG9BcHByb3ZlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnJlc2lsaWVuY2UpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEucmVzaWxpZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElzc3VlICM3MzA6IFNoYXJlZCBub3JtYWxpemF0aW9uICh3YXMgZHVwbGljYXRlZCBpbiBwYXJzZU1ldGFkYXRhICsgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZSlcbiAgICAgICAgY29uc3QgciA9IG1ldGFkYXRhLnJlc2lsaWVuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZVJlc2lsaWVuY2VLZXlzKHIpO1xuXG4gICAgICAgIC8vIElzc3VlICM3Mjc6IFVzZSBzaGFyZWQgZW51bSBjb25zdGFudHMgZm9yIHJlc2lsaWVuY2UgdmFsaWRhdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uU3RlcExpbWl0UmVhY2hlZCAnJHtyLm9uU3RlcExpbWl0UmVhY2hlZH0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uU3RlcExpbWl0UmVhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5vbkV4ZWN1dGlvbkZhaWx1cmUgJyR7ci5vbkV4ZWN1dGlvbkZhaWx1cmV9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5vbkV4ZWN1dGlvbkZhaWx1cmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIubWF4UmV0cmllcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UubWF4UmV0cmllcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm1heFJldHJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIubWF4Q29udGludWF0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UubWF4Q29udGludWF0aW9ucyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm1heENvbnRpbnVhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2FwIDU6IFZhbGlkYXRlIHJldHJ5QmFja29mZiBlbnVtIGFuZCBwcmVzZXJ2ZVN0YXRlIGJvb2xlYW4gKHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoci5yZXRyeUJhY2tvZmYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5yZXRyeUJhY2tvZmYsIEJBQ0tPRkZfU1RSQVRFR0lFUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLnJldHJ5QmFja29mZiAnJHtyLnJldHJ5QmFja29mZn0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnJldHJ5QmFja29mZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5wcmVzZXJ2ZVN0YXRlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLnByZXNlcnZlU3RhdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucHJlc2VydmVTdGF0ZSBpcyBub3QgYSBib29sZWFuLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5wcmVzZXJ2ZVN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGFnczogdmFsaWRhdGUgYXMgc3RyaW5nIGFycmF5IChjb21tb24gZmllbGQsIGFsbCBlbGVtZW50IHR5cGVzKVxuICAgIGlmIChtZXRhZGF0YS50YWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50YWdzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0YWdzIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50YWdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGEudGFncyA9IG1ldGFkYXRhLnRhZ3MuZmlsdGVyKCh0OiB1bmtub3duKSA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IEFnZW50TWV0YWRhdGEsIGJvZHlDb250ZW50OiBzdHJpbmcpOiBBZ2VudCB7XG4gICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQobWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAvLyBGaXggIzkxMjogUHJlZmVyIGV4cGxpY2l0IGZvcm1hdF92ZXJzaW9uIG1hcmtlciwgZmFsbCBiYWNrIHRvIGluc3RydWN0aW9ucy1wcmVzZW5jZSBjaGVja1xuICAgIGRlbGV0ZSAobWV0YWRhdGEgYXMgYW55KS5mb3JtYXRfdmVyc2lvbjsgIC8vIFN0cmlwIG1hcmtlciBmcm9tIHJ1bnRpbWUgbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhZGF0YUluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICBpZiAobWV0YWRhdGFJbnN0cnVjdGlvbnMpIHtcbiAgICAgIC8vIHYyIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGZyb20gWUFNTCwgYm9keSBpcyBjb250ZW50IChyZWZlcmVuY2UgbWF0ZXJpYWwpXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YUluc3RydWN0aW9ucztcbiAgICAgIGFnZW50LmNvbnRlbnQgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB2MSBmb3JtYXQ6IGJvZHkgdGV4dCBtYXBzIHRvIGluc3RydWN0aW9uc1xuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gYm9keUNvbnRlbnQudHJpbSgpO1xuICAgICAgYWdlbnQuY29udGVudCA9ICcnO1xuICAgIH1cbiAgICAvLyBLZWVwIGV4dGVuc2lvbnMuaW5zdHJ1Y3Rpb25zIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgIGluc3RydWN0aW9uczogYWdlbnQuaW5zdHJ1Y3Rpb25zXG4gICAgfTtcbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc2VyaWFsaXplRWxlbWVudChhZ2VudDogQWdlbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIFN0YXJ0IHdpdGggYmFzZSBtZXRhZGF0YSBmaWVsZHMgKGFsd2F5cyBwcmVzZW50KVxuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIG5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuQUdFTlQpLFxuICAgICAgdW5pcXVlX2lkOiBhZ2VudC5pZCxcbiAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IGFnZW50Lm1ldGFkYXRhLmNyZWF0ZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGZvcm1hdF92ZXJzaW9uOiAndjInLCAgLy8gRml4ICM5MTI6IEV4cGxpY2l0IGZvcm1hdCBtYXJrZXJcbiAgICB9O1xuXG4gICAgLy8gQ2FzdCB0byBjaGVjayBmb3IgdjIgZmllbGRzXG4gICAgY29uc3QgbWV0YWRhdGFWMiA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgIC8vIEFkZCB2MiBmaWVsZHMgaWYgcHJlc2VudCAoZ29hbCBpcyByZXF1aXJlZCBpbiB2Miwgb3RoZXJzIG9wdGlvbmFsKVxuICAgIGlmIChtZXRhZGF0YVYyLmdvYWwpIHtcbiAgICAgIG1ldGFkYXRhLmdvYWwgPSBtZXRhZGF0YVYyLmdvYWw7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLmFjdGl2YXRlcykge1xuICAgICAgbWV0YWRhdGEuYWN0aXZhdGVzID0gbWV0YWRhdGFWMi5hY3RpdmF0ZXM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnRvb2xzKSB7XG4gICAgICBtZXRhZGF0YS50b29scyA9IG1ldGFkYXRhVjIudG9vbHM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnN5c3RlbVByb21wdCkge1xuICAgICAgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID0gbWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLmF1dG9ub215KSB7XG4gICAgICBtZXRhZGF0YS5hdXRvbm9teSA9IG1ldGFkYXRhVjIuYXV0b25vbXk7XG4gICAgfVxuICAgIC8vIElzc3VlICM0NDk6IFNlcmlhbGl6ZSBnYXRla2VlcGVyIHBvbGljeSB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIuZ2F0ZWtlZXBlcikge1xuICAgICAgbWV0YWRhdGEuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhVjIuZ2F0ZWtlZXBlcjtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzUyNjogU2VyaWFsaXplIHJlc2lsaWVuY2UgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5yZXNpbGllbmNlKSB7XG4gICAgICBtZXRhZGF0YS5yZXNpbGllbmNlID0gbWV0YWRhdGFWMi5yZXNpbGllbmNlO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjI6IE9ubHkgc2VyaWFsaXplIHYxIGZpZWxkcyBmb3IgYWdlbnRzIFdJVEhPVVQgYSBnb2FsIChsZWdhY3kgdjEgYWdlbnRzKS5cbiAgICAvLyBWMiBhZ2VudHMgKHdpdGggZ29hbCkgc2hvdWxkIG5vdCBjYXJyeSBkZXByZWNhdGVkIHYxIGJhZ2dhZ2UgbGlrZVxuICAgIC8vIGRlY2lzaW9uRnJhbWV3b3JrLCByaXNrVG9sZXJhbmNlLCBsZWFybmluZ0VuYWJsZWQsIG1heENvbmN1cnJlbnRHb2Fscy5cbiAgICAvLyBUaGUgQWdlbnQgY29uc3RydWN0b3Igc3RpbGwgYXBwbGllcyB0aGVzZSBkZWZhdWx0cyBhdCBydW50aW1lIGZvciBiYWNrd2FyZFxuICAgIC8vIGNvbXBhdCB3aGVuIHJlYWRpbmcgb2xkIGZpbGVzIOKAlCBidXQgd2UgZG9uJ3Qgd3JpdGUgdGhlbSBpbnRvIG5ldyB2MiBhZ2VudHMuXG4gICAgY29uc3QgaXNWMkFnZW50ID0gISFtZXRhZGF0YVYyLmdvYWw7XG4gICAgaWYgKCFpc1YyQWdlbnQpIHtcbiAgICAgIGlmIChtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrKSB7XG4gICAgICAgIG1ldGFkYXRhLmRlY2lzaW9uRnJhbWV3b3JrID0gbWV0YWRhdGFWMi5kZWNpc2lvbkZyYW1ld29yaztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyLnJpc2tUb2xlcmFuY2UpIHtcbiAgICAgICAgbWV0YWRhdGEucmlza1RvbGVyYW5jZSA9IG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyLmxlYXJuaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhLmxlYXJuaW5nRW5hYmxlZCA9IG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubWF4Q29uY3VycmVudEdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubWF4Q29uY3VycmVudEdvYWxzID0gbWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNwZWNpYWxpemF0aW9ucyBpcyBub3QgYSBkZXByZWNhdGVkIHYxIGZpZWxkIOKAlCBhbHdheXMgc2VyaWFsaXplXG4gICAgaWYgKG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICBtZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMgPSBtZXRhZGF0YVYyLnNwZWNpYWxpemF0aW9ucztcbiAgICB9XG4gICAgLy8gSXNzdWUgIzcyMjogU2VyaWFsaXplIHRhZ3MgYW5kIHRyaWdnZXJzIHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi50YWdzICYmIEFycmF5LmlzQXJyYXkobWV0YWRhdGFWMi50YWdzKSAmJiBtZXRhZGF0YVYyLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbWV0YWRhdGEudGFncyA9IG1ldGFkYXRhVjIudGFncztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudHJpZ2dlcnMpIHtcbiAgICAgIG1ldGFkYXRhLnRyaWdnZXJzID0gbWV0YWRhdGFWMi50cmlnZ2VycztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIucnVsZUVuZ2luZUNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRhZGF0YS5ydWxlRW5naW5lQ29uZmlnID0gbWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnO1xuICAgIH1cblxuICAgIC8vIHYyLjAgZm9ybWF0OiBpbnN0cnVjdGlvbnMgaW4gWUFNTCBmcm9udG1hdHRlciwgY29udGVudCBhcyBib2R5XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYWdlbnQuaW5zdHJ1Y3Rpb25zIHx8XG4gICAgICAoYWdlbnQuZXh0ZW5zaW9ucz8uaW5zdHJ1Y3Rpb25zIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIHRoaXMuYnVpbGREZWZhdWx0SW5zdHJ1Y3Rpb25zKGFnZW50KTtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBtZXRhZGF0YS5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSBhZ2VudC5jb250ZW50IHx8IHRoaXMuYnVpbGREZWZhdWx0Qm9keShhZ2VudCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5jcmVhdGVGcm9udG1hdHRlcihtZXRhZGF0YSwgYm9keSwge1xuICAgICAgbWV0aG9kOiAnbWFudWFsJyxcbiAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gVXNlIEpTT04gc2NoZW1hIHRvIHByZXNlcnZlIGJvb2xlYW5zL251bWJlcnMgaW4gdjIgbWV0YWRhdGFcbiAgICAgIGNsZWFuTWV0YWRhdGE6IHRydWUsXG4gICAgICBjbGVhbmluZ1N0cmF0ZWd5OiAncmVtb3ZlLWJvdGgnLCAgLy8gUmVtb3ZlIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICBzb3J0S2V5czogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lSGVhZGVyID0gYWdlbnQubWV0YWRhdGEubmFtZSA/IGAjICR7YWdlbnQubWV0YWRhdGEubmFtZX1cXG5cXG5gIDogJyc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJztcbiAgICByZXR1cm4gYCR7bmFtZUhlYWRlcn0ke2Rlc2NyaXB0aW9ufWAudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRCb2R5KGFnZW50OiBBZ2VudCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IChhZ2VudC5tZXRhZGF0YS5uYW1lID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGluZXMucHVzaChgIyAke25hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBsaW5lcy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgdGV4dCB0aGF0IHNob3VsZCBzYXRpc2Z5IGNyZWF0ZS10aW1lIGNvbnRlbnQgdmFsaWRhdGlvbi5cbiAgICogQmVoYXZpb3JhbCBpbnN0cnVjdGlvbnMgcmVtYWluIHRoZSBwcmltYXJ5IHNvdXJjZSwgd2hpbGUgcmVmZXJlbmNlIGNvbnRlbnRcbiAgICogYWN0cyBhcyB0aGUgZmFsbGJhY2sgZm9yIGNvbnRlbnQtb25seSBhZ2VudCBjcmVhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZ2V0UHJpbWFyeVZhbGlkYXRpb25UZXh0KGNvbnRlbnQ6IHN0cmluZywgcmVmZXJlbmNlQ29udGVudDogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWZlcmVuY2VDb250ZW50ID09PSAnc3RyaW5nJyAmJiByZWZlcmVuY2VDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcmVmZXJlbmNlQ29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzI3OiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgYXQgd3JpdGUgdGltZS5cbiAgICpcbiAgICogTm9ybWFsaXplcyBzbmFrZV9jYXNlIOKGkiBjYW1lbENhc2UgKHNhbWUgYXMgcGFyc2VNZXRhZGF0YSkgYW5kIHRoZW4gdmFsaWRhdGVzXG4gICAqIHN0cnVjdHVyYWwgY29uc3RyYWludHMuIFVubGlrZSBwYXJzZU1ldGFkYXRhICh3aGljaCBzaWxlbnRseSBzdHJpcHMgZm9yXG4gICAqIGJhY2t3YXJkIGNvbXBhdCksIHRoaXMgcmV0dXJucyBlcnJvcnMgc28gdGhlIGNhbGxlciBjYW4gcmVqZWN0IHRoZSBjcmVhdGUuXG4gICAqXG4gICAqIE11dGF0ZXMgdGhlIG1ldGFkYXRhIGluIHBsYWNlIChub3JtYWxpemF0aW9uKSwgcmV0dXJucyB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIC0tLSB0b29scyAtLS1cbiAgICBpZiAobWV0YWRhdGEudG9vbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS50b29scyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scykgfHwgbWV0YWRhdGEudG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3Rvb2xzIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYWxsb3dlZC9kZW5pZWQgYXJyYXlzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuYWxsb3dlZCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMuYWxsb3dlZCBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnRvb2xzLmRlbmllZCAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmRlbmllZCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMuZGVuaWVkIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIHN5c3RlbVByb21wdCAtLS1cbiAgICBpZiAobWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdzeXN0ZW1Qcm9tcHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgICAvLyBzbmFrZV9jYXNlIHZhcmlhbnQgKElzc3VlICM3MjU6IG5vcm1hbGl6ZWQgYXQgZGlzcGF0Y2hlciBsZXZlbCBldmVudHVhbGx5KVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYW55TWV0YS5zeXN0ZW1fcHJvbXB0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbV9wcm9tcHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGFueU1ldGEuc3lzdGVtX3Byb21wdDtcbiAgICB9XG5cbiAgICAvLyAtLS0gYXV0b25vbXkgLS0tXG4gICAgaWYgKG1ldGFkYXRhLmF1dG9ub215ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpIHx8IG1ldGFkYXRhLmF1dG9ub215ID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgYSA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVBdXRvbm9teUtleXMoYSk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBhdXRvbm9teS5yaXNrVG9sZXJhbmNlIG11c3QgYmUgb25lIG9mOiAke1JJU0tfVE9MRVJBTkNFX0xFVkVMUy5qb2luKCcsICcpfSAoZ290ICcke2Eucmlza1RvbGVyYW5jZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkubWF4QXV0b25vbW91c1N0ZXBzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYS5yZXF1aXJlc0FwcHJvdmFsKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmF1dG9BcHByb3ZlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYS5hdXRvQXBwcm92ZSkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkuYXV0b0FwcHJvdmUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gcmVzaWxpZW5jZSAtLS1cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEucmVzaWxpZW5jZSkgfHwgbWV0YWRhdGEucmVzaWxpZW5jZSA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgciA9IG1ldGFkYXRhLnJlc2lsaWVuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZVJlc2lsaWVuY2VLZXlzKHIpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIGFmdGVyIG5vcm1hbGl6YXRpb25cbiAgICAgICAgaWYgKHIub25TdGVwTGltaXRSZWFjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25TdGVwTGltaXRSZWFjaGVkLCBTVEVQX0xJTUlUX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkIG11c3QgYmUgb25lIG9mOiAke1NURVBfTElNSVRfQUNUSU9OUy5qb2luKCcsICcpfSAoZ290ICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIub25FeGVjdXRpb25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25FeGVjdXRpb25GYWlsdXJlLCBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSBtdXN0IGJlIG9uZSBvZjogJHtFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vbkV4ZWN1dGlvbkZhaWx1cmV9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIubWF4UmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5tYXhSZXRyaWVzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIubWF4Q29udGludWF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5yZXRyeUJhY2tvZmYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5yZXRyeUJhY2tvZmYsIEJBQ0tPRkZfU1RSQVRFR0lFUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5yZXRyeUJhY2tvZmYgbXVzdCBiZSBvbmUgb2Y6ICR7QkFDS09GRl9TVFJBVEVHSUVTLmpvaW4oJywgJyl9IChnb3QgJyR7ci5yZXRyeUJhY2tvZmZ9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5wcmVzZXJ2ZVN0YXRlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Jlc2lsaWVuY2UucHJlc2VydmVTdGF0ZSBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIGFjdGl2YXRlcyAtLS1cbiAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykgfHwgbWV0YWRhdGEuYWN0aXZhdGVzID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdhY3RpdmF0ZXMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBza2lsbHMvcGVyc29uYXMvbWVtb3JpZXMvdGVtcGxhdGVzL2Vuc2VtYmxlcyBhcnJheXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBnb2FsIGlucHV0IHRvIFYyIGZvcm1hdC5cbiAgICogTExNcyBtYXkgcGFzcyBnb2FsIGFzIGEgc2ltcGxlIHN0cmluZyBvciBhcyBhIFYyIGNvbmZpZyBvYmplY3QuXG4gICAqIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSBhIHByb3BlciBWMiBzdHJ1Y3R1cmUgYmVmb3JlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBnb2FsIC0gRWl0aGVyIGEgc3RyaW5nIGdvYWwgb3IgYSBWMiBnb2FsIGNvbmZpZyBvYmplY3RcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBWMiBnb2FsIGNvbmZpZywgb3IgdW5kZWZpbmVkIGlmIG5vIGdvYWwgcHJvdmlkZWRcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplR29hbElucHV0KGdvYWw6IHN0cmluZyB8IFBhcnRpYWw8QWdlbnRHb2FsQ29uZmlnPiB8IHVuZGVmaW5lZCk6IEFnZW50R29hbENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIGNvbnZlcnQgdG8gVjIgZm9ybWF0XG4gICAgaWYgKHR5cGVvZiBnb2FsID09PSAnc3RyaW5nJykge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdDb252ZXJ0aW5nIHN0cmluZyBnb2FsIHRvIFYyIGZvcm1hdCcsIHsgZ29hbCB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiBnb2FsLFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGVtcGxhdGUsIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKHR5cGVvZiBnb2FsID09PSAnb2JqZWN0JyAmJiAndGVtcGxhdGUnIGluIGdvYWwgJiYgdHlwZW9mIGdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc25ha2VfY2FzZSBnb2FsIHN1Yi1maWVsZHMgYmVmb3JlIGFjY2Vzc2luZ1xuICAgICAgbm9ybWFsaXplR29hbEtleXMoZ29hbCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgY29uc3QgdmFsaWRQYXJhbVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBhcmFtczogQWdlbnRHb2FsUGFyYW1ldGVyW10gPSAoZ29hbC5wYXJhbWV0ZXJzIHx8IFtdKS5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcC5uYW1lID09PSAnc3RyaW5nJyA/IHAubmFtZSA6IGBwYXJhbV8ke2luZGV4fWA7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB2YWxpZFBhcmFtVHlwZXMuaW5jbHVkZXMocC50eXBlIGFzIHR5cGVvZiB2YWxpZFBhcmFtVHlwZXNbbnVtYmVyXSlcbiAgICAgICAgICA/IHAudHlwZSBhcyAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nXG4gICAgICAgICAgOiAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgcmVxdWlyZWQgPSB0eXBlb2YgcC5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nID8gcC5yZXF1aXJlZCA6IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZDogQWdlbnRHb2FsUGFyYW1ldGVyID0geyBuYW1lLCB0eXBlLCByZXF1aXJlZCB9O1xuICAgICAgICBpZiAodHlwZW9mIHAuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIHAuZGVzY3JpcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRlZC5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQocC5kZXNjcmlwdGlvbiwgU0VDVVJJVFlfTElNSVRTLk1BWF9ET0NVTUVOVEFUSU9OX0ZJRUxEX0xFTkdUSCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU2FuaXRpemUgc3RyaW5nIGRlZmF1bHRzIHRvIHByZXZlbnQgaW5qZWN0aW9uIHdoZW4gdXNlZCBpbiBnb2FsIHJlbmRlcmluZ1xuICAgICAgICAgIGlmICh0eXBlb2YgcC5kZWZhdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsaWRhdGVkLmRlZmF1bHQgPSBzYW5pdGl6ZUlucHV0KHAuZGVmYXVsdCwgNTAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGVkLmRlZmF1bHQgPSBwLmRlZmF1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwudGVtcGxhdGUsXG4gICAgICAgIHBhcmFtZXRlcnM6IHZhbGlkYXRlZFBhcmFtcyxcbiAgICAgICAgc3VjY2Vzc0NyaXRlcmlhOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3Qgd2l0aG91dCB0ZW1wbGF0ZSAtIGNhbm5vdCBjb252ZXJ0XG4gICAgbG9nZ2VyLndhcm4oJ0dvYWwgb2JqZWN0IG1pc3NpbmcgdGVtcGxhdGUgZmllbGQsIGNhbm5vdCBjb252ZXJ0IHRvIFYyJywgeyBnb2FsIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQWdlbnRGaWxlKGNvbnRlbnQ6IHN0cmluZyk6IFBhcnNlZEFnZW50RmlsZSB7XG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBmcm9udG1hdHRlciBwYXJzaW5nXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGNvbnRlbnQsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5wYXJzZUFnZW50RmlsZSdcbiAgICB9KTtcblxuICAgIC8vIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGVuc3VyZXMgZnJvbnRtYXR0ZXIgZXhpc3RzLCBvciB0aHJvd3MgZXJyb3JcbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsXG4gICAgICBjb250ZW50OiByZXN1bHQuY29udGVudC50cmltKClcbiAgICB9O1xuICB9XG5cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlbmFtZSBmb3IgYW4gYWdlbnQgZWxlbWVudC5cbiAgICpcbiAgICogVXNlcyBpbmhlcml0ZWQgbm9ybWFsaXplRmlsZW5hbWUoKSBmcm9tIEJhc2VFbGVtZW50TWFuYWdlciBmb3IgY29uc2lzdGVudFxuICAgKiBmaWxlbmFtZSBmb3JtYXR0aW5nIGFjcm9zcyBhbGwgZWxlbWVudCBtYW5hZ2Vycy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqICAgXCJDcmVhdGl2ZSBXcml0ZXJcIiAtPiBcImNyZWF0aXZlLXdyaXRlci5tZFwiXG4gICAqICAgXCJDUlVEVi1BZ2VudC1EZWx0YVwiIC0+IFwiY3J1ZHYtYWdlbnQtZGVsdGEubWRcIlxuICAgKiAgIFwiTXVsdGlfR29hbF9BZ2VudFwiIC0+IFwibXVsdGktZ29hbC1hZ2VudC5tZFwiXG4gICAqICAgXCJDYW1lbENhc2VOYW1lXCIgLT4gXCJjYW1lbC1jYXNlLW5hbWUubWRcIlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFVzZSBpbmhlcml0ZWQgbm9ybWFsaXplRmlsZW5hbWUoKSBmb3IgdW5pZmllZCBub3JtYWxpemF0aW9uXG4gICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVsZW1lbnROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlthLXpBLVowLTlfLV0rJC8udGVzdChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIGZvciBhdHRyaWJ1dGlvblxuICAgKiBSRUZBQ1RPUkVEOiBEZWxlZ2F0ZXMgdG8gTWV0YWRhdGFTZXJ2aWNlIGZvciBjb25zaXN0ZW50IHVzZXIgYXR0cmlidXRpb24gYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVTdGF0ZUZvclNlcmlhbGl6YXRpb24oc3RhdGU6IEFnZW50U3RhdGUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZSBpbnN0YW5jZW9mIERhdGUgPyBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCkgOiBzdGF0ZS5sYXN0QWN0aXZlLFxuICAgICAgc2Vzc2lvbkNvdW50OiBTdHJpbmcoc3RhdGUuc2Vzc2lvbkNvdW50ID8/IDApLFxuICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCA/IFN0cmluZyhzdGF0ZS5zdGF0ZVZlcnNpb24pIDogJzEnLCAgLy8gSW5jbHVkZSB2ZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmdcbiAgICAgIGdvYWxzOiBzdGF0ZS5nb2Fscy5tYXAoZ29hbCA9PiAoe1xuICAgICAgICAuLi5nb2FsLFxuICAgICAgICBjcmVhdGVkQXQ6IGdvYWwuY3JlYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNyZWF0ZWRBdCxcbiAgICAgICAgdXBkYXRlZEF0OiBnb2FsLnVwZGF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC51cGRhdGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBnb2FsLmNvbXBsZXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY29tcGxldGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY29tcGxldGVkQXQsXG4gICAgICAgIGltcG9ydGFuY2U6IGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHVyZ2VuY3k6IGdvYWwudXJnZW5jeSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwudXJnZW5jeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGVzdGltYXRlZEVmZm9ydDogZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmVzdGltYXRlZEVmZm9ydCkgOiB1bmRlZmluZWRcbiAgICAgIH0pKSxcbiAgICAgIGRlY2lzaW9uczogc3RhdGUuZGVjaXNpb25zLm1hcChkZWNpc2lvbiA9PiAoe1xuICAgICAgICAuLi5kZWNpc2lvbixcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlID8gZGVjaXNpb24udGltZXN0YW1wLnRvSVNPU3RyaW5nKCkgOiBkZWNpc2lvbi50aW1lc3RhbXAsXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhkZWNpc2lvbi5jb25maWRlbmNlKSA6IHVuZGVmaW5lZFxuICAgICAgfSkpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTG9hZGVkU3RhdGUoc3RhdGU6IEFnZW50U3RhdGUpOiB2b2lkIHtcbiAgICAvLyBGSVggKElzc3VlICMxMjMpOiBEZWZhdWx0IG1pc3NpbmcgYXJyYXlzIHRvIHByZXZlbnQgVHlwZUVycm9yXG4gICAgLy8gSWYgc3RhdGUgZmlsZSBpcyBtaXNzaW5nIGdvYWxzL2RlY2lzaW9ucy9jb250ZXh0LCBkZWZhdWx0IHRvIGVtcHR5IGFycmF5cy9vYmplY3RzXG4gICAgaWYgKCFzdGF0ZS5nb2Fscykge1xuICAgICAgc3RhdGUuZ29hbHMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmNvbnRleHQpIHtcbiAgICAgIHN0YXRlLmNvbnRleHQgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc2Vzc2lvbkNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnNlc3Npb25Db3VudCA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc2Vzc2lvbkNvdW50KSwgMTApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHN0YXRlVmVyc2lvbiBmb3Igb3B0aW1pc3RpYyBsb2NraW5nIChJc3N1ZSAjMjQpXG4gICAgaWYgKHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbiksIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2ZXJzaW9uIDEgaWYgbm90IHByZXNlbnQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gMTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGFzdEFjdGl2ZSkge1xuICAgICAgc3RhdGUubGFzdEFjdGl2ZSA9IG5ldyBEYXRlKHN0YXRlLmxhc3RBY3RpdmUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5nb2Fscykge1xuICAgICAgc3RhdGUuZ29hbHMuZm9yRWFjaChnb2FsID0+IHtcbiAgICAgICAgaWYgKGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC5pbXBvcnRhbmNlID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhnb2FsLmltcG9ydGFuY2UpLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXJnZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC51cmdlbmN5ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhnb2FsLnVyZ2VuY3kpLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmVzdGltYXRlZEVmZm9ydCA9IE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhnb2FsLmVzdGltYXRlZEVmZm9ydCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmNyZWF0ZWRBdCkge1xuICAgICAgICAgIGdvYWwuY3JlYXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jcmVhdGVkQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLnVwZGF0ZWRBdCkge1xuICAgICAgICAgIGdvYWwudXBkYXRlZEF0ID0gbmV3IERhdGUoZ29hbC51cGRhdGVkQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmNvbXBsZXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jb21wbGV0ZWRBdCA9IG5ldyBEYXRlKGdvYWwuY29tcGxldGVkQXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZGVjaXNpb25zKSB7XG4gICAgICBzdGF0ZS5kZWNpc2lvbnMuZm9yRWFjaChkZWNpc2lvbiA9PiB7XG4gICAgICAgIGlmIChkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWNpc2lvbi5jb25maWRlbmNlID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjaXNpb24udGltZXN0YW1wKSB7XG4gICAgICAgICAgZGVjaXNpb24udGltZXN0YW1wID0gbmV3IERhdGUoZGVjaXNpb24udGltZXN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHN0ZXAgaW4gYWdlbnQgZXhlY3V0aW9uXG4gICAqIFdyYXBzIEFnZW50LnJlY29yZERlY2lzaW9uKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgcmVjb3JkQWdlbnRTdGVwKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0ZXBEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICAvKiogT3B0aW9uYWwgZmluZGluZ3Mgb3IgcmVzdWx0cyBmcm9tIHRoaXMgc3RlcCAqL1xuICAgIGZpbmRpbmdzPzogc3RyaW5nO1xuICAgIGNvbmZpZGVuY2U/OiBudW1iZXI7XG4gICAgLyoqIE9wdGlvbmFsIGhpbnQgYWJvdXQgd2hhdCB0aGUgTExNIHBsYW5zIHRvIGRvIG5leHQgKGZvciBwcm9hY3RpdmUgcmlzayBldmFsdWF0aW9uKSAqL1xuICAgIG5leHRBY3Rpb25IaW50Pzogc3RyaW5nO1xuICAgIC8qKiBPcHRpb25hbCByaXNrIHNjb3JlIGZvciB0aGUgY3VycmVudCBzdGVwICgwLTEwMCkgKi9cbiAgICByaXNrU2NvcmU/OiBudW1iZXI7XG4gICAgLyoqIFJ1bnRpbWUgb3ZlcnJpZGUgZm9yIG1heEF1dG9ub21vdXNTdGVwcyAoSXNzdWUgIzQ0NykgKi9cbiAgICBtYXhTdGVwc092ZXJyaWRlPzogbnVtYmVyO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZGVjaXNpb246IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgZnJhbWV3b3JrOiBzdHJpbmc7XG4gICAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgfTtcbiAgICBzdGF0ZToge1xuICAgICAgZ29hbENvdW50OiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIC8qKiBBdXRvbm9teSBkaXJlY3RpdmUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGNvbnRpbnVlIG9yIHBhdXNlICovXG4gICAgYXV0b25vbXk6IEF1dG9ub215RGlyZWN0aXZlO1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgYWdlbnQgc3RhdGUgdG8gZmluZCBhY3RpdmUgZ29hbHNcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgYWN0aXZlR29hbCA9IHN0YXRlLmdvYWxzLmZpbmQoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG5cbiAgICBpZiAoIWFjdGl2ZUdvYWwpIHtcbiAgICAgIGNvbnN0IGdvYWxTdGF0dXNlcyA9IHN0YXRlLmdvYWxzLm1hcChnID0+IGAke2cuaWR9OiAke2cuc3RhdHVzfWApLmpvaW4oJywgJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBObyBhY3RpdmUgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nLiBgICtcbiAgICAgICAgYEF2YWlsYWJsZSBnb2FsczogJHtnb2FsU3RhdHVzZXMgfHwgJ25vbmUnfS4gYCArXG4gICAgICAgIGBVc2UgZXhlY3V0ZV9hZ2VudCB0byBzdGFydCBhIG5ldyBnb2FsIGZpcnN0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQ2FsbCBBZ2VudC5yZWNvcmREZWNpc2lvbigpIHRvIHBlcnNpc3QgdGhlIHN0ZXBcbiAgICBjb25zdCBkZWNpc2lvbiA9IGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogYWN0aXZlR29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uLFxuICAgICAgcmVhc29uaW5nOiBwYXJhbXMuZmluZGluZ3MgPz8gJycsXG4gICAgICBjb25maWRlbmNlOiBwYXJhbXMuY29uZmlkZW5jZSA/PyAwLjgsXG4gICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgIH0pO1xuXG4gICAgLy8gNC4gU2F2ZSBhZ2VudCBzdGF0ZVxuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KHBhcmFtcy5hZ2VudE5hbWUsIDEwMCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpKTtcblxuICAgIC8vIDUuIEdldCB1cGRhdGVkIHN0YXRlIGZvciBzdGVwIGNvdW50IGFuZCBhdXRvbm9teSBldmFsdWF0aW9uXG4gICAgY29uc3QgdXBkYXRlZFN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDYuIENhbGN1bGF0ZSBzdGVwIGNvdW50IGZvciB0aGlzIGdvYWxcbiAgICAvLyBzdGVwQ291bnQgPSBudW1iZXIgb2Ygc3RlcHMgY29tcGxldGVkIChpbmNsdWRpbmcgdGhlIG9uZSBqdXN0IHJlY29yZGVkKVxuICAgIC8vIFRoZSBldmFsdWF0b3IgdXNlcyB0aGlzIHRvIGNoZWNrIGlmIHdlJ3ZlIGhpdCBtYXhBdXRvbm9tb3VzU3RlcHNcbiAgICAvLyBhbmQgdG8gY29tcHV0ZSBzdGVwc1JlbWFpbmluZyBmb3IgdGhlIGF1dG9ub215IGRpcmVjdGl2ZS5cbiAgICBjb25zdCBnb2FsRGVjaXNpb25zID0gdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5maWx0ZXIoZCA9PiBkLmdvYWxJZCA9PT0gYWN0aXZlR29hbC5pZCk7XG4gICAgY29uc3Qgc3RlcENvdW50ID0gZ29hbERlY2lzaW9ucy5sZW5ndGg7XG5cbiAgICAvLyA3LiBHZXQgYWdlbnQgbWV0YWRhdGEgZm9yIGF1dG9ub215IGNvbmZpZ1xuICAgIGNvbnN0IGFnZW50TWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAvLyA4LiBFdmFsdWF0ZSBhdXRvbm9teSAtIHNob3VsZCB3ZSBjb250aW51ZSBvciBwYXVzZT9cbiAgICAvLyBJc3N1ZSAjNDAyOiBQYXNzIERJLWluamVjdGVkIERhbmdlclpvbmVFbmZvcmNlciB2aWEgY29udGV4dFxuICAgIC8vIElzc3VlICM0NDc6IEFwcGx5IHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlIGlmIHByb3ZpZGVkXG4gICAgY29uc3QgYXV0b25vbXlDb25maWcgPSBwYXJhbXMubWF4U3RlcHNPdmVycmlkZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgLi4uYWdlbnRNZXRhZGF0YS5hdXRvbm9teSwgbWF4QXV0b25vbW91c1N0ZXBzOiBwYXJhbXMubWF4U3RlcHNPdmVycmlkZSB9XG4gICAgICA6IGFnZW50TWV0YWRhdGEuYXV0b25vbXk7XG5cbiAgICBjb25zdCBhdXRvbm9teURpcmVjdGl2ZSA9IGV2YWx1YXRlQXV0b25vbXkoe1xuICAgICAgYWdlbnROYW1lOiBwYXJhbXMuYWdlbnROYW1lLFxuICAgICAgYXV0b25vbXlDb25maWcsXG4gICAgICBzdGVwQ291bnQsXG4gICAgICBjdXJyZW50U3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uLFxuICAgICAgY3VycmVudFN0ZXBPdXRjb21lOiBwYXJhbXMub3V0Y29tZSxcbiAgICAgIG5leHRBY3Rpb25IaW50OiBwYXJhbXMubmV4dEFjdGlvbkhpbnQsXG4gICAgICByaXNrU2NvcmU6IHBhcmFtcy5yaXNrU2NvcmUsXG4gICAgICBkYW5nZXJab25lRW5mb3JjZXI6IEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcj8uKCksXG4gICAgICB2ZXJpZmljYXRpb25TdG9yZTogQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXI/LigpLFxuICAgICAgZ29hbERlc2NyaXB0aW9uOiBhY3RpdmVHb2FsLmRlc2NyaXB0aW9uLFxuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgIH0pO1xuXG4gICAgLy8gOS4gUmV0dXJuIGRlY2lzaW9uLCBzdGF0ZSBzdW1tYXJ5LCBhbmQgYXV0b25vbXkgZGlyZWN0aXZlXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgU3RlcCByZWNvcmRlZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYCxcbiAgICAgIGRlY2lzaW9uOiB7XG4gICAgICAgIGlkOiBkZWNpc2lvbi5pZCxcbiAgICAgICAgZ29hbElkOiBkZWNpc2lvbi5nb2FsSWQsXG4gICAgICAgIHRpbWVzdGFtcDogZGVjaXNpb24udGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRlY2lzaW9uOiBkZWNpc2lvbi5kZWNpc2lvbixcbiAgICAgICAgcmVhc29uaW5nOiBkZWNpc2lvbi5yZWFzb25pbmcsXG4gICAgICAgIGZyYW1ld29yazogZGVjaXNpb24uZnJhbWV3b3JrLFxuICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlLFxuICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxDb3VudDogdXBkYXRlZFN0YXRlLmdvYWxzLmxlbmd0aCxcbiAgICAgICAgZGVjaXNpb25Db3VudDogdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsXG4gICAgICAgIGxhc3RBY3RpdmU6IHVwZGF0ZWRTdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogdXBkYXRlZFN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgYXV0b25vbXk6IGF1dG9ub215RGlyZWN0aXZlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBhbiBhZ2VudCBnb2FsXG4gICAqIFdyYXBzIEFnZW50LmNvbXBsZXRlR29hbCgpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGNvbXBsZXRlQWdlbnRHb2FsKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVBZ2VudEdvYWxXaXRoU3RhdGVQb2xpY3kocGFyYW1zLCBmYWxzZSk7XG4gIH1cblxuICAvKiogQ29tcGxldGUgYW4gZXhhY3QgZHVyYWJsZSBnb2FsIHdpdGhvdXQgY29uc3VsdGluZyBvcmRpbmFyeSBzdGF0ZSBjYWNoZXMuICovXG4gIGFzeW5jIGNvbXBsZXRlQWdlbnRHb2FsRm9yUmVjb3ZlcnkocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIHN1bW1hcnk6IHN0cmluZztcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlQWdlbnRHb2FsV2l0aFN0YXRlUG9saWN5KHBhcmFtcywgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbXBsZXRlQWdlbnRHb2FsV2l0aFN0YXRlUG9saWN5KHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9LCBzdHJpY3RTdGF0ZUVycm9yczogYm9vbGVhbik6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGdvYWw6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAgICAgY29tcGxldGVkQXQ6IHN0cmluZztcbiAgICAgIGVzdGltYXRlZEVmZm9ydD86IG51bWJlcjtcbiAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IHN0cmljdFN0YXRlRXJyb3JzXG4gICAgICA/IGF3YWl0IHRoaXMucmVhZFdpdGhTdGF0ZVBvbGljeShwYXJhbXMuYWdlbnROYW1lLCB0cnVlKVxuICAgICAgOiBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBGaW5kIGdvYWwgdG8gY29tcGxldGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgbGV0IGdvYWw6IEFnZW50R29hbCB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChwYXJhbXMuZ29hbElkKSB7XG4gICAgICBnb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IHBhcmFtcy5nb2FsSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIG1vc3QgcmVjZW50IGluLXByb2dyZXNzIGdvYWxcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fsc1xuICAgICAgICAuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5nZXRUaW1lKCkgLSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCkpWzBdO1xuICAgIH1cblxuICAgIGlmICghZ29hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBwYXJhbXMuZ29hbElkXG4gICAgICAgICAgPyBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kYFxuICAgICAgICAgIDogYE5vIGluLXByb2dyZXNzIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzdHJpY3RTdGF0ZUVycm9ycyAmJiBnb2FsLnN0YXR1cyAhPT0gJ2luX3Byb2dyZXNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgR29hbCAnJHtnb2FsLmlkfScgY2hhbmdlZCB3aGlsZSBhYm9ydGluZyBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIFJlY29yZCBmaW5hbCBkZWNpc2lvbiB3aXRoIHN1bW1hcnlcbiAgICBhZ2VudC5yZWNvcmREZWNpc2lvbih7XG4gICAgICBnb2FsSWQ6IGdvYWwuaWQsXG4gICAgICBkZWNpc2lvbjogJ2dvYWxfY29tcGxldGUnLFxuICAgICAgcmVhc29uaW5nOiBwYXJhbXMuc3VtbWFyeSxcbiAgICAgIGNvbmZpZGVuY2U6IDEuMCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBDYWxsIEFnZW50LmNvbXBsZXRlR29hbCgpXG4gICAgYWdlbnQuY29tcGxldGVHb2FsKGdvYWwuaWQsIHBhcmFtcy5vdXRjb21lKTtcblxuICAgIC8vIDUuIEdldCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgY29uc3QgbWV0cmljcyA9IGFnZW50LmdldFBlcmZvcm1hbmNlTWV0cmljcygpO1xuXG4gICAgLy8gNi4gU2F2ZSBhZ2VudCBzdGF0ZVxuICAgIGNvbnN0IGNvbXBsZXRlU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBpZiAoc3RyaWN0U3RhdGVFcnJvcnMpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKFxuICAgICAgICBjb21wbGV0ZVNhbml0aXplZE5hbWUsXG4gICAgICAgIGFnZW50LmdldFN0YXRlKCksXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTtcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoY29tcGxldGVTYW5pdGl6ZWROYW1lKSk7XG4gICAgfVxuXG4gICAgLy8gNy4gUmV0dXJuIGdvYWwsIG1ldHJpY3MsIGFuZCBzdGF0ZVxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29tcGxldGVkR29hbCA9IHVwZGF0ZWRTdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbC5pZCkhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgR29hbCBjb21wbGV0ZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9JyB3aXRoIG91dGNvbWU6ICR7cGFyYW1zLm91dGNvbWV9YCxcbiAgICAgIGdvYWw6IHtcbiAgICAgICAgaWQ6IGNvbXBsZXRlZEdvYWwuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjb21wbGV0ZWRHb2FsLmRlc2NyaXB0aW9uLFxuICAgICAgICBzdGF0dXM6IGNvbXBsZXRlZEdvYWwuc3RhdHVzIGFzIFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiLFxuICAgICAgICBjcmVhdGVkQXQ6IGNvbXBsZXRlZEdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNvbXBsZXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNvbXBsZXRlZEF0IS50b0lTT1N0cmluZygpLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICBhY3R1YWxFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuYWN0dWFsRWZmb3J0XG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxDb3VudDogdXBkYXRlZFN0YXRlLmdvYWxzLmxlbmd0aCxcbiAgICAgICAgZGVjaXNpb25Db3VudDogdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsXG4gICAgICAgIGxhc3RBY3RpdmU6IHVwZGF0ZWRTdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogdXBkYXRlZFN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWdlbnQgc3RhdGVcbiAgICogV3JhcHMgQWdlbnQuZ2V0U3RhdGUoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmdldEFnZW50U3RhdGVXaXRoUG9saWN5KHBhcmFtcywgZmFsc2UpO1xuICB9XG5cbiAgLyoqIFN0cmljdCBkdXJhYmxlLXN0YXRlIHZhcmlhbnQgcmVzZXJ2ZWQgZm9yIHN0YWxlLXBvbGljeSByZWNvdmVyeS4gKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZUZvclJlY292ZXJ5KHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmdldEFnZW50U3RhdGVXaXRoUG9saWN5KHBhcmFtcywgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEFnZW50U3RhdGVXaXRoUG9saWN5KHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSwgc3RyaWN0U3RhdGVFcnJvcnM6IGJvb2xlYW4pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgaW1wb3J0YW5jZTogbnVtYmVyO1xuICAgICAgICB1cmdlbmN5OiBudW1iZXI7XG4gICAgICAgIGVpc2VuaG93ZXJRdWFkcmFudD86IHN0cmluZztcbiAgICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZWRBdDogc3RyaW5nO1xuICAgICAgICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG4gICAgICAgIHJpc2tMZXZlbD86IHN0cmluZztcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIG5vdGVzPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBkZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgZnJhbWV3b3JrOiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkV2l0aFN0YXRlUG9saWN5KHBhcmFtcy5hZ2VudE5hbWUsIHN0cmljdFN0YXRlRXJyb3JzKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDMuIEdldCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgY29uc3QgbWV0cmljcyA9IGFnZW50LmdldFBlcmZvcm1hbmNlTWV0cmljcygpO1xuXG4gICAgLy8gNC4gRmlsdGVyIGRlY2lzaW9ucyBiYXNlZCBvbiBpbmNsdWRlRGVjaXNpb25IaXN0b3J5XG4gICAgY29uc3QgZGVjaXNpb25zID0gcGFyYW1zLmluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICAgID8gc3RhdGUuZGVjaXNpb25zXG4gICAgICA6IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtMTApOyAvLyBMYXN0IDEwIGRlY2lzaW9uc1xuXG4gICAgLy8gNS4gQnVpbGQgY29udGV4dCBzdW1tYXJ5XG4gICAgY29uc3QgY29udGV4dEtleXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5jb250ZXh0KTtcbiAgICBjb25zdCBjb250ZXh0U2l6ZSA9IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbnRleHQpLmxlbmd0aDtcblxuICAgIC8vIDYuIFJldHVybiBzdGF0ZSBhbmQgbWV0cmljc1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWdlbnROYW1lOiBwYXJhbXMuYWdlbnROYW1lLFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnID0+ICh7XG4gICAgICAgICAgaWQ6IGcuaWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJpb3JpdHk6IGcucHJpb3JpdHksXG4gICAgICAgICAgc3RhdHVzOiBnLnN0YXR1cyxcbiAgICAgICAgICBpbXBvcnRhbmNlOiBnLmltcG9ydGFuY2UsXG4gICAgICAgICAgdXJnZW5jeTogZy51cmdlbmN5LFxuICAgICAgICAgIGVpc2VuaG93ZXJRdWFkcmFudDogZy5laXNlbmhvd2VyUXVhZHJhbnQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBnLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHVwZGF0ZWRBdDogZy51cGRhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZy5jb21wbGV0ZWRBdD8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBkZXBlbmRlbmNpZXM6IGcuZGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHJpc2tMZXZlbDogZy5yaXNrTGV2ZWwsXG4gICAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnLmVzdGltYXRlZEVmZm9ydCxcbiAgICAgICAgICBhY3R1YWxFZmZvcnQ6IGcuYWN0dWFsRWZmb3J0LFxuICAgICAgICAgIG5vdGVzOiBnLm5vdGVzXG4gICAgICAgIH0pKSxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnMubWFwKGQgPT4gKHtcbiAgICAgICAgICBpZDogZC5pZCxcbiAgICAgICAgICBnb2FsSWQ6IGQuZ29hbElkLFxuICAgICAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBkZWNpc2lvbjogZC5kZWNpc2lvbixcbiAgICAgICAgICByZWFzb25pbmc6IGQucmVhc29uaW5nLFxuICAgICAgICAgIGZyYW1ld29yazogZC5mcmFtZXdvcmssXG4gICAgICAgICAgY29uZmlkZW5jZTogZC5jb25maWRlbmNlLFxuICAgICAgICAgIG91dGNvbWU6IGQub3V0Y29tZVxuICAgICAgICB9KSksXG4gICAgICAgIGNvbnRleHQ6IHBhcmFtcy5pbmNsdWRlQ29udGV4dCA/IHN0YXRlLmNvbnRleHQgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgICAga2V5czogY29udGV4dEtleXMsXG4gICAgICAgICAgc2l6ZTogY29udGV4dFNpemVcbiAgICAgICAgfSxcbiAgICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzZXNzaW9uQ291bnQ6IHN0YXRlLnNlc3Npb25Db3VudCxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgc3VjY2Vzc1JhdGU6IG1ldHJpY3Muc3VjY2Vzc1JhdGUsXG4gICAgICAgIGdvYWxzQ29tcGxldGVkOiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkLFxuICAgICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG1ldHJpY3MuZ29hbHNJblByb2dyZXNzLFxuICAgICAgICBkZWNpc2lvbkFjY3VyYWN5OiBtZXRyaWNzLmRlY2lzaW9uQWNjdXJhY3ksXG4gICAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbWV0cmljcy5hdmVyYWdlQ29tcGxldGlvblRpbWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBnYXRoZXJlZCBkYXRhIGZvciBhIHNwZWNpZmljIGdvYWwgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBBZ2dyZWdhdGVzIGRlY2lzaW9uIGhpc3RvcnksIGdvYWwgc3RhdGUsIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3NcbiAgICogaW50byBhIHN0cnVjdHVyZWQgR2F0aGVyZWREYXRhIG9iamVjdC4gVGhpcyBpcyBhIHJlYWQtc2lkZSB2aWV3XG4gICAqIG92ZXIgZXhpc3RpbmcgYWdlbnQgc3RhdGUgZGF0YS5cbiAgICpcbiAgICogSXNzdWUgIzY4OiBHYXRoZXJlZERhdGFFbnRyeSBmb3Igc3RhdGUgcmVjb3JkaW5nXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgQ29tcGxldGlvbiAoRXBpYyAjMzgwKVxuICAgKi9cbiAgYXN5bmMgZ2V0R2F0aGVyZWREYXRhKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxHYXRoZXJlZERhdGE+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGdhdGhlcmVkID0gZ2V0R2F0aGVyZWREYXRhKHBhcmFtcy5hZ2VudE5hbWUsIHBhcmFtcy5nb2FsSWQsIHN0YXRlKTtcblxuICAgIGlmICghZ2F0aGVyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEdvYWwgJyR7cGFyYW1zLmdvYWxJZH0nIG5vdCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nLiBgICtcbiAgICAgICAgYEF2YWlsYWJsZSBnb2FsczogJHtzdGF0ZS5nb2Fscy5tYXAoZyA9PiBnLmlkKS5qb2luKCcsICcpIHx8ICdub25lJ31gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRoZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250aW51ZSBhZ2VudCBleGVjdXRpb24gZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgKiBDb21iaW5lcyBleGVjdXRlQWdlbnQgd2l0aCBzdGF0ZSBjb250ZXh0XG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGNvbnRpbnVlQWdlbnRFeGVjdXRpb24ocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHByZXZpb3VzU3RlcFJlc3VsdD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8RXhlY3V0ZUFnZW50UmVzdWx0ICYge1xuICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICAgIH0+O1xuICAgICAgcmVjZW50RGVjaXNpb25zOiBBcnJheTx7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIGNvbnRpbnVhdGlvbjoge1xuICAgICAgaXNSZXN1bWluZzogYm9vbGVhbjtcbiAgICAgIHByZXZpb3VzU3RlcFJlc3VsdD86IHN0cmluZztcbiAgICAgIHN1Z2dlc3RlZE5leHRTdGVwcz86IHN0cmluZ1tdO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBjdXJyZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGl2ZUdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGdvYWwgPT4gZ29hbC5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgaWYgKCFhY3RpdmVHb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjb250aW51ZV9leGVjdXRpb24gcmVxdWlyZXMgYW4gaW4tcHJvZ3Jlc3MgZ29hbCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nLiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwuIElmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2dyZXNzIGZvciBgICtcbiAgICAgICAgYHRoZSBjdXJyZW50IGdvYWwsIHVzZSBtY3BfYXFsX2NyZWF0ZSByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVHb2FsRGVjaXNpb25zID0gc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkZWNpc2lvbiA9PiBkZWNpc2lvbi5nb2FsSWQgPT09IGFjdGl2ZUdvYWwuaWQpO1xuICAgIGlmIChhY3RpdmVHb2FsRGVjaXNpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY29udGludWVfZXhlY3V0aW9uIGlzIG9ubHkgZm9yIHJlc3VtaW5nIGEgcGF1c2VkIGV4ZWN1dGlvbiBhZnRlciBhdCBsZWFzdCBgICtcbiAgICAgICAgYG9uZSByZWNvcmRlZCBzdGVwIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIEFmdGVyIGV4ZWN1dGVfYWdlbnQsIHRoZSBgICtcbiAgICAgICAgYG5leHQgbGlmZWN5Y2xlIGNhbGwgaXMgbWNwX2FxbF9jcmVhdGUgcmVjb3JkX2V4ZWN1dGlvbl9zdGVwLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQ2hlY2sgaWYgYWdlbnQgaGFzIGJlZW4gZXhlY3V0ZWQgYmVmb3JlXG4gICAgY29uc3QgaXNSZXN1bWluZyA9IHN0YXRlLnNlc3Npb25Db3VudCA+IDAgfHwgc3RhdGUuZGVjaXNpb25zLmxlbmd0aCA+IDA7XG5cbiAgICAvLyA0LiBFeGVjdXRlIGFnZW50IG5vcm1hbGx5ICh0aGlzIGFjdGl2YXRlcyBlbGVtZW50cyBhbmQgZ2V0cyBjb250ZXh0KVxuICAgIGNvbnN0IGV4ZWN1dGlvblBhcmFtcyA9IHBhcmFtcy5wYXJhbWV0ZXJzIHx8IHt9O1xuXG4gICAgY29uc3QgZXhlY3V0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlQWdlbnQoXG4gICAgICBwYXJhbXMuYWdlbnROYW1lLFxuICAgICAgZXhlY3V0aW9uUGFyYW1zLFxuICAgICAgeyBvcGVyYXRpb25OYW1lOiAnY29udGludWVfZXhlY3V0aW9uJyB9XG4gICAgKTtcblxuICAgIC8vIDUuIEJ1aWxkIHByZXZpb3VzIHN0YXRlIHN1bW1hcnlcbiAgICBjb25zdCByZWNlbnREZWNpc2lvbnMgPSBzdGF0ZS5kZWNpc2lvbnMuc2xpY2UoLTUpLm1hcChkID0+ICh7XG4gICAgICBkZWNpc2lvbjogZC5kZWNpc2lvbixcbiAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICBvdXRjb21lOiBkLm91dGNvbWUsXG4gICAgICB0aW1lc3RhbXA6IGQudGltZXN0YW1wLnRvSVNPU3RyaW5nKClcbiAgICB9KSk7XG5cbiAgICBjb25zdCBnb2FsU3VtbWFyeSA9IHN0YXRlLmdvYWxzLm1hcChnID0+ICh7XG4gICAgICBpZDogZy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnLmRlc2NyaXB0aW9uLFxuICAgICAgc3RhdHVzOiBnLnN0YXR1cyxcbiAgICAgIHByb2dyZXNzOiB1bmRlZmluZWQgLy8gQ291bGQgYWRkIHByb2dyZXNzIHRyYWNraW5nIGluIGZ1dHVyZVxuICAgIH0pKTtcblxuICAgIC8vIDYuIEdlbmVyYXRlIHN1Z2dlc3RlZCBuZXh0IHN0ZXBzIGJhc2VkIG9uIHN0YXRlXG4gICAgY29uc3Qgc3VnZ2VzdGVkTmV4dFN0ZXBzID0gdGhpcy5nZW5lcmF0ZU5leHRTdGVwcyhzdGF0ZSk7XG5cbiAgICAvLyA3LiBNZXJnZSBleGVjdXRpb24gcmVzdWx0IHdpdGggY29udGludWF0aW9uIGNvbnRleHRcbiAgICByZXR1cm4ge1xuICAgICAgLy8gSW5jbHVkZSBhbGwgZmllbGRzIGZyb20gZXhlY3V0ZV9hZ2VudCByZXN1bHRcbiAgICAgIC4uLmV4ZWN1dGlvblJlc3VsdCxcblxuICAgICAgLy8gQWRkIHByZXZpb3VzIHN0YXRlIGluZm9ybWF0aW9uXG4gICAgICBwcmV2aW91c1N0YXRlOiB7XG4gICAgICAgIGdvYWxzOiBnb2FsU3VtbWFyeSxcbiAgICAgICAgcmVjZW50RGVjaXNpb25zLFxuICAgICAgICBzZXNzaW9uQ291bnQ6IHN0YXRlLnNlc3Npb25Db3VudCxcbiAgICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuXG4gICAgICAvLyBBZGQgY29udGludWF0aW9uIGNvbnRleHRcbiAgICAgIGNvbnRpbnVhdGlvbjoge1xuICAgICAgICBpc1Jlc3VtaW5nLFxuICAgICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ6IHBhcmFtcy5wcmV2aW91c1N0ZXBSZXN1bHQsXG4gICAgICAgIHN1Z2dlc3RlZE5leHRTdGVwc1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5leHRTdGVwcyhzdGF0ZTogQWdlbnRTdGF0ZSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIGdvYWxzXG4gICAgY29uc3QgcGVuZGluZ0dvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdwZW5kaW5nJyk7XG4gICAgaWYgKHBlbmRpbmdHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBTdGFydCB3b3JrIG9uICR7cGVuZGluZ0dvYWxzLmxlbmd0aH0gcGVuZGluZyBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGluLXByb2dyZXNzIGdvYWxzXG4gICAgY29uc3QgaW5Qcm9ncmVzc0dvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuICAgIGlmIChpblByb2dyZXNzR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgQ29udGludWUgJHtpblByb2dyZXNzR29hbHMubGVuZ3RofSBpbi1wcm9ncmVzcyBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGJsb2NrZWQgZ29hbHMgKGRlcGVuZGVuY2llcylcbiAgICBjb25zdCBibG9ja2VkR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PlxuICAgICAgZy5kZXBlbmRlbmNpZXMgJiYgZy5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCAmJiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnXG4gICAgKTtcbiAgICBpZiAoYmxvY2tlZEdvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJlc29sdmUgZGVwZW5kZW5jaWVzIGZvciAke2Jsb2NrZWRHb2Fscy5sZW5ndGh9IGJsb2NrZWQgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlY2lzaW9uIGhpc3RvcnkgZm9yIGZhaWx1cmVzXG4gICAgY29uc3QgcmVjZW50RmFpbHVyZXMgPSBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIC5zbGljZSgtMTApXG4gICAgICAuZmlsdGVyKGQgPT4gZC5vdXRjb21lID09PSAnZmFpbHVyZScpO1xuICAgIGlmIChyZWNlbnRGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBSZXZpZXcgYW5kIGFkZHJlc3MgJHtyZWNlbnRGYWlsdXJlcy5sZW5ndGh9IHJlY2VudCBmYWlsdXJlKHMpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25zO1xuICB9XG59XG4iXX0=