@dollhousemcp/mcp-server 2.0.30 → 2.0.32

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 (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/data/ensembles/welcome-to-the-dollhouse.md +94 -0
  3. package/data/personas/dollhouse-expert.md +242 -14
  4. package/data/skills/research-to-elements.md +136 -0
  5. package/dist/elements/agents/AgentManager.d.ts +8 -1
  6. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  7. package/dist/elements/agents/AgentManager.js +49 -9
  8. package/dist/elements/ensembles/EnsembleManager.d.ts +36 -0
  9. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  10. package/dist/elements/ensembles/EnsembleManager.js +94 -5
  11. package/dist/generated/version.d.ts +2 -2
  12. package/dist/generated/version.js +3 -3
  13. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  14. package/dist/handlers/mcp-aql/MCPAQLHandler.js +31 -2
  15. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  16. package/dist/handlers/mcp-aql/OperationSchema.js +8 -7
  17. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/evaluatePermission.js +6 -3
  19. package/dist/server/tools/MCPAQLTools.js +21 -5
  20. package/dist/services/BuildInfoService.d.ts +3 -1
  21. package/dist/services/BuildInfoService.d.ts.map +1 -1
  22. package/dist/services/BuildInfoService.js +27 -5
  23. package/dist/utils/permissionHookShared.d.ts +39 -0
  24. package/dist/utils/permissionHookShared.d.ts.map +1 -1
  25. package/dist/utils/permissionHookShared.js +38 -1
  26. package/dist/utils/permissionHookStatus.d.ts.map +1 -1
  27. package/dist/utils/permissionHookStatus.js +6 -2
  28. package/dist/utils/permissionHooks.d.ts +1 -1
  29. package/dist/utils/permissionHooks.d.ts.map +1 -1
  30. package/dist/utils/permissionHooks.js +2 -2
  31. package/dist/web/public/app.js +213 -12
  32. package/dist/web/public/index.html +16 -7
  33. package/dist/web/public/styles.css +229 -30
  34. package/dist/web/routes/healthRoutes.d.ts.map +1 -1
  35. package/dist/web/routes/healthRoutes.js +3 -1
  36. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  37. package/dist/web/routes/permissionRoutes.js +10 -2
  38. package/package.json +1 -1
  39. package/scripts/pretooluse-dollhouse.sh +157 -39
  40. package/server.json +2 -2
@@ -26,6 +26,7 @@ import { ENSEMBLE_DEFAULTS, ENSEMBLE_LIMITS, ENSEMBLE_SECURITY_EVENTS, ENSEMBLE_
26
26
  import { ElementMessages } from '../../utils/elementMessages.js';
27
27
  import { VALIDATION_PATTERNS, SECURITY_LIMITS } from '../../security/constants.js';
28
28
  import { sanitizeGatekeeperPolicy } from '../../handlers/mcp-aql/policies/ElementPolicies.js';
29
+ import { SecureYamlParser } from '../../security/secureYamlParser.js';
29
30
  // Issue #83: Centralized active element limits (configurable via env vars)
30
31
  import { getActiveElementLimitConfig, getMaxActiveLimit } from '../../config/active-element-limits.js';
31
32
  // Issue #466: Shared element type resolver — re-exported for backward compatibility
@@ -33,6 +34,10 @@ import { resolveElementTypes } from '../../utils/elementTypeResolver.js';
33
34
  export { resolveElementTypes } from '../../utils/elementTypeResolver.js';
34
35
  /** @deprecated Use resolveElementTypes from '../../utils/elementTypeResolver.js' */
35
36
  export const resolveEnsembleElementTypes = resolveElementTypes;
37
+ const LEGACY_ELEMENT_FIELD_REPLACEMENTS = {
38
+ name: 'element_name',
39
+ type: 'element_type',
40
+ };
36
41
  /**
37
42
  * EnsembleManager - Manages ensemble element lifecycle
38
43
  *
@@ -48,6 +53,7 @@ export class EnsembleManager extends BaseElementManager {
48
53
  validationService;
49
54
  serializationService;
50
55
  activeEnsembleNames = new Set();
56
+ legacyElementFieldWarnings = new Set();
51
57
  constructor(portfolioManager, fileLockManager, fileOperationsService, validationRegistry, serializationService, metadataService, fileWatchService, memoryBudget, backupService) {
52
58
  super(ElementType.ENSEMBLE, portfolioManager, fileLockManager, { fileWatchService, memoryBudget, backupService }, fileOperationsService, validationRegistry);
53
59
  this.metadataService = metadataService;
@@ -58,6 +64,88 @@ export class EnsembleManager extends BaseElementManager {
58
64
  getElementLabel() {
59
65
  return 'ensemble';
60
66
  }
67
+ /**
68
+ * Clear in-memory warn-once state for legacy ensemble element fields.
69
+ *
70
+ * Useful for long-lived processes or tests that intentionally want to
71
+ * observe the warning path again after a maintenance boundary.
72
+ */
73
+ clearLegacyElementWarningHistory() {
74
+ this.legacyElementFieldWarnings.clear();
75
+ }
76
+ dispose() {
77
+ super.dispose();
78
+ this.clearLegacyElementWarningHistory();
79
+ }
80
+ /**
81
+ * Warn once per ensemble/index/field combination when a legacy nested field
82
+ * is encountered while loading or parsing an ensemble.
83
+ *
84
+ * Fingerprinting keeps the warning visible for each distinct legacy field
85
+ * without re-emitting the same deprecation notice on every re-parse.
86
+ *
87
+ * @param ensembleName - Name of the ensemble containing the legacy field
88
+ * @param index - Zero-based index of the element within the ensemble
89
+ * @param field - Legacy nested field name that should be migrated
90
+ */
91
+ warnOnceForLegacyElementField(ensembleName, index, field) {
92
+ const replacement = LEGACY_ELEMENT_FIELD_REPLACEMENTS[field];
93
+ const fingerprint = `${ensembleName}:${index}:${field}`;
94
+ if (this.legacyElementFieldWarnings.has(fingerprint)) {
95
+ return;
96
+ }
97
+ this.legacyElementFieldWarnings.add(fingerprint);
98
+ logger.warn(`Ensemble '${ensembleName}' element at index ${index} uses deprecated '${field}' field. Use '${replacement}' instead.`);
99
+ }
100
+ hasLegacyElementFields(elementsRaw) {
101
+ if (!Array.isArray(elementsRaw)) {
102
+ return false;
103
+ }
104
+ return elementsRaw.some((elem) => elem
105
+ && typeof elem === 'object'
106
+ && (('name' in elem && !('element_name' in elem))
107
+ || ('type' in elem && !('element_type' in elem))));
108
+ }
109
+ /**
110
+ * Rewrite legacy ensemble element field names (`name`/`type`) to the
111
+ * canonical `element_name`/`element_type` form by loading and resaving
112
+ * affected ensembles.
113
+ */
114
+ async repairLegacyElementFields() {
115
+ const result = {
116
+ scanned: 0,
117
+ repaired: 0,
118
+ errors: 0,
119
+ repairedEnsembles: [],
120
+ };
121
+ const elementType = this.getElementType();
122
+ const files = await this.portfolioManager.listElements(elementType);
123
+ for (const file of files) {
124
+ result.scanned++;
125
+ try {
126
+ const absolutePath = this.resolveAbsolutePath(file);
127
+ const raw = await this.fileOperations.readElementFile(absolutePath, elementType, {
128
+ source: `${this.constructor.name}.repairLegacyElementFields`,
129
+ });
130
+ const parsed = SecureYamlParser.safeMatter(raw);
131
+ if (!this.hasLegacyElementFields(parsed.data?.elements)) {
132
+ continue;
133
+ }
134
+ const ensemble = await this.load(file);
135
+ await this.save(ensemble, file);
136
+ result.repaired++;
137
+ result.repairedEnsembles.push({
138
+ name: ensemble.metadata.name,
139
+ path: file,
140
+ });
141
+ }
142
+ catch (error) {
143
+ result.errors++;
144
+ logger.error(`[EnsembleManager] Failed to repair legacy element fields in '${file}':`, error);
145
+ }
146
+ }
147
+ return result;
148
+ }
61
149
  /**
62
150
  * Parse metadata from YAML frontmatter
63
151
  *
@@ -169,7 +257,7 @@ export class EnsembleManager extends BaseElementManager {
169
257
  }
170
258
  // Log deprecation warning if using legacy 'name' field
171
259
  if (elem.name && !elem.element_name) {
172
- logger.warn(`Ensemble element at index ${index} uses deprecated 'name' field. Use 'element_name' instead.`);
260
+ this.warnOnceForLegacyElementField(name, index, 'name');
173
261
  }
174
262
  const elementNameResult = this.validationService.validateAndSanitizeInput(String(rawElementName), { maxLength: SECURITY_LIMITS.MAX_NAME_LENGTH, allowSpaces: true });
175
263
  if (!elementNameResult.isValid) {
@@ -181,7 +269,7 @@ export class EnsembleManager extends BaseElementManager {
181
269
  const rawElementType = elem.element_type || elem.type || 'skill';
182
270
  // Log deprecation warning if using legacy 'type' field
183
271
  if (elem.type && !elem.element_type) {
184
- logger.warn(`Ensemble element at index ${index} uses deprecated 'type' field. Use 'element_type' instead.`);
272
+ this.warnOnceForLegacyElementField(name, index, 'type');
185
273
  }
186
274
  const elementTypeResult = this.validationService.validateAndSanitizeInput(String(rawElementType), { maxLength: SECURITY_LIMITS.MAX_TAG_LENGTH, allowSpaces: false });
187
275
  if (!elementTypeResult.isValid) {
@@ -518,6 +606,7 @@ export class EnsembleManager extends BaseElementManager {
518
606
  if (!metadata.name) {
519
607
  throw new Error('Ensemble must have a name');
520
608
  }
609
+ const ensembleName = metadata.name;
521
610
  let rawElements = metadata.elements || [];
522
611
  // Migrate legacy element fields (name -> element_name, type -> element_type)
523
612
  // This ensures backwards compatibility with API calls using old field names
@@ -529,7 +618,7 @@ export class EnsembleManager extends BaseElementManager {
529
618
  }
530
619
  // Log deprecation warning if using legacy 'name' field
531
620
  if (elem.name && !elem.element_name) {
532
- logger.warn(`Ensemble element at index ${index} uses deprecated 'name' field. Use 'element_name' instead.`);
621
+ this.warnOnceForLegacyElementField(ensembleName, index, 'name');
533
622
  }
534
623
  // Support both element_type (new standard) and type (legacy)
535
624
  // Issue #466: No longer defaults to 'skill' — callers must provide type
@@ -541,7 +630,7 @@ export class EnsembleManager extends BaseElementManager {
541
630
  }
542
631
  // Log deprecation warning if using legacy 'type' field
543
632
  if (elem.type && !elem.element_type) {
544
- logger.warn(`Ensemble element at index ${index} uses deprecated 'type' field. Use 'element_type' instead.`);
633
+ this.warnOnceForLegacyElementField(ensembleName, index, 'type');
545
634
  }
546
635
  return {
547
636
  element_name: elementName,
@@ -826,4 +915,4 @@ export class EnsembleManager extends BaseElementManager {
826
915
  }
827
916
  }
828
917
  }
829
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxD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LENBQUMsSUFBSSxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFFcEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsY0FBYyxPQUFPLHVDQUF1QztvQkFDNUQscUJBQXFCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUNqRSxDQUFDO2dCQUVGLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLDZDQUE2QztvQkFDckQsT0FBTyxFQUFFLFdBQVcsT0FBTyxtQ0FBbUM7b0JBQzlELGNBQWMsRUFBRTt3QkFDZCxZQUFZLEVBQUUsT0FBTzt3QkFDckIsV0FBVyxFQUFFLE9BQU87d0JBQ3BCLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDbEM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVqRSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSw2Q0FBNkM7Z0JBQ3JELE9BQU8sRUFBRSxtQkFBbUIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ3JGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgRW5zZW1ibGUgZWxlbWVudHNcbiAqXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIGVuc2VtYmxlcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIEV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciB1bmlmaWVkIGVsZW1lbnQgbWFuYWdlbWVudFxuICogLSBGb2xsb3dzIHRlbXBsYXRlIG1ldGhvZCBwYXR0ZXJuIChwYXJzZU1ldGFkYXRhLCBjcmVhdGVFbGVtZW50IGhvb2tzKVxuICogLSBQdXJlIG1hbmFnZXIgbGF5ZXIgLSBkZWxlZ2F0ZXMgYnVzaW5lc3MgbG9naWMgdG8gRW5zZW1ibGUgY2xhc3NcbiAqIC0gVXNlcyBESSBmb3IgZGVwZW5kZW5jaWVzIChQb3J0Zm9saW9NYW5hZ2VyLCBGaWxlTG9ja01hbmFnZXIpXG4gKlxuICogU0VDVVJJVFk6XG4gKiAtIFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqIC0gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgdXNlciBkYXRhXG4gKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsc1xuICogLSBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICovXG5cbmltcG9ydCB7IEVuc2VtYmxlLCBFbnNlbWJsZU1ldGFkYXRhLCBFbnNlbWJsZUVsZW1lbnQgfSBmcm9tICcuL0Vuc2VtYmxlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIEVOU0VNQkxFX0RFRkFVTFRTLFxuICBFTlNFTUJMRV9MSU1JVFMsXG4gIEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUyxcbiAgRU5TRU1CTEVfRVJST1JTLFxuICBBQ1RJVkFUSU9OX1NUUkFURUdJRVMsXG4gIENPTkZMSUNUX1NUUkFURUdJRVMsXG4gIEVMRU1FTlRfUk9MRVMsXG4gIEFDVElWQVRJT05fTU9ERVNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0aW9uU3RyYXRlZ3ksIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LCBFbGVtZW50Um9sZSwgQWN0aXZhdGlvbk1vZGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBWQUxJREFUSU9OX1BBVFRFUk5TLCBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLy8gSXNzdWUgIzQ2NjogU2hhcmVkIGVsZW1lbnQgdHlwZSByZXNvbHZlciDigJQgcmUtZXhwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmV4cG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMsIHR5cGUgRWxlbWVudE1hbmFnZXJzRm9yUmVzb2x1dGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIHJlc29sdmVFbGVtZW50VHlwZXMgZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcycgKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlRW5zZW1ibGVFbGVtZW50VHlwZXMgPSByZXNvbHZlRWxlbWVudFR5cGVzO1xuXG4vKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIE1hbmFnZXMgZW5zZW1ibGUgZWxlbWVudCBsaWZlY3ljbGVcbiAqXG4gKiBFeHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlciB0byBwcm92aWRlIGVuc2VtYmxlLXNwZWNpZmljIG9wZXJhdGlvbnM6XG4gKiAtIFlBTUwgcGFyc2luZyB3aXRoIGJvdGggc25ha2VfY2FzZSBhbmQgY2FtZWxDYXNlIHN1cHBvcnRcbiAqIC0gRW5zZW1ibGUgY3JlYXRpb24gYW5kIHZhbGlkYXRpb25cbiAqIC0gRWxlbWVudCByZWZlcmVuY2UgbWFuYWdlbWVudFxuICogLSBJbXBvcnQvZXhwb3J0IGluIG11bHRpcGxlIGZvcm1hdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVuc2VtYmxlTWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxFbnNlbWJsZT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGVuc2VtYmxlc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgYWN0aXZlRW5zZW1ibGVOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuRU5TRU1CTEUsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMuZW5zZW1ibGVzRGlyID0gdGhpcy5lbGVtZW50RGlyO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdlbnNlbWJsZSc7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqXG4gICAqIE5BTUlORyBDT05WRU5USU9OIFNVUFBPUlQ6XG4gICAqIC0gVHlwZVNjcmlwdCBpbnRlcmZhY2VzIHVzZSBjYW1lbENhc2UgKGFjdGl2YXRpb25TdHJhdGVneSwgY29uZmxpY3RSZXNvbHV0aW9uKVxuICAgKiAtIFlBTUwgZmlsZXMgY2FuIHVzZSBzbmFrZV9jYXNlIChhY3RpdmF0aW9uX3N0cmF0ZWd5LCBjb25mbGljdF9yZXNvbHV0aW9uKVxuICAgKiAtIFRoaXMgbWV0aG9kIG1hcHMgc25ha2VfY2FzZSDihpIgY2FtZWxDYXNlIGZvciB1c2VyIGNvbnZlbmllbmNlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gUmF3IFlBTUwgZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBFbnNlbWJsZU1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPEVuc2VtYmxlTWV0YWRhdGE+IHtcbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgdmFsaWRhdGVNZXRhZGF0YUZpZWxkIGZvciBmaWVsZC1hd2FyZSBlcnJvciBtZXNzYWdlcyAoIzM2NSlcbiAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZU1ldGFkYXRhRmllbGQoJ25hbWUnLCBkYXRhLm5hbWUsIHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIXG4gICAgfSk7XG4gICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBuYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIG1ldGFkYXRhIG11c3QgaW5jbHVkZSBhIG5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgdmFsaWRhdGVNZXRhZGF0YUZpZWxkIGZvciBmaWVsZC1hd2FyZSBlcnJvciBtZXNzYWdlcyAoIzM2NSlcbiAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCdkZXNjcmlwdGlvbicsIGRhdGEuZGVzY3JpcHRpb24sIHtcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBwYXR0ZXJuOiBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfREVTQ1JJUFRJT05cbiAgICAgIH0pO1xuICAgICAgaWYgKCFkZXNjUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGFjdGl2YXRpb24gc3RyYXRlZ3kgKHN1cHBvcnQgYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2UpXG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5UmF3ID0gZGF0YS5hY3RpdmF0aW9uX3N0cmF0ZWd5IHx8IGRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1k7XG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGFjdGl2YXRpb25TdHJhdGVneVJhdyksIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY3RpdmF0aW9uIHN0cmF0ZWd5OiAke2FjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneSA9IGFjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFBQ1RJVkFUSU9OX1NUUkFURUdJRVMuaW5jbHVkZXMoYWN0aXZhdGlvblN0cmF0ZWd5IGFzIGFueSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9TVFJBVEVHWX06ICR7YWN0aXZhdGlvblN0cmF0ZWd5fWApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvblJhdyA9IGRhdGEuY29uZmxpY3RfcmVzb2x1dGlvbiB8fCBkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbiB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05GTElDVF9SRVNPTFVUSU9OO1xuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhjb25mbGljdFJlc29sdXRpb25SYXcpLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneTogJHtjb25mbGljdFJlc29sdXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb24gPSBjb25mbGljdFJlc29sdXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghQ09ORkxJQ1RfU1RSQVRFR0lFUy5pbmNsdWRlcyhjb25mbGljdFJlc29sdXRpb24gYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0NPTkZMSUNUX1JFU09MVVRJT059OiAke2NvbmZsaWN0UmVzb2x1dGlvbn1gKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbnRleHQgc2hhcmluZyBtb2RlXG4gICAgY29uc3QgY29udGV4dFNoYXJpbmdSYXcgPSBkYXRhLmNvbnRleHRfc2hhcmluZyB8fCBkYXRhLmNvbnRleHRTaGFyaW5nIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTlRFWFRfU0hBUklORztcblxuICAgIC8vIEZJWDogSGFuZGxlIGJvb2xlYW4gdmFsdWVzICh0cnVlIC0+ICdmdWxsJywgZmFsc2UgLT4gJ25vbmUnKVxuICAgIGxldCBjb250ZXh0U2hhcmluZ1ZhbHVlOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0U2hhcmluZ1JhdyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBjb250ZXh0U2hhcmluZ1ZhbHVlID0gY29udGV4dFNoYXJpbmdSYXcgPyAnZnVsbCcgOiAnbm9uZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHRTaGFyaW5nVmFsdWUgPSBTdHJpbmcoY29udGV4dFNoYXJpbmdSYXcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoY29udGV4dFNoYXJpbmdWYWx1ZSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFjb250ZXh0U2hhcmluZ1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udGV4dCBzaGFyaW5nIG1vZGU6ICR7Y29udGV4dFNoYXJpbmdSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0U2hhcmluZyA9IGNvbnRleHRTaGFyaW5nUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIVsnbm9uZScsICdzZWxlY3RpdmUnLCAnZnVsbCddLmluY2x1ZGVzKGNvbnRleHRTaGFyaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRleHQgc2hhcmluZyBtb2RlOiAke2NvbnRleHRTaGFyaW5nfWApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHJlc291cmNlIGxpbWl0cyAoc3VwcG9ydCBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IHJlc291cmNlTGltaXRzUmF3ID0gZGF0YS5yZXNvdXJjZV9saW1pdHMgfHwgZGF0YS5yZXNvdXJjZUxpbWl0cztcbiAgICBsZXQgcmVzb3VyY2VMaW1pdHM7XG5cbiAgICBpZiAocmVzb3VyY2VMaW1pdHNSYXcpIHtcbiAgICAgIHJlc291cmNlTGltaXRzID0ge1xuICAgICAgICBtYXhBY3RpdmVFbGVtZW50czogcmVzb3VyY2VMaW1pdHNSYXcubWF4X2FjdGl2ZV9lbGVtZW50cyB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhBY3RpdmVFbGVtZW50cyB8fCBFTlNFTUJMRV9MSU1JVFMuTUFYX0VMRU1FTlRTLFxuICAgICAgICBtYXhNZW1vcnlNYjogcmVzb3VyY2VMaW1pdHNSYXcubWF4X21lbW9yeV9tYiB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhNZW1vcnlNYixcbiAgICAgICAgbWF4RXhlY3V0aW9uVGltZU1zOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfZXhlY3V0aW9uX3RpbWVfbXMgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4RXhlY3V0aW9uVGltZU1zIHx8IEVOU0VNQkxFX0xJTUlUUy5NQVhfQUNUSVZBVElPTl9USU1FXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGVsZW1lbnRzIGFycmF5XG4gICAgY29uc3QgZWxlbWVudHNSYXcgPSBkYXRhLmVsZW1lbnRzIHx8IFtdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50c1JhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgZWxlbWVudHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IGVsZW1lbnRzUmF3Lm1hcCgoZWxlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgbmFtZVxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnROYW1lID0gZWxlbS5lbGVtZW50X25hbWUgfHwgZWxlbS5uYW1lO1xuICAgICAgaWYgKCFyYXdFbGVtZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gbXVzdCBoYXZlIGVsZW1lbnRfbmFtZSAob3IgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpYCk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ25hbWUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS5uYW1lICYmICFlbGVtLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ25hbWUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfbmFtZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhyYXdFbGVtZW50TmFtZSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILCBhbGxvd1NwYWNlczogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50TmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IG5hbWUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudE5hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCB0eXBlXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgcmF3RWxlbWVudFR5cGUgPSBlbGVtLmVsZW1lbnRfdHlwZSB8fCBlbGVtLnR5cGUgfHwgJ3NraWxsJztcbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAndHlwZScgZmllbGRcbiAgICAgIGlmIChlbGVtLnR5cGUgJiYgIWVsZW0uZWxlbWVudF90eXBlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAndHlwZScgZmllbGQuIFVzZSAnZWxlbWVudF90eXBlJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKHJhd0VsZW1lbnRUeXBlKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50VHlwZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IHJvbGVcbiAgICAgIGNvbnN0IGVsZW1lbnRSb2xlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50Um9sZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHJvbGUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudFJvbGVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFJvbGUgPSBlbGVtZW50Um9sZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyhlbGVtZW50Um9sZSBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9FTEVNRU5UX1JPTEV9OiAke2VsZW1lbnRSb2xlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgY29uc3QgZWxlbWVudEFjdGl2YXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKGVsZW0uYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhY3RpdmF0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRBY3RpdmF0aW9uID0gZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgICBpZiAoIUFDVElWQVRJT05fTU9ERVMuaW5jbHVkZXMoZWxlbWVudEFjdGl2YXRpb24gYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQUNUSVZBVElPTl9NT0RFfTogJHtlbGVtZW50QWN0aXZhdGlvbn1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgcHJpb3JpdHkgKDAtMTAwLCBkZWZhdWx0IDUwKVxuICAgICAgbGV0IHByaW9yaXR5ID0gZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWTtcbiAgICAgIGlmICh0eXBlb2YgcHJpb3JpdHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHByaW9yaXR5ID0gcGFyc2VJbnQocHJpb3JpdHksIDEwKTtcbiAgICAgIH1cbiAgICAgIHByaW9yaXR5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBwcmlvcml0eSkpO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbmRpdGlvbiAoaWYgY29uZGl0aW9uYWwgYWN0aXZhdGlvbilcbiAgICAgIC8vIENvbmRpdGlvbnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIC0gdGhleSBjYW4gY29udGFpbiBvcGVyYXRvcnMgbGlrZSA9PSwgIT0sICYmLCB8fFxuICAgICAgLy8gU28gd2UgdXNlIGEgY3VzdG9tIHBhdHRlcm4gdGhhdCBhbGxvd3MgdGhlc2UgY2hhcmFjdGVyc1xuICAgICAgbGV0IGNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW1lbnRBY3RpdmF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmIGVsZW0uY29uZGl0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICAgIFN0cmluZyhlbGVtLmNvbmRpdGlvbiksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4TGVuZ3RoOiBFTlNFTUJMRV9MSU1JVFMuTUFYX0NPTkRJVElPTl9MRU5HVEgsXG4gICAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICAgIGN1c3RvbVBhdHRlcm46IC9eW2EtekEtWjAtOVxcc1xcLV8uPSEmfDw+KCldKyQvICAvLyBBbGxvdyBjb21wYXJpc29uL2xvZ2ljYWwgb3BlcmF0b3JzXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmRpdGlvbiBhdCBpbmRleCAke2luZGV4fTogJHtjb25kaXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBkZXBlbmRlbmNpZXNcbiAgICAgIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW0uZGVwZW5kZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoZWxlbS5kZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZERlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbS5kZXBlbmRlbmNpZXMuc2xpY2UoMCwgRU5TRU1CTEVfTElNSVRTLk1BWF9ERVBFTkRFTkNJRVMpKSB7XG4gICAgICAgICAgY29uc3QgZGVwUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGRlcCksIHtcbiAgICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFkZXBSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcGVuZGVuY3kgXCIke2RlcH1cIiBhdCBpbmRleCAke2luZGV4fTogJHtkZXBSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0ZWREZXBlbmRlbmNpZXMucHVzaChkZXBSZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmNpZXMgPSB2YWxpZGF0ZWREZXBlbmRlbmNpZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgcHVycG9zZVxuICAgICAgbGV0IHB1cnBvc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtLnB1cnBvc2UpIHtcbiAgICAgICAgY29uc3QgcHVycG9zZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhlbGVtLnB1cnBvc2UpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgIC8vIEFsbG93IGZ1bGwgZGVzY3JpcHRpb24gcHVuY3R1YXRpb24gKGNvbW1hcywgZW0tZGFzaGVzLCBldGMuKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwdXJwb3NlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHVycG9zZSBhdCBpbmRleCAke2luZGV4fTogJHtwdXJwb3NlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBwdXJwb3NlID0gcHVycG9zZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcm9sZTogZWxlbWVudFJvbGUgYXMgRWxlbWVudFJvbGUsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtZW50QWN0aXZhdGlvbiBhcyBBY3RpdmF0aW9uTW9kZSxcbiAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2VcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IGNvdW50XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihFTlNFTUJMRV9FUlJPUlMuVE9PX01BTllfRUxFTUVOVFMpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIG5lc3RpbmcgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFsbG93TmVzdGVkID0gZGF0YS5hbGxvd19uZXN0ZWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICBCb29sZWFuKGRhdGEuYWxsb3dfbmVzdGVkKSA6XG4gICAgICAoZGF0YS5hbGxvd05lc3RlZCAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbihkYXRhLmFsbG93TmVzdGVkKSA6IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCk7XG5cbiAgICBjb25zdCBtYXhOZXN0aW5nRGVwdGggPSBkYXRhLm1heF9uZXN0aW5nX2RlcHRoIHx8IGRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRIO1xuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciB0YWdzIGFycmF5XG4gICAgbGV0IHRhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50YWdzKSkge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgZGF0YS50YWdzKSB7XG4gICAgICAgIGNvbnN0IHRhZ1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh0YWcpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGFnUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFnIFwiJHt0YWd9XCI6ICR7dGFnUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0YWdzLnB1c2godGFnUmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgb2JqZWN0IChjYW1lbENhc2UpXG4gICAgY29uc3QgbWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IGRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogZGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IGRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFncyxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogYWN0aXZhdGlvblN0cmF0ZWd5IGFzIEFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogY29uZmxpY3RSZXNvbHV0aW9uIGFzIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgICAgY29udGV4dFNoYXJpbmc6IGNvbnRleHRTaGFyaW5nIGFzICdub25lJyB8ICdzZWxlY3RpdmUnIHwgJ2Z1bGwnLFxuICAgICAgcmVzb3VyY2VMaW1pdHMsXG4gICAgICBhbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aCxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KGRhdGEuZ2F0ZWtlZXBlciwgbmFtZSwgJ2Vuc2VtYmxlJywgZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksICAvLyBJc3N1ZSAjNTI0XG4gICAgfTtcblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW5zZW1ibGUgaW5zdGFuY2UgZnJvbSBwYXJzZWQgbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gVmFsaWRhdGVkIGVuc2VtYmxlIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWFya2Rvd24gY29udGVudCAoZW5zZW1ibGUgaW5zdHJ1Y3Rpb25zL2RvY3VtZW50YXRpb24pXG4gICAqIEByZXR1cm5zIE5ldyBFbnNlbWJsZSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEsIF9jb250ZW50OiBzdHJpbmcpOiBFbnNlbWJsZSB7XG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gRml4ICM5MTI6IFN0cmlwIG1hcmtlciBmcm9tIHJ1bnRpbWUgbWV0YWRhdGFcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShtZXRhZGF0YSwgbWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAvLyBFeHRyYWN0IGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGlmIHByZXNlbnQgKHYyIGR1YWwtZmllbGQpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgZW5zZW1ibGUuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhbiBlbnNlbWJsZSB0byBmaWxlIGNvbnRlbnRcbiAgICpcbiAgICogRm9ybWF0OiBNYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogLSBGcm9udG1hdHRlcjogRW5zZW1ibGUgbWV0YWRhdGEgKyBlbGVtZW50IHJlZmVyZW5jZXNcbiAgICogLSBDb250ZW50OiBJbnN0cnVjdGlvbnMvZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGVuc2VtYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAobWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IEVuc2VtYmxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnQubWV0YWRhdGE7XG5cbiAgICAvLyBCdWlsZCBmcm9udG1hdHRlciBkYXRhICh1c2luZyBjYW1lbENhc2UpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXI6IGFueSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuRU5TRU1CTEUpLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgICAgdW5pcXVlX2lkOiBlbGVtZW50LmlkLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGEuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbixcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoXG4gICAgfTtcblxuICAgIC8vIHYyLjAgZHVhbC1maWVsZDogd3JpdGUgaW5zdHJ1Y3Rpb25zIHRvIFlBTUwgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudFxuICAgIGlmIChlbGVtZW50Lmluc3RydWN0aW9ucykge1xuICAgICAgZnJvbnRtYXR0ZXIuaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5pbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSByZXNvdXJjZSBsaW1pdHMgaWYgc3BlY2lmaWVkXG4gICAgaWYgKG1ldGFkYXRhLnJlc291cmNlTGltaXRzKSB7XG4gICAgICBmcm9udG1hdHRlci5yZXNvdXJjZUxpbWl0cyA9IG1ldGFkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEuZ2F0ZWtlZXBlcikge1xuICAgICAgZnJvbnRtYXR0ZXIuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSBlbGVtZW50cyBhcnJheSAodXNpbmcgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBmb3IgQVBJIGNvbnNpc3RlbmN5KVxuICAgIGZyb250bWF0dGVyLmVsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMubWFwKGVsZW0gPT4ge1xuICAgICAgY29uc3QgZWxlbURhdGE6IGFueSA9IHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtLmVsZW1lbnRfbmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgcm9sZTogZWxlbS5yb2xlLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uXG4gICAgICB9O1xuXG4gICAgICBpZiAoZWxlbS5jb25kaXRpb24pIHtcbiAgICAgICAgZWxlbURhdGEuY29uZGl0aW9uID0gZWxlbS5jb25kaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtLmRlcGVuZGVuY2llcyAmJiBlbGVtLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1EYXRhLmRlcGVuZGVuY2llcyA9IGVsZW0uZGVwZW5kZW5jaWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbS5wdXJwb3NlKSB7XG4gICAgICAgIGVsZW1EYXRhLnB1cnBvc2UgPSBlbGVtLnB1cnBvc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGVtRGF0YTtcbiAgICB9KTtcblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgY3JlYXRpb25cbiAgICAvLyBVc2UgQ09SRV9TQ0hFTUEgdG8gc3VwcG9ydCBudW1iZXJzIChwcmlvcml0eSkgYW5kIGJvb2xlYW5zIChhbGxvd05lc3RlZClcbiAgICBjb25zdCBib2R5ID0gZWxlbWVudC5jb250ZW50IHx8IHRoaXMuYnVpbGREZWZhdWx0Qm9keShlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5jcmVhdGVGcm9udG1hdHRlcihmcm9udG1hdHRlciwgYm9keSwge1xuICAgICAgbWV0aG9kOiAnbWFudWFsJyxcbiAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IHN0YW5kYXJkaXplIG9uIEpTT04gc2NoZW1hIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICAgIGNsZWFuTWV0YWRhdGE6IHRydWUsICAvLyBGaXggIzkxMzogc3RhbmRhcmRpemUgYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJyxcbiAgICAgIHNvcnRLZXlzOiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiAxMDAsXG4gICAgICBza2lwSW52YWxpZDogZmFsc2UgIC8vIERvbid0IHNraXAgaW52YWxpZCAtIHdlIHdhbnQgdG8gY2F0Y2ggZXJyb3JzXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoZWxlbWVudDogRW5zZW1ibGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoZWxlbWVudC5tZXRhZGF0YS5uYW1lID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZvciBlbnNlbWJsZSBmaWxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZW5zZW1ibGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICpcbiAgICogU3VwcG9ydHM6XG4gICAqIC0gWUFNTDogRnJvbnRtYXR0ZXItc3R5bGUgbWV0YWRhdGEgd2l0aCBvcHRpb25hbCBtYXJrZG93biBjb250ZW50XG4gICAqIC0gSlNPTjogRGlyZWN0IGVuc2VtYmxlIHN0cnVjdHVyZVxuICAgKiAtIE1hcmtkb3duOiBZQU1MIGZyb250bWF0dGVyICsgbWFya2Rvd24gY29udGVudFxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFN0cmluZyBjb250YWluaW5nIGVuc2VtYmxlIGRhdGFcbiAgICogQHBhcmFtIGZvcm1hdCAtIEZvcm1hdCBvZiB0aGUgZGF0YSAoanNvbiwgeWFtbCwgbWFya2Rvd24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGltcG9ydGVkIEVuc2VtYmxlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbXBvcnRFbGVtZW50KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nXG4gICk6IFByb21pc2U8RW5zZW1ibGU+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZDogYW55O1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBhcnNlIFlBTUwvTWFya2Rvd24gdXNpbmcgU2VyaWFsaXphdGlvblNlcnZpY2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogNTAwMDAsIC8vIDUwS0IgbGltaXQgZm9yIGVuc2VtYmxlIGZpbGVzXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgLy8gQ29udGVudCBpcyBwYXJzZWQgYnV0IG5vdCB1c2VkIGluIGVuc2VtYmxlIGNyZWF0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQpO1xuXG4gICAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKG1ldGFkYXRhLCBtZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBpbXBvcnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLklNUE9SVEVELFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEltcG9ydGVkIGVuc2VtYmxlOiAke21ldGFkYXRhLm5hbWV9IHdpdGggJHttZXRhZGF0YS5lbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzYFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbnNlbWJsZTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5JTVBPUlRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZW5zZW1ibGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0IChqc29uLCB5YW1sLCBtYXJrZG93bilcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gc2VyaWFsaXplZCBzdHJpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4cG9ydEVsZW1lbnQoXG4gICAgZWxlbWVudDogRW5zZW1ibGUsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIFlBTUwgYW5kIE1hcmtkb3duLCB1c2UgdGhlIHNhbWUgZm9ybWF0IChmcm9udG1hdHRlciArIGNvbnRlbnQpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW5zZW1ibGUgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBQYXJ0aWFsIG1ldGFkYXRhIGZvciB0aGUgZW5zZW1ibGVcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gbmV3IEVuc2VtYmxlIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBjcmVhdGUobWV0YWRhdGE6IFBhcnRpYWw8RW5zZW1ibGVNZXRhZGF0YT4gJiB7IGluc3RydWN0aW9ucz86IHN0cmluZzsgY29udGVudD86IHN0cmluZyB9KTogUHJvbWlzZTxFbnNlbWJsZT4ge1xuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb25cbiAgICAvLyBOb3RlOiBlbGVtZW50X3R5cGUgcmVzb2x1dGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBoYW5kbGVyIGxheWVyIGJlZm9yZSBjYWxsaW5nIGNyZWF0ZSgpLlxuICAgIC8vIEVsZW1lbnRzIHNob3VsZCBhbHJlYWR5IGhhdmUgZWxlbWVudF90eXBlIHNldCB3aGVuIHRoZXkgYXJyaXZlIGhlcmUuXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBlbGVtZW50czogbWV0YWRhdGEuZWxlbWVudHMgfHwgW10sXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIGxldCByYXdFbGVtZW50cyA9IG1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdO1xuXG4gICAgLy8gTWlncmF0ZSBsZWdhY3kgZWxlbWVudCBmaWVsZHMgKG5hbWUgLT4gZWxlbWVudF9uYW1lLCB0eXBlIC0+IGVsZW1lbnRfdHlwZSlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBBUEkgY2FsbHMgdXNpbmcgb2xkIGZpZWxkIG5hbWVzXG4gICAgY29uc3QgbWlncmF0ZWRFbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10gPSByYXdFbGVtZW50cy5tYXAoKGVsZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIWVsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAnbmFtZScgZmllbGQuIFVzZSAnZWxlbWVudF9uYW1lJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpXG4gICAgICAvLyBJc3N1ZSAjNDY2OiBObyBsb25nZXIgZGVmYXVsdHMgdG8gJ3NraWxsJyDigJQgY2FsbGVycyBtdXN0IHByb3ZpZGUgdHlwZVxuICAgICAgLy8gb3IgcGFzcyBtYW5hZ2VycyBmb3IgcG9ydGZvbGlvIHJlc29sdXRpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlO1xuICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBhdCBpbmRleCAke2luZGV4fSBoYXMgbm8gZWxlbWVudF90eXBlLiBgICtcbiAgICAgICAgICBgUHJvdmlkZSBlbGVtZW50X3R5cGUgZXhwbGljaXRseSBvciBlbnN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBwb3J0Zm9saW8uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICd0eXBlJyBmaWVsZFxuICAgICAgaWYgKGVsZW0udHlwZSAmJiAhZWxlbS5lbGVtZW50X3R5cGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICd0eXBlJyBmaWVsZC4gVXNlICdlbGVtZW50X3R5cGUnIGluc3RlYWQuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHJvbGU6IGVsZW0ucm9sZSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5FTEVNRU5UX1JPTEUsXG4gICAgICAgIHByaW9yaXR5OiBlbGVtLnByaW9yaXR5ID8/IEVOU0VNQkxFX0RFRkFVTFRTLlBSSU9SSVRZLFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtLmFjdGl2YXRpb24gfHwgJ2Fsd2F5cycsXG4gICAgICAgIGNvbmRpdGlvbjogZWxlbS5jb25kaXRpb24sXG4gICAgICAgIGRlcGVuZGVuY2llczogZWxlbS5kZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2U6IGVsZW0ucHVycG9zZVxuICAgICAgfSBhcyBFbnNlbWJsZUVsZW1lbnQ7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIGZpZWxkc1xuICAgIGNvbnN0IGZ1bGxNZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IG1ldGFkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MgfHwgW10sXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IG1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSB8fCAobWV0YWRhdGEgYXMgYW55KS5hY3RpdmF0aW9uX3N0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbiB8fCAobWV0YWRhdGEgYXMgYW55KS5jb25mbGljdF9yZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT04sXG4gICAgICBjb250ZXh0U2hhcmluZzogbWV0YWRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HLFxuICAgICAgcmVzb3VyY2VMaW1pdHM6IG1ldGFkYXRhLnJlc291cmNlTGltaXRzLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkID8/IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRILFxuICAgICAgZWxlbWVudHM6IG1pZ3JhdGVkRWxlbWVudHMsXG4gICAgICAvLyBJc3N1ZSAjNTI0IOKAlCBHYXRla2VlcGVyIHBvbGljeSAoc3ltbWV0cmljIHdpdGggYnVpbGRNZXRhZGF0YSBkZXNlcmlhbGl6YXRpb24pXG4gICAgICBnYXRla2VlcGVyOiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koKG1ldGFkYXRhIGFzIGFueSkuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSEsICdlbnNlbWJsZScsIG1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH07XG5cbiAgICAvLyBVc2UgaW5oZXJpdGVkIGdldEVsZW1lbnRGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIG5vcm1hbGl6YXRpb25cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGZ1bGxNZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgY29uc3QgZXhpc3RpbmdFbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ0Vuc2VtYmxlcy5maW5kKGUgPT5cbiAgICAgIGUubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBmdWxsTWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIGVuc2VtYmxlIG5hbWVkIFwiJHtmdWxsTWV0YWRhdGEubmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbnNlbWJsZVxuICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKGZ1bGxNZXRhZGF0YSwgZnVsbE1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBTZXQgaW5zdHJ1Y3Rpb25zIGFuZCBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGVuc2VtYmxlLmluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhLmNvbnRlbnQpIHtcbiAgICAgIGVuc2VtYmxlLmNvbnRlbnQgPSBtZXRhZGF0YS5jb250ZW50O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gZGlza1xuICAgIGF3YWl0IHRoaXMuc2F2ZShlbnNlbWJsZSwgZmlsZW5hbWUpO1xuICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIHNhdmUoKSBjYWNoZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgLy8gTG9nIGNyZWF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLlNBVkVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICBkZXRhaWxzOiBgQ3JlYXRlZCBlbnNlbWJsZTogJHtmdWxsTWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5zZW1ibGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZW5zZW1ibGVcbiAgICogRGVsZWdhdGVzIHRvIGVuc2VtYmxlJ3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSB2YWxpZGF0ZShlbGVtZW50OiBFbnNlbWJsZSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHNhdmUgdG8gdmFsaWRhdGUgYmVmb3JlIHBlcnNpc3RpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoZWxlbWVudDogRW5zZW1ibGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBWYWxpZGF0ZSBlbnNlbWJsZSBiZWZvcmUgc2F2aW5nXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGUoZWxlbWVudCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpIHx8ICdVbmtub3duIHZhbGlkYXRpb24gZXJyb3InO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2F2ZSBpbnZhbGlkIGVuc2VtYmxlOiAke2Vycm9yc31gKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJhc2UgaW1wbGVtZW50YXRpb25cbiAgICBhd2FpdCBzdXBlci5zYXZlKGVsZW1lbnQsIGZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkZWxldGUgdG8gYWRkIGVuc2VtYmxlLXNwZWNpZmljIGxvZ2dpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkRFTEVURUQsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgIGRldGFpbHM6IGBEZWxldGluZyBlbnNlbWJsZTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGUoZmlsZVBhdGgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkRFTEVURUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgZGVsZXRlZCBlbnNlbWJsZTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgbGlzdCB0byBhcHBseSBhY3RpdmUgc3RhdHVzIGJhc2VkIG9uIGFjdGl2ZUVuc2VtYmxlTmFtZXMgc2V0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8RW5zZW1ibGVbXT4ge1xuICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHN1cGVyLmxpc3QoKTtcblxuICAgIC8vIEFwcGx5IEFDVElWRSBzdGF0dXMgdG8gZW5zZW1ibGVzIGluIHRoZSBhY3RpdmVFbnNlbWJsZU5hbWVzIHNldFxuICAgIGZvciAoY29uc3QgZW5zZW1ibGUgb2YgZW5zZW1ibGVzKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmhhcyhlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSkge1xuICAgICAgICAvLyBDYWxsIGFjdGl2YXRlKCkgdG8gc2V0IHN0YXR1cyB0byBBQ1RJVkVcbiAgICAgICAgYXdhaXQgZW5zZW1ibGUuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5zZW1ibGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFuIGVuc2VtYmxlIGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENsZWFudXAgdHJpZ2dlciBmb3IgbWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVuc2VtYmxlIG5hbWUgb3IgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyBBY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUVuc2VtYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGVuc2VtYmxlPzogRW5zZW1ibGUgfT4ge1xuICAgIC8vIEV2aWN0IHN0YWxlIGNhY2hlIGJlZm9yZSBsb29rdXAgc28gZXh0ZXJuYWwgZmlsZSBlZGl0cyBhcmUgcGlja2VkIHVwICgjMTg5NSkuXG4gICAgLy8gZmluZEJ5TmFtZSgpIGhpdHMgdGhlIExSVSBjYWNoZSBmaXJzdCBhbmQgbmV2ZXIgY2FsbHMgbGlzdCgpLCBzbyB3aXRob3V0IHRoaXNcbiAgICAvLyB0aGUgc2NhbiBjb29sZG93biBwcmV2ZW50cyBtdGltZS1iYXNlZCBldmljdGlvbiBmcm9tIHJ1bm5pbmcuXG4gICAgYXdhaXQgdGhpcy5zY2FuQW5kRXZpY3QoKTtcblxuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuYWRkKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gU2V0IGVuc2VtYmxlIHN0YXR1cyB0byBhY3RpdmVcbiAgICBhd2FpdCBlbnNlbWJsZS5hY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuYWN0aXZhdGVFbnNlbWJsZScsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgYWN0aXZhdGVkOiAke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSksXG4gICAgICBlbnNlbWJsZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhbiBlbnNlbWJsZSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbnNlbWJsZSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgRGVhY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlRW5zZW1ibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgZW5zZW1ibGU/OiBFbnNlbWJsZSB9PiB7XG4gICAgLy8gTm8gc2NhbkFuZEV2aWN0KCkgaGVyZSDigJQgaW50ZW50aW9uYWwuIERlYWN0aXZhdGlvbiBvbmx5IG5lZWRzIHRoZSBlbnNlbWJsZSdzXG4gICAgLy8gbmFtZSAodG8gcmVtb3ZlIGZyb20gYWN0aXZlRW5zZW1ibGVOYW1lcykgYW5kIGNhbGxzIGRlYWN0aXZhdGUoKSB3aGljaCBzZXRzXG4gICAgLy8gYSBzdGF0dXMgZmxhZy4gSXQgZG9lcyBub3QgY29uc3VtZSB0aGUgZWxlbWVudHMgbGlzdCwgc28gc3RhbGUgY2FjaGVkIGVsZW1lbnRcbiAgICAvLyBkYXRhIGhhcyBubyBlZmZlY3Qgb24gY29ycmVjdG5lc3MuIENvbXBhcmUgd2l0aCBhY3RpdmF0ZUVuc2VtYmxlKCksIHdoaWNoXG4gICAgLy8gaW5nZXN0cyB0aGUgZnVsbCBlbGVtZW50IGxpc3QgdG8gb3JjaGVzdHJhdGUgc3ViLWVsZW1lbnQgbG9hZGluZyBhbmQgbXVzdFxuICAgIC8vIHRoZXJlZm9yZSBzZWUgdGhlIGxhdGVzdCBvbi1kaXNrIGRlZmluaXRpb24uICgjMTg5NSlcblxuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5kZWxldGUoZW5zZW1ibGUubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBTZXQgZW5zZW1ibGUgc3RhdHVzIHRvIGluYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVhY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSBkZWFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSksXG4gICAgICBlbnNlbWJsZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgZW5zZW1ibGVzXG4gICAqXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgYWN0aXZlIGVuc2VtYmxlc1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRW5zZW1ibGVzKCk6IFByb21pc2U8RW5zZW1ibGVbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEVuc2VtYmxlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzKSB7XG4gICAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShuYW1lKTtcbiAgICAgIGlmIChlbnNlbWJsZSkgcmVzdWx0cy5wdXNoKGVuc2VtYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2Vuc2VtYmxlcycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGVuc2VtYmxlcyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgZW5zZW1ibGVzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfRU5TRU1CTEVTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgZW5zZW1ibGVzIGxpbWl0IHJlYWNoZWQ6ICR7dGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemV9LyR7bWF4fWBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGFsZSBlbnRyaWVzIGZyb20gYWN0aXZlIGVuc2VtYmxlcyBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemU7XG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW5zZW1ibGVOYW1lcyA9IG5ldyBTZXQoZW5zZW1ibGVzLm1hcChlID0+IGUubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcykge1xuICAgICAgICBpZiAoIWV4aXN0aW5nRW5zZW1ibGVOYW1lcy5oYXMoYWN0aXZlTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemU7XG4gICAgICBjb25zdCByZW1vdmVkID0gc3RhcnRTaXplIC0gZW5kU2l6ZTtcblxuICAgICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDbGVhbmVkIHVwICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGVuc2VtYmxlIHJlZmVyZW5jZShzKS4gYCArXG4gICAgICAgICAgYEFjdGl2ZSBlbnNlbWJsZXM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgnZW5zZW1ibGVzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcycsXG4gICAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgZW5zZW1ibGUgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgZW5zZW1ibGVzOicsIGVycm9yKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
918
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV0RSwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFB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QUUsT0FBTzt3QkFDckIsV0FBVyxFQUFFLE9BQU87d0JBQ3BCLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDbEM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVqRSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSw2Q0FBNkM7Z0JBQ3JELE9BQU8sRUFBRSxtQkFBbUIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ3JGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgRW5zZW1ibGUgZWxlbWVudHNcbiAqXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIGVuc2VtYmxlcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIEV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciB1bmlmaWVkIGVsZW1lbnQgbWFuYWdlbWVudFxuICogLSBGb2xsb3dzIHRlbXBsYXRlIG1ldGhvZCBwYXR0ZXJuIChwYXJzZU1ldGFkYXRhLCBjcmVhdGVFbGVtZW50IGhvb2tzKVxuICogLSBQdXJlIG1hbmFnZXIgbGF5ZXIgLSBkZWxlZ2F0ZXMgYnVzaW5lc3MgbG9naWMgdG8gRW5zZW1ibGUgY2xhc3NcbiAqIC0gVXNlcyBESSBmb3IgZGVwZW5kZW5jaWVzIChQb3J0Zm9saW9NYW5hZ2VyLCBGaWxlTG9ja01hbmFnZXIpXG4gKlxuICogU0VDVVJJVFk6XG4gKiAtIFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqIC0gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgdXNlciBkYXRhXG4gKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsc1xuICogLSBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICovXG5cbmltcG9ydCB7IEVuc2VtYmxlLCBFbnNlbWJsZU1ldGFkYXRhLCBFbnNlbWJsZUVsZW1lbnQgfSBmcm9tICcuL0Vuc2VtYmxlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIEVOU0VNQkxFX0RFRkFVTFRTLFxuICBFTlNFTUJMRV9MSU1JVFMsXG4gIEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUyxcbiAgRU5TRU1CTEVfRVJST1JTLFxuICBBQ1RJVkFUSU9OX1NUUkFURUdJRVMsXG4gIENPTkZMSUNUX1NUUkFURUdJRVMsXG4gIEVMRU1FTlRfUk9MRVMsXG4gIEFDVElWQVRJT05fTU9ERVNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0aW9uU3RyYXRlZ3ksIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LCBFbGVtZW50Um9sZSwgQWN0aXZhdGlvbk1vZGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBWQUxJREFUSU9OX1BBVFRFUk5TLCBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLy8gSXNzdWUgIzQ2NjogU2hhcmVkIGVsZW1lbnQgdHlwZSByZXNvbHZlciDigJQgcmUtZXhwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmV4cG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMsIHR5cGUgRWxlbWVudE1hbmFnZXJzRm9yUmVzb2x1dGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIHJlc29sdmVFbGVtZW50VHlwZXMgZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcycgKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlRW5zZW1ibGVFbGVtZW50VHlwZXMgPSByZXNvbHZlRWxlbWVudFR5cGVzO1xuXG5jb25zdCBMRUdBQ1lfRUxFTUVOVF9GSUVMRF9SRVBMQUNFTUVOVFMgPSB7XG4gIG5hbWU6ICdlbGVtZW50X25hbWUnLFxuICB0eXBlOiAnZWxlbWVudF90eXBlJyxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgTGVnYWN5RWxlbWVudEZpZWxkID0ga2V5b2YgdHlwZW9mIExFR0FDWV9FTEVNRU5UX0ZJRUxEX1JFUExBQ0VNRU5UUztcblxuLyoqXG4gKiBFbnNlbWJsZU1hbmFnZXIgLSBNYW5hZ2VzIGVuc2VtYmxlIGVsZW1lbnQgbGlmZWN5Y2xlXG4gKlxuICogRXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXIgdG8gcHJvdmlkZSBlbnNlbWJsZS1zcGVjaWZpYyBvcGVyYXRpb25zOlxuICogLSBZQU1MIHBhcnNpbmcgd2l0aCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSBzdXBwb3J0XG4gKiAtIEVuc2VtYmxlIGNyZWF0aW9uIGFuZCB2YWxpZGF0aW9uXG4gKiAtIEVsZW1lbnQgcmVmZXJlbmNlIG1hbmFnZW1lbnRcbiAqIC0gSW1wb3J0L2V4cG9ydCBpbiBtdWx0aXBsZSBmb3JtYXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnNlbWJsZU1hbmFnZXIgZXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXI8RW5zZW1ibGU+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnNlbWJsZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIGFjdGl2ZUVuc2VtYmxlTmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxlZ2FjeUVsZW1lbnRGaWVsZFdhcm5pbmdzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5FTlNFTUJMRSwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5lbnNlbWJsZXNEaXIgPSB0aGlzLmVsZW1lbnREaXI7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBpbi1tZW1vcnkgd2Fybi1vbmNlIHN0YXRlIGZvciBsZWdhY3kgZW5zZW1ibGUgZWxlbWVudCBmaWVsZHMuXG4gICAqXG4gICAqIFVzZWZ1bCBmb3IgbG9uZy1saXZlZCBwcm9jZXNzZXMgb3IgdGVzdHMgdGhhdCBpbnRlbnRpb25hbGx5IHdhbnQgdG9cbiAgICogb2JzZXJ2ZSB0aGUgd2FybmluZyBwYXRoIGFnYWluIGFmdGVyIGEgbWFpbnRlbmFuY2UgYm91bmRhcnkuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJMZWdhY3lFbGVtZW50V2FybmluZ0hpc3RvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5sZWdhY3lFbGVtZW50RmllbGRXYXJuaW5ncy5jbGVhcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgdGhpcy5jbGVhckxlZ2FjeUVsZW1lbnRXYXJuaW5nSGlzdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhcm4gb25jZSBwZXIgZW5zZW1ibGUvaW5kZXgvZmllbGQgY29tYmluYXRpb24gd2hlbiBhIGxlZ2FjeSBuZXN0ZWQgZmllbGRcbiAgICogaXMgZW5jb3VudGVyZWQgd2hpbGUgbG9hZGluZyBvciBwYXJzaW5nIGFuIGVuc2VtYmxlLlxuICAgKlxuICAgKiBGaW5nZXJwcmludGluZyBrZWVwcyB0aGUgd2FybmluZyB2aXNpYmxlIGZvciBlYWNoIGRpc3RpbmN0IGxlZ2FjeSBmaWVsZFxuICAgKiB3aXRob3V0IHJlLWVtaXR0aW5nIHRoZSBzYW1lIGRlcHJlY2F0aW9uIG5vdGljZSBvbiBldmVyeSByZS1wYXJzZS5cbiAgICpcbiAgICogQHBhcmFtIGVuc2VtYmxlTmFtZSAtIE5hbWUgb2YgdGhlIGVuc2VtYmxlIGNvbnRhaW5pbmcgdGhlIGxlZ2FjeSBmaWVsZFxuICAgKiBAcGFyYW0gaW5kZXggLSBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgZW5zZW1ibGVcbiAgICogQHBhcmFtIGZpZWxkIC0gTGVnYWN5IG5lc3RlZCBmaWVsZCBuYW1lIHRoYXQgc2hvdWxkIGJlIG1pZ3JhdGVkXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbmNlRm9yTGVnYWN5RWxlbWVudEZpZWxkKFxuICAgIGVuc2VtYmxlTmFtZTogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZmllbGQ6IExlZ2FjeUVsZW1lbnRGaWVsZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBMRUdBQ1lfRUxFTUVOVF9GSUVMRF9SRVBMQUNFTUVOVFNbZmllbGRdO1xuICAgIGNvbnN0IGZpbmdlcnByaW50ID0gYCR7ZW5zZW1ibGVOYW1lfToke2luZGV4fToke2ZpZWxkfWA7XG4gICAgaWYgKHRoaXMubGVnYWN5RWxlbWVudEZpZWxkV2FybmluZ3MuaGFzKGZpbmdlcnByaW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGVnYWN5RWxlbWVudEZpZWxkV2FybmluZ3MuYWRkKGZpbmdlcnByaW50KTtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBFbnNlbWJsZSAnJHtlbnNlbWJsZU5hbWV9JyBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAnJHtmaWVsZH0nIGZpZWxkLiBVc2UgJyR7cmVwbGFjZW1lbnR9JyBpbnN0ZWFkLmAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTGVnYWN5RWxlbWVudEZpZWxkcyhlbGVtZW50c1JhdzogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50c1JhdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNSYXcuc29tZSgoZWxlbSkgPT5cbiAgICAgIGVsZW1cbiAgICAgICYmIHR5cGVvZiBlbGVtID09PSAnb2JqZWN0J1xuICAgICAgJiYgKFxuICAgICAgICAoJ25hbWUnIGluIChlbGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSAmJiAhKCdlbGVtZW50X25hbWUnIGluIChlbGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkpXG4gICAgICAgIHx8ICgndHlwZScgaW4gKGVsZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pICYmICEoJ2VsZW1lbnRfdHlwZScgaW4gKGVsZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJld3JpdGUgbGVnYWN5IGVuc2VtYmxlIGVsZW1lbnQgZmllbGQgbmFtZXMgKGBuYW1lYC9gdHlwZWApIHRvIHRoZVxuICAgKiBjYW5vbmljYWwgYGVsZW1lbnRfbmFtZWAvYGVsZW1lbnRfdHlwZWAgZm9ybSBieSBsb2FkaW5nIGFuZCByZXNhdmluZ1xuICAgKiBhZmZlY3RlZCBlbnNlbWJsZXMuXG4gICAqL1xuICBhc3luYyByZXBhaXJMZWdhY3lFbGVtZW50RmllbGRzKCk6IFByb21pc2U8e1xuICAgIHNjYW5uZWQ6IG51bWJlcjtcbiAgICByZXBhaXJlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIHJlcGFpcmVkRW5zZW1ibGVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+O1xuICB9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc2Nhbm5lZDogMCxcbiAgICAgIHJlcGFpcmVkOiAwLFxuICAgICAgZXJyb3JzOiAwLFxuICAgICAgcmVwYWlyZWRFbnNlbWJsZXM6IFtdIGFzIEFycmF5PHsgbmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfT4sXG4gICAgfTtcblxuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gdGhpcy5nZXRFbGVtZW50VHlwZSgpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyhlbGVtZW50VHlwZSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQuc2Nhbm5lZCsrO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGUpO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIGVsZW1lbnRUeXBlLCB7XG4gICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnJlcGFpckxlZ2FjeUVsZW1lbnRGaWVsZHNgLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKHJhdyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0xlZ2FjeUVsZW1lbnRGaWVsZHMocGFyc2VkLmRhdGE/LmVsZW1lbnRzKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZShlbnNlbWJsZSwgZmlsZSk7XG5cbiAgICAgICAgcmVzdWx0LnJlcGFpcmVkKys7XG4gICAgICAgIHJlc3VsdC5yZXBhaXJlZEVuc2VtYmxlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbnNlbWJsZS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHBhdGg6IGZpbGUsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVzdWx0LmVycm9ycysrO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtFbnNlbWJsZU1hbmFnZXJdIEZhaWxlZCB0byByZXBhaXIgbGVnYWN5IGVsZW1lbnQgZmllbGRzIGluICcke2ZpbGV9JzpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICpcbiAgICogTkFNSU5HIENPTlZFTlRJT04gU1VQUE9SVDpcbiAgICogLSBUeXBlU2NyaXB0IGludGVyZmFjZXMgdXNlIGNhbWVsQ2FzZSAoYWN0aXZhdGlvblN0cmF0ZWd5LCBjb25mbGljdFJlc29sdXRpb24pXG4gICAqIC0gWUFNTCBmaWxlcyBjYW4gdXNlIHNuYWtlX2Nhc2UgKGFjdGl2YXRpb25fc3RyYXRlZ3ksIGNvbmZsaWN0X3Jlc29sdXRpb24pXG4gICAqIC0gVGhpcyBtZXRob2QgbWFwcyBzbmFrZV9jYXNlIOKGkiBjYW1lbENhc2UgZm9yIHVzZXIgY29udmVuaWVuY2VcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgWUFNTCBkYXRhIGZyb20gZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIEVuc2VtYmxlTWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8RW5zZW1ibGVNZXRhZGF0YT4ge1xuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSB2YWxpZGF0ZU1ldGFkYXRhRmllbGQgZm9yIGZpZWxkLWF3YXJlIGVycm9yIG1lc3NhZ2VzICgjMzY1KVxuICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlTWV0YWRhdGFGaWVsZCgnbmFtZScsIGRhdGEubmFtZSwge1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEhcbiAgICB9KTtcbiAgICBpZiAoIW5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtuYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbWV0YWRhdGEgbXVzdCBpbmNsdWRlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSB2YWxpZGF0ZU1ldGFkYXRhRmllbGQgZm9yIGZpZWxkLWF3YXJlIGVycm9yIG1lc3NhZ2VzICgjMzY1KVxuICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBkZXNjUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZU1ldGFkYXRhRmllbGQoJ2Rlc2NyaXB0aW9uJywgZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgIHBhdHRlcm46IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9ERVNDUklQVElPTlxuICAgICAgfSk7XG4gICAgICBpZiAoIWRlc2NSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke2Rlc2NSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgZGVzY3JpcHRpb24gPSBkZXNjUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgYWN0aXZhdGlvbiBzdHJhdGVneSAoc3VwcG9ydCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSlcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3lSYXcgPSBkYXRhLmFjdGl2YXRpb25fc3RyYXRlZ3kgfHwgZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgRU5TRU1CTEVfREVGQVVMVFMuQUNUSVZBVElPTl9TVFJBVEVHWTtcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoYWN0aXZhdGlvblN0cmF0ZWd5UmF3KSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFjdGl2YXRpb24gc3RyYXRlZ3k6ICR7YWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5ID0gYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIUFDVElWQVRJT05fU1RSQVRFR0lFUy5pbmNsdWRlcyhhY3RpdmF0aW9uU3RyYXRlZ3kgYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX1NUUkFURUdZfTogJHthY3RpdmF0aW9uU3RyYXRlZ3l9YCk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uUmF3ID0gZGF0YS5jb25mbGljdF9yZXNvbHV0aW9uIHx8IGRhdGEuY29uZmxpY3RSZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT047XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGNvbmZsaWN0UmVzb2x1dGlvblJhdyksIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5OiAke2NvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvbiA9IGNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmluY2x1ZGVzKGNvbmZsaWN0UmVzb2x1dGlvbiBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQ09ORkxJQ1RfUkVTT0xVVElPTn06ICR7Y29uZmxpY3RSZXNvbHV0aW9ufWApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29udGV4dCBzaGFyaW5nIG1vZGVcbiAgICBjb25zdCBjb250ZXh0U2hhcmluZ1JhdyA9IGRhdGEuY29udGV4dF9zaGFyaW5nIHx8IGRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HO1xuXG4gICAgLy8gRklYOiBIYW5kbGUgYm9vbGVhbiB2YWx1ZXMgKHRydWUgLT4gJ2Z1bGwnLCBmYWxzZSAtPiAnbm9uZScpXG4gICAgbGV0IGNvbnRleHRTaGFyaW5nVmFsdWU6IHN0cmluZztcbiAgICBpZiAodHlwZW9mIGNvbnRleHRTaGFyaW5nUmF3ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGNvbnRleHRTaGFyaW5nVmFsdWUgPSBjb250ZXh0U2hhcmluZ1JhdyA/ICdmdWxsJyA6ICdub25lJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dFNoYXJpbmdWYWx1ZSA9IFN0cmluZyhjb250ZXh0U2hhcmluZ1Jhdyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dFNoYXJpbmdSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChjb250ZXh0U2hhcmluZ1ZhbHVlLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWNvbnRleHRTaGFyaW5nUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IHNoYXJpbmcgbW9kZTogJHtjb250ZXh0U2hhcmluZ1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nID0gY29udGV4dFNoYXJpbmdSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghWydub25lJywgJ3NlbGVjdGl2ZScsICdmdWxsJ10uaW5jbHVkZXMoY29udGV4dFNoYXJpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udGV4dCBzaGFyaW5nIG1vZGU6ICR7Y29udGV4dFNoYXJpbmd9YCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgcmVzb3VyY2UgbGltaXRzIChzdXBwb3J0IHNuYWtlX2Nhc2UpXG4gICAgY29uc3QgcmVzb3VyY2VMaW1pdHNSYXcgPSBkYXRhLnJlc291cmNlX2xpbWl0cyB8fCBkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIGxldCByZXNvdXJjZUxpbWl0cztcblxuICAgIGlmIChyZXNvdXJjZUxpbWl0c1Jhdykge1xuICAgICAgcmVzb3VyY2VMaW1pdHMgPSB7XG4gICAgICAgIG1heEFjdGl2ZUVsZW1lbnRzOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfYWN0aXZlX2VsZW1lbnRzIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heEFjdGl2ZUVsZW1lbnRzIHx8IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMsXG4gICAgICAgIG1heE1lbW9yeU1iOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfbWVtb3J5X21iIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heE1lbW9yeU1iLFxuICAgICAgICBtYXhFeGVjdXRpb25UaW1lTXM6IHJlc291cmNlTGltaXRzUmF3Lm1heF9leGVjdXRpb25fdGltZV9tcyB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhFeGVjdXRpb25UaW1lTXMgfHwgRU5TRU1CTEVfTElNSVRTLk1BWF9BQ1RJVkFUSU9OX1RJTUVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgZWxlbWVudHMgYXJyYXlcbiAgICBjb25zdCBlbGVtZW50c1JhdyA9IGRhdGEuZWxlbWVudHMgfHwgW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBlbGVtZW50cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudFtdID0gZWxlbWVudHNSYXcubWFwKChlbGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCBuYW1lXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF9uYW1lIChuZXcgc3RhbmRhcmQpIGFuZCBuYW1lIChsZWdhY3kpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgcmF3RWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIXJhd0VsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIHRoaXMud2Fybk9uY2VGb3JMZWdhY3lFbGVtZW50RmllbGQobmFtZSwgaW5kZXgsICduYW1lJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50TmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcocmF3RWxlbWVudE5hbWUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCwgYWxsb3dTcGFjZXM6IHRydWUgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudE5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBuYW1lIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnROYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgdHlwZVxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfdHlwZSAobmV3IHN0YW5kYXJkKSBhbmQgdHlwZSAobGVnYWN5KSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlIHx8ICdza2lsbCc7XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ3R5cGUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS50eXBlICYmICFlbGVtLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICB0aGlzLndhcm5PbmNlRm9yTGVnYWN5RWxlbWVudEZpZWxkKG5hbWUsIGluZGV4LCAndHlwZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKHJhd0VsZW1lbnRUeXBlKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50VHlwZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IHJvbGVcbiAgICAgIGNvbnN0IGVsZW1lbnRSb2xlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50Um9sZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHJvbGUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudFJvbGVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFJvbGUgPSBlbGVtZW50Um9sZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyhlbGVtZW50Um9sZSBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9FTEVNRU5UX1JPTEV9OiAke2VsZW1lbnRSb2xlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgY29uc3QgZWxlbWVudEFjdGl2YXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKGVsZW0uYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhY3RpdmF0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRBY3RpdmF0aW9uID0gZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgICBpZiAoIUFDVElWQVRJT05fTU9ERVMuaW5jbHVkZXMoZWxlbWVudEFjdGl2YXRpb24gYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQUNUSVZBVElPTl9NT0RFfTogJHtlbGVtZW50QWN0aXZhdGlvbn1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgcHJpb3JpdHkgKDAtMTAwLCBkZWZhdWx0IDUwKVxuICAgICAgbGV0IHByaW9yaXR5ID0gZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWTtcbiAgICAgIGlmICh0eXBlb2YgcHJpb3JpdHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHByaW9yaXR5ID0gcGFyc2VJbnQocHJpb3JpdHksIDEwKTtcbiAgICAgIH1cbiAgICAgIHByaW9yaXR5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBwcmlvcml0eSkpO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbmRpdGlvbiAoaWYgY29uZGl0aW9uYWwgYWN0aXZhdGlvbilcbiAgICAgIC8vIENvbmRpdGlvbnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIC0gdGhleSBjYW4gY29udGFpbiBvcGVyYXRvcnMgbGlrZSA9PSwgIT0sICYmLCB8fFxuICAgICAgLy8gU28gd2UgdXNlIGEgY3VzdG9tIHBhdHRlcm4gdGhhdCBhbGxvd3MgdGhlc2UgY2hhcmFjdGVyc1xuICAgICAgbGV0IGNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW1lbnRBY3RpdmF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmIGVsZW0uY29uZGl0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICAgIFN0cmluZyhlbGVtLmNvbmRpdGlvbiksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4TGVuZ3RoOiBFTlNFTUJMRV9MSU1JVFMuTUFYX0NPTkRJVElPTl9MRU5HVEgsXG4gICAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICAgIGN1c3RvbVBhdHRlcm46IC9eW2EtekEtWjAtOVxcc1xcLV8uPSEmfDw+KCldKyQvICAvLyBBbGxvdyBjb21wYXJpc29uL2xvZ2ljYWwgb3BlcmF0b3JzXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmRpdGlvbiBhdCBpbmRleCAke2luZGV4fTogJHtjb25kaXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBkZXBlbmRlbmNpZXNcbiAgICAgIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW0uZGVwZW5kZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoZWxlbS5kZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZERlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbS5kZXBlbmRlbmNpZXMuc2xpY2UoMCwgRU5TRU1CTEVfTElNSVRTLk1BWF9ERVBFTkRFTkNJRVMpKSB7XG4gICAgICAgICAgY29uc3QgZGVwUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGRlcCksIHtcbiAgICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFkZXBSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcGVuZGVuY3kgXCIke2RlcH1cIiBhdCBpbmRleCAke2luZGV4fTogJHtkZXBSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0ZWREZXBlbmRlbmNpZXMucHVzaChkZXBSZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmNpZXMgPSB2YWxpZGF0ZWREZXBlbmRlbmNpZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgcHVycG9zZVxuICAgICAgbGV0IHB1cnBvc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtLnB1cnBvc2UpIHtcbiAgICAgICAgY29uc3QgcHVycG9zZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhlbGVtLnB1cnBvc2UpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgIC8vIEFsbG93IGZ1bGwgZGVzY3JpcHRpb24gcHVuY3R1YXRpb24gKGNvbW1hcywgZW0tZGFzaGVzLCBldGMuKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwdXJwb3NlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHVycG9zZSBhdCBpbmRleCAke2luZGV4fTogJHtwdXJwb3NlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBwdXJwb3NlID0gcHVycG9zZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcm9sZTogZWxlbWVudFJvbGUgYXMgRWxlbWVudFJvbGUsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtZW50QWN0aXZhdGlvbiBhcyBBY3RpdmF0aW9uTW9kZSxcbiAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2VcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IGNvdW50XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihFTlNFTUJMRV9FUlJPUlMuVE9PX01BTllfRUxFTUVOVFMpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIG5lc3RpbmcgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFsbG93TmVzdGVkID0gZGF0YS5hbGxvd19uZXN0ZWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICBCb29sZWFuKGRhdGEuYWxsb3dfbmVzdGVkKSA6XG4gICAgICAoZGF0YS5hbGxvd05lc3RlZCAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbihkYXRhLmFsbG93TmVzdGVkKSA6IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCk7XG5cbiAgICBjb25zdCBtYXhOZXN0aW5nRGVwdGggPSBkYXRhLm1heF9uZXN0aW5nX2RlcHRoIHx8IGRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRIO1xuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciB0YWdzIGFycmF5XG4gICAgbGV0IHRhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50YWdzKSkge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgZGF0YS50YWdzKSB7XG4gICAgICAgIGNvbnN0IHRhZ1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh0YWcpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGFnUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFnIFwiJHt0YWd9XCI6ICR7dGFnUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0YWdzLnB1c2godGFnUmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgb2JqZWN0IChjYW1lbENhc2UpXG4gICAgY29uc3QgbWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IGRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogZGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IGRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFncyxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogYWN0aXZhdGlvblN0cmF0ZWd5IGFzIEFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogY29uZmxpY3RSZXNvbHV0aW9uIGFzIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgICAgY29udGV4dFNoYXJpbmc6IGNvbnRleHRTaGFyaW5nIGFzICdub25lJyB8ICdzZWxlY3RpdmUnIHwgJ2Z1bGwnLFxuICAgICAgcmVzb3VyY2VMaW1pdHMsXG4gICAgICBhbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aCxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KGRhdGEuZ2F0ZWtlZXBlciwgbmFtZSwgJ2Vuc2VtYmxlJywgZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksICAvLyBJc3N1ZSAjNTI0XG4gICAgfTtcblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW5zZW1ibGUgaW5zdGFuY2UgZnJvbSBwYXJzZWQgbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gVmFsaWRhdGVkIGVuc2VtYmxlIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWFya2Rvd24gY29udGVudCAoZW5zZW1ibGUgaW5zdHJ1Y3Rpb25zL2RvY3VtZW50YXRpb24pXG4gICAqIEByZXR1cm5zIE5ldyBFbnNlbWJsZSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEsIF9jb250ZW50OiBzdHJpbmcpOiBFbnNlbWJsZSB7XG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gRml4ICM5MTI6IFN0cmlwIG1hcmtlciBmcm9tIHJ1bnRpbWUgbWV0YWRhdGFcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShtZXRhZGF0YSwgbWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAvLyBFeHRyYWN0IGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGlmIHByZXNlbnQgKHYyIGR1YWwtZmllbGQpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgZW5zZW1ibGUuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhbiBlbnNlbWJsZSB0byBmaWxlIGNvbnRlbnRcbiAgICpcbiAgICogRm9ybWF0OiBNYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogLSBGcm9udG1hdHRlcjogRW5zZW1ibGUgbWV0YWRhdGEgKyBlbGVtZW50IHJlZmVyZW5jZXNcbiAgICogLSBDb250ZW50OiBJbnN0cnVjdGlvbnMvZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGVuc2VtYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAobWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IEVuc2VtYmxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnQubWV0YWRhdGE7XG5cbiAgICAvLyBCdWlsZCBmcm9udG1hdHRlciBkYXRhICh1c2luZyBjYW1lbENhc2UpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXI6IGFueSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuRU5TRU1CTEUpLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgICAgdW5pcXVlX2lkOiBlbGVtZW50LmlkLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGEuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbixcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoXG4gICAgfTtcblxuICAgIC8vIHYyLjAgZHVhbC1maWVsZDogd3JpdGUgaW5zdHJ1Y3Rpb25zIHRvIFlBTUwgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudFxuICAgIGlmIChlbGVtZW50Lmluc3RydWN0aW9ucykge1xuICAgICAgZnJvbnRtYXR0ZXIuaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5pbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSByZXNvdXJjZSBsaW1pdHMgaWYgc3BlY2lmaWVkXG4gICAgaWYgKG1ldGFkYXRhLnJlc291cmNlTGltaXRzKSB7XG4gICAgICBmcm9udG1hdHRlci5yZXNvdXJjZUxpbWl0cyA9IG1ldGFkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEuZ2F0ZWtlZXBlcikge1xuICAgICAgZnJvbnRtYXR0ZXIuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSBlbGVtZW50cyBhcnJheSAodXNpbmcgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBmb3IgQVBJIGNvbnNpc3RlbmN5KVxuICAgIGZyb250bWF0dGVyLmVsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMubWFwKGVsZW0gPT4ge1xuICAgICAgY29uc3QgZWxlbURhdGE6IGFueSA9IHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtLmVsZW1lbnRfbmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgcm9sZTogZWxlbS5yb2xlLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uXG4gICAgICB9O1xuXG4gICAgICBpZiAoZWxlbS5jb25kaXRpb24pIHtcbiAgICAgICAgZWxlbURhdGEuY29uZGl0aW9uID0gZWxlbS5jb25kaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtLmRlcGVuZGVuY2llcyAmJiBlbGVtLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1EYXRhLmRlcGVuZGVuY2llcyA9IGVsZW0uZGVwZW5kZW5jaWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbS5wdXJwb3NlKSB7XG4gICAgICAgIGVsZW1EYXRhLnB1cnBvc2UgPSBlbGVtLnB1cnBvc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGVtRGF0YTtcbiAgICB9KTtcblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgY3JlYXRpb25cbiAgICAvLyBVc2UgQ09SRV9TQ0hFTUEgdG8gc3VwcG9ydCBudW1iZXJzIChwcmlvcml0eSkgYW5kIGJvb2xlYW5zIChhbGxvd05lc3RlZClcbiAgICBjb25zdCBib2R5ID0gZWxlbWVudC5jb250ZW50IHx8IHRoaXMuYnVpbGREZWZhdWx0Qm9keShlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5jcmVhdGVGcm9udG1hdHRlcihmcm9udG1hdHRlciwgYm9keSwge1xuICAgICAgbWV0aG9kOiAnbWFudWFsJyxcbiAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IHN0YW5kYXJkaXplIG9uIEpTT04gc2NoZW1hIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICAgIGNsZWFuTWV0YWRhdGE6IHRydWUsICAvLyBGaXggIzkxMzogc3RhbmRhcmRpemUgYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJyxcbiAgICAgIHNvcnRLZXlzOiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiAxMDAsXG4gICAgICBza2lwSW52YWxpZDogZmFsc2UgIC8vIERvbid0IHNraXAgaW52YWxpZCAtIHdlIHdhbnQgdG8gY2F0Y2ggZXJyb3JzXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoZWxlbWVudDogRW5zZW1ibGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoZWxlbWVudC5tZXRhZGF0YS5uYW1lID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZvciBlbnNlbWJsZSBmaWxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZW5zZW1ibGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICpcbiAgICogU3VwcG9ydHM6XG4gICAqIC0gWUFNTDogRnJvbnRtYXR0ZXItc3R5bGUgbWV0YWRhdGEgd2l0aCBvcHRpb25hbCBtYXJrZG93biBjb250ZW50XG4gICAqIC0gSlNPTjogRGlyZWN0IGVuc2VtYmxlIHN0cnVjdHVyZVxuICAgKiAtIE1hcmtkb3duOiBZQU1MIGZyb250bWF0dGVyICsgbWFya2Rvd24gY29udGVudFxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFN0cmluZyBjb250YWluaW5nIGVuc2VtYmxlIGRhdGFcbiAgICogQHBhcmFtIGZvcm1hdCAtIEZvcm1hdCBvZiB0aGUgZGF0YSAoanNvbiwgeWFtbCwgbWFya2Rvd24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGltcG9ydGVkIEVuc2VtYmxlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbXBvcnRFbGVtZW50KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nXG4gICk6IFByb21pc2U8RW5zZW1ibGU+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZDogYW55O1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBhcnNlIFlBTUwvTWFya2Rvd24gdXNpbmcgU2VyaWFsaXphdGlvblNlcnZpY2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogNTAwMDAsIC8vIDUwS0IgbGltaXQgZm9yIGVuc2VtYmxlIGZpbGVzXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgLy8gQ29udGVudCBpcyBwYXJzZWQgYnV0IG5vdCB1c2VkIGluIGVuc2VtYmxlIGNyZWF0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQpO1xuXG4gICAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKG1ldGFkYXRhLCBtZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBpbXBvcnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLklNUE9SVEVELFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEltcG9ydGVkIGVuc2VtYmxlOiAke21ldGFkYXRhLm5hbWV9IHdpdGggJHttZXRhZGF0YS5lbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzYFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbnNlbWJsZTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5JTVBPUlRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZW5zZW1ibGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0IChqc29uLCB5YW1sLCBtYXJrZG93bilcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gc2VyaWFsaXplZCBzdHJpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4cG9ydEVsZW1lbnQoXG4gICAgZWxlbWVudDogRW5zZW1ibGUsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIFlBTUwgYW5kIE1hcmtkb3duLCB1c2UgdGhlIHNhbWUgZm9ybWF0IChmcm9udG1hdHRlciArIGNvbnRlbnQpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW5zZW1ibGUgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBQYXJ0aWFsIG1ldGFkYXRhIGZvciB0aGUgZW5zZW1ibGVcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gbmV3IEVuc2VtYmxlIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBjcmVhdGUobWV0YWRhdGE6IFBhcnRpYWw8RW5zZW1ibGVNZXRhZGF0YT4gJiB7IGluc3RydWN0aW9ucz86IHN0cmluZzsgY29udGVudD86IHN0cmluZyB9KTogUHJvbWlzZTxFbnNlbWJsZT4ge1xuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb25cbiAgICAvLyBOb3RlOiBlbGVtZW50X3R5cGUgcmVzb2x1dGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBoYW5kbGVyIGxheWVyIGJlZm9yZSBjYWxsaW5nIGNyZWF0ZSgpLlxuICAgIC8vIEVsZW1lbnRzIHNob3VsZCBhbHJlYWR5IGhhdmUgZWxlbWVudF90eXBlIHNldCB3aGVuIHRoZXkgYXJyaXZlIGhlcmUuXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBlbGVtZW50czogbWV0YWRhdGEuZWxlbWVudHMgfHwgW10sXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgIH1cbiAgICBjb25zdCBlbnNlbWJsZU5hbWUgPSBtZXRhZGF0YS5uYW1lO1xuXG4gICAgbGV0IHJhd0VsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMgfHwgW107XG5cbiAgICAvLyBNaWdyYXRlIGxlZ2FjeSBlbGVtZW50IGZpZWxkcyAobmFtZSAtPiBlbGVtZW50X25hbWUsIHR5cGUgLT4gZWxlbWVudF90eXBlKVxuICAgIC8vIFRoaXMgZW5zdXJlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEFQSSBjYWxscyB1c2luZyBvbGQgZmllbGQgbmFtZXNcbiAgICBjb25zdCBtaWdyYXRlZEVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IHJhd0VsZW1lbnRzLm1hcCgoZWxlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF9uYW1lIChuZXcgc3RhbmRhcmQpIGFuZCBuYW1lIChsZWdhY3kpXG4gICAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW0uZWxlbWVudF9uYW1lIHx8IGVsZW0ubmFtZTtcbiAgICAgIGlmICghZWxlbWVudE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IG11c3QgaGF2ZSBlbGVtZW50X25hbWUgKG9yIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KWApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICduYW1lJyBmaWVsZFxuICAgICAgaWYgKGVsZW0ubmFtZSAmJiAhZWxlbS5lbGVtZW50X25hbWUpIHtcbiAgICAgICAgdGhpcy53YXJuT25jZUZvckxlZ2FjeUVsZW1lbnRGaWVsZChlbnNlbWJsZU5hbWUsIGluZGV4LCAnbmFtZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpXG4gICAgICAvLyBJc3N1ZSAjNDY2OiBObyBsb25nZXIgZGVmYXVsdHMgdG8gJ3NraWxsJyDigJQgY2FsbGVycyBtdXN0IHByb3ZpZGUgdHlwZVxuICAgICAgLy8gb3IgcGFzcyBtYW5hZ2VycyBmb3IgcG9ydGZvbGlvIHJlc29sdXRpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlO1xuICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBhdCBpbmRleCAke2luZGV4fSBoYXMgbm8gZWxlbWVudF90eXBlLiBgICtcbiAgICAgICAgICBgUHJvdmlkZSBlbGVtZW50X3R5cGUgZXhwbGljaXRseSBvciBlbnN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBwb3J0Zm9saW8uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICd0eXBlJyBmaWVsZFxuICAgICAgaWYgKGVsZW0udHlwZSAmJiAhZWxlbS5lbGVtZW50X3R5cGUpIHtcbiAgICAgICAgdGhpcy53YXJuT25jZUZvckxlZ2FjeUVsZW1lbnRGaWVsZChlbnNlbWJsZU5hbWUsIGluZGV4LCAndHlwZScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICByb2xlOiBlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uIHx8ICdhbHdheXMnLFxuICAgICAgICBjb25kaXRpb246IGVsZW0uY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IGVsZW0uZGVwZW5kZW5jaWVzLFxuICAgICAgICBwdXJwb3NlOiBlbGVtLnB1cnBvc2VcbiAgICAgIH0gYXMgRW5zZW1ibGVFbGVtZW50O1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzIGZvciBvcHRpb25hbCBmaWVsZHNcbiAgICBjb25zdCBmdWxsTWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YS5jcmVhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBtZXRhZGF0YS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgKG1ldGFkYXRhIGFzIGFueSkuYWN0aXZhdGlvbl9zdHJhdGVneSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5BQ1RJVkFUSU9OX1NUUkFURUdZLFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBtZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb24gfHwgKG1ldGFkYXRhIGFzIGFueSkuY29uZmxpY3RfcmVzb2x1dGlvbiB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05GTElDVF9SRVNPTFVUSU9OLFxuICAgICAgY29udGV4dFNoYXJpbmc6IG1ldGFkYXRhLmNvbnRleHRTaGFyaW5nIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTlRFWFRfU0hBUklORyxcbiAgICAgIHJlc291cmNlTGltaXRzOiBtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCA/PyBFTlNFTUJMRV9ERUZBVUxUUy5BTExPV19ORVNURUQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aCB8fCBFTlNFTUJMRV9ERUZBVUxUUy5NQVhfTkVTVElOR19ERVBUSCxcbiAgICAgIGVsZW1lbnRzOiBtaWdyYXRlZEVsZW1lbnRzLFxuICAgICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKHN5bW1ldHJpYyB3aXRoIGJ1aWxkTWV0YWRhdGEgZGVzZXJpYWxpemF0aW9uKVxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KChtZXRhZGF0YSBhcyBhbnkpLmdhdGVrZWVwZXIsIG1ldGFkYXRhLm5hbWUhLCAnZW5zZW1ibGUnLCBtZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIGluaGVyaXRlZCBnZXRFbGVtZW50RmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBub3JtYWxpemF0aW9uXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShmdWxsTWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBJc3N1ZSAjNjEzOiBDaGVjayBtZXRhZGF0YSBuYW1lIHVuaXF1ZW5lc3MgKG5vdCBqdXN0IGZpbGVuYW1lKVxuICAgIGNvbnN0IGV4aXN0aW5nRW5zZW1ibGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdFbnNlbWJsZXMuZmluZChlID0+XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZnVsbE1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBlbnNlbWJsZSBuYW1lZCBcIiR7ZnVsbE1ldGFkYXRhLm5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShmdWxsTWV0YWRhdGEsIGZ1bGxNZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gU2V0IGluc3RydWN0aW9ucyBhbmQgY29udGVudCBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBlbnNlbWJsZS5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5jb250ZW50KSB7XG4gICAgICBlbnNlbWJsZS5jb250ZW50ID0gbWV0YWRhdGEuY29udGVudDtcbiAgICB9XG5cbiAgICAvLyBTYXZlIHRvIGRpc2tcbiAgICBhd2FpdCB0aGlzLnNhdmUoZW5zZW1ibGUsIGZpbGVuYW1lKTtcbiAgICAvLyBOb3RlOiBObyByZWxvYWQoKSBoZXJlIOKAlCBzYXZlKCkgY2FjaGVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgIC8vIExvZyBjcmVhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5TQVZFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYENyZWF0ZWQgZW5zZW1ibGU6ICR7ZnVsbE1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVuc2VtYmxlXG4gICAqIERlbGVnYXRlcyB0byBlbnNlbWJsZSdzIG93biB2YWxpZGF0ZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgb3ZlcnJpZGUgdmFsaWRhdGUoZWxlbWVudDogRW5zZW1ibGUpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBzYXZlIHRvIHZhbGlkYXRlIGJlZm9yZSBwZXJzaXN0aW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzYXZlKGVsZW1lbnQ6IEVuc2VtYmxlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmFsaWRhdGUgZW5zZW1ibGUgYmVmb3JlIHNhdmluZ1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRlKGVsZW1lbnQpO1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKSB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCBlbnNlbWJsZTogJHtlcnJvcnN9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgYXdhaXQgc3VwZXIuc2F2ZShlbGVtZW50LCBmaWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIGFkZCBlbnNlbWJsZS1zcGVjaWZpYyBsb2dnaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5ERUxFVEVELFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgRGVsZXRpbmcgZW5zZW1ibGU6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKGZpbGVQYXRoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5ERUxFVEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZW5zZW1ibGU6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGxpc3QgdG8gYXBwbHkgYWN0aXZlIHN0YXR1cyBiYXNlZCBvbiBhY3RpdmVFbnNlbWJsZU5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEVuc2VtYmxlW10+IHtcbiAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBBcHBseSBBQ1RJVkUgc3RhdHVzIHRvIGVuc2VtYmxlcyBpbiB0aGUgYWN0aXZlRW5zZW1ibGVOYW1lcyBzZXRcbiAgICBmb3IgKGNvbnN0IGVuc2VtYmxlIG9mIGVuc2VtYmxlcykge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5oYXMoZW5zZW1ibGUubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgLy8gQ2FsbCBhY3RpdmF0ZSgpIHRvIHNldCBzdGF0dXMgdG8gQUNUSVZFXG4gICAgICAgIGF3YWl0IGVuc2VtYmxlLmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuc2VtYmxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBlbnNlbWJsZSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbnNlbWJsZSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgQWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVFbnNlbWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBlbnNlbWJsZT86IEVuc2VtYmxlIH0+IHtcbiAgICAvLyBFdmljdCBzdGFsZSBjYWNoZSBiZWZvcmUgbG9va3VwIHNvIGV4dGVybmFsIGZpbGUgZWRpdHMgYXJlIHBpY2tlZCB1cCAoIzE4OTUpLlxuICAgIC8vIGZpbmRCeU5hbWUoKSBoaXRzIHRoZSBMUlUgY2FjaGUgZmlyc3QgYW5kIG5ldmVyIGNhbGxzIGxpc3QoKSwgc28gd2l0aG91dCB0aGlzXG4gICAgLy8gdGhlIHNjYW4gY29vbGRvd24gcHJldmVudHMgbXRpbWUtYmFzZWQgZXZpY3Rpb24gZnJvbSBydW5uaW5nLlxuICAgIGF3YWl0IHRoaXMuc2NhbkFuZEV2aWN0KCk7XG5cbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghZW5zZW1ibGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBNRU1PUlkgTEVBSyBGSVg6IENoZWNrIGlmIGNsZWFudXAgaXMgbmVlZGVkIGJlZm9yZSBhZGRpbmdcbiAgICB0aGlzLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpO1xuXG4gICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmFkZChlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFNldCBlbnNlbWJsZSBzdGF0dXMgdG8gYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmFjdGl2YXRlRW5zZW1ibGUnLFxuICAgICAgZGV0YWlsczogYEVuc2VtYmxlIGFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpLFxuICAgICAgZW5zZW1ibGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gZW5zZW1ibGUgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRW5zZW1ibGUgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIERlYWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgZGVhY3RpdmF0ZUVuc2VtYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGVuc2VtYmxlPzogRW5zZW1ibGUgfT4ge1xuICAgIC8vIE5vIHNjYW5BbmRFdmljdCgpIGhlcmUg4oCUIGludGVudGlvbmFsLiBEZWFjdGl2YXRpb24gb25seSBuZWVkcyB0aGUgZW5zZW1ibGUnc1xuICAgIC8vIG5hbWUgKHRvIHJlbW92ZSBmcm9tIGFjdGl2ZUVuc2VtYmxlTmFtZXMpIGFuZCBjYWxscyBkZWFjdGl2YXRlKCkgd2hpY2ggc2V0c1xuICAgIC8vIGEgc3RhdHVzIGZsYWcuIEl0IGRvZXMgbm90IGNvbnN1bWUgdGhlIGVsZW1lbnRzIGxpc3QsIHNvIHN0YWxlIGNhY2hlZCBlbGVtZW50XG4gICAgLy8gZGF0YSBoYXMgbm8gZWZmZWN0IG9uIGNvcnJlY3RuZXNzLiBDb21wYXJlIHdpdGggYWN0aXZhdGVFbnNlbWJsZSgpLCB3aGljaFxuICAgIC8vIGluZ2VzdHMgdGhlIGZ1bGwgZWxlbWVudCBsaXN0IHRvIG9yY2hlc3RyYXRlIHN1Yi1lbGVtZW50IGxvYWRpbmcgYW5kIG11c3RcbiAgICAvLyB0aGVyZWZvcmUgc2VlIHRoZSBsYXRlc3Qgb24tZGlzayBkZWZpbml0aW9uLiAoIzE4OTUpXG5cbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghZW5zZW1ibGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuZGVsZXRlKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gU2V0IGVuc2VtYmxlIHN0YXR1cyB0byBpbmFjdGl2ZVxuICAgIGF3YWl0IGVuc2VtYmxlLmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlYWN0aXZhdGVFbnNlbWJsZScsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgZGVhY3RpdmF0ZWQ6ICR7ZW5zZW1ibGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuZGVhY3RpdmF0ZWQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpLFxuICAgICAgZW5zZW1ibGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGVuc2VtYmxlc1xuICAgKlxuICAgKiBAcmV0dXJucyBMaXN0IG9mIGFjdGl2ZSBlbnNlbWJsZXNcbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZUVuc2VtYmxlcygpOiBQcm9taXNlPEVuc2VtYmxlW10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBFbnNlbWJsZVtdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcykge1xuICAgICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICBpZiAoZW5zZW1ibGUpIHJlc3VsdHMucHVzaChlbnNlbWJsZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFjdGl2ZSBzZXQgY2xlYW51cCBpcyBuZWVkZWQgYW5kIHBlcmZvcm0gY2xlYW51cCBpZiBuZWNlc3NhcnlcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdlbnNlbWJsZXMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBlbnNlbWJsZXMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGVuc2VtYmxlcyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0VOU0VNQkxFUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGVuc2VtYmxlcyBsaW1pdCByZWFjaGVkOiAke3RoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplfS8ke21heH1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBlbnNlbWJsZXMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplO1xuICAgICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0Vuc2VtYmxlTmFtZXMgPSBuZXcgU2V0KGVuc2VtYmxlcy5tYXAoZSA9PiBlLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0Vuc2VtYmxlTmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBlbnNlbWJsZSByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgZW5zZW1ibGVzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2Vuc2VtYmxlcycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGVuc2VtYmxlIHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGVuc2VtYmxlczonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "2.0.30";
6
- export declare const BUILD_TIMESTAMP = "2026-04-21T21:44:37.532Z";
5
+ export declare const PACKAGE_VERSION = "2.0.32";
6
+ export declare const BUILD_TIMESTAMP = "2026-04-23T05:37:29.058Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '2.0.30';
6
- export const BUILD_TIMESTAMP = '2026-04-21T21:44:37.532Z';
5
+ export const PACKAGE_VERSION = '2.0.32';
6
+ export const BUILD_TIMESTAMP = '2026-04-23T05:37:29.058Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMzAnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTIxVDIxOjQ0OjM3LjUzMlonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMzInO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTIzVDA1OjM3OjI5LjA1OFonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==