@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -156,6 +156,35 @@ function validateLogQueryParams(params) {
156
156
  }
157
157
  return options;
158
158
  }
159
+ const VALID_METRIC_TYPES = new Set(['counter', 'gauge', 'histogram']);
160
+ function validateMetricQueryParams(params) {
161
+ const options = {};
162
+ if (Array.isArray(params.names)) {
163
+ options.names = params.names.filter((n) => typeof n === 'string');
164
+ }
165
+ if (typeof params.source === 'string') {
166
+ options.source = params.source;
167
+ }
168
+ if (typeof params.type === 'string' && VALID_METRIC_TYPES.has(params.type)) {
169
+ options.type = params.type;
170
+ }
171
+ if (typeof params.since === 'string') {
172
+ options.since = params.since;
173
+ }
174
+ if (typeof params.until === 'string') {
175
+ options.until = params.until;
176
+ }
177
+ if (typeof params.latest === 'boolean') {
178
+ options.latest = params.latest;
179
+ }
180
+ if (typeof params.limit === 'number' && Number.isFinite(params.limit)) {
181
+ options.limit = params.limit;
182
+ }
183
+ if (typeof params.offset === 'number' && Number.isFinite(params.offset)) {
184
+ options.offset = params.offset;
185
+ }
186
+ return options;
187
+ }
159
188
  // ============================================================================
160
189
  // Verification Security Utilities (Issue #142 — PR #478 review follow-ups)
161
190
  // ============================================================================
@@ -578,6 +607,13 @@ export class MCPAQLHandler {
578
607
  activeElements,
579
608
  skipElementPolicies: isGatekeeperInfraOperation(operation),
580
609
  });
610
+ // Record Gatekeeper decision for metrics
611
+ this.handlers.gatekeeperMetricsTracker?.record({
612
+ allowed: decision.allowed,
613
+ permissionLevel: decision.permissionLevel,
614
+ policySource: decision.policySource,
615
+ confirmationPending: decision.confirmationPending,
616
+ });
581
617
  if (!decision.allowed) {
582
618
  if (decision.confirmationPending) {
583
619
  // Issue #1653: Auto-confirm when the host (Claude Code, etc.) has already
@@ -670,25 +706,35 @@ export class MCPAQLHandler {
670
706
  // Transform name → element_name for LLM consistency
671
707
  // Apply field filtering if fields param provided
672
708
  const data = this.applyFieldSelection(rawData, params);
673
- // Step 6: Log successful operation and return result
674
- SecurityMonitor.logSecurityEvent({
675
- type: 'OPERATION_COMPLETED',
676
- severity: 'LOW',
677
- source: `MCPAQLHandler.${endpoint.toLowerCase()}`,
678
- details: `${endpoint} '${operation}' completed on ${elementType || 'unspecified'}`,
679
- additionalData: {
680
- endpoint,
681
- operation,
682
- elementType,
683
- parameterKeys: params ? Object.keys(params) : [],
684
- }
685
- });
709
+ // Step 6: Log successful operation only mutations are security-relevant
710
+ if (endpoint !== 'READ') {
711
+ SecurityMonitor.logSecurityEvent({
712
+ type: 'OPERATION_COMPLETED',
713
+ severity: 'LOW',
714
+ source: `MCPAQLHandler.${endpoint.toLowerCase()}`,
715
+ details: elementType
716
+ ? `${endpoint} '${operation}' completed on ${elementType}`
717
+ : `${endpoint} '${operation}' completed`,
718
+ additionalData: {
719
+ endpoint,
720
+ operation,
721
+ elementType,
722
+ parameterKeys: params ? Object.keys(params) : [],
723
+ }
724
+ });
725
+ }
726
+ const durationMs = performance.now() - startTime;
727
+ this.handlers.operationMetricsTracker?.record(operationName, endpoint, durationMs, true);
728
+ const typeSuffix = elementType ? ':' + elementType : '';
729
+ logger.debug(`[MCP-AQL] ${endpoint} ${operation}${typeSuffix} (${durationMs.toFixed(1)}ms)`);
686
730
  return this.success(data, startTime);
687
731
  }
688
732
  catch (error) {
689
733
  // Catch all errors and return as OperationFailure
690
734
  const message = error instanceof Error ? error.message : String(error);
691
735
  const isSecurityViolation = message.includes('Security violation');
736
+ const durationMs = performance.now() - startTime;
737
+ this.handlers.operationMetricsTracker?.record(operationName, endpoint, durationMs, false);
692
738
  // Log security events with appropriate severity
693
739
  SecurityMonitor.logSecurityEvent({
694
740
  type: isSecurityViolation ? 'UPDATE_SECURITY_VIOLATION' : 'OPERATION_FAILED',
@@ -886,6 +932,10 @@ export class MCPAQLHandler {
886
932
  if (module === 'Logging') {
887
933
  return this.dispatchLogging(method, params);
888
934
  }
935
+ // Metrics operations (CRUDE-routed query_metrics)
936
+ if (module === 'Metrics') {
937
+ return this.dispatchMetrics(method, params);
938
+ }
889
939
  // Browser operations (Issue #774: open portfolio browser)
890
940
  if (module === 'Browser') {
891
941
  return this.dispatchBrowser(method);
@@ -1413,6 +1463,8 @@ export class MCPAQLHandler {
1413
1463
  * @returns Search results with matched elements and relevance info
1414
1464
  */
1415
1465
  async handleSearchElements(input) {
1466
+ const searchStart = performance.now();
1467
+ const memoryBefore = process.memoryUsage().heapUsed;
1416
1468
  const { elementType, params } = input;
1417
1469
  const p = params;
1418
1470
  const query = p.query?.trim();
@@ -1482,6 +1534,17 @@ export class MCPAQLHandler {
1482
1534
  logger.debug(`Failed to load elements for search: ${type}`, { error });
1483
1535
  }
1484
1536
  }
1537
+ // Record search metrics via PerformanceMonitor
1538
+ this.handlers.performanceMonitor?.recordSearch({
1539
+ query,
1540
+ duration: performance.now() - searchStart,
1541
+ resultCount: allResults.length,
1542
+ sources: elementTypes,
1543
+ cacheHit: false,
1544
+ memoryBefore,
1545
+ memoryAfter: process.memoryUsage().heapUsed,
1546
+ timestamp: new Date(),
1547
+ });
1485
1548
  // Sort results (currently only 'name' is supported as a sort field)
1486
1549
  const sortedResults = [...allResults].sort((a, b) => {
1487
1550
  const cmp = a.name.toLowerCase().localeCompare(b.name.toLowerCase());
@@ -2199,6 +2262,16 @@ export class MCPAQLHandler {
2199
2262
  policyContext: elementDecision.policyContext,
2200
2263
  };
2201
2264
  }
2265
+ case 'evaluatePermission': {
2266
+ // Evaluate CLI permission for PreToolUse hooks (all platforms)
2267
+ const { evaluatePermission } = await import('./evaluatePermission.js');
2268
+ return evaluatePermission(params, {
2269
+ permissionPromptLimiter: this.permissionPromptLimiter,
2270
+ classifyTool,
2271
+ evaluateCliToolPolicy,
2272
+ getActiveElements: () => this.getActiveElements(),
2273
+ });
2274
+ }
2202
2275
  case 'getEffectiveCliPolicies': {
2203
2276
  // Issue #625 Phase 2: Get effective CLI permission policies
2204
2277
  const toolName = params.tool_name;
@@ -2314,6 +2387,29 @@ export class MCPAQLHandler {
2314
2387
  throw new Error(`Unknown Logging method: ${method}`);
2315
2388
  }
2316
2389
  }
2390
+ /**
2391
+ * Dispatch Metrics operations.
2392
+ *
2393
+ * Routes query_metrics through the unified CRUDE pipeline, providing
2394
+ * operation routing, gatekeeper policy enforcement, and structured response format.
2395
+ */
2396
+ dispatchMetrics(method, params) {
2397
+ if (!this.handlers.metricsSink) {
2398
+ return {
2399
+ _type: 'MetricQueryResult',
2400
+ snapshots: [],
2401
+ total: 0,
2402
+ hasMore: false,
2403
+ message: 'Metrics collection is not enabled. Set DOLLHOUSE_METRICS_ENABLED=true to activate.',
2404
+ };
2405
+ }
2406
+ if (method === 'query') {
2407
+ const options = validateMetricQueryParams(params);
2408
+ const result = this.handlers.metricsSink.query(options);
2409
+ return { _type: 'MetricQueryResult', ...result };
2410
+ }
2411
+ throw new Error(`Unknown Metrics method: ${method}`);
2412
+ }
2317
2413
  /**
2318
2414
  * Dispatch Browser operations (Issue #774: open portfolio browser)
2319
2415
  */
@@ -3321,4 +3417,4 @@ function resolveCliApprovalPolicy(activeElements) {
3321
3417
  ttlSeconds,
3322
3418
  };
3323
3419
  }
3324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNCLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkksT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFNTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBSXBCLGNBQWMsRUFDZCwwQkFBMEIsR0FDM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxP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KipcbiAqIE1DUEFRTEhhbmRsZXIgLSBVbmlmaWVkIGhhbmRsZXIgZm9yIGFsbCBNQ1AtQVFMIG9wZXJhdGlvbnNcbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIFRoaW4gcmVzb2x2ZXIgcGF0dGVybjogdmFsaWRhdGVzIOKGkiByb3V0ZXMg4oaSIGRpc3BhdGNoZXNcbiAqIC0gU09MSUQgcHJpbmNpcGxlczogZGVwZW5kcyBvbiBhYnN0cmFjdGlvbnMgKEhhbmRsZXJSZWdpc3RyeSBpbnRlcmZhY2UpXG4gKiAtIERlZmVuc2UgaW4gZGVwdGg6IEdhdGVrZWVwZXIgdmFsaWRhdGVzIGVuZHBvaW50L29wZXJhdGlvbiBtYXRjaGluZyBhbmQgZW5mb3JjZXMgcG9saWNpZXNcbiAqIC0gRGlzcGF0Y2ggcGF0dGVybjogcm91dGVzIGhhbmRsZXIgcmVmZXJlbmNlcyB0byBhY3R1YWwgbWV0aG9kIGNhbGxzXG4gKlxuICogT1BFUkFUSU9OIEZMT1c6XG4gKiAxLiBWYWxpZGF0ZSBpbnB1dCBzdHJ1Y3R1cmUgKHR5cGUgZ3VhcmRzKVxuICogMi4gVmFsaWRhdGUgcGVybWlzc2lvbnMgKEdhdGVrZWVwZXIpXG4gKiAzLiBSb3V0ZSBvcGVyYXRpb24gKE9wZXJhdGlvblJvdXRlcilcbiAqIDQuIERpc3BhdGNoIHRvIGhhbmRsZXIgKHJlc29sdmVIYW5kbGVyUmVmZXJlbmNlKVxuICogNS4gUmV0dXJuIHN0YW5kYXJkaXplZCByZXN1bHQgKE9wZXJhdGlvblJlc3VsdClcbiAqXG4gKiBFUlJPUiBIQU5ETElORzpcbiAqIEFsbCBlcnJvcnMgYXJlIGNhdWdodCBhbmQgcmV0dXJuZWQgYXMgT3BlcmF0aW9uRmFpbHVyZSB3aXRoOlxuICogLSBzdWNjZXNzOiBmYWxzZVxuICogLSBlcnJvcjogaHVtYW4tcmVhZGFibGUgbWVzc2FnZVxuICogLSBkYXRhOiBuZXZlciAoZGlzY3JpbWluYXRlZCB1bmlvbiBlbmZvcmNlcyB0aGlzKVxuICovXG5cbmltcG9ydCB7IENSVURFbmRwb2ludCB9IGZyb20gJy4vT3BlcmF0aW9uUm91dGVyLmpzJztcbmltcG9ydCB7IEdhdGVrZWVwZXIgfSBmcm9tICcuL0dhdGVrZWVwZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBBY3RpdmVFbGVtZW50LCB0cmFuc2xhdGVUb29sQ29uZmlnVG9Qb2xpY3ksIGNhbk9wZXJhdGlvbkJlRWxldmF0ZWQgfSBmcm9tICcuL3BvbGljaWVzL2luZGV4LmpzJztcbmltcG9ydCB7IGlzR2F0ZWtlZXBlckluZnJhT3BlcmF0aW9uLCBmaW5kQ29uZmlybURlbnlpbmdFbGVtZW50LCBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMgfSBmcm9tICcuL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uTGV2ZWwsIEdhdGVrZWVwZXJFcnJvckNvZGUgfSBmcm9tICcuL0dhdGVrZWVwZXJUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRSb3V0ZSB9IGZyb20gJy4vT3BlcmF0aW9uUm91dGVyLmpzJztcbmltcG9ydCB7IEFMTF9PUEVSQVRJT05fU0NIRU1BUyB9IGZyb20gJy4vT3BlcmF0aW9uU2NoZW1hLmpzJztcbmltcG9ydCB7IEludHJvc3BlY3Rpb25SZXNvbHZlciB9IGZyb20gJy4vSW50cm9zcGVjdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IFNjaGVtYURpc3BhdGNoZXIgfSBmcm9tICcuL1NjaGVtYURpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZU5vcm1hbGl6ZXJzIH0gZnJvbSAnLi9ub3JtYWxpemVycy9pbmRleC5qcyc7XG5pbXBvcnQgeyBmaWx0ZXJGaWVsZHMsIGlzVmFsaWRQcmVzZXQsIG5vcm1hbGl6ZUZpZWxkTmFtZXMgfSBmcm9tICcuLi8uLi91dGlscy9GaWVsZEZpbHRlci5qcyc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25JbnB1dCxcbiAgT3BlcmF0aW9uUmVzdWx0LFxuICBPcGVyYXRpb25TdWNjZXNzLFxuICBPcGVyYXRpb25GYWlsdXJlLFxuICBSZXNwb25zZU1ldGEsXG4gIHBhcnNlT3BlcmF0aW9uSW5wdXQsXG4gIGRlc2NyaWJlSW52YWxpZElucHV0LFxuICBCYXRjaFJlcXVlc3QsXG4gIEJhdGNoUmVzdWx0LFxuICBCYXRjaE9wZXJhdGlvblJlc3VsdCxcbiAgaXNCYXRjaFJlcXVlc3QsXG4gIG5vcm1hbGl6ZU1DUEFRTEVsZW1lbnRUeXBlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBpc1NlYXJjaE1hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VhcmNoVXRpbHMuanMnO1xuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9QYWdpbmF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbGVtZW50VHlwZSwgQUxMX0VMRU1FTlRfVFlQRVMsIGZvcm1hdEVsZW1lbnRUeXBlc0xpc3QgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlUb29sLCBldmFsdWF0ZUNsaVRvb2xQb2xpY3ksIGFzc2Vzc1Jpc2sgfSBmcm9tICcuL3BvbGljaWVzL1Rvb2xDbGFzc2lmaWNhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IENsaUFwcHJvdmFsU2NvcGUsIENsaUFwcHJvdmFsUG9saWN5IH0gZnJvbSAnLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vdXRpbHMvUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgeyBTVE9SQUdFX0xBWUVSX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBEYW5nZXJab25lRW5mb3JjZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9EYW5nZXJab25lRW5mb3JjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBWZXJpZmljYXRpb25TdG9yZSB9IGZyb20gJ0Bkb2xsaG91c2VtY3Avc2FmZXR5JztcbmltcG9ydCB0eXBlIHsgSVZlcmlmaWNhdGlvbk5vdGlmaWVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvVmVyaWZpY2F0aW9uTm90aWZpZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEaXNwbGF5Q29kZSB9IGZyb20gJ0Bkb2xsaG91c2VtY3Avc2FmZXR5JztcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRDUlVESGFuZGxlciB9IGZyb20gJy4uL0VsZW1lbnRDUlVESGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFnZW50TWV0YWRhdGFWMiwgQWdlbnRSZXNpbGllbmNlUG9saWN5LCBBZ2VudE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy90eXBlcy5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZVJlc2lsaWVuY2VQb2xpY3ksIGNpcmN1aXRCcmVha2VyLCB0eXBlIFJlc2lsaWVuY2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL3Jlc2lsaWVuY2VFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHsgcmVzaWxpZW5jZU1ldHJpY3MgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvcmVzaWxpZW5jZU1ldHJpY3MuanMnO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZVJlbmRlcmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvVGVtcGxhdGVSZW5kZXJlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9FbGVtZW50UXVlcnlTZXJ2aWNlLmpzJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUVsZW1lbnRzLCB2YWxpZGF0ZUFnZ3JlZ2F0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXJ5L0FnZ3JlZ2F0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IElFbGVtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gJy4uL1BvcnRmb2xpb0hhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBHaXRIdWJBdXRoSGFuZGxlciB9IGZyb20gJy4uL0dpdEh1YkF1dGhIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnSGFuZGxlciB9IGZyb20gJy4uL0NvbmZpZ0hhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZEluZGV4SGFuZGxlciB9IGZyb20gJy4uL0VuaGFuY2VkSW5kZXhIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUGVyc29uYUhhbmRsZXIgfSBmcm9tICcuLi9QZXJzb25hSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN5bmNIYW5kbGVyIH0gZnJvbSAnLi4vU3luY0hhbmRsZXJWMi5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9CdWlsZEluZm9TZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IExvZ1F1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvdHlwZXMuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBwcmVwYXJlSGFuZG9mZlN0YXRlLCBwYXJzZUhhbmRvZmZCbG9jaywgZ2VuZXJhdGVIYW5kb2ZmQmxvY2sgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvaGFuZG9mZi5qcyc7XG5pbXBvcnQgeyBnZXRBdXRvbm9teU1ldHJpY3MgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBBdXRvbm9teU1ldHJpY3NTbmFwc2hvdCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhcmFtZXRlciBWYWxpZGF0aW9uIFV0aWxpdGllcyAoSXNzdWUgIzMyMylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgZXh0cmFjdCBhIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZnJvbSBwYXJhbXMuXG4gKiBUaHJvd3MgYSB1c2VyLWZyaWVuZGx5IGVycm9yIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbWlzc2luZyBvciBub3QgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEBwYXJhbSBwYXJhbU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgc3RyaW5nIHZhbHVlXG4gKiBAdGhyb3dzIEVycm9yIHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGFyYW1OYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zW3BhcmFtTmFtZV07XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnJHtwYXJhbU5hbWV9Jy4gRXhwZWN0ZWQ6IHN0cmluZyAoJHtkZXNjcmlwdGlvbn0pYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIGludG8gYSB7IHBhZ2UsIHBhZ2VTaXplIH0gb2JqZWN0LlxuICpcbiAqIElzc3VlICM1MDA6IHF1ZXJ5X2VsZW1lbnRzIGFuZCBzZWFyY2hfZWxlbWVudHMgc2lsZW50bHkgaWdub3JlZCBmbGF0XG4gKiBwYWdlU2l6ZS9wYWdlL2xpbWl0L29mZnNldCBwYXJhbXMuIFRoaXMgaGVscGVyIGRldGVjdHMgdGhlc2UgYXQgdGhlXG4gKiB0b3AgbGV2ZWwgYW5kIG5vcm1hbGl6ZXMgdGhlbSwgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gdXNlZCBieSBsaXN0RWxlbWVudHMuXG4gKlxuICogUHJpb3JpdHk6IG5lc3RlZCBwYWdpbmF0aW9uID4gbGltaXQvb2Zmc2V0ID4gZmxhdCBwYWdlL3BhZ2VTaXplID4gZGVmYXVsdHNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhcbiAgcGFyYW1zOiB7XG4gICAgcGFnaW5hdGlvbj86IHsgcGFnZT86IG51bWJlcjsgcGFnZVNpemU/OiBudW1iZXIgfTtcbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIHBhZ2VTaXplPzogbnVtYmVyO1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9XG4pOiB7IHBhZ2U6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9IHtcbiAgLy8gSWYgbmVzdGVkIHBhZ2luYXRpb24gaXMgcHJlc2VudCwgdXNlIGl0IGRpcmVjdGx5XG4gIGlmIChwYXJhbXMucGFnaW5hdGlvbiAmJiB0eXBlb2YgcGFyYW1zLnBhZ2luYXRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcCA9IHBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlOiAodHlwZW9mIHAucGFnZSA9PT0gJ251bWJlcicgJiYgcC5wYWdlID4gMCkgPyBwLnBhZ2UgOiAxLFxuICAgICAgcGFnZVNpemU6ICh0eXBlb2YgcC5wYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgcC5wYWdlU2l6ZSA+IDApID8gcC5wYWdlU2l6ZSA6IDIwLFxuICAgIH07XG4gIH1cblxuICBsZXQgcGFnZSA9IDE7XG4gIGxldCBwYWdlU2l6ZSA9IDIwO1xuXG4gIC8vIFN1cHBvcnQgbGltaXQvb2Zmc2V0IHN0eWxlIChjb252ZXJ0IHRvIHBhZ2UvcGFnZVNpemUpXG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBwYXJhbXMubGltaXQgPiAwKSB7XG4gICAgcGFnZVNpemUgPSBwYXJhbXMubGltaXQ7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBwYXJhbXMub2Zmc2V0ID49IDApIHtcbiAgICAgIHBhZ2UgPSBNYXRoLmZsb29yKHBhcmFtcy5vZmZzZXQgLyBwYXJhbXMubGltaXQpICsgMTtcbiAgICB9XG4gIH1cblxuICAvLyBTdXBwb3J0IGZsYXQgcGFnZS9wYWdlU2l6ZSAob3ZlcnJpZGVzIGxpbWl0L29mZnNldCBpZiBib3RoIHByZXNlbnQpXG4gIGlmICh0eXBlb2YgcGFyYW1zLnBhZ2UgPT09ICdudW1iZXInICYmIHBhcmFtcy5wYWdlID4gMCkge1xuICAgIHBhZ2UgPSBwYXJhbXMucGFnZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5wYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgcGFyYW1zLnBhZ2VTaXplID4gMCkge1xuICAgIHBhZ2VTaXplID0gcGFyYW1zLnBhZ2VTaXplO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFnZSwgcGFnZVNpemUgfTtcbn1cblxuLyoqXG4gKiBWYWxpZCBsb2cgY2F0ZWdvcmllcyBhY2NlcHRlZCBieSBMb2dRdWVyeU9wdGlvbnMuXG4gKiBNYXRjaGVzIHRoZSBMb2dDYXRlZ29yeSB1bmlvbiB0eXBlIHBsdXMgdGhlICdhbGwnIHdpbGRjYXJkLlxuICovXG5jb25zdCBWQUxJRF9MT0dfQ0FURUdPUklFUyA9IG5ldyBTZXQoWydhcHBsaWNhdGlvbicsICdzZWN1cml0eScsICdwZXJmb3JtYW5jZScsICd0ZWxlbWV0cnknLCAnYWxsJ10pO1xuXG4vKipcbiAqIFZhbGlkIGxvZyBsZXZlbHMgYWNjZXB0ZWQgYnkgTG9nUXVlcnlPcHRpb25zLlxuICogTWF0Y2hlcyB0aGUgTG9nTGV2ZWwgdW5pb24gdHlwZS5cbiAqL1xuY29uc3QgVkFMSURfTE9HX0xFVkVMUyA9IG5ldyBTZXQoWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSk7XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIHJhdyBwYXJhbXMgaW50byBhIHNhZmUgTG9nUXVlcnlPcHRpb25zIG9iamVjdC5cbiAqIFN0cmlwcyB1bmtub3duIGtleXMsIHZhbGlkYXRlcyB0eXBlcyBvZiBrbm93biBmaWVsZHMsIGFuZCByZXR1cm5zXG4gKiBvbmx5IHdlbGwtdHlwZWQgdmFsdWVzLiBJbnZhbGlkIGZpZWxkcyBhcmUgc2lsZW50bHkgZHJvcHBlZCBzaW5jZVxuICogYWxsIExvZ1F1ZXJ5T3B0aW9ucyBmaWVsZHMgYXJlIG9wdGlvbmFsLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBSYXcgcGFyYW1zIGZyb20gdGhlIE1DUCByZXF1ZXN0XG4gKiBAcmV0dXJucyBWYWxpZGF0ZWQgTG9nUXVlcnlPcHRpb25zIHdpdGggb25seSB2YWxpZCBmaWVsZHNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2dRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTG9nUXVlcnlPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogTG9nUXVlcnlPcHRpb25zID0ge307XG5cbiAgaWYgKHR5cGVvZiBwYXJhbXMuY2F0ZWdvcnkgPT09ICdzdHJpbmcnICYmIFZBTElEX0xPR19DQVRFR09SSUVTLmhhcyhwYXJhbXMuY2F0ZWdvcnkpKSB7XG4gICAgb3B0aW9ucy5jYXRlZ29yeSA9IHBhcmFtcy5jYXRlZ29yeSBhcyBMb2dRdWVyeU9wdGlvbnNbJ2NhdGVnb3J5J107XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGV2ZWwgPT09ICdzdHJpbmcnICYmIFZBTElEX0xPR19MRVZFTFMuaGFzKHBhcmFtcy5sZXZlbCkpIHtcbiAgICBvcHRpb25zLmxldmVsID0gcGFyYW1zLmxldmVsIGFzIExvZ1F1ZXJ5T3B0aW9uc1snbGV2ZWwnXTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zb3VyY2UgPSBwYXJhbXMuc291cmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc2luY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zaW5jZSA9IHBhcmFtcy5zaW5jZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy51bnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnVudGlsID0gcGFyYW1zLnVudGlsO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLmxpbWl0KSkge1xuICAgIG9wdGlvbnMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLm9mZnNldCkpIHtcbiAgICBvcHRpb25zLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLmNvcnJlbGF0aW9uSWQgPSBwYXJhbXMuY29ycmVsYXRpb25JZDtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWZXJpZmljYXRpb24gU2VjdXJpdHkgVXRpbGl0aWVzIChJc3N1ZSAjMTQyIOKAlCBQUiAjNDc4IHJldmlldyBmb2xsb3ctdXBzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogVVVJRCB2NCBmb3JtYXQ6IDgtNC00LTQtMTIgaGV4IGRpZ2l0cyB3aXRoIHZlcnNpb24gNCBtYXJrZXIgYW5kIHZhcmlhbnQgYml0cyAqL1xuY29uc3QgVVVJRF9WNF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tNFswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvaTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgY2hhbGxlbmdlIElEIGlzIGEgdmFsaWQgVVVJRCB2NCBmb3JtYXQuXG4gKiBDaGFsbGVuZ2UgSURzIGFyZSBnZW5lcmF0ZWQgYnkgY3J5cHRvLnJhbmRvbVVVSUQoKSBhbmQgbXVzdCBjb25mb3JtLlxuICogUmVqZWN0cyBvYnZpb3VzbHkgaW52YWxpZCBJRHMgYmVmb3JlIGhpdHRpbmcgdGhlIHN0b3JlIHRvIHByZXZlbnQgZW51bWVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIVVVSURfVjRfUkVHRVgudGVzdChjaGFsbGVuZ2VJZCkpIHtcbiAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICBgSW52YWxpZCBjaGFsbGVuZ2VfaWQgZm9ybWF0LiBFeHBlY3RlZCBVVUlEIHY0IChlLmcuLCBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiKS5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cnVjdHVyZWQgdmVyaWZpY2F0aW9uIGVycm9yIHdpdGggR2F0ZWtlZXBlciBlcnJvciBjb2RlLlxuICogRW5hYmxlcyBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nIGFsaWduZWQgd2l0aCBleGlzdGluZyBHYXRla2VlcGVyIHBhdHRlcm5zLlxuICovXG5jbGFzcyBWZXJpZmljYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdWZXJpZmljYXRpb25FcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBHbG9iYWwgcmF0ZSBsaW1pdGVyIGZvciB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuXG4gKiBUcmFja3MgZmFpbGVkIGF0dGVtcHRzIHdpdGhpbiBhIHNsaWRpbmcgd2luZG93IHRvIHByZXZlbnQgYnJ1dGUtZm9yY2UgYXR0YWNrcy5cbiAqXG4gKiBEZXNpZ246IFNpbmNlIHZlcmlmaWNhdGlvbiBjb2RlcyBhcmUgb25lLXRpbWUtdXNlIChkZWxldGVkIG9uIGFueSBhdHRlbXB0KSxcbiAqIHRoZSByZWFsIGF0dGFjayB2ZWN0b3IgaXMgcmVwZWF0ZWQgY2hhbGxlbmdlIGNyZWF0aW9uICsgaW1tZWRpYXRlIGF0dGVtcHQuXG4gKiBUaGlzIGxpbWl0ZXIgY2FwcyB0b3RhbCBmYWlsdXJlcyBhY3Jvc3MgYWxsIGNoYWxsZW5nZXMgd2l0aGluIGEgdGltZSB3aW5kb3cuXG4gKi9cbmNsYXNzIFZlcmlmaWNhdGlvblJhdGVMaW1pdGVyIHtcbiAgcHJpdmF0ZSBmYWlsdXJlczogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heEZhaWx1cmVzOiBudW1iZXIgPSAxMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd01zOiBudW1iZXIgPSA2MF8wMDAsXG4gICkge31cblxuICAvKiogUmVjb3JkIGEgZmFpbGVkIHZlcmlmaWNhdGlvbiBhdHRlbXB0LiBSZXR1cm5zIHRydWUgaWYgcmF0ZSBsaW1pdCBpcyBleGNlZWRlZC4gKi9cbiAgcmVjb3JkRmFpbHVyZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuZmFpbHVyZXMucHVzaChub3cpO1xuICAgIHRoaXMucHJ1bmUobm93KTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGggPiB0aGlzLm1heEZhaWx1cmVzO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHJhdGUgbGltaXQgaXMgY3VycmVudGx5IGV4Y2VlZGVkIHdpdGhvdXQgcmVjb3JkaW5nLiAqL1xuICBpc0xpbWl0ZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5wcnVuZShEYXRlLm5vdygpKTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGggPiB0aGlzLm1heEZhaWx1cmVzO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBlbnRyaWVzIG91dHNpZGUgdGhlIHNsaWRpbmcgd2luZG93LiAqL1xuICBwcml2YXRlIHBydW5lKG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3V0b2ZmID0gbm93IC0gdGhpcy53aW5kb3dNcztcbiAgICB3aGlsZSAodGhpcy5mYWlsdXJlcy5sZW5ndGggPiAwICYmIHRoaXMuZmFpbHVyZXNbMF0gPCBjdXRvZmYpIHtcbiAgICAgIHRoaXMuZmFpbHVyZXMuc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3VycmVudCBmYWlsdXJlIGNvdW50IGluIHdpbmRvdyAoZm9yIG1ldHJpY3MpLiAqL1xuICBnZXQgZmFpbHVyZXNJbldpbmRvdygpOiBudW1iZXIge1xuICAgIHRoaXMucHJ1bmUoRGF0ZS5ub3coKSk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJlc2V0IChmb3IgdGVzdGluZykuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZmFpbHVyZXMgPSBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWNhdGlvbiBtZXRyaWNzIHRyYWNrZXIgZm9sbG93aW5nIERhbmdlclpvbmVFbmZvcmNlci5nZXRNZXRyaWNzKCkgcGF0dGVybi5cbiAqIFRyYWNrcyBzdWNjZXNzL2ZhaWx1cmUvZXhwaXJ5IHJhdGVzIGFuZCB0aW1lLXRvLXZlcmlmeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgLyoqIFRvdGFsIHZlcmlmeV9jaGFsbGVuZ2UgY2FsbHMgc2luY2Ugc3RhcnR1cCAqL1xuICB0b3RhbEF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKiBTdWNjZXNzZnVsIHZlcmlmaWNhdGlvbnMgKi9cbiAgdG90YWxTdWNjZXNzZXM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCB2ZXJpZmljYXRpb25zICh3cm9uZyBjb2RlKSAqL1xuICB0b3RhbEZhaWx1cmVzOiBudW1iZXI7XG4gIC8qKiBFeHBpcmVkIGNoYWxsZW5nZSBhdHRlbXB0cyAqL1xuICB0b3RhbEV4cGlyZWQ6IG51bWJlcjtcbiAgLyoqIEludmFsaWQgZm9ybWF0IGF0dGVtcHRzIChyZWplY3RlZCBiZWZvcmUgc3RvcmUgbG9va3VwKSAqL1xuICB0b3RhbEludmFsaWRGb3JtYXQ6IG51bWJlcjtcbiAgLyoqIFJhdGUtbGltaXRlZCBhdHRlbXB0cyAqL1xuICB0b3RhbFJhdGVMaW1pdGVkOiBudW1iZXI7XG4gIC8qKiBBdmVyYWdlIHRpbWUgZnJvbSBjaGFsbGVuZ2UgY3JlYXRpb24gdG8gc3VjY2Vzc2Z1bCB2ZXJpZnkgKG1zKSAqL1xuICBhdmVyYWdlVGltZVRvVmVyaWZ5TXM6IG51bWJlcjtcbiAgLyoqIEN1cnJlbnQgZmFpbHVyZXMgaW4gcmF0ZS1saW1pdCB3aW5kb3cgKi9cbiAgZmFpbHVyZXNJbkN1cnJlbnRXaW5kb3c6IG51bWJlcjtcbn1cblxuY2xhc3MgVmVyaWZpY2F0aW9uTWV0cmljc1RyYWNrZXIge1xuICBwcml2YXRlIF90b3RhbEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxTdWNjZXNzZXMgPSAwO1xuICBwcml2YXRlIF90b3RhbEZhaWx1cmVzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxFeHBpcmVkID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxJbnZhbGlkRm9ybWF0ID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxSYXRlTGltaXRlZCA9IDA7XG4gIHByaXZhdGUgdmVyaWZ5RHVyYXRpb25zOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfRFVSQVRJT05TID0gMTAwMDtcblxuICByZWNvcmRBdHRlbXB0KCk6IHZvaWQgeyB0aGlzLl90b3RhbEF0dGVtcHRzKys7IH1cbiAgcmVjb3JkU3VjY2VzcyhkdXJhdGlvbk1zPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG90YWxTdWNjZXNzZXMrKztcbiAgICBpZiAoZHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkICYmIGR1cmF0aW9uTXMgPj0gMCkge1xuICAgICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMucHVzaChkdXJhdGlvbk1zKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmeUR1cmF0aW9ucy5sZW5ndGggPiBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlci5NQVhfRFVSQVRJT05TKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5RHVyYXRpb25zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlY29yZEZhaWx1cmUoKTogdm9pZCB7IHRoaXMuX3RvdGFsRmFpbHVyZXMrKzsgfVxuICByZWNvcmRFeHBpcmVkKCk6IHZvaWQgeyB0aGlzLl90b3RhbEV4cGlyZWQrKzsgfVxuICByZWNvcmRJbnZhbGlkRm9ybWF0KCk6IHZvaWQgeyB0aGlzLl90b3RhbEludmFsaWRGb3JtYXQrKzsgfVxuICByZWNvcmRSYXRlTGltaXRlZCgpOiB2b2lkIHsgdGhpcy5fdG90YWxSYXRlTGltaXRlZCsrOyB9XG5cbiAgZ2V0TWV0cmljcyhyYXRlTGltaXRlcjogVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIpOiBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgICBjb25zdCBhdmdEdXJhdGlvbiA9IHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gTWF0aC5yb3VuZCh0aGlzLnZlcmlmeUR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aClcbiAgICAgIDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxBdHRlbXB0czogdGhpcy5fdG90YWxBdHRlbXB0cyxcbiAgICAgIHRvdGFsU3VjY2Vzc2VzOiB0aGlzLl90b3RhbFN1Y2Nlc3NlcyxcbiAgICAgIHRvdGFsRmFpbHVyZXM6IHRoaXMuX3RvdGFsRmFpbHVyZXMsXG4gICAgICB0b3RhbEV4cGlyZWQ6IHRoaXMuX3RvdGFsRXhwaXJlZCxcbiAgICAgIHRvdGFsSW52YWxpZEZvcm1hdDogdGhpcy5fdG90YWxJbnZhbGlkRm9ybWF0LFxuICAgICAgdG90YWxSYXRlTGltaXRlZDogdGhpcy5fdG90YWxSYXRlTGltaXRlZCxcbiAgICAgIGF2ZXJhZ2VUaW1lVG9WZXJpZnlNczogYXZnRHVyYXRpb24sXG4gICAgICBmYWlsdXJlc0luQ3VycmVudFdpbmRvdzogcmF0ZUxpbWl0ZXIuZmFpbHVyZXNJbldpbmRvdyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlc2V0IChmb3IgdGVzdGluZykuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3RvdGFsQXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMuX3RvdGFsU3VjY2Vzc2VzID0gMDtcbiAgICB0aGlzLl90b3RhbEZhaWx1cmVzID0gMDtcbiAgICB0aGlzLl90b3RhbEV4cGlyZWQgPSAwO1xuICAgIHRoaXMuX3RvdGFsSW52YWxpZEZvcm1hdCA9IDA7XG4gICAgdGhpcy5fdG90YWxSYXRlTGltaXRlZCA9IDA7XG4gICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMgPSBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXIgcmVnaXN0cnkgaW50ZXJmYWNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEFic3RyYWN0cyB0aGUgY29uY3JldGUgaGFuZGxlciB0eXBlcyBmb3IgYmV0dGVyIHRlc3RhYmlsaXR5IGFuZCBkZWNvdXBsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJSZWdpc3RyeSB7XG4gIGVsZW1lbnRDUlVEOiBFbGVtZW50Q1JVREhhbmRsZXI7XG4gIG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIGFnZW50TWFuYWdlcjogQWdlbnRNYW5hZ2VyO1xuICB0ZW1wbGF0ZVJlbmRlcmVyOiBUZW1wbGF0ZVJlbmRlcmVyO1xuICBlbGVtZW50UXVlcnlTZXJ2aWNlOiBFbGVtZW50UXVlcnlTZXJ2aWNlO1xuICAvLyBNQ1AtQVFMIGV4dGVuc2lvbiBoYW5kbGVycyAoSXNzdWUgIzI0MSlcbiAgY29sbGVjdGlvbkhhbmRsZXI/OiBDb2xsZWN0aW9uSGFuZGxlcjtcbiAgcG9ydGZvbGlvSGFuZGxlcj86IFBvcnRmb2xpb0hhbmRsZXI7XG4gIGF1dGhIYW5kbGVyPzogR2l0SHViQXV0aEhhbmRsZXI7XG4gIGNvbmZpZ0hhbmRsZXI/OiBDb25maWdIYW5kbGVyO1xuICBlbmhhbmNlZEluZGV4SGFuZGxlcj86IEVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICBwZXJzb25hSGFuZGxlcj86IFBlcnNvbmFIYW5kbGVyO1xuICBzeW5jSGFuZGxlcj86IFN5bmNIYW5kbGVyO1xuICBidWlsZEluZm9TZXJ2aWNlPzogQnVpbGRJbmZvU2VydmljZTtcbiAgY2FjaGVNZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGdhdGVrZWVwZXI6IEdhdGVrZWVwZXI7XG4gIC8vIElzc3VlICM0MDI6IERJLWluamVjdGVkIGRhbmdlciB6b25lIGVuZm9yY2VyIChyZXBsYWNlcyBzaW5nbGV0b24gaW1wb3J0KVxuICBkYW5nZXJab25lRW5mb3JjZXI/OiBEYW5nZXJab25lRW5mb3JjZXI7XG4gIC8vIElzc3VlICMxNDI6IFNlcnZlci1zaWRlIHZlcmlmaWNhdGlvbiBzdG9yZSBmb3IgY2hhbGxlbmdlIGNvZGVzXG4gIHZlcmlmaWNhdGlvblN0b3JlPzogVmVyaWZpY2F0aW9uU3RvcmU7XG4gIC8vIElzc3VlICM1MjI6IE5vbi1ibG9ja2luZyBPUyBkaWFsb2cgZm9yIHZlcmlmaWNhdGlvbiBjb2RlcyAocmVwbGFjZXMgcmV0dXJuaW5nIGNvZGUgdG8gTExNKVxuICB2ZXJpZmljYXRpb25Ob3RpZmllcj86IElWZXJpZmljYXRpb25Ob3RpZmllcjtcbiAgLy8gSXNzdWUgIzUyODogTWVtb3J5TG9nU2luayBmb3IgQ1JVREUtcm91dGVkIHF1ZXJ5X2xvZ3NcbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG59XG5cbi8qKlxuICogRXhwb3J0IHBhY2thZ2Ugc3RydWN0dXJlIGZvciBlbGVtZW50IGltcG9ydC9leHBvcnQgb3BlcmF0aW9uc1xuICovXG5pbnRlcmZhY2UgRXhwb3J0UGFja2FnZSB7XG4gIGV4cG9ydFZlcnNpb246IHN0cmluZztcbiAgZXhwb3J0ZWRBdDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogc3RyaW5nO1xuICBlbGVtZW50TmFtZT86IHN0cmluZztcbiAgZm9ybWF0OiAnanNvbicgfCAneWFtbCc7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBNQ1BBUUxIYW5kbGVyIC0gVW5pZmllZCBlbnRyeSBwb2ludCBmb3IgYWxsIE1DUC1BUUwgb3BlcmF0aW9uc1xuICpcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSB0aGluIHJlc29sdmVyIHBhdHRlcm46XG4gKiAxLiBWYWxpZGF0ZXMgdGhhdCBvcGVyYXRpb25zIGFyZSBjYWxsZWQgdmlhIGNvcnJlY3QgQ1JVRCBlbmRwb2ludHNcbiAqIDIuIFJvdXRlcyBvcGVyYXRpb25zIHRvIHRoZWlyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICogMy4gRGlzcGF0Y2hlcyB0byBhY3R1YWwgaGFuZGxlciBtZXRob2RzXG4gKiA0LiBSZXR1cm5zIHN0YW5kYXJkaXplZCBPcGVyYXRpb25SZXN1bHRcbiAqXG4gKiBERVNJR04gUkFUSU9OQUxFOlxuICogLSBTaW5nbGUgUmVzcG9uc2liaWxpdHk6IE9ubHkgb3JjaGVzdHJhdGVzLCBkZWxlZ2F0ZXMgYWN0dWFsIHdvcmtcbiAqIC0gRGVwZW5kZW5jeSBJbnZlcnNpb246IERlcGVuZHMgb24gSGFuZGxlclJlZ2lzdHJ5IGludGVyZmFjZVxuICogLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IEhhbmRsZXJSZWdpc3RyeSBleHBvc2VzIG9ubHkgd2hhdCdzIG5lZWRlZFxuICogLSBPcGVuL0Nsb3NlZDogTmV3IG9wZXJhdGlvbnMgYWRkZWQgdG8gcm91dGVyLCBub3QgdGhpcyBjbGFzc1xuICovXG4vKipcbiAqIE1pbmltYWwgaW50ZXJmYWNlIGZvciBjb3JyZWxhdGlvbiBJRCByZXRyaWV2YWwuXG4gKiBLZWVwcyBjb3VwbGluZyBsb29zZSDigJQgb25seSByZXF1aXJlcyB3aGF0IE1DUEFRTEhhbmRsZXIgYWN0dWFsbHkgbmVlZHMuXG4gKiBJc3N1ZSAjMzAxOiBSZXF1ZXN0IGNvcnJlbGF0aW9uIHN1cHBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ycmVsYXRpb25JZFByb3ZpZGVyIHtcbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNQ1BBUUxIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXRla2VlcGVyOiBHYXRla2VlcGVyO1xuICAvKipcbiAgICogSXNzdWUgIzY1NjogUGVyLW1lbW9yeSBzYXZlIGRlYm91bmNlIHRpbWVycy5cbiAgICogV2hlbiBhZGRFbnRyeSBpcyBjYWxsZWQgcmFwaWRseSwgd2UgY29hbGVzY2Ugc2F2ZXMg4oCUIG9ubHkgdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBpcyB3cml0dGVuIHRvIGRpc2sgYWZ0ZXIgdGhlIGRlYm91bmNlIHdpbmRvdyBleHBpcmVzLlxuICAgKiBLZXk6IG5vcm1hbGl6ZWQgbWVtb3J5IG5hbWUsIFZhbHVlOiB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nU2F2ZXMgPSBuZXcgTWFwPHN0cmluZywge1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5O1xuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIH0+KCk7XG4gIC8qKiBJc3N1ZSAjNjU2OiBEZWJvdW5jZSBtZXRyaWNzIOKAlCB0cmFja3Mgc2F2ZXMgY29hbGVzY2VkIHZzIGFjdHVhbGx5IHdyaXR0ZW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VNZXRyaWNzID0geyBjb2FsZXNjZWQ6IDAsIHdyaXR0ZW46IDAgfTtcbiAgLyoqXG4gICAqIElzc3VlICM2NTc6IFBlci1tZW1vcnkgc2F2ZSBmcmVxdWVuY3kgdHJhY2tlci5cbiAgICogU2xpZGluZyB3aW5kb3cgY291bnRlcjogdHJhY2tzIGFkZEVudHJ5IGNhbGxzIHBlciBtZW1vcnkgd2l0aGluIHRoZSBtb25pdG9yIHdpbmRvdy5cbiAgICogTG9ncyB3YXJuaW5ncyBhdCBjb25maWd1cmFibGUgdGhyZXNob2xkcyB0byBjYXRjaCBydW5hd2F5IGxvb3BzIGVhcmx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzYXZlRnJlcXVlbmN5Q291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgeyB0aW1lc3RhbXBzOiBudW1iZXJbXTsgd2FybmVkOiBib29sZWFuOyBjcml0aWNhbDogYm9vbGVhbiB9PigpO1xuICAvKiogSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0ZXIgZm9yIHBlcm1pc3Npb25fcHJvbXB0IGV2YWx1YXRpb25zIChjb25maWd1cmFibGUgdmlhIGVudikgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uUHJvbXB0TGltaXRlciA9IFJhdGVMaW1pdGVyRmFjdG9yeS5jcmVhdGVQZXJtaXNzaW9uUHJvbXB0TGltaXRlcihcbiAgICBlbnYuRE9MTEhPVVNFX1BFUk1JU1NJT05fUFJPTVBUX1JBVEVfTElNSVQsIGVudi5ET0xMSE9VU0VfUEVSTUlTU0lPTl9SQVRFX1dJTkRPV19NU1xuICApO1xuICAvKiogSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0ZXIgZm9yIENMSSBhcHByb3ZhbCByZWNvcmQgY3JlYXRpb24gKGNvbmZpZ3VyYWJsZSB2aWEgZW52KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaUFwcHJvdmFsTGltaXRlciA9IFJhdGVMaW1pdGVyRmFjdG9yeS5jcmVhdGVDbGlBcHByb3ZhbExpbWl0ZXIoXG4gICAgZW52LkRPTExIT1VTRV9DTElfQVBQUk9WQUxfUkFURV9MSU1JVCwgZW52LkRPTExIT1VTRV9QRVJNSVNTSU9OX1JBVEVfV0lORE9XX01TXG4gICk7XG4gIC8qKlxuICAgKiBCdWlsZCBhIHN0YW5kYXJkaXplZCByYXRlLWxpbWl0IGRlbnkgcmVzcG9uc2UgZm9yIHBlcm1pc3Npb25fcHJvbXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJhdGVMaW1pdERlbnkoXG4gICAgbGltaXRlck5hbWU6IHN0cmluZyxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIHN0YXR1czogaW1wb3J0KCcuLi8uLi91dGlscy9SYXRlTGltaXRlci5qcycpLlJhdGVMaW1pdFN0YXR1cyxcbiAgICByaXNrTGV2ZWwgPSAnYmxvY2tlZCcsXG4gICAgcmVhc29uID0gJ1JhdGUgbGltaXQgZXhjZWVkZWQnLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnBlcm1pc3Npb25Qcm9tcHQnLFxuICAgICAgZGV0YWlsczogYCR7bGltaXRlck5hbWV9IHJhdGUgbGltaXQgZXhjZWVkZWQgZm9yICR7dG9vbE5hbWV9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIHRvb2xOYW1lLFxuICAgICAgICBsaW1pdGVyOiBsaW1pdGVyTmFtZSxcbiAgICAgICAgcmV0cnlBZnRlck1zOiBzdGF0dXMucmV0cnlBZnRlck1zLFxuICAgICAgICByZW1haW5pbmdUb2tlbnM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICAgIHJlc2V0VGltZTogc3RhdHVzLnJlc2V0VGltZS50b0lTT1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgIG1lc3NhZ2U6IGBSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke2xpbWl0ZXJOYW1lfS4gUmV0cnkgYWZ0ZXIgJHtzdGF0dXMucmV0cnlBZnRlck1zfW1zLmAsXG4gICAgICBjbGFzc2lmaWNhdGlvbjogeyByaXNrTGV2ZWwsIHJlYXNvbiwgc3RhZ2U6ICdyYXRlX2xpbWl0JyB9LFxuICAgIH07XG4gIH1cblxuICAvKiogSXNzdWUgIzE0MjogUmF0ZSBsaW1pdGVyIGZvciB2ZXJpZnlfY2hhbGxlbmdlIGF0dGVtcHRzIChtYXggMTAgZmFpbHVyZXMgcGVyIDYwcyB3aW5kb3cpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIgPSBuZXcgVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIoKTtcbiAgLyoqIElzc3VlICMxNDI6IE1ldHJpY3MgdHJhY2tlciBmb3IgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbnMgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZmljYXRpb25NZXRyaWNzID0gbmV3IFZlcmlmaWNhdGlvbk1ldHJpY3NUcmFja2VyKCk7XG4gIC8qKlxuICAgKiBUcmFja3MgYWdlbnRzIGN1cnJlbnRseSBpbiBhbiBleGVjdXRpb24gbG9vcCBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQuXG4gICAqXG4gICAqICoqTGlmZWN5Y2xlOioqIEVudHJpZXMgYXJlIGFkZGVkIGluIGBkaXNwYXRjaEV4ZWN1dGUoKWAgb24gYGV4ZWN1dGVfYWdlbnRgIGFuZFxuICAgKiByZW1vdmVkIG9uIGBjb21wbGV0ZV9leGVjdXRpb25gLiBPbmx5IGFnZW50cyB3aXRoIGEgZ2F0ZWtlZXBlciBwb2xpY3kgKGV4cGxpY2l0XG4gICAqIG9yIHN5bnRoZXNpemVkIGZyb20gYHRvb2xzYCBjb25maWcpIGFyZSB0cmFja2VkLlxuICAgKlxuICAgKiAqKlBvbGljeSByZXNvbHV0aW9uOioqIEVudHJpZXMgYXJlIGluY2x1ZGVkIGluIGBnZXRBY3RpdmVFbGVtZW50cygpYCBzbyB0aGVcbiAgICogR2F0ZWtlZXBlciBldmFsdWF0ZXMgYWdlbnQgcG9saWNpZXMgYWxvbmdzaWRlIHBlcnNvbmEvc2tpbGwvZW5zZW1ibGUgcG9saWNpZXMuXG4gICAqIFRoZSBzdGFuZGFyZCBwcmlvcml0eSBhcHBsaWVzOiBkZW55ID4gc2NvcGVfcmVzdHJpY3Rpb24gPiBjb25maXJtID4gYWxsb3cuXG4gICAqXG4gICAqICoqTWVtb3J5IHNhZmV0eToqKiBUaGUgTWFwIGlzIGJvdW5kZWQgYnkgY29uY3VycmVudGx5IGV4ZWN1dGluZyBhZ2VudHMuIElmIGFcbiAgICogc2Vzc2lvbiBlbmRzIHdpdGhvdXQgYGNvbXBsZXRlX2V4ZWN1dGlvbmAsIHRoZSBNYXAgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgd2l0aFxuICAgKiB0aGUgTUNQQVFMSGFuZGxlciBpbnN0YW5jZS5cbiAgICpcbiAgICogSXNzdWUgIzQ0OVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpbmdBZ2VudHMgPSBuZXcgTWFwPHN0cmluZywge1xuICAgIC8qKiBBZ2VudCBlbGVtZW50IG5hbWUgKG1hdGNoZXMgdGhlIE1hcCBrZXkpICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBNZXRhZGF0YSBjb250YWluaW5nIHRoZSByZXNvbHZlZCBnYXRla2VlcGVyIHBvbGljeSAqL1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvKiogVGltZXN0YW1wIHdoZW4gZXhlY3V0aW9uIHN0YXJ0ZWQgKGZvciBkaWFnbm9zdGljcykgKi9cbiAgICBzdGFydGVkQXQ6IG51bWJlcjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogbnVtYmVyIG9mIGF1dG8tY29udGludWF0aW9ucyBwZXJmb3JtZWQgKElzc3VlICM1MjYpICovXG4gICAgY29udGludWF0aW9uQ291bnQ6IG51bWJlcjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogbnVtYmVyIG9mIHJldHJpZXMgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKElzc3VlICM1MjYpICovXG4gICAgcmV0cnlDb3VudDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBvcmlnaW5hbCBwYXJhbWV0ZXJzIGZyb20gZXhlY3V0ZV9hZ2VudCAoSXNzdWUgIzUyNikgKi9cbiAgICBvcmlnaW5hbFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogcmVzb2x2ZWQgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGEgKElzc3VlICM1MjYpICovXG4gICAgcmVzaWxpZW5jZVBvbGljeT86IEFnZW50UmVzaWxpZW5jZVBvbGljeTtcbiAgICAvKiogUmVjZW50IGdhdGVrZWVwZXIgYmxvY2tzIGR1cmluZyB0aGlzIGFnZW50J3MgZXhlY3V0aW9uIChBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtKSAqL1xuICAgIHJlY2VudEJsb2NrczogQXJyYXk8e1xuICAgICAgb3BlcmF0aW9uOiBzdHJpbmc7XG4gICAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgLyoqIFBlcm1pc3Npb24gbGV2ZWwgdGhhdCBjYXVzZWQgdGhlIGJsb2NrIChERU5ZLCBDT05GSVJNX1NFU1NJT04sIENPTkZJUk1fU0lOR0xFX1VTRSkgKi9cbiAgICAgIGxldmVsOiBzdHJpbmc7XG4gICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIC8qKiBXaGV0aGVyIHRoaXMgYmxvY2sgaGFzIGJlZW4gcmVwb3J0ZWQgaW4gYSBub3RpZmljYXRpb24gKi9cbiAgICAgIHJlcG9ydGVkOiBib29sZWFuO1xuICAgIH0+O1xuICB9PigpO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgYWJvcnRlZCBnb2FsSWRzLiBPbmNlIGEgZ29hbElkIGlzIGFib3J0ZWQsIGFsbCBmdXJ0aGVyIGV4ZWN1dGlvblxuICAgKiBvcGVyYXRpb25zIChyZWNvcmRfZXhlY3V0aW9uX3N0ZXAsIGNvbXBsZXRlX2V4ZWN1dGlvbiwgY29udGludWVfZXhlY3V0aW9uKVxuICAgKiBmb3IgdGhhdCBnb2FsSWQgYXJlIHJlamVjdGVkIGF0IHRoZSBkaXNwYXRjaCBsYXllci5cbiAgICpcbiAgICogSXNzdWUgIzI0OTogQWJvcnQvY2FuY2VsbGF0aW9uIGluZnJhc3RydWN0dXJlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydGVkR29hbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBIYW5kbGVyUmVnaXN0cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0VHJhY2tlcj86IENvcnJlbGF0aW9uSWRQcm92aWRlcixcbiAgKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBub3JtYWxpemVycyBmb3Igc2NoZW1hLWRyaXZlbiBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKVxuICAgIGluaXRpYWxpemVOb3JtYWxpemVycygpO1xuICAgIC8vIElzc3VlICM0NTI6IFN0b3JlIEdhdGVrZWVwZXIgaW5zdGFuY2UgZm9yIHBvbGljeSBlbmZvcmNlbWVudFxuICAgIGlmICghaGFuZGxlcnMuZ2F0ZWtlZXBlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHYXRla2VlcGVyIGluc3RhbmNlIGlzIHJlcXVpcmVkIGluIEhhbmRsZXJSZWdpc3RyeS4gUHJvdmlkZSBvbmUgdmlhIHRoZSBESSBjb250YWluZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuZ2F0ZWtlZXBlciA9IGhhbmRsZXJzLmdhdGVrZWVwZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZlcmlmaWNhdGlvbiBtZXRyaWNzIGZvciBtb25pdG9yaW5nL2RpYWdub3N0aWNzLlxuICAgKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgRGFuZ2VyWm9uZUVuZm9yY2VyLmdldE1ldHJpY3MoKS5cbiAgICovXG4gIGdldFZlcmlmaWNhdGlvbk1ldHJpY3MoKTogVmVyaWZpY2F0aW9uTWV0cmljcyB7XG4gICAgcmV0dXJuIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5nZXRNZXRyaWNzKHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdXRvbm9teSBldmFsdWF0aW9uIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcvZGlhZ25vc3RpY3MuXG4gICAqIElzc3VlICMzOTE6IEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBnZXRWZXJpZmljYXRpb25NZXRyaWNzKCkuXG4gICAqL1xuICBnZXRBdXRvbm9teU1ldHJpY3MoKTogQXV0b25vbXlNZXRyaWNzU25hcHNob3Qge1xuICAgIHJldHVybiBnZXRBdXRvbm9teU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHYXRoZXIgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50cyBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZXZhbHVhdGlvbi5cbiAgICpcbiAgICogUXVlcmllcyBQZXJzb25hTWFuYWdlciwgU2tpbGxNYW5hZ2VyLCBhbmQgRW5zZW1ibGVNYW5hZ2VyIGZvciBhY3RpdmUgZWxlbWVudHMsXG4gICAqIHRoZW4gYXBwZW5kcyBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBhZ2VudHMgd2l0aCBnYXRla2VlcGVyIHBvbGljaWVzLiBBbGxcbiAgICogZWxlbWVudHMgYXJlIG1hcHBlZCB0byB0aGUge0BsaW5rIEFjdGl2ZUVsZW1lbnR9IGludGVyZmFjZSBleHBlY3RlZCBieVxuICAgKiBgR2F0ZWtlZXBlci5lbmZvcmNlKClgLlxuICAgKlxuICAgKiBJc3N1ZSAjNDUyOiBQcm92aWRlcyBlbGVtZW50IGNvbnRleHQgZm9yIExheWVyIDIgKGVsZW1lbnQgcG9saWN5IHJlc29sdXRpb24pLlxuICAgKiBJc3N1ZSAjNDQ5OiBJbmNsdWRlcyBleGVjdXRpbmcgYWdlbnRzIGFsb25nc2lkZSBwZXJzb25hcy9za2lsbHMvZW5zZW1ibGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhY3RpdmUgZWxlbWVudHMgd2l0aCB0aGVpciBnYXRla2VlcGVyIHBvbGljaWVzLCBvciBlbXB0eVxuICAgKiAgICAgICAgICBhcnJheSBpZiBnYXRoZXJpbmcgZmFpbHMgKGZhaWwtb3Blbjogb25seSByb3V0ZSBwb2xpY2llcyBhcHBseSkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKCk6IFByb21pc2U8QWN0aXZlRWxlbWVudFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeSgpO1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHM6IEFjdGl2ZUVsZW1lbnRbXSA9IHJhd0VsZW1lbnRzLm1hcCgoZWwpID0+ICh7XG4gICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogKGVsLm1ldGFkYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGdhdGVrZWVwZXI6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIEFjdGl2ZUVsZW1lbnRbJ21ldGFkYXRhJ11bJ2dhdGVrZWVwZXInXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIElzc3VlICM0NDk6IEluY2x1ZGUgZXhlY3V0aW5nIGFnZW50cyB3aXRoIGdhdGVrZWVwZXIgcG9saWNpZXNcbiAgICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgICAgYWN0aXZlRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2FnZW50JyxcbiAgICAgICAgICBuYW1lOiBhZ2VudEVudHJ5Lm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIG5hbWU6IGFnZW50RW50cnkubmFtZSxcbiAgICAgICAgICAgIGdhdGVrZWVwZXI6IGFnZW50RW50cnkubWV0YWRhdGEuZ2F0ZWtlZXBlciBhcyBBY3RpdmVFbGVtZW50WydtZXRhZGF0YSddWydnYXRla2VlcGVyJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50cztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBvcGVuIOKAlCBpZiB3ZSBjYW4ndCBnYXRoZXIgYWN0aXZlIGVsZW1lbnRzLCBlbmZvcmNlIHdpdGhvdXQgdGhlbVxuICAgICAgLy8gVGhpcyBtZWFucyBvbmx5IHJvdXRlIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgcG9saWNpZXMgd2lsbCBhcHBseVxuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIGVsZW1lbnRzIGZvciBHYXRla2VlcGVyIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIENSRUFURSBvcGVyYXRpb25zIChhZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlKVxuICAgKlxuICAgKiBDUkVBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBjcmVhdGVfZWxlbWVudDogQ3JlYXRlIG5ldyBlbGVtZW50c1xuICAgKiAtIGltcG9ydF9lbGVtZW50OiBJbXBvcnQgZWxlbWVudHMgZnJvbSBleHBvcnRlZCBkYXRhXG4gICAqIC0gYWRkRW50cnk6IEFkZCBlbnRyaWVzIHRvIG1lbW9yeSBlbGVtZW50c1xuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdDUkVBVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ0NSRUFURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBSRUFEIG9wZXJhdGlvbnMgKHJlYWQtb25seSwgc2FmZSlcbiAgICpcbiAgICogUkVBRCBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGxpc3RfZWxlbWVudHM6IExpc3QgZWxlbWVudHMgd2l0aCBmaWx0ZXJpbmdcbiAgICogLSBnZXRfZWxlbWVudDogR2V0IGVsZW1lbnQgYnkgbmFtZVxuICAgKiAtIGdldF9lbGVtZW50X2RldGFpbHM6IEdldCBkZXRhaWxlZCBlbGVtZW50IGluZm9ybWF0aW9uXG4gICAqIC0gc2VhcmNoX2VsZW1lbnRzOiBGdWxsLXRleHQgc2VhcmNoXG4gICAqIC0gcXVlcnlfZWxlbWVudHM6IFF1ZXJ5IHdpdGggcGFnaW5hdGlvblxuICAgKiAtIGdldF9hY3RpdmVfZWxlbWVudHM6IEdldCBhY3RpdmUgZWxlbWVudHNcbiAgICogLSB2YWxpZGF0ZV9lbGVtZW50OiBWYWxpZGF0ZSBlbGVtZW50XG4gICAqIC0gcmVuZGVyOiBSZW5kZXIgdGVtcGxhdGVcbiAgICogLSBleHBvcnRfZWxlbWVudDogRXhwb3J0IGVsZW1lbnRcbiAgICogLSBhY3RpdmF0ZV9lbGVtZW50OiBBY3RpdmF0ZSBlbGVtZW50cyBmb3IgdXNlXG4gICAqIC0gZGVhY3RpdmF0ZV9lbGVtZW50OiBEZWFjdGl2YXRlIGVsZW1lbnRcbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVSZWFkKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ1JFQUQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ1JFQUQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgVVBEQVRFIG9wZXJhdGlvbnMgKG1vZGlmeWluZyBleGlzdGluZyBzdGF0ZSlcbiAgICpcbiAgICogVVBEQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gZWRpdF9lbGVtZW50OiBNb2RpZnkgZXhpc3RpbmcgZWxlbWVudHNcbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVVcGRhdGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnVVBEQVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdVUERBVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgREVMRVRFIG9wZXJhdGlvbnMgKGRlc3RydWN0aXZlIGFjdGlvbnMpXG4gICAqXG4gICAqIERFTEVURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGRlbGV0ZV9lbGVtZW50OiBEZWxldGUgZWxlbWVudHNcbiAgICogLSBjbGVhcjogQ2xlYXIgbWVtb3J5IGVudHJpZXNcbiAgICogLSBjbGVhcl9naXRodWJfYXV0aDogUmVtb3ZlIEdpdEh1YiBhdXRoZW50aWNhdGlvblxuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZURlbGV0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdERUxFVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ0RFTEVURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBFWEVDVVRFIG9wZXJhdGlvbnMgKHJ1bnRpbWUgZXhlY3V0aW9uIGxpZmVjeWNsZSlcbiAgICpcbiAgICogRVhFQ1VURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGV4ZWN1dGVfYWdlbnQ6IFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICogLSBnZXRfZXhlY3V0aW9uX3N0YXRlOiBRdWVyeSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZVxuICAgKiAtIHJlY29yZF9leGVjdXRpb25fc3RlcDogUmVjb3JkIGV4ZWN1dGlvbiBwcm9ncmVzcyBvciBmaW5kaW5nc1xuICAgKiAtIGNvbXBsZXRlX2V4ZWN1dGlvbjogU2lnbmFsIGV4ZWN1dGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHlcbiAgICogLSBjb250aW51ZV9leGVjdXRpb246IFJlc3VtZSBleGVjdXRpb24gZnJvbSBzYXZlZCBzdGF0ZVxuICAgKiAtIGFib3J0X2V4ZWN1dGlvbjogQ2FuY2VsIGFuIG9uZ29pbmcgZXhlY3V0aW9uXG4gICAqXG4gICAqIFVubGlrZSBDUlVEIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBpZGVtcG90ZW50KSwgRVhFQ1VURSBvcGVyYXRpb25zIG1hbmFnZVxuICAgKiBydW50aW1lIHN0YXRlIGFuZCBhcmUgaW5oZXJlbnRseSBub24taWRlbXBvdGVudC4gQ2FsbGluZyBleGVjdXRlIHR3aWNlXG4gICAqIGNyZWF0ZXMgdHdvIHNlcGFyYXRlIGV4ZWN1dGlvbnMuXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlRXhlY3V0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdFWEVDVVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdFWEVDVVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29yZSBleGVjdXRpb24gbG9naWMgc2hhcmVkIGJ5IGFsbCBDUlVEIGVuZHBvaW50cy5cbiAgICogSW1wbGVtZW50cyB0aGUgdGhpbiByZXNvbHZlciBwYXR0ZXJuOiB2YWxpZGF0ZSDihpIgcm91dGUg4oaSIGRpc3BhdGNoIOKGkiByZXR1cm4uXG4gICAqXG4gICAqIE9QRVJBVElPTiBGTE9XOlxuICAgKiAxLiBWYWxpZGF0ZSBpbnB1dCBzdHJ1Y3R1cmVcbiAgICogMi4gVmFsaWRhdGUgcGVybWlzc2lvbnMgKFBlcm1pc3Npb25HdWFyZClcbiAgICogMy4gUm91dGUgb3BlcmF0aW9uIChPcGVyYXRpb25Sb3V0ZXIpXG4gICAqIDQuIERpc3BhdGNoIHRvIGhhbmRsZXJcbiAgICogNS4gUmV0dXJuIHN0YW5kYXJkaXplZCByZXN1bHRcbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gUmF3IGlucHV0IHRvIHZhbGlkYXRlIGFuZCBwcm9jZXNzXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIENSVUQgZW5kcG9pbnQgYmVpbmcgY2FsbGVkXG4gICAqIEByZXR1cm5zIFN0YW5kYXJkaXplZCBPcGVyYXRpb25SZXN1bHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU9wZXJhdGlvbihcbiAgICBpbnB1dDogdW5rbm93bixcbiAgICBlbmRwb2ludDogQ1JVREVuZHBvaW50XG4gICk6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0PiB7XG4gICAgLy8gSXNzdWUgIzMwMTogQ2FwdHVyZSBzdGFydCB0aW1lIGZvciByZXNwb25zZSB0aW1pbmcgbWV0YWRhdGFcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIFN0ZXAgMTogUGFyc2UgYW5kIG5vcm1hbGl6ZSBpbnB1dCAoaGFuZGxlcyBib3RoIHByb3BlciBhbmQgbGVnYWN5IGZvcm1hdHMpXG4gICAgLy8gSXNzdWUgIzIwNTogU2lsZW50IEpTT04gZmFsbGJhY2sgZm9yIGVkZ2UgY2FzZXNcbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlT3BlcmF0aW9uSW5wdXQoaW5wdXQpO1xuXG4gICAgLy8gRXh0cmFjdCBvcGVyYXRpb24gbmFtZSBmb3IgbG9nZ2luZ1xuICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBwYXJzZWRJbnB1dD8ub3BlcmF0aW9uID8/ICd1bmtub3duJztcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiBwYXJzaW5nIHN1Y2NlZWRlZFxuICAgICAgaWYgKCFwYXJzZWRJbnB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKFxuICAgICAgICAgICdJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBPcGVyYXRpb25JbnB1dCB3aXRoIFwib3BlcmF0aW9uXCIgYW5kIG9wdGlvbmFsIFwicGFyYW1zXCIuICcgK1xuICAgICAgICAgIGRlc2NyaWJlSW52YWxpZElucHV0KGlucHV0KSArICcuICcgK1xuICAgICAgICAgICdVc2UgZm9ybWF0OiB7IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIHBhcmFtczogeyB0eXBlOiBcInBlcnNvbmFzXCIgfSB9JyxcbiAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IHBhcnNlZElucHV0O1xuXG4gICAgICAvLyBTdGVwIDI6IEVuZm9yY2UgR2F0ZWtlZXBlciBwb2xpY3kgKElzc3VlICM0NTIpXG4gICAgICBpZiAoZW52LkRPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQpIHtcbiAgICAgICAgLy8gRnVsbCA0LWxheWVyIGNoZWNrOiByb3V0ZSB2YWxpZGF0aW9uIOKGkiBlbGVtZW50IHBvbGljaWVzIOKGkiBzZXNzaW9uIGNvbmZpcm1hdGlvbnMg4oaSIGRlZmF1bHRzXG4gICAgICAgIC8vIElzc3VlICM3NTg6IEdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyAoY29uZmlybV9vcGVyYXRpb24sIHZlcmlmeV9jaGFsbGVuZ2UsIGV0Yy4pXG4gICAgICAgIC8vIHNraXAgZWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvbiBpbiB0aGUgcHJpbWFyeSBlbmZvcmNlbWVudCBwYXRoIHRvIHByZXZlbnQgY2FzY2FkaW5nXG4gICAgICAgIC8vIGNvbmZpcm1hdGlvbiBsb29wcy4gRWxlbWVudCBwb2xpY2llcyBmb3IgdGhlIFRBUkdFVCBvcGVyYXRpb24gYXJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5XG4gICAgICAgIC8vIGluc2lkZSB0aGUgY29uZmlybSBoYW5kbGVyLCBhbmQgZGVueTogWydjb25maXJtX29wZXJhdGlvbiddIGlzIGVuZm9yY2VkIGFzIGEgc2FuZGJveC5cbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gdGhpcy5nYXRla2VlcGVyLmVuZm9yY2Uoe1xuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBza2lwRWxlbWVudFBvbGljaWVzOiBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbihvcGVyYXRpb24pLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgICAgICAgLy8gSXNzdWUgIzE2NTM6IEF1dG8tY29uZmlybSB3aGVuIHRoZSBob3N0IChDbGF1ZGUgQ29kZSwgZXRjLikgaGFzIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGFwcHJvdmVkIHRoaXMgTUNQIHRvb2wgY2FsbC4gVGhlIGhvc3QncyB0b29sLWxldmVsIGFwcHJvdmFsIGlzIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAvLyBodW1hbiBnYXRlOyB0aGUgZ2F0ZWtlZXBlcidzIGNvbmZpcm1fb3BlcmF0aW9uIHJvdW5kLXRyaXAgaXMgcmVkdW5kYW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSBob3N0IGdhdGVzIGV2ZXJ5IGNhbGwuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gU2FmZXR5IGxheWVycyB0aGF0IHJlbWFpbiBhY3RpdmUgKHByb3ZlbiBieSBwZXJtaXNzaW9uLWZsb3ctaGFybmVzcyB0ZXN0cyk6XG4gICAgICAgICAgICAvLyAtIEVsZW1lbnQgZGVueSBwb2xpY2llcyAoaGFyZCBkZW55LCBubyBjb25maXJtYXRpb25QZW5kaW5nIGZsYWcpXG4gICAgICAgICAgICAvLyAtIGNhbkJlRWxldmF0ZWQ6IGZhbHNlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAvLyAtIFNhZmV0eSB0aWVyIGV2YWx1YXRpb24gKHJ1bnMgYmVmb3JlIGNvbmZpcm1hdGlvbiBjaGVjaylcbiAgICAgICAgICAgIC8vIC0gRGFuZ2VyWm9uZSB2ZXJpZmljYXRpb24gKHNlcGFyYXRlIGZsb3cpXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIGNvbmZpcm1hdGlvbiBpcyByZWNvcmRlZCBpbiB0aGUgc2Vzc2lvbiBzbyBzdWJzZXF1ZW50IGVuZm9yY2UoKSBjYWxsc1xuICAgICAgICAgICAgLy8gZm9yIHRoZSBzYW1lIG9wZXJhdGlvbiBwYXNzIHdpdGhvdXQgcmUtY29uZmlybWluZy5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1MZXZlbCA9IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCBhc1xuICAgICAgICAgICAgICBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TRVNTSU9OIHwgUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRTtcblxuICAgICAgICAgICAgLy8gUmlzayBzY29yaW5nIGZvciBkZXN0cnVjdGl2ZS9oaWdoLWltcGFjdCBvcGVyYXRpb25zLlxuICAgICAgICAgICAgLy8gQXNzaWducyBhIHJpc2sgc2NvcmUgKDAtMTAwKSBiYXNlZCBvbiBvcGVyYXRpb24gY2hhcmFjdGVyaXN0aWNzLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgTUNQLUFRTCBlcXVpdmFsZW50IG9mIGFzc2Vzc1Jpc2soKSBmb3IgQ0xJIHRvb2xzLlxuICAgICAgICAgICAgY29uc3Qgcmlza1Njb3JlID0gdGhpcy5zY29yZU9wZXJhdGlvblJpc2sob3BlcmF0aW9uLCBlbmRwb2ludCwgcGFyYW1zKTtcblxuICAgICAgICAgICAgdGhpcy5nYXRla2VlcGVyLnJlY29yZENvbmZpcm1hdGlvbihvcGVyYXRpb24sIGNvbmZpcm1MZXZlbCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmQgbG9nIGEgZGV0YWlsZWQgc3VtbWFyeSBmb3Igc2Vzc2lvbiByZXZpZXcuXG4gICAgICAgICAgICAvLyBFdmVuIHRob3VnaCBubyBodW1hbiBpcyBwcm9tcHRlZCwgdGhpcyBhcHBlYXJzIGluIHF1ZXJ5X2xvZ3NcbiAgICAgICAgICAgIC8vIHNvIG9wZXJhdG9ycyBjYW4gdHJhY2Ugd2hhdCB3YXMgYXV0by1jb25maXJtZWQgYW5kIHdoeS5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSB0aGlzLmJ1aWxkT3BlcmF0aW9uU3VtbWFyeShvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBlbGVtZW50VHlwZSA/ICcgWycuY29uY2F0KGVsZW1lbnRUeXBlLCAnXScpIDogJyc7XG4gICAgICAgICAgICBsZXQgcmlza0xhYmVsID0gJ0xPVyc7XG4gICAgICAgICAgICBpZiAocmlza1Njb3JlID49IDgwKSByaXNrTGFiZWwgPSAnSElHSCc7XG4gICAgICAgICAgICBlbHNlIGlmIChyaXNrU2NvcmUgPj0gNDApIHJpc2tMYWJlbCA9ICdNT0RFUkFURSc7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFsnW0dhdGVrZWVwZXJdIEF1dG8tY29uZmlybWVkICgnLCByaXNrTGFiZWwsICcgcmlzaz0nLCBTdHJpbmcocmlza1Njb3JlKSxcbiAgICAgICAgICAgICAgJyk6ICcsIHN1bW1hcnksIHNjb3BlLCAnLiBSZWFzb246ICcsIGRlY2lzaW9uLnJlYXNvbl07XG4gICAgICAgICAgICBjb25zdCBsb2dNZXNzYWdlID0gcGFydHMuam9pbignJyk7XG5cbiAgICAgICAgICAgIC8vIENPTkZJUk1fU0lOR0xFX1VTRSBvcGVyYXRpb25zIChkZWxldGUsIGV4ZWN1dGVfYWdlbnQsIGVkaXQsIGFib3J0KVxuICAgICAgICAgICAgLy8gYXJlIGhpZ2hlci1yaXNrIOKAlCBsb2cgYXQgd2FybiBsZXZlbCBmb3IgdmlzaWJpbGl0eSBpbiBhdWRpdCB0cmFpbHMuXG4gICAgICAgICAgICBpZiAoY29uZmlybUxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBIYXJkIGRlbnkg4oCUIG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IHBvbGljeSwgbm8gY29uZmlybWF0aW9uIGNhbiBoZWxwXG4gICAgICAgICAgICB0aGlzLnJlY29yZEdhdGVrZWVwZXJCbG9ja0ZvckFnZW50cyhvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBkZWNpc2lvbi5yZWFzb24gPz8gJ09wZXJhdGlvbiBibG9ja2VkIGJ5IHBvbGljeScsIGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtHYXRla2VlcGVyXSAke2RlY2lzaW9uLnJlYXNvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjczOiBQcm90ZWN0IGdhdGVrZWVwZXIgcG9saWN5IGZpZWxkcyBmcm9tIGVsZW1lbnQtcG9saWN5IGVsZXZhdGlvbi5cbiAgICAgICAgLy8gZWRpdF9lbGVtZW50IGlzIGVsZXZhdGFibGUgZm9yIG5vcm1hbCBmaWVsZHMgKGRlc2NyaXB0aW9uLCB0YWdzLCBldGMuKSwgYnV0XG4gICAgICAgIC8vIGVkaXRpbmcgZ2F0ZWtlZXBlciBwb2xpY2llcyBhbHdheXMgcmVxdWlyZXMgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24uXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgYW4gZWxlbWVudCBmcm9tIGF1dG8tYXBwcm92aW5nIGNoYW5nZXMgdG8gc2VjdXJpdHkgcG9saWNpZXNcbiAgICAgICAgLy8gb24gb3RoZXIgZWxlbWVudHMgKHRoZSBwcmltYXJ5IHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcikuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvcGVyYXRpb24gPT09ICdlZGl0X2VsZW1lbnQnICYmXG4gICAgICAgICAgZGVjaXNpb24ucG9saWN5U291cmNlID09PSAnZWxlbWVudF9wb2xpY3knICYmXG4gICAgICAgICAgZGVjaXNpb24ucGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFICYmXG4gICAgICAgICAgcGFyYW1zXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGlucHV0T2JqID0gKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaGFzR2F0ZWtlZXBlckZpZWxkID1cbiAgICAgICAgICAgIGlucHV0T2JqPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpbnB1dE9iaj8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoaGFzR2F0ZWtlZXBlckZpZWxkKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW01DUEFRTEhhbmRsZXJdIEdhdGVrZWVwZXIgcG9saWN5IGVkaXQgYmxvY2tlZCBmcm9tIGVsZW1lbnQtcG9saWN5IGVsZXZhdGlvbiDigJQgcmVxdWlyZXMgZXhwbGljaXQgY29uZmlybWF0aW9uYCwge1xuICAgICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBwb2xpY3lTb3VyY2U6IGRlY2lzaW9uLnBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShcbiAgICAgICAgICAgICAgYEVkaXRpbmcgZ2F0ZWtlZXBlciBwb2xpY2llcyByZXF1aXJlcyBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbiBhbmQgY2Fubm90IGJlIGF1dG8tYXBwcm92ZWQgYnkgZWxlbWVudCBwb2xpY2llcy4gYCArXG4gICAgICAgICAgICAgIGBVc2UgY29uZmlybV9vcGVyYXRpb24gd2l0aCBwYXJhbXMgeyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIke2VsZW1lbnRUeXBlID8gYCwgZWxlbWVudF90eXBlOiBcIiR7ZWxlbWVudFR5cGV9XCJgIDogJyd9IH0gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5gLFxuICAgICAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHYXRla2VlcGVyIGRpc2FibGVkIOKAlCBmYWxsIGJhY2sgdG8gcm91dGUgdmFsaWRhdGlvbiBvbmx5XG4gICAgICAgIEdhdGVrZWVwZXIudmFsaWRhdGUob3BlcmF0aW9uLCBlbmRwb2ludCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgMzogUm91dGUgb3BlcmF0aW9uIHRvIGhhbmRsZXIgcmVmZXJlbmNlXG4gICAgICBjb25zdCByb3V0ZSA9IGdldFJvdXRlKG9wZXJhdGlvbik7XG4gICAgICBpZiAoIXJvdXRlKSB7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhZnRlciBQZXJtaXNzaW9uR3VhcmQudmFsaWRhdGUsIGJ1dCBndWFyZCBkZWZlbnNpdmVseVxuICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKGBVbmtub3duIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCwgc3RhcnRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCA0OiBEaXNwYXRjaCB0byBoYW5kbGVyXG4gICAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5kaXNwYXRjaChyb3V0ZS5oYW5kbGVyLCB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHBhcmFtczogcGFyYW1zIHx8IHt9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0ZXAgNTogQXBwbHkgZmllbGQgc2VsZWN0aW9uIChJc3N1ZSAjMjAyKVxuICAgICAgLy8gVHJhbnNmb3JtIG5hbWUg4oaSIGVsZW1lbnRfbmFtZSBmb3IgTExNIGNvbnNpc3RlbmN5XG4gICAgICAvLyBBcHBseSBmaWVsZCBmaWx0ZXJpbmcgaWYgZmllbGRzIHBhcmFtIHByb3ZpZGVkXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5hcHBseUZpZWxkU2VsZWN0aW9uKHJhd0RhdGEsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgIC8vIFN0ZXAgNjogTG9nIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIGFuZCByZXR1cm4gcmVzdWx0XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdPUEVSQVRJT05fQ09NUExFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgICBkZXRhaWxzOiBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkIG9uICR7ZWxlbWVudFR5cGUgfHwgJ3Vuc3BlY2lmaWVkJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGVuZHBvaW50LFxuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBwYXJhbXMgPyBPYmplY3Qua2V5cyhwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW10sXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzcyhkYXRhLCBzdGFydFRpbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGFuZCByZXR1cm4gYXMgT3BlcmF0aW9uRmFpbHVyZVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGlzU2VjdXJpdHlWaW9sYXRpb24gPSBtZXNzYWdlLmluY2x1ZGVzKCdTZWN1cml0eSB2aW9sYXRpb24nKTtcblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50cyB3aXRoIGFwcHJvcHJpYXRlIHNldmVyaXR5XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IGlzU2VjdXJpdHlWaW9sYXRpb24gPyAnVVBEQVRFX1NFQ1VSSVRZX1ZJT0xBVElPTicgOiAnT1BFUkFUSU9OX0ZBSUxFRCcsXG4gICAgICAgIHNldmVyaXR5OiBpc1NlY3VyaXR5VmlvbGF0aW9uID8gJ0hJR0gnIDogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogYE1DUEFRTEhhbmRsZXIuJHtlbmRwb2ludC50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICAgIGRldGFpbHM6IGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb25OYW1lfScgZmFpbGVkOiAke21lc3NhZ2V9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZW5kcG9pbnQsIG9wZXJhdGlvbjogb3BlcmF0aW9uTmFtZSwgZXJyb3I6IG1lc3NhZ2UgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9uTmFtZX0nIGZhaWxlZDogJHttZXNzYWdlfWAsIHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTmFtZSxcbiAgICAgICAgZXJyb3I6IG1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUobWVzc2FnZSwgc3RhcnRUaW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGJhdGNoIG9mIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5LlxuICAgKiBPcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBvcmRlciwgYW5kIGZhaWx1cmVzIGRvIG5vdCBzdG9wIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogRVhFQ1VUSU9OIFNFTUFOVElDUzpcbiAgICogLSBPcGVyYXRpb25zIHJ1biBzZXF1ZW50aWFsbHkgKGluIG9yZGVyKVxuICAgKiAtIEVhY2ggb3BlcmF0aW9uIGlzIHZhbGlkYXRlZCBpbmRlcGVuZGVudGx5XG4gICAqIC0gRmFpbGVkIG9wZXJhdGlvbnMgZG9uJ3Qgc3RvcCB0aGUgYmF0Y2hcbiAgICogLSBBbGwgcmVzdWx0cyBhcmUgY29sbGVjdGVkIGFuZCByZXR1cm5lZFxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2ggLSBCYXRjaFJlcXVlc3Qgd2l0aCBhcnJheSBvZiBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIENSVUQgZW5kcG9pbnQgYmVpbmcgY2FsbGVkXG4gICAqIEByZXR1cm5zIEJhdGNoUmVzdWx0IHdpdGggYWxsIG9wZXJhdGlvbiByZXN1bHRzIGFuZCBzdW1tYXJ5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVCYXRjaChcbiAgICBiYXRjaDogQmF0Y2hSZXF1ZXN0LFxuICAgIGVuZHBvaW50OiBDUlVERW5kcG9pbnRcbiAgKTogUHJvbWlzZTxCYXRjaFJlc3VsdD4ge1xuICAgIC8vIElzc3VlICMyMjEvIzU0MzogUmVqZWN0IG92ZXJzaXplZCBiYXRjaGVzIHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGlmIChiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OUykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQkFUQ0hfUkVKRUNURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogYE1DUEFRTEhhbmRsZXIuJHtlbmRwb2ludC50b0xvd2VyQ2FzZSgpfS5iYXRjaGAsXG4gICAgICAgIGRldGFpbHM6IGBCYXRjaCBvZiAke2JhdGNoLm9wZXJhdGlvbnMubGVuZ3RofSBvcHMgcmVqZWN0ZWQg4oCUIGV4Y2VlZHMgbGltaXQgb2YgJHtTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlN9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZW5kcG9pbnQsIHJlcXVlc3RlZDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGgsIGxpbWl0OiBTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlMgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICBzdW1tYXJ5OiB7IHRvdGFsOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCwgc3VjY2VlZGVkOiAwLCBmYWlsZWQ6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoIH0sXG4gICAgICAgIGVycm9yOiBgQmF0Y2ggc2l6ZSAke2JhdGNoLm9wZXJhdGlvbnMubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlN9IG9wZXJhdGlvbnNgLFxuICAgICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEocGVyZm9ybWFuY2Uubm93KCkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjMzAxOiBDYXB0dXJlIHN0YXJ0IHRpbWUgZm9yIGJhdGNoLWxldmVsIHRpbWluZyBtZXRhZGF0YVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEJhdGNoT3BlcmF0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBsZXQgc3VjY2VlZGVkID0gMDtcbiAgICBsZXQgZmFpbGVkID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSBiYXRjaC5vcGVyYXRpb25zW2ldO1xuXG4gICAgICAvLyBQYXNzIHJhdyBvcGVyYXRpb24gdGhyb3VnaCDigJQgcGFyc2VPcGVyYXRpb25JbnB1dCgpIGluIGV4ZWN1dGVPcGVyYXRpb24oKVxuICAgICAgLy8gaGFuZGxlcyBhbGwgbm9ybWFsaXphdGlvbiAoZWxlbWVudF90eXBlIHZzIGVsZW1lbnRUeXBlLCBsZWdhY3kgZm9ybWF0cywgZXRjLilcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihvcCwgZW5kcG9pbnQpO1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcC5vcGVyYXRpb24sXG4gICAgICAgIHJlc3VsdCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgc3VjY2VlZGVkKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2cgYmF0Y2ggY29tcGxldGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdCQVRDSF9DT01QTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9LmJhdGNoYCxcbiAgICAgIGRldGFpbHM6IGBCYXRjaCBvZiAke2JhdGNoLm9wZXJhdGlvbnMubGVuZ3RofSBvcHM6ICR7c3VjY2VlZGVkfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWRgLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHRvdGFsOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCxcbiAgICAgICAgc3VjY2VlZGVkLFxuICAgICAgICBmYWlsZWQsXG4gICAgICAgIG9wZXJhdGlvbnM6IGJhdGNoLm9wZXJhdGlvbnMubWFwKG9wID0+IG9wLm9wZXJhdGlvbiksXG4gICAgICAgIGZhaWx1cmVSYXRlOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IDAgPyBNYXRoLnJvdW5kKChmYWlsZWQgLyBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCkgKiAxMDApIDogMCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHJlc3VsdHMsXG4gICAgICBzdW1tYXJ5OiB7XG4gICAgICAgIHRvdGFsOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCxcbiAgICAgICAgc3VjY2VlZGVkLFxuICAgICAgICBmYWlsZWQsXG4gICAgICB9LFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGhhbmRsZXIgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgaGFuZGxlciBtZXRob2QuXG4gICAqXG4gICAqIEhhbmRsZXIgcmVmZXJlbmNlIGZvcm1hdDogXCJNb2R1bGUubWV0aG9kXCJcbiAgICogRXhhbXBsZXM6XG4gICAqIC0gXCJFbGVtZW50Q1JVRC5jcmVhdGVcIiDihpIgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5jcmVhdGVFbGVtZW50KC4uLilcbiAgICogLSBcIk1lbW9yeS5hZGRFbnRyeVwiIOKGkiB0aGlzLmhhbmRsZXJzLm1lbW9yeU1hbmFnZXIuYWRkRW50cnkoLi4uKVxuICAgKiAtIFwiQWdlbnQuZXhlY3V0ZVwiIOKGkiB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlci5leGVjdXRlQWdlbnQoLi4uKVxuICAgKlxuICAgKiBESVNQQVRDSCBTVFJBVEVHWSAoSXNzdWUgIzI0Nyk6XG4gICAqIDEuIENoZWNrIGlmIG9wZXJhdGlvbiBpcyBzY2hlbWEtZHJpdmVuIOKGkiB1c2UgU2NoZW1hRGlzcGF0Y2hlclxuICAgKiAyLiBPdGhlcndpc2UgZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBtb2R1bGUtYmFzZWQgZGlzcGF0Y2hcbiAgICpcbiAgICogU2NoZW1hLWRyaXZlbiBvcGVyYXRpb25zIGJlbmVmaXQgZnJvbTpcbiAgICogLSBEZWNsYXJhdGl2ZSBjb25maWd1cmF0aW9uIChubyBzd2l0Y2ggc3RhdGVtZW50cylcbiAgICogLSBBdXRvLWdlbmVyYXRlZCBwYXJhbWV0ZXIgdmFsaWRhdGlvblxuICAgKiAtIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIG9wZXJhdGlvbiBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlclJlZiAtIEhhbmRsZXIgcmVmZXJlbmNlIGluIFwiTW9kdWxlLm1ldGhvZFwiIGZvcm1hdFxuICAgKiBAcGFyYW0gaW5wdXQgLSBWYWxpZGF0ZWQgb3BlcmF0aW9uIGlucHV0XG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbi1zcGVjaWZpYyBkYXRhXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgaGFuZGxlciByZWZlcmVuY2UgaXMgdW5rbm93biBvciBtZXRob2QgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2goXG4gICAgaGFuZGxlclJlZjogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IG9wZXJhdGlvbiwgcGFyYW1zIH0gPSBpbnB1dDtcblxuICAgIC8vIElzc3VlICMyNDc6IFNjaGVtYS1kcml2ZW4gZGlzcGF0Y2ggZm9yIGNvbmZpZ3VyZWQgb3BlcmF0aW9uc1xuICAgIC8vIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgbWFudWFsIHN3aXRjaCBzdGF0ZW1lbnRzXG4gICAgLy8gSXNzdWUgIzI1MTogUGFzcyBmdWxsIGlucHV0IGZvciBvcGVyYXRpb25zIG5lZWRpbmcgZWxlbWVudFR5cGUgcmVzb2x1dGlvblxuICAgIGlmIChTY2hlbWFEaXNwYXRjaGVyLmNhbkRpc3BhdGNoKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiBTY2hlbWFEaXNwYXRjaGVyLmRpc3BhdGNoKFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIChwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9LFxuICAgICAgICB0aGlzLmhhbmRsZXJzLFxuICAgICAgICBpbnB1dFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgbW9kdWxlLWJhc2VkIGRpc3BhdGNoIGZvciBjb21wbGV4IG9wZXJhdGlvbnNcbiAgICBjb25zdCBbbW9kdWxlLCBtZXRob2RdID0gaGFuZGxlclJlZi5zcGxpdCgnLicpO1xuXG4gICAgLy8gRWxlbWVudENSVUQgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdFbGVtZW50Q1JVRCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRWxlbWVudENSVUQobWV0aG9kLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gTWVtb3J5IG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnTWVtb3J5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hNZW1vcnkobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEFnZW50IG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnQWdlbnQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEFnZW50KG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBUZW1wbGF0ZSBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hUZW1wbGF0ZShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZhdGlvbiBvcGVyYXRpb25zIChjcm9zcy1jdXR0aW5nIGNvbmNlcm4pXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0FjdGl2YXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEFjdGl2YXRpb24obWV0aG9kLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnU2VhcmNoJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hTZWFyY2gobWV0aG9kLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogVW5pZmllZFNlYXJjaCBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKSBhcmUgbm93IHNjaGVtYS1kcml2ZW5cbiAgICAvLyB2aWEgU2NoZW1hRGlzcGF0Y2hlciB3aXRoIHRoZSAnc2VhcmNoUGFyYW1zJyBub3JtYWxpemVyLlxuICAgIC8vIFNlZSBQT1JURk9MSU9fT1BFUkFUSU9OUy5zZWFyY2ggaW4gT3BlcmF0aW9uU2NoZW1hLnRzXG5cbiAgICAvLyBJbnRyb3NwZWN0aW9uIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnSW50cm9zcGVjdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoSW50cm9zcGVjdGlvbihtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdGlvbiBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdDb2xsZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hDb2xsZWN0aW9uKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBQb3J0Zm9saW8gb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnUG9ydGZvbGlvJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hQb3J0Zm9saW8obWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEF1dGggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnQXV0aCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQXV0aChtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlnIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0NvbmZpZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQ29uZmlnKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0VuaGFuY2VkSW5kZXgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEVuaGFuY2VkSW5kZXgobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFBlcnNvbmEgb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnUGVyc29uYScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoUGVyc29uYShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBvcGVyYXRpb25zIChJc3N1ZSAjMjQ0IC0gQ1JVREUpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0V4ZWN1dGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEV4ZWN1dGUobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEdhdGVrZWVwZXIgb3BlcmF0aW9ucyAoSXNzdWUgIzQ1MiAtIGNvbmZpcm1hdGlvbiBmbG93KVxuICAgIGlmIChtb2R1bGUgPT09ICdHYXRla2VlcGVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hHYXRla2VlcGVyKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBMb2dnaW5nIG9wZXJhdGlvbnMgKElzc3VlICM1MjggLSBDUlVERSBtaWdyYXRpb24pXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0xvZ2dpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaExvZ2dpbmcobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEJyb3dzZXIgb3BlcmF0aW9ucyAoSXNzdWUgIzc3NDogb3BlbiBwb3J0Zm9saW8gYnJvd3NlcilcbiAgICBpZiAobW9kdWxlID09PSAnQnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQnJvd3NlcihtZXRob2QpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBoYW5kbGVyIG1vZHVsZTogJHttb2R1bGV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRWxlbWVudENSVUQgb3BlcmF0aW9ucyB0byBFbGVtZW50Q1JVREhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbGVtZW50Q1JVRChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2NyZWF0ZSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI3ODogRm9yIGVuc2VtYmxlcywgbWVyZ2UgdG9wLWxldmVsIGVsZW1lbnRzIGludG8gbWV0YWRhdGFcbiAgICAgICAgLy8gTExNcyBvZnRlbiBwYXNzIGVsZW1lbnRzIGF0IHBhcmFtcyBsZXZlbCwgbm90IGluc2lkZSBtZXRhZGF0YVxuICAgICAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyk7XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IHAubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGVuc2VtYmxlIHR5cGUgKGhhbmRsZXMgYm90aCBwbHVyYWwgY29uc3RhbnQgYW5kIHNpbmd1bGFyIGZvcm0pXG4gICAgICAgIGNvbnN0IGlzRW5zZW1ibGUgPSByZXNvbHZlZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFIHx8IHJlc29sdmVkVHlwZSA9PT0gJ2Vuc2VtYmxlJztcbiAgICAgICAgaWYgKGlzRW5zZW1ibGUpIHtcbiAgICAgICAgICAvLyBJc3N1ZSAjMzY1OiBSZWNvZ25pemUgY29tbW9uIHN5bm9ueW1zIGZvciAnZWxlbWVudHMnIChtZW1iZXJzLCBjb21wb25lbnRzLCBpdGVtcylcbiAgICAgICAgICBjb25zdCBzeW5vbnltcyA9IFsnbWVtYmVycycsICdjb21wb25lbnRzJywgJ2l0ZW1zJ10gYXMgY29uc3Q7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNTb3VyY2UgPSBwLmVsZW1lbnRzIHx8IHN5bm9ueW1zLnJlZHVjZTx1bmtub3duPihcbiAgICAgICAgICAgIChmb3VuZCwgc3luKSA9PiBmb3VuZCB8fCBwW3N5bl0sIHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzU291cmNlICYmICghbWV0YWRhdGEgfHwgIW1ldGFkYXRhLmVsZW1lbnRzKSkge1xuICAgICAgICAgICAgbWV0YWRhdGEgPSB7IC4uLm1ldGFkYXRhLCBlbGVtZW50czogZWxlbWVudHNTb3VyY2UgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjAyOiAnaW5zdHJ1Y3Rpb25zJyBpcyBubyBsb25nZXIgYW4gQVBJIGZpZWxkLiBVc2UgJ2NvbnRlbnQnIGZvciBhbGwgdHlwZXMuXG4gICAgICAgIC8vIElmIGFuIExMTSBzZW5kcyAnaW5zdHJ1Y3Rpb25zJywgcGFzcyBpdCB0aHJvdWdoIHNvIGNyZWF0ZUVsZW1lbnQgY2FuIHJlamVjdCB3aXRoIGd1aWRhbmNlLlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jcmVhdGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IHJlc29sdmVkVHlwZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcC5kZXNjcmlwdGlvbiBhcyBzdHJpbmcsXG4gICAgICAgICAgY29udGVudDogcC5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHAuaW5zdHJ1Y3Rpb25zIGFzIHN0cmluZyB8IHVuZGVmaW5lZCwgIC8vIFJlamVjdGVkIHdpdGggZ3VpZGFuY2UgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmxpc3RFbGVtZW50cyhcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyksXG4gICAgICAgICAgcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdnZXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICApO1xuXG4gICAgICAvLyBJc3N1ZSAjNzM4OiBDdXJyZW50bHkgc2hhcmVzIGNvZGUgcGF0aCB3aXRoICdnZXQnLiBGdXR1cmUgZGl2ZXJnZW5jZSBwb2ludCDigJRcbiAgICAgIC8vICdnZXREZXRhaWxzJyB3aWxsIHJldHVybiBleHRlbmRlZCBtZXRhZGF0YSAocmVsYXRpb25zaGlwIGdyYXBoLCBzdGFjayBtZW1iZXJzaGlwLFxuICAgICAgLy8gcG9saWN5IHJlc29sdXRpb24sIGFjdGl2YXRpb24gc3RhdGUsIHJldmVyc2UgZGVwZW5kZW5jaWVzKS5cbiAgICAgIGNhc2UgJ2dldERldGFpbHMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZWRpdEVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGlucHV0OiBwLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAndmFsaWRhdGUnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci52YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHN0cmljdDogcC5zdHJpY3QgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmRlbGV0ZUVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGRlbGV0ZURhdGE6IHAuZGVsZXRlRGF0YSBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnaW1wb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW1wb3J0RWxlbWVudChwKTtcblxuICAgICAgY2FzZSAnZXhwb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICAocC5mb3JtYXQgYXMgJ2pzb24nIHwgJ3lhbWwnKSB8fCAnanNvbidcbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEVsZW1lbnRDUlVEIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBlbGVtZW50IGltcG9ydCBvcGVyYXRpb24uXG4gICAqIFBhcnNlcyBleHBvcnQgcGFja2FnZSwgZGVzZXJpYWxpemVzIGVsZW1lbnQgZGF0YSwgYW5kIGNyZWF0ZXMgdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcGVyYXRpb24gcGFyYW1ldGVycyBjb250YWluaW5nIGRhdGEgYW5kIG9wdGlvbmFsIG92ZXJ3cml0ZSBmbGFnXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNyZWF0ZWQgZWxlbWVudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGV4cG9ydCBwYWNrYWdlIGlzIGludmFsaWQgb3IgZWxlbWVudCBhbHJlYWR5IGV4aXN0cyAod2hlbiBvdmVyd3JpdGUgaXMgZmFsc2UpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUltcG9ydEVsZW1lbnQocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVEO1xuXG4gICAgLy8gUGFyc2UgZXhwb3J0IHBhY2thZ2UgKGNhbiBiZSBzdHJpbmcgb3IgYWxyZWFkeS1wYXJzZWQgb2JqZWN0KVxuICAgIGxldCBleHBvcnRQYWNrYWdlOiBFeHBvcnRQYWNrYWdlO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleHBvcnRQYWNrYWdlID0gSlNPTi5wYXJzZShwYXJhbXMuZGF0YSkgYXMgRXhwb3J0UGFja2FnZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdvYmplY3QnICYmIHBhcmFtcy5kYXRhICE9PSBudWxsKSB7XG4gICAgICBleHBvcnRQYWNrYWdlID0gcGFyYW1zLmRhdGEgYXMgRXhwb3J0UGFja2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBkYXRhIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGV4cG9ydCBwYWNrYWdlIHN0cnVjdHVyZSB3aXRoIGRldGFpbGVkIG1pc3NpbmcgZmllbGQgcmVwb3J0aW5nXG4gICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBbJ2V4cG9ydFZlcnNpb24nLCAnZWxlbWVudFR5cGUnLCAnZm9ybWF0JywgJ2RhdGEnXSBhcyBjb25zdDtcbiAgICBjb25zdCBtaXNzaW5nRmllbGRzID0gcmVxdWlyZWRGaWVsZHMuZmlsdGVyKFxuICAgICAgKGZpZWxkKSA9PiAhZXhwb3J0UGFja2FnZVtmaWVsZCBhcyBrZXlvZiBFeHBvcnRQYWNrYWdlXVxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBtaXNzaW5nIGZpZWxkczogJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVzZXJpYWxpemUgZWxlbWVudCBkYXRhIGJhc2VkIG9uIGZvcm1hdFxuICAgIGxldCBlbGVtZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleHBvcnRQYWNrYWdlLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGVsZW1lbnREYXRhID0gSlNPTi5wYXJzZShleHBvcnRQYWNrYWdlLmRhdGEpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlLmZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBVc2UgSlNPTl9TQ0hFTUEgZm9yIHB1cmUgWUFNTCBwYXJzaW5nIChwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbilcbiAgICAgICAgLy8gSlNPTl9TQ0hFTUEgPSBGQUlMU0FGRSArIGJvb2wvaW50L2Zsb2F0L251bGwgKHNhZmVyIHRoYW4gREVGQVVMVCB3aGljaCBhZGRzIHRpbWVzdGFtcHMpXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZChleHBvcnRQYWNrYWdlLmRhdGEsIHsgc2NoZW1hOiB5YW1sLkpTT05fU0NIRU1BIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFlBTUwgZGF0YTogZXhwZWN0ZWQgb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudERhdGEgPSBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGZvcm1hdDogJHtleHBvcnRQYWNrYWdlLmZvcm1hdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgZWxlbWVudCBkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGVsZW1lbnQgZmllbGRzXG4gICAgY29uc3QgbmFtZSA9IGVsZW1lbnREYXRhLm5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZWxlbWVudERhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50RGF0YS5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnREYXRhLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFkZXNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgZGF0YTogbWlzc2luZyByZXF1aXJlZCBmaWVsZHMgKG5hbWUsIGRlc2NyaXB0aW9uKScpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG92ZXJ3cml0ZSBpcyBhbGxvd2VkXG4gICAgY29uc3Qgb3ZlcndyaXRlID0gcGFyYW1zLm92ZXJ3cml0ZSA9PT0gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCBvdmVyd3JpdGluZywgY2hlY2sgaWYgZWxlbWVudCBleGlzdHNcbiAgICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCBleHBvcnRQYWNrYWdlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgZWxlbWVudCBleGlzdHNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGFscmVhZHkgZXhpc3RzOiAke25hbWV9LiBVc2Ugb3ZlcndyaXRlOnRydWUgdG8gcmVwbGFjZSBpdC5gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVsZW1lbnQgZG9lc24ndCBleGlzdCwgb3IgZXJyb3IgZ2V0dGluZyBkZXRhaWxzIC0gcHJvY2VlZCB3aXRoIGNyZWF0aW9uXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgb3VyIG93biBcImFscmVhZHkgZXhpc3RzXCIgZXJyb3JcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIGVsZW1lbnQgZG9lc24ndCBleGlzdCAtIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBlbGVtZW50ICh3aWxsIG92ZXJ3cml0ZSBpZiBpdCBleGlzdHMpXG4gICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY29udGVudCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIEpTT04gb3IgWUFNTCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBFbGVtZW50IG5hbWUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSB0eXBlIC0gRWxlbWVudCB0eXBlIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIGVuc2VtYmxlKVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gRXhwb3J0IGZvcm1hdDogJ2pzb24nIG9yICd5YW1sJyAoZGVmYXVsdDogJ2pzb24nKVxuICAgKiBAcmV0dXJucyBFeHBvcnRQYWNrYWdlIHdpdGggc2VyaWFsaXplZCBlbGVtZW50IGRhdGFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnID0gJ2pzb24nXG4gICk6IFByb21pc2U8RXhwb3J0UGFja2FnZT4ge1xuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwb3J0IG9wZXJhdGlvbiByZXF1aXJlcyBuYW1lIHBhcmFtZXRlcicpO1xuICAgIH1cbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwb3J0IG9wZXJhdGlvbiByZXF1aXJlcyB0eXBlIHBhcmFtZXRlciAodmlhIGVsZW1lbnRUeXBlIG9yIHBhcmFtcy50eXBlKScpO1xuICAgIH1cblxuICAgIC8vIEdldCBlbGVtZW50IGRldGFpbHMgdXNpbmcgZXhpc3RpbmcgaGFuZGxlclxuICAgIGNvbnN0IGVsZW1lbnREZXRhaWxzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCB0eXBlKTtcblxuICAgIC8vIEJ1aWxkIGV4cG9ydCBwYWNrYWdlXG4gICAgY29uc3QgZXhwb3J0UGFja2FnZTogRXhwb3J0UGFja2FnZSA9IHtcbiAgICAgIGV4cG9ydFZlcnNpb246ICcxLjAnLFxuICAgICAgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZWxlbWVudFR5cGU6IHR5cGUsXG4gICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIGRhdGE6ICcnLFxuICAgIH07XG5cbiAgICAvLyBTZXJpYWxpemUgdG8gcmVxdWVzdGVkIGZvcm1hdFxuICAgIGlmIChmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgZXhwb3J0UGFja2FnZS5kYXRhID0geWFtbC5kdW1wKGVsZW1lbnREZXRhaWxzLCB7XG4gICAgICAgIGluZGVudDogMixcbiAgICAgICAgbGluZVdpZHRoOiAxMjAsXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRQYWNrYWdlLmRhdGEgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50RGV0YWlscywgbnVsbCwgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cG9ydFBhY2thZ2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTWVtb3J5IG9wZXJhdGlvbnMgdG8gTWVtb3J5TWFuYWdlclxuICAgKlxuICAgKiBNZW1vcnkgb3BlcmF0aW9ucyB3b3JrIG9uIGluZGl2aWR1YWwgTWVtb3J5IGluc3RhbmNlczpcbiAgICogMS4gR2V0IHRoZSBNZW1vcnkgYnkgbmFtZSBmcm9tIE1lbW9yeU1hbmFnZXJcbiAgICogMi4gQ2FsbCB0aGUgb3BlcmF0aW9uIG9uIHRoZSBNZW1vcnkgaW5zdGFuY2VcbiAgICovXG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IERlYm91bmNlIG1lbW9yeSBzYXZlcyB0byBwcmV2ZW50IGZpbGUgZGVzY3JpcHRvciBleGhhdXN0aW9uLlxuICAgKiBDb2FsZXNjZXMgcmFwaWQgYWRkRW50cnkgY2FsbHMg4oCUIG9ubHkgd3JpdGVzIHRoZSBsYXRlc3Qgc3RhdGUgYWZ0ZXIgdGhlIHdpbmRvdyBleHBpcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWJvdW5jZWRNZW1vcnlTYXZlKFxuICAgIG1lbW9yeU5hbWU6IHN0cmluZyxcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5LFxuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG1lbW9yeU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucGVuZGluZ1NhdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KGV4aXN0aW5nLnRpbWVyKTtcbiAgICAgIHRoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZCsrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQQVFMSGFuZGxlcl0gQ29hbGVzY2VkIHNhdmUgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nU2F2ZXMuc2l6ZX0sIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfREVCT1VOQ0VfTVM7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1NhdmVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbisrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2hpbmcgZGVib3VuY2VkIHNhdmUgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgICAgbWFuYWdlci5zYXZlKG1lbW9yeSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNQ1BBUUxIYW5kbGVyXSBEZWJvdW5jZWQgc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nU2F2ZXMuc2l6ZX0sIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KTogJHtlcnJ9YCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWJvdW5jZU1zKTtcbiAgICAvLyBFbnN1cmUgdGltZXIgZG9lc24ndCBrZWVwIE5vZGUgcHJvY2VzcyBhbGl2ZSAoaW1wb3J0YW50IGZvciB0ZXN0cy9zaHV0ZG93bilcbiAgICBpZiAodHlwZW9mIHRpbWVyID09PSAnb2JqZWN0JyAmJiAndW5yZWYnIGluIHRpbWVyKSB7XG4gICAgICB0aW1lci51bnJlZigpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdTYXZlcy5zZXQoa2V5LCB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NzogVHJhY2sgYWRkRW50cnkgY2FsbCBmcmVxdWVuY3kgcGVyIG1lbW9yeSBhbmQgbG9nIHdhcm5pbmdzIGF0IHRocmVzaG9sZHMuXG4gICAqXG4gICAqIFVzZXMgYSBzbGlkaW5nIHdpbmRvdyBjb3VudGVyIHRvIGRldGVjdCBydW5hd2F5IHNhdmUgbG9vcHMgYmVmb3JlIHRoZXkgZXhoYXVzdCByZXNvdXJjZXMuXG4gICAqIENvdW50ZXJzIGFyZSBib3VuZGVkOiBtYXggNTAwIHRyYWNrZWQgbWVtb3JpZXMsIG9sZGVzdC1maXJzdCBldmljdGlvbiB3aGVuIGV4Y2VlZGVkLlxuICAgKiBXYXJuaW5nL2NyaXRpY2FsIGZsYWdzIGF1dG8tcmVzZXQgd2hlbiBmcmVxdWVuY3kgZHJvcHMgYmVsb3cgdGhyZXNob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIG1lbW9yeU5hbWUgLSBOYW1lIG9mIHRoZSBtZW1vcnkgYmVpbmcgd3JpdHRlbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbWVtb3J5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd2luZG93TXMgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9NT05JVE9SX1dJTkRPV19NUztcbiAgICBjb25zdCB3YXJuVGhyZXNob2xkID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfRlJFUVVFTkNZX1dBUk5fVEhSRVNIT0xEO1xuICAgIGNvbnN0IGNyaXRpY2FsVGhyZXNob2xkID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfRlJFUVVFTkNZX0NSSVRJQ0FMX1RIUkVTSE9MRDtcblxuICAgIGxldCBjb3VudGVyID0gdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuZ2V0KGtleSk7XG4gICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICAvLyBFdmljdCBvbGRlc3QgZW50cnkgaWYgbWFwIGV4Y2VlZHMgc2l6ZSBsaW1pdCAocHJldmVudHMgdW5ib3VuZGVkIGdyb3d0aClcbiAgICAgIGlmICh0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5zaXplID49IDUwMCkge1xuICAgICAgICBjb25zdCBvbGRlc3RLZXkgPSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0S2V5KSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5kZWxldGUob2xkZXN0S2V5KTtcbiAgICAgIH1cbiAgICAgIGNvdW50ZXIgPSB7IHRpbWVzdGFtcHM6IFtdLCB3YXJuZWQ6IGZhbHNlLCBjcml0aWNhbDogZmFsc2UgfTtcbiAgICAgIHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNldChrZXksIGNvdW50ZXIpO1xuICAgIH1cblxuICAgIC8vIFBydW5lIHRpbWVzdGFtcHMgb3V0c2lkZSB0aGUgd2luZG93XG4gICAgY29uc3QgY3V0b2ZmID0gbm93IC0gd2luZG93TXM7XG4gICAgY291bnRlci50aW1lc3RhbXBzID0gY291bnRlci50aW1lc3RhbXBzLmZpbHRlcih0ID0+IHQgPiBjdXRvZmYpO1xuICAgIGNvdW50ZXIudGltZXN0YW1wcy5wdXNoKG5vdyk7XG5cbiAgICBjb25zdCBjb3VudCA9IGNvdW50ZXIudGltZXN0YW1wcy5sZW5ndGg7XG5cbiAgICBpZiAoY291bnQgPj0gY3JpdGljYWxUaHJlc2hvbGQgJiYgIWNvdW50ZXIuY3JpdGljYWwpIHtcbiAgICAgIGNvdW50ZXIuY3JpdGljYWwgPSB0cnVlO1xuICAgICAgbG9nZ2VyLmVycm9yKCdbTUNQQVFMSGFuZGxlcl0gU2F2ZSBmcmVxdWVuY3kgY3JpdGljYWwgdGhyZXNob2xkIGV4Y2VlZGVkJywge1xuICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICBjb3VudCxcbiAgICAgICAgdGhyZXNob2xkOiBjcml0aWNhbFRocmVzaG9sZCxcbiAgICAgICAgd2luZG93U2Vjb25kczogd2luZG93TXMgLyAxMDAwLFxuICAgICAgICB0cmFja2VkTWVtb3JpZXM6IHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNpemUsXG4gICAgICB9KTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLnRyYWNrU2F2ZUZyZXF1ZW5jeScsXG4gICAgICAgIGRldGFpbHM6IGBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIGV4Y2VlZHMgY3JpdGljYWwgc2F2ZSBmcmVxdWVuY3k6ICR7Y291bnR9IGNhbGxzIGluICR7d2luZG93TXMgLyAxMDAwfXNgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBtZW1vcnlOYW1lLCBjb3VudCwgdGhyZXNob2xkOiBjcml0aWNhbFRocmVzaG9sZCwgd2luZG93TXMgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPj0gd2FyblRocmVzaG9sZCAmJiAhY291bnRlci53YXJuZWQpIHtcbiAgICAgIGNvdW50ZXIud2FybmVkID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci53YXJuKCdbTUNQQVFMSGFuZGxlcl0gU2F2ZSBmcmVxdWVuY3kgd2FybiB0aHJlc2hvbGQgZXhjZWVkZWQnLCB7XG4gICAgICAgIG1lbW9yeU5hbWUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICB0aHJlc2hvbGQ6IHdhcm5UaHJlc2hvbGQsXG4gICAgICAgIHdpbmRvd1NlY29uZHM6IHdpbmRvd01zIC8gMTAwMCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHdhcm5pbmcgZmxhZ3Mgd2hlbiBjb3VudCBkcm9wcyBiYWNrIGJlbG93IHRocmVzaG9sZHNcbiAgICBpZiAoY291bnQgPCB3YXJuVGhyZXNob2xkKSB7XG4gICAgICBjb3VudGVyLndhcm5lZCA9IGZhbHNlO1xuICAgICAgY291bnRlci5jcml0aWNhbCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBGbHVzaCBhbGwgcGVuZGluZyBkZWJvdW5jZWQgc2F2ZXMgb24gc2h1dGRvd24uXG4gICAqIENhbGxlZCBieSBESSBjb250YWluZXIgZGlzcG9zZSBjaGFpbiB0byBlbnN1cmUgbm8gZGF0YSBpcyBsb3N0LlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZ1NhdmVzKCk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NjogRmx1c2ggYWxsIHBlbmRpbmcgZGVib3VuY2VkIHNhdmVzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgZmx1c2hQZW5kaW5nU2F2ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IFsuLi50aGlzLnBlbmRpbmdTYXZlcy5lbnRyaWVzKCldO1xuICAgIHRoaXMucGVuZGluZ1NhdmVzLmNsZWFyKCk7XG4gICAgaWYgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFtNQ1BBUUxIYW5kbGVyXSBGbHVzaGluZyAke3BlbmRpbmcubGVuZ3RofSBwZW5kaW5nIG1lbW9yeSBzYXZlKHMpIG9uIHNodXRkb3duICh0b3RhbCBjb2FsZXNjZWQ6ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkfSwgdG90YWwgd3JpdHRlbjogJHt0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVufSlgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfV0gb2YgcGVuZGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IHR5cGVvZiBtZW1vcnkuZ2V0RW50cmllcyA9PT0gJ2Z1bmN0aW9uJyA/IG1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSA6ICd1bmtub3duJztcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2ggc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSwgcGVuZGluZyByZW1haW5pbmc6ICR7cGVuZGluZy5sZW5ndGh9KTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaE1lbW9yeShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLm1lbW9yeU1hbmFnZXI7XG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXJcbiAgICAvLyBJc3N1ZSAjMzIzOiBVc2Ugc2hhcmVkIHZhbGlkYXRpb24gdXRpbGl0eVxuICAgIGNvbnN0IG1lbW9yeU5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIG1lbW9yeSB0byBvcGVyYXRlIG9uJ1xuICAgICk7XG5cbiAgICAvLyBHZXQgdGhlIG1lbW9yeSBpbnN0YW5jZSBieSBuYW1lIHVzaW5nIGZpbmQoKVxuICAgIC8vIE1lbW9yeSBuYW1lIGlzIHN0b3JlZCBpbiBtZXRhZGF0YS5uYW1lXG4gICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgbWFuYWdlci5maW5kKG0gPT4gbS5tZXRhZGF0YS5uYW1lID09PSBtZW1vcnlOYW1lKTtcbiAgICBpZiAoIW1lbW9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIG5vdCBmb3VuZC4gVXNlIGxpc3RfZWxlbWVudHMgdG8gc2VlIGF2YWlsYWJsZSBtZW1vcmllcy5gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnYWRkRW50cnknOiB7XG4gICAgICAgIC8vIEZpeCAjMzg3OiBBY2NlcHQgJ2VudHJ5JyBhcyBhbGlhcyBmb3IgJ2NvbnRlbnQnXG4gICAgICAgIGlmIChwYXJhbXMuZW50cnkgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMuY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zLmNvbnRlbnQgPSBwYXJhbXMuZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3M/LCBtZXRhZGF0YT8pXG4gICAgICAgIC8vIEZpeCAjMzg3IE9wdGlvbiBEOiBDb250ZXh0dWFsIGVycm9yIG1lc3NhZ2UgZ3VpZGluZyB0b3dhcmQgY29ycmVjdCBwYXJhbWV0ZXJcbiAgICAgICAgaWYgKHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvbnRlbnQgPT09IG51bGwgfHwgdHlwZW9mIHBhcmFtcy5jb250ZW50ICE9PSAnc3RyaW5nJyB8fCAocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgaGludCA9IHBhcmFtcy5lbnRyeSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGBZb3UgcGFzc2VkICdlbnRyeScsIGJ1dCBhbiBlbnRyeSBpcyB0aGUgZnVsbCBvYmplY3QgKGNvbnRlbnQgKyB0YWdzICsgbWV0YWRhdGEgKyB0aW1lc3RhbXApLiBgICtcbiAgICAgICAgICAgICAgYFVzZSAnY29udGVudCcgdG8gcHJvdmlkZSB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBlbnRyeS5gXG4gICAgICAgICAgICA6IGBUaGUgJ2NvbnRlbnQnIHBhcmFtZXRlciBpcyB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBtZW1vcnkgZW50cnkuYDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnRlbnQnLiAke2hpbnR9IGAgK1xuICAgICAgICAgICAgYEV4YW1wbGU6IHsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiJHttZW1vcnlOYW1lfVwiLCBjb250ZW50OiBcInlvdXIgdGV4dCBoZXJlXCIsIHRhZ3M6IFtcIm9wdGlvbmFsXCJdIH0gfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJhbXMuY29udGVudCBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBwYXJhbXMudGFncyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJhbXMubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5UmVzdWx0ID0gbWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3MsIG1ldGFkYXRhKTtcbiAgICAgICAgLy8gSXNzdWUgIzY1NzogVHJhY2sgc2F2ZSBmcmVxdWVuY3kgYW5kIGFsZXJ0IG9uIGFub21hbG91cyBwYXR0ZXJucy5cbiAgICAgICAgdGhpcy50cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZSk7XG4gICAgICAgIC8vIElzc3VlICM2NTY6IERlYm91bmNlIHNhdmVzIHRvIHByZXZlbnQgRkQgZXhoYXVzdGlvbiBmcm9tIHJhcGlkIGFkZEVudHJ5IGNhbGxzLlxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgYWxyZWFkeSBpbiBtZW1vcnkg4oCUIGRpc2sgd3JpdGUgaXMgZGVmZXJyZWQgYW5kIGNvYWxlc2NlZC5cbiAgICAgICAgdGhpcy5kZWJvdW5jZWRNZW1vcnlTYXZlKG1lbW9yeU5hbWUsIG1lbW9yeSwgbWFuYWdlcik7XG4gICAgICAgIHJldHVybiBlbnRyeVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnY2xlYXInOiB7XG4gICAgICAgIC8vIE1lbW9yeS5jbGVhckFsbChjb25maXJtKSAtIHJlcXVpcmVzIGV4cGxpY2l0IGNvbmZpcm1hdGlvblxuICAgICAgICBjb25zdCBjbGVhclJlc3VsdCA9IG1lbW9yeS5jbGVhckFsbCh0cnVlKTtcbiAgICAgICAgLy8gRml4ICM0Mzg6IFBlcnNpc3QgdG8gZGlzayBzbyBjbGVhcmVkIHN0YXRlIHN1cnZpdmVzIHJlc3RhcnRcbiAgICAgICAgYXdhaXQgbWFuYWdlci5zYXZlKG1lbW9yeSk7XG4gICAgICAgIHJldHVybiBjbGVhclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIE1lbW9yeSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBZ2VudCBvcGVyYXRpb25zIHRvIEFnZW50TWFuYWdlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEFnZW50KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyO1xuICAgIC8vIElzc3VlICMyOTA6IFVzZSBlbGVtZW50X25hbWUgcGFyYW1ldGVyXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICBjb25zdCBhZ2VudE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIGFnZW50IHRvIGV4ZWN1dGUnXG4gICAgKTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdleGVjdXRlJzpcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQWdlbnQgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggVGVtcGxhdGUgb3BlcmF0aW9ucyB0byBUZW1wbGF0ZVJlbmRlcmVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoVGVtcGxhdGUoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHRoaXMuaGFuZGxlcnMudGVtcGxhdGVSZW5kZXJlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgY29uc3QgdGVtcGxhdGVOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgIHBhcmFtcyxcbiAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXInXG4gICAgKTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdyZW5kZXInOlxuICAgICAgICByZXR1cm4gcmVuZGVyZXIucmVuZGVyKFxuICAgICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgICBwYXJhbXMudmFyaWFibGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIHBhcmFtcy5zZWN0aW9uIGFzICd0ZW1wbGF0ZScgfCAnc3R5bGUnIHwgJ3NjcmlwdCcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLmFsbF9zZWN0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBUZW1wbGF0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBY3RpdmF0aW9uIG9wZXJhdGlvbnMgKGNyb3NzLWN1dHRpbmcgY29uY2VybilcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hBY3RpdmF0aW9uKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVEO1xuICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBwYXJhbWV0ZXIgbmFtZXNcbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGJlZm9yZSB1c2VcbiAgICAvLyBGb3IgZ2V0QWN0aXZlLCBlbGVtZW50X25hbWUgaXMgbm90IHJlcXVpcmVkXG4gICAgaWYgKG1ldGhvZCAhPT0gJ2dldEFjdGl2ZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICBwLFxuICAgICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGFjdGl2YXRlL2RlYWN0aXZhdGUnXG4gICAgICApO1xuXG4gICAgICAvLyBlbGVtZW50X3R5cGUgY2FuIGNvbWUgZnJvbSBpbnB1dC5lbGVtZW50VHlwZSBvciBwYXJhbXMuZWxlbWVudF90eXBlXG4gICAgICBjb25zdCB0eXBlID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8IHR5cGUudHJpbSgpID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICdlbGVtZW50X3R5cGUnLiBFeHBlY3RlZDogc3RyaW5nIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIG9yIGVuc2VtYmxlKWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZhdGUnOlxuICAgICAgICAgIHJldHVybiBoYW5kbGVyLmFjdGl2YXRlRWxlbWVudChcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgcC5jb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcblxuICAgICAgICBjYXNlICdkZWFjdGl2YXRlJzpcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudChuYW1lLCB0eXBlKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBY3RpdmF0aW9uIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0QWN0aXZlOiBlbGVtZW50X3R5cGUgaXMgb3B0aW9uYWwgLSBpZiBub3QgcHJvdmlkZWQsIHJldHVybnMgYWxsIGFjdGl2ZSBlbGVtZW50c1xuICAgIC8vIElzc3VlICM1MDE6IFBhc3MgdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQg4oCUIGdldEFjdGl2ZUVsZW1lbnRzIGhhbmRsZXMgYm90aCBjYXNlc1xuICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gaGFuZGxlci5nZXRBY3RpdmVFbGVtZW50cyh0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBTZWFyY2ggb3BlcmF0aW9ucyB0byBFbGVtZW50UXVlcnlTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoU2VhcmNoKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5U2VydmljZSA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudFF1ZXJ5U2VydmljZTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTZWFyY2hFbGVtZW50cyhpbnB1dCk7XG5cbiAgICAgIGNhc2UgJ3F1ZXJ5Jzoge1xuICAgICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50VHlwZSBpcyByZXF1aXJlZCBmb3IgcXVlcnlcbiAgICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZWxlbWVudFR5cGUgaXMgcmVxdWlyZWQgZm9yIHF1ZXJ5X2VsZW1lbnRzIG9wZXJhdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJhdyBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgKGNhc3QgdG8gSUVsZW1lbnRbXSBmb3IgcXVlcnkgc2VydmljZSlcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAoYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50cyhlbGVtZW50VHlwZSkpIGFzIElFbGVtZW50W107XG5cbiAgICAgICAgLy8gQnVpbGQgUXVlcnlPcHRpb25zIGZyb20gcGFyYW1zXG4gICAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHF1ZXJ5T3B0aW9uczoge1xuICAgICAgICAgIGZpbHRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBzb3J0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgcGFnaW5hdGlvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGFnZ3JlZ2F0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9ID0ge307XG5cbiAgICAgICAgaWYgKHAuZmlsdGVycykge1xuICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5maWx0ZXJzID0gcC5maWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnNvcnQpIHtcbiAgICAgICAgICBxdWVyeU9wdGlvbnMuc29ydCA9IHAuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgcXVlcnlPcHRpb25zLnBhZ2luYXRpb24gPSBwLnBhZ2luYXRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYWdncmVnYXRpb24gcmVxdWVzdHMgKElzc3VlICMzMDkpIOKAlCBkZWxlZ2F0ZXMgdG8gc2hhcmVkIEFnZ3JlZ2F0aW9uU2VydmljZVxuICAgICAgICBpZiAocC5hZ2dyZWdhdGUpIHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBwLmFnZ3JlZ2F0ZSBhcyB7IGNvdW50PzogYm9vbGVhbjsgZ3JvdXBfYnk/OiBzdHJpbmcgfTtcblxuICAgICAgICAgIC8vIFZhbGlkYXRlIGFnZ3JlZ2F0aW9uIG9wdGlvbnNcbiAgICAgICAgICBjb25zdCBhZ2dFcnJvciA9IHZhbGlkYXRlQWdncmVnYXRpb25PcHRpb25zKGFnZ3JlZ2F0ZSk7XG4gICAgICAgICAgaWYgKGFnZ0Vycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYWdnRXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhZ2dyZWdhdGVFbGVtZW50cyhcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBhZ2dyZWdhdGUsXG4gICAgICAgICAgICBxdWVyeU9wdGlvbnMuZmlsdGVycyBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzUwMDogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgKHBhZ2VTaXplLCBwYWdlLCBsaW1pdCwgb2Zmc2V0KVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZmxhdCBwYXJhbXMgbGlrZSB7IHBhZ2VTaXplOiA1IH0gd29yayB0aGUgc2FtZSBhcyB7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUgfSB9XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYWdpbmF0aW9uID0gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhwKTtcbiAgICAgICAgcXVlcnlPcHRpb25zLnBhZ2luYXRpb24gPSBub3JtYWxpemVkUGFnaW5hdGlvbjtcblxuICAgICAgICAvLyBFeGVjdXRlIHF1ZXJ5IHdpdGggRWxlbWVudFF1ZXJ5U2VydmljZVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5U2VydmljZS5xdWVyeShlbGVtZW50cywgcXVlcnlPcHRpb25zKTtcblxuICAgICAgICAvLyBSZXR1cm4gY29uY2lzZSBzdHJ1Y3R1cmVkIHJlc3BvbnNlIChJc3N1ZSAjMjk5KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiBxdWVyeVJlc3VsdC5pdGVtcy5tYXAoKGl0ZW06IElFbGVtZW50KSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogaXRlbS5tZXRhZGF0YT8ubmFtZSB8fCAnVW5rbm93bicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogaXRlbS5tZXRhZGF0YT8uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHZlcnNpb246IGl0ZW0ubWV0YWRhdGE/LnZlcnNpb24gfHwgaXRlbS52ZXJzaW9uLFxuICAgICAgICAgICAgdGFnczogaXRlbS5tZXRhZGF0YT8udGFncyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgcGFnaW5hdGlvbjogcXVlcnlSZXN1bHQucGFnaW5hdGlvbixcbiAgICAgICAgICBzb3J0aW5nOiBxdWVyeVJlc3VsdC5zb3J0aW5nLFxuICAgICAgICAgIGZpbHRlcnM6IHF1ZXJ5UmVzdWx0LmZpbHRlcnMuYXBwbGllZC5jb3VudCA+IDAgPyB7IGFwcGxpZWQ6IHF1ZXJ5UmVzdWx0LmZpbHRlcnMuYXBwbGllZCB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBTZWFyY2ggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBOT1RFOiBVbmlmaWVkIFNlYXJjaCBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKSBhcmUgbm93IHNjaGVtYS1kcml2ZW4uXG4gIC8vIFRoZSAnc2VhcmNoJyBvcGVyYXRpb24gdXNlcyB0aGUgJ3NlYXJjaFBhcmFtcycgbm9ybWFsaXplciBpbiBPcGVyYXRpb25TY2hlbWEudHMuXG4gIC8vIFNlZTogU2VhcmNoUGFyYW1zTm9ybWFsaXplciBmb3Igc2NvcGUvcGFnaW5hdGlvbi9zb3J0L2ZpbHRlciB0cmFuc2Zvcm1hdGlvbi5cblxuICAvKipcbiAgICogRGlzcGF0Y2ggSW50cm9zcGVjdGlvbiBvcGVyYXRpb25zIHRvIEludHJvc3BlY3Rpb25SZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaEludHJvc3BlY3Rpb24oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncmVzb2x2ZSc6XG4gICAgICAgIHJldHVybiBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIucmVzb2x2ZShwYXJhbXMpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSW50cm9zcGVjdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggZWxlbWVudHMgYWNyb3NzIG9uZSBvciBhbGwgZWxlbWVudCB0eXBlc1xuICAgKlxuICAgKiBJbXBsZW1lbnRzIHNpbXBsZSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBtYXRjaGluZyBvbjpcbiAgICogLSBtZXRhZGF0YS5uYW1lXG4gICAqIC0gbWV0YWRhdGEuZGVzY3JpcHRpb25cbiAgICogLSBjb250ZW50IChpZiBhdmFpbGFibGUpXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wdGlvbmFsIGVsZW1lbnRUeXBlIGFuZCBzZWFyY2ggcGFyYW1zXG4gICAqIEByZXR1cm5zIFNlYXJjaCByZXN1bHRzIHdpdGggbWF0Y2hlZCBlbGVtZW50cyBhbmQgcmVsZXZhbmNlIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VhcmNoRWxlbWVudHMoaW5wdXQ6IE9wZXJhdGlvbklucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHF1ZXJ5ID0gKHAucXVlcnkgYXMgc3RyaW5nKT8udHJpbSgpO1xuXG4gICAgLy8gSXNzdWUgIzUwMDogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgKHBhZ2VTaXplLCBwYWdlLCBsaW1pdCwgb2Zmc2V0KVxuICAgIGNvbnN0IHsgcGFnZSwgcGFnZVNpemUgfSA9IG5vcm1hbGl6ZVBhZ2luYXRpb25QYXJhbXMocCk7XG5cbiAgICAvLyBFeHRyYWN0IHNvcnQgcGFyYW1zXG4gICAgY29uc3Qgc29ydFBhcmFtID0gcC5zb3J0IGFzIHsgc29ydEJ5Pzogc3RyaW5nOyBzb3J0T3JkZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzb3J0QnkgPSBzb3J0UGFyYW0/LnNvcnRCeSA/PyAnbmFtZSc7XG4gICAgY29uc3Qgc29ydE9yZGVyID0gKHNvcnRQYXJhbT8uc29ydE9yZGVyID8/ICdhc2MnKSBhcyAnYXNjJyB8ICdkZXNjJztcblxuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBsZW5ndGggbGltaXRcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocXVlcnkubGVuZ3RoID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgbXVzdCBiZSB1bmRlciAxMDAwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZWxlbWVudCB0eXBlcyB0byBzZWFyY2ggKElzc3VlICM0MzM6IGFjY2VwdCBzaW5ndWxhciBmb3JtcylcbiAgICBsZXQgZWxlbWVudFR5cGVzOiBzdHJpbmdbXTtcbiAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHtlbGVtZW50VHlwZX0nLiBWYWxpZCB0eXBlczogJHtmb3JtYXRFbGVtZW50VHlwZXNMaXN0KCl9YCk7XG4gICAgICB9XG4gICAgICBlbGVtZW50VHlwZXMgPSBbbm9ybWFsaXplZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlcyA9IFsuLi5BTExfRUxFTUVOVF9UWVBFU107XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUmVzdWx0czogQXJyYXk8e1xuICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIG1hdGNoZWRJbjogc3RyaW5nW107XG4gICAgfT4gPSBbXTtcblxuICAgIC8vIENvbGxlY3QgQUxMIG1hdGNoZXMgKG5vIGVhcmx5IHRlcm1pbmF0aW9uIOKAlCBwYWdpbmF0aW9uIGhhbmRsZXMgbGltaXRpbmcpXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIGVsZW1lbnRUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEVsZW1lbnRzKHR5cGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkSW46IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSAoZWxlbWVudC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge307XG5cbiAgICAgICAgICAvLyBDaGVjayBuYW1lIG1hdGNoXG4gICAgICAgICAgY29uc3QgbmFtZSA9IChtZXRhZGF0YS5uYW1lIGFzIHN0cmluZykgfHwgJyc7XG4gICAgICAgICAgaWYgKG5hbWUgJiYgaXNTZWFyY2hNYXRjaChxdWVyeSwgbmFtZSkpIHtcbiAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCduYW1lJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgZGVzY3JpcHRpb24gbWF0Y2hcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChtZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBpc1NlYXJjaE1hdGNoKHF1ZXJ5LCBkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCdkZXNjcmlwdGlvbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGNvbnRlbnQgbWF0Y2ggKGlmIGF2YWlsYWJsZSlcbiAgICAgICAgICBpZiAoZWxlbWVudC5jb250ZW50ICYmIHR5cGVvZiBlbGVtZW50LmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWFyY2hNYXRjaChxdWVyeSwgZWxlbWVudC5jb250ZW50IGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZEluLnB1c2goJ2NvbnRlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBhbnkgbWF0Y2hlcyBmb3VuZCwgYWRkIHRvIHJlc3VsdHNcbiAgICAgICAgICAvLyBVc2UgJ25hbWUnIGhlcmUg4oCUIEZJRUxEX1RSQU5TRk9STVMgd2lsbCByZW5hbWUgdG8gJ2VsZW1lbnRfbmFtZScgaW4gYXBwbHlGaWVsZFNlbGVjdGlvblxuICAgICAgICAgIGlmIChtYXRjaGVkSW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWxsUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIG1hdGNoZWRJbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU2tpcCBlbGVtZW50IHR5cGVzIHRoYXQgZmFpbCB0byBsb2FkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgZWxlbWVudHMgZm9yIHNlYXJjaDogJHt0eXBlfWAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCByZXN1bHRzIChjdXJyZW50bHkgb25seSAnbmFtZScgaXMgc3VwcG9ydGVkIGFzIGEgc29ydCBmaWVsZClcbiAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0gWy4uLmFsbFJlc3VsdHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGNtcCA9IGEubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gLWNtcCA6IGNtcDtcbiAgICB9KTtcblxuICAgIC8vIFBhZ2luYXRlIHZpYSBQYWdpbmF0aW9uU2VydmljZVxuICAgIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBQYWdpbmF0aW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBhZ2luYXRlZCA9IHBhZ2luYXRvci5wYWdpbmF0ZShzb3J0ZWRSZXN1bHRzLCB7IHBhZ2UsIHBhZ2VTaXplIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBwYWdpbmF0ZWQuaXRlbXMsXG4gICAgICBwYWdpbmF0aW9uOiBwYWdpbmF0ZWQucGFnaW5hdGlvbixcbiAgICAgIHNvcnRpbmc6IHsgc29ydEJ5LCBzb3J0T3JkZXIgfSxcbiAgICAgIHF1ZXJ5LFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1DUC1BUUwgRXh0ZW5zaW9uIERpc3BhdGNoIE1ldGhvZHMgKElzc3VlICMyNDEpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQ29sbGVjdGlvbiBvcGVyYXRpb25zIHRvIENvbGxlY3Rpb25IYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQ29sbGVjdGlvbihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQ29sbGVjdGlvbkhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnYnJvd3NlJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuYnJvd3NlQ29sbGVjdGlvbihcbiAgICAgICAgICBwYXJhbXMuc2VjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaENvbGxlY3Rpb24ocGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaEVuaGFuY2VkJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcsIHBhcmFtcyk7XG5cbiAgICAgIGNhc2UgJ2dldENvbnRlbnQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDb2xsZWN0aW9uQ29udGVudChwYXJhbXMucGF0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBjYXNlICdnZXRDYWNoZUhlYWx0aCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpO1xuXG4gICAgICBjYXNlICdpbnN0YWxsJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW5zdGFsbENvbnRlbnQocGFyYW1zLnBhdGggYXMgc3RyaW5nKTtcblxuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc3VibWl0Q29udGVudChwYXJhbXMuY29udGVudCBhcyBzdHJpbmcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQ29sbGVjdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBQb3J0Zm9saW8gb3BlcmF0aW9ucyB0byBQb3J0Zm9saW9IYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUG9ydGZvbGlvKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMucG9ydGZvbGlvSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydGZvbGlvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogUG9ydGZvbGlvSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzdGF0dXMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5wb3J0Zm9saW9TdGF0dXMocGFyYW1zLnVzZXJuYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNhc2UgJ2luaXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5pbml0UG9ydGZvbGlvKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcGFyYW1zLnJlcG9zaXRvcnlfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcHJpdmF0ZTogcGFyYW1zLnByaXZhdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcGFyYW1zLmRlc2NyaXB0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2NvbmZpZyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnBvcnRmb2xpb0NvbmZpZyh7XG4gICAgICAgICAgYXV0b1N5bmM6IHBhcmFtcy5hdXRvX3N5bmMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWZhdWx0VmlzaWJpbGl0eTogcGFyYW1zLmRlZmF1bHRfdmlzaWJpbGl0eSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgYXV0b1N1Ym1pdDogcGFyYW1zLmF1dG9fc3VibWl0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHBhcmFtcy5yZXBvc2l0b3J5X25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc3luYyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnN5bmNQb3J0Zm9saW8oe1xuICAgICAgICAgIGRpcmVjdGlvbjogKHBhcmFtcy5kaXJlY3Rpb24gYXMgc3RyaW5nKSB8fCAncHVzaCcsXG4gICAgICAgICAgbW9kZTogcGFyYW1zLm1vZGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcmNlOiBwYXJhbXMuZm9yY2UgYXMgYm9vbGVhbiB8fCBmYWxzZSxcbiAgICAgICAgICBkcnlSdW46IHBhcmFtcy5kcnlfcnVuIGFzIGJvb2xlYW4gfHwgZmFsc2UsXG4gICAgICAgICAgY29uZmlybURlbGV0aW9uczogcGFyYW1zLmNvbmZpcm1fZGVsZXRpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hQb3J0Zm9saW8oe1xuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMucXVlcnkgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZnV6enlNYXRjaDogcGFyYW1zLmZ1enp5X21hdGNoIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4UmVzdWx0czogcGFyYW1zLm1heF9yZXN1bHRzIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlS2V5d29yZHM6IHBhcmFtcy5pbmNsdWRlX2tleXdvcmRzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZVRhZ3M6IHBhcmFtcy5pbmNsdWRlX3RhZ3MgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlVHJpZ2dlcnM6IHBhcmFtcy5pbmNsdWRlX3RyaWdnZXJzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZURlc2NyaXB0aW9uczogcGFyYW1zLmluY2x1ZGVfZGVzY3JpcHRpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2hBbGwnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hBbGwoe1xuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMucXVlcnkgYXMgc3RyaW5nLFxuICAgICAgICAgIHNvdXJjZXM6IHBhcmFtcy5zb3VyY2VzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFnZTogcGFyYW1zLnBhZ2UgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhZ2VTaXplOiBwYXJhbXMucGFnZV9zaXplIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBzb3J0Qnk6IHBhcmFtcy5zb3J0X2J5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2VsZW1lbnRNYW5hZ2VyJzoge1xuICAgICAgICBjb25zdCBzeW5jSGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuc3luY0hhbmRsZXI7XG4gICAgICAgIGlmICghc3luY0hhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBlbGVtZW50IG1hbmFnZXIgbm90IGF2YWlsYWJsZTogU3luY0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3luY0hhbmRsZXIuaGFuZGxlU3luY09wZXJhdGlvbih7XG4gICAgICAgICAgb3BlcmF0aW9uOiBwYXJhbXMub3BlcmF0aW9uIGFzICdsaXN0LXJlbW90ZScgfCAnZG93bmxvYWQnIHwgJ3VwbG9hZCcgfCAnY29tcGFyZScsXG4gICAgICAgICAgZWxlbWVudF9uYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgRWxlbWVudFR5cGUgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZmlsdGVyOiBwYXJhbXMuZmlsdGVyIGFzIHsgdHlwZT86IEVsZW1lbnRUeXBlOyBhdXRob3I/OiBzdHJpbmc7IHVwZGF0ZWRfYWZ0ZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBvcHRpb25zOiBwYXJhbXMub3B0aW9ucyBhcyB7IGZvcmNlPzogYm9vbGVhbjsgZHJ5X3J1bj86IGJvb2xlYW47IGluY2x1ZGVfcHJpdmF0ZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBQb3J0Zm9saW8gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQXV0aCBvcGVyYXRpb25zIHRvIEdpdEh1YkF1dGhIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQXV0aChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmF1dGhIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogR2l0SHViQXV0aEhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc2V0dXAnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZXR1cEdpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY2hlY2snOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jaGVja0dpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY2xlYXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jbGVhckdpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY29uZmlndXJlT0F1dGgnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jb25maWd1cmVPQXV0aChwYXJhbXMuY2xpZW50X2lkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNhc2UgJ29hdXRoSGVscGVyU3RhdHVzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0T0F1dGhIZWxwZXJTdGF0dXMocGFyYW1zLnZlcmJvc2UgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBdXRoIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIENvbmZpZyBvcGVyYXRpb25zIHRvIENvbmZpZ0hhbmRsZXIgYW5kIEJ1aWxkSW5mb1NlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hDb25maWcoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnbWFuYWdlJzoge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5jb25maWdIYW5kbGVyO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IENvbmZpZ0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlci5oYW5kbGVDb25maWdPcGVyYXRpb24oe1xuICAgICAgICAgIGFjdGlvbjogcGFyYW1zLmFjdGlvbiBhcyAnZ2V0JyB8ICdzZXQnIHwgJ3Jlc2V0JyB8ICdleHBvcnQnIHwgJ2ltcG9ydCcgfCAnd2l6YXJkJyxcbiAgICAgICAgICBzZXR0aW5nOiBwYXJhbXMuc2V0dGluZyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgdmFsdWU6IHBhcmFtcy52YWx1ZSxcbiAgICAgICAgICBzZWN0aW9uOiBwYXJhbXMuc2VjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZm9ybWF0OiBwYXJhbXMuZm9ybWF0IGFzICd5YW1sJyB8ICdqc29uJyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRCdWlsZEluZm8nOiB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmhhbmRsZXJzLmJ1aWxkSW5mb1NlcnZpY2U7XG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRJbmZvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQnVpbGRJbmZvU2VydmljZSBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzZXJ2aWNlLmdldEJ1aWxkSW5mbygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBzZXJ2aWNlLmZvcm1hdEJ1aWxkSW5mbyhpbmZvKVxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldENhY2hlQnVkZ2V0UmVwb3J0Jzoge1xuICAgICAgICBjb25zdCBidWRnZXQgPSB0aGlzLmhhbmRsZXJzLmNhY2hlTWVtb3J5QnVkZ2V0O1xuICAgICAgICBpZiAoIWJ1ZGdldCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGUgYnVkZ2V0IG5vdCBhdmFpbGFibGU6IENhY2hlTWVtb3J5QnVkZ2V0IG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVwb3J0ID0gYnVkZ2V0LmdldFJlcG9ydCgpO1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgJyMgQ2FjaGUgTWVtb3J5IEJ1ZGdldCBSZXBvcnQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGAqKkJ1ZGdldDoqKiAke3JlcG9ydC5idWRnZXRNQn0gTUJgLFxuICAgICAgICAgIGAqKlVzZWQ6KiogJHtyZXBvcnQudG90YWxNZW1vcnlNQn0gTUIgKCR7cmVwb3J0LnV0aWxpemF0aW9uUGVyY2VudH0lKWAsXG4gICAgICAgICAgYCoqUmVnaXN0ZXJlZCBDYWNoZXM6KiogJHtyZXBvcnQuY2FjaGVzLmxlbmd0aH1gLFxuICAgICAgICAgICcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVwb3J0LmNhY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZXMucHVzaCgnfCBDYWNoZSB8IEVudHJpZXMgfCBNZW1vcnkgKE1CKSB8IEhpdCBSYXRlIHwgTGFzdCBBY3Rpdml0eSB8Jyk7XG4gICAgICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18Jyk7XG4gICAgICAgICAgZm9yIChjb25zdCBjIG9mIHJlcG9ydC5jYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYy5sYXN0QWN0aXZpdHlNcyA+IDBcbiAgICAgICAgICAgICAgPyBgJHsoKERhdGUubm93KCkgLSBjLmxhc3RBY3Rpdml0eU1zKSAvIDEwMDApLnRvRml4ZWQoMCl9cyBhZ29gXG4gICAgICAgICAgICAgIDogJ25ldmVyJztcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYHwgJHtjLm5hbWV9IHwgJHtjLmVudHJpZXN9IHwgJHtjLm1lbW9yeU1CfSB8ICR7KGMuaGl0UmF0ZSAqIDEwMCkudG9GaXhlZCgxKX0lIHwgJHthY3Rpdml0eX0gfGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKCdfTm8gY2FjaGVzIHJlZ2lzdGVyZWQuXycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGxpbmVzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIENvbmZpZyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgdG8gRW5oYW5jZWRJbmRleEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbmhhbmNlZEluZGV4KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBFbmhhbmNlZEluZGV4SGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdmaW5kU2ltaWxhcic6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmZpbmRTaW1pbGFyRWxlbWVudHMoe1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgbGltaXQ6IChwYXJhbXMubGltaXQgYXMgbnVtYmVyKSA/PyAxMCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IChwYXJhbXMudGhyZXNob2xkIGFzIG51bWJlcikgPz8gMC41LFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnZ2V0UmVsYXRpb25zaGlwcyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGVzOiBwYXJhbXMucmVsYXRpb25zaGlwX3R5cGVzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoQnlWZXJiJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQnlWZXJiKHtcbiAgICAgICAgICB2ZXJiOiBwYXJhbXMudmVyYiBhcyBzdHJpbmcsXG4gICAgICAgICAgbGltaXQ6IChwYXJhbXMubGltaXQgYXMgbnVtYmVyKSA/PyAyMCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2dldFN0YXRzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0UmVsYXRpb25zaGlwU3RhdHMoKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEVuaGFuY2VkSW5kZXggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggUGVyc29uYSBvcGVyYXRpb25zIHRvIFBlcnNvbmFIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUGVyc29uYShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnBlcnNvbmFIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogUGVyc29uYUhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnaW1wb3J0Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBzb3VyY2UgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICAgICAgY29uc3Qgc291cmNlID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3NvdXJjZScsXG4gICAgICAgICAgJ1VSTCBvciBmaWxlIHBhdGggdG8gaW1wb3J0IHBlcnNvbmEgZnJvbSdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW1wb3J0UGVyc29uYShzb3VyY2UsIHBhcmFtcy5vdmVyd3JpdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBQZXJzb25hIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEdhdGVrZWVwZXIgb3BlcmF0aW9ucyBmb3IgY29uZmlybWF0aW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IEhhbmRsZXMgdGhlIGNvbmZpcm1fb3BlcmF0aW9uIGZsb3cgd2hlcmUgdXNlcnMgYXBwcm92ZVxuICAgKiBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjb25maXJtYXRpb24gcGVyIEdhdGVrZWVwZXIgcG9saWN5LlxuICAgKlxuICAgKiBGbG93OlxuICAgKiAxLiBHYXRla2VlcGVyLmVuZm9yY2UoKSByZXR1cm5zIGNvbmZpcm1hdGlvblBlbmRpbmc6IHRydWVcbiAgICogMi4gTExNIGNhbGxzIGNvbmZpcm1fb3BlcmF0aW9uIHdpdGggdGhlIG9wZXJhdGlvbiBuYW1lXG4gICAqIDMuIFRoaXMgbWV0aG9kIHJlY29yZHMgdGhlIGNvbmZpcm1hdGlvbiBpbiB0aGUgc2Vzc2lvblxuICAgKiA0LiBMTE0gcmV0cmllcyB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLCB3aGljaCBub3cgcGFzc2VzIHZpYSBMYXllciAzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoR2F0ZWtlZXBlcihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdjb25maXJtJzoge1xuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnb3BlcmF0aW9uJyxcbiAgICAgICAgICAndGhlIG9wZXJhdGlvbiBuYW1lIHRvIGNvbmZpcm0gKGUuZy4gXCJjcmVhdGVfZWxlbWVudFwiKSdcbiAgICAgICAgKTtcbiAgICAgICAgLy8gSXNzdWUgIzE2MzY6IE5vcm1hbGl6ZSBlbGVtZW50X3R5cGUgdG8gbWF0Y2ggdGhlIE1DUC1BUUwgc2luZ3VsYXIgZm9ybVxuICAgICAgICAvLyB1c2VkIGJ5IHRoZSBlbmZvcmNlIHBhdGguIFdpdGhvdXQgdGhpcywgc2NvcGVkIGNvbmZpcm1hdGlvbnMgc3RvcmVkIGFzXG4gICAgICAgIC8vIFwiY3JlYXRlX2VsZW1lbnQ6c2tpbGxzXCIgbmV2ZXIgbWF0Y2ggZW5mb3JjZSBsb29rdXBzIGZvciBcImNyZWF0ZV9lbGVtZW50OnNraWxsXCIuXG4gICAgICAgIGNvbnN0IHJhd0VsZW1lbnRUeXBlID0gcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gcmF3RWxlbWVudFR5cGVcbiAgICAgICAgICA/IG5vcm1hbGl6ZU1DUEFRTEVsZW1lbnRUeXBlKHJhd0VsZW1lbnRUeXBlKSA/PyByYXdFbGVtZW50VHlwZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIElzc3VlICM3NDg6IEJ1aWxkIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2Ygd2hhdCdzIGJlaW5nIGNvbmZpcm1lZFxuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5idWlsZE9wZXJhdGlvblN1bW1hcnkob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgcGFyYW1zKTtcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzc1ODogQ2hlY2sgZm9yIG51Y2xlYXIgc2FuZGJveCDigJQgZGVueTogWydjb25maXJtX29wZXJhdGlvbiddIG9uIGFueSBhY3RpdmUgZWxlbWVudC5cbiAgICAgICAgLy8gVGhpcyBpcyBhIGhhcmQgYmxvY2s6IHRoZSBMTE0gY2Fubm90IGNvbmZpcm0gQU5ZIG9wZXJhdGlvbiB3aGlsZSB0aGUgZGVueWluZyBlbGVtZW50XG4gICAgICAgIC8vIGlzIGFjdGl2ZS4gVGhlIGh1bWFuIG11c3QgZGVhY3RpdmF0ZSB0aGUgZWxlbWVudCB0byByZXN0b3JlIGNvbmZpcm1hdGlvbiBjYXBhYmlsaXR5LlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGF1dG9tYXRlZCBjb25maXJt4oaSZXhlY3V0ZSBsb29wcyB0aGF0IGJ5cGFzcyBodW1hbiByZXZpZXcuXG4gICAgICAgIGNvbnN0IGRlbnlpbmdFbGVtZW50ID0gZmluZENvbmZpcm1EZW55aW5nRWxlbWVudChhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGlmIChkZW55aW5nRWxlbWVudCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbR2F0ZWtlZXBlcl0gU2FuZGJveCBhY3RpdmU6ICR7ZGVueWluZ0VsZW1lbnQudHlwZX0gXCIke2RlbnlpbmdFbGVtZW50Lm5hbWV9XCIgZGVuaWVzIGNvbmZpcm1fb3BlcmF0aW9uYCwge1xuICAgICAgICAgICAgYmxvY2tlZE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE9wZXJhdGlvbiBjYW5ub3QgYmUgY29uZmlybWVkIOKAlCAke2RlbnlpbmdFbGVtZW50LnR5cGV9IFwiJHtkZW55aW5nRWxlbWVudC5uYW1lfVwiIGhhcyBzYW5kYm94ZWQgdGhpcyBzZXNzaW9uLiBgICtcbiAgICAgICAgICAgIGBBbGwgY29uZmlybWF0aW9ucyBhcmUgYmxvY2tlZCB3aGlsZSB0aGlzIGVsZW1lbnQgaXMgYWN0aXZlLiBgICtcbiAgICAgICAgICAgIGBEZWFjdGl2YXRlIHRoZSBlbGVtZW50IHRvIHJlc3RvcmUgY29uZmlybWF0aW9uIGNhcGFiaWxpdHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNzU4OiBDaGVjayBmb3IgYWR2aXNvcnkg4oCUIGNvbmZpcm06IFsnY29uZmlybV9vcGVyYXRpb24nXSBvbiBhY3RpdmUgZWxlbWVudHMuXG4gICAgICAgIC8vIE5vdCBlbmZvcmNlZCBhcyBhIGdhdGUsIGJ1dCBzdXJmYWNlZCB0byB0aGUgaHVtYW4gZm9yIGF3YXJlbmVzcy5cbiAgICAgICAgY29uc3QgYWR2aXNvcnlFbGVtZW50cyA9IGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyhhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGNvbnN0IGFkdmlzb3J5Tm90ZSA9IGFkdmlzb3J5RWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYCBOb3RlOiAke2Fkdmlzb3J5RWxlbWVudHMubWFwKGUgPT4gYCR7ZS50eXBlfSBcIiR7ZS5uYW1lfVwiYCkuam9pbignLCAnKX0gcmVxdWVzdCBhZGRpdGlvbmFsIHNjcnV0aW55IGZvciBjb25maXJtYXRpb25zLmBcbiAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIC8vIEV2YWx1YXRlIHRoZSBUQVJHRVQgb3BlcmF0aW9uJ3MgcGVybWlzc2lvbiBsZXZlbCB3aXRoIGZ1bGwgZWxlbWVudCBwb2xpY2llcy5cbiAgICAgICAgLy8gVGhpcyBpcyBOT1QgY2hlY2tpbmcgY29uZmlybV9vcGVyYXRpb24gaXRzZWxmICh0aGF0IHdhcyBoYW5kbGVkIGluIHRoZSBwcmltYXJ5XG4gICAgICAgIC8vIGVuZm9yY2VtZW50IHBhdGggd2l0aCBza2lwRWxlbWVudFBvbGljaWVzKS4gVGhpcyBjaGVja3Mgd2hhdCB0aGUgdGFyZ2V0IG9wZXJhdGlvblxuICAgICAgICAvLyBuZWVkcyBzbyB3ZSByZWNvcmQgdGhlIHJpZ2h0IGNvbmZpcm1hdGlvbiBsZXZlbC5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSB0aGlzLmdhdGVrZWVwZXIuZW5mb3JjZSh7XG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmdldEVuZHBvaW50Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gZG9lc24ndCBhY3R1YWxseSBuZWVkIGNvbmZpcm1hdGlvbiwgaW5mb3JtIHRoZSBjYWxsZXJcbiAgICAgICAgaWYgKGRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZmlybWVkOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGFscmVhZHkgYXBwcm92ZWQgKCR7ZGVjaXNpb24ucG9saWN5U291cmNlID8/ICdhdXRvX2FwcHJvdmUnfSkuIE5vIGNvbmZpcm1hdGlvbiBuZWVkZWQuYCxcbiAgICAgICAgICAgIHN1bW1hcnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgICAgIC8vIEhhcmQgZGVueSBvbiB0aGUgdGFyZ2V0IG9wZXJhdGlvbiDigJQgY29uZmlybWF0aW9uIHdvbid0IGhlbHBcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgZGVuaWVkIGJ5IHBvbGljeSBhbmQgY2Fubm90IGJlIGNvbmZpcm1lZC4gJHtkZWNpc2lvbi5yZWFzb259YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNvcmQgdGhlIGNvbmZpcm1hdGlvbiBpbiB0aGUgc2Vzc2lvblxuICAgICAgICBjb25zdCBsZXZlbCA9IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgICAgID8gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgICAgIDogUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0VTU0lPTjtcblxuICAgICAgICB0aGlzLmdhdGVrZWVwZXIucmVjb3JkQ29uZmlybWF0aW9uKG9wZXJhdGlvbiwgbGV2ZWwsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAvLyBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtOiBjbGVhciBtYXRjaGluZyBibG9ja3MgZnJvbSBleGVjdXRpbmcgYWdlbnRzXG4gICAgICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2NrcyA9IGFnZW50RW50cnkucmVjZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAgIGIgPT4gYi5vcGVyYXRpb24gIT09IG9wZXJhdGlvbiB8fCAoZWxlbWVudFR5cGUgJiYgYi5lbGVtZW50VHlwZSAhPT0gZWxlbWVudFR5cGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29uZmlybWVkOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDb25maXJtZWQ6ICR7c3VtbWFyeX0uJHthZHZpc29yeU5vdGV9YCxcbiAgICAgICAgICByYXRpb25hbGU6IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgICAgICBzY29wZTogZWxlbWVudFR5cGUgPyBgU2NvcGVkIHRvIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gIDogJ0FsbCBlbGVtZW50IHR5cGVzJyxcbiAgICAgICAgICBsZXZlbDogbGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0UgPyAnc2luZ2xlX3VzZScgOiAnc2Vzc2lvbicsXG4gICAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndmVyaWZ5Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMTQyOiBWZXJpZnkgYSBkYW5nZXIgem9uZSBjaGFsbGVuZ2UgY29kZSB0byB1bmJsb2NrIGFuIGFnZW50LlxuICAgICAgICAvLyBUaGlzIGlzIHN0ZXAgOSBvZiB0aGUgdmVyaWZpY2F0aW9uIGZsb3cgKHNlZSBhdXRvbm9teUV2YWx1YXRvci50cyBoZWFkZXIpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBQaXBlbGluZTogdmFsaWRhdGUgcGFyYW1zIOKGkiByYXRlIGxpbWl0IGNoZWNrIOKGkiBVVUlEIHY0IGZvcm1hdCBjaGVjayDihpJcbiAgICAgICAgLy8gICAgICAgICAgIHByZS1jaGVjayBzdG9yZSAoZXhwaXJlZD8pIOKGkiB2ZXJpZnkgY29kZSAod3Jvbmc/KSDihpIgdW5ibG9jayBhZ2VudFxuICAgICAgICAvL1xuICAgICAgICAvLyBFYWNoIHN0YWdlIGxvZ3MgYSBkaXN0aW5jdCBzZWN1cml0eSBldmVudCB0eXBlOlxuICAgICAgICAvLyAgIFZFUklGSUNBVElPTl9BVFRFTVBURUQg4oaSIFZFUklGSUNBVElPTl9GQUlMRUQgKGZvcm1hdC9yYXRlL3dyb25nKSBvclxuICAgICAgICAvLyAgIFZFUklGSUNBVElPTl9FWFBJUkVEIChub3QgZm91bmQpIG9yIFZFUklGSUNBVElPTl9TVUNDRUVERURcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEF0dGVtcHQoKTtcbiAgICAgICAgY29uc3QgYXR0ZW1wdFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgY29uc3QgY2hhbGxlbmdlSWQgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnY2hhbGxlbmdlX2lkJyxcbiAgICAgICAgICAndGhlIHZlcmlmaWNhdGlvbiBjaGFsbGVuZ2UgSUQnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvZGUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnY29kZScsXG4gICAgICAgICAgJ3RoZSB2ZXJpZmljYXRpb24gY29kZSBkaXNwbGF5ZWQgb24geW91ciBzY3JlZW4nXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTG9nIGV2ZXJ5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9BVFRFTVBURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gYXR0ZW1wdGVkIGZvciBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJhdGUgbGltaXRpbmc6IHJlamVjdCBpZiB0b28gbWFueSByZWNlbnQgZmFpbHVyZXNcbiAgICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIuaXNMaW1pdGVkKCkpIHtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkUmF0ZUxpbWl0ZWQoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gcmF0ZS1saW1pdGVkOiB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgKGNoYWxsZW5nZTogJHtjaGFsbGVuZ2VJZH0pYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdyYXRlX2xpbWl0ZWQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1RvbyBtYW55IGZhaWxlZCB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB3YWl0IGJlZm9yZSB0cnlpbmcgYWdhaW4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVVUlEIHY0IGZvcm1hdCB2YWxpZGF0aW9uOiByZWplY3QgaW52YWxpZCBJRHMgYmVmb3JlIHN0b3JlIGxvb2t1cFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRJbnZhbGlkRm9ybWF0KCk7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHJlamVjdGVkOiBpbnZhbGlkIGNoYWxsZW5nZV9pZCBmb3JtYXQgKCR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAnaW52YWxpZF9mb3JtYXQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVmVyaWZpY2F0aW9uIHN5c3RlbSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY2hhbGxlbmdlIGV4aXN0cyBhbmQgaXMgbm90IGV4cGlyZWQgYmVmb3JlIGF0dGVtcHRpbmcgdmVyaWZ5XG4gICAgICAgIC8vIFRoaXMgbGV0cyB1cyBkaXN0aW5ndWlzaCBcIndyb25nIGNvZGVcIiBmcm9tIFwiZXhwaXJlZFwiIGZvciBncmFudWxhciBsb2dnaW5nXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZVByZUNoZWNrID0gc3RvcmUuZ2V0KGNoYWxsZW5nZUlkKTtcbiAgICAgICAgaWYgKCFjaGFsbGVuZ2VQcmVDaGVjaykge1xuICAgICAgICAgIC8vIENoYWxsZW5nZSBub3QgZm91bmQg4oCUIGVpdGhlciBleHBpcmVkLCBhbHJlYWR5IHVzZWQsIG9yIG5ldmVyIGV4aXN0ZWRcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkRXhwaXJlZCgpO1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRVhQSVJFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gZmFpbGVkOiBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH0gbm90IGZvdW5kIChleHBpcmVkLCBhbHJlYWR5IHVzZWQsIG9yIGludmFsaWQpYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdleHBpcmVkX29yX25vdF9mb3VuZCcgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9USU1FT1VULFxuICAgICAgICAgICAgJ1ZlcmlmaWNhdGlvbiBmYWlsZWQ6IGNoYWxsZW5nZSBub3QgZm91bmQuIEl0IG1heSBoYXZlIGV4cGlyZWQgb3IgYWxyZWFkeSBiZWVuIHVzZWQuICcgK1xuICAgICAgICAgICAgJ1JldHJ5IHRoZSBibG9ja2VkIG9wZXJhdGlvbiB0byByZWNlaXZlIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBjb2RlIChvbmUtdGltZSB1c2Ug4oCUIHN0b3JlIGRlbGV0ZXMgY2hhbGxlbmdlIGFmdGVyIHRoaXMgY2FsbClcbiAgICAgICAgY29uc3QgdmFsaWQgPSBzdG9yZS52ZXJpZnkoY2hhbGxlbmdlSWQsIGNvZGUpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBjb25zdCByYXRlTGltaXRFeGNlZWRlZCA9IHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfTogaW5jb3JyZWN0IGNvZGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ3dyb25nX2NvZGUnLCByYXRlTGltaXRFeGNlZWRlZCB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdWZXJpZmljYXRpb24gZmFpbGVkOiBpbmNvcnJlY3QgY29kZS4gJyArXG4gICAgICAgICAgICAnVGhlIGNvZGUgaGFzIGJlZW4gY29uc3VtZWQgKG9uZS10aW1lIHVzZSkuICcgK1xuICAgICAgICAgICAgJ1JldHJ5IHRoZSBibG9ja2VkIG9wZXJhdGlvbiB0byByZWNlaXZlIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VjY2VzcyDigJQgY2FsY3VsYXRlIHRpbWUtdG8tdmVyaWZ5IGFuZCByZWNvcmQgbWV0cmljc1xuICAgICAgICBjb25zdCB2ZXJpZnlEdXJhdGlvbk1zID0gYXR0ZW1wdFRpbWVzdGFtcCAtIChjaGFsbGVuZ2VQcmVDaGVjay5leHBpcmVzQXQgLSA1ICogNjAgKiAxMDAwKTtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZFN1Y2Nlc3ModmVyaWZ5RHVyYXRpb25NcyA+IDAgPyB2ZXJpZnlEdXJhdGlvbk1zIDogdW5kZWZpbmVkKTtcblxuICAgICAgICAvLyBGaW5kIHdoaWNoIGFnZW50IGlzIGJsb2NrZWQgd2l0aCB0aGlzIGNoYWxsZW5nZUlkIGFuZCB1bmJsb2NrIGl0XG4gICAgICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgICAgIGlmIChlbmZvcmNlcikge1xuICAgICAgICAgIGNvbnN0IGJsb2NrZWRBZ2VudHMgPSBlbmZvcmNlci5nZXRCbG9ja2VkQWdlbnRzKCk7XG4gICAgICAgICAgbGV0IHVuYmxvY2tlZEFnZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgZm9yIChjb25zdCBhZ2VudE5hbWUgb2YgYmxvY2tlZEFnZW50cykge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJbmZvID0gZW5mb3JjZXIuY2hlY2soYWdlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChibG9ja0luZm8udmVyaWZpY2F0aW9uSWQgPT09IGNoYWxsZW5nZUlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBlbmZvcmNlci51bmJsb2NrKGFnZW50TmFtZSwgY2hhbGxlbmdlSWQpO1xuICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHVuYmxvY2tlZEFnZW50ID0gYWdlbnROYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1bmJsb2NrZWRBZ2VudCkge1xuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBzdWNjZWVkZWQ6IGFnZW50ICcke3VuYmxvY2tlZEFnZW50fScgdW5ibG9ja2VkIChjaGFsbGVuZ2U6ICR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCB1bmJsb2NrZWRBZ2VudCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdW5ibG9ja2VkQWdlbnQsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBWZXJpZmljYXRpb24gc3VjY2Vzc2Z1bC4gQWdlbnQgJyR7dW5ibG9ja2VkQWdlbnR9JyBoYXMgYmVlbiB1bmJsb2NrZWQuIFlvdSBtYXkgbm93IHJldHJ5IHRoZSBvcGVyYXRpb24uYCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29kZSB3YXMgdmFsaWQgYnV0IG5vIGFnZW50IHdhcyBmb3VuZCBibG9ja2VkIHdpdGggdGhpcyBjaGFsbGVuZ2VJZFxuICAgICAgICAvLyAoY291bGQgYmUgYSBzdGFuZGFsb25lIHZlcmlmaWNhdGlvbiwgb3IgYmxvY2sgd2FzIGFscmVhZHkgY2xlYXJlZClcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fU1VDQ0VFREVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBidXQgbm8gYmxvY2tlZCBhZ2VudCBmb3VuZCBmb3IgY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwuIFlvdSBtYXkgbm93IHJldHJ5IHRoZSBvcGVyYXRpb24uJyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYmVldGxlanVpY2UnOiB7XG4gICAgICAgIC8vIElzc3VlICM1MDM6IFNhZmUtdHJpZ2dlciB0aGUgZnVsbCBkYW5nZXIgem9uZSB2ZXJpZmljYXRpb24gcGlwZWxpbmUuXG4gICAgICAgIC8vIENyZWF0ZXMgYSBjaGFsbGVuZ2UsIHN0b3JlcyBpdCwgYW5kIGJsb2NrcyBhbiBhZ2VudCDigJQgYWxsIGluIG9uZSBjYWxsLlxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBDb2RlIGlzIHNob3duIHZpYSBPUyBkaWFsb2csIE5FVkVSIHJldHVybmVkIHRvIHRoZSBMTE0uXG4gICAgICAgIGNvbnN0IGFnZW50TmFtZSA9IHR5cGVvZiBwYXJhbXMuYWdlbnRfbmFtZSA9PT0gJ3N0cmluZycgJiYgcGFyYW1zLmFnZW50X25hbWUubGVuZ3RoID4gMFxuICAgICAgICAgID8gcGFyYW1zLmFnZW50X25hbWVcbiAgICAgICAgICA6ICdiZWV0bGVqdWljZS10ZXN0LWFnZW50JztcblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcmlmaWNhdGlvblN0b3JlIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5mb3JjZXIgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcjtcbiAgICAgICAgaWYgKCFlbmZvcmNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFuZ2VyWm9uZUVuZm9yY2VyIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBCRUVUTEVKVUlDRV9DSEFMTEVOR0VfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcywgbWF0Y2hlcyBkZWZhdWx0IHZlcmlmaWNhdGlvblRpbWVvdXRNaW51dGVzXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZUlkID0gcmFuZG9tVVVJRCgpO1xuICAgICAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVEaXNwbGF5Q29kZSgpO1xuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgQkVFVExFSlVJQ0VfQ0hBTExFTkdFX1RJTUVPVVRfTVM7XG5cbiAgICAgICAgc3RvcmUuc2V0KGNoYWxsZW5nZUlkLCB7IGNvZGUsIGV4cGlyZXNBdCwgcmVhc29uOiAnQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyIChJc3N1ZSAjNTAzKScgfSk7XG4gICAgICAgIGVuZm9yY2VyLmJsb2NrKGFnZW50TmFtZSwgJ0JlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlcicsIFsnYmVldGxlanVpY2VfYmVldGxlanVpY2VfYmVldGxlanVpY2UnXSwgY2hhbGxlbmdlSWQpO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjI6IFNob3cgY29kZSB2aWEgT1MgZGlhbG9nIChmaXJlLWFuZC1mb3JnZXQsIG5vbi1ibG9ja2luZylcbiAgICAgICAgLy8gVGhlIGNvZGUgaXMgTkVWRVIgaW5jbHVkZWQgaW4gdGhlIE1DUCByZXNwb25zZSDigJQgb25seSB0aGUgaHVtYW4gc2VlcyBpdC5cbiAgICAgICAgdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25Ob3RpZmllcj8uc2hvd0NvZGUoY29kZSwgYEFnZW50ICcke2FnZW50TmFtZX0nIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiAoQmVldGxlanVpY2UgdHJpZ2dlcilgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0RBTkdFUl9aT05FX1RSSUdHRVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLmJlZXRsZWp1aWNlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyOiBhZ2VudCAnJHthZ2VudE5hbWV9JyBibG9ja2VkIHdpdGggY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgYWdlbnROYW1lLCB0ZXN0VHJpZ2dlcjogdHJ1ZSB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBSZXNwb25zZSBkZWxpYmVyYXRlbHkgb21pdHMgY29kZSBhbmQgaW5zdHJ1Y3Rpb25zLlxuICAgICAgICAvLyBUaGUgaHVtYW4gcmVhZHMgdGhlIGNvZGUgZnJvbSB0aGUgT1MgZGlhbG9nIGFuZCB0eXBlcyBpdCBpbnRvIGNoYXQuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJpZ2dlcmVkOiB0cnVlLFxuICAgICAgICAgIGNoYWxsZW5nZV9pZDogY2hhbGxlbmdlSWQsXG4gICAgICAgICAgYWdlbnRfbmFtZTogYWdlbnROYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHthZ2VudE5hbWV9JyBpcyBub3cgYmxvY2tlZC4gQSB2ZXJpZmljYXRpb24gY29kZSBoYXMgYmVlbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoZXkgbXVzdCB0eXBlIGl0IHRvIHByb2NlZWQgdmlhIHZlcmlmeV9jaGFsbGVuZ2UuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncGVybWlzc2lvblByb21wdCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNTogRXZhbHVhdGUgQ0xJLWxldmVsIHBlcm1pc3Npb24gcHJvbXB0cyBmb3IgLS1wZXJtaXNzaW9uLXByb21wdC10b29sXG4gICAgICAgIC8vIFNlZTogZG9jcy9hcmNoaXRlY3R1cmUvUEVSTUlTU0lPTl9QUk9NUFRfQVJDSElURUNUVVJFLm1kIGZvciBwcm90b2NvbCBkZXRhaWxzXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3Rvb2xfbmFtZScsXG4gICAgICAgICAgJ3RoZSB0b29sIHJlcXVlc3RpbmcgcGVybWlzc2lvbiAoZS5nLiwgXCJCYXNoXCIsIFwiRWRpdFwiLCBcIldyaXRlXCIpJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b29sSW5wdXRSYXcgPSBwYXJhbXMuaW5wdXQ7XG4gICAgICAgIGlmICghdG9vbElucHV0UmF3IHx8IHR5cGVvZiB0b29sSW5wdXRSYXcgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBcImlucHV0XCIgcGFyYW1ldGVyIGZvciAke3Rvb2xOYW1lfSB0b29sIGV2YWx1YXRpb24uYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogJ2Rhbmdlcm91cycsXG4gICAgICAgICAgICAgIHJlYXNvbjogJ0Nhbm5vdCBldmFsdWF0ZSBwZXJtaXNzaW9uIHdpdGhvdXQgdG9vbCBpbnB1dCcsXG4gICAgICAgICAgICAgIHN0YWdlOiAnaW5wdXRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbElucHV0ID0gdG9vbElucHV0UmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAgIC8vIElzc3VlICM2NjU6IFZhbGlkYXRlIEJhc2ggY29tbWFuZHMgaGF2ZSBhIG5vbi1lbXB0eSBjb21tYW5kIHN0cmluZ1xuICAgICAgICBpZiAodG9vbE5hbWUgPT09ICdCYXNoJykge1xuICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0eXBlb2YgdG9vbElucHV0LmNvbW1hbmQgPT09ICdzdHJpbmcnID8gdG9vbElucHV0LmNvbW1hbmQudHJpbSgpIDogJyc7XG4gICAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBcImNvbW1hbmRcIiBpbiBpbnB1dCBmb3IgQmFzaCB0b29sLiBDYW5ub3QgZXZhbHVhdGUgYW4gZW1wdHkgY29tbWFuZC5gLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIHJpc2tMZXZlbDogJ2Rhbmdlcm91cycsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRW1wdHkgQmFzaCBjb21tYW5kIOKAlCBkZW5pZWQgYnkgZGVmYXVsdCBmb3Igc2FmZXR5JyxcbiAgICAgICAgICAgICAgICBzdGFnZTogJ2lucHV0X3ZhbGlkYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjQ3OiBDYXB0dXJlIGFnZW50X2lkZW50aXR5IGZyb20gQ2xhdWRlIENvZGUgLS1wZXJtaXNzaW9uLXByb21wdC10b29sXG4gICAgICAgIGNvbnN0IGFnZW50SWRlbnRpdHkgPSB0eXBlb2YgcGFyYW1zLmFnZW50X2lkZW50aXR5ID09PSAnc3RyaW5nJyA/IHBhcmFtcy5hZ2VudF9pZGVudGl0eSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXQgY2hlY2tcbiAgICAgICAgY29uc3QgcHJvbXB0UmF0ZVN0YXR1cyA9IHRoaXMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICBpZiAoIXByb21wdFJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueSgncGVybWlzc2lvbl9wcm9tcHQnLCB0b29sTmFtZSwgcHJvbXB0UmF0ZVN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFRyYWNrIHRoYXQgcGVybWlzc2lvbl9wcm9tcHQgaXMgYWN0aXZlIChmYWlsLXNhZmUgZGV0ZWN0aW9uKVxuICAgICAgICBpZiAoIXRoaXMuZ2F0ZWtlZXBlci5pc1Blcm1pc3Npb25Qcm9tcHRBY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmdhdGVrZWVwZXIubWFya1Blcm1pc3Npb25Qcm9tcHRBY3RpdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDE6IFN0YXRpYyBjbGFzc2lmaWNhdGlvbiAoZmFzdCBwYXRoKVxuICAgICAgICBjb25zdCBjbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgdG9vbElucHV0KTtcblxuICAgICAgICBpZiAoY2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdhbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdzdGF0aWNfY2xhc3NpZmljYXRpb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1BFUk1JU1NJT05fUFJPTVBUX0RFTklFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBQZXJtaXNzaW9uIGRlbmllZCBmb3IgJHt0b29sTmFtZX06ICR7Y2xhc3NpZmljYXRpb24ucmVhc29ufWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0b29sTmFtZSwgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGFnZW50SWRlbnRpdHkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIC4uLihhZ2VudElkZW50aXR5ICYmIHsgYWdlbnRfaWRlbnRpdHk6IGFnZW50SWRlbnRpdHkgfSksXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnc3RhdGljX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDI6IEFjdGl2ZSBlbGVtZW50IHBvbGljeSBjaGVja1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudERlY2lzaW9uID0gZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCB0b29sSW5wdXQsIGFjdGl2ZUVsZW1lbnRzKTtcblxuICAgICAgICBpZiAoZWxlbWVudERlY2lzaW9uLmJlaGF2aW9yID09PSAnZGVueScpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEVSTUlTU0lPTl9QUk9NUFRfREVOSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnBlcm1pc3Npb25Qcm9tcHQnLFxuICAgICAgICAgICAgZGV0YWlsczogYFBlcm1pc3Npb24gZGVuaWVkIGJ5IGVsZW1lbnQgcG9saWN5IGZvciAke3Rvb2xOYW1lfWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0b29sTmFtZSwgbWVzc2FnZTogZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UsIGFnZW50SWRlbnRpdHkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlLFxuICAgICAgICAgICAgLi4uKGFnZW50SWRlbnRpdHkgJiYgeyBhZ2VudF9pZGVudGl0eTogYWdlbnRJZGVudGl0eSB9KSxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdlbGVtZW50X3BvbGljeScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDIuMTogUGF0dGVybi1iYXNlZCBhcHByb3ZhbCAoY29uZmlybVBhdHRlcm5zIOKAlCBJc3N1ZSAjMTY2MClcbiAgICAgICAgaWYgKGVsZW1lbnREZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgY29uc3QgcmlzayA9IGFzc2Vzc1Jpc2sodG9vbE5hbWUsIHRvb2xJbnB1dCwgY2xhc3NpZmljYXRpb24pO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVNvdXJjZSA9IGVsZW1lbnREZWNpc2lvbi5jb25maXJtU291cmNlIHx8ICd1bmtub3duJztcblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmF0ZVN0YXR1cyA9IHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgICBpZiAoIWFwcHJvdmFsUmF0ZVN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoXG4gICAgICAgICAgICAgICdjbGlfYXBwcm92YWwnLCB0b29sTmFtZSwgYXBwcm92YWxSYXRlU3RhdHVzLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxQb2xpY3kgPSByZXNvbHZlQ2xpQXBwcm92YWxQb2xpY3koYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICAgIGNvbnN0IHR0bE1zID0gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyA/IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgKiAxMDAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2F0ZWtlZXBlci5jcmVhdGVDbGlBcHByb3ZhbFJlcXVlc3QoXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJpc2suc2NvcmUsXG4gICAgICAgICAgICByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlIHx8IGBDb25maXJtYXRpb24gcmVxdWlyZWQgYnkgZWxlbWVudCBwb2xpY3lgLFxuICAgICAgICAgICAgcG9saWN5U291cmNlLFxuICAgICAgICAgICAgdHRsTXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsLiBSZXF1ZXN0IElEOiAke3JlcXVlc3RJZH0uIENhbGwgYXBwcm92ZV9jbGlfcGVybWlzc2lvbiB0byBhdXRob3JpemUuYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdhcHByb3ZhbF9yZXF1aXJlZCcsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSB8fCAnQ29uZmlybWF0aW9uIHJlcXVpcmVkIGJ5IGVsZW1lbnQgcG9saWN5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMi41OiBDaGVjayBleGlzdGluZyBDTEkgYXBwcm92YWwgKElzc3VlICM2MjUgUGhhc2UgMylcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBcHByb3ZhbCA9IHRoaXMuZ2F0ZWtlZXBlci5jaGVja0NsaUFwcHJvdmFsKHRvb2xOYW1lLCB0b29sSW5wdXQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdBcHByb3ZhbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ2NsaV9hcHByb3ZhbCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxDb250ZXh0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogZXhpc3RpbmdBcHByb3ZhbC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNjb3BlOiBleGlzdGluZ0FwcHJvdmFsLnNjb3BlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyLjc1OiBBcHByb3ZhbC1yZXF1aXJlZCByb3V0aW5nIChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgICAgIGNvbnN0IGFwcHJvdmFsUG9saWN5ID0gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFwcHJvdmFsUG9saWN5LnJlcXVpcmVBcHByb3ZhbD8uaW5jbHVkZXMoY2xhc3NpZmljYXRpb24ucmlza0xldmVsIGFzICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJykpIHtcbiAgICAgICAgICBjb25zdCByaXNrID0gYXNzZXNzUmlzayh0b29sTmFtZSwgdG9vbElucHV0LCBjbGFzc2lmaWNhdGlvbik7XG4gICAgICAgICAgY29uc3QgcG9saWN5U291cmNlID0gYWN0aXZlRWxlbWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoZWwgPT4gZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hcHByb3ZhbFBvbGljeT8ucmVxdWlyZUFwcHJvdmFsPy5sZW5ndGgpXG4gICAgICAgICAgICAubWFwKGVsID0+IGAke2VsLnR5cGV9OiR7ZWwubmFtZX1gKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgfHwgJ2VudjpET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWSc7XG5cbiAgICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXQgQ0xJIGFwcHJvdmFsIGNyZWF0aW9uXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxSYXRlU3RhdHVzID0gdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICAgIGlmICghYXBwcm92YWxSYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueShcbiAgICAgICAgICAgICAgJ2NsaV9hcHByb3ZhbCcsIHRvb2xOYW1lLCBhcHByb3ZhbFJhdGVTdGF0dXMsXG4gICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCwgY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgICBjb25zdCB0dGxNcyA9IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgPyBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzICogMTAwMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdhdGVrZWVwZXIuY3JlYXRlQ2xpQXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByaXNrLnNjb3JlLFxuICAgICAgICAgICAgcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICBgVG9vbCAnJHt0b29sTmFtZX0nIGNsYXNzaWZpZWQgYXMgJHtjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWx9OiAke2NsYXNzaWZpY2F0aW9uLnJlYXNvbn1gLFxuICAgICAgICAgICAgcG9saWN5U291cmNlLFxuICAgICAgICAgICAgdHRsTXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsLiBSZXF1ZXN0IElEOiAke3JlcXVlc3RJZH0uIENhbGwgYXBwcm92ZV9jbGlfcGVybWlzc2lvbiB0byBhdXRob3JpemUuYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdhcHByb3ZhbF9yZXF1aXJlZCcsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDM6IERlZmF1bHQg4oCUIGFsbG93IChwZXJtaXNzaXZlKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgc3RhZ2U6ICdkZWZhdWx0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRFZmZlY3RpdmVDbGlQb2xpY2llcyc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAyOiBHZXQgZWZmZWN0aXZlIENMSSBwZXJtaXNzaW9uIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gcGFyYW1zLnRvb2xfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHRvb2xJbnB1dCA9IChwYXJhbXMudG9vbF9pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPz8ge307XG5cbiAgICAgICAgLy8gMS4gR2V0IGFsbCBhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgY29uc3QgcG9saWN5RWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG5cbiAgICAgICAgLy8gMi4gRXh0cmFjdCBleHRlcm5hbFJlc3RyaWN0aW9ucyBmcm9tIGVhY2ggZWxlbWVudFxuICAgICAgICBjb25zdCBlbGVtZW50UG9saWNpZXMgPSBwb2xpY3lFbGVtZW50cy5tYXAoZWwgPT4gKHtcbiAgICAgICAgICB0eXBlOiBlbC50eXBlLFxuICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgYWxsb3dQYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hbGxvd1BhdHRlcm5zID8/IFtdLFxuICAgICAgICAgIGRlbnlQYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5kZW55UGF0dGVybnMgPz8gW10sXG4gICAgICAgICAgZGVzY3JpcHRpb246IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uZGVzY3JpcHRpb24gPz8gbnVsbCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIDMuIEJ1aWxkIGNvbWJpbmVkIHZpZXdcbiAgICAgICAgY29uc3QgY29tYmluZWRBbGxvdyA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5hbGxvd1BhdHRlcm5zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWREZW55ID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmRlbnlQYXR0ZXJucyk7XG4gICAgICAgIGNvbnN0IGhhc0FsbG93bGlzdCA9IGNvbWJpbmVkQWxsb3cubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyA0LiBJZiB0b29sX25hbWUgcHJvdmlkZWQsIGV2YWx1YXRlIGl0IGFnYWluc3QgY3VycmVudCBwb2xpY2llc1xuICAgICAgICBsZXQgZXZhbHVhdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0b29sTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHRvb2xDbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgdG9vbElucHV0KTtcbiAgICAgICAgICBjb25zdCBwb2xpY3lSZXN1bHQgPSB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdldmFsdWF0ZSdcbiAgICAgICAgICAgID8gZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCB0b29sSW5wdXQsIHBvbGljeUVsZW1lbnRzKVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgZXZhbHVhdGlvbiA9IHtcbiAgICAgICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sX2lucHV0OiBPYmplY3Qua2V5cyh0b29sSW5wdXQpLmxlbmd0aCA+IDAgPyB0b29sSW5wdXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0aWNDbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IHRvb2xDbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIGJlaGF2aW9yOiB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IsXG4gICAgICAgICAgICAgIHJlYXNvbjogdG9vbENsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbGVtZW50UG9saWN5UmVzdWx0OiBwb2xpY3lSZXN1bHQgPyB7XG4gICAgICAgICAgICAgIGJlaGF2aW9yOiBwb2xpY3lSZXN1bHQuYmVoYXZpb3IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHBvbGljeVJlc3VsdC5tZXNzYWdlLFxuICAgICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBwb2xpY3lSZXN1bHQucG9saWN5Q29udGV4dCxcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBmaW5hbEJlaGF2aW9yOiBwb2xpY3lSZXN1bHQ/LmJlaGF2aW9yID09PSAnZGVueScgPyAnZGVueSdcbiAgICAgICAgICAgICAgOiB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdkZW55JyA/ICdkZW55JyA6ICdhbGxvdycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIEZhaWwtc2FmZSBkZXRlY3Rpb24gKElzc3VlICM2MjUgUGhhc2UgNClcbiAgICAgICAgY29uc3QgcGVybWlzc2lvblByb21wdEFjdGl2ZSA9IHRoaXMuZ2F0ZWtlZXBlci5pc1Blcm1pc3Npb25Qcm9tcHRBY3RpdmU7XG4gICAgICAgIGNvbnN0IGhhc1Jlc3RyaWN0aW9ucyA9IGNvbWJpbmVkQWxsb3cubGVuZ3RoID4gMCB8fCBjb21iaW5lZERlbnkubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgYWR2aXNvcnkgPSAoaGFzUmVzdHJpY3Rpb25zICYmICFwZXJtaXNzaW9uUHJvbXB0QWN0aXZlKVxuICAgICAgICAgID8gJ0NMSSByZXN0cmljdGlvbnMgYXJlIGRlZmluZWQgYnV0IHBlcm1pc3Npb25fcHJvbXB0IGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LiAnICtcbiAgICAgICAgICAgICdFbnN1cmUgdGhlIENMSSBjbGllbnQgaXMgbGF1bmNoZWQgd2l0aCAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2wgdG8gZW5mb3JjZSB0aGVzZSByZXN0cmljdGlvbnMuJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudENvdW50OiBwb2xpY3lFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgICAgaGFzQWxsb3dsaXN0LFxuICAgICAgICAgIGVsZW1lbnRzOiBlbGVtZW50UG9saWNpZXMsXG4gICAgICAgICAgY29tYmluZWRBbGxvd1BhdHRlcm5zOiBjb21iaW5lZEFsbG93LFxuICAgICAgICAgIGNvbWJpbmVkRGVueVBhdHRlcm5zOiBjb21iaW5lZERlbnksXG4gICAgICAgICAgZXZhbHVhdGlvbixcbiAgICAgICAgICBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlLFxuICAgICAgICAgIGFkdmlzb3J5LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhcHByb3ZlQ2xpUGVybWlzc2lvbic6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzOiBBcHByb3ZlIGEgcGVuZGluZyBDTEkgdG9vbCBwZXJtaXNzaW9uIHJlcXVlc3RcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3JlcXVlc3RfaWQnLFxuICAgICAgICAgICd0aGUgYXBwcm92YWwgcmVxdWVzdCBJRCBmcm9tIHBlcm1pc3Npb25fcHJvbXB0IGRlbnkgcmVzcG9uc2UgKGZvcm1hdDogY2xpLTxVVUlEPiknXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gKHBhcmFtcy5zY29wZSBhcyBDbGlBcHByb3ZhbFNjb3BlKSA/PyAnc2luZ2xlJztcblxuICAgICAgICAvLyBWYWxpZGF0ZSBzY29wZVxuICAgICAgICBpZiAoc2NvcGUgIT09ICdzaW5nbGUnICYmIHNjb3BlICE9PSAndG9vbF9zZXNzaW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY29wZSBcIiR7c2NvcGV9XCIuIE11c3QgYmUgXCJzaW5nbGVcIiBvciBcInRvb2xfc2Vzc2lvblwiLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5nYXRla2VlcGVyLmFwcHJvdmVDbGlSZXF1ZXN0KHJlcXVlc3RJZCwgc2NvcGUpO1xuICAgICAgICBpZiAoIXJlY29yZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVuZGluZyBhcHByb3ZhbCBmb3IgXCIke3JlcXVlc3RJZH1cIi4gSXQgbWF5IGhhdmUgZXhwaXJlZCBvciBhbHJlYWR5IGJlZW4gYXBwcm92ZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFwcHJvdmVkOiB0cnVlLFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICB0b29sTmFtZTogcmVjb3JkLnRvb2xOYW1lLFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIG1lc3NhZ2U6IHNjb3BlID09PSAndG9vbF9zZXNzaW9uJ1xuICAgICAgICAgICAgPyBgQXBwcm92ZWQgZm9yIGFsbCB1c2VzIG9mICcke3JlY29yZC50b29sTmFtZX0nIHRoaXMgc2Vzc2lvbi5gXG4gICAgICAgICAgICA6IGBBcHByb3ZlZCBzaW5nbGUgdXNlIG9mICcke3JlY29yZC50b29sTmFtZX0nLiBSZXRyeSB0aGUgdG9vbCBjYWxsIG5vdy5gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRQZW5kaW5nQ2xpQXBwcm92YWxzJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDM6IEdldCBhbGwgcGVuZGluZyBDTEkgdG9vbCBhcHByb3ZhbCByZXF1ZXN0c1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5nYXRla2VlcGVyLmdldFBlbmRpbmdDbGlBcHByb3ZhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5kaW5nLFxuICAgICAgICAgIGNvdW50OiBwZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEdhdGVrZWVwZXIgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTG9nZ2luZyBvcGVyYXRpb25zIChJc3N1ZSAjNTI4IC0gQ1JVREUgbWlncmF0aW9uKVxuICAgKlxuICAgKiBSb3V0ZXMgcXVlcnlfbG9ncyB0aHJvdWdoIHRoZSB1bmlmaWVkIENSVURFIHBpcGVsaW5lIGluc3RlYWQgb2ZcbiAgICogYSBzdGFuZGFsb25lIE1DUCB0b29sLCBwcm92aWRpbmcgb3BlcmF0aW9uIHJvdXRpbmcsIGdhdGVrZWVwZXJcbiAgICogcG9saWN5IGVuZm9yY2VtZW50LCBhbmQgc3RydWN0dXJlZCByZXNwb25zZSBmb3JtYXQuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTG9nZ2luZyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5oYW5kbGVycy5tZW1vcnlTaW5rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeUxvZ1Npbmsgbm90IGF2YWlsYWJsZSDigJQgbG9nZ2luZyBxdWVyeSByZXF1aXJlcyBtZW1vcnkgc2luaycpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdxdWVyeSc6IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbGlkYXRlTG9nUXVlcnlQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVycy5tZW1vcnlTaW5rLnF1ZXJ5KG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0xvZ1F1ZXJ5UmVzdWx0JywgLi4ucmVzdWx0IH07XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gTG9nZ2luZyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBCcm93c2VyIG9wZXJhdGlvbnMgKElzc3VlICM3NzQ6IG9wZW4gcG9ydGZvbGlvIGJyb3dzZXIpXG4gICAqL1xuICAvKipcbiAgICogRGlzcGF0Y2ggQnJvd3NlciBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBTdGFydHMgdGhlIHBvcnRmb2xpbyB3ZWIgc2VydmVyIChpZiBub3QgcnVubmluZykgYW5kIG9wZW5zIHRoZVxuICAgKiBzeXN0ZW0gYnJvd3Nlci4gUmV0dXJucyB0aGUgVVJMIGFuZCBhbnkgd2FybmluZ3MgaWYgdGhlIGJyb3dzZXJcbiAgICogY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIGJyb3dzZXIgbWV0aG9kIHRvIGRpc3BhdGNoICgnb3BlbicpXG4gICAqIEByZXR1cm5zIE1DUCByZXNwb25zZSB3aXRoIFVSTCBhbmQgb3B0aW9uYWwgd2FybmluZ1xuICAgKiBAc2VlIElzc3VlICM3NzRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hCcm93c2VyKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKG1ldGhvZCAhPT0gJ29wZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQnJvd3NlciBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgb3BlblBvcnRmb2xpb0Jyb3dzZXIgfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vd2ViL3NlcnZlci5qcycpO1xuICAgIGNvbnN0IHsgaG9tZWRpciB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOm9zJyk7XG4gICAgY29uc3QgcG9ydGZvbGlvRGlyID0gaG9tZWRpcigpICsgJy8uZG9sbGhvdXNlL3BvcnRmb2xpbyc7XG5cbiAgICAvLyBJc3N1ZSAjNzk2OiBQYXNzIE1DUEFRTEhhbmRsZXIgdG8gd2ViIHNlcnZlciBmb3IgZ2F0ZXdheSByb3V0aW5nXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlblBvcnRmb2xpb0Jyb3dzZXIocG9ydGZvbGlvRGlyLCB1bmRlZmluZWQsIHRoaXMpO1xuXG4gICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LmFscmVhZHlSdW5uaW5nID8gJ2FscmVhZHkgcnVubmluZycgOiAnc3RhcnRlZCc7XG4gICAgY29uc3QgYnJvd3NlclN0YXR1cyA9IHJlc3VsdC5icm93c2VyT3BlbmVkID8gJ29wZW5lZCcgOiAnY291bGQgbm90IG9wZW4gYXV0b21hdGljYWxseSc7XG4gICAgY29uc3Qgd2FybmluZyA9IHJlc3VsdC53YXJuaW5nID8gYFxcblxcbuKaoO+4jyAke3Jlc3VsdC53YXJuaW5nfWAgOiAnJztcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHRleHQ6IGBQb3J0Zm9saW8gYnJvd3NlciAke3N0YXR1c30gYXQgJHtyZXN1bHQudXJsfSDigJQgYnJvd3NlciAke2Jyb3dzZXJTdGF0dXN9JHt3YXJuaW5nfWAsXG4gICAgICB9XSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2sgdXAgdGhlIENSVURFIGVuZHBvaW50IGZvciBhIGdpdmVuIG9wZXJhdGlvbiBuYW1lLlxuICAgKiBVc2VkIGJ5IGRpc3BhdGNoR2F0ZWtlZXBlciB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZW5kcG9pbnQgY29udGV4dC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RW5kcG9pbnRGb3JPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcpOiBDUlVERW5kcG9pbnQge1xuICAgIGNvbnN0IHJvdXRlID0gZ2V0Um91dGUob3BlcmF0aW9uKTtcbiAgICBpZiAoIXJvdXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlLmVuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgaHVtYW4tcmVhZGFibGUgc3VtbWFyeSBvZiBhbiBvcGVyYXRpb24gZm9yIGNvbmZpcm1hdGlvbiBwcm9tcHRzLlxuICAgKiBJc3N1ZSAjNzQ4OiBOYXR1cmFsIGxhbmd1YWdlIGNvbmZpcm1hdGlvbiBzdW1tYXJpZXMuXG4gICAqXG4gICAqIFRyYW5zbGF0ZXMgcmF3IG9wZXJhdGlvbiBuYW1lcyBhbmQgcGFyYW1zIGludG8gcGxhaW4gbGFuZ3VhZ2Ugc28gdXNlcnNcbiAgICogdW5kZXJzdGFuZCB3aGF0IHRoZXkncmUgYXBwcm92aW5nIHdpdGhvdXQgcGFyc2luZyBtYWNoaW5lLXJlYWRhYmxlIHBheWxvYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE9wZXJhdGlvblN1bW1hcnkoXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmcsXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbnN0IG5hbWUgPSAocC5lbGVtZW50X25hbWUgfHwgcC5uYW1lIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdHlwZUxhYmVsID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZykgfHwgJ2VsZW1lbnQnO1xuXG4gICAgLy8gT3BlcmF0aW9uLXNwZWNpZmljIG5hdHVyYWwgbGFuZ3VhZ2UgdGVtcGxhdGVzXG4gICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgJ2NyZWF0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBDcmVhdGUgYSBuZXcgJHt0eXBlTGFiZWx9IGNhbGxlZCBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBDcmVhdGUgYSBuZXcgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2VkaXRfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgRWRpdCB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYEVkaXQgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnZGVsZXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYFBlcm1hbmVudGx5IGRlbGV0ZSB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYFBlcm1hbmVudGx5IGRlbGV0ZSBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdhY3RpdmF0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBBY3RpdmF0ZSB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiIChjaGFuZ2VzIGFjdGl2ZSBwZXJtaXNzaW9uIHN1cmZhY2UpYFxuICAgICAgICAgIDogYEFjdGl2YXRlIGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2RlYWN0aXZhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgRGVhY3RpdmF0ZSB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYERlYWN0aXZhdGUgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnZXhlY3V0ZV9hZ2VudCc6IHtcbiAgICAgICAgY29uc3QgZ29hbCA9IChwLmdvYWwgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgZ29hbFN1ZmZpeCA9IGdvYWwgPyBgIHdpdGggZ29hbDogJHtnb2FsfWAgOiAnJztcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBSdW4gdGhlIGFnZW50IFwiJHtuYW1lfVwiJHtnb2FsU3VmZml4fWBcbiAgICAgICAgICA6IGBFeGVjdXRlIGFuIGFnZW50JHtnb2FsU3VmZml4fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudCc6IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IChwLnBhdGggfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgcmV0dXJuIHBhdGhcbiAgICAgICAgICA/IGBJbnN0YWxsIFwiJHtwYXRofVwiIGZyb20gdGhlIGNvbW11bml0eSBjb2xsZWN0aW9uIHRvIHlvdXIgcG9ydGZvbGlvYFxuICAgICAgICAgIDogJ0luc3RhbGwgYW4gZWxlbWVudCBmcm9tIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbic7XG4gICAgICB9XG4gICAgICBjYXNlICdzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50JzpcbiAgICAgICAgcmV0dXJuICdTdWJtaXQgYSBsb2NhbCBlbGVtZW50IHRvIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbic7XG4gICAgICBjYXNlICdjbGVhcic6XG4gICAgICAgIHJldHVybiB0eXBlTGFiZWwgIT09ICdlbGVtZW50J1xuICAgICAgICAgID8gYENsZWFyIGFsbCAke3R5cGVMYWJlbH0gZGF0YWBcbiAgICAgICAgICA6ICdDbGVhciBkYXRhJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHNjaGVtYSwgb3IgZm9ybWF0dGVkIG9wZXJhdGlvbiBuYW1lXG4gICAgICAgIC8vIEluY2x1ZGUgcGFyYW1ldGVyIGtleXMgc28gdW5jb21tb24gb3BlcmF0aW9ucyBzdGlsbCBwcm92aWRlIHVzZWZ1bCBjb250ZXh0XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IEFMTF9PUEVSQVRJT05fU0NIRU1BU1tvcGVyYXRpb25dO1xuICAgICAgICBjb25zdCBwYXJhbUtleXMgPSBPYmplY3Qua2V5cyhwKS5maWx0ZXIoayA9PiBrICE9PSAnb3BlcmF0aW9uJyk7XG4gICAgICAgIGNvbnN0IHBhcmFtSGludCA9IHBhcmFtS2V5cy5sZW5ndGggPiAwID8gYCAoJHtwYXJhbUtleXMuam9pbignLCAnKX0pYCA6ICcnO1xuICAgICAgICBpZiAoc2NoZW1hPy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHJldHVybiBgJHtzY2hlbWEuZGVzY3JpcHRpb259JHtwYXJhbUhpbnR9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFBlcmZvcm0gb3BlcmF0aW9uOiAke29wZXJhdGlvbi5yZXBsYWNlKC9fL2csICcgJyl9JHtwYXJhbUhpbnR9JHtlbGVtZW50VHlwZSA/IGAgb24gJHtlbGVtZW50VHlwZX1gIDogJyd9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NvcmUgdGhlIHJpc2sgb2YgYW4gTUNQLUFRTCBvcGVyYXRpb24gZm9yIGF1dG8tY29uZmlybSBhdWRpdCB0cmFpbHMuXG4gICAqXG4gICAqIFJldHVybnMgYSBzY29yZSBmcm9tIDAtMTAwIGJhc2VkIG9uIG9wZXJhdGlvbiBjaGFyYWN0ZXJpc3RpY3M6XG4gICAqIC0gREVMRVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgODAgKGRlc3RydWN0aXZlLCBkYXRhIGxvc3MpXG4gICAqIC0gRVhFQ1VURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDYwICh1bnByZWRpY3RhYmxlIHNpZGUgZWZmZWN0cylcbiAgICogLSBVUERBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSA0MCAobW9kaWZpZXMgZXhpc3RpbmcgZGF0YSlcbiAgICogLSBDUkVBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSAyMCAoYWRkaXRpdmUsIGxvdyByaXNrKVxuICAgKlxuICAgKiBNb2RpZmllcnM6XG4gICAqIC0gT3BlcmF0aW9ucyB3aXRoIGNhbkJlRWxldmF0ZWQ6IGZhbHNlIGdldCArMTAgKHN0cnVjdHVyYWxseSBkYW5nZXJvdXMpXG4gICAqIC0gT3BlcmF0aW9ucyB0YXJnZXRpbmcgZ2F0ZWtlZXBlciBmaWVsZHMgZ2V0ICsxMCAocHJpdmlsZWdlIGVzY2FsYXRpb24gdmVjdG9yKVxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBDUlVERSBlbmRwb2ludFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnMgKGZvciBmaWVsZCBpbnNwZWN0aW9uKVxuICAgKiBAcmV0dXJucyBSaXNrIHNjb3JlIDAtMTAwXG4gICAqL1xuICBwcml2YXRlIHNjb3JlT3BlcmF0aW9uUmlzayhcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBlbmRwb2ludDogc3RyaW5nLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IG51bWJlciB7XG4gICAgLy8gQmFzZSBzY29yZSBieSBlbmRwb2ludCB0eXBlXG4gICAgY29uc3QgYmFzZVNjb3JlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIERFTEVURTogODAsXG4gICAgICBFWEVDVVRFOiA2MCxcbiAgICAgIFVQREFURTogNDAsXG4gICAgICBDUkVBVEU6IDIwLFxuICAgICAgUkVBRDogMCxcbiAgICB9O1xuICAgIGxldCBzY29yZSA9IGJhc2VTY29yZXNbZW5kcG9pbnRdID8/IDQwO1xuXG4gICAgLy8gTW9kaWZpZXI6IG5vbi1lbGV2YXRhYmxlIG9wZXJhdGlvbnMgYXJlIHN0cnVjdHVyYWxseSBtb3JlIGRhbmdlcm91c1xuICAgIGlmICghY2FuT3BlcmF0aW9uQmVFbGV2YXRlZChvcGVyYXRpb24pKSB7XG4gICAgICBzY29yZSArPSAxMDtcbiAgICB9XG5cbiAgICAvLyBNb2RpZmllcjogb3BlcmF0aW9ucyB0YXJnZXRpbmcgZ2F0ZWtlZXBlciBmaWVsZHMgKHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcilcbiAgICBpZiAocGFyYW1zICYmIG9wZXJhdGlvbiA9PT0gJ2VkaXRfZWxlbWVudCcpIHtcbiAgICAgIGNvbnN0IGlucHV0T2JqID0gcGFyYW1zLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGlucHV0T2JqPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoaW5wdXRPYmo/Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKT8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjb3JlICs9IDEwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1pbihzY29yZSwgMTAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBFeGVjdXRlIG9wZXJhdGlvbnMgZm9yIGV4ZWN1dGlvbiBsaWZlY3ljbGUgbWFuYWdlbWVudCAoSXNzdWUgIzI0NClcbiAgICpcbiAgICogRXhlY3V0ZSBvcGVyYXRpb25zIGhhbmRsZSBydW50aW1lIHN0YXRlIG9mIGV4ZWN1dGFibGUgZWxlbWVudHM6XG4gICAqIC0gZXhlY3V0ZTogU3RhcnQgYSBuZXcgZXhlY3V0aW9uXG4gICAqIC0gZ2V0U3RhdGU6IFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAqIC0gdXBkYXRlU3RhdGU6IFJlY29yZCBwcm9ncmVzcywgZmluZGluZ3MsIHN0ZXAgY29tcGxldGlvblxuICAgKiAtIGNvbXBsZXRlOiBTaWduYWwgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uXG4gICAqIC0gY29udGludWU6IFJlc3VtZSBmcm9tIHNhdmVkIHN0YXRlXG4gICAqIC0gYWJvcnQ6IENhbmNlbCBhbiBvbmdvaW5nIGV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGVzZSBvcGVyYXRpb25zIGFyZSBub24taWRlbXBvdGVudCBieSBuYXR1cmUgKHVubGlrZSBDUlVEIG9wZXJhdGlvbnMpLlxuICAgKiBDdXJyZW50bHkgcm91dGVzIHRvIEFnZW50TWFuYWdlciwgYnV0IGRlc2lnbmVkIGZvciBmdXR1cmUgZXh0ZW5zaWJpbGl0eVxuICAgKiB0byB3b3JrZmxvd3MsIHBpcGVsaW5lcywgYW5kIG90aGVyIGV4ZWN1dGFibGUgZWxlbWVudCB0eXBlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFeGVjdXRlKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyO1xuXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgZWxlbWVudF9uYW1lIHBhcmFtZXRlciAod2FzIGluY29ycmVjdGx5IHVzaW5nICduYW1lJylcbiAgICAvLyBBbGwgZXhlY3V0ZSBvcGVyYXRpb25zIHJlcXVpcmUgZWxlbWVudF9uYW1lIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXRcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICBwYXJhbXMsXG4gICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICd0aGUgbmFtZSBvZiB0aGUgYWdlbnQvZWxlbWVudCB0byBleGVjdXRlJ1xuICAgICk7XG5cbiAgICAvLyBJc3N1ZSAjMTEwOiBQcm9ncmFtbWF0aWMgZW5mb3JjZW1lbnQgZm9yIERBTkdFUl9aT05FIHRpZXJcbiAgICAvLyBJc3N1ZSAjNDAyOiBVc2UgREktaW5qZWN0ZWQgZW5mb3JjZXIgaW5zdGVhZCBvZiBzaW5nbGV0b25cbiAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlclxuICAgIC8vIE9ubHkgYWxsb3cgJ2dldFN0YXRlJyBvcGVyYXRpb24gZm9yIGJsb2NrZWQgYWdlbnRzIChyZWFkLW9ubHksIG5lZWRlZCBmb3IgZGlhZ25vc3RpY3MpXG4gICAgaWYgKG1ldGhvZCAhPT0gJ2dldFN0YXRlJyAmJiB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcikge1xuICAgICAgY29uc3QgYmxvY2tDaGVjayA9IHRoaXMuaGFuZGxlcnMuZGFuZ2VyWm9uZUVuZm9yY2VyLmNoZWNrKGVsZW1lbnROYW1lKTtcbiAgICAgIGlmIChibG9ja0NoZWNrLmJsb2NrZWQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgYmxvY2tlZCBmcm9tIGV4ZWN1dGluZyAnJHttZXRob2R9JzogJHtibG9ja0NoZWNrLnJlYXNvbn1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICByZWFzb246IGJsb2NrQ2hlY2sucmVhc29uLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgLy8gSXNzdWUgIzQwNTogQWN0aW9uYWJsZSBndWlkYW5jZSB3aXRoIHZlcmlmeV9jaGFsbGVuZ2UgaW5zdHJ1Y3Rpb25zXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWdlbnQgJyR7ZWxlbWVudE5hbWV9JyBpcyBibG9ja2VkIGR1ZSB0byBkYW5nZXIgem9uZSB0cmlnZ2VyOiAke2Jsb2NrQ2hlY2sucmVhc29ufS4gYCArXG4gICAgICAgICAgYCR7YmxvY2tDaGVjay5yZXNvbHV0aW9ufWAgK1xuICAgICAgICAgIChibG9ja0NoZWNrLnZlcmlmaWNhdGlvbklkXG4gICAgICAgICAgICA/ICcgQXNrIHRoZSBodW1hbiBvcGVyYXRvciB0byByZWFkIHRoZSB2ZXJpZmljYXRpb24gY29kZSBmcm9tIHRoZSBkaWFsb2cgb24gdGhlaXIgc2NyZWVuLidcbiAgICAgICAgICAgIDogJycpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzI0OTogUmVqZWN0IGV4ZWN1dGlvbiBvcGVyYXRpb25zIGZvciBhYm9ydGVkIGdvYWxzLlxuICAgIC8vIE9wZXJhdGlvbnMgdGhhdCBtb2RpZnkgZXhlY3V0aW9uIHN0YXRlIGFyZSBibG9ja2VkOyBnZXRTdGF0ZSBhbmQgYWJvcnQgYXJlIGFsbG93ZWQuXG4gICAgaWYgKG1ldGhvZCAhPT0gJ2V4ZWN1dGUnICYmIG1ldGhvZCAhPT0gJ2dldFN0YXRlJyAmJiBtZXRob2QgIT09ICdhYm9ydCcpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBhZ2VudCdzIGFjdGl2ZSBnb2FsIGhhcyBiZWVuIGFib3J0ZWRcbiAgICAgIGNvbnN0IGFnZW50R29hbElkcyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlR29hbElkcyhtYW5hZ2VyLCBlbGVtZW50TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IGdvYWxJZCBvZiBhZ2VudEdvYWxJZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuYWJvcnRlZEdvYWxzLmhhcyhnb2FsSWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgZXhlY3V0aW9uIHdhcyBhYm9ydGVkIChnb2FsSWQ6ICR7Z29hbElkfSkuIGAgK1xuICAgICAgICAgICAgYEZ1cnRoZXIgZXhlY3V0aW9uIG9wZXJhdGlvbnMgYXJlIHJlamVjdGVkLiBVc2UgZXhlY3V0ZV9hZ2VudCB0byBzdGFydCBhIG5ldyBleGVjdXRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnZXhlY3V0ZSc6IHtcbiAgICAgICAgLy8gU3RhcnQgZXhlY3V0aW9uIG9mIGFuIGFnZW50IG9yIGV4ZWN1dGFibGUgZWxlbWVudFxuICAgICAgICBjb25zdCBleGVjdXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5leGVjdXRlQWdlbnQoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNDQ3OiBWYWxpZGF0ZSBydW50aW1lIG1heEF1dG9ub21vdXNTdGVwcyBvdmVycmlkZVxuICAgICAgICBjb25zdCBydW50aW1lTWF4U3RlcHMgPSBwYXJhbXMubWF4QXV0b25vbW91c1N0ZXBzO1xuICAgICAgICBpZiAocnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJ1bnRpbWVNYXhTdGVwcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIocnVudGltZU1heFN0ZXBzKSB8fCBydW50aW1lTWF4U3RlcHMgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heEF1dG9ub21vdXNTdGVwcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNDQ5OiBUcmFjayBleGVjdXRpbmcgYWdlbnQgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50XG4gICAgICAgIC8vIElzc3VlICM0NDc6IEFsc28gc3RvcmUgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGVcbiAgICAgICAgLy8gSXNzdWUgIzUyNjogQWxzbyBzdG9yZSByZXNpbGllbmNlIHBvbGljeSBhbmQgb3JpZ2luYWwgcGFyYW1ldGVyc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFnZW50RWxlbWVudCA9IGF3YWl0IG1hbmFnZXIucmVhZChlbGVtZW50TmFtZSk7XG4gICAgICAgICAgaWYgKGFnZW50RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgYWdlbnRNZXRhID0gYWdlbnRFbGVtZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgICAgIGxldCBnYXRla2VlcGVyUG9saWN5ID0gYWdlbnRNZXRhLmdhdGVrZWVwZXI7XG5cbiAgICAgICAgICAgIC8vIFN5bnRoZXNpemUgcG9saWN5IGZyb20gdG9vbHMgY29uZmlnIGlmIG5vIGV4cGxpY2l0IGdhdGVrZWVwZXIgcG9saWN5XG4gICAgICAgICAgICBpZiAoIWdhdGVrZWVwZXJQb2xpY3kgJiYgYWdlbnRNZXRhLnRvb2xzKSB7XG4gICAgICAgICAgICAgIGdhdGVrZWVwZXJQb2xpY3kgPSB0cmFuc2xhdGVUb29sQ29uZmlnVG9Qb2xpY3koYWdlbnRNZXRhLnRvb2xzKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElzc3VlICM1MjY6IEV4dHJhY3QgcmVzaWxpZW5jZSBwb2xpY3kgZnJvbSBhZ2VudCBtZXRhZGF0YVxuICAgICAgICAgICAgY29uc3QgcmVzaWxpZW5jZVBvbGljeSA9IGFnZW50TWV0YS5yZXNpbGllbmNlO1xuXG4gICAgICAgICAgICAvLyBBbHdheXMgdHJhY2sgaWYgdGhlcmUncyBhIGdhdGVrZWVwZXIgcG9saWN5LCBydW50aW1lIG92ZXJyaWRlLCBvciByZXNpbGllbmNlIHBvbGljeVxuICAgICAgICAgICAgaWYgKGdhdGVrZWVwZXJQb2xpY3kgfHwgcnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQgfHwgcmVzaWxpZW5jZVBvbGljeSkge1xuICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGluZ0FnZW50cy5zZXQoZWxlbWVudE5hbWUsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgLi4uKGdhdGVrZWVwZXJQb2xpY3kgPyB7IGdhdGVrZWVwZXI6IGdhdGVrZWVwZXJQb2xpY3kgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgIC4uLihydW50aW1lTWF4U3RlcHMgIT09IHVuZGVmaW5lZCA/IHsgbWF4QXV0b25vbW91c1N0ZXBzOiBydW50aW1lTWF4U3RlcHMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBjb250aW51YXRpb25Db3VudDogMCxcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUGFyYW1ldGVyczogcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVzaWxpZW5jZVBvbGljeSxcbiAgICAgICAgICAgICAgICByZWNlbnRCbG9ja3M6IFtdLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBObyBhZ2VudCBlbGVtZW50IHRvIHJlYWQsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHN0b3JlIHRoZSBvdmVycmlkZVxuICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuc2V0KGVsZW1lbnROYW1lLCB7XG4gICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBtYXhBdXRvbm9tb3VzU3RlcHM6IHJ1bnRpbWVNYXhTdGVwcyB9LFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIGNvbnRpbnVhdGlvbkNvdW50OiAwLFxuICAgICAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgICAgICBvcmlnaW5hbFBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByZWNlbnRCbG9ja3M6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBOb24tZmF0YWw6IGFnZW50IGV4ZWN1dGVzIGV2ZW4gaWYgdHJhY2tpbmcgZmFpbHNcbiAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHRyYWNrIGV4ZWN1dGluZyBhZ2VudCBmb3IgR2F0ZWtlZXBlciBwb2xpY3knLCB7IGFnZW50TmFtZTogZWxlbWVudE5hbWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnRXhlY3V0ZUFnZW50UmVzdWx0JywgLi4uZXhlY3V0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRTdGF0ZSc6IHtcbiAgICAgICAgLy8gUXVlcnkgY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICAgICAgY29uc3Qgc3RhdGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmdldEFnZW50U3RhdGUoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeTogcGFyYW1zLmluY2x1ZGVEZWNpc2lvbkhpc3RvcnkgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlQ29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnRXhlY3V0aW9uU3RhdGUnLCAuLi5zdGF0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICd1cGRhdGVTdGF0ZSc6IHtcbiAgICAgICAgLy8gUmVjb3JkIGV4ZWN1dGlvbiBwcm9ncmVzcywgc3RlcCBjb21wbGV0aW9uLCBvciBmaW5kaW5nc1xuICAgICAgICAvLyBSZXR1cm5zIGF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIGNvbnRpbnVlL3BhdXNlXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgb3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICBjb25zdCBuZXh0QWN0aW9uSGludCA9IHBhcmFtcy5uZXh0QWN0aW9uSGludDtcbiAgICAgICAgaWYgKG5leHRBY3Rpb25IaW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG5leHRBY3Rpb25IaW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbmV4dEFjdGlvbkhpbnQgbXVzdCBiZSBhIHN0cmluZyBpZiBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcmlza1Njb3JlID0gcGFyYW1zLnJpc2tTY29yZTtcbiAgICAgICAgaWYgKHJpc2tTY29yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByaXNrU2NvcmUgIT09ICdudW1iZXInIHx8IGlzTmFOKHJpc2tTY29yZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmlza1Njb3JlIG11c3QgYmUgYSBudW1iZXIgaWYgcHJvdmlkZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpc2tTY29yZSA8IDAgfHwgcmlza1Njb3JlID4gMTAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jpc2tTY29yZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgc3RvcmVkIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgY29uc3QgbWF4U3RlcHNPdmVycmlkZSA9IGV4ZWN1dGluZ0FnZW50Py5tZXRhZGF0YT8ubWF4QXV0b25vbW91c1N0ZXBzIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCB1cGRhdGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLnJlY29yZEFnZW50U3RlcCh7XG4gICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICBzdGVwRGVzY3JpcHRpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgICAgICBmaW5kaW5nczogcGFyYW1zLmZpbmRpbmdzIGFzIHN0cmluZyxcbiAgICAgICAgICBjb25maWRlbmNlOiBwYXJhbXMuY29uZmlkZW5jZSBhcyBudW1iZXIsXG4gICAgICAgICAgbmV4dEFjdGlvbkhpbnQ6IG5leHRBY3Rpb25IaW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICByaXNrU2NvcmU6IHJpc2tTY29yZSBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4U3RlcHNPdmVycmlkZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyNjogRXZhbHVhdGUgcmVzaWxpZW5jZSBwb2xpY3kgd2hlbiBhdXRvbm9teSBzYXlzIHBhdXNlXG4gICAgICAgIGNvbnN0IHJlc2lsaWVuY2VSZXN1bHQgPSB0aGlzLmV2YWx1YXRlUmVzaWxpZW5jZShcbiAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICB1cGRhdGVSZXN1bHQsXG4gICAgICAgICAgcGFyYW1zLm91dGNvbWUgYXMgc3RyaW5nXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbTogY29sbGVjdCBhbmQgYXR0YWNoIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgY29uc3QgZmluYWxSZXN1bHQgPSByZXNpbGllbmNlUmVzdWx0ID8/IHVwZGF0ZVJlc3VsdDtcbiAgICAgICAgY29uc3QgYXV0b25vbXkgPSBmaW5hbFJlc3VsdC5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGF1dG9ub215KSB7XG4gICAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IHRoaXMuY29sbGVjdE5vdGlmaWNhdGlvbnMoZWxlbWVudE5hbWUsIGF1dG9ub215KTtcbiAgICAgICAgICBpZiAobm90aWZpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhdXRvbm9teS5ub3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnU3RlcFJlc3VsdCcsIC4uLmZpbmFsUmVzdWx0IH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NvbXBsZXRlJzoge1xuICAgICAgICAvLyBTaWduYWwgZXhlY3V0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICBjb25zdCBjb21wbGV0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWUgYXMgJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnIHwgJ3BhcnRpYWwnLFxuICAgICAgICAgIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5IGFzIHN0cmluZyxcbiAgICAgICAgICBnb2FsSWQ6IHBhcmFtcy5nb2FsSWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTI2OiBUcmFjayByZXNpbGllbmNlIG91dGNvbWUgYW5kIHJlc2V0IGNpcmN1aXQgYnJlYWtlciBvbiBzdWNjZXNzXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZEFnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgaWYgKGNvbXBsZXRlZEFnZW50Py5yZXNpbGllbmNlUG9saWN5ICYmIChjb21wbGV0ZWRBZ2VudC5jb250aW51YXRpb25Db3VudCA+IDAgfHwgY29tcGxldGVkQWdlbnQucmV0cnlDb3VudCA+IDApKSB7XG4gICAgICAgICAgY29uc3QgaXNTdWNjZXNzID0gcGFyYW1zLm91dGNvbWUgPT09ICdzdWNjZXNzJztcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDb21wbGV0aW9uQWZ0ZXJSZXNpbGllbmNlKGlzU3VjY2Vzcyk7XG4gICAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgICAgY2lyY3VpdEJyZWFrZXIucmVzZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM0NDk6IFJlbW92ZSBhZ2VudCBmcm9tIGV4ZWN1dGluZyBzZXQgc28gaXRzIHBvbGljaWVzIHN0b3AgYXBwbHlpbmdcbiAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuZGVsZXRlKGVsZW1lbnROYW1lKTtcblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnQ29tcGxldGlvblJlc3VsdCcsIC4uLmNvbXBsZXRlUmVzdWx0IH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NvbnRpbnVlJzoge1xuICAgICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGZyb20gc2F2ZWQgc3RhdGVcbiAgICAgICAgY29uc3QgY29udGludWVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbnRpbnVlQWdlbnRFeGVjdXRpb24oe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBwYXJhbXMucHJldmlvdXNTdGVwUmVzdWx0IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElzc3VlICMxMjU6IFJldHVybiBzdHJ1Y3R1cmVkIEpTT04gd2l0aCB0eXBlIGRpc2NyaW1pbmF0b3JcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdDb250aW51ZVJlc3VsdCcsIC4uLmNvbnRpbnVlUmVzdWx0IH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2Fib3J0Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMjQ5OiBBYm9ydCBhIHJ1bm5pbmcgYWdlbnQgZXhlY3V0aW9uXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IChwYXJhbXMucmVhc29uIGFzIHN0cmluZykgfHwgJ0Fib3J0ZWQgYnkgdXNlcic7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgYWN0aXZlIGdvYWwgZm9yIHRoaXMgYWdlbnRcbiAgICAgICAgY29uc3QgYWN0aXZlR29hbElkcyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlR29hbElkcyhtYW5hZ2VyLCBlbGVtZW50TmFtZSk7XG4gICAgICAgIGlmIChhY3RpdmVHb2FsSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBObyBhY3RpdmUgZXhlY3V0aW9uIGZvdW5kIGZvciBhZ2VudCAnJHtlbGVtZW50TmFtZX0nLiBgICtcbiAgICAgICAgICAgIGBOb3RoaW5nIHRvIGFib3J0LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBhbGwgYWN0aXZlIGdvYWxzIGFzIGFib3J0ZWRcbiAgICAgICAgZm9yIChjb25zdCBnb2FsSWQgb2YgYWN0aXZlR29hbElkcykge1xuICAgICAgICAgIHRoaXMuYWJvcnRlZEdvYWxzLmFkZChnb2FsSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcGxldGUgdGhlIGFnZW50IGdvYWwgd2l0aCAnZmFpbHVyZScgb3V0Y29tZSB0byBwZXJzaXN0IHRoZSBhYm9ydGVkIHN0YXRlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgbWFuYWdlci5jb21wbGV0ZUFnZW50R29hbCh7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgICAgICAgICAgc3VtbWFyeTogYEV4ZWN1dGlvbiBhYm9ydGVkOiAke3JlYXNvbn1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBOb24tZmF0YWw6IGdvYWwgbWF5IGFscmVhZHkgYmUgY29tcGxldGVkIG9yIGFnZW50IHN0YXRlIG1heSBiZSBpbmNvbnNpc3RlbnRcbiAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIG1hcmsgYWJvcnRlZCBhZ2VudCBnb2FsIGFzIGZhaWxlZCcsIHsgYWdlbnROYW1lOiBlbGVtZW50TmFtZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM1MjY6IFRyYWNrIHJlc2lsaWVuY2Ugb3V0Y29tZSAoYWJvcnQgPSBmYWlsdXJlIGFmdGVyIHJlc2lsaWVuY2UpXG4gICAgICAgIGNvbnN0IGFib3J0ZWRBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGlmIChhYm9ydGVkQWdlbnQ/LnJlc2lsaWVuY2VQb2xpY3kgJiYgKGFib3J0ZWRBZ2VudC5jb250aW51YXRpb25Db3VudCA+IDAgfHwgYWJvcnRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgIHJlc2lsaWVuY2VNZXRyaWNzLnJlY29yZENvbXBsZXRpb25BZnRlclJlc2lsaWVuY2UoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgZXhlY3V0aW5nQWdlbnRzIE1hcCAoc3RvcCBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudClcbiAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuZGVsZXRlKGVsZW1lbnROYW1lKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCBEYW5nZXJab25lRW5mb3JjZXIgYmxvY2tzIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlci51bmJsb2NrKGVsZW1lbnROYW1lKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIE5vbi1mYXRhbDogYWdlbnQgbWF5IG5vdCBoYXZlIGJlZW4gYmxvY2tlZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQUdFTlRfRVhFQ1VURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoRXhlY3V0ZS5hYm9ydCcsXG4gICAgICAgICAgZGV0YWlsczogYEFnZW50IGV4ZWN1dGlvbiBhYm9ydGVkOiAke2VsZW1lbnROYW1lfSDigJQgJHtyZWFzb259YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBhY3RpdmVHb2FsSWRzLFxuICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICMxMjU6IFJldHVybiBzdHJ1Y3R1cmVkIEpTT04gd2l0aCB0eXBlIGRpc2NyaW1pbmF0b3JcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfdHlwZTogJ0Fib3J0UmVzdWx0JyxcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgYWJvcnRlZEdvYWxJZHM6IGFjdGl2ZUdvYWxJZHMsXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGV4ZWN1dGlvbiBhYm9ydGVkLiAke2FjdGl2ZUdvYWxJZHMubGVuZ3RofSBnb2FsKHMpIHRlcm1pbmF0ZWQuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0R2F0aGVyZWREYXRhJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjg6IEdldCBhZ2dyZWdhdGVkIGV4ZWN1dGlvbiBkYXRhIGZvciBhIHNwZWNpZmljIGdvYWxcbiAgICAgICAgY29uc3QgZ29hbElkID0gcGFyYW1zLmdvYWxJZDtcbiAgICAgICAgaWYgKHR5cGVvZiBnb2FsSWQgIT09ICdzdHJpbmcnIHx8ICFnb2FsSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvYWxJZCBpcyByZXF1aXJlZCBmb3IgZ2V0X2dhdGhlcmVkX2RhdGEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnYXRoZXJlZERhdGEgPSBhd2FpdCBtYW5hZ2VyLmdldEdhdGhlcmVkRGF0YSh7XG4gICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICBnb2FsSWQ6IGdvYWxJZCBhcyBzdHJpbmcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0dhdGhlcmVkRGF0YScsIC4uLmdhdGhlcmVkRGF0YSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdwcmVwYXJlSGFuZG9mZic6IHtcbiAgICAgICAgLy8gSXNzdWUgIzY5OiBQcmVwYXJlIGEgaGFuZG9mZiBzdGF0ZSBmb3Igc2Vzc2lvbiB0cmFuc2ZlclxuICAgICAgICBjb25zdCBoYW5kb2ZmR29hbElkID0gcGFyYW1zLmdvYWxJZDtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kb2ZmR29hbElkICE9PSAnc3RyaW5nJyB8fCAhaGFuZG9mZkdvYWxJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ29hbElkIGlzIHJlcXVpcmVkIGZvciBwcmVwYXJlX2hhbmRvZmYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBnYXRoZXJlZCBkYXRhIGZvciB0aGUgZ29hbFxuICAgICAgICBjb25zdCBoYW5kb2ZmR2F0aGVyZWREYXRhID0gYXdhaXQgbWFuYWdlci5nZXRHYXRoZXJlZERhdGEoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZ29hbElkOiBoYW5kb2ZmR29hbElkLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZWFkIGFnZW50IG1ldGFkYXRhIGZvciBhY3RpdmUgZWxlbWVudHMgYW5kIHN1Y2Nlc3MgY3JpdGVyaWFcbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICAgICAgbGV0IHN1Y2Nlc3NDcml0ZXJpYTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudEVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyLnJlYWQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBhZ2VudEVsZW1lbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuICAgICAgICAgICAgaWYgKG1ldGEuYWN0aXZhdGVzKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzID0geyAuLi5tZXRhLmFjdGl2YXRlcyB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1Y2Nlc3NDcml0ZXJpYSA9IG1ldGEuZ29hbD8uc3VjY2Vzc0NyaXRlcmlhIHx8IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBwcm9jZWVkIHdpdGggZGVmYXVsdHNcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHdheXMgaW5jbHVkZSB0aGUgYWdlbnQgaXRzZWxmXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50c1snYWdlbnRzJ10uaW5jbHVkZXMoZWxlbWVudE5hbWUpKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddLnB1c2goZWxlbWVudE5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIGhhbmRvZmYgc3RhdGVcbiAgICAgICAgY29uc3QgaGFuZG9mZlN0YXRlID0gcHJlcGFyZUhhbmRvZmZTdGF0ZShcbiAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICBoYW5kb2ZmR2F0aGVyZWREYXRhLFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICAgIHN1Y2Nlc3NDcml0ZXJpYVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHRoZSBjb3B5LXBhc3RlYWJsZSBibG9ja1xuICAgICAgICBjb25zdCBoYW5kb2ZmQmxvY2sgPSBnZW5lcmF0ZUhhbmRvZmZCbG9jayhoYW5kb2ZmU3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3R5cGU6ICdIYW5kb2ZmUmVzdWx0JyxcbiAgICAgICAgICBoYW5kb2ZmU3RhdGUsXG4gICAgICAgICAgaGFuZG9mZkJsb2NrLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdyZXN1bWVGcm9tSGFuZG9mZic6IHtcbiAgICAgICAgLy8gSXNzdWUgIzY5OiBSZXN1bWUgZXhlY3V0aW9uIGZyb20gYSBoYW5kb2ZmIGJsb2NrXG4gICAgICAgIGNvbnN0IGhhbmRvZmZCbG9ja1BhcmFtID0gcGFyYW1zLmhhbmRvZmZCbG9jaztcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kb2ZmQmxvY2tQYXJhbSAhPT0gJ3N0cmluZycgfHwgIWhhbmRvZmZCbG9ja1BhcmFtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYW5kb2ZmQmxvY2sgaXMgcmVxdWlyZWQgZm9yIHJlc3VtZV9mcm9tX2hhbmRvZmYgKHRoZSBmdWxsIGhhbmRvZmYgYmxvY2sgdGV4dCknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIGFuZCB2YWxpZGF0ZSB0aGUgaGFuZG9mZiBibG9jayAoY2hlY2tzdW0gdmFsaWRhdGVkIGludGVybmFsbHkpXG4gICAgICAgIGNvbnN0IHJlc3RvcmVkU3RhdGUgPSBwYXJzZUhhbmRvZmZCbG9jayhoYW5kb2ZmQmxvY2tQYXJhbSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBhZ2VudCBuYW1lIG1hdGNoZXNcbiAgICAgICAgaWYgKHJlc3RvcmVkU3RhdGUuYWdlbnROYW1lICE9PSBlbGVtZW50TmFtZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdIYW5kb2ZmIGFnZW50IG1pc21hdGNoIGRldGVjdGVkJywge1xuICAgICAgICAgICAgZXhwZWN0ZWRBZ2VudDogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBibG9ja0FnZW50OiByZXN0b3JlZFN0YXRlLmFnZW50TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnSGFuZG9mZiBhZ2VudCBtaXNtYXRjaDogdGhlIGhhbmRvZmYgYmxvY2sgd2FzIG5vdCBwcmVwYXJlZCBmb3IgdGhpcyBhZ2VudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2UgY2FsbGVyLXByb3ZpZGVkIHBhcmFtZXRlcnMgd2l0aCBoYW5kb2ZmIG1ldGFkYXRhLlxuICAgICAgICAvLyBUaGUgY2FsbGVyIG11c3Qgc3VwcGx5IGFueSByZXF1aXJlZCBnb2FsIHRlbXBsYXRlIHBhcmFtZXRlcnMgKGUuZy4gdGFzaykuXG4gICAgICAgIGNvbnN0IGNhbGxlclBhcmFtcyA9IChwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge307XG4gICAgICAgIGNvbnN0IHJlc3VtZVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5jYWxsZXJQYXJhbXMsXG4gICAgICAgICAgcmVzdW1lZEZyb21IYW5kb2ZmOiB0cnVlLFxuICAgICAgICAgIG9yaWdpbmFsR29hbElkOiByZXN0b3JlZFN0YXRlLmdvYWxJZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIHVzaW5nIGNvbnRpbnVlIHdpdGggcmVzdG9yZWQgY29udGV4dFxuICAgICAgICBjb25zdCBjb250aW51ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuY29udGludWVBZ2VudEV4ZWN1dGlvbih7XG4gICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ6IGBSZXN1bWVkIGZyb20gaGFuZG9mZiAoZ29hbElkOiAke3Jlc3RvcmVkU3RhdGUuZ29hbElkfSwgJHtyZXN0b3JlZFN0YXRlLmdvYWxQcm9ncmVzcy5zdGVwc0NvbXBsZXRlZH0gc3RlcHMgY29tcGxldGVkKWAsXG4gICAgICAgICAgcGFyYW1ldGVyczogcmVzdW1lUGFyYW1zLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF90eXBlOiAnUmVzdW1lUmVzdWx0JyxcbiAgICAgICAgICAuLi5jb250aW51ZVJlc3VsdCxcbiAgICAgICAgICByZXN0b3JlZEZyb206IHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogcmVzdG9yZWRTdGF0ZS5hZ2VudE5hbWUsXG4gICAgICAgICAgICBnb2FsSWQ6IHJlc3RvcmVkU3RhdGUuZ29hbElkLFxuICAgICAgICAgICAgdmVyc2lvbjogcmVzdG9yZWRTdGF0ZS52ZXJzaW9uLFxuICAgICAgICAgICAgc3RlcHNDb21wbGV0ZWQ6IHJlc3RvcmVkU3RhdGUuZ29hbFByb2dyZXNzLnN0ZXBzQ29tcGxldGVkLFxuICAgICAgICAgICAgcHJlcGFyZWRBdDogcmVzdG9yZWRTdGF0ZS5wcmVwYXJlZEF0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBFeGVjdXRlIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogTWF4aW11bSByZWNlbnQgYmxvY2tzIHRyYWNrZWQgcGVyIGFnZW50IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUkVDRU5UX0JMT0NLUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBnYXRla2VlcGVyIGJsb2NrIGFnYWluc3QgYWxsIGN1cnJlbnRseSBleGVjdXRpbmcgYWdlbnRzLlxuICAgKiBDYWxsZWQgd2hlbiBHYXRla2VlcGVyLmVuZm9yY2UoKSBkZW5pZXMgYW4gb3BlcmF0aW9uLCBzbyB0aGF0XG4gICAqIHJlY29yZF9leGVjdXRpb25fc3RlcCBjYW4gcmVwb3J0IGl0IGFzIGEgbm90aWZpY2F0aW9uLlxuICAgKlxuICAgKiBAc2luY2UgdjIuMS4wIC0gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRHYXRla2VlcGVyQmxvY2tGb3JBZ2VudHMoXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZWFzb246IHN0cmluZyxcbiAgICBsZXZlbDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4ZWN1dGluZ0FnZW50cy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBibG9jayA9IHtcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgcmVhc29uLFxuICAgICAgbGV2ZWwsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJlcG9ydGVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbLCBhZ2VudEVudHJ5XSBvZiB0aGlzLmV4ZWN1dGluZ0FnZW50cykge1xuICAgICAgYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3MucHVzaChibG9jayk7XG5cbiAgICAgIC8vIENhcCBhdCBNQVhfUkVDRU5UX0JMT0NLUzogZXZpY3Qgb2xkZXN0IHJlcG9ydGVkIGZpcnN0LCB0aGVuIG9sZGVzdCB1bnJlcG9ydGVkXG4gICAgICB3aGlsZSAoYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3MubGVuZ3RoID4gTUNQQVFMSGFuZGxlci5NQVhfUkVDRU5UX0JMT0NLUykge1xuICAgICAgICBjb25zdCByZXBvcnRlZElkeCA9IGFnZW50RW50cnkucmVjZW50QmxvY2tzLmZpbmRJbmRleChiID0+IGIucmVwb3J0ZWQpO1xuICAgICAgICBpZiAocmVwb3J0ZWRJZHggPj0gMCkge1xuICAgICAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnNwbGljZShyZXBvcnRlZElkeCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3Muc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IG5vdGlmaWNhdGlvbnMgZm9yIGFuIGV4ZWN1dGluZyBhZ2VudCBmcm9tIGFsbCBzb3VyY2VzOlxuICAgKiAxLiBVbnJlcG9ydGVkIGdhdGVrZWVwZXIgYmxvY2tzIOKGkiBwZXJtaXNzaW9uX3BlbmRpbmdcbiAgICogMi4gQXV0b25vbXkgcGF1c2UgKGNvbnRpbnVlPWZhbHNlKSDihpIgYXV0b25vbXlfcGF1c2VcbiAgICogMy4gRGFuZ2VyWm9uZSBibG9ja2VkIGFnZW50cyAoc3lzdGVtLXdpZGUgYnJvYWRjYXN0KSDihpIgZGFuZ2VyX3pvbmVcbiAgICpcbiAgICogR2F0ZWtlZXBlciBibG9ja3MgYXJlIG1hcmtlZCBhcyBcInJlcG9ydGVkXCIgYWZ0ZXIgZmlyc3QgY29sbGVjdGlvblxuICAgKiBzbyB0aGV5IGRvbid0IHJlcGVhdCBvbiBzdWJzZXF1ZW50IGNhbGxzLiBEYW5nZXJab25lIGFuZCBhdXRvbm9teVxuICAgKiBub3RpZmljYXRpb25zIGFyZSBhbHdheXMgZW1pdHRlZCB3aGlsZSB0aGUgY29uZGl0aW9uIHBlcnNpc3RzLlxuICAgKlxuICAgKiBAc2luY2UgdjIuMS4wIC0gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjb2xsZWN0Tm90aWZpY2F0aW9ucyhcbiAgICBhZ2VudE5hbWU6IHN0cmluZyxcbiAgICBhdXRvbm9teTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogQWdlbnROb3RpZmljYXRpb25bXSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uczogQWdlbnROb3RpZmljYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGFnZW50TmFtZSk7XG5cbiAgICAvLyBTb3VyY2UgMTogVW5yZXBvcnRlZCBnYXRla2VlcGVyIGJsb2Nrc1xuICAgIGlmIChleGVjdXRpbmdBZ2VudD8ucmVjZW50QmxvY2tzKSB7XG4gICAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGV4ZWN1dGluZ0FnZW50LnJlY2VudEJsb2Nrcykge1xuICAgICAgICBpZiAoIWJsb2NrLnJlcG9ydGVkKSB7XG4gICAgICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdwZXJtaXNzaW9uX3BlbmRpbmcnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7YmxvY2sub3BlcmF0aW9ufSR7YmxvY2suZWxlbWVudFR5cGUgPyBgKCR7YmxvY2suZWxlbWVudFR5cGV9KWAgOiAnJ30gcmVxdWlyZXMgY29uZmlybWF0aW9uYCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogYmxvY2sub3BlcmF0aW9uLFxuICAgICAgICAgICAgICBlbGVtZW50X3R5cGU6IGJsb2NrLmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICByZWFzb246IGJsb2NrLnJlYXNvbixcbiAgICAgICAgICAgICAgbGV2ZWw6IGJsb2NrLmxldmVsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogYmxvY2sudGltZXN0YW1wLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJsb2NrLnJlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvdXJjZSAyOiBBdXRvbm9teSBwYXVzZVxuICAgIGlmIChhdXRvbm9teS5jb250aW51ZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IChhdXRvbm9teS5yZWFzb24gYXMgc3RyaW5nKSB8fCAoYXV0b25vbXkuZmFjdG9ycyBhcyBzdHJpbmdbXSB8fCBbXSkuam9pbignLCAnKTtcbiAgICAgIGlmIChyZWFzb24pIHtcbiAgICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnYXV0b25vbXlfcGF1c2UnLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCBwYXVzZWQ6ICR7cmVhc29ufWAsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3VyY2UgMzogRGFuZ2VyWm9uZSBicm9hZGNhc3Qg4oCUIGFsZXJ0IEFMTCBleGVjdXRpbmcgYWdlbnRzIGFib3V0IGFueSBibG9ja2VkIGFnZW50XG4gICAgY29uc3QgZW5mb3JjZXIgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcjtcbiAgICBpZiAoZW5mb3JjZXI/Lmhhc0Jsb2NrZWRBZ2VudHMoKSkge1xuICAgICAgZm9yIChjb25zdCBibG9ja2VkQWdlbnQgb2YgZW5mb3JjZXIuZ2V0QmxvY2tlZEFnZW50cygpKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrQ2hlY2sgPSBlbmZvcmNlci5jaGVjayhibG9ja2VkQWdlbnQpO1xuICAgICAgICBpZiAoYmxvY2tDaGVjay5ibG9ja2VkKSB7XG4gICAgICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdkYW5nZXJfem9uZScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7YmxvY2tlZEFnZW50fScgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlcjogJHtibG9ja0NoZWNrLnJlYXNvbn1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgYWdlbnROYW1lOiBibG9ja2VkQWdlbnQsXG4gICAgICAgICAgICAgIHJlYXNvbjogYmxvY2tDaGVjay5yZWFzb24sXG4gICAgICAgICAgICAgIHZlcmlmaWNhdGlvbklkOiBibG9ja0NoZWNrLnZlcmlmaWNhdGlvbklkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbnM7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc2lsaWVuY2UgRXZhbHVhdGlvbiAoSXNzdWUgIzUyNilcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSByZXNpbGllbmNlIHBvbGljeSBhZnRlciBhIHN0ZXAgcmVzdWx0IGFuZCBwb3RlbnRpYWxseSBvdmVycmlkZVxuICAgKiB0aGUgYXV0b25vbXkgZGlyZWN0aXZlIHRvIGVuYWJsZSBhdXRvLWNvbnRpbnVhdGlvbiBvciByZXRyeS5cbiAgICpcbiAgICogUmV0dXJucyBhIG1vZGlmaWVkIHN0ZXAgcmVzdWx0IGlmIHJlc2lsaWVuY2Uga2lja3MgaW4sIG9yIG51bGwgdG8gdXNlXG4gICAqIHRoZSBvcmlnaW5hbCByZXN1bHQgKGRlZmF1bHQgYmVoYXZpb3IpLlxuICAgKlxuICAgKiBAc2luY2UgdjIuMS4wIC0gQWdlbnQgRXhlY3V0aW9uIFJlc2lsaWVuY2UgKElzc3VlICM1MjYpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGV2YWx1YXRlUmVzaWxpZW5jZShcbiAgICBhZ2VudE5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVSZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0ZXBPdXRjb21lOiBzdHJpbmdcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgICAvLyBPbmx5IGV2YWx1YXRlIHdoZW4gYXV0b25vbXkgc2F5cyBwYXVzZVxuICAgIGNvbnN0IGF1dG9ub215ID0gdXBkYXRlUmVzdWx0LmF1dG9ub215IGFzIHsgY29udGludWU6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZzsgZmFjdG9ycz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhdXRvbm9teSB8fCBhdXRvbm9teS5jb250aW51ZSA9PT0gdHJ1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBMb29rIHVwIHRoZSBleGVjdXRpbmcgYWdlbnQncyByZXNpbGllbmNlIHRyYWNraW5nIHN0YXRlXG4gICAgY29uc3QgZXhlY3V0aW5nQWdlbnQgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoYWdlbnROYW1lKTtcbiAgICBpZiAoIWV4ZWN1dGluZ0FnZW50Py5yZXNpbGllbmNlUG9saWN5KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIERldGVybWluZSB3aGF0IHRyaWdnZXJlZCB0aGUgcGF1c2VcbiAgICBjb25zdCBpc1N0ZXBMaW1pdCA9IGF1dG9ub215LnJlYXNvbj8uc3RhcnRzV2l0aCgnTWF4aW11bSBhdXRvbm9tb3VzIHN0ZXBzIHJlYWNoZWQnKSA/PyBmYWxzZTtcbiAgICBjb25zdCBpc0ZhaWx1cmUgPSBzdGVwT3V0Y29tZSA9PT0gJ2ZhaWx1cmUnO1xuXG4gICAgLy8gT25seSBoYW5kbGUgc3RlcC1saW1pdCBhbmQgZmFpbHVyZSB0cmlnZ2Vyc1xuICAgIGlmICghaXNTdGVwTGltaXQgJiYgIWlzRmFpbHVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb250ZXh0OiBSZXNpbGllbmNlQ29udGV4dCA9IHtcbiAgICAgIHRyaWdnZXI6IGlzU3RlcExpbWl0ID8gJ3N0ZXBfbGltaXQnIDogJ2V4ZWN1dGlvbl9mYWlsdXJlJyxcbiAgICAgIGNvbnRpbnVhdGlvbkNvdW50OiBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCxcbiAgICAgIHJldHJ5Q291bnQ6IGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQsXG4gICAgICBzdGVwT3V0Y29tZTogc3RlcE91dGNvbWUgYXMgJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnIHwgJ3BhcnRpYWwnLFxuICAgICAgYWdlbnROYW1lLFxuICAgIH07XG5cbiAgICBjb25zdCBhY3Rpb24gPSBldmFsdWF0ZVJlc2lsaWVuY2VQb2xpY3koZXhlY3V0aW5nQWdlbnQucmVzaWxpZW5jZVBvbGljeSwgY29udGV4dCk7XG5cbiAgICAvLyBJZiByZXNpbGllbmNlIHNheXMgcGF1c2UsIHJlY29yZCB0aGUgbGltaXQgYW5kIHVzZSB0aGUgb3JpZ2luYWwgcmVzdWx0XG4gICAgaWYgKGFjdGlvbi5hY3Rpb24gPT09ICdwYXVzZScpIHtcbiAgICAgIC8vIFRyYWNrIGlmIHRoaXMgd2FzIGEgbGltaXQgZXhoYXVzdGlvbiAobm90IGEgZGVmYXVsdC1wYXVzZSBwb2xpY3kpXG4gICAgICBpZiAoYWN0aW9uLnJlYXNvbj8uaW5jbHVkZXMoJ2V4aGF1c3RlZCcpIHx8IGFjdGlvbi5yZWFzb24/LmluY2x1ZGVzKCdDaXJjdWl0IGJyZWFrZXInKSkge1xuICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRSZXNpbGllbmNlTGltaXQoKTtcbiAgICAgICAgaWYgKGFjdGlvbi5yZWFzb24/LmluY2x1ZGVzKCdDaXJjdWl0IGJyZWFrZXInKSkge1xuICAgICAgICAgIHJlc2lsaWVuY2VNZXRyaWNzLnJlY29yZENpcmN1aXRCcmVha2VyVHJpcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWNvbnRpbnVlOiBvdmVycmlkZSB0aGUgYXV0b25vbXkgZGlyZWN0aXZlIHRvIGNvbnRpbnVlXG4gICAgaWYgKGFjdGlvbi5hY3Rpb24gPT09ICdjb250aW51ZScpIHtcbiAgICAgIGV4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50Kys7XG4gICAgICBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50ID0gMDsgLy8gUmVzZXQgcmV0cnkgY291bnQgb24gY29udGludWF0aW9uXG4gICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRBdXRvQ29udGludWF0aW9uKCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FVVE9fQ09OVElOVUVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmV2YWx1YXRlUmVzaWxpZW5jZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHthZ2VudE5hbWV9JyBhdXRvLWNvbnRpbnVlZDogJHthY3Rpb24ucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIGNvbnRpbnVhdGlvbkNvdW50OiBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCxcbiAgICAgICAgICBtYXhDb250aW51YXRpb25zOiBhY3Rpb24ubWF4Q29udGludWF0aW9ucyxcbiAgICAgICAgICB0cmlnZ2VyOiBjb250ZXh0LnRyaWdnZXIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udXBkYXRlUmVzdWx0LFxuICAgICAgICBhdXRvbm9teToge1xuICAgICAgICAgIC4uLmF1dG9ub215LFxuICAgICAgICAgIGNvbnRpbnVlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYWN0aW9uLnJlYXNvbixcbiAgICAgICAgICBmYWN0b3JzOiBbLi4uKGF1dG9ub215LmZhY3RvcnMgfHwgW10pLCBgcmVzaWxpZW5jZTogYXV0by1jb250aW51ZWQgKCR7ZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnR9LyR7YWN0aW9uLm1heENvbnRpbnVhdGlvbnMgfHwgJ3VubGltaXRlZCd9KWBdLFxuICAgICAgICAgIHJlc2lsaWVuY2VBY3Rpb246IGFjdGlvbixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmV0cnk6IHRlbGwgTExNIHRvIHJldHJ5IHdpdGggYmFja29mZiBndWlkYW5jZVxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAncmV0cnknKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50Kys7XG4gICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRTdGVwUmV0cnkoKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfU1RFUF9SRVRSSUVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmV2YWx1YXRlUmVzaWxpZW5jZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHthZ2VudE5hbWV9JyBzdGVwIHJldHJ5OiAke2FjdGlvbi5yZWFzb259YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhZ2VudE5hbWUsXG4gICAgICAgICAgcmV0cnlDb3VudDogZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCxcbiAgICAgICAgICBiYWNrb2ZmTXM6IGFjdGlvbi5iYWNrb2ZmTXMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZVJlc3VsdCxcbiAgICAgICAgYXV0b25vbXk6IHtcbiAgICAgICAgICAuLi5hdXRvbm9teSxcbiAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGFjdGlvbi5yZWFzb24sXG4gICAgICAgICAgZmFjdG9yczogWy4uLihhdXRvbm9teS5mYWN0b3JzIHx8IFtdKSwgYHJlc2lsaWVuY2U6IHJldHJ5IGF0dGVtcHQgJHtleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50fWBdLFxuICAgICAgICAgIHJlc2lsaWVuY2VBY3Rpb246IGFjdGlvbixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVzdGFydDogb3ZlcnJpZGUgdG8gY29udGludWUsIHNpZ25hbCBmcmVzaCByZXN0YXJ0IHRvIExMTVxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAncmVzdGFydCcpIHtcbiAgICAgIGV4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50Kys7XG4gICAgICBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50ID0gMDtcbiAgICAgIHJlc2lsaWVuY2VNZXRyaWNzLnJlY29yZEF1dG9SZXN0YXJ0KCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FVVE9fUkVTVEFSVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmV2YWx1YXRlUmVzaWxpZW5jZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHthZ2VudE5hbWV9JyBhdXRvLXJlc3RhcnRlZDogJHthY3Rpb24ucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIGNvbnRpbnVhdGlvbkNvdW50OiBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCxcbiAgICAgICAgICBtYXhDb250aW51YXRpb25zOiBhY3Rpb24ubWF4Q29udGludWF0aW9ucyxcbiAgICAgICAgICB0cmlnZ2VyOiBjb250ZXh0LnRyaWdnZXIsXG4gICAgICAgICAgcHJlc2VydmVTdGF0ZTogZXhlY3V0aW5nQWdlbnQucmVzaWxpZW5jZVBvbGljeT8ucHJlc2VydmVTdGF0ZSA/PyB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZVJlc3VsdCxcbiAgICAgICAgYXV0b25vbXk6IHtcbiAgICAgICAgICAuLi5hdXRvbm9teSxcbiAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGFjdGlvbi5yZWFzb24sXG4gICAgICAgICAgZmFjdG9yczogWy4uLihhdXRvbm9teS5mYWN0b3JzIHx8IFtdKSwgYHJlc2lsaWVuY2U6IGF1dG8tcmVzdGFydGVkICgke2V4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50fS8ke2FjdGlvbi5tYXhDb250aW51YXRpb25zIHx8ICd1bmxpbWl0ZWQnfSlgXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhY3RpdmUgZ29hbCBJRHMgZm9yIGFuIGFnZW50IChJc3N1ZSAjMjQ5KS5cbiAgICogUXVlcmllcyB0aGUgYWdlbnQncyBzdGF0ZSB0byBmaW5kIGluLXByb2dyZXNzIGdvYWxzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRBY3RpdmVHb2FsSWRzKFxuICAgIG1hbmFnZXI6IEFnZW50TWFuYWdlcixcbiAgICBhZ2VudE5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlKHsgYWdlbnROYW1lIH0pO1xuICAgICAgaWYgKHN0YXRlUmVzdWx0Py5zdGF0ZT8uZ29hbHMpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlUmVzdWx0LnN0YXRlLmdvYWxzXG4gICAgICAgICAgLmZpbHRlcigoZzogeyBzdGF0dXM6IHN0cmluZyB9KSA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgICAgICAubWFwKChnOiB7IGlkOiBzdHJpbmcgfSkgPT4gZy5pZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBZ2VudCBtYXkgbm90IGhhdmUgc3RhdGUgeWV0XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgY29ycmVsYXRpb24gSUQgZnJvbSB0aGUgdW5kZXJseWluZyBDb250ZXh0VHJhY2tlci5cbiAgICogRXhwb3NlZCBmb3IgdXNlIGJ5IFVuaWZpZWRFbmRwb2ludCBhbmQgb3RoZXIgd3JhcHBlcnMuXG4gICAqIElzc3VlICMzMDEuXG4gICAqL1xuICBnZXRDb3JyZWxhdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVzdWx0IEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQnVpbGQgcmVzcG9uc2UgbWV0YWRhdGEgd2l0aCBjb3JyZWxhdGlvbiBJRCBhbmQgdGltaW5nLlxuICAgKiBJc3N1ZSAjMzAxOiBSZXF1ZXN0IElEcyBhbmQgZGlzdHJpYnV0ZWQgdHJhY2luZyBzdXBwb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE1ldGEoc3RhcnRUaW1lOiBudW1iZXIpOiBSZXNwb25zZU1ldGEge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0SWQ6IHRoaXMuY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSA/PyAndW5rbm93bicsXG4gICAgICBkdXJhdGlvbk1zOiBwYXJzZUZsb2F0KChwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSkudG9GaXhlZCgyKSksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIHJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBzdWNjZXNzKGRhdGE6IHVua25vd24sIHN0YXJ0VGltZTogbnVtYmVyKTogT3BlcmF0aW9uU3VjY2VzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBkYXRhLFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWlsZWQgb3BlcmF0aW9uIHJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBmYWlsdXJlKGVycm9yOiBzdHJpbmcsIHN0YXJ0VGltZTogbnVtYmVyKTogT3BlcmF0aW9uRmFpbHVyZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3IsXG4gICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEoc3RhcnRUaW1lKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGaWVsZCBTZWxlY3Rpb24gKElzc3VlICMyMDIpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXBwbHkgZmllbGQgc2VsZWN0aW9uIGFuZCBuYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGhhbmRsZXIgcmVzcG9uc2UuXG4gICAqXG4gICAqIFByb2Nlc3NlcyB0aGUgYGZpZWxkc2AgcGFyYW1ldGVyIHRvIGZpbHRlciByZXNwb25zZSBkYXRhOlxuICAgKiAtIElmIGZpZWxkcyBpcyBhbiBhcnJheSwgZmlsdGVyIHRvIHRob3NlIGZpZWxkcyBvbmx5XG4gICAqIC0gSWYgZmllbGRzIGlzIGEgcHJlc2V0IHN0cmluZyAoJ21pbmltYWwnLCAnc3RhbmRhcmQnLCAnZnVsbCcpLCB1c2UgcHJlc2V0XG4gICAqIC0gSWYgZmllbGRzIGlzIG5vdCBwcm92aWRlZCwgdHJhbnNmb3JtIG5hbWVzIG9ubHkgKG5hbWUg4oaSIGVsZW1lbnRfbmFtZSlcbiAgICpcbiAgICogRm9yIHJlc3BvbnNlcyB3aXRoIGByZXN1bHRzYCBvciBgaXRlbXNgIGFycmF5cywgZmllbGQgc2VsZWN0aW9uIGlzIGFwcGxpZWRcbiAgICogdG8gZWFjaCBpdGVtIGluIHRoZSBhcnJheSByYXRoZXIgdGhhbiBmaWx0ZXJpbmcgdGhlIGNvbnRhaW5lciBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmF3IGhhbmRsZXIgcmVzdWx0XG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcmlnaW5hbCBwYXJhbXMgY29udGFpbmluZyBvcHRpb25hbCBgZmllbGRzYFxuICAgKiBAcmV0dXJucyBUcmFuc2Zvcm1lZCByZXN1bHQgd2l0aCBmaWVsZCBzZWxlY3Rpb24gYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUZpZWxkU2VsZWN0aW9uKFxuICAgIHJlc3VsdDogdW5rbm93bixcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICAvLyBTa2lwIHRyYW5zZm9ybWF0aW9uIGZvciBNQ1AgcmVzcG9uc2UgZm9ybWF0IHdpdGggY29udGVudCBhcnJheVxuICAgIC8vIFRoZXNlIGFyZSBmb3JtYXR0ZWQgdGV4dCByZXNwb25zZXMgdGhhdCBzaG91bGRuJ3QgYmUgdHJhbnNmb3JtZWRcbiAgICBpZiAodGhpcy5pc01DUFJlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRzUGFyYW0gPSBwYXJhbXM/LmZpZWxkcztcblxuICAgIC8vIE5vIGZpZWxkcyBwYXJhbSAtIGFwcGx5IG5hbWUgdHJhbnNmb3JtYXRpb24gb25seVxuICAgIGlmIChmaWVsZHNQYXJhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1XaXRoQXJyYXlBd2FyZW5lc3MocmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGZpZWxkcyBmcm9tIHByZXNldCBvciBhcnJheVxuICAgIGxldCBmaWVsZHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGxldCBwcmVzZXQ6ICdtaW5pbWFsJyB8ICdzdGFuZGFyZCcgfCAnZnVsbCcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkc1BhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGlzVmFsaWRQcmVzZXQoZmllbGRzUGFyYW0pKSB7XG4gICAgICAgIGlmIChmaWVsZHNQYXJhbSA9PT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgLy8gJ2Z1bGwnIHByZXNldCA9IGFsbCBmaWVsZHMsIGp1c3QgdHJhbnNmb3JtIG5hbWVzXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJlc2V0ID0gZmllbGRzUGFyYW07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnZhbGlkIHByZXNldCAtIHRyZWF0IGFzIHNpbmdsZSBmaWVsZFxuICAgICAgICBmaWVsZHMgPSBbZmllbGRzUGFyYW1dO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWVsZHNQYXJhbSkpIHtcbiAgICAgIC8vIEZpbHRlciB0byBzdHJpbmdzIG9ubHksIHdhcm4gYWJvdXQgbm9uLXN0cmluZyBlbGVtZW50c1xuICAgICAgY29uc3Qgbm9uU3RyaW5nQ291bnQgPSBmaWVsZHNQYXJhbS5maWx0ZXIoZiA9PiB0eXBlb2YgZiAhPT0gJ3N0cmluZycpLmxlbmd0aDtcbiAgICAgIGlmIChub25TdHJpbmdDb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZpZWxkIHNlbGVjdGlvbjogJHtub25TdHJpbmdDb3VudH0gbm9uLXN0cmluZyBlbGVtZW50KHMpIGluIGZpZWxkcyBhcnJheSBpZ25vcmVkYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJpbmdGaWVsZHMgPSBmaWVsZHNQYXJhbS5maWx0ZXIoKGYpOiBmIGlzIHN0cmluZyA9PiB0eXBlb2YgZiA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKHN0cmluZ0ZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZmllbGRzID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9ybWFsaXplIGZpZWxkIG5hbWVzIGZvciBzZWN1cml0eSBhbmQgY2hlY2sgZm9yIFVuaWNvZGUgaXNzdWVzXG4gICAgICAgIGNvbnN0IHsgbm9ybWFsaXplZCwgd2FybmluZ3MgfSA9IG5vcm1hbGl6ZUZpZWxkTmFtZXMoc3RyaW5nRmllbGRzKTtcbiAgICAgICAgaWYgKHdhcm5pbmdzKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZpZWxkIHNlbGVjdGlvbiBVbmljb2RlIG5vcm1hbGl6YXRpb246ICR7d2FybmluZ3Muam9pbignOyAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHMgPSBub3JtYWxpemVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIHZhbGlkIGZpZWxkcyAtIGp1c3QgdHJhbnNmb3JtIG5hbWVzXG4gICAgaWYgKCFmaWVsZHMgJiYgIXByZXNldCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZmllbGQgZmlsdGVyaW5nIHdpdGggYXJyYXktYXdhcmVuZXNzXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCwgZmllbGRzLCBwcmVzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSByZXNwb25zZSB3aXRoIGF3YXJlbmVzcyBvZiBuZXN0ZWQgYXJyYXlzLlxuICAgKiBBcHBsaWVzIG5hbWUgdHJhbnNmb3JtYXRpb24gdG8gaXRlbXMgd2l0aGluIGByZXN1bHRzYCBvciBgaXRlbXNgIGFycmF5cy5cbiAgICovXG4gIHByaXZhdGUgdHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdDogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgY29uc3Qgb2JqID0gcmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAvLyBDaGVjayBmb3IgY29tbW9uIGFycmF5IGNvbnRhaW5lciBwYXR0ZXJuc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqLnJlc3VsdHMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsncmVzdWx0cyddKSxcbiAgICAgICAgICByZXN1bHRzOiBmaWx0ZXJGaWVsZHMob2JqLnJlc3VsdHMsIHsgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5pdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydpdGVtcyddKSxcbiAgICAgICAgICBpdGVtczogZmlsdGVyRmllbGRzKG9iai5pdGVtcywgeyB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmF1bHQ6IHRyYW5zZm9ybSBlbnRpcmUgcmVzcG9uc2VcbiAgICBjb25zdCB7IGRhdGEgfSA9IGZpbHRlckZpZWxkcyhyZXN1bHQsIHsgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIHJlc3BvbnNlIHdpdGggYXdhcmVuZXNzIG9mIG5lc3RlZCBhcnJheXMuXG4gICAqIEFwcGxpZXMgZmllbGQgZmlsdGVyaW5nIHRvIGl0ZW1zIHdpdGhpbiBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIGZpbHRlcldpdGhBcnJheUF3YXJlbmVzcyhcbiAgICByZXN1bHQ6IHVua25vd24sXG4gICAgZmllbGRzPzogc3RyaW5nW10sXG4gICAgcHJlc2V0PzogJ21pbmltYWwnIHwgJ3N0YW5kYXJkJyB8ICdmdWxsJ1xuICApOiB1bmtub3duIHtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbW1vbiBhcnJheSBjb250YWluZXIgcGF0dGVybnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5yZXN1bHRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ3Jlc3VsdHMnXSksXG4gICAgICAgICAgcmVzdWx0czogZmlsdGVyRmllbGRzKG9iai5yZXN1bHRzLCB7IGZpZWxkcywgcHJlc2V0LCB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqLml0ZW1zKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ2l0ZW1zJ10pLFxuICAgICAgICAgIGl0ZW1zOiBmaWx0ZXJGaWVsZHMob2JqLml0ZW1zLCB7IGZpZWxkcywgcHJlc2V0LCB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmF1bHQ6IGZpbHRlciBlbnRpcmUgcmVzcG9uc2VcbiAgICBjb25zdCB7IGRhdGEgfSA9IGZpbHRlckZpZWxkcyhyZXN1bHQsIHsgZmllbGRzLCBwcmVzZXQsIHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSB0b3AtbGV2ZWwgZmllbGRzIG9mIGFuIG9iamVjdCwgZXhjbHVkaW5nIHNwZWNpZmllZCBrZXlzLlxuICAgKiBVc2VkIHRvIHByZXNlcnZlIGNvbnRhaW5lciBtZXRhZGF0YSAodG90YWwsIHF1ZXJ5LCBldGMuKSB3aGlsZSBmaWx0ZXJpbmcgbmVzdGVkIGFycmF5cy5cbiAgICovXG4gIHByaXZhdGUgdHJhbnNmb3JtVG9wTGV2ZWwoXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBleGNsdWRlS2V5czogc3RyaW5nW11cbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICBpZiAoIWV4Y2x1ZGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiByZXN1bHQgaXMgYW4gTUNQIHJlc3BvbnNlIGZvcm1hdCAod2l0aCBjb250ZW50IGFycmF5KS5cbiAgICogVGhlc2UgcmVzcG9uc2VzIGNvbnRhaW4gZm9ybWF0dGVkIHRleHQgYW5kIHNob3VsZG4ndCBiZSB0cmFuc2Zvcm1lZC5cbiAgICovXG4gIHByaXZhdGUgaXNNQ1BSZXNwb25zZShyZXN1bHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcmVzdWx0ICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ2NvbnRlbnQnIGluIHJlc3VsdCAmJlxuICAgICAgQXJyYXkuaXNBcnJheSgocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5jb250ZW50KVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgQ0xJIGFwcHJvdmFsIHBvbGljeSBmcm9tIGFsbCBhY3RpdmUgZWxlbWVudHMuXG4gKlxuICogVW5pb25zIGByZXF1aXJlQXBwcm92YWxgIGFycmF5cyBhY3Jvc3MgYWxsIGVsZW1lbnRzLiBUYWtlcyB0aGUgbW9zdFxuICogY29uc2VydmF0aXZlIChzbWFsbGVzdCkgVFRMLiBGYWxscyBiYWNrIHRvIGVudiB2YXIgYERPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZYC5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudHMgLSBDdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBhcHByb3ZhbCBwb2xpY3lcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10pOiBDbGlBcHByb3ZhbFBvbGljeSB7XG4gIGNvbnN0IHJlcXVpcmVBcHByb3ZhbCA9IG5ldyBTZXQ8J21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnPigpO1xuICBsZXQgZGVmYXVsdFNjb3BlOiBDbGlBcHByb3ZhbFNjb3BlIHwgdW5kZWZpbmVkO1xuICBsZXQgdHRsU2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IHBvbGljeSA9IGVsZW1lbnQubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hcHByb3ZhbFBvbGljeTtcbiAgICBpZiAoIXBvbGljeSkgY29udGludWU7XG5cbiAgICBpZiAocG9saWN5LnJlcXVpcmVBcHByb3ZhbCkge1xuICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBwb2xpY3kucmVxdWlyZUFwcHJvdmFsKSB7XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbC5hZGQobGV2ZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9saWN5LmRlZmF1bHRTY29wZSAmJiAhZGVmYXVsdFNjb3BlKSB7XG4gICAgICBkZWZhdWx0U2NvcGUgPSBwb2xpY3kuZGVmYXVsdFNjb3BlO1xuICAgIH1cbiAgICBpZiAocG9saWN5LnR0bFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHRsU2Vjb25kcyA9IHR0bFNlY29uZHMgPT09IHVuZGVmaW5lZCA/IHBvbGljeS50dGxTZWNvbmRzIDogTWF0aC5taW4odHRsU2Vjb25kcywgcG9saWN5LnR0bFNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGVudmlyb25tZW50IHZhcmlhYmxlXG4gIGlmIChyZXF1aXJlQXBwcm92YWwuc2l6ZSA9PT0gMCkge1xuICAgIGNvbnN0IGVudlBvbGljeSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZO1xuICAgIGlmIChlbnZQb2xpY3kpIHtcbiAgICAgIGNvbnN0IGxldmVscyA9IGVudlBvbGljeS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIocyA9PiBzID09PSAnbW9kZXJhdGUnIHx8IHMgPT09ICdkYW5nZXJvdXMnKTtcbiAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbC5hZGQobGV2ZWwgYXMgJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlcXVpcmVBcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsLnNpemUgPiAwID8gQXJyYXkuZnJvbShyZXF1aXJlQXBwcm92YWwpIDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRTY29wZSxcbiAgICB0dGxTZWNvbmRzLFxuICB9O1xufVxuIl19
3420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNCLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkksT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFNTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBSXBCLGNBQWMsRUFDZCwwQkFBMEIsR0FDM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxP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QVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEcsQ0FBQztJQUNILENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUM7UUFDNUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUM7WUFDMUcsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFpQyxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxlQUFlLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNuRixZQUFZO1FBQ1osVUFBVTtLQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1BBUUxIYW5kbGVyIC0gVW5pZmllZCBoYW5kbGVyIGZvciBhbGwgTUNQLUFRTCBvcGVyYXRpb25zXG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBUaGluIHJlc29sdmVyIHBhdHRlcm46IHZhbGlkYXRlcyDihpIgcm91dGVzIOKGkiBkaXNwYXRjaGVzXG4gKiAtIFNPTElEIHByaW5jaXBsZXM6IGRlcGVuZHMgb24gYWJzdHJhY3Rpb25zIChIYW5kbGVyUmVnaXN0cnkgaW50ZXJmYWNlKVxuICogLSBEZWZlbnNlIGluIGRlcHRoOiBHYXRla2VlcGVyIHZhbGlkYXRlcyBlbmRwb2ludC9vcGVyYXRpb24gbWF0Y2hpbmcgYW5kIGVuZm9yY2VzIHBvbGljaWVzXG4gKiAtIERpc3BhdGNoIHBhdHRlcm46IHJvdXRlcyBoYW5kbGVyIHJlZmVyZW5jZXMgdG8gYWN0dWFsIG1ldGhvZCBjYWxsc1xuICpcbiAqIE9QRVJBVElPTiBGTE9XOlxuICogMS4gVmFsaWRhdGUgaW5wdXQgc3RydWN0dXJlICh0eXBlIGd1YXJkcylcbiAqIDIuIFZhbGlkYXRlIHBlcm1pc3Npb25zIChHYXRla2VlcGVyKVxuICogMy4gUm91dGUgb3BlcmF0aW9uIChPcGVyYXRpb25Sb3V0ZXIpXG4gKiA0LiBEaXNwYXRjaCB0byBoYW5kbGVyIChyZXNvbHZlSGFuZGxlclJlZmVyZW5jZSlcbiAqIDUuIFJldHVybiBzdGFuZGFyZGl6ZWQgcmVzdWx0IChPcGVyYXRpb25SZXN1bHQpXG4gKlxuICogRVJST1IgSEFORExJTkc6XG4gKiBBbGwgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIHJldHVybmVkIGFzIE9wZXJhdGlvbkZhaWx1cmUgd2l0aDpcbiAqIC0gc3VjY2VzczogZmFsc2VcbiAqIC0gZXJyb3I6IGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2VcbiAqIC0gZGF0YTogbmV2ZXIgKGRpc2NyaW1pbmF0ZWQgdW5pb24gZW5mb3JjZXMgdGhpcylcbiAqL1xuXG5pbXBvcnQgeyBDUlVERW5kcG9pbnQgfSBmcm9tICcuL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBHYXRla2VlcGVyIH0gZnJvbSAnLi9HYXRla2VlcGVyLmpzJztcbmltcG9ydCB7IHR5cGUgQWN0aXZlRWxlbWVudCwgdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5LCBjYW5PcGVyYXRpb25CZUVsZXZhdGVkIH0gZnJvbSAnLi9wb2xpY2llcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbiwgZmluZENvbmZpcm1EZW55aW5nRWxlbWVudCwgZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzIH0gZnJvbSAnLi9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkxldmVsLCBHYXRla2VlcGVyRXJyb3JDb2RlIH0gZnJvbSAnLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0Um91dGUgfSBmcm9tICcuL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBBTExfT1BFUkFUSU9OX1NDSEVNQVMgfSBmcm9tICcuL09wZXJhdGlvblNjaGVtYS5qcyc7XG5pbXBvcnQgeyBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIgfSBmcm9tICcuL0ludHJvc3BlY3Rpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBTY2hlbWFEaXNwYXRjaGVyIH0gZnJvbSAnLi9TY2hlbWFEaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IGluaXRpYWxpemVOb3JtYWxpemVycyB9IGZyb20gJy4vbm9ybWFsaXplcnMvaW5kZXguanMnO1xuaW1wb3J0IHsgZmlsdGVyRmllbGRzLCBpc1ZhbGlkUHJlc2V0LCBub3JtYWxpemVGaWVsZE5hbWVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvRmllbGRGaWx0ZXIuanMnO1xuaW1wb3J0IHtcbiAgT3BlcmF0aW9uSW5wdXQsXG4gIE9wZXJhdGlvblJlc3VsdCxcbiAgT3BlcmF0aW9uU3VjY2VzcyxcbiAgT3BlcmF0aW9uRmFpbHVyZSxcbiAgUmVzcG9uc2VNZXRhLFxuICBwYXJzZU9wZXJhdGlvbklucHV0LFxuICBkZXNjcmliZUludmFsaWRJbnB1dCxcbiAgQmF0Y2hSZXF1ZXN0LFxuICBCYXRjaFJlc3VsdCxcbiAgQmF0Y2hPcGVyYXRpb25SZXN1bHQsXG4gIGlzQmF0Y2hSZXF1ZXN0LFxuICBub3JtYWxpemVNQ1BBUUxFbGVtZW50VHlwZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaXNTZWFyY2hNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWxzL3NlYXJjaFV0aWxzLmpzJztcbmltcG9ydCB7IFBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlcnkvUGFnaW5hdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplRWxlbWVudFR5cGUsIEFMTF9FTEVNRU5UX1RZUEVTLCBmb3JtYXRFbGVtZW50VHlwZXNMaXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5VG9vbCwgZXZhbHVhdGVDbGlUb29sUG9saWN5LCBhc3Nlc3NSaXNrIH0gZnJvbSAnLi9wb2xpY2llcy9Ub29sQ2xhc3NpZmljYXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBDbGlBcHByb3ZhbFNjb3BlLCBDbGlBcHByb3ZhbFBvbGljeSB9IGZyb20gJy4vR2F0ZWtlZXBlclR5cGVzLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uL3V0aWxzL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHsgU1RPUkFHRV9MQVlFUl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgRGFuZ2VyWm9uZUVuZm9yY2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvRGFuZ2VyWm9uZUVuZm9yY2VyLmpzJztcbmltcG9ydCB0eXBlIHsgVmVyaWZpY2F0aW9uU3RvcmUgfSBmcm9tICdAZG9sbGhvdXNlbWNwL3NhZmV0eSc7XG5pbXBvcnQgdHlwZSB7IElWZXJpZmljYXRpb25Ob3RpZmllciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1ZlcmlmaWNhdGlvbk5vdGlmaWVyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGlzcGxheUNvZGUgfSBmcm9tICdAZG9sbGhvdXNlbWNwL3NhZmV0eSc7XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50Q1JVREhhbmRsZXIgfSBmcm9tICcuLi9FbGVtZW50Q1JVREhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFnZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE1ldGFkYXRhVjIsIEFnZW50UmVzaWxpZW5jZVBvbGljeSwgQWdlbnROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvdHlwZXMuanMnO1xuaW1wb3J0IHsgZXZhbHVhdGVSZXNpbGllbmNlUG9saWN5LCBjaXJjdWl0QnJlYWtlciwgdHlwZSBSZXNpbGllbmNlQ29udGV4dCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9yZXNpbGllbmNlRXZhbHVhdG9yLmpzJztcbmltcG9ydCB7IHJlc2lsaWVuY2VNZXRyaWNzIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL3Jlc2lsaWVuY2VNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZW5kZXJlciB9IGZyb20gJy4uLy4uL3V0aWxzL1RlbXBsYXRlUmVuZGVyZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50UXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlcnkvRWxlbWVudFF1ZXJ5U2VydmljZS5qcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVFbGVtZW50cywgdmFsaWRhdGVBZ2dyZWdhdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9BZ2dyZWdhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBJRWxlbWVudCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcnRmb2xpb0hhbmRsZXIgfSBmcm9tICcuLi9Qb3J0Zm9saW9IYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgR2l0SHViQXV0aEhhbmRsZXIgfSBmcm9tICcuLi9HaXRIdWJBdXRoSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ0hhbmRsZXIgfSBmcm9tICcuLi9Db25maWdIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRJbmRleEhhbmRsZXIgfSBmcm9tICcuLi9FbmhhbmNlZEluZGV4SGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcnNvbmFIYW5kbGVyIH0gZnJvbSAnLi4vUGVyc29uYUhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTeW5jSGFuZGxlciB9IGZyb20gJy4uL1N5bmNIYW5kbGVyVjIuanMnO1xuaW1wb3J0IHR5cGUgeyBCdWlsZEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvQnVpbGRJbmZvU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2dRdWVyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0cmljUXVlcnlPcHRpb25zLCBNZXRyaWNUeXBlIH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcmZvcm1hbmNlTW9uaXRvciB9IGZyb20gJy4uLy4uL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9PcGVyYXRpb25NZXRyaWNzVHJhY2tlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlciB9IGZyb20gJy4uLy4uL21ldHJpY3MvR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgcHJlcGFyZUhhbmRvZmZTdGF0ZSwgcGFyc2VIYW5kb2ZmQmxvY2ssIGdlbmVyYXRlSGFuZG9mZkJsb2NrIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL2hhbmRvZmYuanMnO1xuaW1wb3J0IHsgZ2V0QXV0b25vbXlNZXRyaWNzIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL2F1dG9ub215RXZhbHVhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgQXV0b25vbXlNZXRyaWNzU25hcHNob3QgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJhbWV0ZXIgVmFsaWRhdGlvbiBVdGlsaXRpZXMgKElzc3VlICMzMjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIGV4dHJhY3QgYSByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGZyb20gcGFyYW1zLlxuICogVGhyb3dzIGEgdXNlci1mcmllbmRseSBlcnJvciBpZiB0aGUgcGFyYW1ldGVyIGlzIG1pc3Npbmcgb3Igbm90IGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBvYmplY3QgdG8gZXh0cmFjdCBmcm9tXG4gKiBAcGFyYW0gcGFyYW1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIHBhcmFtZXRlclxuICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIHRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIHN0cmluZyB2YWx1ZVxuICogQHRocm93cyBFcnJvciB3aXRoIHVzZXItZnJpZW5kbHkgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhcmFtTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtc1twYXJhbU5hbWVdO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJyR7cGFyYW1OYW1lfScuIEV4cGVjdGVkOiBzdHJpbmcgKCR7ZGVzY3JpcHRpb259KWBcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgZmxhdCBwYWdpbmF0aW9uIHBhcmFtcyBpbnRvIGEgeyBwYWdlLCBwYWdlU2l6ZSB9IG9iamVjdC5cbiAqXG4gKiBJc3N1ZSAjNTAwOiBxdWVyeV9lbGVtZW50cyBhbmQgc2VhcmNoX2VsZW1lbnRzIHNpbGVudGx5IGlnbm9yZWQgZmxhdFxuICogcGFnZVNpemUvcGFnZS9saW1pdC9vZmZzZXQgcGFyYW1zLiBUaGlzIGhlbHBlciBkZXRlY3RzIHRoZXNlIGF0IHRoZVxuICogdG9wIGxldmVsIGFuZCBub3JtYWxpemVzIHRoZW0sIG1hdGNoaW5nIHRoZSBwYXR0ZXJuIHVzZWQgYnkgbGlzdEVsZW1lbnRzLlxuICpcbiAqIFByaW9yaXR5OiBuZXN0ZWQgcGFnaW5hdGlvbiA+IGxpbWl0L29mZnNldCA+IGZsYXQgcGFnZS9wYWdlU2l6ZSA+IGRlZmF1bHRzXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2luYXRpb25QYXJhbXMoXG4gIHBhcmFtczoge1xuICAgIHBhZ2luYXRpb24/OiB7IHBhZ2U/OiBudW1iZXI7IHBhZ2VTaXplPzogbnVtYmVyIH07XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfVxuKTogeyBwYWdlOiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXIgfSB7XG4gIC8vIElmIG5lc3RlZCBwYWdpbmF0aW9uIGlzIHByZXNlbnQsIHVzZSBpdCBkaXJlY3RseVxuICBpZiAocGFyYW1zLnBhZ2luYXRpb24gJiYgdHlwZW9mIHBhcmFtcy5wYWdpbmF0aW9uID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHAgPSBwYXJhbXMucGFnaW5hdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZTogKHR5cGVvZiBwLnBhZ2UgPT09ICdudW1iZXInICYmIHAucGFnZSA+IDApID8gcC5wYWdlIDogMSxcbiAgICAgIHBhZ2VTaXplOiAodHlwZW9mIHAucGFnZVNpemUgPT09ICdudW1iZXInICYmIHAucGFnZVNpemUgPiAwKSA/IHAucGFnZVNpemUgOiAyMCxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBhZ2UgPSAxO1xuICBsZXQgcGFnZVNpemUgPSAyMDtcblxuICAvLyBTdXBwb3J0IGxpbWl0L29mZnNldCBzdHlsZSAoY29udmVydCB0byBwYWdlL3BhZ2VTaXplKVxuICBpZiAodHlwZW9mIHBhcmFtcy5saW1pdCA9PT0gJ251bWJlcicgJiYgcGFyYW1zLmxpbWl0ID4gMCkge1xuICAgIHBhZ2VTaXplID0gcGFyYW1zLmxpbWl0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLm9mZnNldCA9PT0gJ251bWJlcicgJiYgcGFyYW1zLm9mZnNldCA+PSAwKSB7XG4gICAgICBwYWdlID0gTWF0aC5mbG9vcihwYXJhbXMub2Zmc2V0IC8gcGFyYW1zLmxpbWl0KSArIDE7XG4gICAgfVxuICB9XG5cbiAgLy8gU3VwcG9ydCBmbGF0IHBhZ2UvcGFnZVNpemUgKG92ZXJyaWRlcyBsaW1pdC9vZmZzZXQgaWYgYm90aCBwcmVzZW50KVxuICBpZiAodHlwZW9mIHBhcmFtcy5wYWdlID09PSAnbnVtYmVyJyAmJiBwYXJhbXMucGFnZSA+IDApIHtcbiAgICBwYWdlID0gcGFyYW1zLnBhZ2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMucGFnZVNpemUgPT09ICdudW1iZXInICYmIHBhcmFtcy5wYWdlU2l6ZSA+IDApIHtcbiAgICBwYWdlU2l6ZSA9IHBhcmFtcy5wYWdlU2l6ZTtcbiAgfVxuXG4gIHJldHVybiB7IHBhZ2UsIHBhZ2VTaXplIH07XG59XG5cbi8qKlxuICogVmFsaWQgbG9nIGNhdGVnb3JpZXMgYWNjZXB0ZWQgYnkgTG9nUXVlcnlPcHRpb25zLlxuICogTWF0Y2hlcyB0aGUgTG9nQ2F0ZWdvcnkgdW5pb24gdHlwZSBwbHVzIHRoZSAnYWxsJyB3aWxkY2FyZC5cbiAqL1xuY29uc3QgVkFMSURfTE9HX0NBVEVHT1JJRVMgPSBuZXcgU2V0KFsnYXBwbGljYXRpb24nLCAnc2VjdXJpdHknLCAncGVyZm9ybWFuY2UnLCAndGVsZW1ldHJ5JywgJ2FsbCddKTtcblxuLyoqXG4gKiBWYWxpZCBsb2cgbGV2ZWxzIGFjY2VwdGVkIGJ5IExvZ1F1ZXJ5T3B0aW9ucy5cbiAqIE1hdGNoZXMgdGhlIExvZ0xldmVsIHVuaW9uIHR5cGUuXG4gKi9cbmNvbnN0IFZBTElEX0xPR19MRVZFTFMgPSBuZXcgU2V0KFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10pO1xuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSByYXcgcGFyYW1zIGludG8gYSBzYWZlIExvZ1F1ZXJ5T3B0aW9ucyBvYmplY3QuXG4gKiBTdHJpcHMgdW5rbm93biBrZXlzLCB2YWxpZGF0ZXMgdHlwZXMgb2Yga25vd24gZmllbGRzLCBhbmQgcmV0dXJuc1xuICogb25seSB3ZWxsLXR5cGVkIHZhbHVlcy4gSW52YWxpZCBmaWVsZHMgYXJlIHNpbGVudGx5IGRyb3BwZWQgc2luY2VcbiAqIGFsbCBMb2dRdWVyeU9wdGlvbnMgZmllbGRzIGFyZSBvcHRpb25hbC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUmF3IHBhcmFtcyBmcm9tIHRoZSBNQ1AgcmVxdWVzdFxuICogQHJldHVybnMgVmFsaWRhdGVkIExvZ1F1ZXJ5T3B0aW9ucyB3aXRoIG9ubHkgdmFsaWQgZmllbGRzXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTG9nUXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IExvZ1F1ZXJ5T3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IExvZ1F1ZXJ5T3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcGFyYW1zLmNhdGVnb3J5ID09PSAnc3RyaW5nJyAmJiBWQUxJRF9MT0dfQ0FURUdPUklFUy5oYXMocGFyYW1zLmNhdGVnb3J5KSkge1xuICAgIG9wdGlvbnMuY2F0ZWdvcnkgPSBwYXJhbXMuY2F0ZWdvcnkgYXMgTG9nUXVlcnlPcHRpb25zWydjYXRlZ29yeSddO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmxldmVsID09PSAnc3RyaW5nJyAmJiBWQUxJRF9MT0dfTEVWRUxTLmhhcyhwYXJhbXMubGV2ZWwpKSB7XG4gICAgb3B0aW9ucy5sZXZlbCA9IHBhcmFtcy5sZXZlbCBhcyBMb2dRdWVyeU9wdGlvbnNbJ2xldmVsJ107XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMubWVzc2FnZSA9IHBhcmFtcy5tZXNzYWdlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuc2luY2UgPSBwYXJhbXMuc2luY2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMudW50aWwgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy51bnRpbCA9IHBhcmFtcy51bnRpbDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5saW1pdCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBhcmFtcy5saW1pdCkpIHtcbiAgICBvcHRpb25zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm9mZnNldCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBhcmFtcy5vZmZzZXQpKSB7XG4gICAgb3B0aW9ucy5vZmZzZXQgPSBwYXJhbXMub2Zmc2V0O1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmNvcnJlbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5jb3JyZWxhdGlvbklkID0gcGFyYW1zLmNvcnJlbGF0aW9uSWQ7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuY29uc3QgVkFMSURfTUVUUklDX1RZUEVTID0gbmV3IFNldDxNZXRyaWNUeXBlPihbJ2NvdW50ZXInLCAnZ2F1Z2UnLCAnaGlzdG9ncmFtJ10pO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1ldHJpY1F1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBNZXRyaWNRdWVyeU9wdGlvbnMge1xuICBjb25zdCBvcHRpb25zOiBNZXRyaWNRdWVyeU9wdGlvbnMgPSB7fTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMubmFtZXMpKSB7XG4gICAgb3B0aW9ucy5uYW1lcyA9IHBhcmFtcy5uYW1lcy5maWx0ZXIoKG4pOiBuIGlzIHN0cmluZyA9PiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMudHlwZSA9PT0gJ3N0cmluZycgJiYgVkFMSURfTUVUUklDX1RZUEVTLmhhcyhwYXJhbXMudHlwZSBhcyBNZXRyaWNUeXBlKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IHBhcmFtcy50eXBlIGFzIE1ldHJpY1R5cGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc2luY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zaW5jZSA9IHBhcmFtcy5zaW5jZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy51bnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnVudGlsID0gcGFyYW1zLnVudGlsO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmxhdGVzdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0aW9ucy5sYXRlc3QgPSBwYXJhbXMubGF0ZXN0O1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLmxpbWl0KSkge1xuICAgIG9wdGlvbnMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLm9mZnNldCkpIHtcbiAgICBvcHRpb25zLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQ7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVmVyaWZpY2F0aW9uIFNlY3VyaXR5IFV0aWxpdGllcyAoSXNzdWUgIzE0MiDigJQgUFIgIzQ3OCByZXZpZXcgZm9sbG93LXVwcylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIFVVSUQgdjQgZm9ybWF0OiA4LTQtNC00LTEyIGhleCBkaWdpdHMgd2l0aCB2ZXJzaW9uIDQgbWFya2VyIGFuZCB2YXJpYW50IGJpdHMgKi9cbmNvbnN0IFVVSURfVjRfUkVHRVggPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LTRbMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2k7XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIGNoYWxsZW5nZSBJRCBpcyBhIHZhbGlkIFVVSUQgdjQgZm9ybWF0LlxuICogQ2hhbGxlbmdlIElEcyBhcmUgZ2VuZXJhdGVkIGJ5IGNyeXB0by5yYW5kb21VVUlEKCkgYW5kIG11c3QgY29uZm9ybS5cbiAqIFJlamVjdHMgb2J2aW91c2x5IGludmFsaWQgSURzIGJlZm9yZSBoaXR0aW5nIHRoZSBzdG9yZSB0byBwcmV2ZW50IGVudW1lcmF0aW9uLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNoYWxsZW5nZUlkRm9ybWF0KGNoYWxsZW5nZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFVVUlEX1Y0X1JFR0VYLnRlc3QoY2hhbGxlbmdlSWQpKSB7XG4gICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgYEludmFsaWQgY2hhbGxlbmdlX2lkIGZvcm1hdC4gRXhwZWN0ZWQgVVVJRCB2NCAoZS5nLiwgXCI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDBcIikuYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmVkIHZlcmlmaWNhdGlvbiBlcnJvciB3aXRoIEdhdGVrZWVwZXIgZXJyb3IgY29kZS5cbiAqIEVuYWJsZXMgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZyBhbGlnbmVkIHdpdGggZXhpc3RpbmcgR2F0ZWtlZXBlciBwYXR0ZXJucy5cbiAqL1xuY2xhc3MgVmVyaWZpY2F0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBlcnJvckNvZGU6IEdhdGVrZWVwZXJFcnJvckNvZGUsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVmVyaWZpY2F0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogR2xvYmFsIHJhdGUgbGltaXRlciBmb3IgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLlxuICogVHJhY2tzIGZhaWxlZCBhdHRlbXB0cyB3aXRoaW4gYSBzbGlkaW5nIHdpbmRvdyB0byBwcmV2ZW50IGJydXRlLWZvcmNlIGF0dGFja3MuXG4gKlxuICogRGVzaWduOiBTaW5jZSB2ZXJpZmljYXRpb24gY29kZXMgYXJlIG9uZS10aW1lLXVzZSAoZGVsZXRlZCBvbiBhbnkgYXR0ZW1wdCksXG4gKiB0aGUgcmVhbCBhdHRhY2sgdmVjdG9yIGlzIHJlcGVhdGVkIGNoYWxsZW5nZSBjcmVhdGlvbiArIGltbWVkaWF0ZSBhdHRlbXB0LlxuICogVGhpcyBsaW1pdGVyIGNhcHMgdG90YWwgZmFpbHVyZXMgYWNyb3NzIGFsbCBjaGFsbGVuZ2VzIHdpdGhpbiBhIHRpbWUgd2luZG93LlxuICovXG5jbGFzcyBWZXJpZmljYXRpb25SYXRlTGltaXRlciB7XG4gIHByaXZhdGUgZmFpbHVyZXM6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhGYWlsdXJlczogbnVtYmVyID0gMTAsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dNczogbnVtYmVyID0gNjBfMDAwLFxuICApIHt9XG5cbiAgLyoqIFJlY29yZCBhIGZhaWxlZCB2ZXJpZmljYXRpb24gYXR0ZW1wdC4gUmV0dXJucyB0cnVlIGlmIHJhdGUgbGltaXQgaXMgZXhjZWVkZWQuICovXG4gIHJlY29yZEZhaWx1cmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmZhaWx1cmVzLnB1c2gobm93KTtcbiAgICB0aGlzLnBydW5lKG5vdyk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMubGVuZ3RoID4gdGhpcy5tYXhGYWlsdXJlcztcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiByYXRlIGxpbWl0IGlzIGN1cnJlbnRseSBleGNlZWRlZCB3aXRob3V0IHJlY29yZGluZy4gKi9cbiAgaXNMaW1pdGVkKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucHJ1bmUoRGF0ZS5ub3coKSk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMubGVuZ3RoID4gdGhpcy5tYXhGYWlsdXJlcztcbiAgfVxuXG4gIC8qKiBSZW1vdmUgZW50cmllcyBvdXRzaWRlIHRoZSBzbGlkaW5nIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBwcnVuZShub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1dG9mZiA9IG5vdyAtIHRoaXMud2luZG93TXM7XG4gICAgd2hpbGUgKHRoaXMuZmFpbHVyZXMubGVuZ3RoID4gMCAmJiB0aGlzLmZhaWx1cmVzWzBdIDwgY3V0b2ZmKSB7XG4gICAgICB0aGlzLmZhaWx1cmVzLnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEN1cnJlbnQgZmFpbHVyZSBjb3VudCBpbiB3aW5kb3cgKGZvciBtZXRyaWNzKS4gKi9cbiAgZ2V0IGZhaWx1cmVzSW5XaW5kb3coKTogbnVtYmVyIHtcbiAgICB0aGlzLnBydW5lKERhdGUubm93KCkpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXNldCAoZm9yIHRlc3RpbmcpLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmZhaWx1cmVzID0gW107XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmljYXRpb24gbWV0cmljcyB0cmFja2VyIGZvbGxvd2luZyBEYW5nZXJab25lRW5mb3JjZXIuZ2V0TWV0cmljcygpIHBhdHRlcm4uXG4gKiBUcmFja3Mgc3VjY2Vzcy9mYWlsdXJlL2V4cGlyeSByYXRlcyBhbmQgdGltZS10by12ZXJpZnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uTWV0cmljcyB7XG4gIC8qKiBUb3RhbCB2ZXJpZnlfY2hhbGxlbmdlIGNhbGxzIHNpbmNlIHN0YXJ0dXAgKi9cbiAgdG90YWxBdHRlbXB0czogbnVtYmVyO1xuICAvKiogU3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb25zICovXG4gIHRvdGFsU3VjY2Vzc2VzOiBudW1iZXI7XG4gIC8qKiBGYWlsZWQgdmVyaWZpY2F0aW9ucyAod3JvbmcgY29kZSkgKi9cbiAgdG90YWxGYWlsdXJlczogbnVtYmVyO1xuICAvKiogRXhwaXJlZCBjaGFsbGVuZ2UgYXR0ZW1wdHMgKi9cbiAgdG90YWxFeHBpcmVkOiBudW1iZXI7XG4gIC8qKiBJbnZhbGlkIGZvcm1hdCBhdHRlbXB0cyAocmVqZWN0ZWQgYmVmb3JlIHN0b3JlIGxvb2t1cCkgKi9cbiAgdG90YWxJbnZhbGlkRm9ybWF0OiBudW1iZXI7XG4gIC8qKiBSYXRlLWxpbWl0ZWQgYXR0ZW1wdHMgKi9cbiAgdG90YWxSYXRlTGltaXRlZDogbnVtYmVyO1xuICAvKiogQXZlcmFnZSB0aW1lIGZyb20gY2hhbGxlbmdlIGNyZWF0aW9uIHRvIHN1Y2Nlc3NmdWwgdmVyaWZ5IChtcykgKi9cbiAgYXZlcmFnZVRpbWVUb1ZlcmlmeU1zOiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IGZhaWx1cmVzIGluIHJhdGUtbGltaXQgd2luZG93ICovXG4gIGZhaWx1cmVzSW5DdXJyZW50V2luZG93OiBudW1iZXI7XG59XG5cbmNsYXNzIFZlcmlmaWNhdGlvbk1ldHJpY3NUcmFja2VyIHtcbiAgcHJpdmF0ZSBfdG90YWxBdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgX3RvdGFsU3VjY2Vzc2VzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxGYWlsdXJlcyA9IDA7XG4gIHByaXZhdGUgX3RvdGFsRXhwaXJlZCA9IDA7XG4gIHByaXZhdGUgX3RvdGFsSW52YWxpZEZvcm1hdCA9IDA7XG4gIHByaXZhdGUgX3RvdGFsUmF0ZUxpbWl0ZWQgPSAwO1xuICBwcml2YXRlIHZlcmlmeUR1cmF0aW9uczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0RVUkFUSU9OUyA9IDEwMDA7XG5cbiAgcmVjb3JkQXR0ZW1wdCgpOiB2b2lkIHsgdGhpcy5fdG90YWxBdHRlbXB0cysrOyB9XG4gIHJlY29yZFN1Y2Nlc3MoZHVyYXRpb25Ncz86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3RvdGFsU3VjY2Vzc2VzKys7XG4gICAgaWYgKGR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiBkdXJhdGlvbk1zID49IDApIHtcbiAgICAgIHRoaXMudmVyaWZ5RHVyYXRpb25zLnB1c2goZHVyYXRpb25Ncyk7XG4gICAgICBpZiAodGhpcy52ZXJpZnlEdXJhdGlvbnMubGVuZ3RoID4gVmVyaWZpY2F0aW9uTWV0cmljc1RyYWNrZXIuTUFYX0RVUkFUSU9OUykge1xuICAgICAgICB0aGlzLnZlcmlmeUR1cmF0aW9ucy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZWNvcmRGYWlsdXJlKCk6IHZvaWQgeyB0aGlzLl90b3RhbEZhaWx1cmVzKys7IH1cbiAgcmVjb3JkRXhwaXJlZCgpOiB2b2lkIHsgdGhpcy5fdG90YWxFeHBpcmVkKys7IH1cbiAgcmVjb3JkSW52YWxpZEZvcm1hdCgpOiB2b2lkIHsgdGhpcy5fdG90YWxJbnZhbGlkRm9ybWF0Kys7IH1cbiAgcmVjb3JkUmF0ZUxpbWl0ZWQoKTogdm9pZCB7IHRoaXMuX3RvdGFsUmF0ZUxpbWl0ZWQrKzsgfVxuXG4gIGdldE1ldHJpY3MocmF0ZUxpbWl0ZXI6IFZlcmlmaWNhdGlvblJhdGVMaW1pdGVyKTogVmVyaWZpY2F0aW9uTWV0cmljcyB7XG4gICAgY29uc3QgYXZnRHVyYXRpb24gPSB0aGlzLnZlcmlmeUR1cmF0aW9ucy5sZW5ndGggPiAwXG4gICAgICA/IE1hdGgucm91bmQodGhpcy52ZXJpZnlEdXJhdGlvbnMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyB0aGlzLnZlcmlmeUR1cmF0aW9ucy5sZW5ndGgpXG4gICAgICA6IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsQXR0ZW1wdHM6IHRoaXMuX3RvdGFsQXR0ZW1wdHMsXG4gICAgICB0b3RhbFN1Y2Nlc3NlczogdGhpcy5fdG90YWxTdWNjZXNzZXMsXG4gICAgICB0b3RhbEZhaWx1cmVzOiB0aGlzLl90b3RhbEZhaWx1cmVzLFxuICAgICAgdG90YWxFeHBpcmVkOiB0aGlzLl90b3RhbEV4cGlyZWQsXG4gICAgICB0b3RhbEludmFsaWRGb3JtYXQ6IHRoaXMuX3RvdGFsSW52YWxpZEZvcm1hdCxcbiAgICAgIHRvdGFsUmF0ZUxpbWl0ZWQ6IHRoaXMuX3RvdGFsUmF0ZUxpbWl0ZWQsXG4gICAgICBhdmVyYWdlVGltZVRvVmVyaWZ5TXM6IGF2Z0R1cmF0aW9uLFxuICAgICAgZmFpbHVyZXNJbkN1cnJlbnRXaW5kb3c6IHJhdGVMaW1pdGVyLmZhaWx1cmVzSW5XaW5kb3csXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXNldCAoZm9yIHRlc3RpbmcpLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b3RhbEF0dGVtcHRzID0gMDtcbiAgICB0aGlzLl90b3RhbFN1Y2Nlc3NlcyA9IDA7XG4gICAgdGhpcy5fdG90YWxGYWlsdXJlcyA9IDA7XG4gICAgdGhpcy5fdG90YWxFeHBpcmVkID0gMDtcbiAgICB0aGlzLl90b3RhbEludmFsaWRGb3JtYXQgPSAwO1xuICAgIHRoaXMuX3RvdGFsUmF0ZUxpbWl0ZWQgPSAwO1xuICAgIHRoaXMudmVyaWZ5RHVyYXRpb25zID0gW107XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVyIHJlZ2lzdHJ5IGludGVyZmFjZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBBYnN0cmFjdHMgdGhlIGNvbmNyZXRlIGhhbmRsZXIgdHlwZXMgZm9yIGJldHRlciB0ZXN0YWJpbGl0eSBhbmQgZGVjb3VwbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyUmVnaXN0cnkge1xuICBlbGVtZW50Q1JVRDogRWxlbWVudENSVURIYW5kbGVyO1xuICBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyO1xuICBhZ2VudE1hbmFnZXI6IEFnZW50TWFuYWdlcjtcbiAgdGVtcGxhdGVSZW5kZXJlcjogVGVtcGxhdGVSZW5kZXJlcjtcbiAgZWxlbWVudFF1ZXJ5U2VydmljZTogRWxlbWVudFF1ZXJ5U2VydmljZTtcbiAgLy8gTUNQLUFRTCBleHRlbnNpb24gaGFuZGxlcnMgKElzc3VlICMyNDEpXG4gIGNvbGxlY3Rpb25IYW5kbGVyPzogQ29sbGVjdGlvbkhhbmRsZXI7XG4gIHBvcnRmb2xpb0hhbmRsZXI/OiBQb3J0Zm9saW9IYW5kbGVyO1xuICBhdXRoSGFuZGxlcj86IEdpdEh1YkF1dGhIYW5kbGVyO1xuICBjb25maWdIYW5kbGVyPzogQ29uZmlnSGFuZGxlcjtcbiAgZW5oYW5jZWRJbmRleEhhbmRsZXI/OiBFbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgcGVyc29uYUhhbmRsZXI/OiBQZXJzb25hSGFuZGxlcjtcbiAgc3luY0hhbmRsZXI/OiBTeW5jSGFuZGxlcjtcbiAgYnVpbGRJbmZvU2VydmljZT86IEJ1aWxkSW5mb1NlcnZpY2U7XG4gIGNhY2hlTWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0O1xuICBnYXRla2VlcGVyOiBHYXRla2VlcGVyO1xuICAvLyBJc3N1ZSAjNDAyOiBESS1pbmplY3RlZCBkYW5nZXIgem9uZSBlbmZvcmNlciAocmVwbGFjZXMgc2luZ2xldG9uIGltcG9ydClcbiAgZGFuZ2VyWm9uZUVuZm9yY2VyPzogRGFuZ2VyWm9uZUVuZm9yY2VyO1xuICAvLyBJc3N1ZSAjMTQyOiBTZXJ2ZXItc2lkZSB2ZXJpZmljYXRpb24gc3RvcmUgZm9yIGNoYWxsZW5nZSBjb2Rlc1xuICB2ZXJpZmljYXRpb25TdG9yZT86IFZlcmlmaWNhdGlvblN0b3JlO1xuICAvLyBJc3N1ZSAjNTIyOiBOb24tYmxvY2tpbmcgT1MgZGlhbG9nIGZvciB2ZXJpZmljYXRpb24gY29kZXMgKHJlcGxhY2VzIHJldHVybmluZyBjb2RlIHRvIExMTSlcbiAgdmVyaWZpY2F0aW9uTm90aWZpZXI/OiBJVmVyaWZpY2F0aW9uTm90aWZpZXI7XG4gIC8vIElzc3VlICM1Mjg6IE1lbW9yeUxvZ1NpbmsgZm9yIENSVURFLXJvdXRlZCBxdWVyeV9sb2dzXG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICAvLyBNZXRyaWNzOiBNZW1vcnlNZXRyaWNzU2luayBmb3IgQ1JVREUtcm91dGVkIHF1ZXJ5X21ldHJpY3NcbiAgbWV0cmljc1Npbms/OiBpbXBvcnQoJy4uLy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnKS5NZW1vcnlNZXRyaWNzU2luaztcbiAgLy8gU2VhcmNoIG1ldHJpY3M6IFBlcmZvcm1hbmNlTW9uaXRvciBmb3IgcmVjb3JkU2VhcmNoKClcbiAgcGVyZm9ybWFuY2VNb25pdG9yPzogUGVyZm9ybWFuY2VNb25pdG9yO1xuICAvLyBPcGVyYXRpb24gbWV0cmljczogT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIgZm9yIENSVUQgb3BlcmF0aW9uIHN0YXRzXG4gIG9wZXJhdGlvbk1ldHJpY3NUcmFja2VyPzogT3BlcmF0aW9uTWV0cmljc1RyYWNrZXI7XG4gIC8vIEdhdGVrZWVwZXIgbWV0cmljczogR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyIGZvciBwb2xpY3kgZW5mb3JjZW1lbnQgc3RhdHNcbiAgZ2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyPzogR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyO1xufVxuXG4vKipcbiAqIEV4cG9ydCBwYWNrYWdlIHN0cnVjdHVyZSBmb3IgZWxlbWVudCBpbXBvcnQvZXhwb3J0IG9wZXJhdGlvbnNcbiAqL1xuaW50ZXJmYWNlIEV4cG9ydFBhY2thZ2Uge1xuICBleHBvcnRWZXJzaW9uOiBzdHJpbmc7XG4gIGV4cG9ydGVkQXQ6IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IHN0cmluZztcbiAgZWxlbWVudE5hbWU/OiBzdHJpbmc7XG4gIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnO1xuICBkYXRhOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTUNQQVFMSGFuZGxlciAtIFVuaWZpZWQgZW50cnkgcG9pbnQgZm9yIGFsbCBNQ1AtQVFMIG9wZXJhdGlvbnNcbiAqXG4gKiBUaGlzIGhhbmRsZXIgaW1wbGVtZW50cyB0aGUgdGhpbiByZXNvbHZlciBwYXR0ZXJuOlxuICogMS4gVmFsaWRhdGVzIHRoYXQgb3BlcmF0aW9ucyBhcmUgY2FsbGVkIHZpYSBjb3JyZWN0IENSVUQgZW5kcG9pbnRzXG4gKiAyLiBSb3V0ZXMgb3BlcmF0aW9ucyB0byB0aGVpciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAqIDMuIERpc3BhdGNoZXMgdG8gYWN0dWFsIGhhbmRsZXIgbWV0aG9kc1xuICogNC4gUmV0dXJucyBzdGFuZGFyZGl6ZWQgT3BlcmF0aW9uUmVzdWx0XG4gKlxuICogREVTSUdOIFJBVElPTkFMRTpcbiAqIC0gU2luZ2xlIFJlc3BvbnNpYmlsaXR5OiBPbmx5IG9yY2hlc3RyYXRlcywgZGVsZWdhdGVzIGFjdHVhbCB3b3JrXG4gKiAtIERlcGVuZGVuY3kgSW52ZXJzaW9uOiBEZXBlbmRzIG9uIEhhbmRsZXJSZWdpc3RyeSBpbnRlcmZhY2VcbiAqIC0gSW50ZXJmYWNlIFNlZ3JlZ2F0aW9uOiBIYW5kbGVyUmVnaXN0cnkgZXhwb3NlcyBvbmx5IHdoYXQncyBuZWVkZWRcbiAqIC0gT3Blbi9DbG9zZWQ6IE5ldyBvcGVyYXRpb25zIGFkZGVkIHRvIHJvdXRlciwgbm90IHRoaXMgY2xhc3NcbiAqL1xuLyoqXG4gKiBNaW5pbWFsIGludGVyZmFjZSBmb3IgY29ycmVsYXRpb24gSUQgcmV0cmlldmFsLlxuICogS2VlcHMgY291cGxpbmcgbG9vc2Ug4oCUIG9ubHkgcmVxdWlyZXMgd2hhdCBNQ1BBUUxIYW5kbGVyIGFjdHVhbGx5IG5lZWRzLlxuICogSXNzdWUgIzMwMTogUmVxdWVzdCBjb3JyZWxhdGlvbiBzdXBwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcnJlbGF0aW9uSWRQcm92aWRlciB7XG4gIGdldENvcnJlbGF0aW9uSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgTUNQQVFMSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2F0ZWtlZXBlcjogR2F0ZWtlZXBlcjtcbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IFBlci1tZW1vcnkgc2F2ZSBkZWJvdW5jZSB0aW1lcnMuXG4gICAqIFdoZW4gYWRkRW50cnkgaXMgY2FsbGVkIHJhcGlkbHksIHdlIGNvYWxlc2NlIHNhdmVzIOKAlCBvbmx5IHRoZSBsYXRlc3RcbiAgICogc3RhdGUgaXMgd3JpdHRlbiB0byBkaXNrIGFmdGVyIHRoZSBkZWJvdW5jZSB3aW5kb3cgZXhwaXJlcy5cbiAgICogS2V5OiBub3JtYWxpemVkIG1lbW9yeSBuYW1lLCBWYWx1ZTogeyB0aW1lciwgbWVtb3J5LCBtYW5hZ2VyIH1cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1NhdmVzID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgbWVtb3J5OiBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcycpLk1lbW9yeTtcbiAgICBtYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyO1xuICB9PigpO1xuICAvKiogSXNzdWUgIzY1NjogRGVib3VuY2UgbWV0cmljcyDigJQgdHJhY2tzIHNhdmVzIGNvYWxlc2NlZCB2cyBhY3R1YWxseSB3cml0dGVuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlTWV0cmljcyA9IHsgY29hbGVzY2VkOiAwLCB3cml0dGVuOiAwIH07XG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU3OiBQZXItbWVtb3J5IHNhdmUgZnJlcXVlbmN5IHRyYWNrZXIuXG4gICAqIFNsaWRpbmcgd2luZG93IGNvdW50ZXI6IHRyYWNrcyBhZGRFbnRyeSBjYWxscyBwZXIgbWVtb3J5IHdpdGhpbiB0aGUgbW9uaXRvciB3aW5kb3cuXG4gICAqIExvZ3Mgd2FybmluZ3MgYXQgY29uZmlndXJhYmxlIHRocmVzaG9sZHMgdG8gY2F0Y2ggcnVuYXdheSBsb29wcyBlYXJseS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgdGltZXN0YW1wczogbnVtYmVyW107IHdhcm5lZDogYm9vbGVhbjsgY3JpdGljYWw6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIElzc3VlICM2MjUgUGhhc2UgNDogUmF0ZSBsaW1pdGVyIGZvciBwZXJtaXNzaW9uX3Byb21wdCBldmFsdWF0aW9ucyAoY29uZmlndXJhYmxlIHZpYSBlbnYpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvblByb21wdExpbWl0ZXIgPSBSYXRlTGltaXRlckZhY3RvcnkuY3JlYXRlUGVybWlzc2lvblByb21wdExpbWl0ZXIoXG4gICAgZW52LkRPTExIT1VTRV9QRVJNSVNTSU9OX1BST01QVF9SQVRFX0xJTUlULCBlbnYuRE9MTEhPVVNFX1BFUk1JU1NJT05fUkFURV9XSU5ET1dfTVNcbiAgKTtcbiAgLyoqIElzc3VlICM2MjUgUGhhc2UgNDogUmF0ZSBsaW1pdGVyIGZvciBDTEkgYXBwcm92YWwgcmVjb3JkIGNyZWF0aW9uIChjb25maWd1cmFibGUgdmlhIGVudikgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjbGlBcHByb3ZhbExpbWl0ZXIgPSBSYXRlTGltaXRlckZhY3RvcnkuY3JlYXRlQ2xpQXBwcm92YWxMaW1pdGVyKFxuICAgIGVudi5ET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1JBVEVfTElNSVQsIGVudi5ET0xMSE9VU0VfUEVSTUlTU0lPTl9SQVRFX1dJTkRPV19NU1xuICApO1xuICAvKipcbiAgICogQnVpbGQgYSBzdGFuZGFyZGl6ZWQgcmF0ZS1saW1pdCBkZW55IHJlc3BvbnNlIGZvciBwZXJtaXNzaW9uX3Byb21wdC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSYXRlTGltaXREZW55KFxuICAgIGxpbWl0ZXJOYW1lOiBzdHJpbmcsXG4gICAgdG9vbE5hbWU6IHN0cmluZyxcbiAgICBzdGF0dXM6IGltcG9ydCgnLi4vLi4vdXRpbHMvUmF0ZUxpbWl0ZXIuanMnKS5SYXRlTGltaXRTdGF0dXMsXG4gICAgcmlza0xldmVsID0gJ2Jsb2NrZWQnLFxuICAgIHJlYXNvbiA9ICdSYXRlIGxpbWl0IGV4Y2VlZGVkJyxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgIGRldGFpbHM6IGAke2xpbWl0ZXJOYW1lfSByYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke3Rvb2xOYW1lfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgbGltaXRlcjogbGltaXRlck5hbWUsXG4gICAgICAgIHJldHJ5QWZ0ZXJNczogc3RhdHVzLnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgcmVtYWluaW5nVG9rZW5zOiBzdGF0dXMucmVtYWluaW5nVG9rZW5zLFxuICAgICAgICByZXNldFRpbWU6IHN0YXR1cy5yZXNldFRpbWUudG9JU09TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICBtZXNzYWdlOiBgUmF0ZSBsaW1pdCBleGNlZWRlZCBmb3IgJHtsaW1pdGVyTmFtZX0uIFJldHJ5IGFmdGVyICR7c3RhdHVzLnJldHJ5QWZ0ZXJNc31tcy5gLFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgcmlza0xldmVsLCByZWFzb24sIHN0YWdlOiAncmF0ZV9saW1pdCcgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIElzc3VlICMxNDI6IFJhdGUgbGltaXRlciBmb3IgdmVyaWZ5X2NoYWxsZW5nZSBhdHRlbXB0cyAobWF4IDEwIGZhaWx1cmVzIHBlciA2MHMgd2luZG93KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmaWNhdGlvblJhdGVMaW1pdGVyID0gbmV3IFZlcmlmaWNhdGlvblJhdGVMaW1pdGVyKCk7XG4gIC8qKiBJc3N1ZSAjMTQyOiBNZXRyaWNzIHRyYWNrZXIgZm9yIHZlcmlmaWNhdGlvbiBvcGVyYXRpb25zICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyaWZpY2F0aW9uTWV0cmljcyA9IG5ldyBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlcigpO1xuICAvKipcbiAgICogVHJhY2tzIGFnZW50cyBjdXJyZW50bHkgaW4gYW4gZXhlY3V0aW9uIGxvb3AgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50LlxuICAgKlxuICAgKiAqKkxpZmVjeWNsZToqKiBFbnRyaWVzIGFyZSBhZGRlZCBpbiBgZGlzcGF0Y2hFeGVjdXRlKClgIG9uIGBleGVjdXRlX2FnZW50YCBhbmRcbiAgICogcmVtb3ZlZCBvbiBgY29tcGxldGVfZXhlY3V0aW9uYC4gT25seSBhZ2VudHMgd2l0aCBhIGdhdGVrZWVwZXIgcG9saWN5IChleHBsaWNpdFxuICAgKiBvciBzeW50aGVzaXplZCBmcm9tIGB0b29sc2AgY29uZmlnKSBhcmUgdHJhY2tlZC5cbiAgICpcbiAgICogKipQb2xpY3kgcmVzb2x1dGlvbjoqKiBFbnRyaWVzIGFyZSBpbmNsdWRlZCBpbiBgZ2V0QWN0aXZlRWxlbWVudHMoKWAgc28gdGhlXG4gICAqIEdhdGVrZWVwZXIgZXZhbHVhdGVzIGFnZW50IHBvbGljaWVzIGFsb25nc2lkZSBwZXJzb25hL3NraWxsL2Vuc2VtYmxlIHBvbGljaWVzLlxuICAgKiBUaGUgc3RhbmRhcmQgcHJpb3JpdHkgYXBwbGllczogZGVueSA+IHNjb3BlX3Jlc3RyaWN0aW9uID4gY29uZmlybSA+IGFsbG93LlxuICAgKlxuICAgKiAqKk1lbW9yeSBzYWZldHk6KiogVGhlIE1hcCBpcyBib3VuZGVkIGJ5IGNvbmN1cnJlbnRseSBleGVjdXRpbmcgYWdlbnRzLiBJZiBhXG4gICAqIHNlc3Npb24gZW5kcyB3aXRob3V0IGBjb21wbGV0ZV9leGVjdXRpb25gLCB0aGUgTWFwIGlzIGdhcmJhZ2UgY29sbGVjdGVkIHdpdGhcbiAgICogdGhlIE1DUEFRTEhhbmRsZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIElzc3VlICM0NDlcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW5nQWdlbnRzID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAvKiogQWdlbnQgZWxlbWVudCBuYW1lIChtYXRjaGVzIHRoZSBNYXAga2V5KSAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogTWV0YWRhdGEgY29udGFpbmluZyB0aGUgcmVzb2x2ZWQgZ2F0ZWtlZXBlciBwb2xpY3kgKi9cbiAgICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgLyoqIFRpbWVzdGFtcCB3aGVuIGV4ZWN1dGlvbiBzdGFydGVkIChmb3IgZGlhZ25vc3RpY3MpICovXG4gICAgc3RhcnRlZEF0OiBudW1iZXI7XG4gICAgLyoqIFJlc2lsaWVuY2UgdHJhY2tpbmc6IG51bWJlciBvZiBhdXRvLWNvbnRpbnVhdGlvbnMgcGVyZm9ybWVkIChJc3N1ZSAjNTI2KSAqL1xuICAgIGNvbnRpbnVhdGlvbkNvdW50OiBudW1iZXI7XG4gICAgLyoqIFJlc2lsaWVuY2UgdHJhY2tpbmc6IG51bWJlciBvZiByZXRyaWVzIGZvciB0aGUgY3VycmVudCBzdGVwIChJc3N1ZSAjNTI2KSAqL1xuICAgIHJldHJ5Q291bnQ6IG51bWJlcjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogb3JpZ2luYWwgcGFyYW1ldGVycyBmcm9tIGV4ZWN1dGVfYWdlbnQgKElzc3VlICM1MjYpICovXG4gICAgb3JpZ2luYWxQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgLyoqIFJlc2lsaWVuY2UgdHJhY2tpbmc6IHJlc29sdmVkIHBvbGljeSBmcm9tIGFnZW50IG1ldGFkYXRhIChJc3N1ZSAjNTI2KSAqL1xuICAgIHJlc2lsaWVuY2VQb2xpY3k/OiBBZ2VudFJlc2lsaWVuY2VQb2xpY3k7XG4gICAgLyoqIFJlY2VudCBnYXRla2VlcGVyIGJsb2NrcyBkdXJpbmcgdGhpcyBhZ2VudCdzIGV4ZWN1dGlvbiAoQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbSkgKi9cbiAgICByZWNlbnRCbG9ja3M6IEFycmF5PHtcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nO1xuICAgICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgICByZWFzb246IHN0cmluZztcbiAgICAgIC8qKiBQZXJtaXNzaW9uIGxldmVsIHRoYXQgY2F1c2VkIHRoZSBibG9jayAoREVOWSwgQ09ORklSTV9TRVNTSU9OLCBDT05GSVJNX1NJTkdMRV9VU0UpICovXG4gICAgICBsZXZlbDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICAvKiogV2hldGhlciB0aGlzIGJsb2NrIGhhcyBiZWVuIHJlcG9ydGVkIGluIGEgbm90aWZpY2F0aW9uICovXG4gICAgICByZXBvcnRlZDogYm9vbGVhbjtcbiAgICB9PjtcbiAgfT4oKTtcblxuICAvKipcbiAgICogU2V0IG9mIGFib3J0ZWQgZ29hbElkcy4gT25jZSBhIGdvYWxJZCBpcyBhYm9ydGVkLCBhbGwgZnVydGhlciBleGVjdXRpb25cbiAgICogb3BlcmF0aW9ucyAocmVjb3JkX2V4ZWN1dGlvbl9zdGVwLCBjb21wbGV0ZV9leGVjdXRpb24sIGNvbnRpbnVlX2V4ZWN1dGlvbilcbiAgICogZm9yIHRoYXQgZ29hbElkIGFyZSByZWplY3RlZCBhdCB0aGUgZGlzcGF0Y2ggbGF5ZXIuXG4gICAqXG4gICAqIElzc3VlICMyNDk6IEFib3J0L2NhbmNlbGxhdGlvbiBpbmZyYXN0cnVjdHVyZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRlZEdvYWxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogSGFuZGxlclJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dFRyYWNrZXI/OiBDb3JyZWxhdGlvbklkUHJvdmlkZXIsXG4gICkge1xuICAgIC8vIEluaXRpYWxpemUgbm9ybWFsaXplcnMgZm9yIHNjaGVtYS1kcml2ZW4gb3BlcmF0aW9ucyAoSXNzdWUgIzI0MylcbiAgICBpbml0aWFsaXplTm9ybWFsaXplcnMoKTtcbiAgICAvLyBJc3N1ZSAjNDUyOiBTdG9yZSBHYXRla2VlcGVyIGluc3RhbmNlIGZvciBwb2xpY3kgZW5mb3JjZW1lbnRcbiAgICBpZiAoIWhhbmRsZXJzLmdhdGVrZWVwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2F0ZWtlZXBlciBpbnN0YW5jZSBpcyByZXF1aXJlZCBpbiBIYW5kbGVyUmVnaXN0cnkuIFByb3ZpZGUgb25lIHZpYSB0aGUgREkgY29udGFpbmVyLicpO1xuICAgIH1cbiAgICB0aGlzLmdhdGVrZWVwZXIgPSBoYW5kbGVycy5nYXRla2VlcGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2ZXJpZmljYXRpb24gbWV0cmljcyBmb3IgbW9uaXRvcmluZy9kaWFnbm9zdGljcy5cbiAgICogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIERhbmdlclpvbmVFbmZvcmNlci5nZXRNZXRyaWNzKCkuXG4gICAqL1xuICBnZXRWZXJpZmljYXRpb25NZXRyaWNzKCk6IFZlcmlmaWNhdGlvbk1ldHJpY3Mge1xuICAgIHJldHVybiB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MuZ2V0TWV0cmljcyh0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXV0b25vbXkgZXZhbHVhdGlvbiBtZXRyaWNzIGZvciBtb25pdG9yaW5nL2RpYWdub3N0aWNzLlxuICAgKiBJc3N1ZSAjMzkxOiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgZ2V0VmVyaWZpY2F0aW9uTWV0cmljcygpLlxuICAgKi9cbiAgZ2V0QXV0b25vbXlNZXRyaWNzKCk6IEF1dG9ub215TWV0cmljc1NuYXBzaG90IHtcbiAgICByZXR1cm4gZ2V0QXV0b25vbXlNZXRyaWNzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2F0aGVyIGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24uXG4gICAqXG4gICAqIFF1ZXJpZXMgUGVyc29uYU1hbmFnZXIsIFNraWxsTWFuYWdlciwgYW5kIEVuc2VtYmxlTWFuYWdlciBmb3IgYWN0aXZlIGVsZW1lbnRzLFxuICAgKiB0aGVuIGFwcGVuZHMgYW55IGN1cnJlbnRseSBleGVjdXRpbmcgYWdlbnRzIHdpdGggZ2F0ZWtlZXBlciBwb2xpY2llcy4gQWxsXG4gICAqIGVsZW1lbnRzIGFyZSBtYXBwZWQgdG8gdGhlIHtAbGluayBBY3RpdmVFbGVtZW50fSBpbnRlcmZhY2UgZXhwZWN0ZWQgYnlcbiAgICogYEdhdGVrZWVwZXIuZW5mb3JjZSgpYC5cbiAgICpcbiAgICogSXNzdWUgIzQ1MjogUHJvdmlkZXMgZWxlbWVudCBjb250ZXh0IGZvciBMYXllciAyIChlbGVtZW50IHBvbGljeSByZXNvbHV0aW9uKS5cbiAgICogSXNzdWUgIzQ0OTogSW5jbHVkZXMgZXhlY3V0aW5nIGFnZW50cyBhbG9uZ3NpZGUgcGVyc29uYXMvc2tpbGxzL2Vuc2VtYmxlcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgYWN0aXZlIGVsZW1lbnRzIHdpdGggdGhlaXIgZ2F0ZWtlZXBlciBwb2xpY2llcywgb3IgZW1wdHlcbiAgICogICAgICAgICAgYXJyYXkgaWYgZ2F0aGVyaW5nIGZhaWxzIChmYWlsLW9wZW46IG9ubHkgcm91dGUgcG9saWNpZXMgYXBwbHkpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRBY3RpdmVFbGVtZW50cygpOiBQcm9taXNlPEFjdGl2ZUVsZW1lbnRbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdFbGVtZW50cyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10gPSByYXdFbGVtZW50cy5tYXAoKGVsKSA9PiAoe1xuICAgICAgICB0eXBlOiBlbC50eXBlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IChlbC5tZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBnYXRla2VlcGVyOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBBY3RpdmVFbGVtZW50WydtZXRhZGF0YSddWydnYXRla2VlcGVyJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBJc3N1ZSAjNDQ5OiBJbmNsdWRlIGV4ZWN1dGluZyBhZ2VudHMgd2l0aCBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICBmb3IgKGNvbnN0IFssIGFnZW50RW50cnldIG9mIHRoaXMuZXhlY3V0aW5nQWdlbnRzKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhZ2VudCcsXG4gICAgICAgICAgbmFtZTogYWdlbnRFbnRyeS5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBuYW1lOiBhZ2VudEVudHJ5Lm5hbWUsXG4gICAgICAgICAgICBnYXRla2VlcGVyOiBhZ2VudEVudHJ5Lm1ldGFkYXRhLmdhdGVrZWVwZXIgYXMgQWN0aXZlRWxlbWVudFsnbWV0YWRhdGEnXVsnZ2F0ZWtlZXBlciddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWN0aXZlRWxlbWVudHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgb3BlbiDigJQgaWYgd2UgY2FuJ3QgZ2F0aGVyIGFjdGl2ZSBlbGVtZW50cywgZW5mb3JjZSB3aXRob3V0IHRoZW1cbiAgICAgIC8vIFRoaXMgbWVhbnMgb25seSByb3V0ZSB2YWxpZGF0aW9uIGFuZCBkZWZhdWx0IHBvbGljaWVzIHdpbGwgYXBwbHlcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBlbGVtZW50cyBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBDUkVBVEUgb3BlcmF0aW9ucyAoYWRkaXRpdmUsIG5vbi1kZXN0cnVjdGl2ZSlcbiAgICpcbiAgICogQ1JFQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gY3JlYXRlX2VsZW1lbnQ6IENyZWF0ZSBuZXcgZWxlbWVudHNcbiAgICogLSBpbXBvcnRfZWxlbWVudDogSW1wb3J0IGVsZW1lbnRzIGZyb20gZXhwb3J0ZWQgZGF0YVxuICAgKiAtIGFkZEVudHJ5OiBBZGQgZW50cmllcyB0byBtZW1vcnkgZWxlbWVudHNcbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVDcmVhdGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnQ1JFQVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdDUkVBVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUkVBRCBvcGVyYXRpb25zIChyZWFkLW9ubHksIHNhZmUpXG4gICAqXG4gICAqIFJFQUQgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBsaXN0X2VsZW1lbnRzOiBMaXN0IGVsZW1lbnRzIHdpdGggZmlsdGVyaW5nXG4gICAqIC0gZ2V0X2VsZW1lbnQ6IEdldCBlbGVtZW50IGJ5IG5hbWVcbiAgICogLSBnZXRfZWxlbWVudF9kZXRhaWxzOiBHZXQgZGV0YWlsZWQgZWxlbWVudCBpbmZvcm1hdGlvblxuICAgKiAtIHNlYXJjaF9lbGVtZW50czogRnVsbC10ZXh0IHNlYXJjaFxuICAgKiAtIHF1ZXJ5X2VsZW1lbnRzOiBRdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAgICogLSBnZXRfYWN0aXZlX2VsZW1lbnRzOiBHZXQgYWN0aXZlIGVsZW1lbnRzXG4gICAqIC0gdmFsaWRhdGVfZWxlbWVudDogVmFsaWRhdGUgZWxlbWVudFxuICAgKiAtIHJlbmRlcjogUmVuZGVyIHRlbXBsYXRlXG4gICAqIC0gZXhwb3J0X2VsZW1lbnQ6IEV4cG9ydCBlbGVtZW50XG4gICAqIC0gYWN0aXZhdGVfZWxlbWVudDogQWN0aXZhdGUgZWxlbWVudHMgZm9yIHVzZVxuICAgKiAtIGRlYWN0aXZhdGVfZWxlbWVudDogRGVhY3RpdmF0ZSBlbGVtZW50XG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlUmVhZChpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdSRUFEJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdSRUFEJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIFVQREFURSBvcGVyYXRpb25zIChtb2RpZnlpbmcgZXhpc3Rpbmcgc3RhdGUpXG4gICAqXG4gICAqIFVQREFURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGVkaXRfZWxlbWVudDogTW9kaWZ5IGV4aXN0aW5nIGVsZW1lbnRzXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlVXBkYXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ1VQREFURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnVVBEQVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIERFTEVURSBvcGVyYXRpb25zIChkZXN0cnVjdGl2ZSBhY3Rpb25zKVxuICAgKlxuICAgKiBERUxFVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBkZWxldGVfZWxlbWVudDogRGVsZXRlIGVsZW1lbnRzXG4gICAqIC0gY2xlYXI6IENsZWFyIG1lbW9yeSBlbnRyaWVzXG4gICAqIC0gY2xlYXJfZ2l0aHViX2F1dGg6IFJlbW92ZSBHaXRIdWIgYXV0aGVudGljYXRpb25cbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVEZWxldGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnREVMRVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdERUxFVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgRVhFQ1VURSBvcGVyYXRpb25zIChydW50aW1lIGV4ZWN1dGlvbiBsaWZlY3ljbGUpXG4gICAqXG4gICAqIEVYRUNVVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBleGVjdXRlX2FnZW50OiBTdGFydCBleGVjdXRpb24gb2YgYW4gYWdlbnQgb3IgZXhlY3V0YWJsZSBlbGVtZW50XG4gICAqIC0gZ2V0X2V4ZWN1dGlvbl9zdGF0ZTogUXVlcnkgY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICogLSByZWNvcmRfZXhlY3V0aW9uX3N0ZXA6IFJlY29yZCBleGVjdXRpb24gcHJvZ3Jlc3Mgb3IgZmluZGluZ3NcbiAgICogLSBjb21wbGV0ZV9leGVjdXRpb246IFNpZ25hbCBleGVjdXRpb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5XG4gICAqIC0gY29udGludWVfZXhlY3V0aW9uOiBSZXN1bWUgZXhlY3V0aW9uIGZyb20gc2F2ZWQgc3RhdGVcbiAgICogLSBhYm9ydF9leGVjdXRpb246IENhbmNlbCBhbiBvbmdvaW5nIGV4ZWN1dGlvblxuICAgKlxuICAgKiBVbmxpa2UgQ1JVRCBvcGVyYXRpb25zICh3aGljaCBhcmUgaWRlbXBvdGVudCksIEVYRUNVVEUgb3BlcmF0aW9ucyBtYW5hZ2VcbiAgICogcnVudGltZSBzdGF0ZSBhbmQgYXJlIGluaGVyZW50bHkgbm9uLWlkZW1wb3RlbnQuIENhbGxpbmcgZXhlY3V0ZSB0d2ljZVxuICAgKiBjcmVhdGVzIHR3byBzZXBhcmF0ZSBleGVjdXRpb25zLlxuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZUV4ZWN1dGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnRVhFQ1VURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnRVhFQ1VURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgZXhlY3V0aW9uIGxvZ2ljIHNoYXJlZCBieSBhbGwgQ1JVRCBlbmRwb2ludHMuXG4gICAqIEltcGxlbWVudHMgdGhlIHRoaW4gcmVzb2x2ZXIgcGF0dGVybjogdmFsaWRhdGUg4oaSIHJvdXRlIOKGkiBkaXNwYXRjaCDihpIgcmV0dXJuLlxuICAgKlxuICAgKiBPUEVSQVRJT04gRkxPVzpcbiAgICogMS4gVmFsaWRhdGUgaW5wdXQgc3RydWN0dXJlXG4gICAqIDIuIFZhbGlkYXRlIHBlcm1pc3Npb25zIChQZXJtaXNzaW9uR3VhcmQpXG4gICAqIDMuIFJvdXRlIG9wZXJhdGlvbiAoT3BlcmF0aW9uUm91dGVyKVxuICAgKiA0LiBEaXNwYXRjaCB0byBoYW5kbGVyXG4gICAqIDUuIFJldHVybiBzdGFuZGFyZGl6ZWQgcmVzdWx0XG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIFJhdyBpbnB1dCB0byB2YWxpZGF0ZSBhbmQgcHJvY2Vzc1xuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBDUlVEIGVuZHBvaW50IGJlaW5nIGNhbGxlZFxuICAgKiBAcmV0dXJucyBTdGFuZGFyZGl6ZWQgT3BlcmF0aW9uUmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb24oXG4gICAgaW5wdXQ6IHVua25vd24sXG4gICAgZW5kcG9pbnQ6IENSVURFbmRwb2ludFxuICApOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIC8vIElzc3VlICMzMDE6IENhcHR1cmUgc3RhcnQgdGltZSBmb3IgcmVzcG9uc2UgdGltaW5nIG1ldGFkYXRhXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAvLyBTdGVwIDE6IFBhcnNlIGFuZCBub3JtYWxpemUgaW5wdXQgKGhhbmRsZXMgYm90aCBwcm9wZXIgYW5kIGxlZ2FjeSBmb3JtYXRzKVxuICAgIC8vIElzc3VlICMyMDU6IFNpbGVudCBKU09OIGZhbGxiYWNrIGZvciBlZGdlIGNhc2VzXG4gICAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZU9wZXJhdGlvbklucHV0KGlucHV0KTtcblxuICAgIC8vIEV4dHJhY3Qgb3BlcmF0aW9uIG5hbWUgZm9yIGxvZ2dpbmdcbiAgICBjb25zdCBvcGVyYXRpb25OYW1lID0gcGFyc2VkSW5wdXQ/Lm9wZXJhdGlvbiA/PyAndW5rbm93bic7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgcGFyc2luZyBzdWNjZWVkZWRcbiAgICAgIGlmICghcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShcbiAgICAgICAgICAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgT3BlcmF0aW9uSW5wdXQgd2l0aCBcIm9wZXJhdGlvblwiIGFuZCBvcHRpb25hbCBcInBhcmFtc1wiLiAnICtcbiAgICAgICAgICBkZXNjcmliZUludmFsaWRJbnB1dChpbnB1dCkgKyAnLiAnICtcbiAgICAgICAgICAnVXNlIGZvcm1hdDogeyBvcGVyYXRpb246IFwibGlzdF9lbGVtZW50c1wiLCBwYXJhbXM6IHsgdHlwZTogXCJwZXJzb25hc1wiIH0gfScsXG4gICAgICAgICAgc3RhcnRUaW1lXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBwYXJzZWRJbnB1dDtcblxuICAgICAgLy8gU3RlcCAyOiBFbmZvcmNlIEdhdGVrZWVwZXIgcG9saWN5IChJc3N1ZSAjNDUyKVxuICAgICAgaWYgKGVudi5ET0xMSE9VU0VfR0FURUtFRVBFUl9FTkFCTEVEKSB7XG4gICAgICAgIC8vIEZ1bGwgNC1sYXllciBjaGVjazogcm91dGUgdmFsaWRhdGlvbiDihpIgZWxlbWVudCBwb2xpY2llcyDihpIgc2Vzc2lvbiBjb25maXJtYXRpb25zIOKGkiBkZWZhdWx0c1xuICAgICAgICAvLyBJc3N1ZSAjNzU4OiBHYXRla2VlcGVyIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbnMgKGNvbmZpcm1fb3BlcmF0aW9uLCB2ZXJpZnlfY2hhbGxlbmdlLCBldGMuKVxuICAgICAgICAvLyBza2lwIGVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb24gaW4gdGhlIHByaW1hcnkgZW5mb3JjZW1lbnQgcGF0aCB0byBwcmV2ZW50IGNhc2NhZGluZ1xuICAgICAgICAvLyBjb25maXJtYXRpb24gbG9vcHMuIEVsZW1lbnQgcG9saWNpZXMgZm9yIHRoZSBUQVJHRVQgb3BlcmF0aW9uIGFyZSBldmFsdWF0ZWQgc2VwYXJhdGVseVxuICAgICAgICAvLyBpbnNpZGUgdGhlIGNvbmZpcm0gaGFuZGxlciwgYW5kIGRlbnk6IFsnY29uZmlybV9vcGVyYXRpb24nXSBpcyBlbmZvcmNlZCBhcyBhIHNhbmRib3guXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IHRoaXMuZ2F0ZWtlZXBlci5lbmZvcmNlKHtcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgICAgc2tpcEVsZW1lbnRQb2xpY2llczogaXNHYXRla2VlcGVySW5mcmFPcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVjb3JkIEdhdGVrZWVwZXIgZGVjaXNpb24gZm9yIG1ldHJpY3NcbiAgICAgICAgdGhpcy5oYW5kbGVycy5nYXRla2VlcGVyTWV0cmljc1RyYWNrZXI/LnJlY29yZCh7XG4gICAgICAgICAgYWxsb3dlZDogZGVjaXNpb24uYWxsb3dlZCxcbiAgICAgICAgICBwZXJtaXNzaW9uTGV2ZWw6IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCxcbiAgICAgICAgICBwb2xpY3lTb3VyY2U6IGRlY2lzaW9uLnBvbGljeVNvdXJjZSxcbiAgICAgICAgICBjb25maXJtYXRpb25QZW5kaW5nOiBkZWNpc2lvbi5jb25maXJtYXRpb25QZW5kaW5nLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgICAgICAgLy8gSXNzdWUgIzE2NTM6IEF1dG8tY29uZmlybSB3aGVuIHRoZSBob3N0IChDbGF1ZGUgQ29kZSwgZXRjLikgaGFzIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGFwcHJvdmVkIHRoaXMgTUNQIHRvb2wgY2FsbC4gVGhlIGhvc3QncyB0b29sLWxldmVsIGFwcHJvdmFsIGlzIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAvLyBodW1hbiBnYXRlOyB0aGUgZ2F0ZWtlZXBlcidzIGNvbmZpcm1fb3BlcmF0aW9uIHJvdW5kLXRyaXAgaXMgcmVkdW5kYW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSBob3N0IGdhdGVzIGV2ZXJ5IGNhbGwuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gU2FmZXR5IGxheWVycyB0aGF0IHJlbWFpbiBhY3RpdmUgKHByb3ZlbiBieSBwZXJtaXNzaW9uLWZsb3ctaGFybmVzcyB0ZXN0cyk6XG4gICAgICAgICAgICAvLyAtIEVsZW1lbnQgZGVueSBwb2xpY2llcyAoaGFyZCBkZW55LCBubyBjb25maXJtYXRpb25QZW5kaW5nIGZsYWcpXG4gICAgICAgICAgICAvLyAtIGNhbkJlRWxldmF0ZWQ6IGZhbHNlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAvLyAtIFNhZmV0eSB0aWVyIGV2YWx1YXRpb24gKHJ1bnMgYmVmb3JlIGNvbmZpcm1hdGlvbiBjaGVjaylcbiAgICAgICAgICAgIC8vIC0gRGFuZ2VyWm9uZSB2ZXJpZmljYXRpb24gKHNlcGFyYXRlIGZsb3cpXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIGNvbmZpcm1hdGlvbiBpcyByZWNvcmRlZCBpbiB0aGUgc2Vzc2lvbiBzbyBzdWJzZXF1ZW50IGVuZm9yY2UoKSBjYWxsc1xuICAgICAgICAgICAgLy8gZm9yIHRoZSBzYW1lIG9wZXJhdGlvbiBwYXNzIHdpdGhvdXQgcmUtY29uZmlybWluZy5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1MZXZlbCA9IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCBhc1xuICAgICAgICAgICAgICBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TRVNTSU9OIHwgUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRTtcblxuICAgICAgICAgICAgLy8gUmlzayBzY29yaW5nIGZvciBkZXN0cnVjdGl2ZS9oaWdoLWltcGFjdCBvcGVyYXRpb25zLlxuICAgICAgICAgICAgLy8gQXNzaWducyBhIHJpc2sgc2NvcmUgKDAtMTAwKSBiYXNlZCBvbiBvcGVyYXRpb24gY2hhcmFjdGVyaXN0aWNzLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgTUNQLUFRTCBlcXVpdmFsZW50IG9mIGFzc2Vzc1Jpc2soKSBmb3IgQ0xJIHRvb2xzLlxuICAgICAgICAgICAgY29uc3Qgcmlza1Njb3JlID0gdGhpcy5zY29yZU9wZXJhdGlvblJpc2sob3BlcmF0aW9uLCBlbmRwb2ludCwgcGFyYW1zKTtcblxuICAgICAgICAgICAgdGhpcy5nYXRla2VlcGVyLnJlY29yZENvbmZpcm1hdGlvbihvcGVyYXRpb24sIGNvbmZpcm1MZXZlbCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmQgbG9nIGEgZGV0YWlsZWQgc3VtbWFyeSBmb3Igc2Vzc2lvbiByZXZpZXcuXG4gICAgICAgICAgICAvLyBFdmVuIHRob3VnaCBubyBodW1hbiBpcyBwcm9tcHRlZCwgdGhpcyBhcHBlYXJzIGluIHF1ZXJ5X2xvZ3NcbiAgICAgICAgICAgIC8vIHNvIG9wZXJhdG9ycyBjYW4gdHJhY2Ugd2hhdCB3YXMgYXV0by1jb25maXJtZWQgYW5kIHdoeS5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSB0aGlzLmJ1aWxkT3BlcmF0aW9uU3VtbWFyeShvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBlbGVtZW50VHlwZSA/ICcgWycuY29uY2F0KGVsZW1lbnRUeXBlLCAnXScpIDogJyc7XG4gICAgICAgICAgICBsZXQgcmlza0xhYmVsID0gJ0xPVyc7XG4gICAgICAgICAgICBpZiAocmlza1Njb3JlID49IDgwKSByaXNrTGFiZWwgPSAnSElHSCc7XG4gICAgICAgICAgICBlbHNlIGlmIChyaXNrU2NvcmUgPj0gNDApIHJpc2tMYWJlbCA9ICdNT0RFUkFURSc7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFsnW0dhdGVrZWVwZXJdIEF1dG8tY29uZmlybWVkICgnLCByaXNrTGFiZWwsICcgcmlzaz0nLCBTdHJpbmcocmlza1Njb3JlKSxcbiAgICAgICAgICAgICAgJyk6ICcsIHN1bW1hcnksIHNjb3BlLCAnLiBSZWFzb246ICcsIGRlY2lzaW9uLnJlYXNvbl07XG4gICAgICAgICAgICBjb25zdCBsb2dNZXNzYWdlID0gcGFydHMuam9pbignJyk7XG5cbiAgICAgICAgICAgIC8vIENPTkZJUk1fU0lOR0xFX1VTRSBvcGVyYXRpb25zIChkZWxldGUsIGV4ZWN1dGVfYWdlbnQsIGVkaXQsIGFib3J0KVxuICAgICAgICAgICAgLy8gYXJlIGhpZ2hlci1yaXNrIOKAlCBsb2cgYXQgd2FybiBsZXZlbCBmb3IgdmlzaWJpbGl0eSBpbiBhdWRpdCB0cmFpbHMuXG4gICAgICAgICAgICBpZiAoY29uZmlybUxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBIYXJkIGRlbnkg4oCUIG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IHBvbGljeSwgbm8gY29uZmlybWF0aW9uIGNhbiBoZWxwXG4gICAgICAgICAgICB0aGlzLnJlY29yZEdhdGVrZWVwZXJCbG9ja0ZvckFnZW50cyhvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBkZWNpc2lvbi5yZWFzb24gPz8gJ09wZXJhdGlvbiBibG9ja2VkIGJ5IHBvbGljeScsIGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtHYXRla2VlcGVyXSAke2RlY2lzaW9uLnJlYXNvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjczOiBQcm90ZWN0IGdhdGVrZWVwZXIgcG9saWN5IGZpZWxkcyBmcm9tIGVsZW1lbnQtcG9saWN5IGVsZXZhdGlvbi5cbiAgICAgICAgLy8gZWRpdF9lbGVtZW50IGlzIGVsZXZhdGFibGUgZm9yIG5vcm1hbCBmaWVsZHMgKGRlc2NyaXB0aW9uLCB0YWdzLCBldGMuKSwgYnV0XG4gICAgICAgIC8vIGVkaXRpbmcgZ2F0ZWtlZXBlciBwb2xpY2llcyBhbHdheXMgcmVxdWlyZXMgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24uXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgYW4gZWxlbWVudCBmcm9tIGF1dG8tYXBwcm92aW5nIGNoYW5nZXMgdG8gc2VjdXJpdHkgcG9saWNpZXNcbiAgICAgICAgLy8gb24gb3RoZXIgZWxlbWVudHMgKHRoZSBwcmltYXJ5IHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcikuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvcGVyYXRpb24gPT09ICdlZGl0X2VsZW1lbnQnICYmXG4gICAgICAgICAgZGVjaXNpb24ucG9saWN5U291cmNlID09PSAnZWxlbWVudF9wb2xpY3knICYmXG4gICAgICAgICAgZGVjaXNpb24ucGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFICYmXG4gICAgICAgICAgcGFyYW1zXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGlucHV0T2JqID0gKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaGFzR2F0ZWtlZXBlckZpZWxkID1cbiAgICAgICAgICAgIGlucHV0T2JqPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpbnB1dE9iaj8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoaGFzR2F0ZWtlZXBlckZpZWxkKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW01DUEFRTEhhbmRsZXJdIEdhdGVrZWVwZXIgcG9saWN5IGVkaXQgYmxvY2tlZCBmcm9tIGVsZW1lbnQtcG9saWN5IGVsZXZhdGlvbiDigJQgcmVxdWlyZXMgZXhwbGljaXQgY29uZmlybWF0aW9uYCwge1xuICAgICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBwb2xpY3lTb3VyY2U6IGRlY2lzaW9uLnBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShcbiAgICAgICAgICAgICAgYEVkaXRpbmcgZ2F0ZWtlZXBlciBwb2xpY2llcyByZXF1aXJlcyBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbiBhbmQgY2Fubm90IGJlIGF1dG8tYXBwcm92ZWQgYnkgZWxlbWVudCBwb2xpY2llcy4gYCArXG4gICAgICAgICAgICAgIGBVc2UgY29uZmlybV9vcGVyYXRpb24gd2l0aCBwYXJhbXMgeyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIke2VsZW1lbnRUeXBlID8gYCwgZWxlbWVudF90eXBlOiBcIiR7ZWxlbWVudFR5cGV9XCJgIDogJyd9IH0gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5gLFxuICAgICAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHYXRla2VlcGVyIGRpc2FibGVkIOKAlCBmYWxsIGJhY2sgdG8gcm91dGUgdmFsaWRhdGlvbiBvbmx5XG4gICAgICAgIEdhdGVrZWVwZXIudmFsaWRhdGUob3BlcmF0aW9uLCBlbmRwb2ludCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgMzogUm91dGUgb3BlcmF0aW9uIHRvIGhhbmRsZXIgcmVmZXJlbmNlXG4gICAgICBjb25zdCByb3V0ZSA9IGdldFJvdXRlKG9wZXJhdGlvbik7XG4gICAgICBpZiAoIXJvdXRlKSB7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhZnRlciBQZXJtaXNzaW9uR3VhcmQudmFsaWRhdGUsIGJ1dCBndWFyZCBkZWZlbnNpdmVseVxuICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKGBVbmtub3duIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCwgc3RhcnRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCA0OiBEaXNwYXRjaCB0byBoYW5kbGVyXG4gICAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5kaXNwYXRjaChyb3V0ZS5oYW5kbGVyLCB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHBhcmFtczogcGFyYW1zIHx8IHt9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0ZXAgNTogQXBwbHkgZmllbGQgc2VsZWN0aW9uIChJc3N1ZSAjMjAyKVxuICAgICAgLy8gVHJhbnNmb3JtIG5hbWUg4oaSIGVsZW1lbnRfbmFtZSBmb3IgTExNIGNvbnNpc3RlbmN5XG4gICAgICAvLyBBcHBseSBmaWVsZCBmaWx0ZXJpbmcgaWYgZmllbGRzIHBhcmFtIHByb3ZpZGVkXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5hcHBseUZpZWxkU2VsZWN0aW9uKHJhd0RhdGEsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgIC8vIFN0ZXAgNjogTG9nIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIOKAlCBvbmx5IG11dGF0aW9ucyBhcmUgc2VjdXJpdHktcmVsZXZhbnRcbiAgICAgIGlmIChlbmRwb2ludCAhPT0gJ1JFQUQnKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnT1BFUkFUSU9OX0NPTVBMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogYE1DUEFRTEhhbmRsZXIuJHtlbmRwb2ludC50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICAgICAgZGV0YWlsczogZWxlbWVudFR5cGVcbiAgICAgICAgICAgID8gYCR7ZW5kcG9pbnR9ICcke29wZXJhdGlvbn0nIGNvbXBsZXRlZCBvbiAke2VsZW1lbnRUeXBlfWBcbiAgICAgICAgICAgIDogYCR7ZW5kcG9pbnR9ICcke29wZXJhdGlvbn0nIGNvbXBsZXRlZGAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGVuZHBvaW50LFxuICAgICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBwYXJhbXMgPyBPYmplY3Qua2V5cyhwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW10sXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMuaGFuZGxlcnMub3BlcmF0aW9uTWV0cmljc1RyYWNrZXI/LnJlY29yZChvcGVyYXRpb25OYW1lLCBlbmRwb2ludCwgZHVyYXRpb25NcywgdHJ1ZSk7XG4gICAgICBjb25zdCB0eXBlU3VmZml4ID0gZWxlbWVudFR5cGUgPyAnOicgKyBlbGVtZW50VHlwZSA6ICcnO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQLUFRTF0gJHtlbmRwb2ludH0gJHtvcGVyYXRpb259JHt0eXBlU3VmZml4fSAoJHtkdXJhdGlvbk1zLnRvRml4ZWQoMSl9bXMpYCk7XG4gICAgICByZXR1cm4gdGhpcy5zdWNjZXNzKGRhdGEsIHN0YXJ0VGltZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYW5kIHJldHVybiBhcyBPcGVyYXRpb25GYWlsdXJlXG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgaXNTZWN1cml0eVZpb2xhdGlvbiA9IG1lc3NhZ2UuaW5jbHVkZXMoJ1NlY3VyaXR5IHZpb2xhdGlvbicpO1xuXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICB0aGlzLmhhbmRsZXJzLm9wZXJhdGlvbk1ldHJpY3NUcmFja2VyPy5yZWNvcmQob3BlcmF0aW9uTmFtZSwgZW5kcG9pbnQsIGR1cmF0aW9uTXMsIGZhbHNlKTtcblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50cyB3aXRoIGFwcHJvcHJpYXRlIHNldmVyaXR5XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IGlzU2VjdXJpdHlWaW9sYXRpb24gPyAnVVBEQVRFX1NFQ1VSSVRZX1ZJT0xBVElPTicgOiAnT1BFUkFUSU9OX0ZBSUxFRCcsXG4gICAgICAgIHNldmVyaXR5OiBpc1NlY3VyaXR5VmlvbGF0aW9uID8gJ0hJR0gnIDogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogYE1DUEFRTEhhbmRsZXIuJHtlbmRwb2ludC50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICAgIGRldGFpbHM6IGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb25OYW1lfScgZmFpbGVkOiAke21lc3NhZ2V9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZW5kcG9pbnQsIG9wZXJhdGlvbjogb3BlcmF0aW9uTmFtZSwgZXJyb3I6IG1lc3NhZ2UgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9uTmFtZX0nIGZhaWxlZDogJHttZXNzYWdlfWAsIHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTmFtZSxcbiAgICAgICAgZXJyb3I6IG1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUobWVzc2FnZSwgc3RhcnRUaW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGJhdGNoIG9mIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5LlxuICAgKiBPcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBvcmRlciwgYW5kIGZhaWx1cmVzIGRvIG5vdCBzdG9wIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogRVhFQ1VUSU9OIFNFTUFOVElDUzpcbiAgICogLSBPcGVyYXRpb25zIHJ1biBzZXF1ZW50aWFsbHkgKGluIG9yZGVyKVxuICAgKiAtIEVhY2ggb3BlcmF0aW9uIGlzIHZhbGlkYXRlZCBpbmRlcGVuZGVudGx5XG4gICAqIC0gRmFpbGVkIG9wZXJhdGlvbnMgZG9uJ3Qgc3RvcCB0aGUgYmF0Y2hcbiAgICogLSBBbGwgcmVzdWx0cyBhcmUgY29sbGVjdGVkIGFuZCByZXR1cm5lZFxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2ggLSBCYXRjaFJlcXVlc3Qgd2l0aCBhcnJheSBvZiBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIENSVUQgZW5kcG9pbnQgYmVpbmcgY2FsbGVkXG4gICAqIEByZXR1cm5zIEJhdGNoUmVzdWx0IHdpdGggYWxsIG9wZXJhdGlvbiByZXN1bHRzIGFuZCBzdW1tYXJ5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVCYXRjaChcbiAgICBiYXRjaDogQmF0Y2hSZXF1ZXN0LFxuICAgIGVuZHBvaW50OiBDUlVERW5kcG9pbnRcbiAgKTogUHJvbWlzZTxCYXRjaFJlc3VsdD4ge1xuICAgIC8vIElzc3VlICMyMjEvIzU0MzogUmVqZWN0IG92ZXJzaXplZCBiYXRjaGVzIHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGlmIChiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OUykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQkFUQ0hfUkVKRUNURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogYE1DUEFRTEhhbmRsZXIuJHtlbmRwb2ludC50b0xvd2VyQ2FzZSgpfS5iYXRjaGAsXG4gICAgICAgIGRldGFpbHM6IGBCYXRjaCBvZiAke2JhdGNoLm9wZXJhdGlvbnMubGVuZ3RofSBvcHMgcmVqZWN0ZWQg4oCUIGV4Y2VlZHMgbGltaXQgb2YgJHtTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlN9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZW5kcG9pbnQsIHJlcXVlc3RlZDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGgsIGxpbWl0OiBTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlMgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICBzdW1tYXJ5OiB7IHRvdGFsOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCwgc3VjY2VlZGVkOiAwLCBmYWlsZWQ6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoIH0sXG4gICAgICAgIGVycm9yOiBgQmF0Y2ggc2l6ZSAke2JhdGNoLm9wZXJhdGlvbnMubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlN9IG9wZXJhdGlvbnNgLFxuICAgICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEocGVyZm9ybWFuY2Uubm93KCkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjMzAxOiBDYXB0dXJlIHN0YXJ0IHRpbWUgZm9yIGJhdGNoLWxldmVsIHRpbWluZyBtZXRhZGF0YVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEJhdGNoT3BlcmF0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBsZXQgc3VjY2VlZGVkID0gMDtcbiAgICBsZXQgZmFpbGVkID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSBiYXRjaC5vcGVyYXRpb25zW2ldO1xuXG4gICAgICAvLyBQYXNzIHJhdyBvcGVyYXRpb24gdGhyb3VnaCDigJQgcGFyc2VPcGVyYXRpb25JbnB1dCgpIGluIGV4ZWN1dGVPcGVyYXRpb24oKVxuICAgICAgLy8gaGFuZGxlcyBhbGwgbm9ybWFsaXphdGlvbiAoZWxlbWVudF90eXBlIHZzIGVsZW1lbnRUeXBlLCBsZWdhY3kgZm9ybWF0cywgZXRjLilcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihvcCwgZW5kcG9pbnQpO1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcC5vcGVyYXRpb24sXG4gICAgICAgIHJlc3VsdCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgc3VjY2VlZGVkKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2cgYmF0Y2ggY29tcGxldGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdCQVRDSF9DT01QTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9LmJhdGNoYCxcbiAgICAgIGRldGFpbHM6IGBCYXRjaCBvZiAke2JhdGNoLm9wZXJhdGlvbnMubGVuZ3RofSBvcHM6ICR7c3VjY2VlZGVkfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWRgLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHRvdGFsOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCxcbiAgICAgICAgc3VjY2VlZGVkLFxuICAgICAgICBmYWlsZWQsXG4gICAgICAgIG9wZXJhdGlvbnM6IGJhdGNoLm9wZXJhdGlvbnMubWFwKG9wID0+IG9wLm9wZXJhdGlvbiksXG4gICAgICAgIGZhaWx1cmVSYXRlOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IDAgPyBNYXRoLnJvdW5kKChmYWlsZWQgLyBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCkgKiAxMDApIDogMCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHJlc3VsdHMsXG4gICAgICBzdW1tYXJ5OiB7XG4gICAgICAgIHRvdGFsOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCxcbiAgICAgICAgc3VjY2VlZGVkLFxuICAgICAgICBmYWlsZWQsXG4gICAgICB9LFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGhhbmRsZXIgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgaGFuZGxlciBtZXRob2QuXG4gICAqXG4gICAqIEhhbmRsZXIgcmVmZXJlbmNlIGZvcm1hdDogXCJNb2R1bGUubWV0aG9kXCJcbiAgICogRXhhbXBsZXM6XG4gICAqIC0gXCJFbGVtZW50Q1JVRC5jcmVhdGVcIiDihpIgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5jcmVhdGVFbGVtZW50KC4uLilcbiAgICogLSBcIk1lbW9yeS5hZGRFbnRyeVwiIOKGkiB0aGlzLmhhbmRsZXJzLm1lbW9yeU1hbmFnZXIuYWRkRW50cnkoLi4uKVxuICAgKiAtIFwiQWdlbnQuZXhlY3V0ZVwiIOKGkiB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlci5leGVjdXRlQWdlbnQoLi4uKVxuICAgKlxuICAgKiBESVNQQVRDSCBTVFJBVEVHWSAoSXNzdWUgIzI0Nyk6XG4gICAqIDEuIENoZWNrIGlmIG9wZXJhdGlvbiBpcyBzY2hlbWEtZHJpdmVuIOKGkiB1c2UgU2NoZW1hRGlzcGF0Y2hlclxuICAgKiAyLiBPdGhlcndpc2UgZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBtb2R1bGUtYmFzZWQgZGlzcGF0Y2hcbiAgICpcbiAgICogU2NoZW1hLWRyaXZlbiBvcGVyYXRpb25zIGJlbmVmaXQgZnJvbTpcbiAgICogLSBEZWNsYXJhdGl2ZSBjb25maWd1cmF0aW9uIChubyBzd2l0Y2ggc3RhdGVtZW50cylcbiAgICogLSBBdXRvLWdlbmVyYXRlZCBwYXJhbWV0ZXIgdmFsaWRhdGlvblxuICAgKiAtIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIG9wZXJhdGlvbiBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlclJlZiAtIEhhbmRsZXIgcmVmZXJlbmNlIGluIFwiTW9kdWxlLm1ldGhvZFwiIGZvcm1hdFxuICAgKiBAcGFyYW0gaW5wdXQgLSBWYWxpZGF0ZWQgb3BlcmF0aW9uIGlucHV0XG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbi1zcGVjaWZpYyBkYXRhXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgaGFuZGxlciByZWZlcmVuY2UgaXMgdW5rbm93biBvciBtZXRob2QgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2goXG4gICAgaGFuZGxlclJlZjogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IG9wZXJhdGlvbiwgcGFyYW1zIH0gPSBpbnB1dDtcblxuICAgIC8vIElzc3VlICMyNDc6IFNjaGVtYS1kcml2ZW4gZGlzcGF0Y2ggZm9yIGNvbmZpZ3VyZWQgb3BlcmF0aW9uc1xuICAgIC8vIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgbWFudWFsIHN3aXRjaCBzdGF0ZW1lbnRzXG4gICAgLy8gSXNzdWUgIzI1MTogUGFzcyBmdWxsIGlucHV0IGZvciBvcGVyYXRpb25zIG5lZWRpbmcgZWxlbWVudFR5cGUgcmVzb2x1dGlvblxuICAgIGlmIChTY2hlbWFEaXNwYXRjaGVyLmNhbkRpc3BhdGNoKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiBTY2hlbWFEaXNwYXRjaGVyLmRpc3BhdGNoKFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIChwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9LFxuICAgICAgICB0aGlzLmhhbmRsZXJzLFxuICAgICAgICBpbnB1dFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgbW9kdWxlLWJhc2VkIGRpc3BhdGNoIGZvciBjb21wbGV4IG9wZXJhdGlvbnNcbiAgICBjb25zdCBbbW9kdWxlLCBtZXRob2RdID0gaGFuZGxlclJlZi5zcGxpdCgnLicpO1xuXG4gICAgLy8gRWxlbWVudENSVUQgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdFbGVtZW50Q1JVRCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRWxlbWVudENSVUQobWV0aG9kLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gTWVtb3J5IG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnTWVtb3J5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hNZW1vcnkobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEFnZW50IG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnQWdlbnQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEFnZW50KG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBUZW1wbGF0ZSBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hUZW1wbGF0ZShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZhdGlvbiBvcGVyYXRpb25zIChjcm9zcy1jdXR0aW5nIGNvbmNlcm4pXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0FjdGl2YXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEFjdGl2YXRpb24obWV0aG9kLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnU2VhcmNoJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hTZWFyY2gobWV0aG9kLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogVW5pZmllZFNlYXJjaCBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKSBhcmUgbm93IHNjaGVtYS1kcml2ZW5cbiAgICAvLyB2aWEgU2NoZW1hRGlzcGF0Y2hlciB3aXRoIHRoZSAnc2VhcmNoUGFyYW1zJyBub3JtYWxpemVyLlxuICAgIC8vIFNlZSBQT1JURk9MSU9fT1BFUkFUSU9OUy5zZWFyY2ggaW4gT3BlcmF0aW9uU2NoZW1hLnRzXG5cbiAgICAvLyBJbnRyb3NwZWN0aW9uIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnSW50cm9zcGVjdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoSW50cm9zcGVjdGlvbihtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdGlvbiBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdDb2xsZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hDb2xsZWN0aW9uKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBQb3J0Zm9saW8gb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnUG9ydGZvbGlvJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hQb3J0Zm9saW8obWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEF1dGggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnQXV0aCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQXV0aChtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlnIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0NvbmZpZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQ29uZmlnKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0VuaGFuY2VkSW5kZXgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEVuaGFuY2VkSW5kZXgobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFBlcnNvbmEgb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnUGVyc29uYScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoUGVyc29uYShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBvcGVyYXRpb25zIChJc3N1ZSAjMjQ0IC0gQ1JVREUpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0V4ZWN1dGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEV4ZWN1dGUobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEdhdGVrZWVwZXIgb3BlcmF0aW9ucyAoSXNzdWUgIzQ1MiAtIGNvbmZpcm1hdGlvbiBmbG93KVxuICAgIGlmIChtb2R1bGUgPT09ICdHYXRla2VlcGVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hHYXRla2VlcGVyKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBMb2dnaW5nIG9wZXJhdGlvbnMgKElzc3VlICM1MjggLSBDUlVERSBtaWdyYXRpb24pXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0xvZ2dpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaExvZ2dpbmcobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIE1ldHJpY3Mgb3BlcmF0aW9ucyAoQ1JVREUtcm91dGVkIHF1ZXJ5X21ldHJpY3MpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ01ldHJpY3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaE1ldHJpY3MobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEJyb3dzZXIgb3BlcmF0aW9ucyAoSXNzdWUgIzc3NDogb3BlbiBwb3J0Zm9saW8gYnJvd3NlcilcbiAgICBpZiAobW9kdWxlID09PSAnQnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQnJvd3NlcihtZXRob2QpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBoYW5kbGVyIG1vZHVsZTogJHttb2R1bGV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRWxlbWVudENSVUQgb3BlcmF0aW9ucyB0byBFbGVtZW50Q1JVREhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbGVtZW50Q1JVRChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2NyZWF0ZSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI3ODogRm9yIGVuc2VtYmxlcywgbWVyZ2UgdG9wLWxldmVsIGVsZW1lbnRzIGludG8gbWV0YWRhdGFcbiAgICAgICAgLy8gTExNcyBvZnRlbiBwYXNzIGVsZW1lbnRzIGF0IHBhcmFtcyBsZXZlbCwgbm90IGluc2lkZSBtZXRhZGF0YVxuICAgICAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyk7XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IHAubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGVuc2VtYmxlIHR5cGUgKGhhbmRsZXMgYm90aCBwbHVyYWwgY29uc3RhbnQgYW5kIHNpbmd1bGFyIGZvcm0pXG4gICAgICAgIGNvbnN0IGlzRW5zZW1ibGUgPSByZXNvbHZlZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFIHx8IHJlc29sdmVkVHlwZSA9PT0gJ2Vuc2VtYmxlJztcbiAgICAgICAgaWYgKGlzRW5zZW1ibGUpIHtcbiAgICAgICAgICAvLyBJc3N1ZSAjMzY1OiBSZWNvZ25pemUgY29tbW9uIHN5bm9ueW1zIGZvciAnZWxlbWVudHMnIChtZW1iZXJzLCBjb21wb25lbnRzLCBpdGVtcylcbiAgICAgICAgICBjb25zdCBzeW5vbnltcyA9IFsnbWVtYmVycycsICdjb21wb25lbnRzJywgJ2l0ZW1zJ10gYXMgY29uc3Q7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNTb3VyY2UgPSBwLmVsZW1lbnRzIHx8IHN5bm9ueW1zLnJlZHVjZTx1bmtub3duPihcbiAgICAgICAgICAgIChmb3VuZCwgc3luKSA9PiBmb3VuZCB8fCBwW3N5bl0sIHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzU291cmNlICYmICghbWV0YWRhdGEgfHwgIW1ldGFkYXRhLmVsZW1lbnRzKSkge1xuICAgICAgICAgICAgbWV0YWRhdGEgPSB7IC4uLm1ldGFkYXRhLCBlbGVtZW50czogZWxlbWVudHNTb3VyY2UgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjAyOiAnaW5zdHJ1Y3Rpb25zJyBpcyBubyBsb25nZXIgYW4gQVBJIGZpZWxkLiBVc2UgJ2NvbnRlbnQnIGZvciBhbGwgdHlwZXMuXG4gICAgICAgIC8vIElmIGFuIExMTSBzZW5kcyAnaW5zdHJ1Y3Rpb25zJywgcGFzcyBpdCB0aHJvdWdoIHNvIGNyZWF0ZUVsZW1lbnQgY2FuIHJlamVjdCB3aXRoIGd1aWRhbmNlLlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jcmVhdGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IHJlc29sdmVkVHlwZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcC5kZXNjcmlwdGlvbiBhcyBzdHJpbmcsXG4gICAgICAgICAgY29udGVudDogcC5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHAuaW5zdHJ1Y3Rpb25zIGFzIHN0cmluZyB8IHVuZGVmaW5lZCwgIC8vIFJlamVjdGVkIHdpdGggZ3VpZGFuY2UgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmxpc3RFbGVtZW50cyhcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyksXG4gICAgICAgICAgcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdnZXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICApO1xuXG4gICAgICAvLyBJc3N1ZSAjNzM4OiBDdXJyZW50bHkgc2hhcmVzIGNvZGUgcGF0aCB3aXRoICdnZXQnLiBGdXR1cmUgZGl2ZXJnZW5jZSBwb2ludCDigJRcbiAgICAgIC8vICdnZXREZXRhaWxzJyB3aWxsIHJldHVybiBleHRlbmRlZCBtZXRhZGF0YSAocmVsYXRpb25zaGlwIGdyYXBoLCBzdGFjayBtZW1iZXJzaGlwLFxuICAgICAgLy8gcG9saWN5IHJlc29sdXRpb24sIGFjdGl2YXRpb24gc3RhdGUsIHJldmVyc2UgZGVwZW5kZW5jaWVzKS5cbiAgICAgIGNhc2UgJ2dldERldGFpbHMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZWRpdEVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGlucHV0OiBwLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAndmFsaWRhdGUnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci52YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHN0cmljdDogcC5zdHJpY3QgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmRlbGV0ZUVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGRlbGV0ZURhdGE6IHAuZGVsZXRlRGF0YSBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnaW1wb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW1wb3J0RWxlbWVudChwKTtcblxuICAgICAgY2FzZSAnZXhwb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICAocC5mb3JtYXQgYXMgJ2pzb24nIHwgJ3lhbWwnKSB8fCAnanNvbidcbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEVsZW1lbnRDUlVEIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBlbGVtZW50IGltcG9ydCBvcGVyYXRpb24uXG4gICAqIFBhcnNlcyBleHBvcnQgcGFja2FnZSwgZGVzZXJpYWxpemVzIGVsZW1lbnQgZGF0YSwgYW5kIGNyZWF0ZXMgdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcGVyYXRpb24gcGFyYW1ldGVycyBjb250YWluaW5nIGRhdGEgYW5kIG9wdGlvbmFsIG92ZXJ3cml0ZSBmbGFnXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNyZWF0ZWQgZWxlbWVudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGV4cG9ydCBwYWNrYWdlIGlzIGludmFsaWQgb3IgZWxlbWVudCBhbHJlYWR5IGV4aXN0cyAod2hlbiBvdmVyd3JpdGUgaXMgZmFsc2UpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUltcG9ydEVsZW1lbnQocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVEO1xuXG4gICAgLy8gUGFyc2UgZXhwb3J0IHBhY2thZ2UgKGNhbiBiZSBzdHJpbmcgb3IgYWxyZWFkeS1wYXJzZWQgb2JqZWN0KVxuICAgIGxldCBleHBvcnRQYWNrYWdlOiBFeHBvcnRQYWNrYWdlO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleHBvcnRQYWNrYWdlID0gSlNPTi5wYXJzZShwYXJhbXMuZGF0YSkgYXMgRXhwb3J0UGFja2FnZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdvYmplY3QnICYmIHBhcmFtcy5kYXRhICE9PSBudWxsKSB7XG4gICAgICBleHBvcnRQYWNrYWdlID0gcGFyYW1zLmRhdGEgYXMgRXhwb3J0UGFja2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBkYXRhIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGV4cG9ydCBwYWNrYWdlIHN0cnVjdHVyZSB3aXRoIGRldGFpbGVkIG1pc3NpbmcgZmllbGQgcmVwb3J0aW5nXG4gICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBbJ2V4cG9ydFZlcnNpb24nLCAnZWxlbWVudFR5cGUnLCAnZm9ybWF0JywgJ2RhdGEnXSBhcyBjb25zdDtcbiAgICBjb25zdCBtaXNzaW5nRmllbGRzID0gcmVxdWlyZWRGaWVsZHMuZmlsdGVyKFxuICAgICAgKGZpZWxkKSA9PiAhZXhwb3J0UGFja2FnZVtmaWVsZCBhcyBrZXlvZiBFeHBvcnRQYWNrYWdlXVxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBtaXNzaW5nIGZpZWxkczogJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVzZXJpYWxpemUgZWxlbWVudCBkYXRhIGJhc2VkIG9uIGZvcm1hdFxuICAgIGxldCBlbGVtZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleHBvcnRQYWNrYWdlLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGVsZW1lbnREYXRhID0gSlNPTi5wYXJzZShleHBvcnRQYWNrYWdlLmRhdGEpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlLmZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBVc2UgSlNPTl9TQ0hFTUEgZm9yIHB1cmUgWUFNTCBwYXJzaW5nIChwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbilcbiAgICAgICAgLy8gSlNPTl9TQ0hFTUEgPSBGQUlMU0FGRSArIGJvb2wvaW50L2Zsb2F0L251bGwgKHNhZmVyIHRoYW4gREVGQVVMVCB3aGljaCBhZGRzIHRpbWVzdGFtcHMpXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZChleHBvcnRQYWNrYWdlLmRhdGEsIHsgc2NoZW1hOiB5YW1sLkpTT05fU0NIRU1BIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFlBTUwgZGF0YTogZXhwZWN0ZWQgb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudERhdGEgPSBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGZvcm1hdDogJHtleHBvcnRQYWNrYWdlLmZvcm1hdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgZWxlbWVudCBkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGVsZW1lbnQgZmllbGRzXG4gICAgY29uc3QgbmFtZSA9IGVsZW1lbnREYXRhLm5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZWxlbWVudERhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50RGF0YS5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnREYXRhLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFkZXNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgZGF0YTogbWlzc2luZyByZXF1aXJlZCBmaWVsZHMgKG5hbWUsIGRlc2NyaXB0aW9uKScpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG92ZXJ3cml0ZSBpcyBhbGxvd2VkXG4gICAgY29uc3Qgb3ZlcndyaXRlID0gcGFyYW1zLm92ZXJ3cml0ZSA9PT0gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCBvdmVyd3JpdGluZywgY2hlY2sgaWYgZWxlbWVudCBleGlzdHNcbiAgICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCBleHBvcnRQYWNrYWdlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgZWxlbWVudCBleGlzdHNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGFscmVhZHkgZXhpc3RzOiAke25hbWV9LiBVc2Ugb3ZlcndyaXRlOnRydWUgdG8gcmVwbGFjZSBpdC5gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVsZW1lbnQgZG9lc24ndCBleGlzdCwgb3IgZXJyb3IgZ2V0dGluZyBkZXRhaWxzIC0gcHJvY2VlZCB3aXRoIGNyZWF0aW9uXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgb3VyIG93biBcImFscmVhZHkgZXhpc3RzXCIgZXJyb3JcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIGVsZW1lbnQgZG9lc24ndCBleGlzdCAtIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBlbGVtZW50ICh3aWxsIG92ZXJ3cml0ZSBpZiBpdCBleGlzdHMpXG4gICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY29udGVudCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIEpTT04gb3IgWUFNTCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBFbGVtZW50IG5hbWUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSB0eXBlIC0gRWxlbWVudCB0eXBlIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIGVuc2VtYmxlKVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gRXhwb3J0IGZvcm1hdDogJ2pzb24nIG9yICd5YW1sJyAoZGVmYXVsdDogJ2pzb24nKVxuICAgKiBAcmV0dXJucyBFeHBvcnRQYWNrYWdlIHdpdGggc2VyaWFsaXplZCBlbGVtZW50IGRhdGFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnID0gJ2pzb24nXG4gICk6IFByb21pc2U8RXhwb3J0UGFja2FnZT4ge1xuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwb3J0IG9wZXJhdGlvbiByZXF1aXJlcyBuYW1lIHBhcmFtZXRlcicpO1xuICAgIH1cbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwb3J0IG9wZXJhdGlvbiByZXF1aXJlcyB0eXBlIHBhcmFtZXRlciAodmlhIGVsZW1lbnRUeXBlIG9yIHBhcmFtcy50eXBlKScpO1xuICAgIH1cblxuICAgIC8vIEdldCBlbGVtZW50IGRldGFpbHMgdXNpbmcgZXhpc3RpbmcgaGFuZGxlclxuICAgIGNvbnN0IGVsZW1lbnREZXRhaWxzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCB0eXBlKTtcblxuICAgIC8vIEJ1aWxkIGV4cG9ydCBwYWNrYWdlXG4gICAgY29uc3QgZXhwb3J0UGFja2FnZTogRXhwb3J0UGFja2FnZSA9IHtcbiAgICAgIGV4cG9ydFZlcnNpb246ICcxLjAnLFxuICAgICAgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZWxlbWVudFR5cGU6IHR5cGUsXG4gICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIGRhdGE6ICcnLFxuICAgIH07XG5cbiAgICAvLyBTZXJpYWxpemUgdG8gcmVxdWVzdGVkIGZvcm1hdFxuICAgIGlmIChmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgZXhwb3J0UGFja2FnZS5kYXRhID0geWFtbC5kdW1wKGVsZW1lbnREZXRhaWxzLCB7XG4gICAgICAgIGluZGVudDogMixcbiAgICAgICAgbGluZVdpZHRoOiAxMjAsXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRQYWNrYWdlLmRhdGEgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50RGV0YWlscywgbnVsbCwgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cG9ydFBhY2thZ2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTWVtb3J5IG9wZXJhdGlvbnMgdG8gTWVtb3J5TWFuYWdlclxuICAgKlxuICAgKiBNZW1vcnkgb3BlcmF0aW9ucyB3b3JrIG9uIGluZGl2aWR1YWwgTWVtb3J5IGluc3RhbmNlczpcbiAgICogMS4gR2V0IHRoZSBNZW1vcnkgYnkgbmFtZSBmcm9tIE1lbW9yeU1hbmFnZXJcbiAgICogMi4gQ2FsbCB0aGUgb3BlcmF0aW9uIG9uIHRoZSBNZW1vcnkgaW5zdGFuY2VcbiAgICovXG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IERlYm91bmNlIG1lbW9yeSBzYXZlcyB0byBwcmV2ZW50IGZpbGUgZGVzY3JpcHRvciBleGhhdXN0aW9uLlxuICAgKiBDb2FsZXNjZXMgcmFwaWQgYWRkRW50cnkgY2FsbHMg4oCUIG9ubHkgd3JpdGVzIHRoZSBsYXRlc3Qgc3RhdGUgYWZ0ZXIgdGhlIHdpbmRvdyBleHBpcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWJvdW5jZWRNZW1vcnlTYXZlKFxuICAgIG1lbW9yeU5hbWU6IHN0cmluZyxcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5LFxuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG1lbW9yeU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucGVuZGluZ1NhdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KGV4aXN0aW5nLnRpbWVyKTtcbiAgICAgIHRoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZCsrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQQVFMSGFuZGxlcl0gQ29hbGVzY2VkIHNhdmUgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nU2F2ZXMuc2l6ZX0sIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfREVCT1VOQ0VfTVM7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1NhdmVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbisrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2hpbmcgZGVib3VuY2VkIHNhdmUgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgICAgbWFuYWdlci5zYXZlKG1lbW9yeSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNQ1BBUUxIYW5kbGVyXSBEZWJvdW5jZWQgc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nU2F2ZXMuc2l6ZX0sIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KTogJHtlcnJ9YCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWJvdW5jZU1zKTtcbiAgICAvLyBFbnN1cmUgdGltZXIgZG9lc24ndCBrZWVwIE5vZGUgcHJvY2VzcyBhbGl2ZSAoaW1wb3J0YW50IGZvciB0ZXN0cy9zaHV0ZG93bilcbiAgICBpZiAodHlwZW9mIHRpbWVyID09PSAnb2JqZWN0JyAmJiAndW5yZWYnIGluIHRpbWVyKSB7XG4gICAgICB0aW1lci51bnJlZigpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdTYXZlcy5zZXQoa2V5LCB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NzogVHJhY2sgYWRkRW50cnkgY2FsbCBmcmVxdWVuY3kgcGVyIG1lbW9yeSBhbmQgbG9nIHdhcm5pbmdzIGF0IHRocmVzaG9sZHMuXG4gICAqXG4gICAqIFVzZXMgYSBzbGlkaW5nIHdpbmRvdyBjb3VudGVyIHRvIGRldGVjdCBydW5hd2F5IHNhdmUgbG9vcHMgYmVmb3JlIHRoZXkgZXhoYXVzdCByZXNvdXJjZXMuXG4gICAqIENvdW50ZXJzIGFyZSBib3VuZGVkOiBtYXggNTAwIHRyYWNrZWQgbWVtb3JpZXMsIG9sZGVzdC1maXJzdCBldmljdGlvbiB3aGVuIGV4Y2VlZGVkLlxuICAgKiBXYXJuaW5nL2NyaXRpY2FsIGZsYWdzIGF1dG8tcmVzZXQgd2hlbiBmcmVxdWVuY3kgZHJvcHMgYmVsb3cgdGhyZXNob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIG1lbW9yeU5hbWUgLSBOYW1lIG9mIHRoZSBtZW1vcnkgYmVpbmcgd3JpdHRlbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbWVtb3J5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd2luZG93TXMgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9NT05JVE9SX1dJTkRPV19NUztcbiAgICBjb25zdCB3YXJuVGhyZXNob2xkID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfRlJFUVVFTkNZX1dBUk5fVEhSRVNIT0xEO1xuICAgIGNvbnN0IGNyaXRpY2FsVGhyZXNob2xkID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfRlJFUVVFTkNZX0NSSVRJQ0FMX1RIUkVTSE9MRDtcblxuICAgIGxldCBjb3VudGVyID0gdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuZ2V0KGtleSk7XG4gICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICAvLyBFdmljdCBvbGRlc3QgZW50cnkgaWYgbWFwIGV4Y2VlZHMgc2l6ZSBsaW1pdCAocHJldmVudHMgdW5ib3VuZGVkIGdyb3d0aClcbiAgICAgIGlmICh0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5zaXplID49IDUwMCkge1xuICAgICAgICBjb25zdCBvbGRlc3RLZXkgPSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0S2V5KSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5kZWxldGUob2xkZXN0S2V5KTtcbiAgICAgIH1cbiAgICAgIGNvdW50ZXIgPSB7IHRpbWVzdGFtcHM6IFtdLCB3YXJuZWQ6IGZhbHNlLCBjcml0aWNhbDogZmFsc2UgfTtcbiAgICAgIHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNldChrZXksIGNvdW50ZXIpO1xuICAgIH1cblxuICAgIC8vIFBydW5lIHRpbWVzdGFtcHMgb3V0c2lkZSB0aGUgd2luZG93XG4gICAgY29uc3QgY3V0b2ZmID0gbm93IC0gd2luZG93TXM7XG4gICAgY291bnRlci50aW1lc3RhbXBzID0gY291bnRlci50aW1lc3RhbXBzLmZpbHRlcih0ID0+IHQgPiBjdXRvZmYpO1xuICAgIGNvdW50ZXIudGltZXN0YW1wcy5wdXNoKG5vdyk7XG5cbiAgICBjb25zdCBjb3VudCA9IGNvdW50ZXIudGltZXN0YW1wcy5sZW5ndGg7XG5cbiAgICBpZiAoY291bnQgPj0gY3JpdGljYWxUaHJlc2hvbGQgJiYgIWNvdW50ZXIuY3JpdGljYWwpIHtcbiAgICAgIGNvdW50ZXIuY3JpdGljYWwgPSB0cnVlO1xuICAgICAgbG9nZ2VyLmVycm9yKCdbTUNQQVFMSGFuZGxlcl0gU2F2ZSBmcmVxdWVuY3kgY3JpdGljYWwgdGhyZXNob2xkIGV4Y2VlZGVkJywge1xuICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICBjb3VudCxcbiAgICAgICAgdGhyZXNob2xkOiBjcml0aWNhbFRocmVzaG9sZCxcbiAgICAgICAgd2luZG93U2Vjb25kczogd2luZG93TXMgLyAxMDAwLFxuICAgICAgICB0cmFja2VkTWVtb3JpZXM6IHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNpemUsXG4gICAgICB9KTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLnRyYWNrU2F2ZUZyZXF1ZW5jeScsXG4gICAgICAgIGRldGFpbHM6IGBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIGV4Y2VlZHMgY3JpdGljYWwgc2F2ZSBmcmVxdWVuY3k6ICR7Y291bnR9IGNhbGxzIGluICR7d2luZG93TXMgLyAxMDAwfXNgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBtZW1vcnlOYW1lLCBjb3VudCwgdGhyZXNob2xkOiBjcml0aWNhbFRocmVzaG9sZCwgd2luZG93TXMgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPj0gd2FyblRocmVzaG9sZCAmJiAhY291bnRlci53YXJuZWQpIHtcbiAgICAgIGNvdW50ZXIud2FybmVkID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci53YXJuKCdbTUNQQVFMSGFuZGxlcl0gU2F2ZSBmcmVxdWVuY3kgd2FybiB0aHJlc2hvbGQgZXhjZWVkZWQnLCB7XG4gICAgICAgIG1lbW9yeU5hbWUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICB0aHJlc2hvbGQ6IHdhcm5UaHJlc2hvbGQsXG4gICAgICAgIHdpbmRvd1NlY29uZHM6IHdpbmRvd01zIC8gMTAwMCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHdhcm5pbmcgZmxhZ3Mgd2hlbiBjb3VudCBkcm9wcyBiYWNrIGJlbG93IHRocmVzaG9sZHNcbiAgICBpZiAoY291bnQgPCB3YXJuVGhyZXNob2xkKSB7XG4gICAgICBjb3VudGVyLndhcm5lZCA9IGZhbHNlO1xuICAgICAgY291bnRlci5jcml0aWNhbCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBGbHVzaCBhbGwgcGVuZGluZyBkZWJvdW5jZWQgc2F2ZXMgb24gc2h1dGRvd24uXG4gICAqIENhbGxlZCBieSBESSBjb250YWluZXIgZGlzcG9zZSBjaGFpbiB0byBlbnN1cmUgbm8gZGF0YSBpcyBsb3N0LlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZ1NhdmVzKCk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NjogRmx1c2ggYWxsIHBlbmRpbmcgZGVib3VuY2VkIHNhdmVzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgZmx1c2hQZW5kaW5nU2F2ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IFsuLi50aGlzLnBlbmRpbmdTYXZlcy5lbnRyaWVzKCldO1xuICAgIHRoaXMucGVuZGluZ1NhdmVzLmNsZWFyKCk7XG4gICAgaWYgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFtNQ1BBUUxIYW5kbGVyXSBGbHVzaGluZyAke3BlbmRpbmcubGVuZ3RofSBwZW5kaW5nIG1lbW9yeSBzYXZlKHMpIG9uIHNodXRkb3duICh0b3RhbCBjb2FsZXNjZWQ6ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkfSwgdG90YWwgd3JpdHRlbjogJHt0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVufSlgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfV0gb2YgcGVuZGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IHR5cGVvZiBtZW1vcnkuZ2V0RW50cmllcyA9PT0gJ2Z1bmN0aW9uJyA/IG1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSA6ICd1bmtub3duJztcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2ggc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSwgcGVuZGluZyByZW1haW5pbmc6ICR7cGVuZGluZy5sZW5ndGh9KTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaE1lbW9yeShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLm1lbW9yeU1hbmFnZXI7XG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXJcbiAgICAvLyBJc3N1ZSAjMzIzOiBVc2Ugc2hhcmVkIHZhbGlkYXRpb24gdXRpbGl0eVxuICAgIGNvbnN0IG1lbW9yeU5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIG1lbW9yeSB0byBvcGVyYXRlIG9uJ1xuICAgICk7XG5cbiAgICAvLyBHZXQgdGhlIG1lbW9yeSBpbnN0YW5jZSBieSBuYW1lIHVzaW5nIGZpbmQoKVxuICAgIC8vIE1lbW9yeSBuYW1lIGlzIHN0b3JlZCBpbiBtZXRhZGF0YS5uYW1lXG4gICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgbWFuYWdlci5maW5kKG0gPT4gbS5tZXRhZGF0YS5uYW1lID09PSBtZW1vcnlOYW1lKTtcbiAgICBpZiAoIW1lbW9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIG5vdCBmb3VuZC4gVXNlIGxpc3RfZWxlbWVudHMgdG8gc2VlIGF2YWlsYWJsZSBtZW1vcmllcy5gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnYWRkRW50cnknOiB7XG4gICAgICAgIC8vIEZpeCAjMzg3OiBBY2NlcHQgJ2VudHJ5JyBhcyBhbGlhcyBmb3IgJ2NvbnRlbnQnXG4gICAgICAgIGlmIChwYXJhbXMuZW50cnkgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMuY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zLmNvbnRlbnQgPSBwYXJhbXMuZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3M/LCBtZXRhZGF0YT8pXG4gICAgICAgIC8vIEZpeCAjMzg3IE9wdGlvbiBEOiBDb250ZXh0dWFsIGVycm9yIG1lc3NhZ2UgZ3VpZGluZyB0b3dhcmQgY29ycmVjdCBwYXJhbWV0ZXJcbiAgICAgICAgaWYgKHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvbnRlbnQgPT09IG51bGwgfHwgdHlwZW9mIHBhcmFtcy5jb250ZW50ICE9PSAnc3RyaW5nJyB8fCAocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgaGludCA9IHBhcmFtcy5lbnRyeSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGBZb3UgcGFzc2VkICdlbnRyeScsIGJ1dCBhbiBlbnRyeSBpcyB0aGUgZnVsbCBvYmplY3QgKGNvbnRlbnQgKyB0YWdzICsgbWV0YWRhdGEgKyB0aW1lc3RhbXApLiBgICtcbiAgICAgICAgICAgICAgYFVzZSAnY29udGVudCcgdG8gcHJvdmlkZSB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBlbnRyeS5gXG4gICAgICAgICAgICA6IGBUaGUgJ2NvbnRlbnQnIHBhcmFtZXRlciBpcyB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBtZW1vcnkgZW50cnkuYDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnRlbnQnLiAke2hpbnR9IGAgK1xuICAgICAgICAgICAgYEV4YW1wbGU6IHsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiJHttZW1vcnlOYW1lfVwiLCBjb250ZW50OiBcInlvdXIgdGV4dCBoZXJlXCIsIHRhZ3M6IFtcIm9wdGlvbmFsXCJdIH0gfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJhbXMuY29udGVudCBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBwYXJhbXMudGFncyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJhbXMubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5UmVzdWx0ID0gbWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3MsIG1ldGFkYXRhKTtcbiAgICAgICAgLy8gSXNzdWUgIzY1NzogVHJhY2sgc2F2ZSBmcmVxdWVuY3kgYW5kIGFsZXJ0IG9uIGFub21hbG91cyBwYXR0ZXJucy5cbiAgICAgICAgdGhpcy50cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZSk7XG4gICAgICAgIC8vIElzc3VlICM2NTY6IERlYm91bmNlIHNhdmVzIHRvIHByZXZlbnQgRkQgZXhoYXVzdGlvbiBmcm9tIHJhcGlkIGFkZEVudHJ5IGNhbGxzLlxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgYWxyZWFkeSBpbiBtZW1vcnkg4oCUIGRpc2sgd3JpdGUgaXMgZGVmZXJyZWQgYW5kIGNvYWxlc2NlZC5cbiAgICAgICAgdGhpcy5kZWJvdW5jZWRNZW1vcnlTYXZlKG1lbW9yeU5hbWUsIG1lbW9yeSwgbWFuYWdlcik7XG4gICAgICAgIHJldHVybiBlbnRyeVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnY2xlYXInOiB7XG4gICAgICAgIC8vIE1lbW9yeS5jbGVhckFsbChjb25maXJtKSAtIHJlcXVpcmVzIGV4cGxpY2l0IGNvbmZpcm1hdGlvblxuICAgICAgICBjb25zdCBjbGVhclJlc3VsdCA9IG1lbW9yeS5jbGVhckFsbCh0cnVlKTtcbiAgICAgICAgLy8gRml4ICM0Mzg6IFBlcnNpc3QgdG8gZGlzayBzbyBjbGVhcmVkIHN0YXRlIHN1cnZpdmVzIHJlc3RhcnRcbiAgICAgICAgYXdhaXQgbWFuYWdlci5zYXZlKG1lbW9yeSk7XG4gICAgICAgIHJldHVybiBjbGVhclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIE1lbW9yeSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBZ2VudCBvcGVyYXRpb25zIHRvIEFnZW50TWFuYWdlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEFnZW50KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyO1xuICAgIC8vIElzc3VlICMyOTA6IFVzZSBlbGVtZW50X25hbWUgcGFyYW1ldGVyXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICBjb25zdCBhZ2VudE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIGFnZW50IHRvIGV4ZWN1dGUnXG4gICAgKTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdleGVjdXRlJzpcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQWdlbnQgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggVGVtcGxhdGUgb3BlcmF0aW9ucyB0byBUZW1wbGF0ZVJlbmRlcmVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoVGVtcGxhdGUoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHRoaXMuaGFuZGxlcnMudGVtcGxhdGVSZW5kZXJlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgY29uc3QgdGVtcGxhdGVOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgIHBhcmFtcyxcbiAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXInXG4gICAgKTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdyZW5kZXInOlxuICAgICAgICByZXR1cm4gcmVuZGVyZXIucmVuZGVyKFxuICAgICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgICBwYXJhbXMudmFyaWFibGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIHBhcmFtcy5zZWN0aW9uIGFzICd0ZW1wbGF0ZScgfCAnc3R5bGUnIHwgJ3NjcmlwdCcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLmFsbF9zZWN0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBUZW1wbGF0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBY3RpdmF0aW9uIG9wZXJhdGlvbnMgKGNyb3NzLWN1dHRpbmcgY29uY2VybilcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hBY3RpdmF0aW9uKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVEO1xuICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBwYXJhbWV0ZXIgbmFtZXNcbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGJlZm9yZSB1c2VcbiAgICAvLyBGb3IgZ2V0QWN0aXZlLCBlbGVtZW50X25hbWUgaXMgbm90IHJlcXVpcmVkXG4gICAgaWYgKG1ldGhvZCAhPT0gJ2dldEFjdGl2ZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICBwLFxuICAgICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGFjdGl2YXRlL2RlYWN0aXZhdGUnXG4gICAgICApO1xuXG4gICAgICAvLyBlbGVtZW50X3R5cGUgY2FuIGNvbWUgZnJvbSBpbnB1dC5lbGVtZW50VHlwZSBvciBwYXJhbXMuZWxlbWVudF90eXBlXG4gICAgICBjb25zdCB0eXBlID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8IHR5cGUudHJpbSgpID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICdlbGVtZW50X3R5cGUnLiBFeHBlY3RlZDogc3RyaW5nIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIG9yIGVuc2VtYmxlKWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZhdGUnOlxuICAgICAgICAgIHJldHVybiBoYW5kbGVyLmFjdGl2YXRlRWxlbWVudChcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgcC5jb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcblxuICAgICAgICBjYXNlICdkZWFjdGl2YXRlJzpcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudChuYW1lLCB0eXBlKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBY3RpdmF0aW9uIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0QWN0aXZlOiBlbGVtZW50X3R5cGUgaXMgb3B0aW9uYWwgLSBpZiBub3QgcHJvdmlkZWQsIHJldHVybnMgYWxsIGFjdGl2ZSBlbGVtZW50c1xuICAgIC8vIElzc3VlICM1MDE6IFBhc3MgdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQg4oCUIGdldEFjdGl2ZUVsZW1lbnRzIGhhbmRsZXMgYm90aCBjYXNlc1xuICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gaGFuZGxlci5nZXRBY3RpdmVFbGVtZW50cyh0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBTZWFyY2ggb3BlcmF0aW9ucyB0byBFbGVtZW50UXVlcnlTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoU2VhcmNoKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5U2VydmljZSA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudFF1ZXJ5U2VydmljZTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTZWFyY2hFbGVtZW50cyhpbnB1dCk7XG5cbiAgICAgIGNhc2UgJ3F1ZXJ5Jzoge1xuICAgICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50VHlwZSBpcyByZXF1aXJlZCBmb3IgcXVlcnlcbiAgICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZWxlbWVudFR5cGUgaXMgcmVxdWlyZWQgZm9yIHF1ZXJ5X2VsZW1lbnRzIG9wZXJhdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJhdyBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgKGNhc3QgdG8gSUVsZW1lbnRbXSBmb3IgcXVlcnkgc2VydmljZSlcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAoYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50cyhlbGVtZW50VHlwZSkpIGFzIElFbGVtZW50W107XG5cbiAgICAgICAgLy8gQnVpbGQgUXVlcnlPcHRpb25zIGZyb20gcGFyYW1zXG4gICAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHF1ZXJ5T3B0aW9uczoge1xuICAgICAgICAgIGZpbHRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBzb3J0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgcGFnaW5hdGlvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGFnZ3JlZ2F0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9ID0ge307XG5cbiAgICAgICAgaWYgKHAuZmlsdGVycykge1xuICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5maWx0ZXJzID0gcC5maWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnNvcnQpIHtcbiAgICAgICAgICBxdWVyeU9wdGlvbnMuc29ydCA9IHAuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgcXVlcnlPcHRpb25zLnBhZ2luYXRpb24gPSBwLnBhZ2luYXRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYWdncmVnYXRpb24gcmVxdWVzdHMgKElzc3VlICMzMDkpIOKAlCBkZWxlZ2F0ZXMgdG8gc2hhcmVkIEFnZ3JlZ2F0aW9uU2VydmljZVxuICAgICAgICBpZiAocC5hZ2dyZWdhdGUpIHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBwLmFnZ3JlZ2F0ZSBhcyB7IGNvdW50PzogYm9vbGVhbjsgZ3JvdXBfYnk/OiBzdHJpbmcgfTtcblxuICAgICAgICAgIC8vIFZhbGlkYXRlIGFnZ3JlZ2F0aW9uIG9wdGlvbnNcbiAgICAgICAgICBjb25zdCBhZ2dFcnJvciA9IHZhbGlkYXRlQWdncmVnYXRpb25PcHRpb25zKGFnZ3JlZ2F0ZSk7XG4gICAgICAgICAgaWYgKGFnZ0Vycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYWdnRXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhZ2dyZWdhdGVFbGVtZW50cyhcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBhZ2dyZWdhdGUsXG4gICAgICAgICAgICBxdWVyeU9wdGlvbnMuZmlsdGVycyBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzUwMDogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgKHBhZ2VTaXplLCBwYWdlLCBsaW1pdCwgb2Zmc2V0KVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZmxhdCBwYXJhbXMgbGlrZSB7IHBhZ2VTaXplOiA1IH0gd29yayB0aGUgc2FtZSBhcyB7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUgfSB9XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYWdpbmF0aW9uID0gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhwKTtcbiAgICAgICAgcXVlcnlPcHRpb25zLnBhZ2luYXRpb24gPSBub3JtYWxpemVkUGFnaW5hdGlvbjtcblxuICAgICAgICAvLyBFeGVjdXRlIHF1ZXJ5IHdpdGggRWxlbWVudFF1ZXJ5U2VydmljZVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5U2VydmljZS5xdWVyeShlbGVtZW50cywgcXVlcnlPcHRpb25zKTtcblxuICAgICAgICAvLyBSZXR1cm4gY29uY2lzZSBzdHJ1Y3R1cmVkIHJlc3BvbnNlIChJc3N1ZSAjMjk5KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiBxdWVyeVJlc3VsdC5pdGVtcy5tYXAoKGl0ZW06IElFbGVtZW50KSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogaXRlbS5tZXRhZGF0YT8ubmFtZSB8fCAnVW5rbm93bicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogaXRlbS5tZXRhZGF0YT8uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHZlcnNpb246IGl0ZW0ubWV0YWRhdGE/LnZlcnNpb24gfHwgaXRlbS52ZXJzaW9uLFxuICAgICAgICAgICAgdGFnczogaXRlbS5tZXRhZGF0YT8udGFncyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgcGFnaW5hdGlvbjogcXVlcnlSZXN1bHQucGFnaW5hdGlvbixcbiAgICAgICAgICBzb3J0aW5nOiBxdWVyeVJlc3VsdC5zb3J0aW5nLFxuICAgICAgICAgIGZpbHRlcnM6IHF1ZXJ5UmVzdWx0LmZpbHRlcnMuYXBwbGllZC5jb3VudCA+IDAgPyB7IGFwcGxpZWQ6IHF1ZXJ5UmVzdWx0LmZpbHRlcnMuYXBwbGllZCB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBTZWFyY2ggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBOT1RFOiBVbmlmaWVkIFNlYXJjaCBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKSBhcmUgbm93IHNjaGVtYS1kcml2ZW4uXG4gIC8vIFRoZSAnc2VhcmNoJyBvcGVyYXRpb24gdXNlcyB0aGUgJ3NlYXJjaFBhcmFtcycgbm9ybWFsaXplciBpbiBPcGVyYXRpb25TY2hlbWEudHMuXG4gIC8vIFNlZTogU2VhcmNoUGFyYW1zTm9ybWFsaXplciBmb3Igc2NvcGUvcGFnaW5hdGlvbi9zb3J0L2ZpbHRlciB0cmFuc2Zvcm1hdGlvbi5cblxuICAvKipcbiAgICogRGlzcGF0Y2ggSW50cm9zcGVjdGlvbiBvcGVyYXRpb25zIHRvIEludHJvc3BlY3Rpb25SZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaEludHJvc3BlY3Rpb24oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncmVzb2x2ZSc6XG4gICAgICAgIHJldHVybiBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIucmVzb2x2ZShwYXJhbXMpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSW50cm9zcGVjdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggZWxlbWVudHMgYWNyb3NzIG9uZSBvciBhbGwgZWxlbWVudCB0eXBlc1xuICAgKlxuICAgKiBJbXBsZW1lbnRzIHNpbXBsZSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBtYXRjaGluZyBvbjpcbiAgICogLSBtZXRhZGF0YS5uYW1lXG4gICAqIC0gbWV0YWRhdGEuZGVzY3JpcHRpb25cbiAgICogLSBjb250ZW50IChpZiBhdmFpbGFibGUpXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wdGlvbmFsIGVsZW1lbnRUeXBlIGFuZCBzZWFyY2ggcGFyYW1zXG4gICAqIEByZXR1cm5zIFNlYXJjaCByZXN1bHRzIHdpdGggbWF0Y2hlZCBlbGVtZW50cyBhbmQgcmVsZXZhbmNlIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VhcmNoRWxlbWVudHMoaW5wdXQ6IE9wZXJhdGlvbklucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2VhcmNoU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBtZW1vcnlCZWZvcmUgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQ7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHF1ZXJ5ID0gKHAucXVlcnkgYXMgc3RyaW5nKT8udHJpbSgpO1xuXG4gICAgLy8gSXNzdWUgIzUwMDogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgKHBhZ2VTaXplLCBwYWdlLCBsaW1pdCwgb2Zmc2V0KVxuICAgIGNvbnN0IHsgcGFnZSwgcGFnZVNpemUgfSA9IG5vcm1hbGl6ZVBhZ2luYXRpb25QYXJhbXMocCk7XG5cbiAgICAvLyBFeHRyYWN0IHNvcnQgcGFyYW1zXG4gICAgY29uc3Qgc29ydFBhcmFtID0gcC5zb3J0IGFzIHsgc29ydEJ5Pzogc3RyaW5nOyBzb3J0T3JkZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzb3J0QnkgPSBzb3J0UGFyYW0/LnNvcnRCeSA/PyAnbmFtZSc7XG4gICAgY29uc3Qgc29ydE9yZGVyID0gKHNvcnRQYXJhbT8uc29ydE9yZGVyID8/ICdhc2MnKSBhcyAnYXNjJyB8ICdkZXNjJztcblxuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBsZW5ndGggbGltaXRcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocXVlcnkubGVuZ3RoID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgbXVzdCBiZSB1bmRlciAxMDAwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZWxlbWVudCB0eXBlcyB0byBzZWFyY2ggKElzc3VlICM0MzM6IGFjY2VwdCBzaW5ndWxhciBmb3JtcylcbiAgICBsZXQgZWxlbWVudFR5cGVzOiBzdHJpbmdbXTtcbiAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHtlbGVtZW50VHlwZX0nLiBWYWxpZCB0eXBlczogJHtmb3JtYXRFbGVtZW50VHlwZXNMaXN0KCl9YCk7XG4gICAgICB9XG4gICAgICBlbGVtZW50VHlwZXMgPSBbbm9ybWFsaXplZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlcyA9IFsuLi5BTExfRUxFTUVOVF9UWVBFU107XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUmVzdWx0czogQXJyYXk8e1xuICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIG1hdGNoZWRJbjogc3RyaW5nW107XG4gICAgfT4gPSBbXTtcblxuICAgIC8vIENvbGxlY3QgQUxMIG1hdGNoZXMgKG5vIGVhcmx5IHRlcm1pbmF0aW9uIOKAlCBwYWdpbmF0aW9uIGhhbmRsZXMgbGltaXRpbmcpXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIGVsZW1lbnRUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEVsZW1lbnRzKHR5cGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkSW46IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSAoZWxlbWVudC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge307XG5cbiAgICAgICAgICAvLyBDaGVjayBuYW1lIG1hdGNoXG4gICAgICAgICAgY29uc3QgbmFtZSA9IChtZXRhZGF0YS5uYW1lIGFzIHN0cmluZykgfHwgJyc7XG4gICAgICAgICAgaWYgKG5hbWUgJiYgaXNTZWFyY2hNYXRjaChxdWVyeSwgbmFtZSkpIHtcbiAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCduYW1lJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgZGVzY3JpcHRpb24gbWF0Y2hcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChtZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBpc1NlYXJjaE1hdGNoKHF1ZXJ5LCBkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCdkZXNjcmlwdGlvbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGNvbnRlbnQgbWF0Y2ggKGlmIGF2YWlsYWJsZSlcbiAgICAgICAgICBpZiAoZWxlbWVudC5jb250ZW50ICYmIHR5cGVvZiBlbGVtZW50LmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWFyY2hNYXRjaChxdWVyeSwgZWxlbWVudC5jb250ZW50IGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZEluLnB1c2goJ2NvbnRlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBhbnkgbWF0Y2hlcyBmb3VuZCwgYWRkIHRvIHJlc3VsdHNcbiAgICAgICAgICAvLyBVc2UgJ25hbWUnIGhlcmUg4oCUIEZJRUxEX1RSQU5TRk9STVMgd2lsbCByZW5hbWUgdG8gJ2VsZW1lbnRfbmFtZScgaW4gYXBwbHlGaWVsZFNlbGVjdGlvblxuICAgICAgICAgIGlmIChtYXRjaGVkSW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWxsUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIG1hdGNoZWRJbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU2tpcCBlbGVtZW50IHR5cGVzIHRoYXQgZmFpbCB0byBsb2FkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgZWxlbWVudHMgZm9yIHNlYXJjaDogJHt0eXBlfWAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHNlYXJjaCBtZXRyaWNzIHZpYSBQZXJmb3JtYW5jZU1vbml0b3JcbiAgICB0aGlzLmhhbmRsZXJzLnBlcmZvcm1hbmNlTW9uaXRvcj8ucmVjb3JkU2VhcmNoKHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgZHVyYXRpb246IHBlcmZvcm1hbmNlLm5vdygpIC0gc2VhcmNoU3RhcnQsXG4gICAgICByZXN1bHRDb3VudDogYWxsUmVzdWx0cy5sZW5ndGgsXG4gICAgICBzb3VyY2VzOiBlbGVtZW50VHlwZXMsXG4gICAgICBjYWNoZUhpdDogZmFsc2UsXG4gICAgICBtZW1vcnlCZWZvcmUsXG4gICAgICBtZW1vcnlBZnRlcjogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgIH0pO1xuXG4gICAgLy8gU29ydCByZXN1bHRzIChjdXJyZW50bHkgb25seSAnbmFtZScgaXMgc3VwcG9ydGVkIGFzIGEgc29ydCBmaWVsZClcbiAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0gWy4uLmFsbFJlc3VsdHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGNtcCA9IGEubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gLWNtcCA6IGNtcDtcbiAgICB9KTtcblxuICAgIC8vIFBhZ2luYXRlIHZpYSBQYWdpbmF0aW9uU2VydmljZVxuICAgIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBQYWdpbmF0aW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBhZ2luYXRlZCA9IHBhZ2luYXRvci5wYWdpbmF0ZShzb3J0ZWRSZXN1bHRzLCB7IHBhZ2UsIHBhZ2VTaXplIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBwYWdpbmF0ZWQuaXRlbXMsXG4gICAgICBwYWdpbmF0aW9uOiBwYWdpbmF0ZWQucGFnaW5hdGlvbixcbiAgICAgIHNvcnRpbmc6IHsgc29ydEJ5LCBzb3J0T3JkZXIgfSxcbiAgICAgIHF1ZXJ5LFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1DUC1BUUwgRXh0ZW5zaW9uIERpc3BhdGNoIE1ldGhvZHMgKElzc3VlICMyNDEpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQ29sbGVjdGlvbiBvcGVyYXRpb25zIHRvIENvbGxlY3Rpb25IYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQ29sbGVjdGlvbihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQ29sbGVjdGlvbkhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnYnJvd3NlJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuYnJvd3NlQ29sbGVjdGlvbihcbiAgICAgICAgICBwYXJhbXMuc2VjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaENvbGxlY3Rpb24ocGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaEVuaGFuY2VkJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcsIHBhcmFtcyk7XG5cbiAgICAgIGNhc2UgJ2dldENvbnRlbnQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDb2xsZWN0aW9uQ29udGVudChwYXJhbXMucGF0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBjYXNlICdnZXRDYWNoZUhlYWx0aCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpO1xuXG4gICAgICBjYXNlICdpbnN0YWxsJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW5zdGFsbENvbnRlbnQocGFyYW1zLnBhdGggYXMgc3RyaW5nKTtcblxuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc3VibWl0Q29udGVudChwYXJhbXMuY29udGVudCBhcyBzdHJpbmcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQ29sbGVjdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBQb3J0Zm9saW8gb3BlcmF0aW9ucyB0byBQb3J0Zm9saW9IYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUG9ydGZvbGlvKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMucG9ydGZvbGlvSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydGZvbGlvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogUG9ydGZvbGlvSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzdGF0dXMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5wb3J0Zm9saW9TdGF0dXMocGFyYW1zLnVzZXJuYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNhc2UgJ2luaXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5pbml0UG9ydGZvbGlvKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcGFyYW1zLnJlcG9zaXRvcnlfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcHJpdmF0ZTogcGFyYW1zLnByaXZhdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcGFyYW1zLmRlc2NyaXB0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2NvbmZpZyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnBvcnRmb2xpb0NvbmZpZyh7XG4gICAgICAgICAgYXV0b1N5bmM6IHBhcmFtcy5hdXRvX3N5bmMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWZhdWx0VmlzaWJpbGl0eTogcGFyYW1zLmRlZmF1bHRfdmlzaWJpbGl0eSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgYXV0b1N1Ym1pdDogcGFyYW1zLmF1dG9fc3VibWl0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHBhcmFtcy5yZXBvc2l0b3J5X25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc3luYyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnN5bmNQb3J0Zm9saW8oe1xuICAgICAgICAgIGRpcmVjdGlvbjogKHBhcmFtcy5kaXJlY3Rpb24gYXMgc3RyaW5nKSB8fCAncHVzaCcsXG4gICAgICAgICAgbW9kZTogcGFyYW1zLm1vZGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcmNlOiBwYXJhbXMuZm9yY2UgYXMgYm9vbGVhbiB8fCBmYWxzZSxcbiAgICAgICAgICBkcnlSdW46IHBhcmFtcy5kcnlfcnVuIGFzIGJvb2xlYW4gfHwgZmFsc2UsXG4gICAgICAgICAgY29uZmlybURlbGV0aW9uczogcGFyYW1zLmNvbmZpcm1fZGVsZXRpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hQb3J0Zm9saW8oe1xuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMucXVlcnkgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZnV6enlNYXRjaDogcGFyYW1zLmZ1enp5X21hdGNoIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4UmVzdWx0czogcGFyYW1zLm1heF9yZXN1bHRzIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlS2V5d29yZHM6IHBhcmFtcy5pbmNsdWRlX2tleXdvcmRzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZVRhZ3M6IHBhcmFtcy5pbmNsdWRlX3RhZ3MgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlVHJpZ2dlcnM6IHBhcmFtcy5pbmNsdWRlX3RyaWdnZXJzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZURlc2NyaXB0aW9uczogcGFyYW1zLmluY2x1ZGVfZGVzY3JpcHRpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2hBbGwnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hBbGwoe1xuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMucXVlcnkgYXMgc3RyaW5nLFxuICAgICAgICAgIHNvdXJjZXM6IHBhcmFtcy5zb3VyY2VzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFnZTogcGFyYW1zLnBhZ2UgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhZ2VTaXplOiBwYXJhbXMucGFnZV9zaXplIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBzb3J0Qnk6IHBhcmFtcy5zb3J0X2J5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2VsZW1lbnRNYW5hZ2VyJzoge1xuICAgICAgICBjb25zdCBzeW5jSGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuc3luY0hhbmRsZXI7XG4gICAgICAgIGlmICghc3luY0hhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBlbGVtZW50IG1hbmFnZXIgbm90IGF2YWlsYWJsZTogU3luY0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3luY0hhbmRsZXIuaGFuZGxlU3luY09wZXJhdGlvbih7XG4gICAgICAgICAgb3BlcmF0aW9uOiBwYXJhbXMub3BlcmF0aW9uIGFzICdsaXN0LXJlbW90ZScgfCAnZG93bmxvYWQnIHwgJ3VwbG9hZCcgfCAnY29tcGFyZScsXG4gICAgICAgICAgZWxlbWVudF9uYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgRWxlbWVudFR5cGUgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZmlsdGVyOiBwYXJhbXMuZmlsdGVyIGFzIHsgdHlwZT86IEVsZW1lbnRUeXBlOyBhdXRob3I/OiBzdHJpbmc7IHVwZGF0ZWRfYWZ0ZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBvcHRpb25zOiBwYXJhbXMub3B0aW9ucyBhcyB7IGZvcmNlPzogYm9vbGVhbjsgZHJ5X3J1bj86IGJvb2xlYW47IGluY2x1ZGVfcHJpdmF0ZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBQb3J0Zm9saW8gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQXV0aCBvcGVyYXRpb25zIHRvIEdpdEh1YkF1dGhIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQXV0aChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmF1dGhIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogR2l0SHViQXV0aEhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc2V0dXAnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZXR1cEdpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY2hlY2snOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jaGVja0dpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY2xlYXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jbGVhckdpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY29uZmlndXJlT0F1dGgnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jb25maWd1cmVPQXV0aChwYXJhbXMuY2xpZW50X2lkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNhc2UgJ29hdXRoSGVscGVyU3RhdHVzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0T0F1dGhIZWxwZXJTdGF0dXMocGFyYW1zLnZlcmJvc2UgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBdXRoIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIENvbmZpZyBvcGVyYXRpb25zIHRvIENvbmZpZ0hhbmRsZXIgYW5kIEJ1aWxkSW5mb1NlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hDb25maWcoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnbWFuYWdlJzoge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5jb25maWdIYW5kbGVyO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IENvbmZpZ0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlci5oYW5kbGVDb25maWdPcGVyYXRpb24oe1xuICAgICAgICAgIGFjdGlvbjogcGFyYW1zLmFjdGlvbiBhcyAnZ2V0JyB8ICdzZXQnIHwgJ3Jlc2V0JyB8ICdleHBvcnQnIHwgJ2ltcG9ydCcgfCAnd2l6YXJkJyxcbiAgICAgICAgICBzZXR0aW5nOiBwYXJhbXMuc2V0dGluZyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgdmFsdWU6IHBhcmFtcy52YWx1ZSxcbiAgICAgICAgICBzZWN0aW9uOiBwYXJhbXMuc2VjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZm9ybWF0OiBwYXJhbXMuZm9ybWF0IGFzICd5YW1sJyB8ICdqc29uJyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRCdWlsZEluZm8nOiB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmhhbmRsZXJzLmJ1aWxkSW5mb1NlcnZpY2U7XG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRJbmZvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQnVpbGRJbmZvU2VydmljZSBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzZXJ2aWNlLmdldEJ1aWxkSW5mbygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBzZXJ2aWNlLmZvcm1hdEJ1aWxkSW5mbyhpbmZvKVxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldENhY2hlQnVkZ2V0UmVwb3J0Jzoge1xuICAgICAgICBjb25zdCBidWRnZXQgPSB0aGlzLmhhbmRsZXJzLmNhY2hlTWVtb3J5QnVkZ2V0O1xuICAgICAgICBpZiAoIWJ1ZGdldCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGUgYnVkZ2V0IG5vdCBhdmFpbGFibGU6IENhY2hlTWVtb3J5QnVkZ2V0IG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVwb3J0ID0gYnVkZ2V0LmdldFJlcG9ydCgpO1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgJyMgQ2FjaGUgTWVtb3J5IEJ1ZGdldCBSZXBvcnQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGAqKkJ1ZGdldDoqKiAke3JlcG9ydC5idWRnZXRNQn0gTUJgLFxuICAgICAgICAgIGAqKlVzZWQ6KiogJHtyZXBvcnQudG90YWxNZW1vcnlNQn0gTUIgKCR7cmVwb3J0LnV0aWxpemF0aW9uUGVyY2VudH0lKWAsXG4gICAgICAgICAgYCoqUmVnaXN0ZXJlZCBDYWNoZXM6KiogJHtyZXBvcnQuY2FjaGVzLmxlbmd0aH1gLFxuICAgICAgICAgICcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVwb3J0LmNhY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZXMucHVzaCgnfCBDYWNoZSB8IEVudHJpZXMgfCBNZW1vcnkgKE1CKSB8IEhpdCBSYXRlIHwgTGFzdCBBY3Rpdml0eSB8Jyk7XG4gICAgICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18Jyk7XG4gICAgICAgICAgZm9yIChjb25zdCBjIG9mIHJlcG9ydC5jYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYy5sYXN0QWN0aXZpdHlNcyA+IDBcbiAgICAgICAgICAgICAgPyBgJHsoKERhdGUubm93KCkgLSBjLmxhc3RBY3Rpdml0eU1zKSAvIDEwMDApLnRvRml4ZWQoMCl9cyBhZ29gXG4gICAgICAgICAgICAgIDogJ25ldmVyJztcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYHwgJHtjLm5hbWV9IHwgJHtjLmVudHJpZXN9IHwgJHtjLm1lbW9yeU1CfSB8ICR7KGMuaGl0UmF0ZSAqIDEwMCkudG9GaXhlZCgxKX0lIHwgJHthY3Rpdml0eX0gfGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKCdfTm8gY2FjaGVzIHJlZ2lzdGVyZWQuXycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGxpbmVzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIENvbmZpZyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgdG8gRW5oYW5jZWRJbmRleEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbmhhbmNlZEluZGV4KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBFbmhhbmNlZEluZGV4SGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdmaW5kU2ltaWxhcic6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmZpbmRTaW1pbGFyRWxlbWVudHMoe1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgbGltaXQ6IChwYXJhbXMubGltaXQgYXMgbnVtYmVyKSA/PyAxMCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IChwYXJhbXMudGhyZXNob2xkIGFzIG51bWJlcikgPz8gMC41LFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnZ2V0UmVsYXRpb25zaGlwcyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGVzOiBwYXJhbXMucmVsYXRpb25zaGlwX3R5cGVzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoQnlWZXJiJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQnlWZXJiKHtcbiAgICAgICAgICB2ZXJiOiBwYXJhbXMudmVyYiBhcyBzdHJpbmcsXG4gICAgICAgICAgbGltaXQ6IChwYXJhbXMubGltaXQgYXMgbnVtYmVyKSA/PyAyMCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2dldFN0YXRzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0UmVsYXRpb25zaGlwU3RhdHMoKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEVuaGFuY2VkSW5kZXggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggUGVyc29uYSBvcGVyYXRpb25zIHRvIFBlcnNvbmFIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUGVyc29uYShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnBlcnNvbmFIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogUGVyc29uYUhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnaW1wb3J0Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBzb3VyY2UgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICAgICAgY29uc3Qgc291cmNlID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3NvdXJjZScsXG4gICAgICAgICAgJ1VSTCBvciBmaWxlIHBhdGggdG8gaW1wb3J0IHBlcnNvbmEgZnJvbSdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW1wb3J0UGVyc29uYShzb3VyY2UsIHBhcmFtcy5vdmVyd3JpdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBQZXJzb25hIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEdhdGVrZWVwZXIgb3BlcmF0aW9ucyBmb3IgY29uZmlybWF0aW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IEhhbmRsZXMgdGhlIGNvbmZpcm1fb3BlcmF0aW9uIGZsb3cgd2hlcmUgdXNlcnMgYXBwcm92ZVxuICAgKiBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjb25maXJtYXRpb24gcGVyIEdhdGVrZWVwZXIgcG9saWN5LlxuICAgKlxuICAgKiBGbG93OlxuICAgKiAxLiBHYXRla2VlcGVyLmVuZm9yY2UoKSByZXR1cm5zIGNvbmZpcm1hdGlvblBlbmRpbmc6IHRydWVcbiAgICogMi4gTExNIGNhbGxzIGNvbmZpcm1fb3BlcmF0aW9uIHdpdGggdGhlIG9wZXJhdGlvbiBuYW1lXG4gICAqIDMuIFRoaXMgbWV0aG9kIHJlY29yZHMgdGhlIGNvbmZpcm1hdGlvbiBpbiB0aGUgc2Vzc2lvblxuICAgKiA0LiBMTE0gcmV0cmllcyB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLCB3aGljaCBub3cgcGFzc2VzIHZpYSBMYXllciAzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoR2F0ZWtlZXBlcihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdjb25maXJtJzoge1xuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnb3BlcmF0aW9uJyxcbiAgICAgICAgICAndGhlIG9wZXJhdGlvbiBuYW1lIHRvIGNvbmZpcm0gKGUuZy4gXCJjcmVhdGVfZWxlbWVudFwiKSdcbiAgICAgICAgKTtcbiAgICAgICAgLy8gSXNzdWUgIzE2MzY6IE5vcm1hbGl6ZSBlbGVtZW50X3R5cGUgdG8gbWF0Y2ggdGhlIE1DUC1BUUwgc2luZ3VsYXIgZm9ybVxuICAgICAgICAvLyB1c2VkIGJ5IHRoZSBlbmZvcmNlIHBhdGguIFdpdGhvdXQgdGhpcywgc2NvcGVkIGNvbmZpcm1hdGlvbnMgc3RvcmVkIGFzXG4gICAgICAgIC8vIFwiY3JlYXRlX2VsZW1lbnQ6c2tpbGxzXCIgbmV2ZXIgbWF0Y2ggZW5mb3JjZSBsb29rdXBzIGZvciBcImNyZWF0ZV9lbGVtZW50OnNraWxsXCIuXG4gICAgICAgIGNvbnN0IHJhd0VsZW1lbnRUeXBlID0gcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gcmF3RWxlbWVudFR5cGVcbiAgICAgICAgICA/IG5vcm1hbGl6ZU1DUEFRTEVsZW1lbnRUeXBlKHJhd0VsZW1lbnRUeXBlKSA/PyByYXdFbGVtZW50VHlwZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIElzc3VlICM3NDg6IEJ1aWxkIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2Ygd2hhdCdzIGJlaW5nIGNvbmZpcm1lZFxuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5idWlsZE9wZXJhdGlvblN1bW1hcnkob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgcGFyYW1zKTtcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzc1ODogQ2hlY2sgZm9yIG51Y2xlYXIgc2FuZGJveCDigJQgZGVueTogWydjb25maXJtX29wZXJhdGlvbiddIG9uIGFueSBhY3RpdmUgZWxlbWVudC5cbiAgICAgICAgLy8gVGhpcyBpcyBhIGhhcmQgYmxvY2s6IHRoZSBMTE0gY2Fubm90IGNvbmZpcm0gQU5ZIG9wZXJhdGlvbiB3aGlsZSB0aGUgZGVueWluZyBlbGVtZW50XG4gICAgICAgIC8vIGlzIGFjdGl2ZS4gVGhlIGh1bWFuIG11c3QgZGVhY3RpdmF0ZSB0aGUgZWxlbWVudCB0byByZXN0b3JlIGNvbmZpcm1hdGlvbiBjYXBhYmlsaXR5LlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGF1dG9tYXRlZCBjb25maXJt4oaSZXhlY3V0ZSBsb29wcyB0aGF0IGJ5cGFzcyBodW1hbiByZXZpZXcuXG4gICAgICAgIGNvbnN0IGRlbnlpbmdFbGVtZW50ID0gZmluZENvbmZpcm1EZW55aW5nRWxlbWVudChhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGlmIChkZW55aW5nRWxlbWVudCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbR2F0ZWtlZXBlcl0gU2FuZGJveCBhY3RpdmU6ICR7ZGVueWluZ0VsZW1lbnQudHlwZX0gXCIke2RlbnlpbmdFbGVtZW50Lm5hbWV9XCIgZGVuaWVzIGNvbmZpcm1fb3BlcmF0aW9uYCwge1xuICAgICAgICAgICAgYmxvY2tlZE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE9wZXJhdGlvbiBjYW5ub3QgYmUgY29uZmlybWVkIOKAlCAke2RlbnlpbmdFbGVtZW50LnR5cGV9IFwiJHtkZW55aW5nRWxlbWVudC5uYW1lfVwiIGhhcyBzYW5kYm94ZWQgdGhpcyBzZXNzaW9uLiBgICtcbiAgICAgICAgICAgIGBBbGwgY29uZmlybWF0aW9ucyBhcmUgYmxvY2tlZCB3aGlsZSB0aGlzIGVsZW1lbnQgaXMgYWN0aXZlLiBgICtcbiAgICAgICAgICAgIGBEZWFjdGl2YXRlIHRoZSBlbGVtZW50IHRvIHJlc3RvcmUgY29uZmlybWF0aW9uIGNhcGFiaWxpdHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNzU4OiBDaGVjayBmb3IgYWR2aXNvcnkg4oCUIGNvbmZpcm06IFsnY29uZmlybV9vcGVyYXRpb24nXSBvbiBhY3RpdmUgZWxlbWVudHMuXG4gICAgICAgIC8vIE5vdCBlbmZvcmNlZCBhcyBhIGdhdGUsIGJ1dCBzdXJmYWNlZCB0byB0aGUgaHVtYW4gZm9yIGF3YXJlbmVzcy5cbiAgICAgICAgY29uc3QgYWR2aXNvcnlFbGVtZW50cyA9IGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyhhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGNvbnN0IGFkdmlzb3J5Tm90ZSA9IGFkdmlzb3J5RWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYCBOb3RlOiAke2Fkdmlzb3J5RWxlbWVudHMubWFwKGUgPT4gYCR7ZS50eXBlfSBcIiR7ZS5uYW1lfVwiYCkuam9pbignLCAnKX0gcmVxdWVzdCBhZGRpdGlvbmFsIHNjcnV0aW55IGZvciBjb25maXJtYXRpb25zLmBcbiAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIC8vIEV2YWx1YXRlIHRoZSBUQVJHRVQgb3BlcmF0aW9uJ3MgcGVybWlzc2lvbiBsZXZlbCB3aXRoIGZ1bGwgZWxlbWVudCBwb2xpY2llcy5cbiAgICAgICAgLy8gVGhpcyBpcyBOT1QgY2hlY2tpbmcgY29uZmlybV9vcGVyYXRpb24gaXRzZWxmICh0aGF0IHdhcyBoYW5kbGVkIGluIHRoZSBwcmltYXJ5XG4gICAgICAgIC8vIGVuZm9yY2VtZW50IHBhdGggd2l0aCBza2lwRWxlbWVudFBvbGljaWVzKS4gVGhpcyBjaGVja3Mgd2hhdCB0aGUgdGFyZ2V0IG9wZXJhdGlvblxuICAgICAgICAvLyBuZWVkcyBzbyB3ZSByZWNvcmQgdGhlIHJpZ2h0IGNvbmZpcm1hdGlvbiBsZXZlbC5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSB0aGlzLmdhdGVrZWVwZXIuZW5mb3JjZSh7XG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmdldEVuZHBvaW50Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gZG9lc24ndCBhY3R1YWxseSBuZWVkIGNvbmZpcm1hdGlvbiwgaW5mb3JtIHRoZSBjYWxsZXJcbiAgICAgICAgaWYgKGRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZmlybWVkOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGFscmVhZHkgYXBwcm92ZWQgKCR7ZGVjaXNpb24ucG9saWN5U291cmNlID8/ICdhdXRvX2FwcHJvdmUnfSkuIE5vIGNvbmZpcm1hdGlvbiBuZWVkZWQuYCxcbiAgICAgICAgICAgIHN1bW1hcnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgICAgIC8vIEhhcmQgZGVueSBvbiB0aGUgdGFyZ2V0IG9wZXJhdGlvbiDigJQgY29uZmlybWF0aW9uIHdvbid0IGhlbHBcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgZGVuaWVkIGJ5IHBvbGljeSBhbmQgY2Fubm90IGJlIGNvbmZpcm1lZC4gJHtkZWNpc2lvbi5yZWFzb259YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNvcmQgdGhlIGNvbmZpcm1hdGlvbiBpbiB0aGUgc2Vzc2lvblxuICAgICAgICBjb25zdCBsZXZlbCA9IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgICAgID8gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgICAgIDogUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0VTU0lPTjtcblxuICAgICAgICB0aGlzLmdhdGVrZWVwZXIucmVjb3JkQ29uZmlybWF0aW9uKG9wZXJhdGlvbiwgbGV2ZWwsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAvLyBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtOiBjbGVhciBtYXRjaGluZyBibG9ja3MgZnJvbSBleGVjdXRpbmcgYWdlbnRzXG4gICAgICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2NrcyA9IGFnZW50RW50cnkucmVjZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAgIGIgPT4gYi5vcGVyYXRpb24gIT09IG9wZXJhdGlvbiB8fCAoZWxlbWVudFR5cGUgJiYgYi5lbGVtZW50VHlwZSAhPT0gZWxlbWVudFR5cGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29uZmlybWVkOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDb25maXJtZWQ6ICR7c3VtbWFyeX0uJHthZHZpc29yeU5vdGV9YCxcbiAgICAgICAgICByYXRpb25hbGU6IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgICAgICBzY29wZTogZWxlbWVudFR5cGUgPyBgU2NvcGVkIHRvIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gIDogJ0FsbCBlbGVtZW50IHR5cGVzJyxcbiAgICAgICAgICBsZXZlbDogbGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0UgPyAnc2luZ2xlX3VzZScgOiAnc2Vzc2lvbicsXG4gICAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndmVyaWZ5Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMTQyOiBWZXJpZnkgYSBkYW5nZXIgem9uZSBjaGFsbGVuZ2UgY29kZSB0byB1bmJsb2NrIGFuIGFnZW50LlxuICAgICAgICAvLyBUaGlzIGlzIHN0ZXAgOSBvZiB0aGUgdmVyaWZpY2F0aW9uIGZsb3cgKHNlZSBhdXRvbm9teUV2YWx1YXRvci50cyBoZWFkZXIpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBQaXBlbGluZTogdmFsaWRhdGUgcGFyYW1zIOKGkiByYXRlIGxpbWl0IGNoZWNrIOKGkiBVVUlEIHY0IGZvcm1hdCBjaGVjayDihpJcbiAgICAgICAgLy8gICAgICAgICAgIHByZS1jaGVjayBzdG9yZSAoZXhwaXJlZD8pIOKGkiB2ZXJpZnkgY29kZSAod3Jvbmc/KSDihpIgdW5ibG9jayBhZ2VudFxuICAgICAgICAvL1xuICAgICAgICAvLyBFYWNoIHN0YWdlIGxvZ3MgYSBkaXN0aW5jdCBzZWN1cml0eSBldmVudCB0eXBlOlxuICAgICAgICAvLyAgIFZFUklGSUNBVElPTl9BVFRFTVBURUQg4oaSIFZFUklGSUNBVElPTl9GQUlMRUQgKGZvcm1hdC9yYXRlL3dyb25nKSBvclxuICAgICAgICAvLyAgIFZFUklGSUNBVElPTl9FWFBJUkVEIChub3QgZm91bmQpIG9yIFZFUklGSUNBVElPTl9TVUNDRUVERURcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEF0dGVtcHQoKTtcbiAgICAgICAgY29uc3QgYXR0ZW1wdFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgY29uc3QgY2hhbGxlbmdlSWQgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnY2hhbGxlbmdlX2lkJyxcbiAgICAgICAgICAndGhlIHZlcmlmaWNhdGlvbiBjaGFsbGVuZ2UgSUQnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvZGUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnY29kZScsXG4gICAgICAgICAgJ3RoZSB2ZXJpZmljYXRpb24gY29kZSBkaXNwbGF5ZWQgb24geW91ciBzY3JlZW4nXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTG9nIGV2ZXJ5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9BVFRFTVBURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gYXR0ZW1wdGVkIGZvciBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJhdGUgbGltaXRpbmc6IHJlamVjdCBpZiB0b28gbWFueSByZWNlbnQgZmFpbHVyZXNcbiAgICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIuaXNMaW1pdGVkKCkpIHtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkUmF0ZUxpbWl0ZWQoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gcmF0ZS1saW1pdGVkOiB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgKGNoYWxsZW5nZTogJHtjaGFsbGVuZ2VJZH0pYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdyYXRlX2xpbWl0ZWQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1RvbyBtYW55IGZhaWxlZCB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB3YWl0IGJlZm9yZSB0cnlpbmcgYWdhaW4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVVUlEIHY0IGZvcm1hdCB2YWxpZGF0aW9uOiByZWplY3QgaW52YWxpZCBJRHMgYmVmb3JlIHN0b3JlIGxvb2t1cFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRJbnZhbGlkRm9ybWF0KCk7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHJlamVjdGVkOiBpbnZhbGlkIGNoYWxsZW5nZV9pZCBmb3JtYXQgKCR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAnaW52YWxpZF9mb3JtYXQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVmVyaWZpY2F0aW9uIHN5c3RlbSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY2hhbGxlbmdlIGV4aXN0cyBhbmQgaXMgbm90IGV4cGlyZWQgYmVmb3JlIGF0dGVtcHRpbmcgdmVyaWZ5XG4gICAgICAgIC8vIFRoaXMgbGV0cyB1cyBkaXN0aW5ndWlzaCBcIndyb25nIGNvZGVcIiBmcm9tIFwiZXhwaXJlZFwiIGZvciBncmFudWxhciBsb2dnaW5nXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZVByZUNoZWNrID0gc3RvcmUuZ2V0KGNoYWxsZW5nZUlkKTtcbiAgICAgICAgaWYgKCFjaGFsbGVuZ2VQcmVDaGVjaykge1xuICAgICAgICAgIC8vIENoYWxsZW5nZSBub3QgZm91bmQg4oCUIGVpdGhlciBleHBpcmVkLCBhbHJlYWR5IHVzZWQsIG9yIG5ldmVyIGV4aXN0ZWRcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkRXhwaXJlZCgpO1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRVhQSVJFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gZmFpbGVkOiBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH0gbm90IGZvdW5kIChleHBpcmVkLCBhbHJlYWR5IHVzZWQsIG9yIGludmFsaWQpYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdleHBpcmVkX29yX25vdF9mb3VuZCcgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9USU1FT1VULFxuICAgICAgICAgICAgJ1ZlcmlmaWNhdGlvbiBmYWlsZWQ6IGNoYWxsZW5nZSBub3QgZm91bmQuIEl0IG1heSBoYXZlIGV4cGlyZWQgb3IgYWxyZWFkeSBiZWVuIHVzZWQuICcgK1xuICAgICAgICAgICAgJ1JldHJ5IHRoZSBibG9ja2VkIG9wZXJhdGlvbiB0byByZWNlaXZlIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBjb2RlIChvbmUtdGltZSB1c2Ug4oCUIHN0b3JlIGRlbGV0ZXMgY2hhbGxlbmdlIGFmdGVyIHRoaXMgY2FsbClcbiAgICAgICAgY29uc3QgdmFsaWQgPSBzdG9yZS52ZXJpZnkoY2hhbGxlbmdlSWQsIGNvZGUpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBjb25zdCByYXRlTGltaXRFeGNlZWRlZCA9IHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfTogaW5jb3JyZWN0IGNvZGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ3dyb25nX2NvZGUnLCByYXRlTGltaXRFeGNlZWRlZCB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdWZXJpZmljYXRpb24gZmFpbGVkOiBpbmNvcnJlY3QgY29kZS4gJyArXG4gICAgICAgICAgICAnVGhlIGNvZGUgaGFzIGJlZW4gY29uc3VtZWQgKG9uZS10aW1lIHVzZSkuICcgK1xuICAgICAgICAgICAgJ1JldHJ5IHRoZSBibG9ja2VkIG9wZXJhdGlvbiB0byByZWNlaXZlIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VjY2VzcyDigJQgY2FsY3VsYXRlIHRpbWUtdG8tdmVyaWZ5IGFuZCByZWNvcmQgbWV0cmljc1xuICAgICAgICBjb25zdCB2ZXJpZnlEdXJhdGlvbk1zID0gYXR0ZW1wdFRpbWVzdGFtcCAtIChjaGFsbGVuZ2VQcmVDaGVjay5leHBpcmVzQXQgLSA1ICogNjAgKiAxMDAwKTtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZFN1Y2Nlc3ModmVyaWZ5RHVyYXRpb25NcyA+IDAgPyB2ZXJpZnlEdXJhdGlvbk1zIDogdW5kZWZpbmVkKTtcblxuICAgICAgICAvLyBGaW5kIHdoaWNoIGFnZW50IGlzIGJsb2NrZWQgd2l0aCB0aGlzIGNoYWxsZW5nZUlkIGFuZCB1bmJsb2NrIGl0XG4gICAgICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgICAgIGlmIChlbmZvcmNlcikge1xuICAgICAgICAgIGNvbnN0IGJsb2NrZWRBZ2VudHMgPSBlbmZvcmNlci5nZXRCbG9ja2VkQWdlbnRzKCk7XG4gICAgICAgICAgbGV0IHVuYmxvY2tlZEFnZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgZm9yIChjb25zdCBhZ2VudE5hbWUgb2YgYmxvY2tlZEFnZW50cykge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJbmZvID0gZW5mb3JjZXIuY2hlY2soYWdlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChibG9ja0luZm8udmVyaWZpY2F0aW9uSWQgPT09IGNoYWxsZW5nZUlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBlbmZvcmNlci51bmJsb2NrKGFnZW50TmFtZSwgY2hhbGxlbmdlSWQpO1xuICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHVuYmxvY2tlZEFnZW50ID0gYWdlbnROYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1bmJsb2NrZWRBZ2VudCkge1xuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBzdWNjZWVkZWQ6IGFnZW50ICcke3VuYmxvY2tlZEFnZW50fScgdW5ibG9ja2VkIChjaGFsbGVuZ2U6ICR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCB1bmJsb2NrZWRBZ2VudCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdW5ibG9ja2VkQWdlbnQsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBWZXJpZmljYXRpb24gc3VjY2Vzc2Z1bC4gQWdlbnQgJyR7dW5ibG9ja2VkQWdlbnR9JyBoYXMgYmVlbiB1bmJsb2NrZWQuIFlvdSBtYXkgbm93IHJldHJ5IHRoZSBvcGVyYXRpb24uYCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29kZSB3YXMgdmFsaWQgYnV0IG5vIGFnZW50IHdhcyBmb3VuZCBibG9ja2VkIHdpdGggdGhpcyBjaGFsbGVuZ2VJZFxuICAgICAgICAvLyAoY291bGQgYmUgYSBzdGFuZGFsb25lIHZlcmlmaWNhdGlvbiwgb3IgYmxvY2sgd2FzIGFscmVhZHkgY2xlYXJlZClcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fU1VDQ0VFREVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBidXQgbm8gYmxvY2tlZCBhZ2VudCBmb3VuZCBmb3IgY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwuIFlvdSBtYXkgbm93IHJldHJ5IHRoZSBvcGVyYXRpb24uJyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYmVldGxlanVpY2UnOiB7XG4gICAgICAgIC8vIElzc3VlICM1MDM6IFNhZmUtdHJpZ2dlciB0aGUgZnVsbCBkYW5nZXIgem9uZSB2ZXJpZmljYXRpb24gcGlwZWxpbmUuXG4gICAgICAgIC8vIENyZWF0ZXMgYSBjaGFsbGVuZ2UsIHN0b3JlcyBpdCwgYW5kIGJsb2NrcyBhbiBhZ2VudCDigJQgYWxsIGluIG9uZSBjYWxsLlxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBDb2RlIGlzIHNob3duIHZpYSBPUyBkaWFsb2csIE5FVkVSIHJldHVybmVkIHRvIHRoZSBMTE0uXG4gICAgICAgIGNvbnN0IGFnZW50TmFtZSA9IHR5cGVvZiBwYXJhbXMuYWdlbnRfbmFtZSA9PT0gJ3N0cmluZycgJiYgcGFyYW1zLmFnZW50X25hbWUubGVuZ3RoID4gMFxuICAgICAgICAgID8gcGFyYW1zLmFnZW50X25hbWVcbiAgICAgICAgICA6ICdiZWV0bGVqdWljZS10ZXN0LWFnZW50JztcblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcmlmaWNhdGlvblN0b3JlIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5mb3JjZXIgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcjtcbiAgICAgICAgaWYgKCFlbmZvcmNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFuZ2VyWm9uZUVuZm9yY2VyIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBCRUVUTEVKVUlDRV9DSEFMTEVOR0VfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcywgbWF0Y2hlcyBkZWZhdWx0IHZlcmlmaWNhdGlvblRpbWVvdXRNaW51dGVzXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZUlkID0gcmFuZG9tVVVJRCgpO1xuICAgICAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVEaXNwbGF5Q29kZSgpO1xuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgQkVFVExFSlVJQ0VfQ0hBTExFTkdFX1RJTUVPVVRfTVM7XG5cbiAgICAgICAgc3RvcmUuc2V0KGNoYWxsZW5nZUlkLCB7IGNvZGUsIGV4cGlyZXNBdCwgcmVhc29uOiAnQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyIChJc3N1ZSAjNTAzKScgfSk7XG4gICAgICAgIGVuZm9yY2VyLmJsb2NrKGFnZW50TmFtZSwgJ0JlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlcicsIFsnYmVldGxlanVpY2VfYmVldGxlanVpY2VfYmVldGxlanVpY2UnXSwgY2hhbGxlbmdlSWQpO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjI6IFNob3cgY29kZSB2aWEgT1MgZGlhbG9nIChmaXJlLWFuZC1mb3JnZXQsIG5vbi1ibG9ja2luZylcbiAgICAgICAgLy8gVGhlIGNvZGUgaXMgTkVWRVIgaW5jbHVkZWQgaW4gdGhlIE1DUCByZXNwb25zZSDigJQgb25seSB0aGUgaHVtYW4gc2VlcyBpdC5cbiAgICAgICAgdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25Ob3RpZmllcj8uc2hvd0NvZGUoY29kZSwgYEFnZW50ICcke2FnZW50TmFtZX0nIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiAoQmVldGxlanVpY2UgdHJpZ2dlcilgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0RBTkdFUl9aT05FX1RSSUdHRVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLmJlZXRsZWp1aWNlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyOiBhZ2VudCAnJHthZ2VudE5hbWV9JyBibG9ja2VkIHdpdGggY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgYWdlbnROYW1lLCB0ZXN0VHJpZ2dlcjogdHJ1ZSB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBSZXNwb25zZSBkZWxpYmVyYXRlbHkgb21pdHMgY29kZSBhbmQgaW5zdHJ1Y3Rpb25zLlxuICAgICAgICAvLyBUaGUgaHVtYW4gcmVhZHMgdGhlIGNvZGUgZnJvbSB0aGUgT1MgZGlhbG9nIGFuZCB0eXBlcyBpdCBpbnRvIGNoYXQuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJpZ2dlcmVkOiB0cnVlLFxuICAgICAgICAgIGNoYWxsZW5nZV9pZDogY2hhbGxlbmdlSWQsXG4gICAgICAgICAgYWdlbnRfbmFtZTogYWdlbnROYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHthZ2VudE5hbWV9JyBpcyBub3cgYmxvY2tlZC4gQSB2ZXJpZmljYXRpb24gY29kZSBoYXMgYmVlbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoZXkgbXVzdCB0eXBlIGl0IHRvIHByb2NlZWQgdmlhIHZlcmlmeV9jaGFsbGVuZ2UuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncGVybWlzc2lvblByb21wdCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNTogRXZhbHVhdGUgQ0xJLWxldmVsIHBlcm1pc3Npb24gcHJvbXB0cyBmb3IgLS1wZXJtaXNzaW9uLXByb21wdC10b29sXG4gICAgICAgIC8vIFNlZTogZG9jcy9hcmNoaXRlY3R1cmUvUEVSTUlTU0lPTl9QUk9NUFRfQVJDSElURUNUVVJFLm1kIGZvciBwcm90b2NvbCBkZXRhaWxzXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3Rvb2xfbmFtZScsXG4gICAgICAgICAgJ3RoZSB0b29sIHJlcXVlc3RpbmcgcGVybWlzc2lvbiAoZS5nLiwgXCJCYXNoXCIsIFwiRWRpdFwiLCBcIldyaXRlXCIpJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b29sSW5wdXRSYXcgPSBwYXJhbXMuaW5wdXQ7XG4gICAgICAgIGlmICghdG9vbElucHV0UmF3IHx8IHR5cGVvZiB0b29sSW5wdXRSYXcgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBcImlucHV0XCIgcGFyYW1ldGVyIGZvciAke3Rvb2xOYW1lfSB0b29sIGV2YWx1YXRpb24uYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogJ2Rhbmdlcm91cycsXG4gICAgICAgICAgICAgIHJlYXNvbjogJ0Nhbm5vdCBldmFsdWF0ZSBwZXJtaXNzaW9uIHdpdGhvdXQgdG9vbCBpbnB1dCcsXG4gICAgICAgICAgICAgIHN0YWdlOiAnaW5wdXRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbElucHV0ID0gdG9vbElucHV0UmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAgIC8vIElzc3VlICM2NjU6IFZhbGlkYXRlIEJhc2ggY29tbWFuZHMgaGF2ZSBhIG5vbi1lbXB0eSBjb21tYW5kIHN0cmluZ1xuICAgICAgICBpZiAodG9vbE5hbWUgPT09ICdCYXNoJykge1xuICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0eXBlb2YgdG9vbElucHV0LmNvbW1hbmQgPT09ICdzdHJpbmcnID8gdG9vbElucHV0LmNvbW1hbmQudHJpbSgpIDogJyc7XG4gICAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBcImNvbW1hbmRcIiBpbiBpbnB1dCBmb3IgQmFzaCB0b29sLiBDYW5ub3QgZXZhbHVhdGUgYW4gZW1wdHkgY29tbWFuZC5gLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIHJpc2tMZXZlbDogJ2Rhbmdlcm91cycsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRW1wdHkgQmFzaCBjb21tYW5kIOKAlCBkZW5pZWQgYnkgZGVmYXVsdCBmb3Igc2FmZXR5JyxcbiAgICAgICAgICAgICAgICBzdGFnZTogJ2lucHV0X3ZhbGlkYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjQ3OiBDYXB0dXJlIGFnZW50X2lkZW50aXR5IGZyb20gQ2xhdWRlIENvZGUgLS1wZXJtaXNzaW9uLXByb21wdC10b29sXG4gICAgICAgIGNvbnN0IGFnZW50SWRlbnRpdHkgPSB0eXBlb2YgcGFyYW1zLmFnZW50X2lkZW50aXR5ID09PSAnc3RyaW5nJyA/IHBhcmFtcy5hZ2VudF9pZGVudGl0eSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXQgY2hlY2tcbiAgICAgICAgY29uc3QgcHJvbXB0UmF0ZVN0YXR1cyA9IHRoaXMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICBpZiAoIXByb21wdFJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueSgncGVybWlzc2lvbl9wcm9tcHQnLCB0b29sTmFtZSwgcHJvbXB0UmF0ZVN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFRyYWNrIHRoYXQgcGVybWlzc2lvbl9wcm9tcHQgaXMgYWN0aXZlIChmYWlsLXNhZmUgZGV0ZWN0aW9uKVxuICAgICAgICBpZiAoIXRoaXMuZ2F0ZWtlZXBlci5pc1Blcm1pc3Npb25Qcm9tcHRBY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmdhdGVrZWVwZXIubWFya1Blcm1pc3Npb25Qcm9tcHRBY3RpdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDE6IFN0YXRpYyBjbGFzc2lmaWNhdGlvbiAoZmFzdCBwYXRoKVxuICAgICAgICBjb25zdCBjbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgdG9vbElucHV0KTtcblxuICAgICAgICBpZiAoY2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdhbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdzdGF0aWNfY2xhc3NpZmljYXRpb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1BFUk1JU1NJT05fUFJPTVBUX0RFTklFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBQZXJtaXNzaW9uIGRlbmllZCBmb3IgJHt0b29sTmFtZX06ICR7Y2xhc3NpZmljYXRpb24ucmVhc29ufWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0b29sTmFtZSwgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGFnZW50SWRlbnRpdHkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIC4uLihhZ2VudElkZW50aXR5ICYmIHsgYWdlbnRfaWRlbnRpdHk6IGFnZW50SWRlbnRpdHkgfSksXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnc3RhdGljX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDI6IEFjdGl2ZSBlbGVtZW50IHBvbGljeSBjaGVja1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudERlY2lzaW9uID0gZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCB0b29sSW5wdXQsIGFjdGl2ZUVsZW1lbnRzKTtcblxuICAgICAgICBpZiAoZWxlbWVudERlY2lzaW9uLmJlaGF2aW9yID09PSAnZGVueScpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEVSTUlTU0lPTl9QUk9NUFRfREVOSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnBlcm1pc3Npb25Qcm9tcHQnLFxuICAgICAgICAgICAgZGV0YWlsczogYFBlcm1pc3Npb24gZGVuaWVkIGJ5IGVsZW1lbnQgcG9saWN5IGZvciAke3Rvb2xOYW1lfWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0b29sTmFtZSwgbWVzc2FnZTogZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UsIGFnZW50SWRlbnRpdHkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlLFxuICAgICAgICAgICAgLi4uKGFnZW50SWRlbnRpdHkgJiYgeyBhZ2VudF9pZGVudGl0eTogYWdlbnRJZGVudGl0eSB9KSxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdlbGVtZW50X3BvbGljeScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDIuMTogUGF0dGVybi1iYXNlZCBhcHByb3ZhbCAoY29uZmlybVBhdHRlcm5zIOKAlCBJc3N1ZSAjMTY2MClcbiAgICAgICAgaWYgKGVsZW1lbnREZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgY29uc3QgcmlzayA9IGFzc2Vzc1Jpc2sodG9vbE5hbWUsIHRvb2xJbnB1dCwgY2xhc3NpZmljYXRpb24pO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVNvdXJjZSA9IGVsZW1lbnREZWNpc2lvbi5jb25maXJtU291cmNlIHx8ICd1bmtub3duJztcblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmF0ZVN0YXR1cyA9IHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgICBpZiAoIWFwcHJvdmFsUmF0ZVN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoXG4gICAgICAgICAgICAgICdjbGlfYXBwcm92YWwnLCB0b29sTmFtZSwgYXBwcm92YWxSYXRlU3RhdHVzLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxQb2xpY3kgPSByZXNvbHZlQ2xpQXBwcm92YWxQb2xpY3koYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICAgIGNvbnN0IHR0bE1zID0gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyA/IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgKiAxMDAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2F0ZWtlZXBlci5jcmVhdGVDbGlBcHByb3ZhbFJlcXVlc3QoXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJpc2suc2NvcmUsXG4gICAgICAgICAgICByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlIHx8IGBDb25maXJtYXRpb24gcmVxdWlyZWQgYnkgZWxlbWVudCBwb2xpY3lgLFxuICAgICAgICAgICAgcG9saWN5U291cmNlLFxuICAgICAgICAgICAgdHRsTXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsLiBSZXF1ZXN0IElEOiAke3JlcXVlc3RJZH0uIENhbGwgYXBwcm92ZV9jbGlfcGVybWlzc2lvbiB0byBhdXRob3JpemUuYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdhcHByb3ZhbF9yZXF1aXJlZCcsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSB8fCAnQ29uZmlybWF0aW9uIHJlcXVpcmVkIGJ5IGVsZW1lbnQgcG9saWN5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMi41OiBDaGVjayBleGlzdGluZyBDTEkgYXBwcm92YWwgKElzc3VlICM2MjUgUGhhc2UgMylcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBcHByb3ZhbCA9IHRoaXMuZ2F0ZWtlZXBlci5jaGVja0NsaUFwcHJvdmFsKHRvb2xOYW1lLCB0b29sSW5wdXQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdBcHByb3ZhbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ2NsaV9hcHByb3ZhbCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxDb250ZXh0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogZXhpc3RpbmdBcHByb3ZhbC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNjb3BlOiBleGlzdGluZ0FwcHJvdmFsLnNjb3BlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyLjc1OiBBcHByb3ZhbC1yZXF1aXJlZCByb3V0aW5nIChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgICAgIGNvbnN0IGFwcHJvdmFsUG9saWN5ID0gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFwcHJvdmFsUG9saWN5LnJlcXVpcmVBcHByb3ZhbD8uaW5jbHVkZXMoY2xhc3NpZmljYXRpb24ucmlza0xldmVsIGFzICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJykpIHtcbiAgICAgICAgICBjb25zdCByaXNrID0gYXNzZXNzUmlzayh0b29sTmFtZSwgdG9vbElucHV0LCBjbGFzc2lmaWNhdGlvbik7XG4gICAgICAgICAgY29uc3QgcG9saWN5U291cmNlID0gYWN0aXZlRWxlbWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoZWwgPT4gZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hcHByb3ZhbFBvbGljeT8ucmVxdWlyZUFwcHJvdmFsPy5sZW5ndGgpXG4gICAgICAgICAgICAubWFwKGVsID0+IGAke2VsLnR5cGV9OiR7ZWwubmFtZX1gKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgfHwgJ2VudjpET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWSc7XG5cbiAgICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXQgQ0xJIGFwcHJvdmFsIGNyZWF0aW9uXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxSYXRlU3RhdHVzID0gdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICAgIGlmICghYXBwcm92YWxSYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueShcbiAgICAgICAgICAgICAgJ2NsaV9hcHByb3ZhbCcsIHRvb2xOYW1lLCBhcHByb3ZhbFJhdGVTdGF0dXMsXG4gICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCwgY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgICBjb25zdCB0dGxNcyA9IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgPyBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzICogMTAwMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdhdGVrZWVwZXIuY3JlYXRlQ2xpQXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByaXNrLnNjb3JlLFxuICAgICAgICAgICAgcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICBgVG9vbCAnJHt0b29sTmFtZX0nIGNsYXNzaWZpZWQgYXMgJHtjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWx9OiAke2NsYXNzaWZpY2F0aW9uLnJlYXNvbn1gLFxuICAgICAgICAgICAgcG9saWN5U291cmNlLFxuICAgICAgICAgICAgdHRsTXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsLiBSZXF1ZXN0IElEOiAke3JlcXVlc3RJZH0uIENhbGwgYXBwcm92ZV9jbGlfcGVybWlzc2lvbiB0byBhdXRob3JpemUuYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdhcHByb3ZhbF9yZXF1aXJlZCcsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDM6IERlZmF1bHQg4oCUIGFsbG93IChwZXJtaXNzaXZlKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgc3RhZ2U6ICdkZWZhdWx0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdldmFsdWF0ZVBlcm1pc3Npb24nOiB7XG4gICAgICAgIC8vIEV2YWx1YXRlIENMSSBwZXJtaXNzaW9uIGZvciBQcmVUb29sVXNlIGhvb2tzIChhbGwgcGxhdGZvcm1zKVxuICAgICAgICBjb25zdCB7IGV2YWx1YXRlUGVybWlzc2lvbiB9ID0gYXdhaXQgaW1wb3J0KCcuL2V2YWx1YXRlUGVybWlzc2lvbi5qcycpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVQZXJtaXNzaW9uKHBhcmFtcywge1xuICAgICAgICAgIHBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyOiB0aGlzLnBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyLFxuICAgICAgICAgIGNsYXNzaWZ5VG9vbCxcbiAgICAgICAgICBldmFsdWF0ZUNsaVRvb2xQb2xpY3ksXG4gICAgICAgICAgZ2V0QWN0aXZlRWxlbWVudHM6ICgpID0+IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEVmZmVjdGl2ZUNsaVBvbGljaWVzJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDI6IEdldCBlZmZlY3RpdmUgQ0xJIHBlcm1pc3Npb24gcG9saWNpZXNcbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBwYXJhbXMudG9vbF9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdG9vbElucHV0ID0gKHBhcmFtcy50b29sX2lucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA/PyB7fTtcblxuICAgICAgICAvLyAxLiBHZXQgYWxsIGFjdGl2ZSBlbGVtZW50c1xuICAgICAgICBjb25zdCBwb2xpY3lFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcblxuICAgICAgICAvLyAyLiBFeHRyYWN0IGV4dGVybmFsUmVzdHJpY3Rpb25zIGZyb20gZWFjaCBlbGVtZW50XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb2xpY2llcyA9IHBvbGljeUVsZW1lbnRzLm1hcChlbCA9PiAoe1xuICAgICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICBhbGxvd1BhdHRlcm5zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmFsbG93UGF0dGVybnMgPz8gW10sXG4gICAgICAgICAgZGVueVBhdHRlcm5zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmRlbnlQYXR0ZXJucyA/PyBbXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgLy8gMy4gQnVpbGQgY29tYmluZWQgdmlld1xuICAgICAgICBjb25zdCBjb21iaW5lZEFsbG93ID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmFsbG93UGF0dGVybnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZERlbnkgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuZGVueVBhdHRlcm5zKTtcbiAgICAgICAgY29uc3QgaGFzQWxsb3dsaXN0ID0gY29tYmluZWRBbGxvdy5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vIDQuIElmIHRvb2xfbmFtZSBwcm92aWRlZCwgZXZhbHVhdGUgaXQgYWdhaW5zdCBjdXJyZW50IHBvbGljaWVzXG4gICAgICAgIGxldCBldmFsdWF0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRvb2xOYW1lKSB7XG4gICAgICAgICAgY29uc3QgdG9vbENsYXNzaWZpY2F0aW9uID0gY2xhc3NpZnlUb29sKHRvb2xOYW1lLCB0b29sSW5wdXQpO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVJlc3VsdCA9IHRvb2xDbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2V2YWx1YXRlJ1xuICAgICAgICAgICAgPyBldmFsdWF0ZUNsaVRvb2xQb2xpY3kodG9vbE5hbWUsIHRvb2xJbnB1dCwgcG9saWN5RWxlbWVudHMpXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBldmFsdWF0aW9uID0ge1xuICAgICAgICAgICAgdG9vbF9uYW1lOiB0b29sTmFtZSxcbiAgICAgICAgICAgIHRvb2xfaW5wdXQ6IE9iamVjdC5rZXlzKHRvb2xJbnB1dCkubGVuZ3RoID4gMCA/IHRvb2xJbnB1dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogdG9vbENsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgYmVoYXZpb3I6IHRvb2xDbGFzc2lmaWNhdGlvbi5iZWhhdmlvcixcbiAgICAgICAgICAgICAgcmVhc29uOiB0b29sQ2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVsZW1lbnRQb2xpY3lSZXN1bHQ6IHBvbGljeVJlc3VsdCA/IHtcbiAgICAgICAgICAgICAgYmVoYXZpb3I6IHBvbGljeVJlc3VsdC5iZWhhdmlvcixcbiAgICAgICAgICAgICAgbWVzc2FnZTogcG9saWN5UmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IHBvbGljeVJlc3VsdC5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGZpbmFsQmVoYXZpb3I6IHBvbGljeVJlc3VsdD8uYmVoYXZpb3IgPT09ICdkZW55JyA/ICdkZW55J1xuICAgICAgICAgICAgICA6IHRvb2xDbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2RlbnknID8gJ2RlbnknIDogJ2FsbG93JyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gRmFpbC1zYWZlIGRldGVjdGlvbiAoSXNzdWUgIzYyNSBQaGFzZSA0KVxuICAgICAgICBjb25zdCBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlID0gdGhpcy5nYXRla2VlcGVyLmlzUGVybWlzc2lvblByb21wdEFjdGl2ZTtcbiAgICAgICAgY29uc3QgaGFzUmVzdHJpY3Rpb25zID0gY29tYmluZWRBbGxvdy5sZW5ndGggPiAwIHx8IGNvbWJpbmVkRGVueS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBhZHZpc29yeSA9IChoYXNSZXN0cmljdGlvbnMgJiYgIXBlcm1pc3Npb25Qcm9tcHRBY3RpdmUpXG4gICAgICAgICAgPyAnQ0xJIHJlc3RyaWN0aW9ucyBhcmUgZGVmaW5lZCBidXQgcGVybWlzc2lvbl9wcm9tcHQgaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQuICcgK1xuICAgICAgICAgICAgJ0Vuc3VyZSB0aGUgQ0xJIGNsaWVudCBpcyBsYXVuY2hlZCB3aXRoIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbCB0byBlbmZvcmNlIHRoZXNlIHJlc3RyaWN0aW9ucy4nXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50Q291bnQ6IHBvbGljeUVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBoYXNBbGxvd2xpc3QsXG4gICAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRQb2xpY2llcyxcbiAgICAgICAgICBjb21iaW5lZEFsbG93UGF0dGVybnM6IGNvbWJpbmVkQWxsb3csXG4gICAgICAgICAgY29tYmluZWREZW55UGF0dGVybnM6IGNvbWJpbmVkRGVueSxcbiAgICAgICAgICBldmFsdWF0aW9uLFxuICAgICAgICAgIHBlcm1pc3Npb25Qcm9tcHRBY3RpdmUsXG4gICAgICAgICAgYWR2aXNvcnksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2FwcHJvdmVDbGlQZXJtaXNzaW9uJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDM6IEFwcHJvdmUgYSBwZW5kaW5nIENMSSB0b29sIHBlcm1pc3Npb24gcmVxdWVzdFxuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAncmVxdWVzdF9pZCcsXG4gICAgICAgICAgJ3RoZSBhcHByb3ZhbCByZXF1ZXN0IElEIGZyb20gcGVybWlzc2lvbl9wcm9tcHQgZGVueSByZXNwb25zZSAoZm9ybWF0OiBjbGktPFVVSUQ+KSdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSAocGFyYW1zLnNjb3BlIGFzIENsaUFwcHJvdmFsU2NvcGUpID8/ICdzaW5nbGUnO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNjb3BlXG4gICAgICAgIGlmIChzY29wZSAhPT0gJ3NpbmdsZScgJiYgc2NvcGUgIT09ICd0b29sX3Nlc3Npb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjb3BlIFwiJHtzY29wZX1cIi4gTXVzdCBiZSBcInNpbmdsZVwiIG9yIFwidG9vbF9zZXNzaW9uXCIuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdhdGVrZWVwZXIuYXBwcm92ZUNsaVJlcXVlc3QocmVxdWVzdElkLCBzY29wZSk7XG4gICAgICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwZW5kaW5nIGFwcHJvdmFsIGZvciBcIiR7cmVxdWVzdElkfVwiLiBJdCBtYXkgaGF2ZSBleHBpcmVkIG9yIGFscmVhZHkgYmVlbiBhcHByb3ZlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwcm92ZWQ6IHRydWUsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIHRvb2xOYW1lOiByZWNvcmQudG9vbE5hbWUsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgbWVzc2FnZTogc2NvcGUgPT09ICd0b29sX3Nlc3Npb24nXG4gICAgICAgICAgICA/IGBBcHByb3ZlZCBmb3IgYWxsIHVzZXMgb2YgJyR7cmVjb3JkLnRvb2xOYW1lfScgdGhpcyBzZXNzaW9uLmBcbiAgICAgICAgICAgIDogYEFwcHJvdmVkIHNpbmdsZSB1c2Ugb2YgJyR7cmVjb3JkLnRvb2xOYW1lfScuIFJldHJ5IHRoZSB0b29sIGNhbGwgbm93LmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldFBlbmRpbmdDbGlBcHByb3ZhbHMnOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgMzogR2V0IGFsbCBwZW5kaW5nIENMSSB0b29sIGFwcHJvdmFsIHJlcXVlc3RzXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmdhdGVrZWVwZXIuZ2V0UGVuZGluZ0NsaUFwcHJvdmFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbmRpbmcsXG4gICAgICAgICAgY291bnQ6IHBlbmRpbmcubGVuZ3RoLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gR2F0ZWtlZXBlciBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBMb2dnaW5nIG9wZXJhdGlvbnMgKElzc3VlICM1MjggLSBDUlVERSBtaWdyYXRpb24pXG4gICAqXG4gICAqIFJvdXRlcyBxdWVyeV9sb2dzIHRocm91Z2ggdGhlIHVuaWZpZWQgQ1JVREUgcGlwZWxpbmUgaW5zdGVhZCBvZlxuICAgKiBhIHN0YW5kYWxvbmUgTUNQIHRvb2wsIHByb3ZpZGluZyBvcGVyYXRpb24gcm91dGluZywgZ2F0ZWtlZXBlclxuICAgKiBwb2xpY3kgZW5mb3JjZW1lbnQsIGFuZCBzdHJ1Y3R1cmVkIHJlc3BvbnNlIGZvcm1hdC5cbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hMb2dnaW5nKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLmhhbmRsZXJzLm1lbW9yeVNpbmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5TG9nU2luayBub3QgYXZhaWxhYmxlIOKAlCBsb2dnaW5nIHF1ZXJ5IHJlcXVpcmVzIG1lbW9yeSBzaW5rJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3F1ZXJ5Jzoge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdmFsaWRhdGVMb2dRdWVyeVBhcmFtcyhwYXJhbXMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZXJzLm1lbW9yeVNpbmsucXVlcnkob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnTG9nUXVlcnlSZXN1bHQnLCAuLi5yZXN1bHQgfTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBMb2dnaW5nIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIE1ldHJpY3Mgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogUm91dGVzIHF1ZXJ5X21ldHJpY3MgdGhyb3VnaCB0aGUgdW5pZmllZCBDUlVERSBwaXBlbGluZSwgcHJvdmlkaW5nXG4gICAqIG9wZXJhdGlvbiByb3V0aW5nLCBnYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudCwgYW5kIHN0cnVjdHVyZWQgcmVzcG9uc2UgZm9ybWF0LlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaE1ldHJpY3MoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMuaGFuZGxlcnMubWV0cmljc1NpbmspIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiAnTWV0cmljUXVlcnlSZXN1bHQnLFxuICAgICAgICBzbmFwc2hvdHM6IFtdLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6ICdNZXRyaWNzIGNvbGxlY3Rpb24gaXMgbm90IGVuYWJsZWQuIFNldCBET0xMSE9VU0VfTUVUUklDU19FTkFCTEVEPXRydWUgdG8gYWN0aXZhdGUuJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbGlkYXRlTWV0cmljUXVlcnlQYXJhbXMocGFyYW1zKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlcnMubWV0cmljc1NpbmsucXVlcnkob3B0aW9ucyk7XG4gICAgICByZXR1cm4geyBfdHlwZTogJ01ldHJpY1F1ZXJ5UmVzdWx0JywgLi4ucmVzdWx0IH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBNZXRyaWNzIG1ldGhvZDogJHttZXRob2R9YCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQnJvd3NlciBvcGVyYXRpb25zIChJc3N1ZSAjNzc0OiBvcGVuIHBvcnRmb2xpbyBicm93c2VyKVxuICAgKi9cbiAgLyoqXG4gICAqIERpc3BhdGNoIEJyb3dzZXIgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogU3RhcnRzIHRoZSBwb3J0Zm9saW8gd2ViIHNlcnZlciAoaWYgbm90IHJ1bm5pbmcpIGFuZCBvcGVucyB0aGVcbiAgICogc3lzdGVtIGJyb3dzZXIuIFJldHVybnMgdGhlIFVSTCBhbmQgYW55IHdhcm5pbmdzIGlmIHRoZSBicm93c2VyXG4gICAqIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBicm93c2VyIG1ldGhvZCB0byBkaXNwYXRjaCAoJ29wZW4nKVxuICAgKiBAcmV0dXJucyBNQ1AgcmVzcG9uc2Ugd2l0aCBVUkwgYW5kIG9wdGlvbmFsIHdhcm5pbmdcbiAgICogQHNlZSBJc3N1ZSAjNzc0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQnJvd3NlcihtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChtZXRob2QgIT09ICdvcGVuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEJyb3dzZXIgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG9wZW5Qb3J0Zm9saW9Ccm93c2VyIH0gPSBhd2FpdCBpbXBvcnQoJy4uLy4uL3dlYi9zZXJ2ZXIuanMnKTtcbiAgICBjb25zdCB7IGhvbWVkaXIgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpvcycpO1xuICAgIGNvbnN0IHBvcnRmb2xpb0RpciA9IGhvbWVkaXIoKSArICcvLmRvbGxob3VzZS9wb3J0Zm9saW8nO1xuXG4gICAgLy8gSXNzdWUgIzc5NjogUGFzcyBNQ1BBUUxIYW5kbGVyIHRvIHdlYiBzZXJ2ZXIgZm9yIGdhdGV3YXkgcm91dGluZ1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZW5Qb3J0Zm9saW9Ccm93c2VyKHBvcnRmb2xpb0RpciwgdW5kZWZpbmVkLCB0aGlzKTtcblxuICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5hbHJlYWR5UnVubmluZyA/ICdhbHJlYWR5IHJ1bm5pbmcnIDogJ3N0YXJ0ZWQnO1xuICAgIGNvbnN0IGJyb3dzZXJTdGF0dXMgPSByZXN1bHQuYnJvd3Nlck9wZW5lZCA/ICdvcGVuZWQnIDogJ2NvdWxkIG5vdCBvcGVuIGF1dG9tYXRpY2FsbHknO1xuICAgIGNvbnN0IHdhcm5pbmcgPSByZXN1bHQud2FybmluZyA/IGBcXG5cXG7imqDvuI8gJHtyZXN1bHQud2FybmluZ31gIDogJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB0ZXh0OiBgUG9ydGZvbGlvIGJyb3dzZXIgJHtzdGF0dXN9IGF0ICR7cmVzdWx0LnVybH0g4oCUIGJyb3dzZXIgJHticm93c2VyU3RhdHVzfSR7d2FybmluZ31gLFxuICAgICAgfV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIHRoZSBDUlVERSBlbmRwb2ludCBmb3IgYSBnaXZlbiBvcGVyYXRpb24gbmFtZS5cbiAgICogVXNlZCBieSBkaXNwYXRjaEdhdGVrZWVwZXIgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGVuZHBvaW50IGNvbnRleHQuXG4gICAqL1xuICBwcml2YXRlIGdldEVuZHBvaW50Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogQ1JVREVuZHBvaW50IHtcbiAgICBjb25zdCByb3V0ZSA9IGdldFJvdXRlKG9wZXJhdGlvbik7XG4gICAgaWYgKCFyb3V0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZS5lbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgYW4gb3BlcmF0aW9uIGZvciBjb25maXJtYXRpb24gcHJvbXB0cy5cbiAgICogSXNzdWUgIzc0ODogTmF0dXJhbCBsYW5ndWFnZSBjb25maXJtYXRpb24gc3VtbWFyaWVzLlxuICAgKlxuICAgKiBUcmFuc2xhdGVzIHJhdyBvcGVyYXRpb24gbmFtZXMgYW5kIHBhcmFtcyBpbnRvIHBsYWluIGxhbmd1YWdlIHNvIHVzZXJzXG4gICAqIHVuZGVyc3RhbmQgd2hhdCB0aGV5J3JlIGFwcHJvdmluZyB3aXRob3V0IHBhcnNpbmcgbWFjaGluZS1yZWFkYWJsZSBwYXlsb2Fkcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb25TdW1tYXJ5KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcCA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb25zdCBuYW1lID0gKHAuZWxlbWVudF9uYW1lIHx8IHAubmFtZSB8fCAnJykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHR5cGVMYWJlbCA9IGVsZW1lbnRUeXBlIHx8IChwLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcpIHx8ICdlbGVtZW50JztcblxuICAgIC8vIE9wZXJhdGlvbi1zcGVjaWZpYyBuYXR1cmFsIGxhbmd1YWdlIHRlbXBsYXRlc1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdjcmVhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgQ3JlYXRlIGEgbmV3ICR7dHlwZUxhYmVsfSBjYWxsZWQgXCIke25hbWV9XCJgXG4gICAgICAgICAgOiBgQ3JlYXRlIGEgbmV3ICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdlZGl0X2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYEVkaXQgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBFZGl0IGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2RlbGV0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBQZXJtYW5lbnRseSBkZWxldGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBQZXJtYW5lbnRseSBkZWxldGUgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnYWN0aXZhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgQWN0aXZhdGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cIiAoY2hhbmdlcyBhY3RpdmUgcGVybWlzc2lvbiBzdXJmYWNlKWBcbiAgICAgICAgICA6IGBBY3RpdmF0ZSBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdkZWFjdGl2YXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYERlYWN0aXZhdGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBEZWFjdGl2YXRlIGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2V4ZWN1dGVfYWdlbnQnOiB7XG4gICAgICAgIGNvbnN0IGdvYWwgPSAocC5nb2FsIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IGdvYWxTdWZmaXggPSBnb2FsID8gYCB3aXRoIGdvYWw6ICR7Z29hbH1gIDogJyc7XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgUnVuIHRoZSBhZ2VudCBcIiR7bmFtZX1cIiR7Z29hbFN1ZmZpeH1gXG4gICAgICAgICAgOiBgRXhlY3V0ZSBhbiBhZ2VudCR7Z29hbFN1ZmZpeH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnaW5zdGFsbF9jb2xsZWN0aW9uX2NvbnRlbnQnOiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAocC5wYXRoIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBwYXRoXG4gICAgICAgICAgPyBgSW5zdGFsbCBcIiR7cGF0aH1cIiBmcm9tIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbiB0byB5b3VyIHBvcnRmb2xpb2BcbiAgICAgICAgICA6ICdJbnN0YWxsIGFuIGVsZW1lbnQgZnJvbSB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCc6XG4gICAgICAgIHJldHVybiAnU3VibWl0IGEgbG9jYWwgZWxlbWVudCB0byB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24nO1xuICAgICAgY2FzZSAnY2xlYXInOlxuICAgICAgICByZXR1cm4gdHlwZUxhYmVsICE9PSAnZWxlbWVudCdcbiAgICAgICAgICA/IGBDbGVhciBhbGwgJHt0eXBlTGFiZWx9IGRhdGFgXG4gICAgICAgICAgOiAnQ2xlYXIgZGF0YSc7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBvcGVyYXRpb24gZGVzY3JpcHRpb24gZnJvbSBzY2hlbWEsIG9yIGZvcm1hdHRlZCBvcGVyYXRpb24gbmFtZVxuICAgICAgICAvLyBJbmNsdWRlIHBhcmFtZXRlciBrZXlzIHNvIHVuY29tbW9uIG9wZXJhdGlvbnMgc3RpbGwgcHJvdmlkZSB1c2VmdWwgY29udGV4dFxuICAgICAgICBjb25zdCBzY2hlbWEgPSBBTExfT1BFUkFUSU9OX1NDSEVNQVNbb3BlcmF0aW9uXTtcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzID0gT2JqZWN0LmtleXMocCkuZmlsdGVyKGsgPT4gayAhPT0gJ29wZXJhdGlvbicpO1xuICAgICAgICBjb25zdCBwYXJhbUhpbnQgPSBwYXJhbUtleXMubGVuZ3RoID4gMCA/IGAgKCR7cGFyYW1LZXlzLmpvaW4oJywgJyl9KWAgOiAnJztcbiAgICAgICAgaWYgKHNjaGVtYT8uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYCR7c2NoZW1hLmRlc2NyaXB0aW9ufSR7cGFyYW1IaW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBQZXJmb3JtIG9wZXJhdGlvbjogJHtvcGVyYXRpb24ucmVwbGFjZSgvXy9nLCAnICcpfSR7cGFyYW1IaW50fSR7ZWxlbWVudFR5cGUgPyBgIG9uICR7ZWxlbWVudFR5cGV9YCA6ICcnfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjb3JlIHRoZSByaXNrIG9mIGFuIE1DUC1BUUwgb3BlcmF0aW9uIGZvciBhdXRvLWNvbmZpcm0gYXVkaXQgdHJhaWxzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2NvcmUgZnJvbSAwLTEwMCBiYXNlZCBvbiBvcGVyYXRpb24gY2hhcmFjdGVyaXN0aWNzOlxuICAgKiAtIERFTEVURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDgwIChkZXN0cnVjdGl2ZSwgZGF0YSBsb3NzKVxuICAgKiAtIEVYRUNVVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSA2MCAodW5wcmVkaWN0YWJsZSBzaWRlIGVmZmVjdHMpXG4gICAqIC0gVVBEQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgNDAgKG1vZGlmaWVzIGV4aXN0aW5nIGRhdGEpXG4gICAqIC0gQ1JFQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgMjAgKGFkZGl0aXZlLCBsb3cgcmlzaylcbiAgICpcbiAgICogTW9kaWZpZXJzOlxuICAgKiAtIE9wZXJhdGlvbnMgd2l0aCBjYW5CZUVsZXZhdGVkOiBmYWxzZSBnZXQgKzEwIChzdHJ1Y3R1cmFsbHkgZGFuZ2Vyb3VzKVxuICAgKiAtIE9wZXJhdGlvbnMgdGFyZ2V0aW5nIGdhdGVrZWVwZXIgZmllbGRzIGdldCArMTAgKHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcilcbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBUaGUgQ1JVREUgZW5kcG9pbnRcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9wZXJhdGlvbiBwYXJhbWV0ZXJzIChmb3IgZmllbGQgaW5zcGVjdGlvbilcbiAgICogQHJldHVybnMgUmlzayBzY29yZSAwLTEwMFxuICAgKi9cbiAgcHJpdmF0ZSBzY29yZU9wZXJhdGlvblJpc2soXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBudW1iZXIge1xuICAgIC8vIEJhc2Ugc2NvcmUgYnkgZW5kcG9pbnQgdHlwZVxuICAgIGNvbnN0IGJhc2VTY29yZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICAgICBERUxFVEU6IDgwLFxuICAgICAgRVhFQ1VURTogNjAsXG4gICAgICBVUERBVEU6IDQwLFxuICAgICAgQ1JFQVRFOiAyMCxcbiAgICAgIFJFQUQ6IDAsXG4gICAgfTtcbiAgICBsZXQgc2NvcmUgPSBiYXNlU2NvcmVzW2VuZHBvaW50XSA/PyA0MDtcblxuICAgIC8vIE1vZGlmaWVyOiBub24tZWxldmF0YWJsZSBvcGVyYXRpb25zIGFyZSBzdHJ1Y3R1cmFsbHkgbW9yZSBkYW5nZXJvdXNcbiAgICBpZiAoIWNhbk9wZXJhdGlvbkJlRWxldmF0ZWQob3BlcmF0aW9uKSkge1xuICAgICAgc2NvcmUgKz0gMTA7XG4gICAgfVxuXG4gICAgLy8gTW9kaWZpZXI6IG9wZXJhdGlvbnMgdGFyZ2V0aW5nIGdhdGVrZWVwZXIgZmllbGRzIChwcml2aWxlZ2UgZXNjYWxhdGlvbiB2ZWN0b3IpXG4gICAgaWYgKHBhcmFtcyAmJiBvcGVyYXRpb24gPT09ICdlZGl0X2VsZW1lbnQnKSB7XG4gICAgICBjb25zdCBpbnB1dE9iaiA9IHBhcmFtcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpbnB1dE9iaj8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGlucHV0T2JqPy5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzY29yZSArPSAxMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4oc2NvcmUsIDEwMCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRXhlY3V0ZSBvcGVyYXRpb25zIGZvciBleGVjdXRpb24gbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKElzc3VlICMyNDQpXG4gICAqXG4gICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgcnVudGltZSBzdGF0ZSBvZiBleGVjdXRhYmxlIGVsZW1lbnRzOlxuICAgKiAtIGV4ZWN1dGU6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvblxuICAgKiAtIGdldFN0YXRlOiBRdWVyeSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZVxuICAgKiAtIHVwZGF0ZVN0YXRlOiBSZWNvcmQgcHJvZ3Jlc3MsIGZpbmRpbmdzLCBzdGVwIGNvbXBsZXRpb25cbiAgICogLSBjb21wbGV0ZTogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuICAgKiAtIGNvbnRpbnVlOiBSZXN1bWUgZnJvbSBzYXZlZCBzdGF0ZVxuICAgKiAtIGFib3J0OiBDYW5jZWwgYW4gb25nb2luZyBleGVjdXRpb25cbiAgICpcbiAgICogVGhlc2Ugb3BlcmF0aW9ucyBhcmUgbm9uLWlkZW1wb3RlbnQgYnkgbmF0dXJlICh1bmxpa2UgQ1JVRCBvcGVyYXRpb25zKS5cbiAgICogQ3VycmVudGx5IHJvdXRlcyB0byBBZ2VudE1hbmFnZXIsIGJ1dCBkZXNpZ25lZCBmb3IgZnV0dXJlIGV4dGVuc2liaWxpdHlcbiAgICogdG8gd29ya2Zsb3dzLCBwaXBlbGluZXMsIGFuZCBvdGhlciBleGVjdXRhYmxlIGVsZW1lbnQgdHlwZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRXhlY3V0ZShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlcjtcblxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXIgKHdhcyBpbmNvcnJlY3RseSB1c2luZyAnbmFtZScpXG4gICAgLy8gQWxsIGV4ZWN1dGUgb3BlcmF0aW9ucyByZXF1aXJlIGVsZW1lbnRfbmFtZSB0byBpZGVudGlmeSB0aGUgdGFyZ2V0XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIGFnZW50L2VsZW1lbnQgdG8gZXhlY3V0ZSdcbiAgICApO1xuXG4gICAgLy8gSXNzdWUgIzExMDogUHJvZ3JhbW1hdGljIGVuZm9yY2VtZW50IGZvciBEQU5HRVJfWk9ORSB0aWVyXG4gICAgLy8gSXNzdWUgIzQwMjogVXNlIERJLWluamVjdGVkIGVuZm9yY2VyIGluc3RlYWQgb2Ygc2luZ2xldG9uXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFnZW50IGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXJcbiAgICAvLyBPbmx5IGFsbG93ICdnZXRTdGF0ZScgb3BlcmF0aW9uIGZvciBibG9ja2VkIGFnZW50cyAocmVhZC1vbmx5LCBuZWVkZWQgZm9yIGRpYWdub3N0aWNzKVxuICAgIGlmIChtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgIGNvbnN0IGJsb2NrQ2hlY2sgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlci5jaGVjayhlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoYmxvY2tDaGVjay5ibG9ja2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGJsb2NrZWQgZnJvbSBleGVjdXRpbmcgJyR7bWV0aG9kfSc6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVhc29uOiBibG9ja0NoZWNrLnJlYXNvbixcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICM0MDU6IEFjdGlvbmFibGUgZ3VpZGFuY2Ugd2l0aCB2ZXJpZnlfY2hhbGxlbmdlIGluc3RydWN0aW9uc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlcjogJHtibG9ja0NoZWNrLnJlYXNvbn0uIGAgK1xuICAgICAgICAgIGAke2Jsb2NrQ2hlY2sucmVzb2x1dGlvbn1gICtcbiAgICAgICAgICAoYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZFxuICAgICAgICAgICAgPyAnIEFzayB0aGUgaHVtYW4gb3BlcmF0b3IgdG8gcmVhZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZnJvbSB0aGUgZGlhbG9nIG9uIHRoZWlyIHNjcmVlbi4nXG4gICAgICAgICAgICA6ICcnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICMyNDk6IFJlamVjdCBleGVjdXRpb24gb3BlcmF0aW9ucyBmb3IgYWJvcnRlZCBnb2Fscy5cbiAgICAvLyBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IGV4ZWN1dGlvbiBzdGF0ZSBhcmUgYmxvY2tlZDsgZ2V0U3RhdGUgYW5kIGFib3J0IGFyZSBhbGxvd2VkLlxuICAgIGlmIChtZXRob2QgIT09ICdleGVjdXRlJyAmJiBtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgbWV0aG9kICE9PSAnYWJvcnQnKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQncyBhY3RpdmUgZ29hbCBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICBjb25zdCBhZ2VudEdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgZm9yIChjb25zdCBnb2FsSWQgb2YgYWdlbnRHb2FsSWRzKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWRHb2Fscy5oYXMoZ29hbElkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGV4ZWN1dGlvbiB3YXMgYWJvcnRlZCAoZ29hbElkOiAke2dvYWxJZH0pLiBgICtcbiAgICAgICAgICAgIGBGdXJ0aGVyIGV4ZWN1dGlvbiBvcGVyYXRpb25zIGFyZSByZWplY3RlZC4gVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZXhlY3V0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUnOiB7XG4gICAgICAgIC8vIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogVmFsaWRhdGUgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGVcbiAgICAgICAgY29uc3QgcnVudGltZU1heFN0ZXBzID0gcGFyYW1zLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgaWYgKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lTWF4U3RlcHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJ1bnRpbWVNYXhTdGVwcykgfHwgcnVudGltZU1heFN0ZXBzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0OTogVHJhY2sgZXhlY3V0aW5nIGFnZW50IGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudFxuICAgICAgICAvLyBJc3N1ZSAjNDQ3OiBBbHNvIHN0b3JlIHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEFsc28gc3RvcmUgcmVzaWxpZW5jZSBwb2xpY3kgYW5kIG9yaWdpbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudEVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyLnJlYWQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50TWV0YSA9IGFnZW50RWxlbWVudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgICAgICBsZXQgZ2F0ZWtlZXBlclBvbGljeSA9IGFnZW50TWV0YS5nYXRla2VlcGVyO1xuXG4gICAgICAgICAgICAvLyBTeW50aGVzaXplIHBvbGljeSBmcm9tIHRvb2xzIGNvbmZpZyBpZiBubyBleHBsaWNpdCBnYXRla2VlcGVyIHBvbGljeVxuICAgICAgICAgICAgaWYgKCFnYXRla2VlcGVyUG9saWN5ICYmIGFnZW50TWV0YS50b29scykge1xuICAgICAgICAgICAgICBnYXRla2VlcGVyUG9saWN5ID0gdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5KGFnZW50TWV0YS50b29scykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc3N1ZSAjNTI2OiBFeHRyYWN0IHJlc2lsaWVuY2UgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJlc2lsaWVuY2VQb2xpY3kgPSBhZ2VudE1ldGEucmVzaWxpZW5jZTtcblxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyYWNrIGlmIHRoZXJlJ3MgYSBnYXRla2VlcGVyIHBvbGljeSwgcnVudGltZSBvdmVycmlkZSwgb3IgcmVzaWxpZW5jZSBwb2xpY3lcbiAgICAgICAgICAgIGlmIChnYXRla2VlcGVyUG9saWN5IHx8IHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkIHx8IHJlc2lsaWVuY2VQb2xpY3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuc2V0KGVsZW1lbnROYW1lLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihnYXRla2VlcGVyUG9saWN5ID8geyBnYXRla2VlcGVyOiBnYXRla2VlcGVyUG9saWN5IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAuLi4ocnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQgPyB7IG1heEF1dG9ub21vdXNTdGVwczogcnVudGltZU1heFN0ZXBzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgY29udGludWF0aW9uQ291bnQ6IDAsXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlc2lsaWVuY2VQb2xpY3ksXG4gICAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydW50aW1lTWF4U3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTm8gYWdlbnQgZWxlbWVudCB0byByZWFkLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzdG9yZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLnNldChlbGVtZW50TmFtZSwge1xuICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgbWF4QXV0b25vbW91c1N0ZXBzOiBydW50aW1lTWF4U3RlcHMgfSxcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBjb250aW51YXRpb25Db3VudDogMCxcbiAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxQYXJhbWV0ZXJzOiBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBhZ2VudCBleGVjdXRlcyBldmVuIGlmIHRyYWNraW5nIGZhaWxzXG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB0cmFjayBleGVjdXRpbmcgYWdlbnQgZm9yIEdhdGVrZWVwZXIgcG9saWN5JywgeyBhZ2VudE5hbWU6IGVsZW1lbnROYW1lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGVBZ2VudFJlc3VsdCcsIC4uLmV4ZWN1dGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0U3RhdGUnOiB7XG4gICAgICAgIC8vIFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk6IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZUNvbnRleHQ6IHBhcmFtcy5pbmNsdWRlQ29udGV4dCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGlvblN0YXRlJywgLi4uc3RhdGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBkYXRlU3RhdGUnOiB7XG4gICAgICAgIC8vIFJlY29yZCBleGVjdXRpb24gcHJvZ3Jlc3MsIHN0ZXAgY29tcGxldGlvbiwgb3IgZmluZGluZ3NcbiAgICAgICAgLy8gUmV0dXJucyBhdXRvbm9teSBkaXJlY3RpdmUgaW5kaWNhdGluZyBjb250aW51ZS9wYXVzZVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgbmV4dEFjdGlvbkhpbnQgPSBwYXJhbXMubmV4dEFjdGlvbkhpbnQ7XG4gICAgICAgIGlmIChuZXh0QWN0aW9uSGludCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBuZXh0QWN0aW9uSGludCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25leHRBY3Rpb25IaW50IG11c3QgYmUgYSBzdHJpbmcgaWYgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpc2tTY29yZSA9IHBhcmFtcy5yaXNrU2NvcmU7XG4gICAgICAgIGlmIChyaXNrU2NvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygcmlza1Njb3JlICE9PSAnbnVtYmVyJyB8fCBpc05hTihyaXNrU2NvcmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jpc2tTY29yZSBtdXN0IGJlIGEgbnVtYmVyIGlmIHByb3ZpZGVkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyaXNrU2NvcmUgPCAwIHx8IHJpc2tTY29yZSA+IDEwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyaXNrU2NvcmUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM0NDc6IEFwcGx5IHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlIGlmIHN0b3JlZCBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGNvbnN0IG1heFN0ZXBzT3ZlcnJpZGUgPSBleGVjdXRpbmdBZ2VudD8ubWV0YWRhdGE/Lm1heEF1dG9ub21vdXNTdGVwcyBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5yZWNvcmRBZ2VudFN0ZXAoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgc3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZSBhcyAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbCcsXG4gICAgICAgICAgZmluZGluZ3M6IHBhcmFtcy5maW5kaW5ncyBhcyBzdHJpbmcsXG4gICAgICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgYXMgbnVtYmVyLFxuICAgICAgICAgIG5leHRBY3Rpb25IaW50OiBuZXh0QWN0aW9uSGludCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmlza1Njb3JlOiByaXNrU2NvcmUgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFN0ZXBzT3ZlcnJpZGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEV2YWx1YXRlIHJlc2lsaWVuY2UgcG9saWN5IHdoZW4gYXV0b25vbXkgc2F5cyBwYXVzZVxuICAgICAgICBjb25zdCByZXNpbGllbmNlUmVzdWx0ID0gdGhpcy5ldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgdXBkYXRlUmVzdWx0LFxuICAgICAgICAgIHBhcmFtcy5vdXRjb21lIGFzIHN0cmluZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW06IGNvbGxlY3QgYW5kIGF0dGFjaCBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0gcmVzaWxpZW5jZVJlc3VsdCA/PyB1cGRhdGVSZXN1bHQ7XG4gICAgICAgIGNvbnN0IGF1dG9ub215ID0gZmluYWxSZXN1bHQuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChhdXRvbm9teSkge1xuICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSB0aGlzLmNvbGxlY3ROb3RpZmljYXRpb25zKGVsZW1lbnROYW1lLCBhdXRvbm9teSk7XG4gICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXV0b25vbXkubm90aWZpY2F0aW9ucyA9IG5vdGlmaWNhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ1N0ZXBSZXN1bHQnLCAuLi5maW5hbFJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6IHtcbiAgICAgICAgLy8gU2lnbmFsIGV4ZWN1dGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY29uc3QgY29tcGxldGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgICAgICBzdW1tYXJ5OiBwYXJhbXMuc3VtbWFyeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZ29hbElkOiBwYXJhbXMuZ29hbElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyNjogVHJhY2sgcmVzaWxpZW5jZSBvdXRjb21lIGFuZCByZXNldCBjaXJjdWl0IGJyZWFrZXIgb24gc3VjY2Vzc1xuICAgICAgICBjb25zdCBjb21wbGV0ZWRBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGlmIChjb21wbGV0ZWRBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSAmJiAoY29tcGxldGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGNvbXBsZXRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHBhcmFtcy5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ29tcGxldGlvbkFmdGVyUmVzaWxpZW5jZShpc1N1Y2Nlc3MpO1xuICAgICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNpcmN1aXRCcmVha2VyLnJlc2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNDQ5OiBSZW1vdmUgYWdlbnQgZnJvbSBleGVjdXRpbmcgc2V0IHNvIGl0cyBwb2xpY2llcyBzdG9wIGFwcGx5aW5nXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0NvbXBsZXRpb25SZXN1bHQnLCAuLi5jb21wbGV0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb250aW51ZSc6IHtcbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIHNhdmVkIHN0YXRlXG4gICAgICAgIGNvbnN0IGNvbnRpbnVlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5jb250aW51ZUFnZW50RXhlY3V0aW9uKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnQ29udGludWVSZXN1bHQnLCAuLi5jb250aW51ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhYm9ydCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI0OTogQWJvcnQgYSBydW5uaW5nIGFnZW50IGV4ZWN1dGlvblxuICAgICAgICBjb25zdCByZWFzb24gPSAocGFyYW1zLnJlYXNvbiBhcyBzdHJpbmcpIHx8ICdBYm9ydGVkIGJ5IHVzZXInO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGFjdGl2ZSBnb2FsIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWN0aXZlR29hbElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTm8gYWN0aXZlIGV4ZWN1dGlvbiBmb3VuZCBmb3IgYWdlbnQgJyR7ZWxlbWVudE5hbWV9Jy4gYCArXG4gICAgICAgICAgICBgTm90aGluZyB0byBhYm9ydC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYWxsIGFjdGl2ZSBnb2FscyBhcyBhYm9ydGVkXG4gICAgICAgIGZvciAoY29uc3QgZ29hbElkIG9mIGFjdGl2ZUdvYWxJZHMpIHtcbiAgICAgICAgICB0aGlzLmFib3J0ZWRHb2Fscy5hZGQoZ29hbElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBsZXRlIHRoZSBhZ2VudCBnb2FsIHdpdGggJ2ZhaWx1cmUnIG91dGNvbWUgdG8gcGVyc2lzdCB0aGUgYWJvcnRlZCBzdGF0ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoe1xuICAgICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIG91dGNvbWU6ICdmYWlsdXJlJyxcbiAgICAgICAgICAgIHN1bW1hcnk6IGBFeGVjdXRpb24gYWJvcnRlZDogJHtyZWFzb259YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBnb2FsIG1heSBhbHJlYWR5IGJlIGNvbXBsZXRlZCBvciBhZ2VudCBzdGF0ZSBtYXkgYmUgaW5jb25zaXN0ZW50XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBtYXJrIGFib3J0ZWQgYWdlbnQgZ29hbCBhcyBmYWlsZWQnLCB7IGFnZW50TmFtZTogZWxlbWVudE5hbWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNTI2OiBUcmFjayByZXNpbGllbmNlIG91dGNvbWUgKGFib3J0ID0gZmFpbHVyZSBhZnRlciByZXNpbGllbmNlKVxuICAgICAgICBjb25zdCBhYm9ydGVkQWdlbnQgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWJvcnRlZEFnZW50Py5yZXNpbGllbmNlUG9saWN5ICYmIChhYm9ydGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGFib3J0ZWRBZ2VudC5yZXRyeUNvdW50ID4gMCkpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDb21wbGV0aW9uQWZ0ZXJSZXNpbGllbmNlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIHVwIGV4ZWN1dGluZ0FnZW50cyBNYXAgKHN0b3AgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQpXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgRGFuZ2VyWm9uZUVuZm9yY2VyIGJsb2NrcyBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIudW5ibG9jayhlbGVtZW50TmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb24tZmF0YWw6IGFnZW50IG1heSBub3QgaGF2ZSBiZWVuIGJsb2NrZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEV4ZWN1dGUuYWJvcnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRpb24gYWJvcnRlZDogJHtlbGVtZW50TmFtZX0g4oCUICR7cmVhc29ufWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBhYm9ydGVkR29hbElkczogYWN0aXZlR29hbElkcyxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3R5cGU6ICdBYm9ydFJlc3VsdCcsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBhY3RpdmVHb2FsSWRzLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7ZWxlbWVudE5hbWV9JyBleGVjdXRpb24gYWJvcnRlZC4gJHthY3RpdmVHb2FsSWRzLmxlbmd0aH0gZ29hbChzKSB0ZXJtaW5hdGVkLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEdhdGhlcmVkRGF0YSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzY4OiBHZXQgYWdncmVnYXRlZCBleGVjdXRpb24gZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsXG4gICAgICAgIGNvbnN0IGdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ29hbElkICE9PSAnc3RyaW5nJyB8fCAhZ29hbElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnb2FsSWQgaXMgcmVxdWlyZWQgZm9yIGdldF9nYXRoZXJlZF9kYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F0aGVyZWREYXRhID0gYXdhaXQgbWFuYWdlci5nZXRHYXRoZXJlZERhdGEoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZ29hbElkOiBnb2FsSWQgYXMgc3RyaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdHYXRoZXJlZERhdGEnLCAuLi5nYXRoZXJlZERhdGEgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncHJlcGFyZUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUHJlcGFyZSBhIGhhbmRvZmYgc3RhdGUgZm9yIHNlc3Npb24gdHJhbnNmZXJcbiAgICAgICAgY29uc3QgaGFuZG9mZkdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkdvYWxJZCAhPT0gJ3N0cmluZycgfHwgIWhhbmRvZmZHb2FsSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvYWxJZCBpcyByZXF1aXJlZCBmb3IgcHJlcGFyZV9oYW5kb2ZmJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgdGhlIGdvYWxcbiAgICAgICAgY29uc3QgaGFuZG9mZkdhdGhlcmVkRGF0YSA9IGF3YWl0IG1hbmFnZXIuZ2V0R2F0aGVyZWREYXRhKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGdvYWxJZDogaGFuZG9mZkdvYWxJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVhZCBhZ2VudCBtZXRhZGF0YSBmb3IgYWN0aXZlIGVsZW1lbnRzIGFuZCBzdWNjZXNzIGNyaXRlcmlhXG4gICAgICAgIGxldCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgICAgIGxldCBzdWNjZXNzQ3JpdGVyaWE6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWdlbnRFbGVtZW50ID0gYXdhaXQgbWFuYWdlci5yZWFkKGVsZW1lbnROYW1lKTtcbiAgICAgICAgICBpZiAoYWdlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gYWdlbnRFbGVtZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgICAgIGlmIChtZXRhLmFjdGl2YXRlcykge1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9IHsgLi4ubWV0YS5hY3RpdmF0ZXMgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWEgPSBtZXRhLmdvYWw/LnN1Y2Nlc3NDcml0ZXJpYSB8fCBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5vbi1mYXRhbDogcHJvY2VlZCB3aXRoIGRlZmF1bHRzXG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIGluY2x1ZGUgdGhlIGFnZW50IGl0c2VsZlxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXS5wdXNoKGVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBoYW5kb2ZmIHN0YXRlXG4gICAgICAgIGNvbnN0IGhhbmRvZmZTdGF0ZSA9IHByZXBhcmVIYW5kb2ZmU3RhdGUoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgaGFuZG9mZkdhdGhlcmVkRGF0YSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWFcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgY29weS1wYXN0ZWFibGUgYmxvY2tcbiAgICAgICAgY29uc3QgaGFuZG9mZkJsb2NrID0gZ2VuZXJhdGVIYW5kb2ZmQmxvY2soaGFuZG9mZlN0YXRlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF90eXBlOiAnSGFuZG9mZlJlc3VsdCcsXG4gICAgICAgICAgaGFuZG9mZlN0YXRlLFxuICAgICAgICAgIGhhbmRvZmZCbG9jayxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncmVzdW1lRnJvbUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIGEgaGFuZG9mZiBibG9ja1xuICAgICAgICBjb25zdCBoYW5kb2ZmQmxvY2tQYXJhbSA9IHBhcmFtcy5oYW5kb2ZmQmxvY2s7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkJsb2NrUGFyYW0gIT09ICdzdHJpbmcnIHx8ICFoYW5kb2ZmQmxvY2tQYXJhbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGFuZG9mZkJsb2NrIGlzIHJlcXVpcmVkIGZvciByZXN1bWVfZnJvbV9oYW5kb2ZmICh0aGUgZnVsbCBoYW5kb2ZmIGJsb2NrIHRleHQpJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGhhbmRvZmYgYmxvY2sgKGNoZWNrc3VtIHZhbGlkYXRlZCBpbnRlcm5hbGx5KVxuICAgICAgICBjb25zdCByZXN0b3JlZFN0YXRlID0gcGFyc2VIYW5kb2ZmQmxvY2soaGFuZG9mZkJsb2NrUGFyYW0pO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgYWdlbnQgbmFtZSBtYXRjaGVzXG4gICAgICAgIGlmIChyZXN0b3JlZFN0YXRlLmFnZW50TmFtZSAhPT0gZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignSGFuZG9mZiBhZ2VudCBtaXNtYXRjaCBkZXRlY3RlZCcsIHtcbiAgICAgICAgICAgIGV4cGVjdGVkQWdlbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgYmxvY2tBZ2VudDogcmVzdG9yZWRTdGF0ZS5hZ2VudE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0hhbmRvZmYgYWdlbnQgbWlzbWF0Y2g6IHRoZSBoYW5kb2ZmIGJsb2NrIHdhcyBub3QgcHJlcGFyZWQgZm9yIHRoaXMgYWdlbnQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lcmdlIGNhbGxlci1wcm92aWRlZCBwYXJhbWV0ZXJzIHdpdGggaGFuZG9mZiBtZXRhZGF0YS5cbiAgICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IHN1cHBseSBhbnkgcmVxdWlyZWQgZ29hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIHRhc2spLlxuICAgICAgICBjb25zdCBjYWxsZXJQYXJhbXMgPSAocGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bWVQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uY2FsbGVyUGFyYW1zLFxuICAgICAgICAgIHJlc3VtZWRGcm9tSGFuZG9mZjogdHJ1ZSxcbiAgICAgICAgICBvcmlnaW5hbEdvYWxJZDogcmVzdG9yZWRTdGF0ZS5nb2FsSWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiB1c2luZyBjb250aW51ZSB3aXRoIHJlc3RvcmVkIGNvbnRleHRcbiAgICAgICAgY29uc3QgY29udGludWVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbnRpbnVlQWdlbnRFeGVjdXRpb24oe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBgUmVzdW1lZCBmcm9tIGhhbmRvZmYgKGdvYWxJZDogJHtyZXN0b3JlZFN0YXRlLmdvYWxJZH0sICR7cmVzdG9yZWRTdGF0ZS5nb2FsUHJvZ3Jlc3Muc3RlcHNDb21wbGV0ZWR9IHN0ZXBzIGNvbXBsZXRlZClgLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHJlc3VtZVBhcmFtcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfdHlwZTogJ1Jlc3VtZVJlc3VsdCcsXG4gICAgICAgICAgLi4uY29udGludWVSZXN1bHQsXG4gICAgICAgICAgcmVzdG9yZWRGcm9tOiB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IHJlc3RvcmVkU3RhdGUuYWdlbnROYW1lLFxuICAgICAgICAgICAgZ29hbElkOiByZXN0b3JlZFN0YXRlLmdvYWxJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3RvcmVkU3RhdGUudmVyc2lvbixcbiAgICAgICAgICAgIHN0ZXBzQ29tcGxldGVkOiByZXN0b3JlZFN0YXRlLmdvYWxQcm9ncmVzcy5zdGVwc0NvbXBsZXRlZCxcbiAgICAgICAgICAgIHByZXBhcmVkQXQ6IHJlc3RvcmVkU3RhdGUucHJlcGFyZWRBdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRXhlY3V0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIE1heGltdW0gcmVjZW50IGJsb2NrcyB0cmFja2VkIHBlciBhZ2VudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1JFQ0VOVF9CTE9DS1MgPSA1MDtcblxuICAvKipcbiAgICogUmVjb3JkIGEgZ2F0ZWtlZXBlciBibG9jayBhZ2FpbnN0IGFsbCBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cy5cbiAgICogQ2FsbGVkIHdoZW4gR2F0ZWtlZXBlci5lbmZvcmNlKCkgZGVuaWVzIGFuIG9wZXJhdGlvbiwgc28gdGhhdFxuICAgKiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgY2FuIHJlcG9ydCBpdCBhcyBhIG5vdGlmaWNhdGlvbi5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVjb3JkR2F0ZWtlZXBlckJsb2NrRm9yQWdlbnRzKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgbGV2ZWw6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leGVjdXRpbmdBZ2VudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmxvY2sgPSB7XG4gICAgICBvcGVyYXRpb24sXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHJlYXNvbixcbiAgICAgIGxldmVsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXBvcnRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnB1c2goYmxvY2spO1xuXG4gICAgICAvLyBDYXAgYXQgTUFYX1JFQ0VOVF9CTE9DS1M6IGV2aWN0IG9sZGVzdCByZXBvcnRlZCBmaXJzdCwgdGhlbiBvbGRlc3QgdW5yZXBvcnRlZFxuICAgICAgd2hpbGUgKGFnZW50RW50cnkucmVjZW50QmxvY2tzLmxlbmd0aCA+IE1DUEFRTEhhbmRsZXIuTUFYX1JFQ0VOVF9CTE9DS1MpIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ZWRJZHggPSBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5maW5kSW5kZXgoYiA9PiBiLnJlcG9ydGVkKTtcbiAgICAgICAgaWYgKHJlcG9ydGVkSWR4ID49IDApIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5zcGxpY2UocmVwb3J0ZWRJZHgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdCBub3RpZmljYXRpb25zIGZvciBhbiBleGVjdXRpbmcgYWdlbnQgZnJvbSBhbGwgc291cmNlczpcbiAgICogMS4gVW5yZXBvcnRlZCBnYXRla2VlcGVyIGJsb2NrcyDihpIgcGVybWlzc2lvbl9wZW5kaW5nXG4gICAqIDIuIEF1dG9ub215IHBhdXNlIChjb250aW51ZT1mYWxzZSkg4oaSIGF1dG9ub215X3BhdXNlXG4gICAqIDMuIERhbmdlclpvbmUgYmxvY2tlZCBhZ2VudHMgKHN5c3RlbS13aWRlIGJyb2FkY2FzdCkg4oaSIGRhbmdlcl96b25lXG4gICAqXG4gICAqIEdhdGVrZWVwZXIgYmxvY2tzIGFyZSBtYXJrZWQgYXMgXCJyZXBvcnRlZFwiIGFmdGVyIGZpcnN0IGNvbGxlY3Rpb25cbiAgICogc28gdGhleSBkb24ndCByZXBlYXQgb24gc3Vic2VxdWVudCBjYWxscy4gRGFuZ2VyWm9uZSBhbmQgYXV0b25vbXlcbiAgICogbm90aWZpY2F0aW9ucyBhcmUgYWx3YXlzIGVtaXR0ZWQgd2hpbGUgdGhlIGNvbmRpdGlvbiBwZXJzaXN0cy5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE5vdGlmaWNhdGlvbnMoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgYXV0b25vbXk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IEFnZW50Tm90aWZpY2F0aW9uW10ge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnM6IEFnZW50Tm90aWZpY2F0aW9uW10gPSBbXTtcbiAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChhZ2VudE5hbWUpO1xuXG4gICAgLy8gU291cmNlIDE6IFVucmVwb3J0ZWQgZ2F0ZWtlZXBlciBibG9ja3NcbiAgICBpZiAoZXhlY3V0aW5nQWdlbnQ/LnJlY2VudEJsb2Nrcykge1xuICAgICAgZm9yIChjb25zdCBibG9jayBvZiBleGVjdXRpbmdBZ2VudC5yZWNlbnRCbG9ja3MpIHtcbiAgICAgICAgaWYgKCFibG9jay5yZXBvcnRlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAncGVybWlzc2lvbl9wZW5kaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Jsb2NrLm9wZXJhdGlvbn0ke2Jsb2NrLmVsZW1lbnRUeXBlID8gYCgke2Jsb2NrLmVsZW1lbnRUeXBlfSlgIDogJyd9IHJlcXVpcmVzIGNvbmZpcm1hdGlvbmAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBvcGVyYXRpb246IGJsb2NrLm9wZXJhdGlvbixcbiAgICAgICAgICAgICAgZWxlbWVudF90eXBlOiBibG9jay5lbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBibG9jay5yZWFzb24sXG4gICAgICAgICAgICAgIGxldmVsOiBibG9jay5sZXZlbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGJsb2NrLnRpbWVzdGFtcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBibG9jay5yZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3VyY2UgMjogQXV0b25vbXkgcGF1c2VcbiAgICBpZiAoYXV0b25vbXkuY29udGludWUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCByZWFzb24gPSAoYXV0b25vbXkucmVhc29uIGFzIHN0cmluZykgfHwgKGF1dG9ub215LmZhY3RvcnMgYXMgc3RyaW5nW10gfHwgW10pLmpvaW4oJywgJyk7XG4gICAgICBpZiAocmVhc29uKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2F1dG9ub215X3BhdXNlJyxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgcGF1c2VkOiAke3JlYXNvbn1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU291cmNlIDM6IERhbmdlclpvbmUgYnJvYWRjYXN0IOKAlCBhbGVydCBBTEwgZXhlY3V0aW5nIGFnZW50cyBhYm91dCBhbnkgYmxvY2tlZCBhZ2VudFxuICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgaWYgKGVuZm9yY2VyPy5oYXNCbG9ja2VkQWdlbnRzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2tlZEFnZW50IG9mIGVuZm9yY2VyLmdldEJsb2NrZWRBZ2VudHMoKSkge1xuICAgICAgICBjb25zdCBibG9ja0NoZWNrID0gZW5mb3JjZXIuY2hlY2soYmxvY2tlZEFnZW50KTtcbiAgICAgICAgaWYgKGJsb2NrQ2hlY2suYmxvY2tlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnZGFuZ2VyX3pvbmUnLFxuICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke2Jsb2NrZWRBZ2VudH0nIGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXI6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogYmxvY2tlZEFnZW50LFxuICAgICAgICAgICAgICByZWFzb246IGJsb2NrQ2hlY2sucmVhc29uLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JZDogYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3RpZmljYXRpb25zO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZXNpbGllbmNlIEV2YWx1YXRpb24gKElzc3VlICM1MjYpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXZhbHVhdGUgcmVzaWxpZW5jZSBwb2xpY3kgYWZ0ZXIgYSBzdGVwIHJlc3VsdCBhbmQgcG90ZW50aWFsbHkgb3ZlcnJpZGVcbiAgICogdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBlbmFibGUgYXV0by1jb250aW51YXRpb24gb3IgcmV0cnkuXG4gICAqXG4gICAqIFJldHVybnMgYSBtb2RpZmllZCBzdGVwIHJlc3VsdCBpZiByZXNpbGllbmNlIGtpY2tzIGluLCBvciBudWxsIHRvIHVzZVxuICAgKiB0aGUgb3JpZ2luYWwgcmVzdWx0IChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IEV4ZWN1dGlvbiBSZXNpbGllbmNlIChJc3N1ZSAjNTI2KVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdGVwT3V0Y29tZTogc3RyaW5nXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gICAgLy8gT25seSBldmFsdWF0ZSB3aGVuIGF1dG9ub215IHNheXMgcGF1c2VcbiAgICBjb25zdCBhdXRvbm9teSA9IHVwZGF0ZVJlc3VsdC5hdXRvbm9teSBhcyB7IGNvbnRpbnVlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmc7IGZhY3RvcnM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXV0b25vbXkgfHwgYXV0b25vbXkuY29udGludWUgPT09IHRydWUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gTG9vayB1cCB0aGUgZXhlY3V0aW5nIGFnZW50J3MgcmVzaWxpZW5jZSB0cmFja2luZyBzdGF0ZVxuICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGFnZW50TmFtZSk7XG4gICAgaWYgKCFleGVjdXRpbmdBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhlIHBhdXNlXG4gICAgY29uc3QgaXNTdGVwTGltaXQgPSBhdXRvbm9teS5yZWFzb24/LnN0YXJ0c1dpdGgoJ01heGltdW0gYXV0b25vbW91cyBzdGVwcyByZWFjaGVkJykgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNGYWlsdXJlID0gc3RlcE91dGNvbWUgPT09ICdmYWlsdXJlJztcblxuICAgIC8vIE9ubHkgaGFuZGxlIHN0ZXAtbGltaXQgYW5kIGZhaWx1cmUgdHJpZ2dlcnNcbiAgICBpZiAoIWlzU3RlcExpbWl0ICYmICFpc0ZhaWx1cmUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogUmVzaWxpZW5jZUNvbnRleHQgPSB7XG4gICAgICB0cmlnZ2VyOiBpc1N0ZXBMaW1pdCA/ICdzdGVwX2xpbWl0JyA6ICdleGVjdXRpb25fZmFpbHVyZScsXG4gICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICByZXRyeUNvdW50OiBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50LFxuICAgICAgc3RlcE91dGNvbWU6IHN0ZXBPdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aW9uID0gZXZhbHVhdGVSZXNpbGllbmNlUG9saWN5KGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3ksIGNvbnRleHQpO1xuXG4gICAgLy8gSWYgcmVzaWxpZW5jZSBzYXlzIHBhdXNlLCByZWNvcmQgdGhlIGxpbWl0IGFuZCB1c2UgdGhlIG9yaWdpbmFsIHJlc3VsdFxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAncGF1c2UnKSB7XG4gICAgICAvLyBUcmFjayBpZiB0aGlzIHdhcyBhIGxpbWl0IGV4aGF1c3Rpb24gKG5vdCBhIGRlZmF1bHQtcGF1c2UgcG9saWN5KVxuICAgICAgaWYgKGFjdGlvbi5yZWFzb24/LmluY2x1ZGVzKCdleGhhdXN0ZWQnKSB8fCBhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkUmVzaWxpZW5jZUxpbWl0KCk7XG4gICAgICAgIGlmIChhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDaXJjdWl0QnJlYWtlclRyaXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQXV0by1jb250aW51ZTogb3ZlcnJpZGUgdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBjb250aW51ZVxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7IC8vIFJlc2V0IHJldHJ5IGNvdW50IG9uIGNvbnRpbnVhdGlvblxuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQXV0b0NvbnRpbnVhdGlvbigpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX0NPTlRJTlVFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1jb250aW51ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZVJlc3VsdCxcbiAgICAgICAgYXV0b25vbXk6IHtcbiAgICAgICAgICAuLi5hdXRvbm9teSxcbiAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGFjdGlvbi5yZWFzb24sXG4gICAgICAgICAgZmFjdG9yczogWy4uLihhdXRvbm9teS5mYWN0b3JzIHx8IFtdKSwgYHJlc2lsaWVuY2U6IGF1dG8tY29udGludWVkICgke2V4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50fS8ke2FjdGlvbi5tYXhDb250aW51YXRpb25zIHx8ICd1bmxpbWl0ZWQnfSlgXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJldHJ5OiB0ZWxsIExMTSB0byByZXRyeSB3aXRoIGJhY2tvZmYgZ3VpZGFuY2VcbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3JldHJ5Jykge1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCsrO1xuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkU3RlcFJldHJ5KCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX1NURVBfUkVUUklFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgc3RlcCByZXRyeTogJHthY3Rpb24ucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQsXG4gICAgICAgICAgYmFja29mZk1zOiBhY3Rpb24uYmFja29mZk1zLFxuICAgICAgICAgIHRyaWdnZXI6IGNvbnRleHQudHJpZ2dlcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiByZXRyeSBhdHRlbXB0ICR7ZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudH1gXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlc3RhcnQ6IG92ZXJyaWRlIHRvIGNvbnRpbnVlLCBzaWduYWwgZnJlc2ggcmVzdGFydCB0byBMTE1cbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3Jlc3RhcnQnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7XG4gICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRBdXRvUmVzdGFydCgpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX1JFU1RBUlRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1yZXN0YXJ0ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICAgIHByZXNlcnZlU3RhdGU6IGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3k/LnByZXNlcnZlU3RhdGUgPz8gdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiBhdXRvLXJlc3RhcnRlZCAoJHtleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudH0vJHthY3Rpb24ubWF4Q29udGludWF0aW9ucyB8fCAndW5saW1pdGVkJ30pYF0sXG4gICAgICAgICAgcmVzaWxpZW5jZUFjdGlvbjogYWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGdvYWwgSURzIGZvciBhbiBhZ2VudCAoSXNzdWUgIzI0OSkuXG4gICAqIFF1ZXJpZXMgdGhlIGFnZW50J3Mgc3RhdGUgdG8gZmluZCBpbi1wcm9ncmVzcyBnb2Fscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlR29hbElkcyhcbiAgICBtYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgYWdlbnROYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZ2V0QWdlbnRTdGF0ZSh7IGFnZW50TmFtZSB9KTtcbiAgICAgIGlmIChzdGF0ZVJlc3VsdD8uc3RhdGU/LmdvYWxzKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZVJlc3VsdC5zdGF0ZS5nb2Fsc1xuICAgICAgICAgIC5maWx0ZXIoKGc6IHsgc3RhdHVzOiBzdHJpbmcgfSkgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgICAgLm1hcCgoZzogeyBpZDogc3RyaW5nIH0pID0+IGcuaWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWdlbnQgbWF5IG5vdCBoYXZlIHN0YXRlIHlldFxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvcnJlbGF0aW9uIElEIGZyb20gdGhlIHVuZGVybHlpbmcgQ29udGV4dFRyYWNrZXIuXG4gICAqIEV4cG9zZWQgZm9yIHVzZSBieSBVbmlmaWVkRW5kcG9pbnQgYW5kIG90aGVyIHdyYXBwZXJzLlxuICAgKiBJc3N1ZSAjMzAxLlxuICAgKi9cbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc3VsdCBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHJlc3BvbnNlIG1ldGFkYXRhIHdpdGggY29ycmVsYXRpb24gSUQgYW5kIHRpbWluZy5cbiAgICogSXNzdWUgIzMwMTogUmVxdWVzdCBJRHMgYW5kIGRpc3RyaWJ1dGVkIHRyYWNpbmcgc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXRhKHN0YXJ0VGltZTogbnVtYmVyKTogUmVzcG9uc2VNZXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdElkOiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCkgPz8gJ3Vua25vd24nLFxuICAgICAgZHVyYXRpb25NczogcGFyc2VGbG9hdCgocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMikpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgc3VjY2VzcyhkYXRhOiB1bmtub3duLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvblN1Y2Nlc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZGF0YSxcbiAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShzdGFydFRpbWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFpbGVkIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgZmFpbHVyZShlcnJvcjogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yLFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRmllbGQgU2VsZWN0aW9uIChJc3N1ZSAjMjAyKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpZWxkIHNlbGVjdGlvbiBhbmQgbmFtZSB0cmFuc2Zvcm1hdGlvbiB0byBoYW5kbGVyIHJlc3BvbnNlLlxuICAgKlxuICAgKiBQcm9jZXNzZXMgdGhlIGBmaWVsZHNgIHBhcmFtZXRlciB0byBmaWx0ZXIgcmVzcG9uc2UgZGF0YTpcbiAgICogLSBJZiBmaWVsZHMgaXMgYW4gYXJyYXksIGZpbHRlciB0byB0aG9zZSBmaWVsZHMgb25seVxuICAgKiAtIElmIGZpZWxkcyBpcyBhIHByZXNldCBzdHJpbmcgKCdtaW5pbWFsJywgJ3N0YW5kYXJkJywgJ2Z1bGwnKSwgdXNlIHByZXNldFxuICAgKiAtIElmIGZpZWxkcyBpcyBub3QgcHJvdmlkZWQsIHRyYW5zZm9ybSBuYW1lcyBvbmx5IChuYW1lIOKGkiBlbGVtZW50X25hbWUpXG4gICAqXG4gICAqIEZvciByZXNwb25zZXMgd2l0aCBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMsIGZpZWxkIHNlbGVjdGlvbiBpcyBhcHBsaWVkXG4gICAqIHRvIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgcmF0aGVyIHRoYW4gZmlsdGVyaW5nIHRoZSBjb250YWluZXIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJhdyBoYW5kbGVyIHJlc3VsdFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3JpZ2luYWwgcGFyYW1zIGNvbnRhaW5pbmcgb3B0aW9uYWwgYGZpZWxkc2BcbiAgICogQHJldHVybnMgVHJhbnNmb3JtZWQgcmVzdWx0IHdpdGggZmllbGQgc2VsZWN0aW9uIGFwcGxpZWRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWVsZFNlbGVjdGlvbihcbiAgICByZXN1bHQ6IHVua25vd24sXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgLy8gU2tpcCB0cmFuc2Zvcm1hdGlvbiBmb3IgTUNQIHJlc3BvbnNlIGZvcm1hdCB3aXRoIGNvbnRlbnQgYXJyYXlcbiAgICAvLyBUaGVzZSBhcmUgZm9ybWF0dGVkIHRleHQgcmVzcG9uc2VzIHRoYXQgc2hvdWxkbid0IGJlIHRyYW5zZm9ybWVkXG4gICAgaWYgKHRoaXMuaXNNQ1BSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkc1BhcmFtID0gcGFyYW1zPy5maWVsZHM7XG5cbiAgICAvLyBObyBmaWVsZHMgcGFyYW0gLSBhcHBseSBuYW1lIHRyYW5zZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAoZmllbGRzUGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBmaWVsZHMgZnJvbSBwcmVzZXQgb3IgYXJyYXlcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlc2V0OiAnbWluaW1hbCcgfCAnc3RhbmRhcmQnIHwgJ2Z1bGwnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmaWVsZHNQYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpc1ZhbGlkUHJlc2V0KGZpZWxkc1BhcmFtKSkge1xuICAgICAgICBpZiAoZmllbGRzUGFyYW0gPT09ICdmdWxsJykge1xuICAgICAgICAgIC8vICdmdWxsJyBwcmVzZXQgPSBhbGwgZmllbGRzLCBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHByZXNldCA9IGZpZWxkc1BhcmFtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW52YWxpZCBwcmVzZXQgLSB0cmVhdCBhcyBzaW5nbGUgZmllbGRcbiAgICAgICAgZmllbGRzID0gW2ZpZWxkc1BhcmFtXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRzUGFyYW0pKSB7XG4gICAgICAvLyBGaWx0ZXIgdG8gc3RyaW5ncyBvbmx5LCB3YXJuIGFib3V0IG5vbi1zdHJpbmcgZWxlbWVudHNcbiAgICAgIGNvbnN0IG5vblN0cmluZ0NvdW50ID0gZmllbGRzUGFyYW0uZmlsdGVyKGYgPT4gdHlwZW9mIGYgIT09ICdzdHJpbmcnKS5sZW5ndGg7XG4gICAgICBpZiAobm9uU3RyaW5nQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBGaWVsZCBzZWxlY3Rpb246ICR7bm9uU3RyaW5nQ291bnR9IG5vbi1zdHJpbmcgZWxlbWVudChzKSBpbiBmaWVsZHMgYXJyYXkgaWdub3JlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyaW5nRmllbGRzID0gZmllbGRzUGFyYW0uZmlsdGVyKChmKTogZiBpcyBzdHJpbmcgPT4gdHlwZW9mIGYgPT09ICdzdHJpbmcnKTtcbiAgICAgIGlmIChzdHJpbmdGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZpZWxkcyA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmaWVsZCBuYW1lcyBmb3Igc2VjdXJpdHkgYW5kIGNoZWNrIGZvciBVbmljb2RlIGlzc3Vlc1xuICAgICAgICBjb25zdCB7IG5vcm1hbGl6ZWQsIHdhcm5pbmdzIH0gPSBub3JtYWxpemVGaWVsZE5hbWVzKHN0cmluZ0ZpZWxkcyk7XG4gICAgICAgIGlmICh3YXJuaW5ncykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGaWVsZCBzZWxlY3Rpb24gVW5pY29kZSBub3JtYWxpemF0aW9uOiAke3dhcm5pbmdzLmpvaW4oJzsgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzID0gbm9ybWFsaXplZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBmaWVsZHMgLSBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgIGlmICghZmllbGRzICYmICFwcmVzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyB3aXRoIGFycmF5LWF3YXJlbmVzc1xuICAgIHJldHVybiB0aGlzLmZpbHRlcldpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQsIGZpZWxkcywgcHJlc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gcmVzcG9uc2Ugd2l0aCBhd2FyZW5lc3Mgb2YgbmVzdGVkIGFycmF5cy5cbiAgICogQXBwbGllcyBuYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGl0ZW1zIHdpdGhpbiBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbW1vbiBhcnJheSBjb250YWluZXIgcGF0dGVybnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5yZXN1bHRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ3Jlc3VsdHMnXSksXG4gICAgICAgICAgcmVzdWx0czogZmlsdGVyRmllbGRzKG9iai5yZXN1bHRzLCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsnaXRlbXMnXSksXG4gICAgICAgICAgaXRlbXM6IGZpbHRlckZpZWxkcyhvYmouaXRlbXMsIHsgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiB0cmFuc2Zvcm0gZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciByZXNwb25zZSB3aXRoIGF3YXJlbmVzcyBvZiBuZXN0ZWQgYXJyYXlzLlxuICAgKiBBcHBsaWVzIGZpZWxkIGZpbHRlcmluZyB0byBpdGVtcyB3aXRoaW4gYHJlc3VsdHNgIG9yIGBpdGVtc2AgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJXaXRoQXJyYXlBd2FyZW5lc3MoXG4gICAgcmVzdWx0OiB1bmtub3duLFxuICAgIGZpZWxkcz86IHN0cmluZ1tdLFxuICAgIHByZXNldD86ICdtaW5pbWFsJyB8ICdzdGFuZGFyZCcgfCAnZnVsbCdcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBjb25zdCBvYmogPSByZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gYXJyYXkgY29udGFpbmVyIHBhdHRlcm5zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoucmVzdWx0cykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydyZXN1bHRzJ10pLFxuICAgICAgICAgIHJlc3VsdHM6IGZpbHRlckZpZWxkcyhvYmoucmVzdWx0cywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5pdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydpdGVtcyddKSxcbiAgICAgICAgICBpdGVtczogZmlsdGVyRmllbGRzKG9iai5pdGVtcywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBmaWx0ZXIgZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IGZpZWxkcywgcHJlc2V0LCB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9wLWxldmVsIGZpZWxkcyBvZiBhbiBvYmplY3QsIGV4Y2x1ZGluZyBzcGVjaWZpZWQga2V5cy5cbiAgICogVXNlZCB0byBwcmVzZXJ2ZSBjb250YWluZXIgbWV0YWRhdGEgKHRvdGFsLCBxdWVyeSwgZXRjLikgd2hpbGUgZmlsdGVyaW5nIG5lc3RlZCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVRvcExldmVsKFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZXhjbHVkZUtleXM6IHN0cmluZ1tdXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKCFleGNsdWRlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcmVzdWx0IGlzIGFuIE1DUCByZXNwb25zZSBmb3JtYXQgKHdpdGggY29udGVudCBhcnJheSkuXG4gICAqIFRoZXNlIHJlc3BvbnNlcyBjb250YWluIGZvcm1hdHRlZCB0ZXh0IGFuZCBzaG91bGRuJ3QgYmUgdHJhbnNmb3JtZWQuXG4gICAqL1xuICBwcml2YXRlIGlzTUNQUmVzcG9uc2UocmVzdWx0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdjb250ZW50JyBpbiByZXN1bHQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudClcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIENMSSBhcHByb3ZhbCBwb2xpY3kgZnJvbSBhbGwgYWN0aXZlIGVsZW1lbnRzLlxuICpcbiAqIFVuaW9ucyBgcmVxdWlyZUFwcHJvdmFsYCBhcnJheXMgYWNyb3NzIGFsbCBlbGVtZW50cy4gVGFrZXMgdGhlIG1vc3RcbiAqIGNvbnNlcnZhdGl2ZSAoc21hbGxlc3QpIFRUTC4gRmFsbHMgYmFjayB0byBlbnYgdmFyIGBET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWWAuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRzIC0gQ3VycmVudGx5IGFjdGl2ZSBlbGVtZW50c1xuICogQHJldHVybnMgUmVzb2x2ZWQgYXBwcm92YWwgcG9saWN5XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDbGlBcHByb3ZhbFBvbGljeShhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdKTogQ2xpQXBwcm92YWxQb2xpY3kge1xuICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBuZXcgU2V0PCdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJz4oKTtcbiAgbGV0IGRlZmF1bHRTY29wZTogQ2xpQXBwcm92YWxTY29wZSB8IHVuZGVmaW5lZDtcbiAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBlbGVtZW50Lm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uYXBwcm92YWxQb2xpY3k7XG4gICAgaWYgKCFwb2xpY3kpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHBvbGljeS5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgcG9saWN5LnJlcXVpcmVBcHByb3ZhbCkge1xuICAgICAgICByZXF1aXJlQXBwcm92YWwuYWRkKGxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0U2NvcGUgJiYgIWRlZmF1bHRTY29wZSkge1xuICAgICAgZGVmYXVsdFNjb3BlID0gcG9saWN5LmRlZmF1bHRTY29wZTtcbiAgICB9XG4gICAgaWYgKHBvbGljeS50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHR0bFNlY29uZHMgPSB0dGxTZWNvbmRzID09PSB1bmRlZmluZWQgPyBwb2xpY3kudHRsU2Vjb25kcyA6IE1hdGgubWluKHR0bFNlY29uZHMsIHBvbGljeS50dGxTZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICBpZiAocmVxdWlyZUFwcHJvdmFsLnNpemUgPT09IDApIHtcbiAgICBjb25zdCBlbnZQb2xpY3kgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWTtcbiAgICBpZiAoZW52UG9saWN5KSB7XG4gICAgICBjb25zdCBsZXZlbHMgPSBlbnZQb2xpY3kuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKHMgPT4gcyA9PT0gJ21vZGVyYXRlJyB8fCBzID09PSAnZGFuZ2Vyb3VzJyk7XG4gICAgICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgICAgICByZXF1aXJlQXBwcm92YWwuYWRkKGxldmVsIGFzICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlQXBwcm92YWw6IHJlcXVpcmVBcHByb3ZhbC5zaXplID4gMCA/IEFycmF5LmZyb20ocmVxdWlyZUFwcHJvdmFsKSA6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0U2NvcGUsXG4gICAgdHRsU2Vjb25kcyxcbiAgfTtcbn1cbiJdfQ==